diff options
| author | 2003-12-03 14:51:05 +0000 | |
|---|---|---|
| committer | 2003-12-03 14:51:05 +0000 | |
| commit | fb1d047f56a02087a80ea0555c11fdd4ec93939b (patch) | |
| tree | 6cd7dc5fe95a0bc8169ddd9d8424e5ebda5f2612 /sys/net/if_loop.c | |
| parent | .Xr myname(5) in SEE ALSO; suggested by Michael W. Burden; (diff) | |
| download | wireguard-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.c | 80 |
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 |
