summaryrefslogtreecommitdiffstats
path: root/sys/net/if_loop.c
diff options
context:
space:
mode:
authormarkus <markus@openbsd.org>2003-12-03 14:51:05 +0000
committermarkus <markus@openbsd.org>2003-12-03 14:51:05 +0000
commitfb1d047f56a02087a80ea0555c11fdd4ec93939b (patch)
tree6cd7dc5fe95a0bc8169ddd9d8424e5ebda5f2612 /sys/net/if_loop.c
parent.Xr myname(5) in SEE ALSO; suggested by Michael W. Burden; (diff)
downloadwireguard-openbsd-fb1d047f56a02087a80ea0555c11fdd4ec93939b.tar.xz
wireguard-openbsd-fb1d047f56a02087a80ea0555c11fdd4ec93939b.zip
add support for ifconfig clone/destroy; ok henning deraadt
Diffstat (limited to 'sys/net/if_loop.c')
-rw-r--r--sys/net/if_loop.c80
1 files changed, 56 insertions, 24 deletions
diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c
index a4892bf624d..17b196c67aa 100644
--- a/sys/net/if_loop.c
+++ b/sys/net/if_loop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_loop.c,v 1.29 2003/06/02 23:28:12 millert Exp $ */
+/* $OpenBSD: if_loop.c,v 1.30 2003/12/03 14:53:04 markus Exp $ */
/* $NetBSD: if_loop.c,v 1.15 1996/05/07 02:40:33 thorpej Exp $ */
/*
@@ -173,39 +173,71 @@
static void lo_altqstart(struct ifnet *);
#endif
+int loop_clone_create(struct if_clone *, int);
+void loop_clone_destroy(struct ifnet *);
+
+struct if_clone loop_cloner =
+ IF_CLONE_INITIALIZER("lo", loop_clone_create, loop_clone_destroy);
+
+/* ARGSUSED */
void
loopattach(n)
int n;
{
- register int i;
- register struct ifnet *ifp;
+ (void) loop_clone_create(&loop_cloner, 0);
+ if_clone_attach(&loop_cloner);
+}
- for (i = n; i--; ) {
- MALLOC(ifp, struct ifnet *, sizeof(*ifp), M_DEVBUF, M_NOWAIT);
- if (ifp == NULL)
- return;
- bzero(ifp, sizeof(struct ifnet));
- if (i == 0)
- lo0ifp = ifp;
- snprintf(ifp->if_xname, sizeof ifp->if_xname, "lo%d", i);
- ifp->if_softc = NULL;
- ifp->if_mtu = LOMTU;
- ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
- ifp->if_ioctl = loioctl;
- ifp->if_output = looutput;
- ifp->if_type = IFT_LOOP;
- ifp->if_hdrlen = sizeof(u_int32_t);
- ifp->if_addrlen = 0;
- IFQ_SET_READY(&ifp->if_snd);
+int
+loop_clone_create(ifc, unit)
+ struct if_clone *ifc;
+ int unit;
+{
+ struct ifnet *ifp;
+
+ MALLOC(ifp, struct ifnet *, sizeof(*ifp), M_DEVBUF, M_NOWAIT);
+ if (ifp == NULL)
+ return (ENOMEM);
+ bzero(ifp, sizeof(struct ifnet));
+
+ snprintf(ifp->if_xname, sizeof ifp->if_xname, "lo%d", unit);
+ ifp->if_softc = NULL;
+ ifp->if_mtu = LOMTU;
+ ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
+ ifp->if_ioctl = loioctl;
+ ifp->if_output = looutput;
+ ifp->if_type = IFT_LOOP;
+ ifp->if_hdrlen = sizeof(u_int32_t);
+ ifp->if_addrlen = 0;
+ IFQ_SET_READY(&ifp->if_snd);
#ifdef ALTQ
- ifp->if_start = lo_altqstart;
+ ifp->if_start = lo_altqstart;
#endif
+ if (unit == 0) {
+ lo0ifp = ifp;
if_attachhead(ifp);
- if_alloc_sadl(ifp);
+ } else
+ if_attach(ifp);
+ if_alloc_sadl(ifp);
#if NBPFILTER > 0
- bpfattach(&ifp->if_bpf, ifp, DLT_LOOP, sizeof(u_int32_t));
+ bpfattach(&ifp->if_bpf, ifp, DLT_LOOP, sizeof(u_int32_t));
#endif
- }
+ return (0);
+}
+
+void
+loop_clone_destroy(ifp)
+ struct ifnet *ifp;
+{
+ if (ifp == lo0ifp)
+ return; /* XXX silently fail for lo0 */
+
+#if NBPFILTER > 0
+ bpfdetach(ifp);
+#endif
+ if_detach(ifp);
+
+ free(ifp, M_DEVBUF);
}
int