Module Name: src Committed By: christos Date: Sun Mar 10 20:51:45 UTC 2013
Modified Files: src/sys/net/npf: files.npf npf_ext_log.c npf_rproc.c Added Files: src/sys/net/npf: if_npflog.c Log Message: Split the npflog cloner and auto-load the extensions. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/sys/net/npf/files.npf cvs rdiff -u -r0 -r1.1 src/sys/net/npf/if_npflog.c cvs rdiff -u -r1.2 -r1.3 src/sys/net/npf/npf_ext_log.c cvs rdiff -u -r1.6 -r1.7 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/files.npf diff -u src/sys/net/npf/files.npf:1.10 src/sys/net/npf/files.npf:1.11 --- src/sys/net/npf/files.npf:1.10 Fri Feb 8 22:35:31 2013 +++ src/sys/net/npf/files.npf Sun Mar 10 16:51:44 2013 @@ -1,4 +1,4 @@ -# $NetBSD: files.npf,v 1.10 2013/02/09 03:35:31 rmind Exp $ +# $NetBSD: files.npf,v 1.11 2013/03/10 20:51:44 christos Exp $ # # Public Domain. # @@ -36,3 +36,6 @@ file net/npf/npf_ext_rndblock.c npf # ALGs file net/npf/npf_alg_icmp.c npf + +# Interfaces +file net/npf/if_npflog.c npf Index: src/sys/net/npf/npf_ext_log.c diff -u src/sys/net/npf/npf_ext_log.c:1.2 src/sys/net/npf/npf_ext_log.c:1.3 --- src/sys/net/npf/npf_ext_log.c:1.2 Mon Dec 24 14:05:42 2012 +++ src/sys/net/npf/npf_ext_log.c Sun Mar 10 16:51:44 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_ext_log.c,v 1.2 2012/12/24 19:05:42 rmind Exp $ */ +/* $NetBSD: npf_ext_log.c,v 1.3 2013/03/10 20:51:44 christos 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.2 2012/12/24 19:05:42 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_ext_log.c,v 1.3 2013/03/10 20:51:44 christos Exp $"); #include <sys/types.h> #include <sys/module.h> @@ -51,7 +51,7 @@ __KERNEL_RCSID(0, "$NetBSD: npf_ext_log. #include "npf_impl.h" -NPF_EXT_MODULE(npf_ext_log, ""); +NPF_EXT_MODULE(npf_ext_log, "if_npflog"); #define NPFEXT_LOG_VER 1 @@ -61,101 +61,6 @@ typedef struct { unsigned int if_idx; } npf_ext_log_t; -typedef struct npflog_softc { - LIST_ENTRY(npflog_softc) sc_entry; - kmutex_t sc_lock; - ifnet_t sc_if; - int sc_unit; -} npflog_softc_t; - -static int npflog_clone_create(struct if_clone *, int); -static int npflog_clone_destroy(ifnet_t *); - -static LIST_HEAD(, npflog_softc) npflog_if_list __cacheline_aligned; -static struct if_clone npflog_cloner = - IF_CLONE_INITIALIZER("npflog", npflog_clone_create, npflog_clone_destroy); - -void -npflogattach(int nunits) -{ - - LIST_INIT(&npflog_if_list); - if_clone_attach(&npflog_cloner); -} - -void -npflogdetach(void) -{ - npflog_softc_t *sc; - - while ((sc = LIST_FIRST(&npflog_if_list)) != NULL) { - npflog_clone_destroy(&sc->sc_if); - } - if_clone_detach(&npflog_cloner); -} - -static int -npflog_ioctl(ifnet_t *ifp, u_long cmd, void *data) -{ - npflog_softc_t *sc = ifp->if_softc; - int error = 0; - - mutex_enter(&sc->sc_lock); - switch (cmd) { - case SIOCINITIFADDR: - ifp->if_flags |= (IFF_UP | IFF_RUNNING); - break; - default: - error = ifioctl_common(ifp, cmd, data); - break; - } - mutex_exit(&sc->sc_lock); - return error; -} - -static int -npflog_clone_create(struct if_clone *ifc, int unit) -{ - npflog_softc_t *sc; - ifnet_t *ifp; - - sc = kmem_zalloc(sizeof(npflog_softc_t), KM_SLEEP); - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTNET); - - ifp = &sc->sc_if; - ifp->if_softc = sc; - - if_initname(ifp, "npflog", unit); - ifp->if_type = IFT_OTHER; - ifp->if_dlt = DLT_NULL; - ifp->if_ioctl = npflog_ioctl; - - KERNEL_LOCK(1, NULL); - if_attach(ifp); - if_alloc_sadl(ifp); - bpf_attach(ifp, DLT_NULL, 0); - LIST_INSERT_HEAD(&npflog_if_list, sc, sc_entry); - KERNEL_UNLOCK_ONE(NULL); - - return 0; -} - -static int -npflog_clone_destroy(ifnet_t *ifp) -{ - npflog_softc_t *sc = ifp->if_softc; - - KERNEL_LOCK(1, NULL); - LIST_REMOVE(sc, sc_entry); - bpf_detach(ifp); - if_detach(ifp); - KERNEL_UNLOCK_ONE(NULL); - - mutex_destroy(&sc->sc_lock); - kmem_free(sc, sizeof(npflog_softc_t)); - return 0; -} - static int npf_log_ctor(npf_rproc_t *rp, prop_dictionary_t params) { @@ -227,7 +132,6 @@ npf_ext_log_modcmd(modcmd_t cmd, void *a /* * Initialise the NPF logging extension. */ - npflogattach(1); npf_ext_log_id = npf_ext_register("log", &npf_log_ops); if (!npf_ext_log_id) { npflogdetach(); @@ -240,7 +144,6 @@ npf_ext_log_modcmd(modcmd_t cmd, void *a if (error) { return error; } - npflogdetach(); break; case MODULE_CMD_AUTOUNLOAD: Index: src/sys/net/npf/npf_rproc.c diff -u src/sys/net/npf/npf_rproc.c:1.6 src/sys/net/npf/npf_rproc.c:1.7 --- src/sys/net/npf/npf_rproc.c:1.6 Fri Feb 8 22:35:32 2013 +++ src/sys/net/npf/npf_rproc.c Sun Mar 10 16:51:44 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_rproc.c,v 1.6 2013/02/09 03:35:32 rmind Exp $ */ +/* $NetBSD: npf_rproc.c,v 1.7 2013/03/10 20:51:44 christos Exp $ */ /*- * Copyright (c) 2009-2013 The NetBSD Foundation, Inc. @@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD"); #include <sys/atomic.h> #include <sys/kmem.h> #include <sys/mutex.h> +#include <sys/module.h> #include "npf_impl.h" @@ -218,6 +219,9 @@ npf_rprocset_destroy(npf_rprocset_t *rps kmem_free(rpset, sizeof(npf_rprocset_t)); } +static const char npf_ext_prefix[] = "npf_ext_"; +#define NPF_EXT_PREFLEN (sizeof(npf_ext_prefix) - 1) + /* * npf_rproc_lookup: find a rule procedure by the name. */ @@ -225,12 +229,21 @@ npf_rproc_t * npf_rprocset_lookup(npf_rprocset_t *rpset, const char *name) { npf_rproc_t *rp; + char modname[RPROC_NAME_LEN + NPF_EXT_PREFLEN]; + int loaded = 0; +again: LIST_FOREACH(rp, &rpset->rps_list, rp_entry) { if (strncmp(rp->rp_name, name, RPROC_NAME_LEN) == 0) break; } - return rp; + if (rp != NULL || loaded != 0) + return rp; + loaded++; + snprintf(modname, sizeof(modname), "%s%s", npf_ext_prefix, name); + if (module_autoload(modname, MODULE_CLASS_MISC)) + return NULL; + goto again; } /* Added files: Index: src/sys/net/npf/if_npflog.c diff -u /dev/null src/sys/net/npf/if_npflog.c:1.1 --- /dev/null Sun Mar 10 16:51:45 2013 +++ src/sys/net/npf/if_npflog.c Sun Mar 10 16:51:44 2013 @@ -0,0 +1,169 @@ +/* $NetBSD: if_npflog.c,v 1.1 2013/03/10 20:51:44 christos Exp $ */ + +/*- + * Copyright (c) 2010-2012 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This material is based upon work partially supported by The + * NetBSD Foundation under a contract with Mindaugas Rasiukevicius. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * NPF logging extension. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: if_npflog.c,v 1.1 2013/03/10 20:51:44 christos Exp $"); + +#include <sys/types.h> +#include <sys/module.h> + +#include <sys/conf.h> +#include <sys/kmem.h> +#include <sys/mbuf.h> +#include <sys/mutex.h> +#include <sys/queue.h> +#include <sys/sockio.h> + +#include <net/if.h> +#include <net/if_types.h> +#include <net/bpf.h> + +MODULE(MODULE_CLASS_DRIVER, if_npflog, NULL); + +typedef struct npflog_softc { + LIST_ENTRY(npflog_softc) sc_entry; + kmutex_t sc_lock; + ifnet_t sc_if; + int sc_unit; +} npflog_softc_t; + +static int npflog_clone_create(struct if_clone *, int); +static int npflog_clone_destroy(ifnet_t *); + +static LIST_HEAD(, npflog_softc) npflog_if_list __cacheline_aligned; +static struct if_clone npflog_cloner = + IF_CLONE_INITIALIZER("npflog", npflog_clone_create, npflog_clone_destroy); + +static void +npflogattach(int nunits) +{ + + LIST_INIT(&npflog_if_list); + if_clone_attach(&npflog_cloner); +} + +static void +npflogdetach(void) +{ + npflog_softc_t *sc; + + while ((sc = LIST_FIRST(&npflog_if_list)) != NULL) { + npflog_clone_destroy(&sc->sc_if); + } + if_clone_detach(&npflog_cloner); +} + +static int +npflog_ioctl(ifnet_t *ifp, u_long cmd, void *data) +{ + npflog_softc_t *sc = ifp->if_softc; + int error = 0; + + mutex_enter(&sc->sc_lock); + switch (cmd) { + case SIOCINITIFADDR: + ifp->if_flags |= (IFF_UP | IFF_RUNNING); + break; + default: + error = ifioctl_common(ifp, cmd, data); + break; + } + mutex_exit(&sc->sc_lock); + return error; +} + +static int +npflog_clone_create(struct if_clone *ifc, int unit) +{ + npflog_softc_t *sc; + ifnet_t *ifp; + + sc = kmem_zalloc(sizeof(npflog_softc_t), KM_SLEEP); + mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTNET); + + ifp = &sc->sc_if; + ifp->if_softc = sc; + + if_initname(ifp, "npflog", unit); + ifp->if_type = IFT_OTHER; + ifp->if_dlt = DLT_NULL; + ifp->if_ioctl = npflog_ioctl; + + KERNEL_LOCK(1, NULL); + if_attach(ifp); + if_alloc_sadl(ifp); + bpf_attach(ifp, DLT_NULL, 0); + LIST_INSERT_HEAD(&npflog_if_list, sc, sc_entry); + KERNEL_UNLOCK_ONE(NULL); + + return 0; +} + +static int +npflog_clone_destroy(ifnet_t *ifp) +{ + npflog_softc_t *sc = ifp->if_softc; + + KERNEL_LOCK(1, NULL); + LIST_REMOVE(sc, sc_entry); + bpf_detach(ifp); + if_detach(ifp); + KERNEL_UNLOCK_ONE(NULL); + + mutex_destroy(&sc->sc_lock); + kmem_free(sc, sizeof(npflog_softc_t)); + return 0; +} + +/* + * Module interface. + */ +static int +if_npflog_modcmd(modcmd_t cmd, void *arg) +{ + switch (cmd) { + case MODULE_CMD_INIT: + npflogattach(1); + break; + + case MODULE_CMD_FINI: + npflogdetach(); + break; + + default: + return ENOTTY; + } + return 0; +}