Split the npflog cloner and auto-load the extensions. trunk
authorchristos <christos@NetBSD.org>
Sun, 10 Mar 2013 20:51:44 +0000
branchtrunk
changeset 217181 ee6a219ed037
parent 217180 0e2b2bdea88b
child 217182 1344e568195e
Split the npflog cloner and auto-load the extensions.
sys/net/npf/files.npf
sys/net/npf/if_npflog.c
sys/net/npf/npf_ext_log.c
sys/net/npf/npf_rproc.c
--- a/sys/net/npf/files.npf	Sun Mar 10 19:46:12 2013 +0000
+++ b/sys/net/npf/files.npf	Sun Mar 10 20:51:44 2013 +0000
@@ -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 @@
 
 # ALGs
 file	net/npf/npf_alg_icmp.c			npf
+
+# Interfaces
+file	net/npf/if_npflog.c			npf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/net/npf/if_npflog.c	Sun Mar 10 20:51:44 2013 +0000
@@ -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;
+}
--- a/sys/net/npf/npf_ext_log.c	Sun Mar 10 19:46:12 2013 +0000
+++ b/sys/net/npf/npf_ext_log.c	Sun Mar 10 20:51:44 2013 +0000
@@ -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 @@
 
 #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 @@
 	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 @@
 		/*
 		 * 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 @@
 		if (error) {
 			return error;
 		}
-		npflogdetach();
 		break;
 
 	case MODULE_CMD_AUTOUNLOAD:
--- a/sys/net/npf/npf_rproc.c	Sun Mar 10 19:46:12 2013 +0000
+++ b/sys/net/npf/npf_rproc.c	Sun Mar 10 20:51:44 2013 +0000
@@ -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 @@
 #include <sys/atomic.h>
 #include <sys/kmem.h>
 #include <sys/mutex.h>
+#include <sys/module.h>
 
 #include "npf_impl.h"
 
@@ -218,6 +219,9 @@
 	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_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;
 }
 
 /*