|
@@ -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,
|
|
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;
|
|
int status = -ENOENT;
|
|
struct nf_queue_entry *entry = NULL;
|
|
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) {
|
|
*entry = (struct nf_queue_entry) {
|
|
.skb = skb,
|
|
.skb = skb,
|
|
.state = *state,
|
|
.state = *state,
|
|
|
|
+ .hook = hook_entry,
|
|
.size = sizeof(*entry) + afinfo->route_key_size,
|
|
.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;
|
|
struct nf_hook_entry *entry = *entryp;
|
|
int ret;
|
|
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 < 0) {
|
|
if (ret == -ESRCH &&
|
|
if (ret == -ESRCH &&
|
|
(verdict & NF_VERDICT_FLAG_QUEUE_BYPASS)) {
|
|
(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)
|
|
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;
|
|
struct sk_buff *skb = entry->skb;
|
|
const struct nf_afinfo *afinfo;
|
|
const struct nf_afinfo *afinfo;
|
|
- struct nf_hook_ops *elem;
|
|
|
|
int err;
|
|
int err;
|
|
|
|
|
|
- hook_entry = rcu_dereference(entry->state.hook_entries);
|
|
|
|
- elem = &hook_entry->ops;
|
|
|
|
-
|
|
|
|
nf_queue_entry_release_refs(entry);
|
|
nf_queue_entry_release_refs(entry);
|
|
|
|
|
|
/* Continue traversal iff userspace said ok... */
|
|
/* Continue traversal iff userspace said ok... */
|