Changeset View
Changeset View
Standalone View
Standalone View
sys/net/pfil.c
Show First 20 Lines • Show All 148 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
int | int | ||||
pfil_run_hooks(struct pfil_head *head, pfil_packet_t p, struct ifnet *ifp, | pfil_run_hooks(struct pfil_head *head, pfil_packet_t p, struct ifnet *ifp, | ||||
int flags, struct inpcb *inp) | int flags, struct inpcb *inp) | ||||
{ | { | ||||
struct epoch_tracker et; | struct epoch_tracker et; | ||||
pfil_chain_t *pch; | pfil_chain_t *pch; | ||||
struct pfil_link *link; | struct pfil_link *link; | ||||
pfil_return_t rv, rvi; | pfil_return_t rv; | ||||
bool realloc = false; | |||||
if (PFIL_DIR(flags) == PFIL_IN) | if (PFIL_DIR(flags) == PFIL_IN) | ||||
pch = &head->head_in; | pch = &head->head_in; | ||||
else if (__predict_true(PFIL_DIR(flags) == PFIL_OUT)) | else if (__predict_true(PFIL_DIR(flags) == PFIL_OUT)) | ||||
pch = &head->head_out; | pch = &head->head_out; | ||||
else | else | ||||
panic("%s: bogus flags %d", __func__, flags); | panic("%s: bogus flags %d", __func__, flags); | ||||
rv = PFIL_PASS; | rv = PFIL_PASS; | ||||
PFIL_EPOCH_ENTER(et); | PFIL_EPOCH_ENTER(et); | ||||
CK_STAILQ_FOREACH(link, pch, link_chain) { | CK_STAILQ_FOREACH(link, pch, link_chain) { | ||||
if ((flags & PFIL_MEMPTR) && !(link->link_flags & PFIL_MEMPTR)) | if ((flags & PFIL_MEMPTR) && !(link->link_flags & PFIL_MEMPTR)) | ||||
rvi = pfil_fake_mbuf(link->link_func, p.mem, ifp, | rv = pfil_fake_mbuf(link->link_func, p.mem, ifp, | ||||
flags, link->link_ruleset, inp); | flags, link->link_ruleset, inp); | ||||
else | else | ||||
rvi = (*link->link_func)(p, ifp, flags, | rv = (*link->link_func)(p, ifp, flags, | ||||
link->link_ruleset, inp); | link->link_ruleset, inp); | ||||
if (rvi == PFIL_DROPPED || rvi == PFIL_CONSUMED) { | if (rv == PFIL_DROPPED || rv == PFIL_CONSUMED) | ||||
rv = rvi; | |||||
break; | break; | ||||
} else if (rv == PFIL_REALLOCED) { | else if (rv == PFIL_REALLOCED) { | ||||
flags &= ~(PFIL_MEMPTR | PFIL_LENMASK); | flags &= ~(PFIL_MEMPTR | PFIL_LENMASK); | ||||
rv = rvi; | realloc = true; | ||||
} | } | ||||
} | } | ||||
PFIL_EPOCH_EXIT(et); | PFIL_EPOCH_EXIT(et); | ||||
return (rvi); | if (realloc && rv == PFIL_PASS) | ||||
rv = PFIL_REALLOCED; | |||||
return (rv); | |||||
} | } | ||||
/* | /* | ||||
* pfil_head_register() registers a pfil_head with the packet filter hook | * pfil_head_register() registers a pfil_head with the packet filter hook | ||||
* mechanism. | * mechanism. | ||||
*/ | */ | ||||
pfil_head_t | pfil_head_t | ||||
pfil_head_register(struct pfil_head_args *pa) | pfil_head_register(struct pfil_head_args *pa) | ||||
▲ Show 20 Lines • Show All 471 Lines • Show Last 20 Lines |