diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/core/lwt_bpf.c | 7 | ||||
| -rw-r--r-- | net/xdp/xdp_umem.c | 6 | 
2 files changed, 12 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; diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c index 16d5f353163a..3049af269fbf 100644 --- a/net/xdp/xdp_umem.c +++ b/net/xdp/xdp_umem.c @@ -27,6 +27,9 @@ void xdp_add_sk_umem(struct xdp_umem *umem, struct xdp_sock *xs)  {  	unsigned long flags; +	if (!xs->tx) +		return; +  	spin_lock_irqsave(&umem->xsk_list_lock, flags);  	list_add_rcu(&xs->list, &umem->xsk_list);  	spin_unlock_irqrestore(&umem->xsk_list_lock, flags); @@ -36,6 +39,9 @@ void xdp_del_sk_umem(struct xdp_umem *umem, struct xdp_sock *xs)  {  	unsigned long flags; +	if (!xs->tx) +		return; +  	spin_lock_irqsave(&umem->xsk_list_lock, flags);  	list_del_rcu(&xs->list);  	spin_unlock_irqrestore(&umem->xsk_list_lock, flags);  | 

