These chunks depend on the if_attach() bits I sent in the previous
email. As soon as if_attach() always raise the ipl level to IPL_SOFTNET
pfi_attach_ifnet() doesn't need to do it.
The rest is already safe since hooks are already called at IPL_SOFTNET.
ok?
Index: net/pf_if.c
===================================================================
RCS file: /cvs/src/sys/net/pf_if.c,v
retrieving revision 1.87
diff -u -p -r1.87 pf_if.c
--- net/pf_if.c 16 Nov 2016 08:46:05 -0000 1.87
+++ net/pf_if.c 28 Nov 2016 14:16:03 -0000
@@ -223,10 +223,8 @@ void
pfi_attach_ifnet(struct ifnet *ifp)
{
struct pfi_kif *kif;
- int s;
pfi_initialize();
- s = splsoftnet();
pfi_update++;
if ((kif = pfi_kif_get(ifp->if_xname)) == NULL)
panic("pfi_kif_get failed");
@@ -240,20 +238,16 @@ pfi_attach_ifnet(struct ifnet *ifp)
ifp->if_xname);
pfi_kif_update(kif);
-
- splx(s);
}
void
pfi_detach_ifnet(struct ifnet *ifp)
{
- int s;
struct pfi_kif *kif;
if ((kif = (struct pfi_kif *)ifp->if_pf_kif) == NULL)
return;
- s = splsoftnet();
pfi_update++;
hook_disestablish(ifp->if_addrhooks, kif->pfik_ah_cookie);
pfi_kif_update(kif);
@@ -261,60 +255,47 @@ pfi_detach_ifnet(struct ifnet *ifp)
kif->pfik_ifp = NULL;
ifp->if_pf_kif = NULL;
pfi_kif_unref(kif, PFI_KIF_REF_NONE);
-
- splx(s);
}
void
pfi_attach_ifgroup(struct ifg_group *ifg)
{
struct pfi_kif *kif;
- int s;
pfi_initialize();
- s = splsoftnet();
pfi_update++;
if ((kif = pfi_kif_get(ifg->ifg_group)) == NULL)
panic("pfi_kif_get failed");
kif->pfik_group = ifg;
ifg->ifg_pf_kif = (caddr_t)kif;
-
- splx(s);
}
void
pfi_detach_ifgroup(struct ifg_group *ifg)
{
- int s;
struct pfi_kif *kif;
if ((kif = (struct pfi_kif *)ifg->ifg_pf_kif) == NULL)
return;
- s = splsoftnet();
pfi_update++;
kif->pfik_group = NULL;
ifg->ifg_pf_kif = NULL;
pfi_kif_unref(kif, PFI_KIF_REF_NONE);
- splx(s);
}
void
pfi_group_change(const char *group)
{
struct pfi_kif *kif;
- int s;
- s = splsoftnet();
pfi_update++;
if ((kif = pfi_kif_get(group)) == NULL)
panic("pfi_kif_get failed");
pfi_kif_update(kif);
-
- splx(s);
}
int
@@ -611,13 +592,12 @@ pfi_dynaddr_copyout(struct pf_addr_wrap
void
pfi_kifaddr_update(void *v)
{
- int s;
struct pfi_kif *kif = (struct pfi_kif *)v;
- s = splsoftnet();
+ splsoftassert(IPL_SOFTNET);
+
pfi_update++;
pfi_kif_update(kif);
- splx(s);
}
int