From: Pablo Neira Ayuso <pablo@netfilter.org>
To: netfilter-devel@vger.kernel.org
Cc: davem@davemloft.net, netdev@vger.kernel.org
Subject: [PATCH 14/17] netfilter: xt_connlimit: honor conntrack zone if available
Date: Mon, 24 Nov 2014 14:27:51 +0100 [thread overview]
Message-ID: <1416835674-11871-15-git-send-email-pablo@netfilter.org> (raw)
In-Reply-To: <1416835674-11871-1-git-send-email-pablo@netfilter.org>
From: Florian Westphal <fw@strlen.de>
Currently all the conntrack lookups are done using default zone.
In case the skb has a ct attached (e.g. template) we should use this zone
for lookups instead. This makes connlimit work with connections assigned
to other zones.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netfilter/xt_connlimit.c | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c
index fbc66bb..29ba621 100644
--- a/net/netfilter/xt_connlimit.c
+++ b/net/netfilter/xt_connlimit.c
@@ -134,6 +134,7 @@ static bool add_hlist(struct hlist_head *head,
static unsigned int check_hlist(struct net *net,
struct hlist_head *head,
const struct nf_conntrack_tuple *tuple,
+ u16 zone,
bool *addit)
{
const struct nf_conntrack_tuple_hash *found;
@@ -147,8 +148,7 @@ static unsigned int check_hlist(struct net *net,
/* check the saved connections */
hlist_for_each_entry_safe(conn, n, head, node) {
- found = nf_conntrack_find_get(net, NF_CT_DEFAULT_ZONE,
- &conn->tuple);
+ found = nf_conntrack_find_get(net, zone, &conn->tuple);
if (found == NULL) {
hlist_del(&conn->node);
kmem_cache_free(connlimit_conn_cachep, conn);
@@ -201,7 +201,7 @@ static unsigned int
count_tree(struct net *net, struct rb_root *root,
const struct nf_conntrack_tuple *tuple,
const union nf_inet_addr *addr, const union nf_inet_addr *mask,
- u8 family)
+ u8 family, u16 zone)
{
struct xt_connlimit_rb *gc_nodes[CONNLIMIT_GC_MAX_NODES];
struct rb_node **rbnode, *parent;
@@ -229,7 +229,7 @@ count_tree(struct net *net, struct rb_root *root,
} else {
/* same source network -> be counted! */
unsigned int count;
- count = check_hlist(net, &rbconn->hhead, tuple, &addit);
+ count = check_hlist(net, &rbconn->hhead, tuple, zone, &addit);
tree_nodes_free(root, gc_nodes, gc_count);
if (!addit)
@@ -245,7 +245,7 @@ count_tree(struct net *net, struct rb_root *root,
continue;
/* only used for GC on hhead, retval and 'addit' ignored */
- check_hlist(net, &rbconn->hhead, tuple, &addit);
+ check_hlist(net, &rbconn->hhead, tuple, zone, &addit);
if (hlist_empty(&rbconn->hhead))
gc_nodes[gc_count++] = rbconn;
}
@@ -290,7 +290,7 @@ static int count_them(struct net *net,
const struct nf_conntrack_tuple *tuple,
const union nf_inet_addr *addr,
const union nf_inet_addr *mask,
- u_int8_t family)
+ u_int8_t family, u16 zone)
{
struct rb_root *root;
int count;
@@ -306,7 +306,7 @@ static int count_them(struct net *net,
spin_lock_bh(&xt_connlimit_locks[hash % CONNLIMIT_LOCK_SLOTS]);
- count = count_tree(net, root, tuple, addr, mask, family);
+ count = count_tree(net, root, tuple, addr, mask, family, zone);
spin_unlock_bh(&xt_connlimit_locks[hash % CONNLIMIT_LOCK_SLOTS]);
@@ -324,13 +324,16 @@ connlimit_mt(const struct sk_buff *skb, struct xt_action_param *par)
enum ip_conntrack_info ctinfo;
const struct nf_conn *ct;
unsigned int connections;
+ u16 zone = NF_CT_DEFAULT_ZONE;
ct = nf_ct_get(skb, &ctinfo);
- if (ct != NULL)
+ if (ct != NULL) {
tuple_ptr = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple;
- else if (!nf_ct_get_tuplepr(skb, skb_network_offset(skb),
- par->family, &tuple))
+ zone = nf_ct_zone(ct);
+ } else if (!nf_ct_get_tuplepr(skb, skb_network_offset(skb),
+ par->family, &tuple)) {
goto hotdrop;
+ }
if (par->family == NFPROTO_IPV6) {
const struct ipv6hdr *iph = ipv6_hdr(skb);
@@ -343,7 +346,7 @@ connlimit_mt(const struct sk_buff *skb, struct xt_action_param *par)
}
connections = count_them(net, info->data, tuple_ptr, &addr,
- &info->mask, par->family);
+ &info->mask, par->family, zone);
if (connections == 0)
/* kmalloc failed, drop it entirely */
goto hotdrop;
--
1.7.10.4
next prev parent reply other threads:[~2014-11-24 13:27 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-24 13:27 [PATCH 00/17] netfilter/ipvs updates for net-next Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 01/17] netfilter: refactor NAT redirect IPv4 to use it from nf_tables Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 02/17] netfilter: refactor NAT redirect IPv6 code " Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 03/17] netfilter: nf_tables: add new expression nft_redir Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 04/17] ipvs: remove unnecessary assignment in __ip_vs_get_out_rt Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 05/17] netfilter: nf_log: Introduce nft_log_dereference() macro Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 06/17] netfilter: log: protect nf_log_register against double registering Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 07/17] netfilter: fix spelling errors Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 08/17] netfilter: nf_log: fix sparse warning in nf_logger_find_get() Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 09/17] netfilter: nft_meta: add cgroup support Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 10/17] netfilter: fix unmet dependencies in NETFILTER_XT_TARGET_REDIRECT Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 11/17] netfilter: nft_redir: fix sparse warnings Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 12/17] netfilter: fix various " Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 13/17] netfilter: nfnetlink_log: remove unnecessary error messages Pablo Neira Ayuso
2014-11-24 13:27 ` Pablo Neira Ayuso [this message]
2014-11-24 13:27 ` [PATCH 15/17] netfilter: nf_conntrack_h323: lookup route from proper net namespace Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 16/17] netfilter: Deletion of unnecessary checks before two function calls Pablo Neira Ayuso
2014-11-24 13:27 ` [PATCH 17/17] netfilter: nfnetlink_log: Make use of pr_fmt where applicable Pablo Neira Ayuso
2014-11-24 21:01 ` [PATCH 00/17] netfilter/ipvs updates for net-next David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1416835674-11871-15-git-send-email-pablo@netfilter.org \
--to=pablo@netfilter.org \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).