mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
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>
This commit is contained in:
parent
683399eddb
commit
f768e5bdef
@ -48,6 +48,8 @@ unsigned int nf_nat_setup_info(struct nf_conn *ct,
|
||||
extern unsigned int nf_nat_alloc_null_binding(struct nf_conn *ct,
|
||||
unsigned int hooknum);
|
||||
|
||||
struct nf_conn_nat *nf_ct_nat_ext_add(struct nf_conn *ct);
|
||||
|
||||
/* Is this tuple already taken? (not by us)*/
|
||||
int nf_nat_used_tuple(const struct nf_conntrack_tuple *tuple,
|
||||
const struct nf_conn *ignored_conntrack);
|
||||
|
@ -91,17 +91,9 @@ nf_nat_ipv4_fn(const struct nf_hook_ops *ops,
|
||||
if (nf_ct_is_untracked(ct))
|
||||
return NF_ACCEPT;
|
||||
|
||||
nat = nfct_nat(ct);
|
||||
if (!nat) {
|
||||
/* NAT module was loaded late. */
|
||||
if (nf_ct_is_confirmed(ct))
|
||||
return NF_ACCEPT;
|
||||
nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC);
|
||||
if (nat == NULL) {
|
||||
pr_debug("failed to add NAT extension\n");
|
||||
return NF_ACCEPT;
|
||||
}
|
||||
}
|
||||
nat = nf_ct_nat_ext_add(ct);
|
||||
if (nat == NULL)
|
||||
return NF_ACCEPT;
|
||||
|
||||
switch (ctinfo) {
|
||||
case IP_CT_RELATED:
|
||||
|
@ -48,15 +48,9 @@ static unsigned int nf_nat_fn(const struct nf_hook_ops *ops,
|
||||
|
||||
NF_CT_ASSERT(!(ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)));
|
||||
|
||||
nat = nfct_nat(ct);
|
||||
if (nat == NULL) {
|
||||
/* Conntrack module was loaded late, can't add extension. */
|
||||
if (nf_ct_is_confirmed(ct))
|
||||
return NF_ACCEPT;
|
||||
nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC);
|
||||
if (nat == NULL)
|
||||
return NF_ACCEPT;
|
||||
}
|
||||
nat = nf_ct_nat_ext_add(ct);
|
||||
if (nat == NULL)
|
||||
return NF_ACCEPT;
|
||||
|
||||
switch (ctinfo) {
|
||||
case IP_CT_RELATED:
|
||||
|
@ -90,17 +90,9 @@ nf_nat_ipv6_fn(const struct nf_hook_ops *ops,
|
||||
if (nf_ct_is_untracked(ct))
|
||||
return NF_ACCEPT;
|
||||
|
||||
nat = nfct_nat(ct);
|
||||
if (!nat) {
|
||||
/* NAT module was loaded late. */
|
||||
if (nf_ct_is_confirmed(ct))
|
||||
return NF_ACCEPT;
|
||||
nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC);
|
||||
if (nat == NULL) {
|
||||
pr_debug("failed to add NAT extension\n");
|
||||
return NF_ACCEPT;
|
||||
}
|
||||
}
|
||||
nat = nf_ct_nat_ext_add(ct);
|
||||
if (nat == NULL)
|
||||
return NF_ACCEPT;
|
||||
|
||||
switch (ctinfo) {
|
||||
case IP_CT_RELATED:
|
||||
|
@ -47,15 +47,9 @@ static unsigned int nf_nat_ipv6_fn(const struct nf_hook_ops *ops,
|
||||
if (ct == NULL || nf_ct_is_untracked(ct))
|
||||
return NF_ACCEPT;
|
||||
|
||||
nat = nfct_nat(ct);
|
||||
if (nat == NULL) {
|
||||
/* Conntrack module was loaded late, can't add extension. */
|
||||
if (nf_ct_is_confirmed(ct))
|
||||
return NF_ACCEPT;
|
||||
nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC);
|
||||
if (nat == NULL)
|
||||
return NF_ACCEPT;
|
||||
}
|
||||
nat = nf_ct_nat_ext_add(ct);
|
||||
if (nat == NULL)
|
||||
return NF_ACCEPT;
|
||||
|
||||
switch (ctinfo) {
|
||||
case IP_CT_RELATED:
|
||||
|
@ -358,6 +358,19 @@ out:
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
struct nf_conn_nat *nf_ct_nat_ext_add(struct nf_conn *ct)
|
||||
{
|
||||
struct nf_conn_nat *nat = nfct_nat(ct);
|
||||
if (nat)
|
||||
return nat;
|
||||
|
||||
if (!nf_ct_is_confirmed(ct))
|
||||
nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC);
|
||||
|
||||
return nat;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_ct_nat_ext_add);
|
||||
|
||||
unsigned int
|
||||
nf_nat_setup_info(struct nf_conn *ct,
|
||||
const struct nf_nat_range *range,
|
||||
@ -368,14 +381,9 @@ nf_nat_setup_info(struct nf_conn *ct,
|
||||
struct nf_conn_nat *nat;
|
||||
|
||||
/* nat helper or nfctnetlink also setup binding */
|
||||
nat = nfct_nat(ct);
|
||||
if (!nat) {
|
||||
nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC);
|
||||
if (nat == NULL) {
|
||||
pr_debug("failed to add NAT extension\n");
|
||||
return NF_ACCEPT;
|
||||
}
|
||||
}
|
||||
nat = nf_ct_nat_ext_add(ct);
|
||||
if (nat == NULL)
|
||||
return NF_ACCEPT;
|
||||
|
||||
NF_CT_ASSERT(maniptype == NF_NAT_MANIP_SRC ||
|
||||
maniptype == NF_NAT_MANIP_DST);
|
||||
|
Loading…
Reference in New Issue
Block a user