Changeset View
Changeset View
Standalone View
Standalone View
sys/net/pfil.c
Show First 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | |||||
#define PFIL_HEADLIST_LOCK() mtx_lock(&pfil_global_lock) | #define PFIL_HEADLIST_LOCK() mtx_lock(&pfil_global_lock) | ||||
#define PFIL_HEADLIST_UNLOCK() mtx_unlock(&pfil_global_lock) | #define PFIL_HEADLIST_UNLOCK() mtx_unlock(&pfil_global_lock) | ||||
/* | /* | ||||
* pfil_run_hooks() runs the specified packet filter hook chain. | * pfil_run_hooks() runs the specified packet filter hook chain. | ||||
*/ | */ | ||||
int | int | ||||
pfil_run_hooks(struct pfil_head *ph, struct mbuf **mp, struct ifnet *ifp, | pfil_run_hooks(struct pfil_head *ph, struct mbuf **mp, struct ifnet *ifp, | ||||
int dir, struct inpcb *inp) | int dir, int flags, struct inpcb *inp) | ||||
{ | { | ||||
struct rm_priotracker rmpt; | struct rm_priotracker rmpt; | ||||
struct packet_filter_hook *pfh; | struct packet_filter_hook *pfh; | ||||
struct mbuf *m = *mp; | struct mbuf *m = *mp; | ||||
int rv = 0; | int rv = 0; | ||||
PFIL_RLOCK(ph, &rmpt); | PFIL_RLOCK(ph, &rmpt); | ||||
KASSERT(ph->ph_nhooks >= 0, ("Pfil hook count dropped < 0")); | KASSERT(ph->ph_nhooks >= 0, ("Pfil hook count dropped < 0")); | ||||
for (pfh = pfil_chain_get(dir, ph); pfh != NULL; | for (pfh = pfil_chain_get(dir, ph); pfh != NULL; | ||||
pfh = TAILQ_NEXT(pfh, pfil_chain)) { | pfh = TAILQ_NEXT(pfh, pfil_chain)) { | ||||
if (pfh->pfil_func != NULL) { | if (pfh->pfil_func != NULL) { | ||||
rv = (*pfh->pfil_func)(pfh->pfil_arg, &m, ifp, dir, | rv = (*pfh->pfil_func)(pfh->pfil_arg, &m, ifp, dir, | ||||
inp); | flags, inp); | ||||
if (rv != 0 || m == NULL) | if (rv != 0 || m == NULL) | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
PFIL_RUNLOCK(ph, &rmpt); | PFIL_RUNLOCK(ph, &rmpt); | ||||
*mp = m; | *mp = m; | ||||
return (rv); | return (rv); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 310 Lines • Show Last 20 Lines |