Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Dec 2009 19:38:21 +0100
From:      Luigi Rizzo <rizzo@iet.unipi.it>
To:        ipfw@freebsd.org
Subject:   RFC: new ipfw options
Message-ID:  <20091209183821.GA40814@onelab2.iet.unipi.it>

next in thread | raw e-mail | index | archive | help
Hi,
I would like to discuss some new features that I am going to add to ipfw.

1. A new option "lookup <search-key> T[,V]" where
   search-key ::= {src-ip|dst-ip|src-port|dst-port|proto|jail|...}

   This extends the existing '{dst-ip|src-ip} table(T[,V])' options,
   and allows a lookup of other packet fields such as ports, protocols,
   uid, jails (I need this one).

   In terms of additional code the impact is rather small both
   in userland and kernel.

2. A fast dispatch table for skipto

   As you may know, "skipto tablearg" is rather inefficient
   because there are no direct pointers to the jump target,
   so the O(log N) the table lookup is killed by the subsequent
   O(N) instruction lookup.
	The plan here is to add an optional skipto table
   that contains <rule_nr,rule_id,rule_ptr> so that computed
   skipto also take between O(log N) and O(1) depending on the
   implementation.
   a) a sysctl can enable or disable the table (off by default);
   b) the initial implementation would be a trivial array
      with 64k entries containing rule_id and rule_ptr (rule_nr
      is implicit). It consumes 512-768k of memory (the reason
      why I'd default to off) but is fast and reliable.
      As an alternative, perhaps at a later time, I might
      put in a version that uses a smaller array, say 256 or 4k
      entries, at a price of 16..256 search loops worst case
      (this is still 3 orders of magnitude than what we have now)

3. a hash version of 'table's

   Right now ipfw tables are implented as routing tables, which is
   great if you have to lookup a longest matching prefix, but a
   bit overkill if you care only for ports or jail ids, and
   totally uninteresting if you want to lookup flow ids,
   or generic sequence of bytes. My plan here is to reuse the
   ipfw hash tables to make them available for 'ipfw table ...'
   commands. To avoid code and syntax bloat, I'd use the number
   0..TABLE_MAX-1 for the existing prefix tables, and
   TABLE_MAX..2TABLE_MAX-1 for the new hash tables.
      
comments welcome

cheers
luigi



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20091209183821.GA40814>