Module Name: src Committed By: jakllsch Date: Mon May 19 18:45:51 UTC 2014
Modified Files: src/sys/net/npf: npf.h npf_ext_log.c npf_ext_normalize.c npf_ext_rndblock.c npf_handler.c npf_impl.h npf_rproc.c Log Message: Add ability to have mbufs disappear (to another interface) during npf_rproc_run(). For upcoming npf_ext_route extension. Guidance and ok by rmind@. To generate a diff of this commit: cvs rdiff -u -r1.38 -r1.39 src/sys/net/npf/npf.h cvs rdiff -u -r1.6 -r1.7 src/sys/net/npf/npf_ext_log.c cvs rdiff -u -r1.1 -r1.2 src/sys/net/npf/npf_ext_normalize.c cvs rdiff -u -r1.3 -r1.4 src/sys/net/npf/npf_ext_rndblock.c cvs rdiff -u -r1.29 -r1.30 src/sys/net/npf/npf_handler.c cvs rdiff -u -r1.50 -r1.51 src/sys/net/npf/npf_impl.h cvs rdiff -u -r1.9 -r1.10 src/sys/net/npf/npf_rproc.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.h diff -u src/sys/net/npf/npf.h:1.38 src/sys/net/npf/npf.h:1.39 --- src/sys/net/npf/npf.h:1.38 Fri Mar 14 11:29:44 2014 +++ src/sys/net/npf/npf.h Mon May 19 18:45:51 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: npf.h,v 1.38 2014/03/14 11:29:44 rmind Exp $ */ +/* $NetBSD: npf.h,v 1.39 2014/05/19 18:45:51 jakllsch Exp $ */ /*- * Copyright (c) 2009-2014 The NetBSD Foundation, Inc. @@ -188,7 +188,7 @@ typedef struct { void * ctx; int (*ctor)(npf_rproc_t *, prop_dictionary_t); void (*dtor)(npf_rproc_t *, void *); - void (*proc)(npf_cache_t *, nbuf_t *, void *, int *); + bool (*proc)(npf_cache_t *, nbuf_t *, void *, int *); } npf_ext_ops_t; void * npf_ext_register(const char *, const npf_ext_ops_t *); Index: src/sys/net/npf/npf_ext_log.c diff -u src/sys/net/npf/npf_ext_log.c:1.6 src/sys/net/npf/npf_ext_log.c:1.7 --- src/sys/net/npf/npf_ext_log.c:1.6 Mon Mar 11 17:03:55 2013 +++ src/sys/net/npf/npf_ext_log.c Mon May 19 18:45:51 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_ext_log.c,v 1.6 2013/03/11 17:03:55 christos Exp $ */ +/* $NetBSD: npf_ext_log.c,v 1.7 2014/05/19 18:45:51 jakllsch Exp $ */ /*- * Copyright (c) 2010-2012 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_ext_log.c,v 1.6 2013/03/11 17:03:55 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_ext_log.c,v 1.7 2014/05/19 18:45:51 jakllsch Exp $"); #include <sys/types.h> #include <sys/module.h> @@ -78,7 +78,7 @@ npf_log_dtor(npf_rproc_t *rp, void *meta kmem_free(meta, sizeof(npf_ext_log_t)); } -static void +static bool npf_log(npf_cache_t *npc, nbuf_t *nbuf, void *meta, int *decision) { struct mbuf *m = nbuf_head_mbuf(nbuf); @@ -102,7 +102,7 @@ npf_log(npf_cache_t *npc, nbuf_t *nbuf, if (ifp == NULL) { /* No interface. */ KERNEL_UNLOCK_ONE(NULL); - return; + return true; } /* Pass through BPF. */ @@ -110,6 +110,8 @@ npf_log(npf_cache_t *npc, nbuf_t *nbuf, ifp->if_obytes += m->m_pkthdr.len; bpf_mtap_af(ifp, family, m); KERNEL_UNLOCK_ONE(NULL); + + return true; } /* Index: src/sys/net/npf/npf_ext_normalize.c diff -u src/sys/net/npf/npf_ext_normalize.c:1.1 src/sys/net/npf/npf_ext_normalize.c:1.2 --- src/sys/net/npf/npf_ext_normalize.c:1.1 Tue Mar 12 20:47:48 2013 +++ src/sys/net/npf/npf_ext_normalize.c Mon May 19 18:45:51 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_ext_normalize.c,v 1.1 2013/03/12 20:47:48 christos Exp $ */ +/* $NetBSD: npf_ext_normalize.c,v 1.2 2014/05/19 18:45:51 jakllsch Exp $ */ /*- * Copyright (c) 2009-2012 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_ext_normalize.c,v 1.1 2013/03/12 20:47:48 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_ext_normalize.c,v 1.2 2014/05/19 18:45:51 jakllsch Exp $"); #include <sys/types.h> #include <sys/module.h> @@ -140,7 +140,7 @@ npf_normalize_ip4(npf_cache_t *npc, npf_ /* * npf_normalize: the main routine to normalize IPv4 and/or TCP headers. */ -static void +static bool npf_normalize(npf_cache_t *npc, nbuf_t *nbuf, void *params, int *decision) { npf_normalize_t *np = params; @@ -150,7 +150,7 @@ npf_normalize(npf_cache_t *npc, nbuf_t * /* Skip, if already blocking. */ if (*decision == NPF_DECISION_BLOCK) { - return; + return true; } /* Normalise IPv4. Nothing to do for IPv6. */ @@ -165,15 +165,15 @@ npf_normalize(npf_cache_t *npc, nbuf_t * if (maxmss == 0 || !npf_iscached(npc, NPC_TCP) || (th->th_flags & TH_SYN) == 0) { /* Not required; done. */ - return; + return true; } mss = 0; if (!npf_fetch_tcpopts(npc, nbuf, &mss, &wscale)) { - return; + return true; } if (ntohs(mss) <= maxmss) { /* Nothing else to do. */ - return; + return true; } maxmss = htons(maxmss); @@ -182,6 +182,8 @@ npf_normalize(npf_cache_t *npc, nbuf_t * cksum = npf_fixup16_cksum(th->th_sum, mss, maxmss); th->th_sum = cksum; } + + return true; } static int Index: src/sys/net/npf/npf_ext_rndblock.c diff -u src/sys/net/npf/npf_ext_rndblock.c:1.3 src/sys/net/npf/npf_ext_rndblock.c:1.4 --- src/sys/net/npf/npf_ext_rndblock.c:1.3 Mon Mar 11 17:03:55 2013 +++ src/sys/net/npf/npf_ext_rndblock.c Mon May 19 18:45:51 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_ext_rndblock.c,v 1.3 2013/03/11 17:03:55 christos Exp $ */ +/* $NetBSD: npf_ext_rndblock.c,v 1.4 2014/05/19 18:45:51 jakllsch Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_ext_rndblock.c,v 1.3 2013/03/11 17:03:55 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_ext_rndblock.c,v 1.4 2014/05/19 18:45:51 jakllsch Exp $"); #include <sys/types.h> #include <sys/cprng.h> @@ -96,7 +96,7 @@ npf_ext_rndblock_dtor(npf_rproc_t *rp, v /* * npf_ext_rndblock: main routine implementing the extension functionality. */ -static void +static bool npf_ext_rndblock(npf_cache_t *npc, nbuf_t *nbuf, void *meta, int *decision) { npf_ext_rndblock_t *rndblock = meta; @@ -104,7 +104,7 @@ npf_ext_rndblock(npf_cache_t *npc, nbuf_ /* Skip, if already blocking. */ if (*decision == NPF_DECISION_BLOCK) { - return; + return true; } /* @@ -129,6 +129,8 @@ npf_ext_rndblock(npf_cache_t *npc, nbuf_ *decision = NPF_DECISION_BLOCK; } } + + return true; } /* Index: src/sys/net/npf/npf_handler.c diff -u src/sys/net/npf/npf_handler.c:1.29 src/sys/net/npf/npf_handler.c:1.30 --- src/sys/net/npf/npf_handler.c:1.29 Fri Mar 14 11:29:44 2014 +++ src/sys/net/npf/npf_handler.c Mon May 19 18:45:51 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_handler.c,v 1.29 2014/03/14 11:29:44 rmind Exp $ */ +/* $NetBSD: npf_handler.c,v 1.30 2014/05/19 18:45:51 jakllsch Exp $ */ /*- * Copyright (c) 2009-2013 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_handler.c,v 1.29 2014/03/14 11:29:44 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_handler.c,v 1.30 2014/05/19 18:45:51 jakllsch Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -252,8 +252,13 @@ block: * Execute the rule procedure, if any is associated. * It may reverse the decision from pass to block. */ - if (rp) { - npf_rproc_run(&npc, &nbuf, rp, &decision); + if (rp && !npf_rproc_run(&npc, &nbuf, rp, &decision)) { + if (se) { + npf_session_release(se); + } + npf_rproc_release(rp); + *mp = NULL; + return 0; } out: /* Index: src/sys/net/npf/npf_impl.h diff -u src/sys/net/npf/npf_impl.h:1.50 src/sys/net/npf/npf_impl.h:1.51 --- src/sys/net/npf/npf_impl.h:1.50 Fri Mar 14 11:29:44 2014 +++ src/sys/net/npf/npf_impl.h Mon May 19 18:45:51 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_impl.h,v 1.50 2014/03/14 11:29:44 rmind Exp $ */ +/* $NetBSD: npf_impl.h,v 1.51 2014/05/19 18:45:51 jakllsch Exp $ */ /*- * Copyright (c) 2009-2014 The NetBSD Foundation, Inc. @@ -298,7 +298,7 @@ void npf_rprocset_insert(npf_rprocset_t npf_rproc_t * npf_rproc_create(prop_dictionary_t); void npf_rproc_acquire(npf_rproc_t *); void npf_rproc_release(npf_rproc_t *); -void npf_rproc_run(npf_cache_t *, nbuf_t *, npf_rproc_t *, int *); +bool npf_rproc_run(npf_cache_t *, nbuf_t *, npf_rproc_t *, int *); /* Session handling interface. */ void npf_session_sysinit(void); Index: src/sys/net/npf/npf_rproc.c diff -u src/sys/net/npf/npf_rproc.c:1.9 src/sys/net/npf/npf_rproc.c:1.10 --- src/sys/net/npf/npf_rproc.c:1.9 Mon Mar 11 01:56:37 2013 +++ src/sys/net/npf/npf_rproc.c Mon May 19 18:45:51 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_rproc.c,v 1.9 2013/03/11 01:56:37 christos Exp $ */ +/* $NetBSD: npf_rproc.c,v 1.10 2014/05/19 18:45:51 jakllsch Exp $ */ /*- * Copyright (c) 2009-2013 The NetBSD Foundation, Inc. @@ -330,7 +330,7 @@ npf_rproc_assign(npf_rproc_t *rp, void * * * => Reference on the rule procedure must be held. */ -void +bool npf_rproc_run(npf_cache_t *npc, nbuf_t *nbuf, npf_rproc_t *rp, int *decision) { const unsigned extcount = rp->rp_ext_count; @@ -343,10 +343,14 @@ npf_rproc_run(npf_cache_t *npc, nbuf_t * const npf_ext_ops_t *extops = ext->ext_ops; KASSERT(ext->ext_refcnt > 0); - extops->proc(npc, nbuf, rp->rp_ext_meta[i], decision); + if (!extops->proc(npc, nbuf, rp->rp_ext_meta[i], decision)) { + return false; + } if (nbuf_flag_p(nbuf, NBUF_DATAREF_RESET)) { npf_recache(npc, nbuf); } } + + return true; }