diff options
author | David S. Miller <davem@davemloft.net> | 2015-04-07 15:29:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-04-07 15:29:30 -0400 |
commit | e0e8db2f89bac4529fa12dde2595d6295e313952 (patch) | |
tree | 8cfacda45a2b3d12a3831511199a13d33f245890 /net/ipv4/arp.c | |
parent | a3786a5ff7551d03029219f93306106d0a6bdf55 (diff) | |
parent | 79b16aadea32cce077acbe9e229fcb58a7801687 (diff) |
Merge branch 'udp_tunnel_sk'
Prevent UDP tunnels from operating on garbage socket
So this should do the rest of the work such that when we encapsulate
into a UDP tunnel, the output path works on the UDP tunnel's socket
rather than skb->sk.
Part of this work is based upon changes done by Jiri Pirko some time
ago.
Basically the first step is to pass the socket through the nf_hook
okfn(), and then next we do the same for the UDP tunnel xmit routines.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/arp.c')
-rw-r--r-- | net/ipv4/arp.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index c6e67aa46c32..933a92820d26 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -591,7 +591,8 @@ EXPORT_SYMBOL(arp_create); | |||
591 | void arp_xmit(struct sk_buff *skb) | 591 | void arp_xmit(struct sk_buff *skb) |
592 | { | 592 | { |
593 | /* Send it off, maybe filter it using firewalling first. */ | 593 | /* Send it off, maybe filter it using firewalling first. */ |
594 | NF_HOOK(NFPROTO_ARP, NF_ARP_OUT, skb, NULL, skb->dev, dev_queue_xmit); | 594 | NF_HOOK(NFPROTO_ARP, NF_ARP_OUT, NULL, skb, |
595 | NULL, skb->dev, dev_queue_xmit_sk); | ||
595 | } | 596 | } |
596 | EXPORT_SYMBOL(arp_xmit); | 597 | EXPORT_SYMBOL(arp_xmit); |
597 | 598 | ||
@@ -625,7 +626,7 @@ EXPORT_SYMBOL(arp_send); | |||
625 | * Process an arp request. | 626 | * Process an arp request. |
626 | */ | 627 | */ |
627 | 628 | ||
628 | static int arp_process(struct sk_buff *skb) | 629 | static int arp_process(struct sock *sk, struct sk_buff *skb) |
629 | { | 630 | { |
630 | struct net_device *dev = skb->dev; | 631 | struct net_device *dev = skb->dev; |
631 | struct in_device *in_dev = __in_dev_get_rcu(dev); | 632 | struct in_device *in_dev = __in_dev_get_rcu(dev); |
@@ -846,7 +847,7 @@ out: | |||
846 | 847 | ||
847 | static void parp_redo(struct sk_buff *skb) | 848 | static void parp_redo(struct sk_buff *skb) |
848 | { | 849 | { |
849 | arp_process(skb); | 850 | arp_process(NULL, skb); |
850 | } | 851 | } |
851 | 852 | ||
852 | 853 | ||
@@ -879,7 +880,8 @@ static int arp_rcv(struct sk_buff *skb, struct net_device *dev, | |||
879 | 880 | ||
880 | memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); | 881 | memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); |
881 | 882 | ||
882 | return NF_HOOK(NFPROTO_ARP, NF_ARP_IN, skb, dev, NULL, arp_process); | 883 | return NF_HOOK(NFPROTO_ARP, NF_ARP_IN, NULL, skb, |
884 | dev, NULL, arp_process); | ||
883 | 885 | ||
884 | consumeskb: | 886 | consumeskb: |
885 | consume_skb(skb); | 887 | consume_skb(skb); |