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) | |||
88 | int err = -EINVAL; | 88 | int err = -EINVAL; |
89 | 89 | ||
90 | if (skb->protocol == htons(ETH_P_IP)) { | 90 | if (skb->protocol == htons(ETH_P_IP)) { |
91 | struct net_device *dev = skb_dst(skb)->dev; | ||
91 | struct iphdr *iph = ip_hdr(skb); | 92 | struct iphdr *iph = ip_hdr(skb); |
92 | 93 | ||
94 | dev_hold(dev); | ||
95 | skb_dst_drop(skb); | ||
93 | err = ip_route_input_noref(skb, iph->daddr, iph->saddr, | 96 | err = ip_route_input_noref(skb, iph->daddr, iph->saddr, |
94 | iph->tos, skb_dst(skb)->dev); | 97 | iph->tos, dev); |
98 | dev_put(dev); | ||
95 | } else if (skb->protocol == htons(ETH_P_IPV6)) { | 99 | } else if (skb->protocol == htons(ETH_P_IPV6)) { |
100 | skb_dst_drop(skb); | ||
96 | err = ipv6_stub->ipv6_route_input(skb); | 101 | err = ipv6_stub->ipv6_route_input(skb); |
97 | } else { | 102 | } else { |
98 | err = -EAFNOSUPPORT; | 103 | err = -EAFNOSUPPORT; |