diff options
Diffstat (limited to 'drivers/net/vxlan.c')
| -rw-r--r-- | drivers/net/vxlan.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 5209ee9aac47..2aae11feff0c 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
| @@ -2219,7 +2219,7 @@ static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan, | |||
| 2219 | struct pcpu_sw_netstats *tx_stats, *rx_stats; | 2219 | struct pcpu_sw_netstats *tx_stats, *rx_stats; |
| 2220 | union vxlan_addr loopback; | 2220 | union vxlan_addr loopback; |
| 2221 | union vxlan_addr *remote_ip = &dst_vxlan->default_dst.remote_ip; | 2221 | union vxlan_addr *remote_ip = &dst_vxlan->default_dst.remote_ip; |
| 2222 | struct net_device *dev = skb->dev; | 2222 | struct net_device *dev; |
| 2223 | int len = skb->len; | 2223 | int len = skb->len; |
| 2224 | 2224 | ||
| 2225 | tx_stats = this_cpu_ptr(src_vxlan->dev->tstats); | 2225 | tx_stats = this_cpu_ptr(src_vxlan->dev->tstats); |
| @@ -2239,9 +2239,15 @@ static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan, | |||
| 2239 | #endif | 2239 | #endif |
| 2240 | } | 2240 | } |
| 2241 | 2241 | ||
| 2242 | rcu_read_lock(); | ||
| 2243 | dev = skb->dev; | ||
| 2244 | if (unlikely(!(dev->flags & IFF_UP))) { | ||
| 2245 | kfree_skb(skb); | ||
| 2246 | goto drop; | ||
| 2247 | } | ||
| 2248 | |||
| 2242 | if (dst_vxlan->cfg.flags & VXLAN_F_LEARN) | 2249 | if (dst_vxlan->cfg.flags & VXLAN_F_LEARN) |
| 2243 | vxlan_snoop(skb->dev, &loopback, eth_hdr(skb)->h_source, 0, | 2250 | vxlan_snoop(dev, &loopback, eth_hdr(skb)->h_source, 0, vni); |
| 2244 | vni); | ||
| 2245 | 2251 | ||
| 2246 | u64_stats_update_begin(&tx_stats->syncp); | 2252 | u64_stats_update_begin(&tx_stats->syncp); |
| 2247 | tx_stats->tx_packets++; | 2253 | tx_stats->tx_packets++; |
| @@ -2254,8 +2260,10 @@ static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan, | |||
| 2254 | rx_stats->rx_bytes += len; | 2260 | rx_stats->rx_bytes += len; |
| 2255 | u64_stats_update_end(&rx_stats->syncp); | 2261 | u64_stats_update_end(&rx_stats->syncp); |
| 2256 | } else { | 2262 | } else { |
| 2263 | drop: | ||
| 2257 | dev->stats.rx_dropped++; | 2264 | dev->stats.rx_dropped++; |
| 2258 | } | 2265 | } |
| 2266 | rcu_read_unlock(); | ||
| 2259 | } | 2267 | } |
| 2260 | 2268 | ||
| 2261 | static int encap_bypass_if_local(struct sk_buff *skb, struct net_device *dev, | 2269 | static int encap_bypass_if_local(struct sk_buff *skb, struct net_device *dev, |
