wifi: mac80211: handle debugfs when switching to/from MLO
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Thu, 28 Sep 2023 14:35:26 +0000 (17:35 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 23 Oct 2023 09:43:26 +0000 (11:43 +0200)
In MLO, we have a per-link debugfs directory which contains the
per-link files. In case of non-MLO we would like to put the per-link
files in the netdev directory to keep it how it was before MLO.

- Upon interface creation the netdev will be created with the per-link
  files in it.
- Upon switching to MLO: delete the entire netdev directory and then
  recreate it without the per-link files. Then the per-link directories
  with the per-link files in it will be created in ieee80211_link_init()
- Upon switching to non-MLO: delete the entire netdev directory
  (including the per-link directories) and recreate it with the per-link
  files in it.

Note that this also aligns to always call the vif link debugfs
method for the deflink as promised in the documentation, which
wasn't done before.

Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230928172905.082e698caca9.I5bef7b2026e0f58b4a958b3d1f459ac5baeccfc9@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/debugfs_netdev.c
net/mac80211/debugfs_netdev.h
net/mac80211/driver-ops.c
net/mac80211/iface.c
net/mac80211/link.c

index 14a4034..b383dad 100644 (file)
@@ -934,18 +934,20 @@ static void add_link_files(struct ieee80211_link_data *link,
        }
 }
 
-void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata)
+void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata,
+                                 bool mld_vif)
 {
        char buf[10+IFNAMSIZ];
 
        sprintf(buf, "netdev:%s", sdata->name);
        sdata->vif.debugfs_dir = debugfs_create_dir(buf,
                sdata->local->hw.wiphy->debugfsdir);
+       /* deflink also has this */
+       sdata->deflink.debugfs_dir = sdata->vif.debugfs_dir;
        sdata->debugfs.subdir_stations = debugfs_create_dir("stations",
                                                        sdata->vif.debugfs_dir);
        add_files(sdata);
-
-       if (!(sdata->local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO))
+       if (!mld_vif)
                add_link_files(&sdata->deflink, sdata->vif.debugfs_dir);
 }
 
@@ -973,11 +975,21 @@ void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata)
        debugfs_rename(dir->d_parent, dir, dir->d_parent, buf);
 }
 
+void ieee80211_debugfs_recreate_netdev(struct ieee80211_sub_if_data *sdata,
+                                      bool mld_vif)
+{
+       ieee80211_debugfs_remove_netdev(sdata);
+       ieee80211_debugfs_add_netdev(sdata, mld_vif);
+       drv_vif_add_debugfs(sdata->local, sdata);
+       if (!mld_vif)
+               ieee80211_link_debugfs_drv_add(&sdata->deflink);
+}
+
 void ieee80211_link_debugfs_add(struct ieee80211_link_data *link)
 {
        char link_dir_name[10];
 
-       if (WARN_ON(!link->sdata->vif.debugfs_dir))
+       if (WARN_ON(!link->sdata->vif.debugfs_dir || link->debugfs_dir))
                return;
 
        /* For now, this should not be called for non-MLO capable drivers */
@@ -1014,7 +1026,8 @@ void ieee80211_link_debugfs_remove(struct ieee80211_link_data *link)
 
 void ieee80211_link_debugfs_drv_add(struct ieee80211_link_data *link)
 {
-       if (WARN_ON(!link->debugfs_dir))
+       if (link->sdata->vif.type == NL80211_IFTYPE_MONITOR ||
+           WARN_ON(!link->debugfs_dir))
                return;
 
        drv_link_add_debugfs(link->sdata->local, link->sdata,
index 99e688d..b226b1a 100644 (file)
@@ -1,4 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Portions:
+ * Copyright (C) 2023 Intel Corporation
+ */
 /* routines exported for debugfs handling */
 
 #ifndef __IEEE80211_DEBUGFS_NETDEV_H
@@ -7,9 +11,12 @@
 #include "ieee80211_i.h"
 
 #ifdef CONFIG_MAC80211_DEBUGFS
-void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata);
+void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata,
+                                 bool mld_vif);
 void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata);
 void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata);
+void ieee80211_debugfs_recreate_netdev(struct ieee80211_sub_if_data *sdata,
+                                      bool mld_vif);
 
 void ieee80211_link_debugfs_add(struct ieee80211_link_data *link);
 void ieee80211_link_debugfs_remove(struct ieee80211_link_data *link);
@@ -18,7 +25,7 @@ void ieee80211_link_debugfs_drv_add(struct ieee80211_link_data *link);
 void ieee80211_link_debugfs_drv_remove(struct ieee80211_link_data *link);
 #else
 static inline void ieee80211_debugfs_add_netdev(
-       struct ieee80211_sub_if_data *sdata)
+       struct ieee80211_sub_if_data *sdata, bool mld_vif)
 {}
 static inline void ieee80211_debugfs_remove_netdev(
        struct ieee80211_sub_if_data *sdata)
@@ -26,7 +33,9 @@ static inline void ieee80211_debugfs_remove_netdev(
 static inline void ieee80211_debugfs_rename_netdev(
        struct ieee80211_sub_if_data *sdata)
 {}
-
+static inline void ieee80211_debugfs_recreate_netdev(
+       struct ieee80211_sub_if_data *sdata, bool mld_vif)
+{}
 static inline void ieee80211_link_debugfs_add(struct ieee80211_link_data *link)
 {}
 static inline void ieee80211_link_debugfs_remove(struct ieee80211_link_data *link)
index 08861ec..7938ec8 100644 (file)
@@ -77,8 +77,11 @@ int drv_add_interface(struct ieee80211_local *local,
 
        sdata->flags |= IEEE80211_SDATA_IN_DRIVER;
 
-       if (!local->in_reconfig)
+       if (!local->in_reconfig) {
                drv_vif_add_debugfs(local, sdata);
+               /* initially vif is not MLD */
+               ieee80211_link_debugfs_drv_add(&sdata->deflink);
+       }
 
        return 0;
 }
index 510f8ae..124cc53 100644 (file)
@@ -1775,7 +1775,7 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
        /* need to do this after the switch so vif.type is correct */
        ieee80211_link_setup(&sdata->deflink);
 
-       ieee80211_debugfs_add_netdev(sdata);
+       ieee80211_debugfs_add_netdev(sdata, false);
 }
 
 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
index 2a78374..76c61a1 100644 (file)
@@ -235,6 +235,9 @@ static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata,
                RCU_INIT_POINTER(sdata->vif.link_conf[link_id], NULL);
        }
 
+       if (!old_links)
+               ieee80211_debugfs_recreate_netdev(sdata, true);
+
        /* link them into data structures */
        for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) {
                WARN_ON(!use_deflink &&
@@ -261,6 +264,8 @@ static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata,
                                           old_links & old_active,
                                           new_links & sdata->vif.active_links,
                                           old);
+               if (!new_links)
+                       ieee80211_debugfs_recreate_netdev(sdata, false);
        }
 
        if (ret) {