|
@@ -2562,6 +2562,13 @@ static netdev_features_t harmonize_features(struct sk_buff *skb,
|
|
|
return features;
|
|
|
}
|
|
|
|
|
|
+static netdev_features_t dflt_features_check(const struct sk_buff *skb,
|
|
|
+ struct net_device *dev,
|
|
|
+ netdev_features_t features)
|
|
|
+{
|
|
|
+ return vlan_features_check(skb, features);
|
|
|
+}
|
|
|
+
|
|
|
netdev_features_t netif_skb_features(struct sk_buff *skb)
|
|
|
{
|
|
|
struct net_device *dev = skb->dev;
|
|
@@ -2583,22 +2590,12 @@ netdev_features_t netif_skb_features(struct sk_buff *skb)
|
|
|
dev->vlan_features |
|
|
|
NETIF_F_HW_VLAN_CTAG_TX |
|
|
|
NETIF_F_HW_VLAN_STAG_TX);
|
|
|
- else
|
|
|
- goto finalize;
|
|
|
|
|
|
- if (skb_vlan_tagged_multi(skb))
|
|
|
- features = netdev_intersect_features(features,
|
|
|
- NETIF_F_SG |
|
|
|
- NETIF_F_HIGHDMA |
|
|
|
- NETIF_F_FRAGLIST |
|
|
|
- NETIF_F_GEN_CSUM |
|
|
|
- NETIF_F_HW_VLAN_CTAG_TX |
|
|
|
- NETIF_F_HW_VLAN_STAG_TX);
|
|
|
-
|
|
|
-finalize:
|
|
|
if (dev->netdev_ops->ndo_features_check)
|
|
|
features &= dev->netdev_ops->ndo_features_check(skb, dev,
|
|
|
features);
|
|
|
+ else
|
|
|
+ features &= dflt_features_check(skb, dev, features);
|
|
|
|
|
|
return harmonize_features(skb, features);
|
|
|
}
|