diff options
Diffstat (limited to 'net/core/dev.c')
| -rw-r--r-- | net/core/dev.c | 17 | 
1 files changed, 12 insertions, 5 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index fc676b2610e3..0891f499c1bb 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4374,12 +4374,17 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,  	act = bpf_prog_run_xdp(xdp_prog, xdp); +	/* check if bpf_xdp_adjust_head was used */  	off = xdp->data - orig_data; -	if (off > 0) -		__skb_pull(skb, off); -	else if (off < 0) -		__skb_push(skb, -off); -	skb->mac_header += off; +	if (off) { +		if (off > 0) +			__skb_pull(skb, off); +		else if (off < 0) +			__skb_push(skb, -off); + +		skb->mac_header += off; +		skb_reset_network_header(skb); +	}  	/* check if bpf_xdp_adjust_tail was used. it can only "shrink"  	 * pckt. @@ -9701,6 +9706,8 @@ static void __net_exit default_device_exit(struct net *net)  		/* Push remaining network devices to init_net */  		snprintf(fb_name, IFNAMSIZ, "dev%d", dev->ifindex); +		if (__dev_get_by_name(&init_net, fb_name)) +			snprintf(fb_name, IFNAMSIZ, "dev%%d");  		err = dev_change_net_namespace(dev, &init_net, fb_name);  		if (err) {  			pr_emerg("%s: failed to move %s to init_net: %d\n",  | 
