diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netinet6/nd6.c | 28 | ||||
-rw-r--r-- | sys/netinet6/nd6_nbr.c | 13 | ||||
-rw-r--r-- | sys/netinet6/nd6_rtr.c | 44 |
3 files changed, 40 insertions, 45 deletions
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index cf59c02f31e..f8135150e42 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nd6.c,v 1.199 2016/12/20 18:33:43 bluhm Exp $ */ +/* $OpenBSD: nd6.c,v 1.200 2016/12/22 13:39:32 mpi Exp $ */ /* $KAME: nd6.c,v 1.280 2002/06/08 19:52:07 itojun Exp $ */ /* @@ -127,7 +127,7 @@ nd6_init(void) nd6_init_done = 1; /* start timer */ - timeout_set(&nd6_slowtimo_ch, nd6_slowtimo, NULL); + timeout_set_proc(&nd6_slowtimo_ch, nd6_slowtimo, NULL); timeout_add_sec(&nd6_slowtimo_ch, ND6_SLOWTIMER_INTERVAL); nd6_rs_init(); @@ -430,12 +430,13 @@ nd6_llinfo_timer(void *arg) void nd6_timer_work(void *null) { - int s; struct nd_defrouter *dr, *ndr; struct nd_prefix *pr, *npr; struct in6_ifaddr *ia6, *nia6; + int s; + + NET_LOCK(s); - s = splsoftnet(); timeout_set(&nd6_timer_ch, nd6_timer, NULL); timeout_add_sec(&nd6_timer_ch, nd6_prune); @@ -482,7 +483,7 @@ nd6_timer_work(void *null) prelist_remove(pr); } } - splx(s); + NET_UNLOCK(s); } void @@ -1120,7 +1121,8 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) struct in6_nbrinfo *nbi = (struct in6_nbrinfo *)data; struct rtentry *rt; int error = 0; - int s; + + splsoftassert(IPL_SOFTNET); switch (cmd) { case SIOCGIFINFO_IN6: @@ -1142,7 +1144,6 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) /* flush all the prefix advertised by routers */ struct nd_prefix *pr, *npr; - s = splsoftnet(); /* First purge the addresses referenced by a prefix. */ LIST_FOREACH_SAFE(pr, &nd_prefix, ndpr_entry, npr) { struct in6_ifaddr *ia6, *ia6_next; @@ -1170,7 +1171,6 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) prelist_remove(pr); } - splx(s); break; } case SIOCSRTRFLUSH_IN6: @@ -1178,12 +1178,10 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) /* flush all the default routers */ struct nd_defrouter *dr, *ndr; - s = splsoftnet(); defrouter_reset(); TAILQ_FOREACH_SAFE(dr, &nd_defrouter, dr_entry, ndr) defrtrlist_del(dr); defrouter_select(); - splx(s); break; } case SIOCGNBRINFO_IN6: @@ -1204,13 +1202,11 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) *idp = htons(ifp->if_index); } - s = splsoftnet(); rt = nd6_lookup(&nb_addr, 0, ifp, ifp->if_rdomain); if (rt == NULL || (ln = (struct llinfo_nd6 *)rt->rt_llinfo) == NULL) { error = EINVAL; rtfree(rt); - splx(s); break; } expire = ln->ln_rt->rt_expire; @@ -1224,7 +1220,6 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) nbi->isrouter = ln->ln_router; nbi->expire = expire; rtfree(rt); - splx(s); break; } @@ -1478,12 +1473,15 @@ fail: void nd6_slowtimo(void *ignored_arg) { - int s = splsoftnet(); struct nd_ifinfo *nd6if; struct ifnet *ifp; + int s; + + NET_LOCK(s); timeout_set(&nd6_slowtimo_ch, nd6_slowtimo, NULL); timeout_add_sec(&nd6_slowtimo_ch, ND6_SLOWTIMER_INTERVAL); + TAILQ_FOREACH(ifp, &ifnet, if_list) { nd6if = ND_IFINFO(ifp); if (nd6if->basereachable && /* already initialized */ @@ -1498,7 +1496,7 @@ nd6_slowtimo(void *ignored_arg) nd6if->reachable = ND_COMPUTE_RTIME(nd6if->basereachable); } } - splx(s); + NET_UNLOCK(s); } int diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c index 5380475e141..b0d1793b3fa 100644 --- a/sys/netinet6/nd6_nbr.c +++ b/sys/netinet6/nd6_nbr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nd6_nbr.c,v 1.112 2016/12/21 12:30:19 mpi Exp $ */ +/* $OpenBSD: nd6_nbr.c,v 1.113 2016/12/22 13:39:32 mpi Exp $ */ /* $KAME: nd6_nbr.c,v 1.61 2001/02/10 16:06:14 jinmei Exp $ */ /* @@ -572,6 +572,8 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len) union nd_opts ndopts; char addr[INET6_ADDRSTRLEN], addr0[INET6_ADDRSTRLEN]; + splsoftassert(IPL_SOFTNET); + ifp = if_get(m->m_pkthdr.ph_ifidx); if (ifp == NULL) goto freeit; @@ -825,7 +827,6 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len) */ struct nd_defrouter *dr; struct in6_addr *in6; - int s; in6 = &satosin6(rt_key(rt))->sin6_addr; @@ -835,7 +836,6 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len) * is only called under the network software interrupt * context. However, we keep it just for safety. */ - s = splsoftnet(); dr = defrouter_lookup(in6, rt->rt_ifidx); if (dr) defrtrlist_del(dr); @@ -849,7 +849,6 @@ nd6_na_input(struct mbuf *m, int off, int icmp6len) */ rt6_flush(&ip6->ip6_src, ifp); } - splx(s); } ln->ln_router = is_router; } @@ -1080,7 +1079,7 @@ void nd6_dad_starttimer(struct dadq *dp, int ticks) { - timeout_set(&dp->dad_timer_ch, nd6_dad_timer, dp->dad_ifa); + timeout_set_proc(&dp->dad_timer_ch, nd6_dad_timer, dp->dad_ifa); timeout_add(&dp->dad_timer_ch, ticks); } @@ -1190,7 +1189,7 @@ nd6_dad_timer(void *xifa) char addr[INET6_ADDRSTRLEN]; int s; - s = splsoftnet(); /* XXX */ + NET_LOCK(s); /* Sanity check */ if (ia6 == NULL) { @@ -1281,7 +1280,7 @@ nd6_dad_timer(void *xifa) } done: - splx(s); + NET_UNLOCK(s); } void diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c index 78e070b2499..4885c37cdb9 100644 --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nd6_rtr.c,v 1.153 2016/11/28 14:14:39 mpi Exp $ */ +/* $OpenBSD: nd6_rtr.c,v 1.154 2016/12/22 13:39:32 mpi Exp $ */ /* $KAME: nd6_rtr.c,v 1.97 2001/02/07 11:09:13 itojun Exp $ */ /* @@ -94,7 +94,7 @@ int nd6_rs_timeout_count = 0; void nd6_rs_init(void) { - timeout_set(&nd6_rs_output_timer, nd6_rs_output_timo, NULL); + timeout_set_proc(&nd6_rs_output_timer, nd6_rs_output_timo, NULL); } @@ -202,7 +202,9 @@ nd6_rs_output(struct ifnet* ifp, struct in6_ifaddr *ia6) struct nd_router_solicit *rs; struct ip6_moptions im6o; caddr_t mac; - int icmp6len, maxlen, s; + int icmp6len, maxlen; + + splsoftassert(IPL_SOFTNET); KASSERT(ia6 != NULL); KASSERT(ifp->if_flags & IFF_RUNNING); @@ -272,9 +274,7 @@ nd6_rs_output(struct ifnet* ifp, struct in6_ifaddr *ia6) ip6->ip6_plen = htons((u_short)icmp6len); - s = splsoftnet(); ip6_output(m, NULL, NULL, 0, &im6o, NULL); - splx(s); icmp6stat.icp6s_outhist[ND_ROUTER_SOLICIT]++; } @@ -291,6 +291,7 @@ nd6_rs_output_timo(void *ignored_arg) { struct ifnet *ifp; struct in6_ifaddr *ia6; + int s; if (nd6_rs_timeout_count == 0) return; @@ -301,6 +302,7 @@ nd6_rs_output_timo(void *ignored_arg) if (nd6_rs_output_timeout > ND6_RS_OUTPUT_INTERVAL) nd6_rs_output_timeout = ND6_RS_OUTPUT_INTERVAL; + NET_LOCK(s); TAILQ_FOREACH(ifp, &ifnet, if_list) { if (ISSET(ifp->if_flags, IFF_RUNNING) && ISSET(ifp->if_xflags, IFXF_AUTOCONF6)) { @@ -309,6 +311,7 @@ nd6_rs_output_timo(void *ignored_arg) nd6_rs_output(ifp, ia6); } } + NET_UNLOCK(s); nd6_rs_output_set_timo(nd6_rs_output_timeout); } @@ -1104,8 +1107,10 @@ void prelist_remove(struct nd_prefix *pr) { struct nd_pfxrouter *pfr, *next; - int e, s; struct in6_ifextra *ext = pr->ndpr_ifp->if_afdata[AF_INET6]; + int e; + + splsoftassert(IPL_SOFTNET); /* make sure to invalidate the prefix until it is really freed. */ pr->ndpr_vltime = 0; @@ -1114,8 +1119,8 @@ prelist_remove(struct nd_prefix *pr) if ((pr->ndpr_stateflags & NDPRF_ONLINK) != 0 && (e = nd6_prefix_offlink(pr)) != 0) { char addr[INET6_ADDRSTRLEN]; - nd6log((LOG_ERR, "prelist_remove: failed to make %s/%d offlink " - "on %s, errno=%d\n", + nd6log((LOG_ERR, "%s: failed to make %s/%d offlink " + "on %s, errno=%d\n", __func__, inet_ntop(AF_INET6, &pr->ndpr_prefix.sin6_addr, addr, sizeof(addr)), pr->ndpr_plen, pr->ndpr_ifp->if_xname, e)); @@ -1125,8 +1130,6 @@ prelist_remove(struct nd_prefix *pr) if (pr->ndpr_refcnt > 0) return; /* notice here? */ - s = splsoftnet(); - /* unlink ndpr_entry from nd_prefix list */ LIST_REMOVE(pr, ndpr_entry); @@ -1136,14 +1139,13 @@ prelist_remove(struct nd_prefix *pr) ext->nprefixes--; if (ext->nprefixes < 0) { - log(LOG_WARNING, "prelist_remove: negative count on %s\n", + log(LOG_WARNING, "%s: negative count on %s\n", __func__, pr->ndpr_ifp->if_xname); } free(pr, M_IP6NDP, sizeof(*pr)); pfxlist_onlink_check(); - splx(s); } /* @@ -1406,7 +1408,7 @@ nd6_addr_add(void *prptr) struct ifaddr *ifa; int ifa_plen, autoconf, privacy, s; - s = splsoftnet(); + NET_LOCK(s); autoconf = 1; privacy = (pr->ndpr_ifp->if_xflags & IFXF_INET6_NOPRIVACY) == 0; @@ -1472,7 +1474,7 @@ nd6_addr_add(void *prptr) if (--pr->ndpr_refcnt == 0) prelist_remove(pr); - splx(s); + NET_UNLOCK(s); } /* @@ -1592,9 +1594,8 @@ pfxlist_onlink_check(void) if ((pr->ndpr_stateflags & NDPRF_DETACHED) != 0 && (pr->ndpr_stateflags & NDPRF_ONLINK) != 0) { if ((e = nd6_prefix_offlink(pr)) != 0) { - nd6log((LOG_ERR, - "pfxlist_onlink_check: failed to " - "make %s/%d offlink, errno=%d\n", + nd6log((LOG_ERR, "%s: failed to make %s/%d " + "offlink, errno=%d\n", __func__, inet_ntop(AF_INET6, &pr->ndpr_prefix.sin6_addr, addr, sizeof(addr)), @@ -1605,9 +1606,8 @@ pfxlist_onlink_check(void) (pr->ndpr_stateflags & NDPRF_ONLINK) == 0 && pr->ndpr_raf_onlink) { if ((e = nd6_prefix_onlink(pr)) != 0) { - nd6log((LOG_ERR, - "pfxlist_onlink_check: failed to " - "make %s/%d offlink, errno=%d\n", + nd6log((LOG_ERR, "%s: failed to make %s/%d " + "offlink, errno=%d\n", __func__, inet_ntop(AF_INET6, &pr->ndpr_prefix.sin6_addr, addr, sizeof(addr)), @@ -2000,7 +2000,7 @@ in6_init_address_ltimes(struct nd_prefix *new, struct in6_addrlifetime *lt6) void rt6_flush(struct in6_addr *gateway, struct ifnet *ifp) { - int s; + splsoftassert(IPL_SOFTNET); /* We'll care only link-local addresses */ if (!IN6_IS_ADDR_LINKLOCAL(gateway)) @@ -2009,9 +2009,7 @@ rt6_flush(struct in6_addr *gateway, struct ifnet *ifp) /* XXX: hack for KAME's link-local address kludge */ gateway->s6_addr16[1] = htons(ifp->if_index); - s = splsoftnet(); rtable_walk(ifp->if_rdomain, AF_INET6, rt6_deleteroute, gateway); - splx(s); } int |