summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/contrib/pf/net/pf_if.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-11-06 16:20:21 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-11-11 10:08:08 +0100
commit66659ff1ad6831b0ea7425fa6ecd8a8687523658 (patch)
tree48e22b475fa8854128e0861a33fed6f78c8094b5 /freebsd/sys/contrib/pf/net/pf_if.c
parentDefine __GLOBL1() and __GLOBL() (diff)
downloadrtems-libbsd-66659ff1ad6831b0ea7425fa6ecd8a8687523658.tar.bz2
Update to FreeBSD 9.2
Diffstat (limited to 'freebsd/sys/contrib/pf/net/pf_if.c')
-rw-r--r--freebsd/sys/contrib/pf/net/pf_if.c308
1 files changed, 235 insertions, 73 deletions
diff --git a/freebsd/sys/contrib/pf/net/pf_if.c b/freebsd/sys/contrib/pf/net/pf_if.c
index 8ff3c614..3ac645f9 100644
--- a/freebsd/sys/contrib/pf/net/pf_if.c
+++ b/freebsd/sys/contrib/pf/net/pf_if.c
@@ -1,6 +1,6 @@
#include <machine/rtems-bsd-kernel-space.h>
-/* $OpenBSD: pf_if.c,v 1.46 2006/12/13 09:01:59 itojun Exp $ */
+/* $OpenBSD: pf_if.c,v 1.54 2008/06/14 16:55:28 mk Exp $ */
/*
* Copyright 2005 Henning Brauer <henning@openbsd.org>
@@ -56,6 +56,9 @@ __FBSDID("$FreeBSD$");
#include <sys/device.h>
#endif
#include <rtems/bsd/sys/time.h>
+#ifndef __FreeBSD__
+#include <sys/pool.h>
+#endif
#include <net/if.h>
#include <net/if_types.h>
@@ -75,25 +78,35 @@ __FBSDID("$FreeBSD$");
#include <netinet/ip6.h>
#endif /* INET6 */
-struct pfi_kif *pfi_all = NULL;
-struct pfi_statehead pfi_statehead;
#ifdef __FreeBSD__
-uma_zone_t pfi_addr_pl;
+VNET_DEFINE(struct pfi_kif *, pfi_all);
+VNET_DEFINE(uma_zone_t, pfi_addr_pl);
+VNET_DEFINE(struct pfi_ifhead, pfi_ifs);
+#define V_pfi_ifs VNET(pfi_ifs)
+VNET_DEFINE(long, pfi_update);
+#define V_pfi_update VNET(pfi_update)
+VNET_DEFINE(struct pfr_addr *, pfi_buffer);
+#define V_pfi_buffer VNET(pfi_buffer)
+VNET_DEFINE(int, pfi_buffer_cnt);
+#define V_pfi_buffer_cnt VNET(pfi_buffer_cnt)
+VNET_DEFINE(int, pfi_buffer_max);
+#define V_pfi_buffer_max VNET(pfi_buffer_max)
#else
+struct pfi_kif *pfi_all = NULL;
struct pool pfi_addr_pl;
-#endif
struct pfi_ifhead pfi_ifs;
long pfi_update = 1;
struct pfr_addr *pfi_buffer;
int pfi_buffer_cnt;
int pfi_buffer_max;
+#endif
#ifdef __FreeBSD__
-eventhandler_tag pfi_attach_cookie = NULL;
-eventhandler_tag pfi_detach_cookie = NULL;
-eventhandler_tag pfi_attach_group_cookie = NULL;
-eventhandler_tag pfi_change_group_cookie = NULL;
-eventhandler_tag pfi_detach_group_cookie = NULL;
-eventhandler_tag pfi_ifaddr_event_cookie = NULL;
+eventhandler_tag pfi_attach_cookie;
+eventhandler_tag pfi_detach_cookie;
+eventhandler_tag pfi_attach_group_cookie;
+eventhandler_tag pfi_change_group_cookie;
+eventhandler_tag pfi_detach_group_cookie;
+eventhandler_tag pfi_ifaddr_event_cookie;
#endif
void pfi_kif_update(struct pfi_kif *);
@@ -109,11 +122,10 @@ int pfi_unmask(void *);
#ifdef __FreeBSD__
void pfi_attach_ifnet_event(void * __unused, struct ifnet *);
void pfi_detach_ifnet_event(void * __unused, struct ifnet *);
-void pfi_attach_group_event(void * __unused, struct ifg_group *);
-void pfi_change_group_event(void * __unused, char *);
-void pfi_detach_group_event(void * __unused, struct ifg_group *);
+void pfi_attach_group_event(void *, struct ifg_group *);
+void pfi_change_group_event(void *, char *);
+void pfi_detach_group_event(void *, struct ifg_group *);
void pfi_ifaddr_event(void * __unused, struct ifnet *);
-
#endif
RB_PROTOTYPE(pfi_ifhead, pfi_kif, pfik_tree, pfi_if_compare);
@@ -125,22 +137,31 @@ RB_GENERATE(pfi_ifhead, pfi_kif, pfik_tree, pfi_if_compare);
void
pfi_initialize(void)
{
-
+#ifdef __FreeBSD__
+ if (V_pfi_all != NULL) /* already initialized */
+#else
if (pfi_all != NULL) /* already initialized */
+#endif
return;
- TAILQ_INIT(&pfi_statehead);
#ifndef __FreeBSD__
- pool_init(&pfi_addr_pl, sizeof(struct pfi_dynaddr), 0, 0, 0,
+ pool_init(&V_pfi_addr_pl, sizeof(struct pfi_dynaddr), 0, 0, 0,
"pfiaddrpl", &pool_allocator_nointr);
#endif
+#ifdef __FreeBSD__
+ V_pfi_buffer_max = 64;
+ V_pfi_buffer = malloc(V_pfi_buffer_max * sizeof(*V_pfi_buffer),
+ PFI_MTYPE, M_WAITOK);
+
+ if ((V_pfi_all = pfi_kif_get(IFG_ALL)) == NULL)
+#else
pfi_buffer_max = 64;
pfi_buffer = malloc(pfi_buffer_max * sizeof(*pfi_buffer),
PFI_MTYPE, M_WAITOK);
if ((pfi_all = pfi_kif_get(IFG_ALL)) == NULL)
+#endif
panic("pfi_kif_get for pfi_all failed");
-
#ifdef __FreeBSD__
struct ifg_group *ifg;
struct ifnet *ifp;
@@ -157,11 +178,11 @@ pfi_initialize(void)
pfi_detach_cookie = EVENTHANDLER_REGISTER(ifnet_departure_event,
pfi_detach_ifnet_event, NULL, EVENTHANDLER_PRI_ANY);
pfi_attach_group_cookie = EVENTHANDLER_REGISTER(group_attach_event,
- pfi_attach_group_event, NULL, EVENTHANDLER_PRI_ANY);
+ pfi_attach_group_event, curvnet, EVENTHANDLER_PRI_ANY);
pfi_change_group_cookie = EVENTHANDLER_REGISTER(group_change_event,
- pfi_change_group_event, NULL, EVENTHANDLER_PRI_ANY);
+ pfi_change_group_event, curvnet, EVENTHANDLER_PRI_ANY);
pfi_detach_group_cookie = EVENTHANDLER_REGISTER(group_detach_event,
- pfi_detach_group_event, NULL, EVENTHANDLER_PRI_ANY);
+ pfi_detach_group_event, curvnet, EVENTHANDLER_PRI_ANY);
pfi_ifaddr_event_cookie = EVENTHANDLER_REGISTER(ifaddr_event,
pfi_ifaddr_event, NULL, EVENTHANDLER_PRI_ANY);
#endif
@@ -182,18 +203,18 @@ pfi_cleanup(void)
EVENTHANDLER_DEREGISTER(ifaddr_event, pfi_ifaddr_event_cookie);
PF_LOCK();
- pfi_all = NULL;
- while ((p = RB_MIN(pfi_ifhead, &pfi_ifs))) {
+ V_pfi_all = NULL;
+ while ((p = RB_MIN(pfi_ifhead, &V_pfi_ifs))) {
if (p->pfik_rules || p->pfik_states) {
printf("pfi_cleanup: dangling refs for %s\n",
p->pfik_name);
}
- RB_REMOVE(pfi_ifhead, &pfi_ifs, p);
+ RB_REMOVE(pfi_ifhead, &V_pfi_ifs, p);
free(p, PFI_MTYPE);
}
- free(pfi_buffer, PFI_MTYPE);
+ free(V_pfi_buffer, PFI_MTYPE);
}
#endif
@@ -205,18 +226,21 @@ pfi_kif_get(const char *kif_name)
bzero(&s, sizeof(s));
strlcpy(s.pfik_name, kif_name, sizeof(s.pfik_name));
+#ifdef __FreeBSD__
+ if ((kif = RB_FIND(pfi_ifhead, &V_pfi_ifs, (struct pfi_kif *)&s)) != NULL)
+#else
if ((kif = RB_FIND(pfi_ifhead, &pfi_ifs, (struct pfi_kif *)&s)) != NULL)
+#endif
return (kif);
/* create new one */
#ifdef __FreeBSD__
- if ((kif = malloc(sizeof(*kif), PFI_MTYPE, M_NOWAIT)) == NULL)
+ if ((kif = malloc(sizeof(*kif), PFI_MTYPE, M_NOWAIT | M_ZERO)) == NULL)
#else
- if ((kif = malloc(sizeof(*kif), PFI_MTYPE, M_DONTWAIT)) == NULL)
+ if ((kif = malloc(sizeof(*kif), PFI_MTYPE, M_DONTWAIT|M_ZERO)) == NULL)
#endif
return (NULL);
- bzero(kif, sizeof(*kif));
strlcpy(kif->pfik_name, kif_name, sizeof(kif->pfik_name));
#ifdef __FreeBSD__
/*
@@ -232,7 +256,12 @@ pfi_kif_get(const char *kif_name)
#endif
TAILQ_INIT(&kif->pfik_dynaddrs);
+#ifdef __FreeBSD__
+ RB_INSERT(pfi_ifhead, &V_pfi_ifs, kif);
+#else
RB_INSERT(pfi_ifhead, &pfi_ifs, kif);
+#endif
+
return (kif);
}
@@ -244,8 +273,7 @@ pfi_kif_ref(struct pfi_kif *kif, enum pfi_kif_refs what)
kif->pfik_rules++;
break;
case PFI_KIF_REF_STATE:
- if (!kif->pfik_states++)
- TAILQ_INSERT_TAIL(&pfi_statehead, kif, pfik_w_states);
+ kif->pfik_states++;
break;
default:
panic("pfi_kif_ref with unknown type");
@@ -273,20 +301,27 @@ pfi_kif_unref(struct pfi_kif *kif, enum pfi_kif_refs what)
printf("pfi_kif_unref: state refcount <= 0\n");
return;
}
- if (!--kif->pfik_states)
- TAILQ_REMOVE(&pfi_statehead, kif, pfik_w_states);
+ kif->pfik_states--;
break;
default:
panic("pfi_kif_unref with unknown type");
}
+#ifdef __FreeBSD__
+ if (kif->pfik_ifp != NULL || kif->pfik_group != NULL || kif == V_pfi_all)
+#else
if (kif->pfik_ifp != NULL || kif->pfik_group != NULL || kif == pfi_all)
+#endif
return;
if (kif->pfik_rules || kif->pfik_states)
return;
+#ifdef __FreeBSD__
+ RB_REMOVE(pfi_ifhead, &V_pfi_ifs, kif);
+#else
RB_REMOVE(pfi_ifhead, &pfi_ifs, kif);
+#endif
free(kif, PFI_MTYPE);
}
@@ -314,7 +349,11 @@ pfi_attach_ifnet(struct ifnet *ifp)
pfi_initialize();
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
if ((kif = pfi_kif_get(ifp->if_xname)) == NULL)
panic("pfi_kif_get failed");
@@ -343,7 +382,11 @@ pfi_detach_ifnet(struct ifnet *ifp)
return;
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
#ifndef __FreeBSD__
hook_disestablish(ifp->if_addrhooks, kif->pfik_ah_cookie);
#endif
@@ -363,7 +406,11 @@ pfi_attach_ifgroup(struct ifg_group *ifg)
pfi_initialize();
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
if ((kif = pfi_kif_get(ifg->ifg_group)) == NULL)
panic("pfi_kif_get failed");
@@ -383,7 +430,11 @@ pfi_detach_ifgroup(struct ifg_group *ifg)
return;
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
kif->pfik_group = NULL;
ifg->ifg_pf_kif = NULL;
@@ -398,7 +449,11 @@ pfi_group_change(const char *group)
int s;
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
if ((kif = pfi_kif_get(group)) == NULL)
panic("pfi_kif_get failed");
@@ -452,9 +507,13 @@ pfi_dynaddr_setup(struct pf_addr_wrap *aw, sa_family_t af)
if (aw->type != PF_ADDR_DYNIFTL)
return (0);
- if ((dyn = pool_get(&pfi_addr_pl, PR_NOWAIT)) == NULL)
+#ifdef __FreeBSD__
+ if ((dyn = pool_get(&V_pfi_addr_pl, PR_NOWAIT | PR_ZERO))
+#else
+ if ((dyn = pool_get(&pfi_addr_pl, PR_WAITOK | PR_LIMITFAIL | PR_ZERO))
+#endif
+ == NULL)
return (1);
- bzero(dyn, sizeof(*dyn));
s = splsoftnet();
if (!strcmp(aw->v.ifname, "self"))
@@ -487,7 +546,7 @@ pfi_dynaddr_setup(struct pf_addr_wrap *aw, sa_family_t af)
goto _bad;
}
- if ((dyn->pfid_kt = pfr_attach_table(ruleset, tblname)) == NULL) {
+ if ((dyn->pfid_kt = pfr_attach_table(ruleset, tblname, 1)) == NULL) {
rv = 1;
goto _bad;
}
@@ -509,7 +568,11 @@ _bad:
pf_remove_if_empty_ruleset(ruleset);
if (dyn->pfid_kif != NULL)
pfi_kif_unref(dyn->pfid_kif, PFI_KIF_REF_RULE);
+#ifdef __FreeBSD__
+ pool_put(&V_pfi_addr_pl, dyn);
+#else
pool_put(&pfi_addr_pl, dyn);
+#endif
splx(s);
return (rv);
}
@@ -543,10 +606,18 @@ pfi_dynaddr_update(struct pfi_dynaddr *dyn)
kif = dyn->pfid_kif;
kt = dyn->pfid_kt;
+#ifdef __FreeBSD__
+ if (kt->pfrkt_larg != V_pfi_update) {
+#else
if (kt->pfrkt_larg != pfi_update) {
+#endif
/* this table needs to be brought up-to-date */
pfi_table_update(kt, kif, dyn->pfid_net, dyn->pfid_iflags);
+#ifdef __FreeBSD__
+ kt->pfrkt_larg = V_pfi_update;
+#else
kt->pfrkt_larg = pfi_update;
+#endif
}
pfr_dynaddr_update(kt, dyn);
}
@@ -557,7 +628,11 @@ pfi_table_update(struct pfr_ktable *kt, struct pfi_kif *kif, int net, int flags)
int e, size2 = 0;
struct ifg_member *ifgm;
+#ifdef __FreeBSD__
+ V_pfi_buffer_cnt = 0;
+#else
pfi_buffer_cnt = 0;
+#endif
if (kif->pfik_ifp != NULL)
pfi_instance_add(kif->pfik_ifp, net, flags);
@@ -565,10 +640,17 @@ pfi_table_update(struct pfr_ktable *kt, struct pfi_kif *kif, int net, int flags)
TAILQ_FOREACH(ifgm, &kif->pfik_group->ifg_members, ifgm_next)
pfi_instance_add(ifgm->ifgm_ifp, net, flags);
+#ifdef __FreeBSD__
+ if ((e = pfr_set_addrs(&kt->pfrkt_t, V_pfi_buffer, V_pfi_buffer_cnt, &size2,
+ NULL, NULL, NULL, 0, PFR_TFLAG_ALLMASK)))
+ printf("pfi_table_update: cannot set %d new addresses "
+ "into table %s: %d\n", V_pfi_buffer_cnt, kt->pfrkt_name, e);
+#else
if ((e = pfr_set_addrs(&kt->pfrkt_t, pfi_buffer, pfi_buffer_cnt, &size2,
NULL, NULL, NULL, 0, PFR_TFLAG_ALLMASK)))
printf("pfi_table_update: cannot set %d new addresses "
"into table %s: %d\n", pfi_buffer_cnt, kt->pfrkt_name, e);
+#endif
}
void
@@ -589,9 +671,9 @@ pfi_instance_add(struct ifnet *ifp, int net, int flags)
#ifdef __FreeBSD__
/*
* XXX: For point-to-point interfaces, (ifname:0) and IPv4,
- * jump over addresses without a proper route to work
- * around a problem with ppp not fully removing the
- * address used during IPCP.
+ * jump over addresses without a proper route to work
+ * around a problem with ppp not fully removing the
+ * address used during IPCP.
*/
if ((ifp->if_flags & IFF_POINTOPOINT) &&
!(ia->ifa_flags & IFA_ROUTE) &&
@@ -646,15 +728,24 @@ pfi_address_add(struct sockaddr *sa, int af, int net)
struct pfr_addr *p;
int i;
+#ifdef __FreeBSD__
+ if (V_pfi_buffer_cnt >= V_pfi_buffer_max) {
+ int new_max = V_pfi_buffer_max * 2;
+#else
if (pfi_buffer_cnt >= pfi_buffer_max) {
int new_max = pfi_buffer_max * 2;
+#endif
if (new_max > PFI_BUFFER_MAX) {
printf("pfi_address_add: address buffer full (%d/%d)\n",
+#ifdef __FreeBSD__
+ V_pfi_buffer_cnt, PFI_BUFFER_MAX);
+#else
pfi_buffer_cnt, PFI_BUFFER_MAX);
+#endif
return;
}
- p = malloc(new_max * sizeof(*pfi_buffer), PFI_MTYPE,
+ p = malloc(new_max * sizeof(*V_pfi_buffer), PFI_MTYPE,
#ifdef __FreeBSD__
M_NOWAIT);
#else
@@ -662,18 +753,34 @@ pfi_address_add(struct sockaddr *sa, int af, int net)
#endif
if (p == NULL) {
printf("pfi_address_add: no memory to grow buffer "
+#ifdef __FreeBSD__
+ "(%d/%d)\n", V_pfi_buffer_cnt, PFI_BUFFER_MAX);
+#else
"(%d/%d)\n", pfi_buffer_cnt, PFI_BUFFER_MAX);
+#endif
return;
}
- memcpy(p, pfi_buffer, pfi_buffer_max * sizeof(*pfi_buffer));
+#ifdef __FreeBSD__
+ memcpy(V_pfi_buffer, p, V_pfi_buffer_cnt * sizeof(*V_pfi_buffer));
+ /* no need to zero buffer */
+ free(V_pfi_buffer, PFI_MTYPE);
+ V_pfi_buffer = p;
+ V_pfi_buffer_max = new_max;
+#else
+ memcpy(pfi_buffer, p, pfi_buffer_cnt * sizeof(*pfi_buffer));
/* no need to zero buffer */
free(pfi_buffer, PFI_MTYPE);
pfi_buffer = p;
pfi_buffer_max = new_max;
+#endif
}
if (af == AF_INET && net > 32)
net = 128;
+#ifdef __FreeBSD__
+ p = V_pfi_buffer + V_pfi_buffer_cnt++;
+#else
p = pfi_buffer + pfi_buffer_cnt++;
+#endif
bzero(p, sizeof(*p));
p->pfra_af = af;
p->pfra_net = net;
@@ -706,7 +813,11 @@ pfi_dynaddr_remove(struct pf_addr_wrap *aw)
aw->p.dyn->pfid_kif = NULL;
pfr_detach_table(aw->p.dyn->pfid_kt);
aw->p.dyn->pfid_kt = NULL;
+#ifdef __FreeBSD__
+ pool_put(&V_pfi_addr_pl, aw->p.dyn);
+#else
pool_put(&pfi_addr_pl, aw->p.dyn);
+#endif
aw->p.dyn = NULL;
splx(s);
}
@@ -727,7 +838,11 @@ pfi_kifaddr_update(void *v)
struct pfi_kif *kif = (struct pfi_kif *)v;
s = splsoftnet();
+#ifdef __FreeBSD__
+ V_pfi_update++;
+#else
pfi_update++;
+#endif
pfi_kif_update(kif);
splx(s);
}
@@ -739,49 +854,61 @@ pfi_if_compare(struct pfi_kif *p, struct pfi_kif *q)
}
void
-pfi_fill_oldstatus(struct pf_status *pfs)
+pfi_update_status(const char *name, struct pf_status *pfs)
{
struct pfi_kif *p;
- struct pfi_kif_cmp key;
+ struct pfi_kif_cmp key;
+ struct ifg_member p_member, *ifgm;
+ TAILQ_HEAD(, ifg_member) ifg_members;
int i, j, k, s;
- strlcpy(key.pfik_name, pfs->ifname, sizeof(key.pfik_name));
+ strlcpy(key.pfik_name, name, sizeof(key.pfik_name));
s = splsoftnet();
+#ifdef __FreeBSD__
+ p = RB_FIND(pfi_ifhead, &V_pfi_ifs, (struct pfi_kif *)&key);
+#else
p = RB_FIND(pfi_ifhead, &pfi_ifs, (struct pfi_kif *)&key);
+#endif
if (p == NULL) {
splx(s);
return;
}
- bzero(pfs->pcounters, sizeof(pfs->pcounters));
- bzero(pfs->bcounters, sizeof(pfs->bcounters));
- for (i = 0; i < 2; i++)
- for (j = 0; j < 2; j++)
- for (k = 0; k < 2; k++) {
- pfs->pcounters[i][j][k] =
- p->pfik_packets[i][j][k];
- pfs->bcounters[i][j] +=
- p->pfik_bytes[i][j][k];
- }
- splx(s);
-}
-
-int
-pfi_clr_istats(const char *name)
-{
- struct pfi_kif *p;
- int s;
+ if (p->pfik_group != NULL) {
+ bcopy(&p->pfik_group->ifg_members, &ifg_members,
+ sizeof(ifg_members));
+ } else {
+ /* build a temporary list for p only */
+ bzero(&p_member, sizeof(p_member));
+ p_member.ifgm_ifp = p->pfik_ifp;
+ TAILQ_INIT(&ifg_members);
+ TAILQ_INSERT_TAIL(&ifg_members, &p_member, ifgm_next);
+ }
+ if (pfs) {
+ bzero(pfs->pcounters, sizeof(pfs->pcounters));
+ bzero(pfs->bcounters, sizeof(pfs->bcounters));
+ }
+ TAILQ_FOREACH(ifgm, &ifg_members, ifgm_next) {
+ if (ifgm->ifgm_ifp == NULL)
+ continue;
+ p = (struct pfi_kif *)ifgm->ifgm_ifp->if_pf_kif;
- s = splsoftnet();
- RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
- if (pfi_skip_if(name, p))
+ /* just clear statistics */
+ if (pfs == NULL) {
+ bzero(p->pfik_packets, sizeof(p->pfik_packets));
+ bzero(p->pfik_bytes, sizeof(p->pfik_bytes));
+ p->pfik_tzero = time_second;
continue;
- bzero(p->pfik_packets, sizeof(p->pfik_packets));
- bzero(p->pfik_bytes, sizeof(p->pfik_bytes));
- p->pfik_tzero = time_second;
+ }
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 2; k++) {
+ pfs->pcounters[i][j][k] +=
+ p->pfik_packets[i][j][k];
+ pfs->bcounters[i][j] +=
+ p->pfik_bytes[i][j][k];
+ }
}
splx(s);
-
- return (0);
}
int
@@ -794,8 +921,13 @@ pfi_get_ifaces(const char *name, struct pfi_kif *buf, int *size)
#endif
s = splsoftnet();
+#ifdef __FreeBSD__
+ for (p = RB_MIN(pfi_ifhead, &V_pfi_ifs); p; p = nextp) {
+ nextp = RB_NEXT(pfi_ifhead, &V_pfi_ifs, p);
+#else
for (p = RB_MIN(pfi_ifhead, &pfi_ifs); p; p = nextp) {
nextp = RB_NEXT(pfi_ifhead, &pfi_ifs, p);
+#endif
if (pfi_skip_if(name, p))
continue;
if (*size > n++) {
@@ -812,7 +944,11 @@ pfi_get_ifaces(const char *name, struct pfi_kif *buf, int *size)
splx(s);
return (EFAULT);
}
+#ifdef __FreeBSD__
+ nextp = RB_NEXT(pfi_ifhead, &V_pfi_ifs, p);
+#else
nextp = RB_NEXT(pfi_ifhead, &pfi_ifs, p);
+#endif
pfi_kif_unref(p, PFI_KIF_REF_RULE);
}
}
@@ -847,7 +983,11 @@ pfi_set_flags(const char *name, int flags)
int s;
s = splsoftnet();
+#ifdef __FreeBSD__
+ RB_FOREACH(p, pfi_ifhead, &V_pfi_ifs) {
+#else
RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
+#endif
if (pfi_skip_if(name, p))
continue;
p->pfik_flags |= flags;
@@ -863,7 +1003,11 @@ pfi_clear_flags(const char *name, int flags)
int s;
s = splsoftnet();
+#ifdef __FreeBSD__
+ RB_FOREACH(p, pfi_ifhead, &V_pfi_ifs) {
+#else
RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
+#endif
if (pfi_skip_if(name, p))
continue;
p->pfik_flags &= ~flags;
@@ -896,55 +1040,73 @@ pfi_unmask(void *addr)
void
pfi_attach_ifnet_event(void *arg __unused, struct ifnet *ifp)
{
+
+ CURVNET_SET(ifp->if_vnet);
PF_LOCK();
pfi_attach_ifnet(ifp);
#ifdef ALTQ
pf_altq_ifnet_event(ifp, 0);
#endif
PF_UNLOCK();
+ CURVNET_RESTORE();
}
void
pfi_detach_ifnet_event(void *arg __unused, struct ifnet *ifp)
{
+
+ CURVNET_SET(ifp->if_vnet);
PF_LOCK();
pfi_detach_ifnet(ifp);
#ifdef ALTQ
pf_altq_ifnet_event(ifp, 1);
#endif
PF_UNLOCK();
+ CURVNET_RESTORE();
}
void
-pfi_attach_group_event(void *arg __unused, struct ifg_group *ifg)
+pfi_attach_group_event(void *arg , struct ifg_group *ifg)
{
+
+ CURVNET_SET((struct vnet *)arg);
PF_LOCK();
pfi_attach_ifgroup(ifg);
PF_UNLOCK();
+ CURVNET_RESTORE();
}
void
-pfi_change_group_event(void *arg __unused, char *gname)
+pfi_change_group_event(void *arg, char *gname)
{
+
+ CURVNET_SET((struct vnet *)arg);
PF_LOCK();
pfi_group_change(gname);
PF_UNLOCK();
+ CURVNET_RESTORE();
}
void
-pfi_detach_group_event(void *arg __unused, struct ifg_group *ifg)
+pfi_detach_group_event(void *arg, struct ifg_group *ifg)
{
+
+ CURVNET_SET((struct vnet *)arg);
PF_LOCK();
pfi_detach_ifgroup(ifg);
PF_UNLOCK();
+ CURVNET_RESTORE();
}
void
pfi_ifaddr_event(void *arg __unused, struct ifnet *ifp)
{
+
+ CURVNET_SET(ifp->if_vnet);
PF_LOCK();
if (ifp && ifp->if_pf_kif)
pfi_kifaddr_update(ifp->if_pf_kif);
PF_UNLOCK();
+ CURVNET_RESTORE();
}
#endif /* __FreeBSD__ */