Skip to content

Commit

Permalink
netfilter: xt_NFQUEUE: coalesce IPv4 and IPv6 hashing
Browse files Browse the repository at this point in the history
Because rev1 and rev3 of the target share the same hashing
generalize it by introduing nfqueue_hash().

Signed-off-by: Holger Eitzenberger <holger@eitzenberger.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
  • Loading branch information
holger@eitzenberger.org authored and Pablo Neira Ayuso committed Apr 1, 2013
1 parent 8746ddc commit 5c33448
Showing 1 changed file with 22 additions and 20 deletions.
42 changes: 22 additions & 20 deletions net/netfilter/xt_NFQUEUE.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,22 +76,31 @@ static u32 hash_v6(const struct sk_buff *skb)
}
#endif

static unsigned int
nfqueue_tg_v1(struct sk_buff *skb, const struct xt_action_param *par)
static u32
nfqueue_hash(const struct sk_buff *skb, const struct xt_action_param *par)
{
const struct xt_NFQ_info_v1 *info = par->targinfo;
u32 queue = info->queuenum;

if (info->queues_total > 1) {
if (par->family == NFPROTO_IPV4)
queue = (((u64) hash_v4(skb) * info->queues_total) >>
32) + queue;
if (par->family == NFPROTO_IPV4)
queue += ((u64) hash_v4(skb) * info->queues_total) >> 32;
#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
else if (par->family == NFPROTO_IPV6)
queue = (((u64) hash_v6(skb) * info->queues_total) >>
32) + queue;
else if (par->family == NFPROTO_IPV6)
queue += ((u64) hash_v6(skb) * info->queues_total) >> 32;
#endif
}

return queue;
}

static unsigned int
nfqueue_tg_v1(struct sk_buff *skb, const struct xt_action_param *par)
{
const struct xt_NFQ_info_v1 *info = par->targinfo;
u32 queue = info->queuenum;

if (info->queues_total > 1)
queue = nfqueue_hash(skb, par);

return NF_QUEUE_NR(queue);
}

Expand Down Expand Up @@ -144,17 +153,10 @@ nfqueue_tg_v3(struct sk_buff *skb, const struct xt_action_param *par)
int cpu = smp_processor_id();

queue = info->queuenum + cpu % info->queues_total;
} else {
if (par->family == NFPROTO_IPV4)
queue = (((u64) hash_v4(skb) * info->queues_total) >>
32) + queue;
#if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
else if (par->family == NFPROTO_IPV6)
queue = (((u64) hash_v6(skb) * info->queues_total) >>
32) + queue;
#endif
}
} else
queue = nfqueue_hash(skb, par);
}

return NF_QUEUE_NR(queue);
}

Expand Down

0 comments on commit 5c33448

Please sign in to comment.