diff options
author | Florian Westphal <fw@strlen.de> | 2014-04-28 15:09:50 -0400 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2014-04-29 14:56:22 -0400 |
commit | f768e5bdefe1ec9adbf7a116dfb156b73cacb582 (patch) | |
tree | 1d49bc5b3184cc71d34090a4b056e3b9a9427fb9 /net | |
parent | 683399eddb9fff742b1a14c5a5d03e12bfc0afff (diff) |
netfilter: add helper for adding nat extension
Reduce copy-past a bit by adding a common helper.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/netfilter/iptable_nat.c | 14 | ||||
-rw-r--r-- | net/ipv4/netfilter/nft_chain_nat_ipv4.c | 12 | ||||
-rw-r--r-- | net/ipv6/netfilter/ip6table_nat.c | 14 | ||||
-rw-r--r-- | net/ipv6/netfilter/nft_chain_nat_ipv6.c | 12 | ||||
-rw-r--r-- | net/netfilter/nf_nat_core.c | 24 |
5 files changed, 28 insertions, 48 deletions
diff --git a/net/ipv4/netfilter/iptable_nat.c b/net/ipv4/netfilter/iptable_nat.c index ee2886126e3d..f1787c04a4dd 100644 --- a/net/ipv4/netfilter/iptable_nat.c +++ b/net/ipv4/netfilter/iptable_nat.c | |||
@@ -91,17 +91,9 @@ nf_nat_ipv4_fn(const struct nf_hook_ops *ops, | |||
91 | if (nf_ct_is_untracked(ct)) | 91 | if (nf_ct_is_untracked(ct)) |
92 | return NF_ACCEPT; | 92 | return NF_ACCEPT; |
93 | 93 | ||
94 | nat = nfct_nat(ct); | 94 | nat = nf_ct_nat_ext_add(ct); |
95 | if (!nat) { | 95 | if (nat == NULL) |
96 | /* NAT module was loaded late. */ | 96 | return NF_ACCEPT; |
97 | if (nf_ct_is_confirmed(ct)) | ||
98 | return NF_ACCEPT; | ||
99 | nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC); | ||
100 | if (nat == NULL) { | ||
101 | pr_debug("failed to add NAT extension\n"); | ||
102 | return NF_ACCEPT; | ||
103 | } | ||
104 | } | ||
105 | 97 | ||
106 | switch (ctinfo) { | 98 | switch (ctinfo) { |
107 | case IP_CT_RELATED: | 99 | case IP_CT_RELATED: |
diff --git a/net/ipv4/netfilter/nft_chain_nat_ipv4.c b/net/ipv4/netfilter/nft_chain_nat_ipv4.c index b5b256d45e67..3964157d826c 100644 --- a/net/ipv4/netfilter/nft_chain_nat_ipv4.c +++ b/net/ipv4/netfilter/nft_chain_nat_ipv4.c | |||
@@ -48,15 +48,9 @@ static unsigned int nf_nat_fn(const struct nf_hook_ops *ops, | |||
48 | 48 | ||
49 | NF_CT_ASSERT(!(ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET))); | 49 | NF_CT_ASSERT(!(ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET))); |
50 | 50 | ||
51 | nat = nfct_nat(ct); | 51 | nat = nf_ct_nat_ext_add(ct); |
52 | if (nat == NULL) { | 52 | if (nat == NULL) |
53 | /* Conntrack module was loaded late, can't add extension. */ | 53 | return NF_ACCEPT; |
54 | if (nf_ct_is_confirmed(ct)) | ||
55 | return NF_ACCEPT; | ||
56 | nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC); | ||
57 | if (nat == NULL) | ||
58 | return NF_ACCEPT; | ||
59 | } | ||
60 | 54 | ||
61 | switch (ctinfo) { | 55 | switch (ctinfo) { |
62 | case IP_CT_RELATED: | 56 | case IP_CT_RELATED: |
diff --git a/net/ipv6/netfilter/ip6table_nat.c b/net/ipv6/netfilter/ip6table_nat.c index 84c7f33d0cf8..387d8b8fc18d 100644 --- a/net/ipv6/netfilter/ip6table_nat.c +++ b/net/ipv6/netfilter/ip6table_nat.c | |||
@@ -90,17 +90,9 @@ nf_nat_ipv6_fn(const struct nf_hook_ops *ops, | |||
90 | if (nf_ct_is_untracked(ct)) | 90 | if (nf_ct_is_untracked(ct)) |
91 | return NF_ACCEPT; | 91 | return NF_ACCEPT; |
92 | 92 | ||
93 | nat = nfct_nat(ct); | 93 | nat = nf_ct_nat_ext_add(ct); |
94 | if (!nat) { | 94 | if (nat == NULL) |
95 | /* NAT module was loaded late. */ | 95 | return NF_ACCEPT; |
96 | if (nf_ct_is_confirmed(ct)) | ||
97 | return NF_ACCEPT; | ||
98 | nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC); | ||
99 | if (nat == NULL) { | ||
100 | pr_debug("failed to add NAT extension\n"); | ||
101 | return NF_ACCEPT; | ||
102 | } | ||
103 | } | ||
104 | 96 | ||
105 | switch (ctinfo) { | 97 | switch (ctinfo) { |
106 | case IP_CT_RELATED: | 98 | case IP_CT_RELATED: |
diff --git a/net/ipv6/netfilter/nft_chain_nat_ipv6.c b/net/ipv6/netfilter/nft_chain_nat_ipv6.c index 9c3297a768fd..d189fcb437fe 100644 --- a/net/ipv6/netfilter/nft_chain_nat_ipv6.c +++ b/net/ipv6/netfilter/nft_chain_nat_ipv6.c | |||
@@ -47,15 +47,9 @@ static unsigned int nf_nat_ipv6_fn(const struct nf_hook_ops *ops, | |||
47 | if (ct == NULL || nf_ct_is_untracked(ct)) | 47 | if (ct == NULL || nf_ct_is_untracked(ct)) |
48 | return NF_ACCEPT; | 48 | return NF_ACCEPT; |
49 | 49 | ||
50 | nat = nfct_nat(ct); | 50 | nat = nf_ct_nat_ext_add(ct); |
51 | if (nat == NULL) { | 51 | if (nat == NULL) |
52 | /* Conntrack module was loaded late, can't add extension. */ | 52 | return NF_ACCEPT; |
53 | if (nf_ct_is_confirmed(ct)) | ||
54 | return NF_ACCEPT; | ||
55 | nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC); | ||
56 | if (nat == NULL) | ||
57 | return NF_ACCEPT; | ||
58 | } | ||
59 | 53 | ||
60 | switch (ctinfo) { | 54 | switch (ctinfo) { |
61 | case IP_CT_RELATED: | 55 | case IP_CT_RELATED: |
diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c index 52ca952b802c..09096a670c45 100644 --- a/net/netfilter/nf_nat_core.c +++ b/net/netfilter/nf_nat_core.c | |||
@@ -358,6 +358,19 @@ out: | |||
358 | rcu_read_unlock(); | 358 | rcu_read_unlock(); |
359 | } | 359 | } |
360 | 360 | ||
361 | struct nf_conn_nat *nf_ct_nat_ext_add(struct nf_conn *ct) | ||
362 | { | ||
363 | struct nf_conn_nat *nat = nfct_nat(ct); | ||
364 | if (nat) | ||
365 | return nat; | ||
366 | |||
367 | if (!nf_ct_is_confirmed(ct)) | ||
368 | nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC); | ||
369 | |||
370 | return nat; | ||
371 | } | ||
372 | EXPORT_SYMBOL_GPL(nf_ct_nat_ext_add); | ||
373 | |||
361 | unsigned int | 374 | unsigned int |
362 | nf_nat_setup_info(struct nf_conn *ct, | 375 | nf_nat_setup_info(struct nf_conn *ct, |
363 | const struct nf_nat_range *range, | 376 | const struct nf_nat_range *range, |
@@ -368,14 +381,9 @@ nf_nat_setup_info(struct nf_conn *ct, | |||
368 | struct nf_conn_nat *nat; | 381 | struct nf_conn_nat *nat; |
369 | 382 | ||
370 | /* nat helper or nfctnetlink also setup binding */ | 383 | /* nat helper or nfctnetlink also setup binding */ |
371 | nat = nfct_nat(ct); | 384 | nat = nf_ct_nat_ext_add(ct); |
372 | if (!nat) { | 385 | if (nat == NULL) |
373 | nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC); | 386 | return NF_ACCEPT; |
374 | if (nat == NULL) { | ||
375 | pr_debug("failed to add NAT extension\n"); | ||
376 | return NF_ACCEPT; | ||
377 | } | ||
378 | } | ||
379 | 387 | ||
380 | NF_CT_ASSERT(maniptype == NF_NAT_MANIP_SRC || | 388 | NF_CT_ASSERT(maniptype == NF_NAT_MANIP_SRC || |
381 | maniptype == NF_NAT_MANIP_DST); | 389 | maniptype == NF_NAT_MANIP_DST); |