diff options
Diffstat (limited to 'drivers/net/ipvlan/ipvlan_core.c')
| -rw-r--r-- | drivers/net/ipvlan/ipvlan_core.c | 6 | 
1 files changed, 4 insertions, 2 deletions
| diff --git a/drivers/net/ipvlan/ipvlan_core.c b/drivers/net/ipvlan/ipvlan_core.c index dfeb5b392e64..bb1c298c1e78 100644 --- a/drivers/net/ipvlan/ipvlan_core.c +++ b/drivers/net/ipvlan/ipvlan_core.c @@ -495,7 +495,6 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb)  static int ipvlan_process_outbound(struct sk_buff *skb)  { -	struct ethhdr *ethh = eth_hdr(skb);  	int ret = NET_XMIT_DROP;  	/* The ipvlan is a pseudo-L2 device, so the packets that we receive @@ -505,6 +504,8 @@ static int ipvlan_process_outbound(struct sk_buff *skb)  	if (skb_mac_header_was_set(skb)) {  		/* In this mode we dont care about  		 * multicast and broadcast traffic */ +		struct ethhdr *ethh = eth_hdr(skb); +  		if (is_multicast_ether_addr(ethh->h_dest)) {  			pr_debug_ratelimited(  				"Dropped {multi|broad}cast of type=[%x]\n", @@ -589,7 +590,7 @@ out:  static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev)  {  	const struct ipvl_dev *ipvlan = netdev_priv(dev); -	struct ethhdr *eth = eth_hdr(skb); +	struct ethhdr *eth = skb_eth_hdr(skb);  	struct ipvl_addr *addr;  	void *lyr3h;  	int addr_type; @@ -619,6 +620,7 @@ static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev)  		return dev_forward_skb(ipvlan->phy_dev, skb);  	} else if (is_multicast_ether_addr(eth->h_dest)) { +		skb_reset_mac_header(skb);  		ipvlan_skb_crossing_ns(skb, NULL);  		ipvlan_multicast_enqueue(ipvlan->port, skb, true);  		return NET_XMIT_SUCCESS; | 
