]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/netfilter/nf_queue.c
netfilter: remove hook_entries field from nf_hook_state
[mirror_ubuntu-bionic-kernel.git] / net / netfilter / nf_queue.c
index 0fb38966e5bf36993d3f17209b123a7b998b2e03..2e39e38ae1c7984b0f87cca6b8911e6df5b3f1e0 100644 (file)
@@ -108,7 +108,7 @@ void nf_queue_nf_hook_drop(struct net *net, const struct nf_hook_entry *entry)
 }
 
 static int __nf_queue(struct sk_buff *skb, const struct nf_hook_state *state,
-                     unsigned int queuenum)
+                     struct nf_hook_entry *hook_entry, unsigned int queuenum)
 {
        int status = -ENOENT;
        struct nf_queue_entry *entry = NULL;
@@ -136,6 +136,7 @@ static int __nf_queue(struct sk_buff *skb, const struct nf_hook_state *state,
        *entry = (struct nf_queue_entry) {
                .skb    = skb,
                .state  = *state,
+               .hook   = hook_entry,
                .size   = sizeof(*entry) + afinfo->route_key_size,
        };
 
@@ -163,8 +164,7 @@ int nf_queue(struct sk_buff *skb, struct nf_hook_state *state,
        struct nf_hook_entry *entry = *entryp;
        int ret;
 
-       RCU_INIT_POINTER(state->hook_entries, entry);
-       ret = __nf_queue(skb, state, verdict >> NF_VERDICT_QBITS);
+       ret = __nf_queue(skb, state, entry, verdict >> NF_VERDICT_QBITS);
        if (ret < 0) {
                if (ret == -ESRCH &&
                    (verdict & NF_VERDICT_FLAG_QUEUE_BYPASS)) {
@@ -179,15 +179,12 @@ int nf_queue(struct sk_buff *skb, struct nf_hook_state *state,
 
 void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
 {
-       struct nf_hook_entry *hook_entry;
+       struct nf_hook_entry *hook_entry = entry->hook;
+       struct nf_hook_ops *elem = &hook_entry->ops;
        struct sk_buff *skb = entry->skb;
        const struct nf_afinfo *afinfo;
-       struct nf_hook_ops *elem;
        int err;
 
-       hook_entry = rcu_dereference(entry->state.hook_entries);
-       elem = &hook_entry->ops;
-
        nf_queue_entry_release_refs(entry);
 
        /* Continue traversal iff userspace said ok... */