@@ -9826,99 +9826,97 @@ static void netdev_sync_lower_features(struct net_device *upper,
}
}
-static netdev_features_t netdev_fix_features(struct net_device *dev,
- netdev_features_t features)
+static void netdev_fix_features(struct net_device *dev,
+ netdev_features_t *features)
{
/* Fix illegal checksum combinations */
- if ((features & NETIF_F_HW_CSUM) &&
- (features & (NETIF_F_IP_CSUM|NETIF_F_IPV6_CSUM))) {
+ if ((*features & NETIF_F_HW_CSUM) &&
+ (*features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM))) {
netdev_warn(dev, "mixed HW and IP checksum settings.\n");
- features &= ~(NETIF_F_IP_CSUM|NETIF_F_IPV6_CSUM);
+ *features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
}
/* TSO requires that SG is present as well. */
- if ((features & NETIF_F_ALL_TSO) && !(features & NETIF_F_SG)) {
+ if ((*features & NETIF_F_ALL_TSO) && !(*features & NETIF_F_SG)) {
netdev_dbg(dev, "Dropping TSO features since no SG feature.\n");
- features &= ~NETIF_F_ALL_TSO;
+ *features &= ~NETIF_F_ALL_TSO;
}
- if ((features & NETIF_F_TSO) && !(features & NETIF_F_HW_CSUM) &&
- !(features & NETIF_F_IP_CSUM)) {
+ if ((*features & NETIF_F_TSO) && !(*features & NETIF_F_HW_CSUM) &&
+ !(*features & NETIF_F_IP_CSUM)) {
netdev_dbg(dev, "Dropping TSO features since no CSUM feature.\n");
- features &= ~NETIF_F_TSO;
- features &= ~NETIF_F_TSO_ECN;
+ *features &= ~NETIF_F_TSO;
+ *features &= ~NETIF_F_TSO_ECN;
}
- if ((features & NETIF_F_TSO6) && !(features & NETIF_F_HW_CSUM) &&
- !(features & NETIF_F_IPV6_CSUM)) {
+ if ((*features & NETIF_F_TSO6) && !(*features & NETIF_F_HW_CSUM) &&
+ !(*features & NETIF_F_IPV6_CSUM)) {
netdev_dbg(dev, "Dropping TSO6 features since no CSUM feature.\n");
- features &= ~NETIF_F_TSO6;
+ *features &= ~NETIF_F_TSO6;
}
/* TSO with IPv4 ID mangling requires IPv4 TSO be enabled */
- if ((features & NETIF_F_TSO_MANGLEID) && !(features & NETIF_F_TSO))
- features &= ~NETIF_F_TSO_MANGLEID;
+ if ((*features & NETIF_F_TSO_MANGLEID) && !(*features & NETIF_F_TSO))
+ *features &= ~NETIF_F_TSO_MANGLEID;
/* TSO ECN requires that TSO is present as well. */
- if ((features & NETIF_F_ALL_TSO) == NETIF_F_TSO_ECN)
- features &= ~NETIF_F_TSO_ECN;
+ if ((*features & NETIF_F_ALL_TSO) == NETIF_F_TSO_ECN)
+ *features &= ~NETIF_F_TSO_ECN;
/* Software GSO depends on SG. */
- if ((features & NETIF_F_GSO) && !(features & NETIF_F_SG)) {
+ if ((*features & NETIF_F_GSO) && !(*features & NETIF_F_SG)) {
netdev_dbg(dev, "Dropping NETIF_F_GSO since no SG feature.\n");
- features &= ~NETIF_F_GSO;
+ *features &= ~NETIF_F_GSO;
}
/* GSO partial features require GSO partial be set */
- if ((features & dev->gso_partial_features) &&
- !(features & NETIF_F_GSO_PARTIAL)) {
+ if ((*features & dev->gso_partial_features) &&
+ !(*features & NETIF_F_GSO_PARTIAL)) {
netdev_dbg(dev,
"Dropping partially supported GSO features since no GSO partial.\n");
- features &= ~dev->gso_partial_features;
+ *features &= ~dev->gso_partial_features;
}
- if (!(features & NETIF_F_RXCSUM)) {
+ if (!(*features & NETIF_F_RXCSUM)) {
/* NETIF_F_GRO_HW implies doing RXCSUM since every packet
* successfully merged by hardware must also have the
* checksum verified by hardware. If the user does not
* want to enable RXCSUM, logically, we should disable GRO_HW.
*/
- if (features & NETIF_F_GRO_HW) {
+ if (*features & NETIF_F_GRO_HW) {
netdev_dbg(dev, "Dropping NETIF_F_GRO_HW since no RXCSUM feature.\n");
- features &= ~NETIF_F_GRO_HW;
+ *features &= ~NETIF_F_GRO_HW;
}
}
/* LRO/HW-GRO features cannot be combined with RX-FCS */
- if (features & NETIF_F_RXFCS) {
- if (features & NETIF_F_LRO) {
+ if (*features & NETIF_F_RXFCS) {
+ if (*features & NETIF_F_LRO) {
netdev_dbg(dev, "Dropping LRO feature since RX-FCS is requested.\n");
- features &= ~NETIF_F_LRO;
+ *features &= ~NETIF_F_LRO;
}
- if (features & NETIF_F_GRO_HW) {
+ if (*features & NETIF_F_GRO_HW) {
netdev_dbg(dev, "Dropping HW-GRO feature since RX-FCS is requested.\n");
- features &= ~NETIF_F_GRO_HW;
+ *features &= ~NETIF_F_GRO_HW;
}
}
- if (features & NETIF_F_HW_TLS_TX) {
- bool ip_csum = (features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)) ==
+ if (*features & NETIF_F_HW_TLS_TX) {
+ bool ip_csum = (*features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)) ==
(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
- bool hw_csum = features & NETIF_F_HW_CSUM;
+ bool hw_csum = *features & NETIF_F_HW_CSUM;
if (!ip_csum && !hw_csum) {
netdev_dbg(dev, "Dropping TLS TX HW offload feature since no CSUM feature.\n");
- features &= ~NETIF_F_HW_TLS_TX;
+ *features &= ~NETIF_F_HW_TLS_TX;
}
}
- if ((features & NETIF_F_HW_TLS_RX) && !(features & NETIF_F_RXCSUM)) {
+ if ((*features & NETIF_F_HW_TLS_RX) && !(*features & NETIF_F_RXCSUM)) {
netdev_dbg(dev, "Dropping TLS RX HW offload feature since no RXCSUM feature.\n");
- features &= ~NETIF_F_HW_TLS_RX;
+ *features &= ~NETIF_F_HW_TLS_RX;
}
-
- return features;
}
int __netdev_update_features(struct net_device *dev)
@@ -9936,7 +9934,7 @@ int __netdev_update_features(struct net_device *dev)
dev->netdev_ops->ndo_fix_features(dev, &features);
/* driver might be less strict about feature dependencies */
- features = netdev_fix_features(dev, features);
+ netdev_fix_features(dev, &features);
/* some features can't be enabled if they're off on an upper device */
netdev_for_each_upper_dev_rcu(dev, upper, iter)
For the origin type for netdev_features_t would be changed to be unsigned long * from u64, so changes the prototype of netdev_fix_features for adaption. Signed-off-by: Jian Shen <shenjian15@huawei.com> --- net/core/dev.c | 78 ++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 40 deletions(-)