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;
+}