diff options
author | David S. Miller <davem@davemloft.net> | 2017-12-15 11:36:54 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-15 11:36:54 -0500 |
commit | d31d38a0a911f8ae681db172481c66065f05c3e1 (patch) | |
tree | d80bc791215a1923cff066949151932415ff3bcb | |
parent | 8ce38aeb556ab0e71d8f19c32d302444a56a3a9e (diff) | |
parent | c0d451c86ca2c2e6d0f52394b5463e0359caa6f2 (diff) | |
download | linux-d31d38a0a911f8ae681db172481c66065f05c3e1.tar.bz2 |
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.c | 8 |
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); } |