Module Name: src
Committed By: christos
Date: Sun Aug 7 17:38:34 UTC 2016
Modified Files:
src/sys/net: if_faith.c if_gif.c if_gre.c if_loop.c if_mpls.c if_ppp.c
if_pppoe.c if_sl.c if_srt.c if_stf.c if_strip.c if_tap.c if_tun.c
if_vlan.c
src/sys/net/agr: if_agr.c
Added Files:
src/sys/net: if_module.h
Log Message:
modularize some more drivers and merge the module glue
To generate a diff of this commit:
cvs rdiff -u -r1.53 -r1.54 src/sys/net/if_faith.c
cvs rdiff -u -r1.119 -r1.120 src/sys/net/if_gif.c
cvs rdiff -u -r1.169 -r1.170 src/sys/net/if_gre.c
cvs rdiff -u -r1.89 -r1.90 src/sys/net/if_loop.c
cvs rdiff -u -r0 -r1.1 src/sys/net/if_module.h
cvs rdiff -u -r1.26 -r1.27 src/sys/net/if_mpls.c
cvs rdiff -u -r1.156 -r1.157 src/sys/net/if_ppp.c
cvs rdiff -u -r1.113 -r1.114 src/sys/net/if_pppoe.c
cvs rdiff -u -r1.125 -r1.126 src/sys/net/if_sl.c
cvs rdiff -u -r1.22 -r1.23 src/sys/net/if_srt.c
cvs rdiff -u -r1.97 -r1.98 src/sys/net/if_stf.c
cvs rdiff -u -r1.105 -r1.106 src/sys/net/if_strip.c
cvs rdiff -u -r1.84 -r1.85 src/sys/net/if_tap.c
cvs rdiff -u -r1.127 -r1.128 src/sys/net/if_tun.c
cvs rdiff -u -r1.90 -r1.91 src/sys/net/if_vlan.c
cvs rdiff -u -r1.38 -r1.39 src/sys/net/agr/if_agr.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/if_faith.c
diff -u src/sys/net/if_faith.c:1.53 src/sys/net/if_faith.c:1.54
--- src/sys/net/if_faith.c:1.53 Fri Jun 10 09:27:16 2016
+++ src/sys/net/if_faith.c Sun Aug 7 13:38:33 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_faith.c,v 1.53 2016/06/10 13:27:16 ozaki-r Exp $ */
+/* $NetBSD: if_faith.c,v 1.54 2016/08/07 17:38:33 christos Exp $ */
/* $KAME: if_faith.c,v 1.21 2001/02/20 07:59:26 itojun Exp $ */
/*
@@ -40,9 +40,11 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_faith.c,v 1.53 2016/06/10 13:27:16 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_faith.c,v 1.54 2016/08/07 17:38:33 christos Exp $");
+#ifdef _KERNEL_OPT
#include "opt_inet.h"
+#endif
#include <sys/param.h>
#include <sys/systm.h>
@@ -53,6 +55,9 @@ __KERNEL_RCSID(0, "$NetBSD: if_faith.c,v
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/queue.h>
+#include <sys/device.h>
+#include <sys/module.h>
+#include <sys/atomic.h>
#include <sys/cpu.h>
@@ -98,15 +103,40 @@ static struct if_clone faith_cloner =
#define FAITHMTU 1500
+static u_int faith_count;
+
/* ARGSUSED */
void
faithattach(int count)
{
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in faithinit() below).
+ */
+}
+
+static void
+faithinit(void)
+{
if_clone_attach(&faith_cloner);
}
static int
+faithdetach(void)
+{
+ int error = 0;
+
+ if (faith_count != 0)
+ error = EBUSY;
+
+ if (error == 0)
+ if_clone_detach(&faith_cloner);
+
+ return error;
+}
+
+static int
faith_clone_create(struct if_clone *ifc, int unit)
{
struct ifnet *ifp;
@@ -127,6 +157,7 @@ faith_clone_create(struct if_clone *ifc,
if_attach(ifp);
if_alloc_sadl(ifp);
bpf_attach(ifp, DLT_NULL, sizeof(u_int));
+ atomic_inc_uint(&faith_count);
return (0);
}
@@ -138,6 +169,7 @@ faith_clone_destroy(struct ifnet *ifp)
if_detach(ifp);
if_free(ifp);
+ atomic_dec_uint(&faith_count);
return (0);
}
@@ -294,3 +326,10 @@ faithprefix(struct in6_addr *in6)
return ret;
}
#endif
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, faith, "")
Index: src/sys/net/if_gif.c
diff -u src/sys/net/if_gif.c:1.119 src/sys/net/if_gif.c:1.120
--- src/sys/net/if_gif.c:1.119 Mon Jul 4 00:43:46 2016
+++ src/sys/net/if_gif.c Sun Aug 7 13:38:33 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_gif.c,v 1.119 2016/07/04 04:43:46 knakahara Exp $ */
+/* $NetBSD: if_gif.c,v 1.120 2016/08/07 17:38:33 christos Exp $ */
/* $KAME: if_gif.c,v 1.76 2001/08/20 02:01:02 kjc Exp $ */
/*
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.119 2016/07/04 04:43:46 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.120 2016/08/07 17:38:33 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -55,6 +55,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1
#include <sys/kmem.h>
#include <sys/sysctl.h>
#include <sys/xcall.h>
+#include <sys/device.h>
+#include <sys/module.h>
#include <net/if.h>
#include <net/if_types.h>
@@ -106,8 +108,6 @@ static int gif_set_tunnel(struct ifnet *
struct sockaddr *);
static void gif_delete_tunnel(struct ifnet *);
-static void gif_sysctl_setup(struct sysctllog **);
-
static int gif_clone_create(struct if_clone *, int);
static int gif_clone_destroy(struct ifnet *);
static int gif_check_nesting(struct ifnet *, struct mbuf *);
@@ -132,12 +132,15 @@ static struct if_clone gif_cloner =
#endif
static int max_gif_nesting = MAX_GIF_NEST;
+static struct sysctllog *gif_sysctl;
+
static void
-gif_sysctl_setup(struct sysctllog **clog)
+gif_sysctl_setup(void)
{
+ gif_sysctl = NULL;
#ifdef INET
- sysctl_createv(clog, 0, NULL, NULL,
+ sysctl_createv(&gif_sysctl, 0, NULL, NULL,
CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
CTLTYPE_INT, "gifttl",
SYSCTL_DESCR("Default TTL for a gif tunnel datagram"),
@@ -146,7 +149,7 @@ gif_sysctl_setup(struct sysctllog **clog
IPCTL_GIF_TTL, CTL_EOL);
#endif
#ifdef INET6
- sysctl_createv(clog, 0, NULL, NULL,
+ sysctl_createv(&gif_sysctl, 0, NULL, NULL,
CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
CTLTYPE_INT, "gifhlim",
SYSCTL_DESCR("Default hop limit for a gif tunnel datagram"),
@@ -160,11 +163,36 @@ gif_sysctl_setup(struct sysctllog **clog
void
gifattach(int count)
{
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in gifinit() below).
+ */
+}
+
+static void
+gifinit(void)
+{
LIST_INIT(&gif_softc_list);
if_clone_attach(&gif_cloner);
- gif_sysctl_setup(NULL);
+ gif_sysctl_setup();
+}
+
+static int
+gifdetach(void)
+{
+ int error = 0;
+
+ if (!LIST_EMPTY(&gif_softc_list))
+ error = EBUSY;
+
+ if (error == 0) {
+ if_clone_detach(&gif_cloner);
+ sysctl_teardown(&gif_sysctl);
+ }
+
+ return error;
}
static int
@@ -1037,3 +1065,10 @@ gif_delete_tunnel(struct ifnet *ifp)
splx(s);
#endif
}
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, gif, "")
Index: src/sys/net/if_gre.c
diff -u src/sys/net/if_gre.c:1.169 src/sys/net/if_gre.c:1.170
--- src/sys/net/if_gre.c:1.169 Fri Jun 10 09:27:16 2016
+++ src/sys/net/if_gre.c Sun Aug 7 13:38:33 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_gre.c,v 1.169 2016/06/10 13:27:16 ozaki-r Exp $ */
+/* $NetBSD: if_gre.c,v 1.170 2016/08/07 17:38:33 christos Exp $ */
/*
* Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -45,7 +45,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.169 2016/06/10 13:27:16 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.170 2016/08/07 17:38:33 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_atalk.h"
@@ -71,6 +71,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1
#include <sys/systm.h>
#include <sys/sysctl.h>
#include <sys/kauth.h>
+#include <sys/device.h>
+#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/mutex.h>
@@ -84,6 +86,9 @@ __KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1
#include <net/if_types.h>
#include <net/netisr.h>
#include <net/route.h>
+#include <sys/device.h>
+#include <sys/module.h>
+#include <sys/atomic.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
@@ -142,6 +147,8 @@ int gre_debug = 0;
int ip_gre_ttl = GRE_TTL;
+static u_int gre_count;
+
static int gre_clone_create(struct if_clone *, int);
static int gre_clone_destroy(struct ifnet *);
@@ -317,6 +324,7 @@ gre_clone_create(struct if_clone *ifc, i
if_attach(&sc->sc_if);
if_alloc_sadl(&sc->sc_if);
bpf_attach(&sc->sc_if, DLT_NULL, sizeof(uint32_t));
+ atomic_inc_uint(&gre_count);
return 0;
fail1: cv_destroy(&sc->sc_fp_condvar);
@@ -358,6 +366,7 @@ gre_clone_destroy(struct ifnet *ifp)
gre_evcnt_detach(sc);
free(sc, M_DEVBUF);
+ atomic_dec_uint(&gre_count);
return 0;
}
@@ -1434,5 +1443,36 @@ out:
void
greattach(int count)
{
+
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in greinit() below).
+ */
+}
+
+static void
+greinit(void)
+{
if_clone_attach(&gre_cloner);
}
+
+static int
+gredetach(void)
+{
+ int error = 0;
+
+ if (gre_count != 0)
+ error = EBUSY;
+
+ if (error == 0)
+ if_clone_detach(&gre_cloner);
+
+ return error;
+}
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, gre, "")
Index: src/sys/net/if_loop.c
diff -u src/sys/net/if_loop.c:1.89 src/sys/net/if_loop.c:1.90
--- src/sys/net/if_loop.c:1.89 Wed Jun 22 06:44:32 2016
+++ src/sys/net/if_loop.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_loop.c,v 1.89 2016/06/22 10:44:32 knakahara Exp $ */
+/* $NetBSD: if_loop.c,v 1.90 2016/08/07 17:38:34 christos Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.89 2016/06/22 10:44:32 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.90 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -83,6 +83,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_loop.c,v
#include <sys/errno.h>
#include <sys/ioctl.h>
#include <sys/time.h>
+#include <sys/device.h>
+#include <sys/module.h>
#include <sys/cpu.h>
@@ -142,11 +144,28 @@ void
loopattach(int n)
{
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in loopnit() below).
+ */
+}
+
+static void
+loopinit(void)
+{
+
(void)loop_clone_create(&loop_cloner, 0); /* lo0 always exists */
if_clone_attach(&loop_cloner);
}
static int
+loopdetach(void)
+{
+ /* no detach for now; we don't allow lo0 to be deleted */
+ return EBUSY;
+}
+
+static int
loop_clone_create(struct if_clone *ifc, int unit)
{
struct ifnet *ifp;
@@ -487,3 +506,10 @@ loioctl(struct ifnet *ifp, u_long cmd, v
}
return (error);
}
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, loop, "")
Index: src/sys/net/if_mpls.c
diff -u src/sys/net/if_mpls.c:1.26 src/sys/net/if_mpls.c:1.27
--- src/sys/net/if_mpls.c:1.26 Thu Jul 7 02:55:43 2016
+++ src/sys/net/if_mpls.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_mpls.c,v 1.26 2016/07/07 06:55:43 msaitoh Exp $ */
+/* $NetBSD: if_mpls.c,v 1.27 2016/08/07 17:38:34 christos Exp $ */
/*
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.26 2016/07/07 06:55:43 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.27 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -49,6 +49,9 @@ __KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v
#include <net/if_types.h>
#include <net/netisr.h>
#include <net/route.h>
+#include <sys/device.h>
+#include <sys/module.h>
+#include <sys/atomic.h>
#ifdef INET
#include <netinet/in.h>
@@ -108,21 +111,46 @@ static struct mbuf *mpls_label_inet6(str
static struct mbuf *mpls_prepend_shim(struct mbuf *, union mpls_shim *);
extern int mpls_defttl, mpls_mapttl_inet, mpls_mapttl_inet6, mpls_icmp_respond,
- mpls_forwarding, mpls_frame_accept, mpls_mapprec_inet, mpls_mapclass_inet6,
- mpls_rfc4182;
+ mpls_forwarding, mpls_frame_accept, mpls_mapprec_inet, mpls_mapclass_inet6,
+ mpls_rfc4182;
+static u_int mpls_count;
/* ARGSUSED */
void
-ifmplsattach(int count)
+mplsattach(int count)
+{
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in mplsinit() below).
+ */
+}
+
+static void
+mplsinit(void)
{
if_clone_attach(&mpls_if_cloner);
}
static int
+mplsdetach(void)
+{
+ int error = 0;
+
+ if (mpls_count != 0)
+ error = EBUSY;
+
+ if (error == 0)
+ if_clone_detach(&mpls_if_cloner);
+
+ return error;
+}
+
+static int
mpls_clone_create(struct if_clone *ifc, int unit)
{
struct mpls_softc *sc;
+ atomic_inc_uint(&mpls_count);
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
if_initname(&sc->sc_if, ifc->ifc_name, unit);
@@ -155,6 +183,7 @@ mpls_clone_destroy(struct ifnet *ifp)
splx(s);
free(ifp->if_softc, M_DEVBUF);
+ atomic_dec_uint(&mpls_count);
return 0;
}
@@ -659,3 +688,10 @@ mpls_prepend_shim(struct mbuf *m, union
return m;
}
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, mpls, "")
Index: src/sys/net/if_ppp.c
diff -u src/sys/net/if_ppp.c:1.156 src/sys/net/if_ppp.c:1.157
--- src/sys/net/if_ppp.c:1.156 Sat Aug 6 18:54:34 2016
+++ src/sys/net/if_ppp.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ppp.c,v 1.156 2016/08/06 22:54:34 pgoyette Exp $ */
+/* $NetBSD: if_ppp.c,v 1.157 2016/08/07 17:38:34 christos Exp $ */
/* Id: if_ppp.c,v 1.6 1997/03/04 03:33:00 paulus Exp */
/*
@@ -102,7 +102,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ppp.c,v 1.156 2016/08/06 22:54:34 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ppp.c,v 1.157 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "ppp.h"
@@ -243,6 +243,8 @@ pppattach(int n __unused)
static void
pppinit(void)
{
+ /* Init the compressor sub-sub-system */
+ ppp_compressor_init();
if (ttyldisc_attach(&ppp_disc) != 0)
panic("%s", __func__);
@@ -263,7 +265,11 @@ pppdetach(void)
if (error == 0)
error = ttyldisc_detach(&ppp_disc);
- mutex_destroy(&ppp_list_lock);
+ if (error == 0) {
+ mutex_destroy(&ppp_list_lock);
+ if_clone_detach(&ppp_cloner);
+ ppp_compressor_destroy();
+ }
return error;
}
@@ -1944,6 +1950,7 @@ ppp_unregister_compressor(struct compres
/*
* Module infrastructure
*/
+#include "if_module.h"
#ifdef PPP_FILTER
#define PPP_DEP "bpf_filter,"
@@ -1951,63 +1958,4 @@ ppp_unregister_compressor(struct compres
#define PPP_DEP
#endif
-MODULE(MODULE_CLASS_DRIVER, if_ppp, PPP_DEP "slcompress");
-
-#ifdef _MODULE
-CFDRIVER_DECL(ppp, DV_IFNET, NULL);
-#endif
-
-static int
-if_ppp_modcmd(modcmd_t cmd, void *arg)
-{
- int error = 0;
-
- switch (cmd) {
- case MODULE_CMD_INIT:
- /* Init the compressor sub-sub-system */
- ppp_compressor_init();
-
-#ifdef _MODULE
- error = config_cfdriver_attach(&ppp_cd);
- if (error) {
- aprint_error("%s: unable to register cfdriver for"
- "%s, error %d\n", __func__, ppp_cd.cd_name, error);
- ppp_compressor_destroy();
- break;
- }
-
-#endif
- /* Init the unit list and line discipline stuff */
- pppinit();
- break;
-
- case MODULE_CMD_FINI:
- /*
- * Make sure it's ok to detach - no units left, and
- * line discipline is removed
- */
- error = pppdetach();
- if (error != 0)
- break;
-#ifdef _MODULE
- /* Remove device from autoconf database */
- error = config_cfdriver_detach(&ppp_cd);
- if (error) {
- aprint_error("%s: failed to detach %s cfdriver, "
- "error %d\n", __func__, ppp_cd.cd_name, error);
- break;
- }
-#endif
- ppp_compressor_destroy();
- break;
-
- case MODULE_CMD_STAT:
- error = ENOTTY;
- break;
- default:
- error = ENOTTY;
- break;
- }
-
- return error;
-}
+IF_MODULE(MODULE_CLASS_DRIVER, ppp, PPP_DEP "slcompress")
Index: src/sys/net/if_pppoe.c
diff -u src/sys/net/if_pppoe.c:1.113 src/sys/net/if_pppoe.c:1.114
--- src/sys/net/if_pppoe.c:1.113 Sat Aug 6 21:59:43 2016
+++ src/sys/net/if_pppoe.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_pppoe.c,v 1.113 2016/08/07 01:59:43 pgoyette Exp $ */
+/* $NetBSD: if_pppoe.c,v 1.114 2016/08/07 17:38:34 christos Exp $ */
/*-
* Copyright (c) 2002, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.113 2016/08/07 01:59:43 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.114 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "pppoe.h"
@@ -224,8 +224,8 @@ pppoeattach(int count)
{
/*
- * Nothing to do here - all initialization happens as part
- * of module init.
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in pppoeinit() below).
*/
}
@@ -238,16 +238,25 @@ pppoeinit(void)
pppoe_softintr = softint_establish(SOFTINT_NET, pppoe_softintr_handler,
NULL);
+ sysctl_net_pppoe_setup(&pppoe_sysctl_clog);
}
static int
pppoedetach(void)
{
+ int error = 0;
- softint_disestablish(pppoe_softintr);
- if_clone_detach(&pppoe_cloner);
+ if (!LIST_EMPTY(&pppoe_softc_list))
+ error = EBUSY;
- return 0;
+ if (error == 0) {
+ if_clone_detach(&pppoe_cloner);
+ softint_disestablish(pppoe_softintr);
+ /* Remove our sysctl sub-tree */
+ sysctl_teardown(&pppoe_sysctl_clog);
+ }
+
+ return error;
}
static int
@@ -1658,71 +1667,6 @@ pppoedisc_input(struct ifnet *ifp, struc
return;
}
-/*
- * Module glue
- */
-MODULE(MODULE_CLASS_DRIVER, if_pppoe, "sppp_subr");
-
-#ifdef _MODULE
-CFDRIVER_DECL(pppoe, DV_IFNET, NULL);
-#endif
-
-static int
-if_pppoe_modcmd(modcmd_t cmd, void *arg)
-{
- int error = 0;
-
- switch (cmd) {
- case MODULE_CMD_INIT:
-#ifdef _MODULE
- error = config_cfdriver_attach(&pppoe_cd);
- if (error) {
- aprint_error("%s: unable to register cfdriver for"
- "%s, error %d\n", __func__, pppoe_cd.cd_name,
- error);
- break;
- }
-#endif
- /* Init the cloner etc. */
- pppoeinit();
-
-#ifdef _MODULE
- /* Create our sysctl subtree */
- sysctl_net_pppoe_setup(&pppoe_sysctl_clog);
-#endif
- break;
-
- case MODULE_CMD_FINI:
- /*
- * Make sure it's ok to detach - no units left, and
- * line discipline is removed
- */
- if (!LIST_EMPTY(&pppoe_softc_list)) {
- error = EBUSY;
- break;
- }
- if ((error = pppoedetach()) != 0)
- break;
-#ifdef _MODULE
- /* Remove device from autoconf database */
- if ((error = config_cfdriver_detach(&pppoe_cd)) != 0) {
- aprint_error("%s: failed to detach %s cfdriver, error "
- "%d\n", __func__, pppoe_cd.cd_name, error);
- break;
- }
- /* Remove our sysctl sub-tree */
- sysctl_teardown(&pppoe_sysctl_clog);
-#endif
-
- break;
- case MODULE_CMD_STAT:
- case MODULE_CMD_AUTOUNLOAD:
- default:
- error = ENOTTY;
- }
- return error;
-}
-
SYSCTL_SETUP(sysctl_net_pppoe_setup, "sysctl net.pppoe subtree setup")
{
const struct sysctlnode *node = NULL;
@@ -1746,3 +1690,10 @@ SYSCTL_SETUP(sysctl_net_pppoe_setup, "sy
CTL_CREATE, CTL_EOL);
#endif
}
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, pppoe, "sppp_subr")
Index: src/sys/net/if_sl.c
diff -u src/sys/net/if_sl.c:1.125 src/sys/net/if_sl.c:1.126
--- src/sys/net/if_sl.c:1.125 Sat Aug 6 08:48:23 2016
+++ src/sys/net/if_sl.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_sl.c,v 1.125 2016/08/06 12:48:23 christos Exp $ */
+/* $NetBSD: if_sl.c,v 1.126 2016/08/07 17:38:34 christos Exp $ */
/*
* Copyright (c) 1987, 1989, 1992, 1993
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_sl.c,v 1.125 2016/08/06 12:48:23 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_sl.c,v 1.126 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -248,6 +248,9 @@ sldetach(void)
if (error == 0)
error = ttyldisc_detach(&slip_disc);
+ if (error == 0)
+ if_clone_detach(&sl_cloner);
+
return error;
}
@@ -1068,58 +1071,6 @@ slioctl(struct ifnet *ifp, u_long cmd, v
* Module infrastructure
*/
-MODULE(MODULE_CLASS_DRIVER, if_sl, "slcompress");
-
-#ifdef _MODULE
-CFDRIVER_DECL(sl, DV_IFNET, NULL);
-#endif
-
-static int
-if_sl_modcmd(modcmd_t cmd, void *arg)
-{
- int error = 0;
-
- switch (cmd) {
- case MODULE_CMD_INIT:
-#ifdef _MODULE
- error = config_cfdriver_attach(&sl_cd);
- if (error) {
- aprint_error("%s: unable to register cfdriver for"
- "%s, error %d\n", __func__, sl_cd.cd_name, error);
- break;
- }
-
-#endif
- /* Init the unit list and line discipline stuff */
- slinit();
- break;
-
- case MODULE_CMD_FINI:
- /*
- * Make sure it's ok to detach - no units left, and
- * line discipline is removed
- */
- error = sldetach();
- if (error != 0)
- break;
-#ifdef _MODULE
- /* Remove device from autoconf database */
- error = config_cfdriver_detach(&sl_cd);
- if (error) {
- aprint_error("%s: failed to detach %s cfdriver, "
- "error %d\n", __func__, sl_cd.cd_name, error);
- break;
- }
-#endif
- break;
+#include "if_module.h"
- case MODULE_CMD_STAT:
- error = ENOTTY;
- break;
- default:
- error = ENOTTY;
- break;
- }
-
- return error;
-}
+IF_MODULE(MODULE_CLASS_DRIVER, sl, "slcompress");
Index: src/sys/net/if_srt.c
diff -u src/sys/net/if_srt.c:1.22 src/sys/net/if_srt.c:1.23
--- src/sys/net/if_srt.c:1.22 Mon Jun 20 02:46:37 2016
+++ src/sys/net/if_srt.c Sun Aug 7 13:38:34 2016
@@ -1,8 +1,8 @@
-/* $NetBSD: if_srt.c,v 1.22 2016/06/20 06:46:37 knakahara Exp $ */
+/* $NetBSD: if_srt.c,v 1.23 2016/08/07 17:38:34 christos Exp $ */
/* This file is in the public domain. */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_srt.c,v 1.22 2016/06/20 06:46:37 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_srt.c,v 1.23 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -31,6 +31,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_srt.c,v 1
#include <sys/fcntl.h>
#include <sys/param.h>
#include <sys/ioctl.h>
+#include <sys/module.h>
+#include <sys/device.h>
#include <netinet/ip.h>
#include <netinet/ip6.h>
#include <net/if_types.h>
@@ -51,11 +53,13 @@ struct srt_softc {
#define SKF_CDEVOPEN 0x00000001
};
-void srtattach(void);
+#include "ioconf.h"
static struct srt_softc *softcv[SRT_MAXUNIT+1];
static unsigned int global_flags;
+static u_int srt_count;
+
/* Internal routines. */
static unsigned int ipv4_masks[33] = {
@@ -264,6 +268,7 @@ srt_clone_create(struct if_clone *cl, in
bpf_attach(&sc->intf, 0, 0);
#endif
softcv[unit] = sc;
+ atomic_inc_uint(&srt_count);
return 0;
}
@@ -288,6 +293,7 @@ srt_clone_destroy(struct ifnet *ifp)
}
softcv[sc->unit] = 0;
free(sc,M_DEVBUF);
+ atomic_inc_uint(&srt_count);
return 0;
}
@@ -295,16 +301,44 @@ struct if_clone srt_clone =
IF_CLONE_INITIALIZER("srt",&srt_clone_create,&srt_clone_destroy);
void
-srtattach(void)
+srtattach(int n)
+{
+
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in srtinit() below).
+ */
+}
+
+static void
+srtinit(void)
{
int i;
- for (i=SRT_MAXUNIT;i>=0;i--)
+ for (i = SRT_MAXUNIT; i >= 0; i--)
softcv[i] = 0;
global_flags = 0;
if_clone_attach(&srt_clone);
}
+static int
+srtdetach(void)
+{
+ int error = 0;
+ int i;
+
+ for (i = SRT_MAXUNIT; i >= 0; i--)
+ if(softcv[i]) {
+ error = EBUSY;
+ break;
+ }
+
+ if (error == 0)
+ if_clone_detach(&srt_clone);
+
+ return error;
+}
+
/* Special-device interface. */
static int
@@ -497,3 +531,10 @@ const struct cdevsw srt_cdevsw = {
.d_discard = nodiscard,
.d_flag = D_OTHER
};
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, srt, "")
Index: src/sys/net/if_stf.c
diff -u src/sys/net/if_stf.c:1.97 src/sys/net/if_stf.c:1.98
--- src/sys/net/if_stf.c:1.97 Sun Jul 31 23:15:30 2016
+++ src/sys/net/if_stf.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_stf.c,v 1.97 2016/08/01 03:15:30 ozaki-r Exp $ */
+/* $NetBSD: if_stf.c,v 1.98 2016/08/07 17:38:34 christos Exp $ */
/* $KAME: if_stf.c,v 1.62 2001/06/07 22:32:16 itojun Exp $ */
/*
@@ -75,10 +75,12 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.97 2016/08/01 03:15:30 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.98 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
+#include "stf.h"
+#include "gif.h" /*XXX*/
#endif
#ifndef INET6
@@ -95,6 +97,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1
#include <sys/proc.h>
#include <sys/queue.h>
#include <sys/syslog.h>
+#include <sys/device.h>
+#include <sys/module.h>
#include <sys/cpu.h>
@@ -120,9 +124,6 @@ __KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1
#include <net/net_osdep.h>
-#include "stf.h"
-#include "gif.h" /*XXX*/
-
#include <net/bpf.h>
#if NGIF > 0
@@ -182,11 +183,35 @@ void
stfattach(int count)
{
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in stfinit() below).
+ */
+}
+
+static void
+stfinit(void)
+{
+
LIST_INIT(&stf_softc_list);
if_clone_attach(&stf_cloner);
}
static int
+stfdetach(void)
+{
+ int error = 0;
+
+ if (!LIST_EMPTY(&stf_softc_list))
+ error = EBUSY;
+
+ if (error == 0)
+ if_clone_detach(&stf_cloner);
+
+ return error;
+}
+
+static int
stf_clone_create(struct if_clone *ifc, int unit)
{
struct stf_softc *sc;
@@ -714,3 +739,10 @@ stf_ioctl(struct ifnet *ifp, u_long cmd,
return error;
}
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, stf, "")
Index: src/sys/net/if_strip.c
diff -u src/sys/net/if_strip.c:1.105 src/sys/net/if_strip.c:1.106
--- src/sys/net/if_strip.c:1.105 Sat Aug 6 08:48:23 2016
+++ src/sys/net/if_strip.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_strip.c,v 1.105 2016/08/06 12:48:23 christos Exp $ */
+/* $NetBSD: if_strip.c,v 1.106 2016/08/07 17:38:34 christos Exp $ */
/* from: NetBSD: if_sl.c,v 1.38 1996/02/13 22:00:23 christos Exp $ */
/*
@@ -87,7 +87,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_strip.c,v 1.105 2016/08/06 12:48:23 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_strip.c,v 1.106 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -382,6 +382,9 @@ stripdetach(void)
if (error == 0)
error = ttyldisc_detach(&strip_disc);
+ if (error == 0)
+ if_clone_detach(&strip_cloner);
+
return error;
}
@@ -2003,60 +2006,6 @@ RecvErr_Message(struct strip_softc *stri
/*
* Module infrastructure
*/
+#include "if_module.h"
-MODULE(MODULE_CLASS_DRIVER, if_strip, "slcompress");
-
-#ifdef _MODULE
-CFDRIVER_DECL(strip, DV_IFNET, NULL);
-#endif
-
-static int
-if_strip_modcmd(modcmd_t cmd, void *arg)
-{
- int error = 0;
-
- switch (cmd) {
- case MODULE_CMD_INIT:
-#ifdef _MODULE
- error = config_cfdriver_attach(&strip_cd);
- if (error) {
- aprint_error("%s: unable to register cfdriver for"
- "%s, error %d\n", __func__, strip_cd.cd_name,
- error);
- break;
- }
-
-#endif
- /* Init the unit list and line discipline stuff */
- stripinit();
- break;
-
- case MODULE_CMD_FINI:
- /*
- * Make sure it's ok to detach - no units left, and
- * line discipline is removed
- */
- error = stripdetach();
- if (error != 0)
- break;
-#ifdef _MODULE
- /* Remove device from autoconf database */
- error = config_cfdriver_detach(&strip_cd);
- if (error) {
- aprint_error("%s: failed to detach %s cfdriver, "
- "error %d\n", __func__, strip_cd.cd_name, error);
- break;
- }
-#endif
- break;
-
- case MODULE_CMD_STAT:
- error = ENOTTY;
- break;
- default:
- error = ENOTTY;
- break;
- }
-
- return error;
-}
+IF_MODULE(MODULE_CLASS_DRIVER, strip, "slcompress");
Index: src/sys/net/if_tap.c
diff -u src/sys/net/if_tap.c:1.84 src/sys/net/if_tap.c:1.85
--- src/sys/net/if_tap.c:1.84 Fri Jun 10 09:27:16 2016
+++ src/sys/net/if_tap.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_tap.c,v 1.84 2016/06/10 13:27:16 ozaki-r Exp $ */
+/* $NetBSD: if_tap.c,v 1.85 2016/08/07 17:38:34 christos Exp $ */
/*
* Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation.
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.84 2016/06/10 13:27:16 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.85 2016/08/07 17:38:34 christos Exp $");
#if defined(_KERNEL_OPT)
@@ -61,6 +61,9 @@ __KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1
#include <sys/mutex.h>
#include <sys/intr.h>
#include <sys/stat.h>
+#include <sys/device.h>
+#include <sys/module.h>
+#include <sys/atomic.h>
#include <net/if.h>
#include <net/if_dl.h>
@@ -234,22 +237,38 @@ struct if_clone tap_cloners = IF_CLONE_I
static struct tap_softc * tap_clone_creator(int);
int tap_clone_destroyer(device_t);
+static u_int tap_count;
+
void
tapattach(int n)
{
- int error;
- error = config_cfattach_attach(tap_cd.cd_name, &tap_ca);
- if (error) {
- aprint_error("%s: unable to register cfattach\n",
- tap_cd.cd_name);
- (void)config_cfdriver_detach(&tap_cd);
- return;
- }
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in tapinit() below).
+ */
+}
+static void
+tapinit(void)
+{
if_clone_attach(&tap_cloners);
}
+static int
+tapdetach(void)
+{
+ int error = 0;
+
+ if (tap_count != 0)
+ error = EBUSY;
+
+ if (error == 0)
+ if_clone_detach(&tap_cloners);
+
+ return error;
+}
+
/* Pretty much useless for a pseudo-device */
static int
tap_match(device_t parent, cfdata_t cfdata, void *arg)
@@ -629,7 +648,7 @@ tap_clone_create(struct if_clone *ifc, i
tap_cd.cd_name, unit);
return (ENXIO);
}
-
+ atomic_inc_uint(&tap_count);
return (0);
}
@@ -669,8 +688,11 @@ static int
tap_clone_destroy(struct ifnet *ifp)
{
struct tap_softc *sc = ifp->if_softc;
+ int error = tap_clone_destroyer(sc->sc_dev);
- return tap_clone_destroyer(sc->sc_dev);
+ if (error == 0)
+ atomic_inc_uint(&tap_count);
+ return error;
}
int
@@ -1400,3 +1422,10 @@ tap_sysctl_handler(SYSCTLFN_ARGS)
return (error);
}
#endif
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, tap, "")
Index: src/sys/net/if_tun.c
diff -u src/sys/net/if_tun.c:1.127 src/sys/net/if_tun.c:1.128
--- src/sys/net/if_tun.c:1.127 Thu Jul 7 05:32:02 2016
+++ src/sys/net/if_tun.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_tun.c,v 1.127 2016/07/07 09:32:02 ozaki-r Exp $ */
+/* $NetBSD: if_tun.c,v 1.128 2016/08/07 17:38:34 christos Exp $ */
/*
* Copyright (c) 1988, Julian Onions <[email protected]>
@@ -15,7 +15,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tun.c,v 1.127 2016/07/07 09:32:02 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tun.c,v 1.128 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -39,6 +39,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_tun.c,v 1
#include <sys/kauth.h>
#include <sys/mutex.h>
#include <sys/cpu.h>
+#include <sys/device.h>
+#include <sys/module.h>
#include <net/if.h>
#include <net/if_types.h>
@@ -81,7 +83,7 @@ static struct if_clone tun_cloner =
IF_CLONE_INITIALIZER("tun", tun_clone_create, tun_clone_destroy);
static void tunattach0(struct tun_softc *);
-static void tuninit(struct tun_softc *);
+static void tuncreate(struct tun_softc *);
static void tun_i_softintr(void *);
static void tun_o_softintr(void *);
#ifdef ALTQ
@@ -117,12 +119,38 @@ void
tunattach(int unused)
{
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in pppinit() below).
+ */
+}
+
+static void
+tuninit(void)
+{
+
mutex_init(&tun_softc_lock, MUTEX_DEFAULT, IPL_NET);
LIST_INIT(&tun_softc_list);
LIST_INIT(&tunz_softc_list);
if_clone_attach(&tun_cloner);
}
+static int
+tundetach(void)
+{
+ int error = 0;
+
+ if (!LIST_EMPTY(&tun_softc_list) || !LIST_EMPTY(&tunz_softc_list))
+ error = EBUSY;
+
+ if (error == 0) {
+ if_clone_detach(&tun_cloner);
+ mutex_destroy(&tun_softc_lock);
+ }
+
+ return error;
+}
+
/*
* Find driver instance from dev_t.
* Returns with tp locked (if found).
@@ -382,12 +410,12 @@ out_nolock:
* Call at splnet().
*/
static void
-tuninit(struct tun_softc *tp)
+tuncreate(struct tun_softc *tp)
{
struct ifnet *ifp = &tp->tun_if;
struct ifaddr *ifa;
- TUNDEBUG("%s: tuninit\n", ifp->if_xname);
+ TUNDEBUG("%s: %s\n", __func__, ifp->if_xname);
mutex_enter(&tp->tun_lock);
ifp->if_flags |= IFF_UP | IFF_RUNNING;
@@ -445,7 +473,7 @@ tun_ioctl(struct ifnet *ifp, u_long cmd,
switch (cmd) {
case SIOCINITIFADDR:
- tuninit(tp);
+ tuncreate(tp);
ifa->ifa_rtrequest = p2p_rtrequest;
TUNDEBUG("%s: address set\n", ifp->if_xname);
break;
@@ -1113,3 +1141,10 @@ out_nolock:
splx(s);
return (rv);
}
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, tun, "")
Index: src/sys/net/if_vlan.c
diff -u src/sys/net/if_vlan.c:1.90 src/sys/net/if_vlan.c:1.91
--- src/sys/net/if_vlan.c:1.90 Wed Jun 22 06:44:32 2016
+++ src/sys/net/if_vlan.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vlan.c,v 1.90 2016/06/22 10:44:32 knakahara Exp $ */
+/* $NetBSD: if_vlan.c,v 1.91 2016/08/07 17:38:34 christos Exp $ */
/*-
* Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@@ -78,7 +78,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.90 2016/06/22 10:44:32 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.91 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -95,6 +95,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v
#include <sys/proc.h>
#include <sys/kauth.h>
#include <sys/mutex.h>
+#include <sys/device.h>
+#include <sys/module.h>
#include <net/bpf.h>
#include <net/if.h>
@@ -196,11 +198,37 @@ void
vlanattach(int n)
{
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in vlaninit() below).
+ */
+}
+
+static void
+vlaninit(void)
+{
+
LIST_INIT(&ifv_list);
mutex_init(&ifv_mtx, MUTEX_DEFAULT, IPL_NONE);
if_clone_attach(&vlan_cloner);
}
+static int
+vlandetach(void)
+{
+ int error = 0;
+
+ if (!LIST_EMPTY(&ifv_list))
+ error = EBUSY;
+
+ if (error == 0) {
+ if_clone_detach(&vlan_cloner);
+ mutex_destroy(&ifv_mtx);
+ }
+
+ return error;
+}
+
static void
vlan_reset_linkname(struct ifnet *ifp)
{
@@ -910,3 +938,10 @@ vlan_input(struct ifnet *ifp, struct mbu
m->m_flags &= ~M_PROMISC;
if_input(&ifv->ifv_if, m);
}
+
+/*
+ * Module infrastructure
+ */
+#include "if_module.h"
+
+IF_MODULE(MODULE_CLASS_DRIVER, vlan, "")
Index: src/sys/net/agr/if_agr.c
diff -u src/sys/net/agr/if_agr.c:1.38 src/sys/net/agr/if_agr.c:1.39
--- src/sys/net/agr/if_agr.c:1.38 Wed Jul 20 03:37:51 2016
+++ src/sys/net/agr/if_agr.c Sun Aug 7 13:38:34 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: if_agr.c,v 1.38 2016/07/20 07:37:51 ozaki-r Exp $ */
+/* $NetBSD: if_agr.c,v 1.39 2016/08/07 17:38:34 christos Exp $ */
/*-
* Copyright (c)2005 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_agr.c,v 1.38 2016/07/20 07:37:51 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_agr.c,v 1.39 2016/08/07 17:38:34 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -44,6 +44,9 @@ __KERNEL_RCSID(0, "$NetBSD: if_agr.c,v 1
#include <sys/proc.h> /* XXX for curproc */
#include <sys/kauth.h>
#include <sys/xcall.h>
+#include <sys/device.h>
+#include <sys/module.h>
+#include <sys/atomic.h>
#include <net/bpf.h>
#include <net/if.h>
@@ -96,6 +99,8 @@ static void agr_ports_exit(struct agr_so
static struct if_clone agr_cloner =
IF_CLONE_INITIALIZER("agr", agr_clone_create, agr_clone_destroy);
+static u_int agr_count;
+
/*
* EXPORTED FUNCTIONS
*/
@@ -108,9 +113,32 @@ void
agrattach(int count)
{
+ /*
+ * Nothing to do here, initialization is handled by the
+ * module initialization code in agrinit() below).
+ */
+}
+
+static void
+agrinit(void)
+{
if_clone_attach(&agr_cloner);
}
+static int
+agrdetach(void)
+{
+ int error = 0;
+
+ if (agr_count != 0)
+ error = EBUSY;
+
+ if (error == 0)
+ if_clone_detach(&agr_cloner);
+
+ return error;
+}
+
/*
* agr_input: frame collector.
*/
@@ -338,7 +366,7 @@ agr_clone_create(struct if_clone *ifc, i
if_attach(ifp);
agr_reset_iftype(ifp);
-
+ atomic_inc_uint(&agr_count);
return 0;
}
@@ -375,6 +403,7 @@ agr_clone_destroy(struct ifnet *ifp)
cv_destroy(&sc->sc_ports_cv);
agr_free_softc(sc);
+ atomic_dec_uint(&agr_count);
return 0;
}
@@ -1191,3 +1220,10 @@ agrport_config_promisc(struct agr_port *
return error;
}
+
+/*
+ * Module infrastructure
+ */
+#include <net/if_module.h>
+
+IF_MODULE(MODULE_CLASS_DRIVER, agr, "")
Added files:
Index: src/sys/net/if_module.h
diff -u /dev/null src/sys/net/if_module.h:1.1
--- /dev/null Sun Aug 7 13:38:34 2016
+++ src/sys/net/if_module.h Sun Aug 7 13:38:34 2016
@@ -0,0 +1,89 @@
+/* $NetBSD: if_module.h,v 1.1 2016/08/07 17:38:34 christos Exp $ */
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+#ifdef _MODULE
+# define IF_MODULE_CFDRIVER_DECL(name) CFDRIVER_DECL(name, DV_IFNET, NULL)
+# define IF_MODULE_CFDRIVER_ATTACH(name) \
+ error = config_cfdriver_attach(& name ## _cd); \
+ if (error) { \
+ aprint_error("%s: unable to register cfdriver for" \
+ "%s, error %d\n", __func__, name ## _cd.cd_name,\
+ error); \
+ break; \
+ }
+# define IF_MODULE_CFDRIVER_DETACH(name) \
+ /* Remove device from autoconf database */ \
+ error = config_cfdriver_detach(&name ## _cd); \
+ if (error) { \
+ aprint_error("%s: failed to detach %s cfdriver, " \
+ "error %d\n", __func__, name ## _cd.cd_name, \
+ error); \
+ break; \
+ }
+#else
+# define IF_MODULE_CFDRIVER_DECL(name)
+# define IF_MODULE_CFDRIVER_ATTACH(name)
+# define IF_MODULE_CFDRIVER_DETACH(name)
+#endif
+
+#define IF_MODULE(class, name, dep) \
+MODULE(class, if_ ## name, dep); \
+IF_MODULE_CFDRIVER_DECL(name); \
+static int \
+if_ ## name ## _modcmd(modcmd_t cmd, void *arg) \
+{ \
+ int error = 0; \
+ \
+ switch (cmd) { \
+ case MODULE_CMD_INIT: \
+ IF_MODULE_CFDRIVER_ATTACH(name) \
+ /* Init the unit list/line discipline stuff */ \
+ name ## init(); \
+ break; \
+ \
+ case MODULE_CMD_FINI: \
+ /* \
+ * Make sure it's ok to detach - no units left, \
+ * and line discipline is removed \
+ */ \
+ error = name ## detach(); \
+ if (error != 0) \
+ break; \
+ IF_MODULE_CFDRIVER_DETACH(name) \
+ break; \
+ \
+ case MODULE_CMD_STAT: \
+ error = ENOTTY; \
+ break; \
+ default: \
+ error = ENOTTY; \
+ break; \
+ } \
+ \
+ return error; \
+}