|
@@ -2106,9 +2106,17 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
info = skb_tunnel_info(skb);
|
|
|
|
|
|
skb_reset_mac_header(skb);
|
|
|
- eth = eth_hdr(skb);
|
|
|
|
|
|
- if ((vxlan->flags & VXLAN_F_PROXY)) {
|
|
|
+ if (vxlan->flags & VXLAN_F_COLLECT_METADATA) {
|
|
|
+ if (info && info->mode & IP_TUNNEL_INFO_TX)
|
|
|
+ vxlan_xmit_one(skb, dev, NULL, false);
|
|
|
+ else
|
|
|
+ kfree_skb(skb);
|
|
|
+ return NETDEV_TX_OK;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (vxlan->flags & VXLAN_F_PROXY) {
|
|
|
+ eth = eth_hdr(skb);
|
|
|
if (ntohs(eth->h_proto) == ETH_P_ARP)
|
|
|
return arp_reduce(dev, skb);
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
@@ -2123,18 +2131,10 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
msg->icmph.icmp6_type == NDISC_NEIGHBOUR_SOLICITATION)
|
|
|
return neigh_reduce(dev, skb);
|
|
|
}
|
|
|
- eth = eth_hdr(skb);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
- if (vxlan->flags & VXLAN_F_COLLECT_METADATA) {
|
|
|
- if (info && info->mode & IP_TUNNEL_INFO_TX)
|
|
|
- vxlan_xmit_one(skb, dev, NULL, false);
|
|
|
- else
|
|
|
- kfree_skb(skb);
|
|
|
- return NETDEV_TX_OK;
|
|
|
- }
|
|
|
-
|
|
|
+ eth = eth_hdr(skb);
|
|
|
f = vxlan_find_mac(vxlan, eth->h_dest);
|
|
|
did_rsc = false;
|
|
|
|