@@ -3294,15 +3294,18 @@ static void vxlan_setup(struct net_device *dev)
dev->needs_free_netdev = true;
SET_NETDEV_DEVTYPE(dev, &vxlan_type);
- dev->features |= NETIF_F_LLTX;
- dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
- dev->features |= NETIF_F_RXCSUM;
- dev->features |= NETIF_F_GSO_SOFTWARE;
-
- dev->vlan_features = dev->features;
- dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
- dev->hw_features |= NETIF_F_RXCSUM;
- dev->hw_features |= NETIF_F_GSO_SOFTWARE;
+ netdev_feature_set_bit(NETIF_F_LLTX_BIT, &dev->features);
+ netdev_feature_set_bits(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST,
+ &dev->features);
+ netdev_feature_set_bit(NETIF_F_RXCSUM_BIT, &dev->features);
+ netdev_feature_set_bits(NETIF_F_GSO_SOFTWARE, &dev->features);
+
+ netdev_feature_copy(&dev->vlan_features, dev->features);
+ netdev_feature_set_bits(NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST,
+ &dev->hw_features);
+ netdev_feature_set_bit(NETIF_F_RXCSUM_BIT, &dev->hw_features);
+ netdev_feature_set_bits(NETIF_F_GSO_SOFTWARE, &dev->hw_features);
+
netif_keep_dst(dev);
dev->priv_flags |= IFF_NO_QUEUE;
@@ -322,8 +322,8 @@ static inline void vxlan_features_check(struct sk_buff *skb,
sizeof(struct udphdr) + sizeof(struct vxlanhdr)) ||
(skb->ip_summed != CHECKSUM_NONE &&
!can_checksum_protocol(*features, inner_eth_hdr(skb)->h_proto))))
- *features &= ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
-
+ netdev_feature_clear_bits(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK,
+ features);
}
/* IP header + UDP + VXLAN + Ethernet header */
Use netdev_feature_xxx helpers to replace the logical operation for netdev features. Signed-off-by: Jian Shen <shenjian15@huawei.com> --- drivers/net/vxlan.c | 21 ++++++++++++--------- include/net/vxlan.h | 4 ++-- 2 files changed, 14 insertions(+), 11 deletions(-)