Blame view
net/ipv4/netfilter/nft_chain_nat_ipv4.c
2.78 KB
96518518c
|
1 |
/* |
ef1f7df91
|
2 |
* Copyright (c) 2008-2009 Patrick McHardy <kaber@trash.net> |
9370761c5
|
3 |
* Copyright (c) 2012 Pablo Neira Ayuso <pablo@netfilter.org> |
eb31628e3
|
4 |
* Copyright (c) 2012 Intel Corporation |
96518518c
|
5 6 7 8 9 10 11 12 13 14 15 16 17 |
* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Development of this code funded by Astaro AG (http://www.astaro.com/) */ #include <linux/module.h> #include <linux/init.h> #include <linux/list.h> #include <linux/skbuff.h> #include <linux/ip.h> |
96518518c
|
18 19 |
#include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> |
96518518c
|
20 21 22 23 24 |
#include <linux/netfilter/nf_tables.h> #include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_nat.h> #include <net/netfilter/nf_nat_core.h> #include <net/netfilter/nf_tables.h> |
0ca743a55
|
25 |
#include <net/netfilter/nf_tables_ipv4.h> |
96518518c
|
26 27 |
#include <net/netfilter/nf_nat_l3proto.h> #include <net/ip.h> |
06198b34a
|
28 |
static unsigned int nft_nat_do_chain(void *priv, |
65cd90ac7
|
29 |
struct sk_buff *skb, |
d7cf4081e
|
30 |
const struct nf_hook_state *state, |
65cd90ac7
|
31 |
struct nf_conn *ct) |
96518518c
|
32 |
{ |
0ca743a55
|
33 |
struct nft_pktinfo pkt; |
96518518c
|
34 |
|
6aa187f21
|
35 |
nft_set_pktinfo_ipv4(&pkt, skb, state); |
0ca743a55
|
36 |
|
06198b34a
|
37 |
return nft_do_chain(&pkt, priv); |
96518518c
|
38 |
} |
06198b34a
|
39 |
static unsigned int nft_nat_ipv4_fn(void *priv, |
65cd90ac7
|
40 |
struct sk_buff *skb, |
238e54c9c
|
41 |
const struct nf_hook_state *state) |
96518518c
|
42 |
{ |
06198b34a
|
43 |
return nf_nat_ipv4_fn(priv, skb, state, nft_nat_do_chain); |
96518518c
|
44 |
} |
06198b34a
|
45 |
static unsigned int nft_nat_ipv4_in(void *priv, |
65cd90ac7
|
46 |
struct sk_buff *skb, |
238e54c9c
|
47 |
const struct nf_hook_state *state) |
96518518c
|
48 |
{ |
06198b34a
|
49 |
return nf_nat_ipv4_in(priv, skb, state, nft_nat_do_chain); |
96518518c
|
50 |
} |
06198b34a
|
51 |
static unsigned int nft_nat_ipv4_out(void *priv, |
65cd90ac7
|
52 |
struct sk_buff *skb, |
238e54c9c
|
53 |
const struct nf_hook_state *state) |
96518518c
|
54 |
{ |
06198b34a
|
55 |
return nf_nat_ipv4_out(priv, skb, state, nft_nat_do_chain); |
65cd90ac7
|
56 |
} |
96518518c
|
57 |
|
06198b34a
|
58 |
static unsigned int nft_nat_ipv4_local_fn(void *priv, |
65cd90ac7
|
59 |
struct sk_buff *skb, |
238e54c9c
|
60 |
const struct nf_hook_state *state) |
65cd90ac7
|
61 |
{ |
06198b34a
|
62 |
return nf_nat_ipv4_local_fn(priv, skb, state, nft_nat_do_chain); |
96518518c
|
63 |
} |
2a37d755b
|
64 |
static const struct nf_chain_type nft_chain_nat_ipv4 = { |
9370761c5
|
65 66 |
.name = "nat", .type = NFT_CHAIN_T_NAT, |
fa2c1de0b
|
67 68 |
.family = NFPROTO_IPV4, .owner = THIS_MODULE, |
9370761c5
|
69 70 71 72 |
.hook_mask = (1 << NF_INET_PRE_ROUTING) | (1 << NF_INET_POST_ROUTING) | (1 << NF_INET_LOCAL_OUT) | (1 << NF_INET_LOCAL_IN), |
fa2c1de0b
|
73 |
.hooks = { |
65cd90ac7
|
74 75 76 77 |
[NF_INET_PRE_ROUTING] = nft_nat_ipv4_in, [NF_INET_POST_ROUTING] = nft_nat_ipv4_out, [NF_INET_LOCAL_OUT] = nft_nat_ipv4_local_fn, [NF_INET_LOCAL_IN] = nft_nat_ipv4_fn, |
96518518c
|
78 79 |
}, }; |
9370761c5
|
80 |
static int __init nft_chain_nat_init(void) |
96518518c
|
81 82 |
{ int err; |
9370761c5
|
83 |
err = nft_register_chain_type(&nft_chain_nat_ipv4); |
96518518c
|
84 |
if (err < 0) |
9370761c5
|
85 |
return err; |
96518518c
|
86 |
|
96518518c
|
87 |
return 0; |
96518518c
|
88 |
} |
9370761c5
|
89 |
static void __exit nft_chain_nat_exit(void) |
96518518c
|
90 |
{ |
9370761c5
|
91 |
nft_unregister_chain_type(&nft_chain_nat_ipv4); |
96518518c
|
92 |
} |
9370761c5
|
93 94 |
module_init(nft_chain_nat_init); module_exit(nft_chain_nat_exit); |
96518518c
|
95 96 97 |
MODULE_LICENSE("GPL"); MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>"); |
9370761c5
|
98 |
MODULE_ALIAS_NFT_CHAIN(AF_INET, "nat"); |