Network interface cloning (Step1: API UPDATE)
Max Laier
max at love2party.net
Fri Dec 19 10:04:08 PST 2003
attached patch bumps IF_CLONE... API to what is in 5.x with the
following nice additions:
1) All if_unit allocations are handled in the cloner common case
removing a lot of (repetitive) code from callers as well as the rman.h
dependency.
2) Initial device instances are created when the cloner is attached.
This updates all current callers of course: faith, gre, gif and vlan.
After this I'd make all pseudo devices cloning as well, slowly paving
the way to if_xname.
Comments? Hope I don't step on anyone's toe, but should not (IMO).
--
Best regards, | max at xxxxxxxxxxxxxx
Max Laier | ICQ #67774661
http://pf4freebsd.love2party.net/ | mlaier at EFnet #DragonFlyBSD
Index: net/if.c
===================================================================
RCS file: /root/.dfcvs/src/sys/net/if.c,v
retrieving revision 1.9
diff -u -r1.9 if.c
--- net/if.c 9 Nov 2003 02:22:36 -0000 1.9
+++ net/if.c 19 Dec 2003 16:15:20 -0000
@@ -92,6 +92,7 @@
MALLOC_DEFINE(M_IFADDR, "ifaddr", "interface address");
MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address");
+MALLOC_DEFINE(M_CLONE, "clone", "interface cloning framework");
int ifqmaxlen = IFQ_MAXLEN;
struct ifnethead ifnet; /* depend on static init XXX */
@@ -374,7 +375,7 @@
{
struct if_clone *ifc;
char *dp;
- int wildcard;
+ int wildcard, bytoff, bitoff;
int unit;
int err;
@@ -385,12 +386,41 @@
if (ifunit(name) != NULL)
return (EEXIST);
+ bytoff = bitoff = 0;
wildcard = (unit < 0);
+ /*
+ * Find a free unit if none was given.
+ */
+ if (wildcard) {
+ while ((bytoff < ifc->ifc_bmlen)
+ && (ifc->ifc_units[bytoff] == 0xff))
+ bytoff++;
+ if (bytoff >= ifc->ifc_bmlen)
+ return (ENOSPC);
+ while ((ifc->ifc_units[bytoff] & (1 << bitoff)) != 0)
+ bitoff++;
+ unit = (bytoff << 3) + bitoff;
+ }
- err = (*ifc->ifc_create)(ifc, &unit);
+ if (unit > ifc->ifc_maxunit)
+ return (ENXIO);
+
+ err = (*ifc->ifc_create)(ifc, unit);
if (err != 0)
return (err);
+ if (!wildcard) {
+ bytoff = unit >> 3;
+ bitoff = unit - (bytoff << 3);
+ }
+
+ /*
+ * Allocate the unit in the bitmap.
+ */
+ KASSERT((ifc->ifc_units[bytoff] & (1 << bitoff)) == 0,
+ ("%s: bit is already set", __func__));
+ ifc->ifc_units[bytoff] |= (1 << bitoff);
+
/* In the wildcard case, we need to update the name. */
if (wildcard) {
for (dp = name; *dp != '\0'; dp++);
@@ -403,7 +433,7 @@
*/
panic("if_clone_create(): interface name too long");
}
-
+
}
return (0);
@@ -418,11 +448,16 @@
{
struct if_clone *ifc;
struct ifnet *ifp;
+ int bytoff, bitoff;
+ int unit;
- ifc = if_clone_lookup(name, NULL);
+ ifc = if_clone_lookup(name, &unit);
if (ifc == NULL)
return (EINVAL);
+ if (unit < ifc->ifc_minifs)
+ return (EINVAL);
+
ifp = ifunit(name);
if (ifp == NULL)
return (ENXIO);
@@ -431,6 +466,15 @@
return (EOPNOTSUPP);
(*ifc->ifc_destroy)(ifp);
+
+ /*
+ * Compute offset in the bitmap and deallocate the unit.
+ */
+ bytoff = unit >> 3;
+ bitoff = unit - (bytoff << 3);
+ KASSERT((ifc->ifc_units[bytoff] & (1 << bitoff)) != 0,
+ ("%s: bit is already cleared", __func__));
+ ifc->ifc_units[bytoff] &= ~(1 << bitoff);
return (0);
}
@@ -484,9 +528,39 @@
if_clone_attach(ifc)
struct if_clone *ifc;
{
+ int bytoff, bitoff;
+ int err;
+ int len, maxclone;
+ int unit;
+
+ KASSERT(ifc->ifc_minifs - 1 <= ifc->ifc_maxunit,
+ ("%s: %s requested more units then allowed (%d > %d)",
+ __func__, ifc->ifc_name, ifc->ifc_minifs,
+ ifc->ifc_maxunit + 1));
+ /*
+ * Compute bitmap size and allocate it.
+ */
+ maxclone = ifc->ifc_maxunit + 1;
+ len = maxclone >> 3;
+ if ((len << 3) < maxclone)
+ len++;
+ ifc->ifc_units = malloc(len, M_CLONE, M_WAITOK | M_ZERO);
+ ifc->ifc_bmlen = len;
LIST_INSERT_HEAD(&if_cloners, ifc, ifc_list);
if_cloners_count++;
+
+ for (unit = 0; unit < ifc->ifc_minifs; unit++) {
+ err = (*ifc->ifc_create)(ifc, unit);
+ KASSERT(err == 0,
+ ("%s: failed to create required interface %s%d",
+ __func__, ifc->ifc_name, unit));
+
+ /* Allocate the unit in the bitmap. */
+ bytoff = unit >> 3;
+ bitoff = unit - (bytoff << 3);
+ ifc->ifc_units[bytoff] |= (1 << bitoff);
+ }
}
/*
@@ -498,6 +572,7 @@
{
LIST_REMOVE(ifc, ifc_list);
+ free(ifc->ifc_units, M_CLONE);
if_cloners_count--;
}
Index: net/if.h
===================================================================
RCS file: /root/.dfcvs/src/sys/net/if.h,v
retrieving revision 1.7
diff -u -r1.7 if.h
--- net/if.h 22 Nov 2003 19:30:56 -0000 1.7
+++ net/if.h 19 Dec 2003 16:26:39 -0000
@@ -58,6 +58,7 @@
*/
#define IFNAMSIZ 16
#define IF_NAMESIZE IFNAMSIZ
+#define IF_MAXUNIT 0x7fff /* if_unit is 15bits */
#ifdef _KERNEL
/*
@@ -67,13 +68,17 @@
LIST_ENTRY(if_clone) ifc_list; /* on list of cloners */
const char *ifc_name; /* name of device, e.g. `gif' */
size_t ifc_namelen; /* length of name */
+ int ifc_minifs; /* minimum number of interfaces */
+ int ifc_maxunit; /* maximum unit number */
+ unsigned char *ifc_units; /* bitmap to handle units */
+ int ifc_bmlen; /* bitmap length */
- int (*ifc_create)(struct if_clone *, int *);
+ int (*ifc_create)(struct if_clone *, int);
void (*ifc_destroy)(struct ifnet *);
};
-#define IF_CLONE_INITIALIZER(name, create, destroy) \
- { { 0 }, name, sizeof(name) - 1, create, destroy }
+#define IF_CLONE_INITIALIZER(name, create, destroy, minifs, maxunit) \
+ { { 0 }, name, sizeof(name) - 1, minifs, maxunit, NULL, 0, create, destroy }
#endif
/*
Index: net/faith/if_faith.c
===================================================================
RCS file: /root/.dfcvs/src/sys/net/faith/if_faith.c,v
retrieving revision 1.5
diff -u -r1.5 if_faith.c
--- net/faith/if_faith.c 15 Sep 2003 23:38:13 -0000 1.5
+++ net/faith/if_faith.c 19 Dec 2003 16:27:55 -0000
@@ -62,7 +62,6 @@
#include <sys/types.h>
#include <sys/malloc.h>
#include <machine/bus.h> /* XXX: Shouldn't really be required! */
-#include <sys/rman.h>
#include <net/if.h>
#include <net/if_types.h>
@@ -89,11 +88,9 @@
#include <net/net_osdep.h>
#define FAITHNAME "faith"
-#define FAITH_MAXUNIT 0x7fff /* ifp->if_unit is only 15 bits */
struct faith_softc {
struct ifnet sc_if; /* must be first */
- struct resource *r_unit;
LIST_ENTRY(faith_softc) sc_list;
};
@@ -106,14 +103,13 @@
static int faithmodevent (module_t, int, void *);
static MALLOC_DEFINE(M_FAITH, FAITHNAME, "Firewall Assisted Tunnel Interface");
-static struct rman faithunits[1];
LIST_HEAD(, faith_softc) faith_softc_list;
-int faith_clone_create (struct if_clone *, int *);
+int faith_clone_create (struct if_clone *, int);
void faith_clone_destroy (struct ifnet *);
-struct if_clone faith_cloner =
- IF_CLONE_INITIALIZER(FAITHNAME, faith_clone_create, faith_clone_destroy);
+struct if_clone faith_cloner = IF_CLONE_INITIALIZER(FAITHNAME,
+ faith_clone_create, faith_clone_destroy, NFAITH, IF_MAXUNIT);
#define FAITHMTU 1500
@@ -123,30 +119,11 @@
int type;
void *data;
{
- int i;
- int err;
switch (type) {
case MOD_LOAD:
- faithunits->rm_type = RMAN_ARRAY;
- faithunits->rm_descr = "configurable if_faith units";
- err = rman_init(faithunits);
- if (err != 0)
- return (err);
- err = rman_manage_region(faithunits, 0, FAITH_MAXUNIT);
- if (err != 0) {
- printf("%s: faithunits: rman_manage_region: "
- "Failed %d\n", FAITHNAME, err);
- rman_fini(faithunits);
- return (err);
- }
LIST_INIT(&faith_softc_list);
if_clone_attach(&faith_cloner);
- for(i = 0; i < NFAITH; i ++) {
- err = faith_clone_create(&faith_cloner, &i);
- KASSERT(err == 0,
- ("Error creating initial faith interfaces"));
- }
#ifdef INET6
faithprefix_p = faithprefix;
@@ -164,10 +141,6 @@
faith_clone_destroy(
&LIST_FIRST(&faith_softc_list)->sc_if);
- err = rman_fini(faithunits);
- if (err != 0)
- return (err);
-
break;
}
return 0;
@@ -185,34 +158,16 @@
int
faith_clone_create(ifc, unit)
struct if_clone *ifc;
- int *unit;
+ int unit;
{
- struct resource *r;
struct faith_softc *sc;
- if (*unit > FAITH_MAXUNIT)
- return (ENXIO);
-
- if (*unit < 0) {
- r = rman_reserve_resource(faithunits, 0, FAITH_MAXUNIT, 1,
- RF_ALLOCATED | RF_ACTIVE, NULL);
- if (r == NULL)
- return (ENOSPC);
- *unit = rman_get_start(r);
- } else {
- r = rman_reserve_resource(faithunits, *unit, *unit, 1,
- RF_ALLOCATED | RF_ACTIVE, NULL);
- if (r == NULL)
- return (ENOSPC);
- }
-
sc = malloc(sizeof(struct faith_softc), M_FAITH, M_WAITOK);
bzero(sc, sizeof(struct faith_softc));
sc->sc_if.if_softc = sc;
sc->sc_if.if_name = FAITHNAME;
- sc->sc_if.if_unit = *unit;
- sc->r_unit = r;
+ sc->sc_if.if_unit = unit;
sc->sc_if.if_mtu = FAITHMTU;
/* Change to BROADCAST experimentaly to announce its prefix. */
@@ -233,15 +188,11 @@
faith_clone_destroy(ifp)
struct ifnet *ifp;
{
- int err;
struct faith_softc *sc = (void *) ifp;
LIST_REMOVE(sc, sc_list);
bpfdetach(ifp);
if_detach(ifp);
-
- err = rman_release_resource(sc->r_unit);
- KASSERT(err == 0, ("Unexpected error freeing resource"));
free(sc, M_FAITH);
}
Index: net/gif/if_gif.c
===================================================================
RCS file: /root/.dfcvs/src/sys/net/gif/if_gif.c,v
retrieving revision 1.6
diff -u -r1.6 if_gif.c
--- net/gif/if_gif.c 15 Sep 2003 23:38:13 -0000 1.6
+++ net/gif/if_gif.c 19 Dec 2003 16:52:10 -0000
@@ -48,7 +48,6 @@
#include <sys/protosw.h>
#include <sys/conf.h>
#include <machine/bus.h> /* XXX: Shouldn't really be required! */
-#include <sys/rman.h>
#include <machine/cpu.h>
#include <net/if.h>
@@ -84,18 +83,15 @@
#include <net/net_osdep.h>
#define GIFNAME "gif"
-#define GIFDEV "if_gif"
-#define GIF_MAXUNIT 0x7fff /* ifp->if_unit is only 15 bits */
static MALLOC_DEFINE(M_GIF, "gif", "Generic Tunnel Interface");
-static struct rman gifunits[1];
LIST_HEAD(, gif_softc) gif_softc_list;
-int gif_clone_create (struct if_clone *, int *);
+int gif_clone_create (struct if_clone *, int);
void gif_clone_destroy (struct ifnet *);
-struct if_clone gif_cloner =
- IF_CLONE_INITIALIZER("gif", gif_clone_create, gif_clone_destroy);
+struct if_clone gif_cloner = IF_CLONE_INITIALIZER("gif", gif_clone_create,
+ gif_clone_destroy, 0, IF_MAXUNIT);
static int gifmodevent (module_t, int, void *);
@@ -133,34 +129,16 @@
int
gif_clone_create(ifc, unit)
struct if_clone *ifc;
- int *unit;
+ int unit;
{
- struct resource *r;
struct gif_softc *sc;
-
- if (*unit > GIF_MAXUNIT)
- return (ENXIO);
-
- if (*unit < 0) {
- r = rman_reserve_resource(gifunits, 0, GIF_MAXUNIT, 1,
- RF_ALLOCATED | RF_ACTIVE, NULL);
- if (r == NULL)
- return (ENOSPC);
- *unit = rman_get_start(r);
- } else {
- r = rman_reserve_resource(gifunits, *unit, *unit, 1,
- RF_ALLOCATED | RF_ACTIVE, NULL);
- if (r == NULL)
- return (EEXIST);
- }
sc = malloc (sizeof(struct gif_softc), M_GIF, M_WAITOK);
bzero(sc, sizeof(struct gif_softc));
sc->gif_if.if_softc = sc;
sc->gif_if.if_name = GIFNAME;
- sc->gif_if.if_unit = *unit;
- sc->r_unit = r;
+ sc->gif_if.if_unit = unit;
gifattach0(sc);
@@ -215,9 +193,6 @@
bpfdetach(ifp);
if_detach(ifp);
- err = rman_release_resource(sc->r_unit);
- KASSERT(err == 0, ("Unexpected error freeing resource"));
-
free(sc, M_GIF);
}
@@ -227,22 +202,9 @@
int type;
void *data;
{
- int err;
switch (type) {
case MOD_LOAD:
- gifunits->rm_type = RMAN_ARRAY;
- gifunits->rm_descr = "configurable if_gif units";
- err = rman_init(gifunits);
- if (err != 0)
- return (err);
- err = rman_manage_region(gifunits, 0, GIF_MAXUNIT);
- if (err != 0) {
- printf("%s: gifunits: rman_manage_region: Failed %d\n",
- GIFNAME, err);
- rman_fini(gifunits);
- return (err);
- }
LIST_INIT(&gif_softc_list);
if_clone_attach(&gif_cloner);
@@ -257,9 +219,6 @@
while (!LIST_EMPTY(&gif_softc_list))
gif_clone_destroy(&LIST_FIRST(&gif_softc_list)->gif_if);
- err = rman_fini(gifunits);
- if (err != 0)
- return (err);
#ifdef INET6
ip6_gif_hlim = 0;
#endif
Index: net/gre/if_gre.c
===================================================================
RCS file: /root/.dfcvs/src/sys/net/gre/if_gre.c,v
retrieving revision 1.5
diff -u -r1.5 if_gre.c
--- net/gre/if_gre.c 7 Aug 2003 21:17:24 -0000 1.5
+++ net/gre/if_gre.c 19 Dec 2003 17:18:20 -0000
@@ -58,7 +58,6 @@
#include <sys/proc.h>
#include <sys/protosw.h>
#include <machine/bus.h>
-#include <sys/rman.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <sys/sysctl.h>
@@ -94,21 +93,19 @@
#define GREMTU 1476
#define GRENAME "gre"
-#define GRE_MAXUNIT 0x7fff
static MALLOC_DEFINE(M_GRE, GRENAME, "Generic Routing Encapsulation");
-static struct rman greunits[1];
struct gre_softc_head gre_softc_list;
-static int gre_clone_create(struct if_clone *, int *);
+static int gre_clone_create(struct if_clone *, int);
static void gre_clone_destroy(struct ifnet *);
static int gre_ioctl(struct ifnet *, u_long, caddr_t);
static int gre_output(struct ifnet *, struct mbuf *, struct sockaddr *,
struct rtentry *rt);
-static struct if_clone gre_cloner =
- IF_CLONE_INITIALIZER("gre", gre_clone_create, gre_clone_destroy);
+static struct if_clone gre_cloner = IF_CLONE_INITIALIZER("gre",
+ gre_clone_create, gre_clone_destroy, 0, IF_MAXUNIT);
static int gre_compute_route(struct gre_softc *sc);
@@ -162,33 +159,16 @@
static int
gre_clone_create(ifc, unit)
struct if_clone *ifc;
- int *unit;
+ int unit;
{
- struct resource *r;
struct gre_softc *sc;
- if (*unit > GRE_MAXUNIT)
- return (ENXIO);
-
- if (*unit < 0) {
- r = rman_reserve_resource(greunits, 0, GRE_MAXUNIT, 1,
- RF_ALLOCATED | RF_ACTIVE, NULL);
- if (r == NULL)
- return (ENOSPC);
- *unit = rman_get_start(r);
- } else {
- r = rman_reserve_resource(greunits, *unit, *unit, 1,
- RF_ALLOCATED | RF_ACTIVE, NULL);
- if (r == NULL)
- return (EEXIST);
- }
-
sc = malloc(sizeof(struct gre_softc), M_GRE, M_WAITOK);
memset(sc, 0, sizeof(struct gre_softc));
sc->sc_if.if_name = GRENAME;
sc->sc_if.if_softc = sc;
- sc->sc_if.if_unit = *unit;
+ sc->sc_if.if_unit = unit;
sc->sc_if.if_snd.ifq_maxlen = IFQ_MAXLEN;
sc->sc_if.if_type = IFT_OTHER;
sc->sc_if.if_addrlen = 0;
@@ -202,7 +182,6 @@
sc->sc_if.if_flags |= IFF_LINK0;
sc->encap = NULL;
sc->called = 0;
- sc->r_unit = r;
if_attach(&sc->sc_if);
bpfattach(&sc->sc_if, DLT_NULL, sizeof(u_int32_t));
LIST_INSERT_HEAD(&gre_softc_list, sc, sc_list);
@@ -213,7 +192,6 @@
gre_clone_destroy(ifp)
struct ifnet *ifp;
{
- int err;
struct gre_softc *sc = ifp->if_softc;
#ifdef INET
@@ -224,9 +202,6 @@
bpfdetach(ifp);
if_detach(ifp);
- err = rman_release_resource(sc->r_unit);
- KASSERT(err == 0, ("Unexpected error freeing resource"));
-
free(sc, M_GRE);
}
@@ -761,22 +736,9 @@
static int
gremodevent(module_t mod, int type, void *data)
{
- int err;
switch (type) {
case MOD_LOAD:
- greunits->rm_type = RMAN_ARRAY;
- greunits->rm_descr = "configurable if_gre units";
- err = rman_init(greunits);
- if (err != 0)
- return (err);
- err = rman_manage_region(greunits, 0, GRE_MAXUNIT);
- if (err != 0) {
- printf("%s: greunits: rman_manage_region: Failed %d\n",
- GRENAME, err);
- rman_fini(greunits);
- return (err);
- }
greattach();
break;
case MOD_UNLOAD:
@@ -784,10 +746,6 @@
while (!LIST_EMPTY(&gre_softc_list))
gre_clone_destroy(&LIST_FIRST(&gre_softc_list)->sc_if);
-
- err = rman_fini(greunits);
- if (err != 0)
- return (err);
break;
}
Index: net/vlan/if_vlan.c
===================================================================
RCS file: /root/.dfcvs/src/sys/net/vlan/if_vlan.c,v
retrieving revision 1.4
diff -u -r1.4 if_vlan.c
--- net/vlan/if_vlan.c 7 Aug 2003 21:17:30 -0000 1.4
+++ net/vlan/if_vlan.c 19 Dec 2003 16:30:01 -0000
@@ -71,7 +71,6 @@
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <machine/bus.h> /* XXX: Shouldn't really be required! */
-#include <sys/rman.h>
#include <net/bpf.h>
#include <net/ethernet.h>
@@ -87,17 +86,15 @@
#endif
#define VLANNAME "vlan"
-#define VLAN_MAXUNIT 0x7fff /* ifp->if_unit is only 15 bits */
SYSCTL_DECL(_net_link);
SYSCTL_NODE(_net_link, IFT_L2VLAN, vlan, CTLFLAG_RW, 0, "IEEE 802.1Q VLAN");
SYSCTL_NODE(_net_link_vlan, PF_LINK, link, CTLFLAG_RW, 0, "for consistency");
static MALLOC_DEFINE(M_VLAN, "vlan", "802.1Q Virtual LAN Interface");
-static struct rman vlanunits[1];
static LIST_HEAD(, ifvlan) ifv_list;
-static int vlan_clone_create(struct if_clone *, int *);
+static int vlan_clone_create(struct if_clone *, int);
static void vlan_clone_destroy(struct ifnet *);
static void vlan_start(struct ifnet *ifp);
static void vlan_ifinit(void *foo);
@@ -109,8 +106,8 @@
static int vlan_unconfig(struct ifnet *ifp);
static int vlan_config(struct ifvlan *ifv, struct ifnet *p);
-struct if_clone vlan_cloner =
- IF_CLONE_INITIALIZER("vlan", vlan_clone_create, vlan_clone_destroy);
+struct if_clone vlan_cloner = IF_CLONE_INITIALIZER("vlan", vlan_clone_create,
+ vlan_clone_destroy, NVLAN, IF_MAXUNIT);
/*
* Program our multicast filter. What we're actually doing is
@@ -180,32 +177,13 @@
static int
vlan_modevent(module_t mod, int type, void *data)
{
- int i;
- int err;
switch (type) {
case MOD_LOAD:
- vlanunits->rm_type = RMAN_ARRAY;
- vlanunits->rm_descr = "configurable if_vlan units";
- err = rman_init(vlanunits);
- if (err != 0)
- return (err);
- err = rman_manage_region(vlanunits, 0, VLAN_MAXUNIT);
- if (err != 0) {
- printf("%s: vlanunits: rman_manage_region: Failed %d\n",
- VLANNAME, err);
- rman_fini(vlanunits);
- return (err);
- }
LIST_INIT(&ifv_list);
vlan_input_p = vlan_input;
vlan_input_tag_p = vlan_input_tag;
if_clone_attach(&vlan_cloner);
- for(i = 0; i < NVLAN; i ++) {
- err = vlan_clone_create(&vlan_cloner, &i);
- KASSERT(err == 0,
- ("Unexpected error creating initial VLANs"));
- }
break;
case MOD_UNLOAD:
if_clone_detach(&vlan_cloner);
@@ -213,9 +191,6 @@
vlan_input_tag_p = NULL;
while (!LIST_EMPTY(&ifv_list))
vlan_clone_destroy(&LIST_FIRST(&ifv_list)->ifv_if);
- err = rman_fini(vlanunits);
- if (err != 0)
- return (err);
break;
}
return 0;
@@ -230,29 +205,12 @@
DECLARE_MODULE(if_vlan, vlan_mod, SI_SUB_PSEUDO, SI_ORDER_ANY);
static int
-vlan_clone_create(struct if_clone *ifc, int *unit)
+vlan_clone_create(struct if_clone *ifc, int unit)
{
- struct resource *r;
struct ifvlan *ifv;
struct ifnet *ifp;
int s;
- if (*unit > VLAN_MAXUNIT)
- return (ENXIO);
-
- if (*unit < 0) {
- r = rman_reserve_resource(vlanunits, 0, VLAN_MAXUNIT, 1,
- RF_ALLOCATED | RF_ACTIVE, NULL);
- if (r == NULL)
- return (ENOSPC);
- *unit = rman_get_start(r);
- } else {
- r = rman_reserve_resource(vlanunits, *unit, *unit, 1,
- RF_ALLOCATED | RF_ACTIVE, NULL);
- if (r == NULL)
- return (EEXIST);
- }
-
ifv = malloc(sizeof(struct ifvlan), M_VLAN, M_WAITOK);
memset(ifv, 0, sizeof(struct ifvlan));
ifp = &ifv->ifv_if;
@@ -264,8 +222,7 @@
ifp->if_softc = ifv;
ifp->if_name = "vlan";
- ifp->if_unit = *unit;
- ifv->r_unit = r;
+ ifp->if_unit = unit;
/* NB: flags are not set here */
ifp->if_linkmib = &ifv->ifv_mib;
ifp->if_linkmiblen = sizeof ifv->ifv_mib;
@@ -289,7 +246,6 @@
{
struct ifvlan *ifv = ifp->if_softc;
int s;
- int err;
s = splnet();
LIST_REMOVE(ifv, ifv_list);
@@ -298,8 +254,6 @@
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
- err = rman_release_resource(ifv->r_unit);
- KASSERT(err == 0, ("Unexpected error freeing resource"));
free(ifv, M_VLAN);
}
More information about the Submit
mailing list