They all need to be audited and possibly changed to a solution that work
with the NET_LOCK(). Just saying,  enc(4) is a nightmare.

Here's a diff fro gre(4).  The 'softnet' iterates over ``gre_softc_list'' 
so we need to make sure it isn't modified when this happen.  We need the
NET_LOCK() were splnet() was used.

ok?

Index: net/if_gre.c
===================================================================
RCS file: /cvs/src/sys/net/if_gre.c,v
retrieving revision 1.84
diff -u -p -r1.84 if_gre.c
--- net/if_gre.c        24 Jan 2017 10:08:30 -0000      1.84
+++ net/if_gre.c        15 May 2017 12:45:25 -0000
@@ -165,9 +165,9 @@ gre_clone_create(struct if_clone *ifc, i
 #if NBPFILTER > 0
        bpfattach(&sc->sc_if.if_bpf, &sc->sc_if, DLT_LOOP, sizeof(u_int32_t));
 #endif
-       s = splnet();
+       NET_LOCK(s);
        LIST_INSERT_HEAD(&gre_softc_list, sc, sc_list);
-       splx(s);
+       NET_UNLOCK(s);
 
        return (0);
 }
@@ -178,11 +178,11 @@ gre_clone_destroy(struct ifnet *ifp)
        struct gre_softc *sc = ifp->if_softc;
        int s;
 
-       s = splnet();
        timeout_del(&sc->sc_ka_snd);
        timeout_del(&sc->sc_ka_hold);
+       NET_LOCK(s);
        LIST_REMOVE(sc, sc_list);
-       splx(s);
+       NET_UNLOCK(s);
 
        if_detach(ifp);
 

Reply via email to