Better "hash_packet6"

Luigi Rizzo rizzo at icir.org
Tue Dec 5 16:17:47 PST 2006


On Tue, Dec 05, 2006 at 08:10:30PM +0100, Max Laier wrote:
> Hi,
> 
> with a lot of help from David Malone and JINMEI Tatuya we came up with the 
> following hash function for IPv6 connections using universal hashing.  

I followed the discussion on the topic a few days (weeks ?)
ago and investigated around a bit, also following some of the pointers
that passed on the list. So I have the following comments:

First, this proposal, with 36 multiplies and one division, the
function seems rather expensive for e.g. a low end cpu (arm or
soekris) as you might find on network-appliance boxes.
Any chance to get performance numbers on that hardware ?

I wonder if you have considered alternatives such as the one at

        http://www.azillionmonkeys.com/qed/hash.html

which seems reasonable in terms of theoretical background, performance
and also in terms of license (see the reference about being used
in Apple products).

Second, and related to this specific hash function: if we end up
using it, i think it would be good to add a bit of documentation
on algorithm used and on constraints that there are (e.g. wrt operand
sizes and values of the hash keys) so that people don't break it
in the future trying to optimze things that they should not touch.

In particular, i have the following questions:
- is the algorithm defined on a byte-by-byte basis, or it is just
  your decision to implement it this way ? (having it work on 16-bit
  entries would e.g. halve the number of multiplies).

- i guess that you use addr6_cmp() to sort the components of the
  address insuring the algorithm hashes forward and reverse traffic
  to the same value. symmetric. But for this, one of the suggestions
  was to xor SRC and DST to achieve the same thing, and i don't
  understand why you use this different approach (which doubles the
  input size and the number of multiplications).

- what are the requirements on ipfw_hash_key[] values ?
  E.g. it seems that 0 should not be allowed or the corresponding
  byte would have no contribution in the hash. Any other invalid
  value, recommended range etc ?

In any case i am glad that people are looking at improving some code
that i am certainly guilty of :)

	cheers
	luigi


More information about the freebsd-ipfw mailing list