Blame view

net/ipv4/netfilter/nft_chain_nat_ipv4.c 2.78 KB
96518518c   Patrick McHardy   netfilter: add nf...
1
  /*
ef1f7df91   Patrick McHardy   netfilter: nf_tab...
2
   * Copyright (c) 2008-2009 Patrick McHardy <kaber@trash.net>
9370761c5   Pablo Neira Ayuso   netfilter: nf_tab...
3
   * Copyright (c) 2012 Pablo Neira Ayuso <pablo@netfilter.org>
eb31628e3   Tomasz Bursztyka   netfilter: nf_tab...
4
   * Copyright (c) 2012 Intel Corporation
96518518c   Patrick McHardy   netfilter: add nf...
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   Patrick McHardy   netfilter: add nf...
18
19
  #include <linux/netfilter.h>
  #include <linux/netfilter_ipv4.h>
96518518c   Patrick McHardy   netfilter: add nf...
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   Pablo Neira Ayuso   netfilter: nf_tab...
25
  #include <net/netfilter/nf_tables_ipv4.h>
96518518c   Patrick McHardy   netfilter: add nf...
26
27
  #include <net/netfilter/nf_nat_l3proto.h>
  #include <net/ip.h>
06198b34a   Eric W. Biederman   netfilter: Pass p...
28
  static unsigned int nft_nat_do_chain(void *priv,
65cd90ac7   Pablo Neira Ayuso   netfilter: nft_ch...
29
  				      struct sk_buff *skb,
d7cf4081e   David S. Miller   netfilter: Pass n...
30
  				      const struct nf_hook_state *state,
65cd90ac7   Pablo Neira Ayuso   netfilter: nft_ch...
31
  				      struct nf_conn *ct)
96518518c   Patrick McHardy   netfilter: add nf...
32
  {
0ca743a55   Pablo Neira Ayuso   netfilter: nf_tab...
33
  	struct nft_pktinfo pkt;
96518518c   Patrick McHardy   netfilter: add nf...
34

6aa187f21   Eric W. Biederman   netfilter: nf_tab...
35
  	nft_set_pktinfo_ipv4(&pkt, skb, state);
0ca743a55   Pablo Neira Ayuso   netfilter: nf_tab...
36

06198b34a   Eric W. Biederman   netfilter: Pass p...
37
  	return nft_do_chain(&pkt, priv);
96518518c   Patrick McHardy   netfilter: add nf...
38
  }
06198b34a   Eric W. Biederman   netfilter: Pass p...
39
  static unsigned int nft_nat_ipv4_fn(void *priv,
65cd90ac7   Pablo Neira Ayuso   netfilter: nft_ch...
40
  				    struct sk_buff *skb,
238e54c9c   David S. Miller   netfilter: Make n...
41
  				    const struct nf_hook_state *state)
96518518c   Patrick McHardy   netfilter: add nf...
42
  {
06198b34a   Eric W. Biederman   netfilter: Pass p...
43
  	return nf_nat_ipv4_fn(priv, skb, state, nft_nat_do_chain);
96518518c   Patrick McHardy   netfilter: add nf...
44
  }
06198b34a   Eric W. Biederman   netfilter: Pass p...
45
  static unsigned int nft_nat_ipv4_in(void *priv,
65cd90ac7   Pablo Neira Ayuso   netfilter: nft_ch...
46
  				    struct sk_buff *skb,
238e54c9c   David S. Miller   netfilter: Make n...
47
  				    const struct nf_hook_state *state)
96518518c   Patrick McHardy   netfilter: add nf...
48
  {
06198b34a   Eric W. Biederman   netfilter: Pass p...
49
  	return nf_nat_ipv4_in(priv, skb, state, nft_nat_do_chain);
96518518c   Patrick McHardy   netfilter: add nf...
50
  }
06198b34a   Eric W. Biederman   netfilter: Pass p...
51
  static unsigned int nft_nat_ipv4_out(void *priv,
65cd90ac7   Pablo Neira Ayuso   netfilter: nft_ch...
52
  				     struct sk_buff *skb,
238e54c9c   David S. Miller   netfilter: Make n...
53
  				     const struct nf_hook_state *state)
96518518c   Patrick McHardy   netfilter: add nf...
54
  {
06198b34a   Eric W. Biederman   netfilter: Pass p...
55
  	return nf_nat_ipv4_out(priv, skb, state, nft_nat_do_chain);
65cd90ac7   Pablo Neira Ayuso   netfilter: nft_ch...
56
  }
96518518c   Patrick McHardy   netfilter: add nf...
57

06198b34a   Eric W. Biederman   netfilter: Pass p...
58
  static unsigned int nft_nat_ipv4_local_fn(void *priv,
65cd90ac7   Pablo Neira Ayuso   netfilter: nft_ch...
59
  					  struct sk_buff *skb,
238e54c9c   David S. Miller   netfilter: Make n...
60
  					  const struct nf_hook_state *state)
65cd90ac7   Pablo Neira Ayuso   netfilter: nft_ch...
61
  {
06198b34a   Eric W. Biederman   netfilter: Pass p...
62
  	return nf_nat_ipv4_local_fn(priv, skb, state, nft_nat_do_chain);
96518518c   Patrick McHardy   netfilter: add nf...
63
  }
2a37d755b   Patrick McHardy   netfilter: nf_tab...
64
  static const struct nf_chain_type nft_chain_nat_ipv4 = {
9370761c5   Pablo Neira Ayuso   netfilter: nf_tab...
65
66
  	.name		= "nat",
  	.type		= NFT_CHAIN_T_NAT,
fa2c1de0b   Patrick McHardy   netfilter: nf_tab...
67
68
  	.family		= NFPROTO_IPV4,
  	.owner		= THIS_MODULE,
9370761c5   Pablo Neira Ayuso   netfilter: nf_tab...
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   Patrick McHardy   netfilter: nf_tab...
73
  	.hooks		= {
65cd90ac7   Pablo Neira Ayuso   netfilter: nft_ch...
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   Patrick McHardy   netfilter: add nf...
78
79
  	},
  };
9370761c5   Pablo Neira Ayuso   netfilter: nf_tab...
80
  static int __init nft_chain_nat_init(void)
96518518c   Patrick McHardy   netfilter: add nf...
81
82
  {
  	int err;
9370761c5   Pablo Neira Ayuso   netfilter: nf_tab...
83
  	err = nft_register_chain_type(&nft_chain_nat_ipv4);
96518518c   Patrick McHardy   netfilter: add nf...
84
  	if (err < 0)
9370761c5   Pablo Neira Ayuso   netfilter: nf_tab...
85
  		return err;
96518518c   Patrick McHardy   netfilter: add nf...
86

96518518c   Patrick McHardy   netfilter: add nf...
87
  	return 0;
96518518c   Patrick McHardy   netfilter: add nf...
88
  }
9370761c5   Pablo Neira Ayuso   netfilter: nf_tab...
89
  static void __exit nft_chain_nat_exit(void)
96518518c   Patrick McHardy   netfilter: add nf...
90
  {
9370761c5   Pablo Neira Ayuso   netfilter: nf_tab...
91
  	nft_unregister_chain_type(&nft_chain_nat_ipv4);
96518518c   Patrick McHardy   netfilter: add nf...
92
  }
9370761c5   Pablo Neira Ayuso   netfilter: nf_tab...
93
94
  module_init(nft_chain_nat_init);
  module_exit(nft_chain_nat_exit);
96518518c   Patrick McHardy   netfilter: add nf...
95
96
97
  
  MODULE_LICENSE("GPL");
  MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
9370761c5   Pablo Neira Ayuso   netfilter: nf_tab...
98
  MODULE_ALIAS_NFT_CHAIN(AF_INET, "nat");