Module Name: src Committed By: maxv Date: Tue Jul 10 15:25:01 UTC 2018
Modified Files: src/sys/net/npf: npf_handler.c Log Message: Simplify the pointer handling. Set *mp = NULL at the beginning of the function. In npf_reassembly, pass a simple boolean instead of a ** mbuf pointer. Add a KASSERT for IPv4, we don't want (error && !m). Remove the 'fastout' label, use 'out'. To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 src/sys/net/npf/npf_handler.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/npf/npf_handler.c diff -u src/sys/net/npf/npf_handler.c:1.41 src/sys/net/npf/npf_handler.c:1.42 --- src/sys/net/npf/npf_handler.c:1.41 Tue Jul 10 14:04:07 2018 +++ src/sys/net/npf/npf_handler.c Tue Jul 10 15:25:01 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_handler.c,v 1.41 2018/07/10 14:04:07 maxv Exp $ */ +/* $NetBSD: npf_handler.c,v 1.42 2018/07/10 15:25:01 maxv Exp $ */ /*- * Copyright (c) 2009-2013 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ #ifdef _KERNEL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_handler.c,v 1.41 2018/07/10 14:04:07 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_handler.c,v 1.42 2018/07/10 15:25:01 maxv Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -70,25 +70,25 @@ __KERNEL_RCSID(0, "$NetBSD: npf_handler. #endif static int -npf_reassembly(npf_t *npf, npf_cache_t *npc, struct mbuf **mp) +npf_reassembly(npf_t *npf, npf_cache_t *npc, bool *mff) { nbuf_t *nbuf = npc->npc_nbuf; int error = EINVAL; + struct mbuf *m; + + *mff = false; + m = nbuf_head_mbuf(nbuf); /* Reset the mbuf as it may have changed. */ - *mp = nbuf_head_mbuf(nbuf); nbuf_reset(nbuf); if (npf_iscached(npc, NPC_IP4)) { struct ip *ip = nbuf_dataptr(nbuf); - error = ip_reass_packet(mp, ip); + error = ip_reass_packet(&m, ip); + KASSERT(!error || (m != NULL)); } else if (npf_iscached(npc, NPC_IP6)) { - /* - * Note: ip6_reass_packet() offset is the start of - * the fragment header. - */ - error = ip6_reass_packet(mp, npc->npc_hlen); - if (error && *mp == NULL) { + error = ip6_reass_packet(&m, npc->npc_hlen); + if (error && m == NULL) { memset(nbuf, 0, sizeof(nbuf_t)); } } @@ -96,9 +96,10 @@ npf_reassembly(npf_t *npf, npf_cache_t * npf_stats_inc(npf, NPF_STAT_REASSFAIL); return error; } - if (*mp == NULL) { + if (m == NULL) { /* More fragments should come. */ npf_stats_inc(npf, NPF_STAT_FRAGMENTS); + *mff = true; return 0; } @@ -106,7 +107,7 @@ npf_reassembly(npf_t *npf, npf_cache_t * * Reassembly is complete, we have the final packet. * Cache again, since layer 4 data is accessible now. */ - nbuf_init(npf, nbuf, *mp, nbuf->nb_ifp); + nbuf_init(npf, nbuf, m, nbuf->nb_ifp); npc->npc_info = 0; if (npf_cache_all(npc) & (NPC_IPFRAG|NPC_FMTERR)) { @@ -132,6 +133,7 @@ npf_packet_handler(npf_t *npf, struct mb int error, decision, flags; uint32_t ntag; npf_match_info_t mi; + bool mff; /* QSBR checkpoint. */ pserialize_checkpoint(npf->qsbr); @@ -150,6 +152,7 @@ npf_packet_handler(npf_t *npf, struct mb mi.mi_rid = 0; mi.mi_retfl = 0; + *mp = NULL; decision = NPF_DECISION_BLOCK; error = 0; rp = NULL; @@ -160,22 +163,19 @@ npf_packet_handler(npf_t *npf, struct mb /* If error on the format, leave quickly. */ if (flags & NPC_FMTERR) { - *mp = nbuf_head_mbuf(&nbuf); error = EINVAL; - goto fastout; + goto out; } /* Determine whether it is an IP fragment. */ if (__predict_false(flags & NPC_IPFRAG)) { - /* - * Pass to IPv4/IPv6 reassembly mechanism. - */ - error = npf_reassembly(npf, &npc, mp); + /* Pass to IPv4/IPv6 reassembly mechanism. */ + error = npf_reassembly(npf, &npc, &mff); if (error) { goto out; } - if (*mp == NULL) { - /* More fragments should come; return. */ + if (mff) { + /* More fragments should come. */ return 0; } } @@ -250,6 +250,7 @@ npf_packet_handler(npf_t *npf, struct mb npf_conn_setpass(con, &mi, rp); } } + pass: decision = NPF_DECISION_PASS; KASSERT(error == 0); @@ -257,6 +258,7 @@ pass: * Perform NAT. */ error = npf_do_nat(&npc, con, di); + block: /* * Execute the rule procedure, if any is associated. @@ -267,9 +269,10 @@ block: npf_conn_release(con); } npf_rproc_release(rp); - *mp = NULL; + /* mbuf already freed */ return 0; } + out: /* * Release the reference on a connection. Release the reference @@ -281,7 +284,7 @@ out: npf_rproc_release(rp); } - /* Reset mbuf pointer before returning to the caller. */ + /* Get the new mbuf pointer. */ if ((*mp = nbuf_head_mbuf(&nbuf)) == NULL) { return error ? error : ENOMEM; } @@ -309,7 +312,6 @@ out: error = ENETUNREACH; } -fastout: if (*mp) { /* Free the mbuf chain. */ m_freem(*mp);