RFC: documented and actual behaviour of "ipfw tee"

Luigi Rizzo rizzo at iet.unipi.it
Thu Dec 31 17:07:12 UTC 2009


On Wed, Dec 30, 2009 at 11:57:05PM +0100, Luigi Rizzo wrote:
> On Wed, Dec 30, 2009 at 01:30:01PM -0800, Julian Elischer wrote:
> > Ian Smith wrote:
> > >On Tue, 29 Dec 2009, Julian Elischer wrote:
> > > > Luigi Rizzo wrote:
> > > > > 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).
> > > > > 
> > > > 
> > > > TEE should go to the next RULE with the original packet, but if
> > > > you reinject the tee'd copy of the packet it should go to the
> > > > next rule NUMBER.
> > >
> > >Which is what happens now, right?  Same behaviour on tee reinjection as 
> > >divert does seem consistent.  So if there is a problem, it's only with 
> > >the original packet continuing with the next rule if same-numbered?
> > 
> > from Luigi's description I'm not sure what happens now.. :-)
> 
> fair enough, let me explain again:
> A. with "divert" the packet is passed to the divert
>   socket, and when/if reinjected processing continues no earlier
>   than the the NEXT NUMBERED rule. This is a restriction due to the
>   current divert socket API that I have no intention to change.
>   
> B. with "tee", the copy of the packet that goes to the socket
>    behaves the same as above. The original, which remains in
>    the kernel, continues processing from the NEXT NUMBERED RULE.
> 
> C. with "netgraph", the packet is passed to the netgraph node,
>    and when/if reinjected processing continues with the NEXT RULE.
>    This is different from #A
>  
> D. with "ngtee", the copy of the packet that goes to the netgraph
>    node behaves as in #C. The original packet, continues processing
>    with the NEXT RULE (again, different from "tee" processing in #B)

Upon inspection, it seems that ngtee is different from what I said above.
The comment in ng_ipfw_input() says

        /*
         * We have two modes: in normal mode we add a tag to packet, which is
         * important to return packet back to IP stack. In tee mode we make
         * a copy of a packet and forward it into netgraph without a tag.
         */

which means that with ngtee, the copy that goes to netgraph is
untagged, so i totally fail to understand what is the expected
usage model.

cheers
luigi


More information about the freebsd-net mailing list