On Fri, Oct 30, 2015 at 10:43:21AM +0100, Reyk Floeter wrote:
> Question:
> > How does pair(4) interact with pf? If a packet crosses a pair
> > does it create a new state or does pf track the original state?
> > 
> 
> Answer:
> It does create a new state, you can filter between pair(4) without
> problems and all features including nat work.
> But it currently does not clear some of the extended packet settings -
> like flags, tags, qid etc. - so you can filter on the tag, eg. 
> 
> # Assuming pair1 is patched to pair0
> pass out on pair1 tag FOO
> pass in on pair0 tagged FOO
> 
> The attached diff _removes_ that and resets all pf settings, so the pf
> rules above will not work anymore.  I think it is better to assume
> crossing barriers and receiving packets with pair(4) works like a
> "normal" Ethernet packet.  The following will still work:
> 
> # Received packets on pair0 don't carry any existing pf states
> pass out on pair1
> pass in on pair0
> 
> OK?

The new semantics is better.

> +void
> +pf_pkt_reset(struct mbuf *m)
> +{
> +     if (m->m_flags & M_PKTHDR)
> +             m_tag_delete_chain(m);
> +
> +     /* resets state key, pcb reference, qid, tag, and all flags */
> +     memset(&m->m_pkthdr.pf, 0, sizeof(m->m_pkthdr.pf));
> +}

You need a packet header mbuf to access m->m_pkthdr.  So either
assume that M_PKTHDR is set and don't check.  Or put both actions
into the if block.

As pf_pkt_addr_changed() accesses the m->m_pkthdr without check, I
would recomend to remove the "if (m->m_flags & M_PKTHDR)" here,
too.  You may also put an assert into both functions.

The default for m->m_pkthdr.pf.prio is IFQ_DEFPRIO, not 0.
Look at m_inithdr().

bluhm

Reply via email to