| From c850240b6c4132574a00f2da439277ab94265b66 Mon Sep 17 00:00:00 2001 |
| From: Mark Starovoytov <mstarovoitov@marvell.com> |
| Date: Wed, 25 Mar 2020 15:52:38 +0300 |
| Subject: net: macsec: report real_dev features when HW offloading is enabled |
| |
| This patch makes real_dev_feature propagation by MACSec offloaded device. |
| |
| Issue description: |
| real_dev features are disabled upon macsec creation. |
| |
| Root cause: |
| Features limitation (specific to SW MACSec limitation) is being applied |
| to HW offloaded case as well. |
| This causes 'set_features' request on the real_dev with reduced feature |
| set due to chain propagation. |
| |
| Proposed solution: |
| Report real_dev features when HW offloading is enabled. |
| NB! MACSec offloaded device does not propagate VLAN offload features at |
| the moment. This can potentially be added later on as a separate patch. |
| |
| Note: this patch requires HW offloading to be enabled by default in order |
| to function properly. |
| |
| Signed-off-by: Mark Starovoytov <mstarovoitov@marvell.com> |
| Signed-off-by: Igor Russkikh <irusskikh@marvell.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| --- |
| drivers/net/macsec.c | 26 ++++++++++++++++++++++---- |
| 1 file changed, 22 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c |
| index b00a078d13ffe..2dad91cba459c 100644 |
| --- a/drivers/net/macsec.c |
| +++ b/drivers/net/macsec.c |
| @@ -2633,6 +2633,10 @@ static int macsec_upd_offload(struct sk_buff *skb, struct genl_info *info) |
| goto rollback; |
| |
| rtnl_unlock(); |
| + /* Force features update, since they are different for SW MACSec and |
| + * HW offloading cases. |
| + */ |
| + netdev_update_features(dev); |
| return 0; |
| |
| rollback: |
| @@ -3399,9 +3403,16 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb, |
| return ret; |
| } |
| |
| -#define MACSEC_FEATURES \ |
| +#define SW_MACSEC_FEATURES \ |
| (NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST) |
| |
| +/* If h/w offloading is enabled, use real device features save for |
| + * VLAN_FEATURES - they require additional ops |
| + * HW_MACSEC - no reason to report it |
| + */ |
| +#define REAL_DEV_FEATURES(dev) \ |
| + ((dev)->features & ~(NETIF_F_VLAN_FEATURES | NETIF_F_HW_MACSEC)) |
| + |
| static int macsec_dev_init(struct net_device *dev) |
| { |
| struct macsec_dev *macsec = macsec_priv(dev); |
| @@ -3418,8 +3429,12 @@ static int macsec_dev_init(struct net_device *dev) |
| return err; |
| } |
| |
| - dev->features = real_dev->features & MACSEC_FEATURES; |
| - dev->features |= NETIF_F_LLTX | NETIF_F_GSO_SOFTWARE; |
| + if (macsec_is_offloaded(macsec)) { |
| + dev->features = REAL_DEV_FEATURES(real_dev); |
| + } else { |
| + dev->features = real_dev->features & SW_MACSEC_FEATURES; |
| + dev->features |= NETIF_F_LLTX | NETIF_F_GSO_SOFTWARE; |
| + } |
| |
| dev->needed_headroom = real_dev->needed_headroom + |
| MACSEC_NEEDED_HEADROOM; |
| @@ -3448,7 +3463,10 @@ static netdev_features_t macsec_fix_features(struct net_device *dev, |
| struct macsec_dev *macsec = macsec_priv(dev); |
| struct net_device *real_dev = macsec->real_dev; |
| |
| - features &= (real_dev->features & MACSEC_FEATURES) | |
| + if (macsec_is_offloaded(macsec)) |
| + return REAL_DEV_FEATURES(real_dev); |
| + |
| + features &= (real_dev->features & SW_MACSEC_FEATURES) | |
| NETIF_F_GSO_SOFTWARE | NETIF_F_SOFT_FEATURES; |
| features |= NETIF_F_LLTX; |
| |
| -- |
| cgit 1.2.3-1.el7 |
| |