summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/netpfil/pf/pf_if.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/netpfil/pf/pf_if.c')
-rw-r--r--freebsd/sys/netpfil/pf/pf_if.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/freebsd/sys/netpfil/pf/pf_if.c b/freebsd/sys/netpfil/pf/pf_if.c
index 2c321118..ed69acad 100644
--- a/freebsd/sys/netpfil/pf/pf_if.c
+++ b/freebsd/sys/netpfil/pf/pf_if.c
@@ -167,8 +167,10 @@ pfi_cleanup_vnet(void)
RB_REMOVE(pfi_ifhead, &V_pfi_ifs, kif);
if (kif->pfik_group)
kif->pfik_group->ifg_pf_kif = NULL;
- if (kif->pfik_ifp)
+ if (kif->pfik_ifp) {
+ if_rele(kif->pfik_ifp);
kif->pfik_ifp->if_pf_kif = NULL;
+ }
free(kif, PFI_MTYPE);
}
@@ -324,6 +326,8 @@ pfi_attach_ifnet(struct ifnet *ifp)
V_pfi_update++;
kif = pfi_kif_attach(kif, ifp->if_xname);
+ if_ref(ifp);
+
kif->pfik_ifp = ifp;
ifp->if_pf_kif = kif;
@@ -555,7 +559,8 @@ pfi_instance_add(struct ifnet *ifp, int net, int flags)
if ((flags & PFI_AFLAG_PEER) &&
!(ifp->if_flags & IFF_POINTOPOINT))
continue;
- if ((flags & PFI_AFLAG_NETWORK) && af == AF_INET6 &&
+ if ((flags & (PFI_AFLAG_NETWORK | PFI_AFLAG_NOALIAS)) &&
+ af == AF_INET6 &&
IN6_IS_ADDR_LINKLOCAL(
&((struct sockaddr_in6 *)ia->ifa_addr)->sin6_addr))
continue;
@@ -835,6 +840,9 @@ pfi_detach_ifnet_event(void *arg __unused, struct ifnet *ifp)
{
struct pfi_kif *kif = (struct pfi_kif *)ifp->if_pf_kif;
+ if (pfsync_detach_ifnet_ptr)
+ pfsync_detach_ifnet_ptr(ifp);
+
if (kif == NULL)
return;
@@ -842,10 +850,13 @@ pfi_detach_ifnet_event(void *arg __unused, struct ifnet *ifp)
/* Avoid teardown race in the least expensive way. */
return;
}
+
PF_RULES_WLOCK();
V_pfi_update++;
pfi_kif_update(kif);
+ if_rele(kif->pfik_ifp);
+
kif->pfik_ifp = NULL;
ifp->if_pf_kif = NULL;
#ifdef ALTQ
@@ -906,6 +917,9 @@ pfi_detach_group_event(void *arg __unused, struct ifg_group *ifg)
static void
pfi_ifaddr_event(void *arg __unused, struct ifnet *ifp)
{
+
+ KASSERT(ifp, ("ifp == NULL"));
+
if (ifp->if_pf_kif == NULL)
return;
@@ -914,7 +928,7 @@ pfi_ifaddr_event(void *arg __unused, struct ifnet *ifp)
return;
}
PF_RULES_WLOCK();
- if (ifp && ifp->if_pf_kif) {
+ if (ifp->if_pf_kif) {
V_pfi_update++;
pfi_kif_update(ifp->if_pf_kif);
}