summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller2017-12-15 17:36:54 +0100
committerDavid S. Miller2017-12-15 17:36:54 +0100
commitd31d38a0a911f8ae681db172481c66065f05c3e1 (patch)
treed80bc791215a1923cff066949151932415ff3bcb
parentMerge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klasse... (diff)
parentipvlan: remove excessive packet scrubbing (diff)
downloadkernel-qcow2-linux-d31d38a0a911f8ae681db172481c66065f05c3e1.tar.gz
kernel-qcow2-linux-d31d38a0a911f8ae681db172481c66065f05c3e1.tar.xz
kernel-qcow2-linux-d31d38a0a911f8ae681db172481c66065f05c3e1.zip
Merge branch 'ipvlan-packet-scrub'
Mahesh Bandewar says: ==================== ipvlan: packet scrub While crossing namespace boundary IPvlan aggressively scrubs packets. This is creating problems. First thing is that scrubbing changes the packet type in skb meta-data to PACKET_HOST. This causes erroneous packet delivery when dev_forward_skb() has already marked the packet type as OTHER_HOST. On the egress side scrubbing just before calling dev_queue_xmit() creates another set of problems. Scrubbing remove skb->sk so the prio update gets missed and more seriously, socket back-pressure fails making TSQ not function correctly. The first patch in the series just reverts the earlier change which was adding a mac-check, but that is unnecessary if packet_type that dev_forward_skb() has set is honored. The second path removes two of the scrubs which are causing problems described above. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ipvlan/ipvlan_core.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/drivers/net/ipvlan/ipvlan_core.c b/drivers/net/ipvlan/ipvlan_core.c
index 0bc7f721b717..c1f008fe4e1d 100644
--- a/drivers/net/ipvlan/ipvlan_core.c
+++ b/drivers/net/ipvlan/ipvlan_core.c
@@ -315,17 +315,13 @@ static int ipvlan_rcv_frame(struct ipvl_addr *addr, struct sk_buff **pskb,
*pskb = skb;
}
- ipvlan_skb_crossing_ns(skb, dev);
if (local) {
skb->pkt_type = PACKET_HOST;
if (dev_forward_skb(ipvlan->dev, skb) == NET_RX_SUCCESS)
success = true;
} else {
- if (!ether_addr_equal_64bits(eth_hdr(skb)->h_dest,
- ipvlan->phy_dev->dev_addr))
- skb->pkt_type = PACKET_OTHERHOST;
-
+ skb->dev = dev;
ret = RX_HANDLER_ANOTHER;
success = true;
}
@@ -590,7 +586,7 @@ static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev)
return NET_XMIT_SUCCESS;
}
- ipvlan_skb_crossing_ns(skb, ipvlan->phy_dev);
+ skb->dev = ipvlan->phy_dev;
return dev_queue_xmit(skb);
}