diff options
author | David S. Miller <davem@davemloft.net> | 2015-04-03 21:05:07 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-04-04 12:48:08 -0400 |
commit | 8fe22382d1e73dc0ded8098ccf761c986149f72b (patch) | |
tree | 72624c6be3ec17dd66f015d20b65eb8c00ca1907 /net/ipv6 | |
parent | 1c491ba2592f621f21a693d43fab06302527fc0f (diff) |
netfilter: Pass nf_hook_state through nf_nat_ipv6_{in,out,fn,local_fn}().
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/netfilter/ip6table_nat.c | 18 | ||||
-rw-r--r-- | net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | 32 | ||||
-rw-r--r-- | net/ipv6/netfilter/nft_chain_nat_ipv6.c | 13 |
3 files changed, 27 insertions, 36 deletions
diff --git a/net/ipv6/netfilter/ip6table_nat.c b/net/ipv6/netfilter/ip6table_nat.c index e32b0d0315e6..d78f69c7abce 100644 --- a/net/ipv6/netfilter/ip6table_nat.c +++ b/net/ipv6/netfilter/ip6table_nat.c | |||
@@ -32,45 +32,41 @@ static const struct xt_table nf_nat_ipv6_table = { | |||
32 | 32 | ||
33 | static unsigned int ip6table_nat_do_chain(const struct nf_hook_ops *ops, | 33 | static unsigned int ip6table_nat_do_chain(const struct nf_hook_ops *ops, |
34 | struct sk_buff *skb, | 34 | struct sk_buff *skb, |
35 | const struct net_device *in, | 35 | const struct nf_hook_state *state, |
36 | const struct net_device *out, | ||
37 | struct nf_conn *ct) | 36 | struct nf_conn *ct) |
38 | { | 37 | { |
39 | struct net *net = nf_ct_net(ct); | 38 | struct net *net = nf_ct_net(ct); |
40 | 39 | ||
41 | return ip6t_do_table(skb, ops->hooknum, in, out, net->ipv6.ip6table_nat); | 40 | return ip6t_do_table(skb, ops->hooknum, state->in, state->out, |
41 | net->ipv6.ip6table_nat); | ||
42 | } | 42 | } |
43 | 43 | ||
44 | static unsigned int ip6table_nat_fn(const struct nf_hook_ops *ops, | 44 | static unsigned int ip6table_nat_fn(const struct nf_hook_ops *ops, |
45 | struct sk_buff *skb, | 45 | struct sk_buff *skb, |
46 | const struct nf_hook_state *state) | 46 | const struct nf_hook_state *state) |
47 | { | 47 | { |
48 | return nf_nat_ipv6_fn(ops, skb, state->in, state->out, | 48 | return nf_nat_ipv6_fn(ops, skb, state, ip6table_nat_do_chain); |
49 | ip6table_nat_do_chain); | ||
50 | } | 49 | } |
51 | 50 | ||
52 | static unsigned int ip6table_nat_in(const struct nf_hook_ops *ops, | 51 | static unsigned int ip6table_nat_in(const struct nf_hook_ops *ops, |
53 | struct sk_buff *skb, | 52 | struct sk_buff *skb, |
54 | const struct nf_hook_state *state) | 53 | const struct nf_hook_state *state) |
55 | { | 54 | { |
56 | return nf_nat_ipv6_in(ops, skb, state->in, state->out, | 55 | return nf_nat_ipv6_in(ops, skb, state, ip6table_nat_do_chain); |
57 | ip6table_nat_do_chain); | ||
58 | } | 56 | } |
59 | 57 | ||
60 | static unsigned int ip6table_nat_out(const struct nf_hook_ops *ops, | 58 | static unsigned int ip6table_nat_out(const struct nf_hook_ops *ops, |
61 | struct sk_buff *skb, | 59 | struct sk_buff *skb, |
62 | const struct nf_hook_state *state) | 60 | const struct nf_hook_state *state) |
63 | { | 61 | { |
64 | return nf_nat_ipv6_out(ops, skb, state->in, state->out, | 62 | return nf_nat_ipv6_out(ops, skb, state, ip6table_nat_do_chain); |
65 | ip6table_nat_do_chain); | ||
66 | } | 63 | } |
67 | 64 | ||
68 | static unsigned int ip6table_nat_local_fn(const struct nf_hook_ops *ops, | 65 | static unsigned int ip6table_nat_local_fn(const struct nf_hook_ops *ops, |
69 | struct sk_buff *skb, | 66 | struct sk_buff *skb, |
70 | const struct nf_hook_state *state) | 67 | const struct nf_hook_state *state) |
71 | { | 68 | { |
72 | return nf_nat_ipv6_local_fn(ops, skb, state->in, state->out, | 69 | return nf_nat_ipv6_local_fn(ops, skb, state, ip6table_nat_do_chain); |
73 | ip6table_nat_do_chain); | ||
74 | } | 70 | } |
75 | 71 | ||
76 | static struct nf_hook_ops nf_nat_ipv6_ops[] __read_mostly = { | 72 | static struct nf_hook_ops nf_nat_ipv6_ops[] __read_mostly = { |
diff --git a/net/ipv6/netfilter/nf_nat_l3proto_ipv6.c b/net/ipv6/netfilter/nf_nat_l3proto_ipv6.c index c5812e1c1ffb..e76900e0aa92 100644 --- a/net/ipv6/netfilter/nf_nat_l3proto_ipv6.c +++ b/net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | |||
@@ -263,11 +263,10 @@ EXPORT_SYMBOL_GPL(nf_nat_icmpv6_reply_translation); | |||
263 | 263 | ||
264 | unsigned int | 264 | unsigned int |
265 | nf_nat_ipv6_fn(const struct nf_hook_ops *ops, struct sk_buff *skb, | 265 | nf_nat_ipv6_fn(const struct nf_hook_ops *ops, struct sk_buff *skb, |
266 | const struct net_device *in, const struct net_device *out, | 266 | const struct nf_hook_state *state, |
267 | unsigned int (*do_chain)(const struct nf_hook_ops *ops, | 267 | unsigned int (*do_chain)(const struct nf_hook_ops *ops, |
268 | struct sk_buff *skb, | 268 | struct sk_buff *skb, |
269 | const struct net_device *in, | 269 | const struct nf_hook_state *state, |
270 | const struct net_device *out, | ||
271 | struct nf_conn *ct)) | 270 | struct nf_conn *ct)) |
272 | { | 271 | { |
273 | struct nf_conn *ct; | 272 | struct nf_conn *ct; |
@@ -318,7 +317,7 @@ nf_nat_ipv6_fn(const struct nf_hook_ops *ops, struct sk_buff *skb, | |||
318 | if (!nf_nat_initialized(ct, maniptype)) { | 317 | if (!nf_nat_initialized(ct, maniptype)) { |
319 | unsigned int ret; | 318 | unsigned int ret; |
320 | 319 | ||
321 | ret = do_chain(ops, skb, in, out, ct); | 320 | ret = do_chain(ops, skb, state, ct); |
322 | if (ret != NF_ACCEPT) | 321 | if (ret != NF_ACCEPT) |
323 | return ret; | 322 | return ret; |
324 | 323 | ||
@@ -332,7 +331,7 @@ nf_nat_ipv6_fn(const struct nf_hook_ops *ops, struct sk_buff *skb, | |||
332 | pr_debug("Already setup manip %s for ct %p\n", | 331 | pr_debug("Already setup manip %s for ct %p\n", |
333 | maniptype == NF_NAT_MANIP_SRC ? "SRC" : "DST", | 332 | maniptype == NF_NAT_MANIP_SRC ? "SRC" : "DST", |
334 | ct); | 333 | ct); |
335 | if (nf_nat_oif_changed(ops->hooknum, ctinfo, nat, out)) | 334 | if (nf_nat_oif_changed(ops->hooknum, ctinfo, nat, state->out)) |
336 | goto oif_changed; | 335 | goto oif_changed; |
337 | } | 336 | } |
338 | break; | 337 | break; |
@@ -341,7 +340,7 @@ nf_nat_ipv6_fn(const struct nf_hook_ops *ops, struct sk_buff *skb, | |||
341 | /* ESTABLISHED */ | 340 | /* ESTABLISHED */ |
342 | NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED || | 341 | NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED || |
343 | ctinfo == IP_CT_ESTABLISHED_REPLY); | 342 | ctinfo == IP_CT_ESTABLISHED_REPLY); |
344 | if (nf_nat_oif_changed(ops->hooknum, ctinfo, nat, out)) | 343 | if (nf_nat_oif_changed(ops->hooknum, ctinfo, nat, state->out)) |
345 | goto oif_changed; | 344 | goto oif_changed; |
346 | } | 345 | } |
347 | 346 | ||
@@ -355,17 +354,16 @@ EXPORT_SYMBOL_GPL(nf_nat_ipv6_fn); | |||
355 | 354 | ||
356 | unsigned int | 355 | unsigned int |
357 | nf_nat_ipv6_in(const struct nf_hook_ops *ops, struct sk_buff *skb, | 356 | nf_nat_ipv6_in(const struct nf_hook_ops *ops, struct sk_buff *skb, |
358 | const struct net_device *in, const struct net_device *out, | 357 | const struct nf_hook_state *state, |
359 | unsigned int (*do_chain)(const struct nf_hook_ops *ops, | 358 | unsigned int (*do_chain)(const struct nf_hook_ops *ops, |
360 | struct sk_buff *skb, | 359 | struct sk_buff *skb, |
361 | const struct net_device *in, | 360 | const struct nf_hook_state *state, |
362 | const struct net_device *out, | ||
363 | struct nf_conn *ct)) | 361 | struct nf_conn *ct)) |
364 | { | 362 | { |
365 | unsigned int ret; | 363 | unsigned int ret; |
366 | struct in6_addr daddr = ipv6_hdr(skb)->daddr; | 364 | struct in6_addr daddr = ipv6_hdr(skb)->daddr; |
367 | 365 | ||
368 | ret = nf_nat_ipv6_fn(ops, skb, in, out, do_chain); | 366 | ret = nf_nat_ipv6_fn(ops, skb, state, do_chain); |
369 | if (ret != NF_DROP && ret != NF_STOLEN && | 367 | if (ret != NF_DROP && ret != NF_STOLEN && |
370 | ipv6_addr_cmp(&daddr, &ipv6_hdr(skb)->daddr)) | 368 | ipv6_addr_cmp(&daddr, &ipv6_hdr(skb)->daddr)) |
371 | skb_dst_drop(skb); | 369 | skb_dst_drop(skb); |
@@ -376,11 +374,10 @@ EXPORT_SYMBOL_GPL(nf_nat_ipv6_in); | |||
376 | 374 | ||
377 | unsigned int | 375 | unsigned int |
378 | nf_nat_ipv6_out(const struct nf_hook_ops *ops, struct sk_buff *skb, | 376 | nf_nat_ipv6_out(const struct nf_hook_ops *ops, struct sk_buff *skb, |
379 | const struct net_device *in, const struct net_device *out, | 377 | const struct nf_hook_state *state, |
380 | unsigned int (*do_chain)(const struct nf_hook_ops *ops, | 378 | unsigned int (*do_chain)(const struct nf_hook_ops *ops, |
381 | struct sk_buff *skb, | 379 | struct sk_buff *skb, |
382 | const struct net_device *in, | 380 | const struct nf_hook_state *state, |
383 | const struct net_device *out, | ||
384 | struct nf_conn *ct)) | 381 | struct nf_conn *ct)) |
385 | { | 382 | { |
386 | #ifdef CONFIG_XFRM | 383 | #ifdef CONFIG_XFRM |
@@ -394,7 +391,7 @@ nf_nat_ipv6_out(const struct nf_hook_ops *ops, struct sk_buff *skb, | |||
394 | if (skb->len < sizeof(struct ipv6hdr)) | 391 | if (skb->len < sizeof(struct ipv6hdr)) |
395 | return NF_ACCEPT; | 392 | return NF_ACCEPT; |
396 | 393 | ||
397 | ret = nf_nat_ipv6_fn(ops, skb, in, out, do_chain); | 394 | ret = nf_nat_ipv6_fn(ops, skb, state, do_chain); |
398 | #ifdef CONFIG_XFRM | 395 | #ifdef CONFIG_XFRM |
399 | if (ret != NF_DROP && ret != NF_STOLEN && | 396 | if (ret != NF_DROP && ret != NF_STOLEN && |
400 | !(IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) && | 397 | !(IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) && |
@@ -418,11 +415,10 @@ EXPORT_SYMBOL_GPL(nf_nat_ipv6_out); | |||
418 | 415 | ||
419 | unsigned int | 416 | unsigned int |
420 | nf_nat_ipv6_local_fn(const struct nf_hook_ops *ops, struct sk_buff *skb, | 417 | nf_nat_ipv6_local_fn(const struct nf_hook_ops *ops, struct sk_buff *skb, |
421 | const struct net_device *in, const struct net_device *out, | 418 | const struct nf_hook_state *state, |
422 | unsigned int (*do_chain)(const struct nf_hook_ops *ops, | 419 | unsigned int (*do_chain)(const struct nf_hook_ops *ops, |
423 | struct sk_buff *skb, | 420 | struct sk_buff *skb, |
424 | const struct net_device *in, | 421 | const struct nf_hook_state *state, |
425 | const struct net_device *out, | ||
426 | struct nf_conn *ct)) | 422 | struct nf_conn *ct)) |
427 | { | 423 | { |
428 | const struct nf_conn *ct; | 424 | const struct nf_conn *ct; |
@@ -434,7 +430,7 @@ nf_nat_ipv6_local_fn(const struct nf_hook_ops *ops, struct sk_buff *skb, | |||
434 | if (skb->len < sizeof(struct ipv6hdr)) | 430 | if (skb->len < sizeof(struct ipv6hdr)) |
435 | return NF_ACCEPT; | 431 | return NF_ACCEPT; |
436 | 432 | ||
437 | ret = nf_nat_ipv6_fn(ops, skb, in, out, do_chain); | 433 | ret = nf_nat_ipv6_fn(ops, skb, state, do_chain); |
438 | if (ret != NF_DROP && ret != NF_STOLEN && | 434 | if (ret != NF_DROP && ret != NF_STOLEN && |
439 | (ct = nf_ct_get(skb, &ctinfo)) != NULL) { | 435 | (ct = nf_ct_get(skb, &ctinfo)) != NULL) { |
440 | enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo); | 436 | enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo); |
diff --git a/net/ipv6/netfilter/nft_chain_nat_ipv6.c b/net/ipv6/netfilter/nft_chain_nat_ipv6.c index f73f4ae25bc2..11c6f75fcc4d 100644 --- a/net/ipv6/netfilter/nft_chain_nat_ipv6.c +++ b/net/ipv6/netfilter/nft_chain_nat_ipv6.c | |||
@@ -26,13 +26,12 @@ | |||
26 | 26 | ||
27 | static unsigned int nft_nat_do_chain(const struct nf_hook_ops *ops, | 27 | static unsigned int nft_nat_do_chain(const struct nf_hook_ops *ops, |
28 | struct sk_buff *skb, | 28 | struct sk_buff *skb, |
29 | const struct net_device *in, | 29 | const struct nf_hook_state *state, |
30 | const struct net_device *out, | ||
31 | struct nf_conn *ct) | 30 | struct nf_conn *ct) |
32 | { | 31 | { |
33 | struct nft_pktinfo pkt; | 32 | struct nft_pktinfo pkt; |
34 | 33 | ||
35 | nft_set_pktinfo_ipv6(&pkt, ops, skb, in, out); | 34 | nft_set_pktinfo_ipv6(&pkt, ops, skb, state->in, state->out); |
36 | 35 | ||
37 | return nft_do_chain(&pkt, ops); | 36 | return nft_do_chain(&pkt, ops); |
38 | } | 37 | } |
@@ -41,28 +40,28 @@ static unsigned int nft_nat_ipv6_fn(const struct nf_hook_ops *ops, | |||
41 | struct sk_buff *skb, | 40 | struct sk_buff *skb, |
42 | const struct nf_hook_state *state) | 41 | const struct nf_hook_state *state) |
43 | { | 42 | { |
44 | return nf_nat_ipv6_fn(ops, skb, state->in, state->out, nft_nat_do_chain); | 43 | return nf_nat_ipv6_fn(ops, skb, state, nft_nat_do_chain); |
45 | } | 44 | } |
46 | 45 | ||
47 | static unsigned int nft_nat_ipv6_in(const struct nf_hook_ops *ops, | 46 | static unsigned int nft_nat_ipv6_in(const struct nf_hook_ops *ops, |
48 | struct sk_buff *skb, | 47 | struct sk_buff *skb, |
49 | const struct nf_hook_state *state) | 48 | const struct nf_hook_state *state) |
50 | { | 49 | { |
51 | return nf_nat_ipv6_in(ops, skb, state->in, state->out, nft_nat_do_chain); | 50 | return nf_nat_ipv6_in(ops, skb, state, nft_nat_do_chain); |
52 | } | 51 | } |
53 | 52 | ||
54 | static unsigned int nft_nat_ipv6_out(const struct nf_hook_ops *ops, | 53 | static unsigned int nft_nat_ipv6_out(const struct nf_hook_ops *ops, |
55 | struct sk_buff *skb, | 54 | struct sk_buff *skb, |
56 | const struct nf_hook_state *state) | 55 | const struct nf_hook_state *state) |
57 | { | 56 | { |
58 | return nf_nat_ipv6_out(ops, skb, state->in, state->out, nft_nat_do_chain); | 57 | return nf_nat_ipv6_out(ops, skb, state, nft_nat_do_chain); |
59 | } | 58 | } |
60 | 59 | ||
61 | static unsigned int nft_nat_ipv6_local_fn(const struct nf_hook_ops *ops, | 60 | static unsigned int nft_nat_ipv6_local_fn(const struct nf_hook_ops *ops, |
62 | struct sk_buff *skb, | 61 | struct sk_buff *skb, |
63 | const struct nf_hook_state *state) | 62 | const struct nf_hook_state *state) |
64 | { | 63 | { |
65 | return nf_nat_ipv6_local_fn(ops, skb, state->in, state->out, nft_nat_do_chain); | 64 | return nf_nat_ipv6_local_fn(ops, skb, state, nft_nat_do_chain); |
66 | } | 65 | } |
67 | 66 | ||
68 | static const struct nf_chain_type nft_chain_nat_ipv6 = { | 67 | static const struct nf_chain_type nft_chain_nat_ipv6 = { |