diff mbox series

[v2] wifi: mac80211: handle sdata->u.ap.active flag with MLO

Message ID 20240409094017.3165560-1-quic_adisi@quicinc.com
State New
Headers show
Series [v2] wifi: mac80211: handle sdata->u.ap.active flag with MLO | expand

Commit Message

Aditya Kumar Singh April 9, 2024, 9:40 a.m. UTC
Currently whenever link AP beacon is assigned, sdata->u.ap.active flag is
set and whenever it is brought down, the flag is reset. However, with MLO,
all the links of the same MLD would use the same sdata. Hence there is no
need to set/reset for each link up/down. Also, resetting it  when only one
of the links went down is not desirable.

Add changes to set the active flag only when first link is assigned
beacon. Similarly, add changes to reset that flag only when last link is
brought down.

Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
---
v2: * Rebased on ToT
    * Used negation of active flag as condition to set the flag only
      once instead of computing number of links every time.
    * used '== 0' instead of negation for clarity.
---
 net/mac80211/cfg.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)


base-commit: a35b36e6ee5dcf323d846ec3881159e4af90c9b4
diff mbox series

Patch

diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index f67c1d021812..9d2e4a7f5513 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1232,7 +1232,9 @@  ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
 	}
 
 	rcu_assign_pointer(link->u.ap.beacon, new);
-	sdata->u.ap.active = true;
+
+	if (!sdata->u.ap.active)
+		sdata->u.ap.active = true;
 
 	if (old)
 		kfree_rcu(old, rcu_head);
@@ -1486,7 +1488,10 @@  static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
 		if (old)
 			kfree_rcu(old, rcu_head);
 		RCU_INIT_POINTER(link->u.ap.beacon, NULL);
-		sdata->u.ap.active = false;
+
+		if (ieee80211_num_beaconing_links(sdata) == 0)
+			sdata->u.ap.active = false;
+
 		goto error;
 	}
 
@@ -1619,11 +1624,12 @@  static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev,
 	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
 		netif_carrier_off(vlan->dev);
 
-	if (ieee80211_num_beaconing_links(sdata) <= 1)
+	if (ieee80211_num_beaconing_links(sdata) <= 1) {
 		netif_carrier_off(dev);
+		sdata->u.ap.active = false;
+	}
 
 	/* remove beacon and probe response */
-	sdata->u.ap.active = false;
 	RCU_INIT_POINTER(link->u.ap.beacon, NULL);
 	RCU_INIT_POINTER(link->u.ap.probe_resp, NULL);
 	RCU_INIT_POINTER(link->u.ap.fils_discovery, NULL);