umb(4) also calls in_ioctl() directly but always under splnet(), so for
the moment this is good enough.
ok?
Index: netinet/igmp.c
===================================================================
RCS file: /cvs/src/sys/netinet/igmp.c,v
retrieving revision 1.55
diff -u -p -r1.55 igmp.c
--- netinet/igmp.c 28 Nov 2016 11:12:45 -0000 1.55
+++ netinet/igmp.c 28 Nov 2016 14:03:30 -0000
@@ -498,10 +498,9 @@ void
igmp_joingroup(struct in_multi *inm)
{
struct ifnet* ifp;
- int i, s;
+ int i;
ifp = if_get(inm->inm_ifidx);
- s = splsoftnet();
inm->inm_state = IGMP_IDLE_MEMBER;
@@ -519,7 +518,6 @@ igmp_joingroup(struct in_multi *inm)
inm->inm_timer = 0;
out:
- splx(s);
if_put(ifp);
}
@@ -527,10 +525,8 @@ void
igmp_leavegroup(struct in_multi *inm)
{
struct ifnet* ifp;
- int s;
ifp = if_get(inm->inm_ifidx);
- s = splsoftnet();
switch (inm->inm_state) {
case IGMP_DELAYING_MEMBER:
@@ -546,7 +542,6 @@ igmp_leavegroup(struct in_multi *inm)
case IGMP_SLEEPING_MEMBER:
break;
}
- splx(s);
if_put(ifp);
}
Index: netinet/in.c
===================================================================
RCS file: /cvs/src/sys/netinet/in.c,v
retrieving revision 1.129
diff -u -p -r1.129 in.c
--- netinet/in.c 4 Sep 2016 10:32:01 -0000 1.129
+++ netinet/in.c 28 Nov 2016 14:03:33 -0000
@@ -212,6 +212,8 @@ in_ioctl(u_long cmd, caddr_t data, struc
int newifaddr;
int s;
+ splsoftassert(IPL_SOFTNET);
+
TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
if (ifa->ifa_addr->sa_family == AF_INET) {
ia = ifatoia(ifa);
@@ -329,12 +331,10 @@ in_ioctl(u_long cmd, caddr_t data, struc
break;
case SIOCSIFADDR:
- s = splsoftnet();
in_ifscrub(ifp, ia);
error = in_ifinit(ifp, ia, satosin(&ifr->ifr_addr), newifaddr);
if (!error)
dohooks(ifp->if_addrhooks, 0);
- splx(s);
return (error);
case SIOCSIFNETMASK:
@@ -347,7 +347,6 @@ in_ioctl(u_long cmd, caddr_t data, struc
error = 0;
- s = splsoftnet();
if (ia->ia_addr.sin_family == AF_INET) {
if (ifra->ifra_addr.sin_len == 0)
ifra->ifra_addr = ia->ia_addr;
@@ -380,7 +379,6 @@ in_ioctl(u_long cmd, caddr_t data, struc
}
if (!error)
dohooks(ifp->if_addrhooks, 0);
- splx(s);
return (error);
}
case SIOCDIFADDR:
@@ -390,10 +388,8 @@ in_ioctl(u_long cmd, caddr_t data, struc
* should happen to a packet that was routed after
* the scrub but before the other steps?
*/
- s = splsoftnet();
in_purgeaddr(&ia->ia_ifa);
dohooks(ifp->if_addrhooks, 0);
- splx(s);
break;
default:
@@ -798,7 +794,8 @@ in_addmulti(struct in_addr *ap, struct i
{
struct in_multi *inm;
struct ifreq ifr;
- int s;
+
+ splsoftassert(IPL_SOFTNET);
/*
* See if address already in list.
@@ -839,10 +836,8 @@ in_addmulti(struct in_addr *ap, struct i
return (NULL);
}
- s = splsoftnet();
TAILQ_INSERT_HEAD(&ifp->if_maddrlist, &inm->inm_ifma,
ifma_list);
- splx(s);
/*
* Let IGMP know that we have joined a new IP multicast group.
@@ -861,7 +856,8 @@ in_delmulti(struct in_multi *inm)
{
struct ifreq ifr;
struct ifnet *ifp;
- int s;
+
+ splsoftassert(IPL_SOFTNET);
if (--inm->inm_refcnt == 0) {
/*
@@ -883,10 +879,8 @@ in_delmulti(struct in_multi *inm)
satosin(&ifr.ifr_addr)->sin_addr = inm->inm_addr;
(*ifp->if_ioctl)(ifp, SIOCDELMULTI, (caddr_t)&ifr);
- s = splsoftnet();
TAILQ_REMOVE(&ifp->if_maddrlist, &inm->inm_ifma,
ifma_list);
- splx(s);
}
if_put(ifp);