Commit d31d38a0 authored by David S. Miller's avatar David S. Miller

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: default avatarDavid S. Miller <davem@davemloft.net>
parents 8ce38aeb c0d451c8
...@@ -315,17 +315,13 @@ static int ipvlan_rcv_frame(struct ipvl_addr *addr, struct sk_buff **pskb, ...@@ -315,17 +315,13 @@ static int ipvlan_rcv_frame(struct ipvl_addr *addr, struct sk_buff **pskb,
*pskb = skb; *pskb = skb;
} }
ipvlan_skb_crossing_ns(skb, dev);
if (local) { if (local) {
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
if (dev_forward_skb(ipvlan->dev, skb) == NET_RX_SUCCESS) if (dev_forward_skb(ipvlan->dev, skb) == NET_RX_SUCCESS)
success = true; success = true;
} else { } else {
if (!ether_addr_equal_64bits(eth_hdr(skb)->h_dest, skb->dev = dev;
ipvlan->phy_dev->dev_addr))
skb->pkt_type = PACKET_OTHERHOST;
ret = RX_HANDLER_ANOTHER; ret = RX_HANDLER_ANOTHER;
success = true; success = true;
} }
...@@ -590,7 +586,7 @@ static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev) ...@@ -590,7 +586,7 @@ static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev)
return NET_XMIT_SUCCESS; return NET_XMIT_SUCCESS;
} }
ipvlan_skb_crossing_ns(skb, ipvlan->phy_dev); skb->dev = ipvlan->phy_dev;
return dev_queue_xmit(skb); return dev_queue_xmit(skb);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment