From: Alexandr Nedvedicky Subject: Re: check if the pf_state pointer is NULL less often in pf_test() To: David Gwynne Cc: tech@openbsd.org, sashan@openbsd.org Date: Wed, 30 Apr 2025 15:26:36 +0200 On Wed, Apr 30, 2025 at 02:43:14PM +1000, David Gwynne wrote: > there should be no functional change with this diff, it just shuffles > the code around. > > note that pf_state structs always have valid references to pf_state_keys > until the pf_state itself is destroyed after pf.c r1.1157. this means we > don't have to test if the st->key[PF_SK_STACK] pointers are valid > anymore, we can just use them. > > ok? looks good to me. thanks. OK sashan > > Index: pf.c > =================================================================== > RCS file: /cvs/src/sys/net/pf.c,v > diff -u -p -r1.1209 pf.c > --- pf.c 14 Apr 2025 20:02:34 -0000 1.1209 > +++ pf.c 30 Apr 2025 04:38:04 -0000 > @@ -7910,15 +7910,20 @@ done: > > if (action == PF_PASS && qid) > pd.m->m_pkthdr.pf.qid = qid; > - if (pd.dir == PF_IN && st && st->key[PF_SK_STACK]) > - pf_mbuf_link_state_key(pd.m, st->key[PF_SK_STACK]); > - if (pd.dir == PF_OUT && st && st->key[PF_SK_STACK]) > - pf_state_key_link_inpcb(st->key[PF_SK_STACK], > - pd.m->m_pkthdr.pf.inp); > + if (st != NULL) { > + struct mbuf *m = pd.m; > + struct inpcb *inp = m->m_pkthdr.pf.inp; > > - if (st != NULL && !ISSET(pd.m->m_pkthdr.csum_flags, M_FLOWID)) { > - pd.m->m_pkthdr.ph_flowid = st->key[PF_SK_WIRE]->hash; > - SET(pd.m->m_pkthdr.csum_flags, M_FLOWID); > + if (pd.dir == PF_IN) { > + KASSERT(inp == NULL); > + pf_mbuf_link_state_key(m, st->key[PF_SK_STACK]); > + } else if (pd.dir == PF_OUT) > + pf_state_key_link_inpcb(st->key[PF_SK_STACK], inp); > + > + if (!ISSET(m->m_pkthdr.csum_flags, M_FLOWID)) { > + m->m_pkthdr.ph_flowid = st->key[PF_SK_WIRE]->hash; > + SET(m->m_pkthdr.csum_flags, M_FLOWID); > + } > } > > /* >