RFC: documented and actual behaviour of "ipfw tee"
Luigi Rizzo
rizzo at iet.unipi.it
Wed Dec 30 00:33:06 UTC 2009
There a difference between the documented and actual behaviour of
"ipfw tee" which occurs when there are multiple rules with the same
number, e.g.
rule_id number body
r1 500 tee port1 dst-ip 1.2.3.0/24
r2 500 tee port2 dst-ip 1.2.4.0/24
r3 500 accept ip from any to any
r4 510 count ip from any to any
+ the manpage says "processing continues with the NEXT RULE"
(so after r1 we have r2, then r3, ...);
+ the implementation behaves as "processing continues with the
NEXT NUMBERED RULE" (ie. after 500 continues with 510).
The actual behaviour is an artifact of how "divert" is implemented:
diverted packet only carry the rule number so we cannot tell, on a
reinject, which of the rules numbered "500" matched, and we restart
from the next one. Tee was implemented as an extension of divert.
Skipping rules in my opinion is very unintuitive, but there is
no way to fix it (unless we extend the API) as the rule_id is only
known within the kernel.
For 'tee', however, packets the situation is different because the
copy of the packet that remains in the kernel does not lose knowledge
of the matching rule so we can easily continue from the very next
rule, same as it happens for dummynet packets with one_pass=0 (and
tee'd netgraph packets, which I think already do "the right thing").
Since I am doing some work in this are of the code, I'd like to ask
opinions on how to proceed:
A. preserve the current behaviour and fix the manpage;
B. fix the code to behave as the manpage says;
C. introduce a sysctl to choose between A and B.
Of course this moves the problem on which default
to choose :)
Because it is a very special case that I doubt many people have hit,
I'd be inclined to do B and consider the old behaviour a bug.
cheers
luigi
More information about the freebsd-net
mailing list