use stoeplitz to generate a hash/flowid for state keys.
authordlg <dlg@openbsd.org>
Thu, 22 Dec 2022 05:59:26 +0000 (05:59 +0000)
committerdlg <dlg@openbsd.org>
Thu, 22 Dec 2022 05:59:26 +0000 (05:59 +0000)
commitad6271c5803ac5f60f3823ae073cfb046050012d
tree180446b50676ed0758d2509f45c4358523aea932
parentef8104118c27062e7c6eff5ecda5764400d75977
use stoeplitz to generate a hash/flowid for state keys.

the hash will be used to partition work in pf and pfsync in the
future, and right now it is used as the first comparison in the rb
tree state lookup.

using stoeplitz means that pf will hash traffic the same way that
hardware using a stoeplitz key will hash incoming traffic on rings.
stoeplitz is also used by the tcp stack to generate a flow id, which
is used to pick which transmit ring is used on nics with multiple
queues too. using the same algorithm throughout the stack encourages
affinity of packets to rings and softnet threads the whole way
through.

using the hash as the first comparison in the state rb tree comparison
should encourage faster traversal of the state tree by having all
the address/port bits summarised into the single hash value. however,
tests by hrvoje popovski don't show performance changing. on the
plus side, if this change is free from a performance point of view
then it makes the future steps more straightforward.

discussed at length at h2k22
tested by sashan@ and hrvoje popovski
ok tb@ sashan@ claudio@ jmatthew@
sys/conf/files
sys/net/pf.c
sys/net/pfvar.h
sys/net/pfvar_priv.h