This contains the following commits: ``` git log --oneline v6.12.52...v6.12.61 -- drivers/net/wireless/ net/mac80211/ net/wireless/ a1eb56723b32 wifi: ath12k: correctly handle mcast packets for clients c0a9c2c1b7b9 wifi: mac80211: use wiphy_hrtimer_work for csa.switch_work d4caee32a9f8 wifi: cfg80211: add an hrtimer based delayed work item 6455948c8aab wifi: mac80211: reject address change while connecting 80dc5a2ce5b7 wifi: ath11k: Clear affinity hint before calling ath11k_pcic_free_irq() in error path acd24d509227 wifi: mac80211: skip rate verification for not captured PSDUs 53cf801b8555 wifi: ath11k: zero init info->status in wmi_process_mgmt_tx_comp() e8fa86b0bd96 wifi: mac80211_hwsim: Limit destroy_on_close radio removal to netgroup 77d4afd6c78b Revert "wifi: ath10k: avoid unnecessary wait for service ready message" 07d862c7de3d wifi: ath12k: Increase DP_REO_CMD_RING_SIZE to 256 522734fc807c wifi: mac80211: Track NAN interface start/stop 8db790c2491e wifi: ath10k: Fix connection after GTK rekeying 72f1984246e6 wifi: rtw89: renew a completion for each H2C command waiting C2H event 336da4414300 wifi: rtw89: obtain RX path from ppdu status IE00 da91687f01f4 wifi: mt76: mt7996: fix memory leak on mt7996_mcu_sta_key_tlv error a534dd44b70e wifi: mt76: mt76_eeprom_override to int aa5ed215cfe8 wifi: mt76: mt7996: Temporarily disable EPCS efe2ef24feab wifi: mt76: mt7921: Add 160MHz beamformee capability for mt7922 device 5de410dfb4d9 wifi: mac80211: Fix HE capabilities element check f157d1cb2cdc wifi: iwlwifi: fw: Add ASUS to PPAG and TAS list c9df78e84e85 wifi: mac80211: Fix 6 GHz Band capabilities element advertisement in lower bands 958234997dd5 wifi: rtw89: fix BSSID comparison for non-transmitted BSSID ca18975c4de2 wifi: rtw89: wow: remove notify during WoWLAN net-detect bc1ca06998c1 wifi: rtw88: sdio: use indirect IO for device registers before power-on 8ebef59d0294 wifi: rtw89: print just once for unknown C2H events 5596a90c8952 wifi: mac80211: fix key tailroom accounting leak 23b8682f05ec wifi: mac80211: don't mark keys for inactive links as uploaded e3373f10c6a6 wifi: ath11k: avoid bit operation on key flags 50f50dd024b4 wifi: ath11k: add support for MU EDCA 2a6cd5951ba8 wifi: ath12k: free skb during idr cleanup callback 775e37df2acc wifi: ath11k: Add missing platform IDs for quirk table c4840991ee4c wifi: ath10k: Fix memory leak on unsupported WMI command a6eed58249e7 wifi: brcmfmac: fix crash while sending Action Frames in standalone AP Mode 57100b87c778 wifi: ath12k: fix read pointer after free in ath12k_mac_assign_vif_to_vdev() 4a63523d3541 wifi: cfg80211: Add missing lock in cfg80211_check_and_end_cac() e9fd43b799d2 wifi: rtw89: avoid possible TX wait initialization race b419093e5e42 wifi: mt76: mt7921u: Add VID/PID for Netgear A7500 feb1774aaf85 wifi: mt76: mt7925u: Add VID/PID for Netgear A9000 bd3ac455a88d wifi: ath11k: HAL SRNG: don't deinitialize and re-initialize again 8055133a9f64 wifi: rtw89: avoid circular locking dependency in ser_state_run() 1c873416758f wifi: mac80211: fix Rx packet handling when pubsta information is not available 6e7d9fa61d7d wifi: ath10k: avoid unnecessary wait for service ready message 8d4f6ab4c53e wifi: ath12k: fix wrong logging ID used for CE fc00890c55e3 wifi: mt76: mt7915: fix mt7981 pre-calibration e18c4e6ba36c wifi: mt76: mt7996: Convert mt7996_wed_rro_addr to LE f481404a9826 wifi: mt76: mt7996: Fix RX packets configuration for primary WED device 57519239c76c wifi: mt76: fix potential memory leak in mt76_wmac_probe() 27c8e2e4b56f wifi: iwlwifi: Remove redundant header files 605402433eb8 wifi: mwifiex: send world regulatory domain to driver ``` The removed patch was added upstream. Link: https://github.com/openwrt/openwrt/pull/21134 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
142 lines
4.6 KiB
Diff
142 lines
4.6 KiB
Diff
From: Maharaja Kennadyrajan <maharaja.kennadyrajan@oss.qualcomm.com>
|
|
Date: Fri, 18 Jul 2025 11:38:37 +0530
|
|
Subject: [PATCH] wifi: mac80211: extend connection monitoring for MLO
|
|
|
|
Currently, reset connection monitor (ieee80211_sta_reset_conn_monitor())
|
|
timer is handled only for non-AP non-MLD STA and do not support non-AP MLD
|
|
STA. The current implementation checks for the CSA active and update the
|
|
monitor timer with the timeout value of deflink and reset the timer based
|
|
on the deflink's timeout value else schedule the connection loss work when
|
|
the deflink is timed out and it won't work for the non-AP MLD STA.
|
|
|
|
Handle the reset connection monitor timer for non-AP MLD STA by updating
|
|
the monitor timer with the timeout value which is determined based on the
|
|
link that will expire last among all the links in MLO. If at least one link
|
|
has not timed out, the timer is updated accordingly with the latest timeout
|
|
value else schedule the connection loss work when all links have timed out.
|
|
|
|
Remove the MLO-related WARN_ON() checks in the beacon and connection
|
|
monitoring logic code paths as they support MLO now.
|
|
|
|
Signed-off-by: Maharaja Kennadyrajan <maharaja.kennadyrajan@oss.qualcomm.com>
|
|
Link: https://patch.msgid.link/20250718060837.59371-5-maharaja.kennadyrajan@oss.qualcomm.com
|
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
---
|
|
|
|
--- a/net/mac80211/mlme.c
|
|
+++ b/net/mac80211/mlme.c
|
|
@@ -3842,9 +3842,6 @@ static void ieee80211_mgd_probe_ap_send(
|
|
|
|
lockdep_assert_wiphy(sdata->local->hw.wiphy);
|
|
|
|
- if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif)))
|
|
- return;
|
|
-
|
|
/*
|
|
* Try sending broadcast probe requests for the last three
|
|
* probe requests after the first ones failed since some
|
|
@@ -3890,9 +3887,6 @@ static void ieee80211_mgd_probe_ap(struc
|
|
|
|
lockdep_assert_wiphy(sdata->local->hw.wiphy);
|
|
|
|
- if (WARN_ON_ONCE(ieee80211_vif_is_mld(&sdata->vif)))
|
|
- return;
|
|
-
|
|
if (!ieee80211_sdata_running(sdata))
|
|
return;
|
|
|
|
@@ -7951,36 +7945,73 @@ static void ieee80211_sta_bcn_mon_timer(
|
|
&sdata->u.mgd.beacon_connection_loss_work);
|
|
}
|
|
|
|
+static unsigned long
|
|
+ieee80211_latest_active_link_conn_timeout(struct ieee80211_sub_if_data *sdata)
|
|
+{
|
|
+ unsigned long latest_timeout = 0;
|
|
+ unsigned int link_id;
|
|
+ struct sta_info *sta;
|
|
+
|
|
+ rcu_read_lock();
|
|
+
|
|
+ sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
|
|
+ if (!sta)
|
|
+ goto out;
|
|
+
|
|
+ for (link_id = 0; link_id < ARRAY_SIZE(sta->link);
|
|
+ link_id++) {
|
|
+ struct link_sta_info *link_sta;
|
|
+ unsigned long timeout;
|
|
+
|
|
+ link_sta = rcu_dereference(sta->link[link_id]);
|
|
+ if (!link_sta)
|
|
+ continue;
|
|
+
|
|
+ timeout = link_sta->status_stats.last_ack;
|
|
+ if (time_before(timeout, link_sta->rx_stats.last_rx))
|
|
+ timeout = link_sta->rx_stats.last_rx;
|
|
+
|
|
+ timeout += IEEE80211_CONNECTION_IDLE_TIME;
|
|
+
|
|
+ /*
|
|
+ * latest_timeout holds the timeout of the link
|
|
+ * that will expire last among all links in an
|
|
+ * non-AP MLD STA. This ensures that the connection
|
|
+ * monitor timer is only reset if at least one link
|
|
+ * is still active, and it is scheduled to fire at
|
|
+ * the latest possible timeout.
|
|
+ */
|
|
+ if (time_is_after_jiffies(timeout) &&
|
|
+ time_after(timeout, latest_timeout))
|
|
+ latest_timeout = timeout;
|
|
+ }
|
|
+
|
|
+out:
|
|
+ rcu_read_unlock();
|
|
+
|
|
+ return latest_timeout;
|
|
+}
|
|
+
|
|
static void ieee80211_sta_conn_mon_timer(struct timer_list *t)
|
|
{
|
|
struct ieee80211_sub_if_data *sdata =
|
|
from_timer(sdata, t, u.mgd.conn_mon_timer);
|
|
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
|
struct ieee80211_local *local = sdata->local;
|
|
- struct sta_info *sta;
|
|
- unsigned long timeout;
|
|
+ unsigned long latest_timeout;
|
|
|
|
- if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif)))
|
|
+ if (ieee80211_is_csa_in_progress(sdata))
|
|
return;
|
|
|
|
- if (sdata->vif.bss_conf.csa_active &&
|
|
- !sdata->deflink.u.mgd.csa.waiting_bcn)
|
|
- return;
|
|
-
|
|
- sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
|
|
- if (!sta)
|
|
- return;
|
|
-
|
|
- timeout = sta->deflink.status_stats.last_ack;
|
|
- if (time_before(sta->deflink.status_stats.last_ack, sta->deflink.rx_stats.last_rx))
|
|
- timeout = sta->deflink.rx_stats.last_rx;
|
|
- timeout += IEEE80211_CONNECTION_IDLE_TIME;
|
|
+ latest_timeout = ieee80211_latest_active_link_conn_timeout(sdata);
|
|
|
|
- /* If timeout is after now, then update timer to fire at
|
|
- * the later date, but do not actually probe at this time.
|
|
- */
|
|
- if (time_is_after_jiffies(timeout)) {
|
|
- mod_timer(&ifmgd->conn_mon_timer, round_jiffies_up(timeout));
|
|
+ /*
|
|
+ * If latest timeout is after now, then update timer to fire at
|
|
+ * the later date, but do not actually probe at this time.
|
|
+ */
|
|
+ if (latest_timeout) {
|
|
+ mod_timer(&ifmgd->conn_mon_timer,
|
|
+ round_jiffies_up(latest_timeout));
|
|
return;
|
|
}
|
|
|