]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
team: Fix feature exposure when no ports are present
authorDaniel Borkmann <daniel@iogearbox.net>
Fri, 13 Dec 2024 12:36:57 +0000 (13:36 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 17 Dec 2024 02:23:12 +0000 (18:23 -0800)
Small follow-up to align this to an equivalent behavior as the bond driver.
The change in 3625920b62c3 ("teaming: fix vlan_features computing") removed
the netdevice vlan_features when there is no team port attached, yet it
leaves the full set of enc_features intact.

Instead, leave the default features as pre 3625920b62c3, and recompute once
we do have ports attached. Also, similarly as in bonding case, call the
netdev_base_features() helper on the enc_features.

Fixes: 3625920b62c3 ("teaming: fix vlan_features computing")
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/20241213123657.401868-1-daniel@iogearbox.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/team/team_core.c

index 69ea2c3c76bfc36d4ffd9ac56485cb5c85170f0a..c7690adec8db72c04bb63970206dfa5156b44a9d 100644 (file)
@@ -998,9 +998,13 @@ static void __team_compute_features(struct team *team)
        unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE |
                                        IFF_XMIT_DST_RELEASE_PERM;
 
+       rcu_read_lock();
+       if (list_empty(&team->port_list))
+               goto done;
+
        vlan_features = netdev_base_features(vlan_features);
+       enc_features = netdev_base_features(enc_features);
 
-       rcu_read_lock();
        list_for_each_entry_rcu(port, &team->port_list, list) {
                vlan_features = netdev_increment_features(vlan_features,
                                        port->dev->vlan_features,
@@ -1010,11 +1014,11 @@ static void __team_compute_features(struct team *team)
                                                  port->dev->hw_enc_features,
                                                  TEAM_ENC_FEATURES);
 
-
                dst_release_flag &= port->dev->priv_flags;
                if (port->dev->hard_header_len > max_hard_header_len)
                        max_hard_header_len = port->dev->hard_header_len;
        }
+done:
        rcu_read_unlock();
 
        team->dev->vlan_features = vlan_features;