core/dev: do not ignore dmac in dev_forward_skb()
commit06a23fe31c
("core/dev: set pkt_type after eth_type_trans() in dev_forward_skb()") and refactoring64261f230a
("dev: move skb_scrub_packet() after eth_type_trans()") are forcing pkt_type to be PACKET_HOST when skb traverses veth. which means that ip forwarding will kick in inside netns even if skb->eth->h_dest != dev->dev_addr Fix order of eth_type_trans() and skb_scrub_packet() in dev_forward_skb() and in ip_tunnel_rcv() Fixes:06a23fe31c
("core/dev: set pkt_type after eth_type_trans() in dev_forward_skb()") CC: Isaku Yamahata <yamahatanetdev@gmail.com> CC: Maciej Zenczykowski <zenczykowski@gmail.com> CC: Nicolas Dichtel <nicolas.dichtel@6wind.com> Signed-off-by: Alexei Starovoitov <ast@plumgrid.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
52f48d0d9a
commit
81b9eab5eb
|
@ -1690,13 +1690,9 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb)
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
return NET_RX_DROP;
|
return NET_RX_DROP;
|
||||||
}
|
}
|
||||||
skb->protocol = eth_type_trans(skb, dev);
|
|
||||||
|
|
||||||
/* eth_type_trans() can set pkt_type.
|
|
||||||
* call skb_scrub_packet() after it to clear pkt_type _after_ calling
|
|
||||||
* eth_type_trans().
|
|
||||||
*/
|
|
||||||
skb_scrub_packet(skb, true);
|
skb_scrub_packet(skb, true);
|
||||||
|
skb->protocol = eth_type_trans(skb, dev);
|
||||||
|
|
||||||
return netif_rx(skb);
|
return netif_rx(skb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -454,6 +454,8 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
|
||||||
tstats->rx_bytes += skb->len;
|
tstats->rx_bytes += skb->len;
|
||||||
u64_stats_update_end(&tstats->syncp);
|
u64_stats_update_end(&tstats->syncp);
|
||||||
|
|
||||||
|
skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev)));
|
||||||
|
|
||||||
if (tunnel->dev->type == ARPHRD_ETHER) {
|
if (tunnel->dev->type == ARPHRD_ETHER) {
|
||||||
skb->protocol = eth_type_trans(skb, tunnel->dev);
|
skb->protocol = eth_type_trans(skb, tunnel->dev);
|
||||||
skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
|
skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
|
||||||
|
@ -461,8 +463,6 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
|
||||||
skb->dev = tunnel->dev;
|
skb->dev = tunnel->dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev)));
|
|
||||||
|
|
||||||
gro_cells_receive(&tunnel->gro_cells, skb);
|
gro_cells_receive(&tunnel->gro_cells, skb);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue