Index: sys/netgraph/ng_iface.c =================================================================== --- sys/netgraph/ng_iface.c (revision 342241) +++ sys/netgraph/ng_iface.c (working copy) @@ -745,17 +745,28 @@ ng_iface_shutdown(node_p node) { const priv_p priv = NG_NODE_PRIVATE(node); + struct ifnet *ifp; + PRIV_WLOCK(priv); + KASSERT(priv->ifp != NULL, + ("%s: node %p: priv->ifp == NULL", __func__, node)); + + ifp = priv->ifp; + priv->ifp = NULL; + PRIV_WUNLOCK(priv); + + if (ifp == NULL) + return (0); + /* * The ifnet may be in a different vnet than the netgraph node, * hence we have to change the current vnet context here. */ - CURVNET_SET_QUIET(priv->ifp->if_vnet); - bpfdetach(priv->ifp); - if_detach(priv->ifp); - if_free(priv->ifp); + CURVNET_SET_QUIET(ifp->if_vnet); + bpfdetach(ifp); + if_detach(ifp); + if_free(ifp); CURVNET_RESTORE(); - priv->ifp = NULL; free_unr(V_ng_iface_unit, priv->unit); rm_destroy(&priv->lock); free(priv, M_NETGRAPH_IFACE);