Index: sys/net/npf/npf_conn.c =================================================================== RCS file: /cvsroot/src/sys/net/npf/npf_conn.c,v retrieving revision 1.23 diff -p -u -r1.23 npf_conn.c --- sys/net/npf/npf_conn.c 29 Jan 2017 00:15:54 -0000 1.23 +++ sys/net/npf/npf_conn.c 4 Nov 2017 17:04:13 -0000 @@ -727,7 +727,8 @@ npf_conn_pass(const npf_conn_t *con, npf { KASSERT(con->c_refcnt > 0); if (__predict_true(con->c_flags & CONN_PASS)) { - *mi = con->c_mi; + mi->mi_rid = con->c_rid; + mi->mi_retfl = con->c_retfl; *rp = con->c_rproc; return true; } @@ -752,8 +753,10 @@ npf_conn_setpass(npf_conn_t *con, const */ atomic_or_uint(&con->c_flags, CONN_PASS); con->c_rproc = rp; - if (rp) - con->c_mi = *mi; + if (rp) { + con->c_rid = mi->mi_rid; + con->c_retfl = mi->mi_retfl; + } } /* Index: sys/net/npf/npf_conn.h =================================================================== RCS file: /cvsroot/src/sys/net/npf/npf_conn.h,v retrieving revision 1.12 diff -p -u -r1.12 npf_conn.h --- sys/net/npf/npf_conn.h 29 Jan 2017 00:15:54 -0000 1.12 +++ sys/net/npf/npf_conn.h 4 Nov 2017 17:04:13 -0000 @@ -88,7 +88,11 @@ struct npf_conn { npf_state_t c_state; u_int c_refcnt; uint64_t c_atime; - npf_match_info_t c_mi; + /* + * matching rule id and flags + */ + uint64_t c_rid; + u_int c_retfl; }; #endif Index: sys/net/npf/npf_ext_normalize.c =================================================================== RCS file: /cvsroot/src/sys/net/npf/npf_ext_normalize.c,v retrieving revision 1.5 diff -p -u -r1.5 npf_ext_normalize.c --- sys/net/npf/npf_ext_normalize.c 29 Jan 2017 00:15:54 -0000 1.5 +++ sys/net/npf/npf_ext_normalize.c 4 Nov 2017 17:04:13 -0000 @@ -147,7 +147,7 @@ npf_normalize(npf_cache_t *npc, void *pa int *decision) { npf_normalize_t *np = params; - struct tcphdr *th = npc->npc_l4.tcp; + struct tcphdr *th; uint16_t cksum, mss, maxmss = np->n_maxmss; int wscale; @@ -165,6 +165,7 @@ npf_normalize(npf_cache_t *npc, void *pa * TCP Maximum Segment Size (MSS) "clamping". Only if SYN packet. * Fetch MSS and check whether rewrite to lower is needed. */ + th = npc->npc_l4.tcp; if (maxmss == 0 || !npf_iscached(npc, NPC_TCP) || (th->th_flags & TH_SYN) == 0) { /* Not required; done. */ @@ -182,8 +183,17 @@ npf_normalize(npf_cache_t *npc, void *pa /* Store new MSS, calculate TCP checksum and update it. */ if (npf_fetch_tcpopts(npc, &maxmss, &wscale)) { - cksum = npf_fixup16_cksum(th->th_sum, mss, maxmss); - th->th_sum = cksum; + /* + * Fix checksum for incoming packets, the checksum + * for outgoing packets is deferred. + * + * XXX what about checksum offloading for input? + */ + if (mi->mi_di & PFIL_IN) { + th = npc->npc_l4.tcp; + cksum = npf_fixup16_cksum(th->th_sum, mss, maxmss); + th->th_sum = cksum; + } } return true;