diff options
author | David S. Miller <davem@davemloft.net> | 2008-11-28 05:19:15 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-11-28 05:19:15 -0500 |
commit | ed77a89c30fa03dcb234a84ddea710b3fb7b62da (patch) | |
tree | 69f3e2c2bbf2fdd4f742e891441f01307d1d1f49 /net/ipv4 | |
parent | 475ad8e2172d7f8b73af5532a8dad265b51339c2 (diff) | |
parent | d6e8cc6cc7ac77b0f9118f78c453a2e834e62709 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-next-2.6
Conflicts:
net/netfilter/nf_conntrack_netlink.c
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/netfilter.c | 3 | ||||
-rw-r--r-- | net/ipv4/netfilter/arptable_filter.c | 12 | ||||
-rw-r--r-- | net/ipv4/netfilter/ipt_addrtype.c | 16 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_rule.c | 23 |
4 files changed, 13 insertions, 41 deletions
diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c index c99eecf89da5..fdf6811c31a2 100644 --- a/net/ipv4/netfilter.c +++ b/net/ipv4/netfilter.c | |||
@@ -125,6 +125,7 @@ struct ip_rt_info { | |||
125 | __be32 daddr; | 125 | __be32 daddr; |
126 | __be32 saddr; | 126 | __be32 saddr; |
127 | u_int8_t tos; | 127 | u_int8_t tos; |
128 | u_int32_t mark; | ||
128 | }; | 129 | }; |
129 | 130 | ||
130 | static void nf_ip_saveroute(const struct sk_buff *skb, | 131 | static void nf_ip_saveroute(const struct sk_buff *skb, |
@@ -138,6 +139,7 @@ static void nf_ip_saveroute(const struct sk_buff *skb, | |||
138 | rt_info->tos = iph->tos; | 139 | rt_info->tos = iph->tos; |
139 | rt_info->daddr = iph->daddr; | 140 | rt_info->daddr = iph->daddr; |
140 | rt_info->saddr = iph->saddr; | 141 | rt_info->saddr = iph->saddr; |
142 | rt_info->mark = skb->mark; | ||
141 | } | 143 | } |
142 | } | 144 | } |
143 | 145 | ||
@@ -150,6 +152,7 @@ static int nf_ip_reroute(struct sk_buff *skb, | |||
150 | const struct iphdr *iph = ip_hdr(skb); | 152 | const struct iphdr *iph = ip_hdr(skb); |
151 | 153 | ||
152 | if (!(iph->tos == rt_info->tos | 154 | if (!(iph->tos == rt_info->tos |
155 | && skb->mark == rt_info->mark | ||
153 | && iph->daddr == rt_info->daddr | 156 | && iph->daddr == rt_info->daddr |
154 | && iph->saddr == rt_info->saddr)) | 157 | && iph->saddr == rt_info->saddr)) |
155 | return ip_route_me_harder(skb, RTN_UNSPEC); | 158 | return ip_route_me_harder(skb, RTN_UNSPEC); |
diff --git a/net/ipv4/netfilter/arptable_filter.c b/net/ipv4/netfilter/arptable_filter.c index bee3d117661a..e091187e864f 100644 --- a/net/ipv4/netfilter/arptable_filter.c +++ b/net/ipv4/netfilter/arptable_filter.c | |||
@@ -75,16 +75,6 @@ static unsigned int arpt_out_hook(unsigned int hook, | |||
75 | dev_net(out)->ipv4.arptable_filter); | 75 | dev_net(out)->ipv4.arptable_filter); |
76 | } | 76 | } |
77 | 77 | ||
78 | static unsigned int arpt_forward_hook(unsigned int hook, | ||
79 | struct sk_buff *skb, | ||
80 | const struct net_device *in, | ||
81 | const struct net_device *out, | ||
82 | int (*okfn)(struct sk_buff *)) | ||
83 | { | ||
84 | return arpt_do_table(skb, hook, in, out, | ||
85 | dev_net(in)->ipv4.arptable_filter); | ||
86 | } | ||
87 | |||
88 | static struct nf_hook_ops arpt_ops[] __read_mostly = { | 78 | static struct nf_hook_ops arpt_ops[] __read_mostly = { |
89 | { | 79 | { |
90 | .hook = arpt_in_hook, | 80 | .hook = arpt_in_hook, |
@@ -101,7 +91,7 @@ static struct nf_hook_ops arpt_ops[] __read_mostly = { | |||
101 | .priority = NF_IP_PRI_FILTER, | 91 | .priority = NF_IP_PRI_FILTER, |
102 | }, | 92 | }, |
103 | { | 93 | { |
104 | .hook = arpt_forward_hook, | 94 | .hook = arpt_in_hook, |
105 | .owner = THIS_MODULE, | 95 | .owner = THIS_MODULE, |
106 | .pf = NFPROTO_ARP, | 96 | .pf = NFPROTO_ARP, |
107 | .hooknum = NF_ARP_FORWARD, | 97 | .hooknum = NF_ARP_FORWARD, |
diff --git a/net/ipv4/netfilter/ipt_addrtype.c b/net/ipv4/netfilter/ipt_addrtype.c index 88762f02779d..3b216be3bc9f 100644 --- a/net/ipv4/netfilter/ipt_addrtype.c +++ b/net/ipv4/netfilter/ipt_addrtype.c | |||
@@ -23,24 +23,25 @@ MODULE_LICENSE("GPL"); | |||
23 | MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>"); | 23 | MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>"); |
24 | MODULE_DESCRIPTION("Xtables: address type match for IPv4"); | 24 | MODULE_DESCRIPTION("Xtables: address type match for IPv4"); |
25 | 25 | ||
26 | static inline bool match_type(const struct net_device *dev, __be32 addr, | 26 | static inline bool match_type(struct net *net, const struct net_device *dev, |
27 | u_int16_t mask) | 27 | __be32 addr, u_int16_t mask) |
28 | { | 28 | { |
29 | return !!(mask & (1 << inet_dev_addr_type(&init_net, dev, addr))); | 29 | return !!(mask & (1 << inet_dev_addr_type(net, dev, addr))); |
30 | } | 30 | } |
31 | 31 | ||
32 | static bool | 32 | static bool |
33 | addrtype_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) | 33 | addrtype_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
34 | { | 34 | { |
35 | struct net *net = dev_net(par->in ? par->in : par->out); | ||
35 | const struct ipt_addrtype_info *info = par->matchinfo; | 36 | const struct ipt_addrtype_info *info = par->matchinfo; |
36 | const struct iphdr *iph = ip_hdr(skb); | 37 | const struct iphdr *iph = ip_hdr(skb); |
37 | bool ret = true; | 38 | bool ret = true; |
38 | 39 | ||
39 | if (info->source) | 40 | if (info->source) |
40 | ret &= match_type(NULL, iph->saddr, info->source) ^ | 41 | ret &= match_type(net, NULL, iph->saddr, info->source) ^ |
41 | info->invert_source; | 42 | info->invert_source; |
42 | if (info->dest) | 43 | if (info->dest) |
43 | ret &= match_type(NULL, iph->daddr, info->dest) ^ | 44 | ret &= match_type(net, NULL, iph->daddr, info->dest) ^ |
44 | info->invert_dest; | 45 | info->invert_dest; |
45 | 46 | ||
46 | return ret; | 47 | return ret; |
@@ -49,6 +50,7 @@ addrtype_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) | |||
49 | static bool | 50 | static bool |
50 | addrtype_mt_v1(const struct sk_buff *skb, const struct xt_match_param *par) | 51 | addrtype_mt_v1(const struct sk_buff *skb, const struct xt_match_param *par) |
51 | { | 52 | { |
53 | struct net *net = dev_net(par->in ? par->in : par->out); | ||
52 | const struct ipt_addrtype_info_v1 *info = par->matchinfo; | 54 | const struct ipt_addrtype_info_v1 *info = par->matchinfo; |
53 | const struct iphdr *iph = ip_hdr(skb); | 55 | const struct iphdr *iph = ip_hdr(skb); |
54 | const struct net_device *dev = NULL; | 56 | const struct net_device *dev = NULL; |
@@ -60,10 +62,10 @@ addrtype_mt_v1(const struct sk_buff *skb, const struct xt_match_param *par) | |||
60 | dev = par->out; | 62 | dev = par->out; |
61 | 63 | ||
62 | if (info->source) | 64 | if (info->source) |
63 | ret &= match_type(dev, iph->saddr, info->source) ^ | 65 | ret &= match_type(net, dev, iph->saddr, info->source) ^ |
64 | (info->flags & IPT_ADDRTYPE_INVERT_SOURCE); | 66 | (info->flags & IPT_ADDRTYPE_INVERT_SOURCE); |
65 | if (ret && info->dest) | 67 | if (ret && info->dest) |
66 | ret &= match_type(dev, iph->daddr, info->dest) ^ | 68 | ret &= match_type(net, dev, iph->daddr, info->dest) ^ |
67 | !!(info->flags & IPT_ADDRTYPE_INVERT_DEST); | 69 | !!(info->flags & IPT_ADDRTYPE_INVERT_DEST); |
68 | return ret; | 70 | return ret; |
69 | } | 71 | } |
diff --git a/net/ipv4/netfilter/nf_nat_rule.c b/net/ipv4/netfilter/nf_nat_rule.c index a4f1c3479e23..cf95469ab9f1 100644 --- a/net/ipv4/netfilter/nf_nat_rule.c +++ b/net/ipv4/netfilter/nf_nat_rule.c | |||
@@ -86,24 +86,6 @@ ipt_snat_target(struct sk_buff *skb, const struct xt_target_param *par) | |||
86 | return nf_nat_setup_info(ct, &mr->range[0], IP_NAT_MANIP_SRC); | 86 | return nf_nat_setup_info(ct, &mr->range[0], IP_NAT_MANIP_SRC); |
87 | } | 87 | } |
88 | 88 | ||
89 | /* Before 2.6.11 we did implicit source NAT if required. Warn about change. */ | ||
90 | static void warn_if_extra_mangle(struct net *net, __be32 dstip, __be32 srcip) | ||
91 | { | ||
92 | static int warned = 0; | ||
93 | struct flowi fl = { .nl_u = { .ip4_u = { .daddr = dstip } } }; | ||
94 | struct rtable *rt; | ||
95 | |||
96 | if (ip_route_output_key(net, &rt, &fl) != 0) | ||
97 | return; | ||
98 | |||
99 | if (rt->rt_src != srcip && !warned) { | ||
100 | printk("NAT: no longer support implicit source local NAT\n"); | ||
101 | printk("NAT: packet src %pI4 -> dst %pI4\n", &srcip, &dstip); | ||
102 | warned = 1; | ||
103 | } | ||
104 | ip_rt_put(rt); | ||
105 | } | ||
106 | |||
107 | static unsigned int | 89 | static unsigned int |
108 | ipt_dnat_target(struct sk_buff *skb, const struct xt_target_param *par) | 90 | ipt_dnat_target(struct sk_buff *skb, const struct xt_target_param *par) |
109 | { | 91 | { |
@@ -119,11 +101,6 @@ ipt_dnat_target(struct sk_buff *skb, const struct xt_target_param *par) | |||
119 | /* Connection must be valid and new. */ | 101 | /* Connection must be valid and new. */ |
120 | NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED)); | 102 | NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED)); |
121 | 103 | ||
122 | if (par->hooknum == NF_INET_LOCAL_OUT && | ||
123 | mr->range[0].flags & IP_NAT_RANGE_MAP_IPS) | ||
124 | warn_if_extra_mangle(dev_net(par->out), ip_hdr(skb)->daddr, | ||
125 | mr->range[0].min_ip); | ||
126 | |||
127 | return nf_nat_setup_info(ct, &mr->range[0], IP_NAT_MANIP_DST); | 104 | return nf_nat_setup_info(ct, &mr->range[0], IP_NAT_MANIP_DST); |
128 | } | 105 | } |
129 | 106 | ||