If macsec is offloaded, we need to follow the lower device's
capabilities, like VLAN devices do.

Leave the limits unchanged when the offload is disabled.

Signed-off-by: Sabrina Dubroca <s...@queasysnail.net>
---
 drivers/net/macsec.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index e6670e876ff6..24c190d9b959 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -2621,6 +2621,17 @@ static void macsec_set_head_tail_room(struct net_device 
*dev)
        dev->needed_tailroom = real_dev->needed_tailroom + needed_tailroom;
 }
 
+static void macsec_inherit_tso_max(struct net_device *dev)
+{
+       struct macsec_dev *macsec = macsec_priv(dev);
+
+       /* if macsec is offloaded, we need to follow the lower
+        * device's capabilities. otherwise, we can ignore them.
+        */
+       if (macsec_is_offloaded(macsec))
+               netif_inherit_tso_max(dev, macsec->real_dev);
+}
+
 static int macsec_update_offload(struct net_device *dev, enum macsec_offload 
offload)
 {
        enum macsec_offload prev_offload;
@@ -2666,6 +2677,8 @@ static int macsec_update_offload(struct net_device *dev, 
enum macsec_offload off
        macsec_set_head_tail_room(dev);
        macsec->insert_tx_tag = macsec_needs_tx_tag(macsec, ops);
 
+       macsec_inherit_tso_max(dev);
+
        netdev_update_features(dev);
 
        return ret;
@@ -3537,6 +3550,8 @@ static int macsec_dev_init(struct net_device *dev)
        if (err)
                return err;
 
+       macsec_inherit_tso_max(dev);
+
        dev->hw_features = real_dev->hw_features & MACSEC_OFFLOAD_FEATURES;
        dev->hw_features |= NETIF_F_GSO_SOFTWARE;
 
@@ -4479,6 +4494,13 @@ static int macsec_notify(struct notifier_block *this, 
unsigned long event,
                        if (dev->mtu > mtu)
                                dev_set_mtu(dev, mtu);
                }
+               break;
+       case NETDEV_FEAT_CHANGE:
+               list_for_each_entry(m, &rxd->secys, secys) {
+                       macsec_inherit_tso_max(m->secy.netdev);
+                       netdev_update_features(m->secy.netdev);
+               }
+               break;
        }
 
        return NOTIFY_OK;
-- 
2.47.0


Reply via email to