diff options
Diffstat (limited to 'net/core/lwt_bpf.c')
| -rw-r--r-- | net/core/lwt_bpf.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/net/core/lwt_bpf.c b/net/core/lwt_bpf.c index f93785e5833c..74cfb8b5ab33 100644 --- a/net/core/lwt_bpf.c +++ b/net/core/lwt_bpf.c @@ -88,11 +88,16 @@ static int bpf_lwt_input_reroute(struct sk_buff *skb)  	int err = -EINVAL;  	if (skb->protocol == htons(ETH_P_IP)) { +		struct net_device *dev = skb_dst(skb)->dev;  		struct iphdr *iph = ip_hdr(skb); +		dev_hold(dev); +		skb_dst_drop(skb);  		err = ip_route_input_noref(skb, iph->daddr, iph->saddr, -					   iph->tos, skb_dst(skb)->dev); +					   iph->tos, dev); +		dev_put(dev);  	} else if (skb->protocol == htons(ETH_P_IPV6)) { +		skb_dst_drop(skb);  		err = ipv6_stub->ipv6_route_input(skb);  	} else {  		err = -EAFNOSUPPORT;  |