]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
macsec: inherit lower device's TSO limits when offloading
authorSabrina Dubroca <sd@queasysnail.net>
Wed, 6 Nov 2024 23:13:31 +0000 (00:13 +0100)
committerJakub Kicinski <kuba@kernel.org>
Mon, 11 Nov 2024 22:12:21 +0000 (14:12 -0800)
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 <sd@queasysnail.net>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/8240c0181e851f169d815f59658a01fb9dfc5073.1730929545.git.sd@queasysnail.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/macsec.c

index 351154dd92a620fc14382be7c8776ec86cf054da..1bc1e5993f56e08cf4fe2996743068d777d15723 100644 (file)
@@ -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;