diff options
author | Claudio Jeker <claudio@cvs.openbsd.org> | 2018-02-10 05:32:22 +0000 |
---|---|---|
committer | Claudio Jeker <claudio@cvs.openbsd.org> | 2018-02-10 05:32:22 +0000 |
commit | 0c481a317baf113a6f3bae040a90354a33527d2e (patch) | |
tree | c2231d6ef56a8ae84d3799e809dc4da08d31cca8 /sys/net | |
parent | 46a5fdccdbec824aec3e3e383277baed4c200dee (diff) |
Similar to the IPv6 case create 127.0.0.1/8 on lo(4) interfaces which act
as loopback interfaces for each rdomain (including lo0). This is done when
the interface is brought up. This is now also done by default (either on
attach of lo0 or when creating the rdomain).
OK mpi@
Diffstat (limited to 'sys/net')
-rw-r--r-- | sys/net/if.c | 7 | ||||
-rw-r--r-- | sys/net/if_loop.c | 15 |
2 files changed, 19 insertions, 3 deletions
diff --git a/sys/net/if.c b/sys/net/if.c index 1557cae6cca..e450decf5ed 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if.c,v 1.541 2018/02/09 09:35:03 dlg Exp $ */ +/* $OpenBSD: if.c,v 1.542 2018/02/10 05:32:21 claudio Exp $ */ /* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */ /* @@ -1550,8 +1550,10 @@ if_up(struct ifnet *ifp) #ifdef INET6 /* Userland expects the kernel to set ::1 on default lo(4). */ - if (ifp->if_index == rtable_loindex(ifp->if_rdomain)) + if (ifp->if_index == rtable_loindex(ifp->if_rdomain)) { in6_ifattach(ifp); + in_up_loopback(ifp); + } #endif if_linkstate(ifp); @@ -1744,6 +1746,7 @@ if_setrdomain(struct ifnet *ifp, int rdomain) } loifp->if_rdomain = rdomain; + if_up(loifp); } /* make sure that the routing table is a real rdomain */ diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c index 5ff594ef091..9cc46c6b700 100644 --- a/sys/net/if_loop.c +++ b/sys/net/if_loop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_loop.c,v 1.85 2018/01/09 15:24:24 bluhm Exp $ */ +/* $OpenBSD: if_loop.c,v 1.86 2018/02/10 05:32:21 claudio Exp $ */ /* $NetBSD: if_loop.c,v 1.15 1996/05/07 02:40:33 thorpej Exp $ */ /* @@ -142,6 +142,7 @@ int loioctl(struct ifnet *, u_long, caddr_t); void loopattach(int); +void loop_delayed_create(void *); void lortrequest(struct ifnet *, int, struct rtentry *); int loinput(struct ifnet *, struct mbuf *, void *); int looutput(struct ifnet *, @@ -162,9 +163,19 @@ loopattach(int n) if_clone_attach(&loop_cloner); } +void +loop_delayed_create(void *arg) +{ + struct ifnet *ifp = arg; + NET_LOCK(); + if_up(ifp); + NET_UNLOCK(); +} + int loop_clone_create(struct if_clone *ifc, int unit) { + static struct task lot; struct ifnet *ifp; ifp = malloc(sizeof(*ifp), M_DEVBUF, M_WAITOK|M_ZERO); @@ -182,6 +193,8 @@ loop_clone_create(struct if_clone *ifc, int unit) if_attachhead(ifp); if_addgroup(ifp, ifc->ifc_name); rtable_l2set(0, 0, ifp->if_index); + task_set(&lot, loop_delayed_create, ifp); + task_add(systq, &lot); } else if_attach(ifp); if_alloc_sadl(ifp); |