diff options
| author | Eric W. Biederman <ebiederm@xmission.com> | 2015-09-15 21:04:16 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2015-09-17 20:18:37 -0400 |
| commit | 29a26a56803855a79dbd028cd61abee56237d6e5 (patch) | |
| tree | 89fb3a95216d44417577e218a967ede09d676922 /net/decnet | |
| parent | 04eb44890e5bb3cc855e5c0f18a05eb7311364b7 (diff) | |
netfilter: Pass struct net into the netfilter hooks
Pass a network namespace parameter into the netfilter hooks. At the
call site of the netfilter hooks the path a packet is taking through
the network stack is well known which allows the network namespace to
be easily and reliabily.
This allows the replacement of magic code like
"dev_net(state->in?:state->out)" that appears at the start of most
netfilter hooks with "state->net".
In almost all cases the network namespace passed in is derived
from the first network device passed in, guaranteeing those
paths will not see any changes in practice.
The exceptions are:
xfrm/xfrm_output.c:xfrm_output_resume() xs_net(skb_dst(skb)->xfrm)
ipvs/ip_vs_xmit.c:ip_vs_nat_send_or_cont() ip_vs_conn_net(cp)
ipvs/ip_vs_xmit.c:ip_vs_send_or_cont() ip_vs_conn_net(cp)
ipv4/raw.c:raw_send_hdrinc() sock_net(sk)
ipv6/ip6_output.c:ip6_xmit() sock_net(sk)
ipv6/ndisc.c:ndisc_send_skb() dev_net(skb->dev) not dev_net(dst->dev)
ipv6/raw.c:raw6_send_hdrinc() sock_net(sk)
br_netfilter_hooks.c:br_nf_pre_routing_finish() dev_net(skb->dev) before skb->dev is set to nf_bridge->physindev
In all cases these exceptions seem to be a better expression for the
network namespace the packet is being processed in then the historic
"dev_net(in?in:out)". I am documenting them in case something odd
pops up and someone starts trying to track down what happened.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/decnet')
| -rw-r--r-- | net/decnet/dn_neigh.c | 15 | ||||
| -rw-r--r-- | net/decnet/dn_nsp_in.c | 4 | ||||
| -rw-r--r-- | net/decnet/dn_route.c | 24 |
3 files changed, 23 insertions, 20 deletions
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c index 4507b188fc51..305ab2fe25cd 100644 --- a/net/decnet/dn_neigh.c +++ b/net/decnet/dn_neigh.c | |||
| @@ -246,8 +246,9 @@ static int dn_long_output(struct neighbour *neigh, struct sock *sk, | |||
| 246 | 246 | ||
| 247 | skb_reset_network_header(skb); | 247 | skb_reset_network_header(skb); |
| 248 | 248 | ||
| 249 | return NF_HOOK(NFPROTO_DECNET, NF_DN_POST_ROUTING, sk, skb, | 249 | return NF_HOOK(NFPROTO_DECNET, NF_DN_POST_ROUTING, |
| 250 | NULL, neigh->dev, dn_neigh_output_packet); | 250 | &init_net, sk, skb, NULL, neigh->dev, |
| 251 | dn_neigh_output_packet); | ||
| 251 | } | 252 | } |
| 252 | 253 | ||
| 253 | /* | 254 | /* |
| @@ -286,8 +287,9 @@ static int dn_short_output(struct neighbour *neigh, struct sock *sk, | |||
| 286 | 287 | ||
| 287 | skb_reset_network_header(skb); | 288 | skb_reset_network_header(skb); |
| 288 | 289 | ||
| 289 | return NF_HOOK(NFPROTO_DECNET, NF_DN_POST_ROUTING, sk, skb, | 290 | return NF_HOOK(NFPROTO_DECNET, NF_DN_POST_ROUTING, |
| 290 | NULL, neigh->dev, dn_neigh_output_packet); | 291 | &init_net, sk, skb, NULL, neigh->dev, |
| 292 | dn_neigh_output_packet); | ||
| 291 | } | 293 | } |
| 292 | 294 | ||
| 293 | /* | 295 | /* |
| @@ -327,8 +329,9 @@ static int dn_phase3_output(struct neighbour *neigh, struct sock *sk, | |||
| 327 | 329 | ||
| 328 | skb_reset_network_header(skb); | 330 | skb_reset_network_header(skb); |
| 329 | 331 | ||
| 330 | return NF_HOOK(NFPROTO_DECNET, NF_DN_POST_ROUTING, sk, skb, | 332 | return NF_HOOK(NFPROTO_DECNET, NF_DN_POST_ROUTING, |
| 331 | NULL, neigh->dev, dn_neigh_output_packet); | 333 | &init_net, sk, skb, NULL, neigh->dev, |
| 334 | dn_neigh_output_packet); | ||
| 332 | } | 335 | } |
| 333 | 336 | ||
| 334 | int dn_to_neigh_output(struct sock *sk, struct sk_buff *skb) | 337 | int dn_to_neigh_output(struct sock *sk, struct sk_buff *skb) |
diff --git a/net/decnet/dn_nsp_in.c b/net/decnet/dn_nsp_in.c index a321eac9fd0c..e7b0605ca34a 100644 --- a/net/decnet/dn_nsp_in.c +++ b/net/decnet/dn_nsp_in.c | |||
| @@ -814,8 +814,8 @@ free_out: | |||
| 814 | 814 | ||
| 815 | int dn_nsp_rx(struct sk_buff *skb) | 815 | int dn_nsp_rx(struct sk_buff *skb) |
| 816 | { | 816 | { |
| 817 | return NF_HOOK(NFPROTO_DECNET, NF_DN_LOCAL_IN, NULL, skb, | 817 | return NF_HOOK(NFPROTO_DECNET, NF_DN_LOCAL_IN, |
| 818 | skb->dev, NULL, | 818 | &init_net, NULL, skb, skb->dev, NULL, |
| 819 | dn_nsp_rx_packet); | 819 | dn_nsp_rx_packet); |
| 820 | } | 820 | } |
| 821 | 821 | ||
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 03227ffd19ce..fefcd2e85ef9 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
| @@ -573,8 +573,8 @@ static int dn_route_rx_long(struct sk_buff *skb) | |||
| 573 | ptr++; | 573 | ptr++; |
| 574 | cb->hops = *ptr++; /* Visit Count */ | 574 | cb->hops = *ptr++; /* Visit Count */ |
| 575 | 575 | ||
| 576 | return NF_HOOK(NFPROTO_DECNET, NF_DN_PRE_ROUTING, NULL, skb, | 576 | return NF_HOOK(NFPROTO_DECNET, NF_DN_PRE_ROUTING, |
| 577 | skb->dev, NULL, | 577 | &init_net, NULL, skb, skb->dev, NULL, |
| 578 | dn_route_rx_packet); | 578 | dn_route_rx_packet); |
| 579 | 579 | ||
| 580 | drop_it: | 580 | drop_it: |
| @@ -601,8 +601,8 @@ static int dn_route_rx_short(struct sk_buff *skb) | |||
| 601 | ptr += 2; | 601 | ptr += 2; |
| 602 | cb->hops = *ptr & 0x3f; | 602 | cb->hops = *ptr & 0x3f; |
| 603 | 603 | ||
| 604 | return NF_HOOK(NFPROTO_DECNET, NF_DN_PRE_ROUTING, NULL, skb, | 604 | return NF_HOOK(NFPROTO_DECNET, NF_DN_PRE_ROUTING, |
| 605 | skb->dev, NULL, | 605 | &init_net, NULL, skb, skb->dev, NULL, |
| 606 | dn_route_rx_packet); | 606 | dn_route_rx_packet); |
| 607 | 607 | ||
| 608 | drop_it: | 608 | drop_it: |
| @@ -706,22 +706,22 @@ int dn_route_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type | |||
| 706 | switch (flags & DN_RT_CNTL_MSK) { | 706 | switch (flags & DN_RT_CNTL_MSK) { |
| 707 | case DN_RT_PKT_HELO: | 707 | case DN_RT_PKT_HELO: |
| 708 | return NF_HOOK(NFPROTO_DECNET, NF_DN_HELLO, | 708 | return NF_HOOK(NFPROTO_DECNET, NF_DN_HELLO, |
| 709 | NULL, skb, skb->dev, NULL, | 709 | &init_net, NULL, skb, skb->dev, NULL, |
| 710 | dn_route_ptp_hello); | 710 | dn_route_ptp_hello); |
| 711 | 711 | ||
| 712 | case DN_RT_PKT_L1RT: | 712 | case DN_RT_PKT_L1RT: |
| 713 | case DN_RT_PKT_L2RT: | 713 | case DN_RT_PKT_L2RT: |
| 714 | return NF_HOOK(NFPROTO_DECNET, NF_DN_ROUTE, | 714 | return NF_HOOK(NFPROTO_DECNET, NF_DN_ROUTE, |
| 715 | NULL, skb, skb->dev, NULL, | 715 | &init_net, NULL, skb, skb->dev, NULL, |
| 716 | dn_route_discard); | 716 | dn_route_discard); |
| 717 | case DN_RT_PKT_ERTH: | 717 | case DN_RT_PKT_ERTH: |
| 718 | return NF_HOOK(NFPROTO_DECNET, NF_DN_HELLO, | 718 | return NF_HOOK(NFPROTO_DECNET, NF_DN_HELLO, |
| 719 | NULL, skb, skb->dev, NULL, | 719 | &init_net, NULL, skb, skb->dev, NULL, |
| 720 | dn_neigh_router_hello); | 720 | dn_neigh_router_hello); |
| 721 | 721 | ||
| 722 | case DN_RT_PKT_EEDH: | 722 | case DN_RT_PKT_EEDH: |
| 723 | return NF_HOOK(NFPROTO_DECNET, NF_DN_HELLO, | 723 | return NF_HOOK(NFPROTO_DECNET, NF_DN_HELLO, |
| 724 | NULL, skb, skb->dev, NULL, | 724 | &init_net, NULL, skb, skb->dev, NULL, |
| 725 | dn_neigh_endnode_hello); | 725 | dn_neigh_endnode_hello); |
| 726 | } | 726 | } |
| 727 | } else { | 727 | } else { |
| @@ -770,8 +770,8 @@ static int dn_output(struct sock *sk, struct sk_buff *skb) | |||
| 770 | cb->rt_flags |= DN_RT_F_IE; | 770 | cb->rt_flags |= DN_RT_F_IE; |
| 771 | cb->hops = 0; | 771 | cb->hops = 0; |
| 772 | 772 | ||
| 773 | return NF_HOOK(NFPROTO_DECNET, NF_DN_LOCAL_OUT, sk, skb, | 773 | return NF_HOOK(NFPROTO_DECNET, NF_DN_LOCAL_OUT, |
| 774 | NULL, dev, | 774 | &init_net, sk, skb, NULL, dev, |
| 775 | dn_to_neigh_output); | 775 | dn_to_neigh_output); |
| 776 | 776 | ||
| 777 | error: | 777 | error: |
| @@ -819,8 +819,8 @@ static int dn_forward(struct sk_buff *skb) | |||
| 819 | if (rt->rt_flags & RTCF_DOREDIRECT) | 819 | if (rt->rt_flags & RTCF_DOREDIRECT) |
| 820 | cb->rt_flags |= DN_RT_F_IE; | 820 | cb->rt_flags |= DN_RT_F_IE; |
| 821 | 821 | ||
| 822 | return NF_HOOK(NFPROTO_DECNET, NF_DN_FORWARD, NULL, skb, | 822 | return NF_HOOK(NFPROTO_DECNET, NF_DN_FORWARD, |
| 823 | dev, skb->dev, | 823 | &init_net, NULL, skb, dev, skb->dev, |
| 824 | dn_to_neigh_output); | 824 | dn_to_neigh_output); |
| 825 | 825 | ||
| 826 | drop: | 826 | drop: |
