Commit 0aa8c57a authored by Aaron Conole's avatar Aaron Conole Committed by Pablo Neira Ayuso

netfilter: introduce accessor functions for hook entries

This allows easier future refactoring.
Signed-off-by: default avatarAaron Conole <aconole@bytheb.org>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 834184b1
...@@ -79,6 +79,33 @@ struct nf_hook_entry { ...@@ -79,6 +79,33 @@ struct nf_hook_entry {
const struct nf_hook_ops *orig_ops; const struct nf_hook_ops *orig_ops;
}; };
static inline void
nf_hook_entry_init(struct nf_hook_entry *entry, const struct nf_hook_ops *ops)
{
entry->next = NULL;
entry->ops = *ops;
entry->orig_ops = ops;
}
static inline int
nf_hook_entry_priority(const struct nf_hook_entry *entry)
{
return entry->ops.priority;
}
static inline int
nf_hook_entry_hookfn(const struct nf_hook_entry *entry, struct sk_buff *skb,
struct nf_hook_state *state)
{
return entry->ops.hook(entry->ops.priv, skb, state);
}
static inline const struct nf_hook_ops *
nf_hook_entry_ops(const struct nf_hook_entry *entry)
{
return entry->orig_ops;
}
static inline void nf_hook_state_init(struct nf_hook_state *p, static inline void nf_hook_state_init(struct nf_hook_state *p,
unsigned int hook, unsigned int hook,
u_int8_t pf, u_int8_t pf,
......
...@@ -1010,7 +1010,7 @@ int br_nf_hook_thresh(unsigned int hook, struct net *net, ...@@ -1010,7 +1010,7 @@ int br_nf_hook_thresh(unsigned int hook, struct net *net,
elem = rcu_dereference(net->nf.hooks[NFPROTO_BRIDGE][hook]); elem = rcu_dereference(net->nf.hooks[NFPROTO_BRIDGE][hook]);
while (elem && (elem->ops.priority <= NF_BR_PRI_BRNF)) while (elem && (nf_hook_entry_priority(elem) <= NF_BR_PRI_BRNF))
elem = rcu_dereference(elem->next); elem = rcu_dereference(elem->next);
if (!elem) if (!elem)
......
...@@ -102,15 +102,13 @@ int nf_register_net_hook(struct net *net, const struct nf_hook_ops *reg) ...@@ -102,15 +102,13 @@ int nf_register_net_hook(struct net *net, const struct nf_hook_ops *reg)
if (!entry) if (!entry)
return -ENOMEM; return -ENOMEM;
entry->orig_ops = reg; nf_hook_entry_init(entry, reg);
entry->ops = *reg;
entry->next = NULL;
mutex_lock(&nf_hook_mutex); mutex_lock(&nf_hook_mutex);
/* Find the spot in the list */ /* Find the spot in the list */
while ((p = nf_entry_dereference(*pp)) != NULL) { while ((p = nf_entry_dereference(*pp)) != NULL) {
if (reg->priority < p->orig_ops->priority) if (reg->priority < nf_hook_entry_priority(p))
break; break;
pp = &p->next; pp = &p->next;
} }
...@@ -140,7 +138,7 @@ void nf_unregister_net_hook(struct net *net, const struct nf_hook_ops *reg) ...@@ -140,7 +138,7 @@ void nf_unregister_net_hook(struct net *net, const struct nf_hook_ops *reg)
mutex_lock(&nf_hook_mutex); mutex_lock(&nf_hook_mutex);
while ((p = nf_entry_dereference(*pp)) != NULL) { while ((p = nf_entry_dereference(*pp)) != NULL) {
if (p->orig_ops == reg) { if (nf_hook_entry_ops(p) == reg) {
rcu_assign_pointer(*pp, p->next); rcu_assign_pointer(*pp, p->next);
break; break;
} }
...@@ -311,7 +309,7 @@ int nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state, ...@@ -311,7 +309,7 @@ int nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state,
int ret; int ret;
do { do {
verdict = entry->ops.hook(entry->ops.priv, skb, state); verdict = nf_hook_entry_hookfn(entry, skb, state);
switch (verdict & NF_VERDICT_MASK) { switch (verdict & NF_VERDICT_MASK) {
case NF_ACCEPT: case NF_ACCEPT:
entry = rcu_dereference(entry->next); entry = rcu_dereference(entry->next);
......
...@@ -185,7 +185,7 @@ static unsigned int nf_iterate(struct sk_buff *skb, ...@@ -185,7 +185,7 @@ static unsigned int nf_iterate(struct sk_buff *skb,
do { do {
repeat: repeat:
verdict = (*entryp)->ops.hook((*entryp)->ops.priv, skb, state); verdict = nf_hook_entry_hookfn((*entryp), skb, state);
if (verdict != NF_ACCEPT) { if (verdict != NF_ACCEPT) {
if (verdict != NF_REPEAT) if (verdict != NF_REPEAT)
return verdict; return verdict;
...@@ -200,7 +200,6 @@ static unsigned int nf_iterate(struct sk_buff *skb, ...@@ -200,7 +200,6 @@ static unsigned int nf_iterate(struct sk_buff *skb,
void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict) void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
{ {
struct nf_hook_entry *hook_entry = entry->hook; struct nf_hook_entry *hook_entry = entry->hook;
struct nf_hook_ops *elem = &hook_entry->ops;
struct sk_buff *skb = entry->skb; struct sk_buff *skb = entry->skb;
const struct nf_afinfo *afinfo; const struct nf_afinfo *afinfo;
int err; int err;
...@@ -209,7 +208,7 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict) ...@@ -209,7 +208,7 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
/* Continue traversal iff userspace said ok... */ /* Continue traversal iff userspace said ok... */
if (verdict == NF_REPEAT) if (verdict == NF_REPEAT)
verdict = elem->hook(elem->priv, skb, &entry->state); verdict = nf_hook_entry_hookfn(hook_entry, skb, &entry->state);
if (verdict == NF_ACCEPT) { if (verdict == NF_ACCEPT) {
afinfo = nf_get_afinfo(entry->state.pf); afinfo = nf_get_afinfo(entry->state.pf);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment