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);