FAILED: patch "[PATCH] wifi: mac80211: refuse to make a monitor active when it has" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.10.y
git checkout FETCH_HEAD
git cherry-pick -x 2b04d6556964ae9f89819b86a0a7801e39c3aae5
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026092224-stonework-unpicked-99d1@gregkh' --subject-prefix 'PATCH 5.10.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 2b04d6556964ae9f89819b86a0a7801e39c3aae5 Mon Sep 17 00:00:00 2001
From: Devin Wittmayer <[email protected]>
Date: Fri, 4 Sep 2026 13:03:38 -0700
Subject: [PATCH] wifi: mac80211: refuse to make a monitor active when it has
no queue
A monitor interface only gets a TXQ if it's created active, and one can't be added later. Setting the flag on a down interface is still allowed, so the driver is handed a monitor with no queue. ath9k dereferences it:
BUG: kernel NULL pointer dereference, address: 0000000000000066 RIP: 0010:ath_tx_node_init+0x49/0x170 [ath9k] ath9k_add_interface+0x10c/0x140 [ath9k] drv_add_interface+0x54/0x250 [mac80211] ieee80211_do_open+0x32f/0x800 [mac80211]
Reached with CAP_NET_ADMIN by "iw dev X set monitor active" followed by "ip link set X up". RTNL is held, so netlink operations block behind it.
Refuse the flag when there is no queue to give.
net/mac80211/cfg.c +4 -0
@@ -115,6 +115,10 @@ static int ieee80211_set_mon_options(struct ieee80211_sub_if_data *sdata,return -EBUSY ; } +/* TXQs are reserved in ieee80211_if_add() and cannot be added later */ +if ((params->flags &MONITOR_FLAG_ACTIVE ) && !sdata->vif.txq) +return -EOPNOTSUPP ; +/* validate whether MU-MIMO can be configured */ if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF) && !ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR) &&
Sasha Levin
maintainerPATCH 1/2 wifi: mac80211: track MU-MIMO configuration on disabled interfaces
From: Benjamin Berg <[email protected]>
[ Upstream commit a5aa46f1ac4f53e03b9b75cbf55634131f2f8cac ]
For monitoring, userspace will try to configure the VIF sdata, while the driver may see the monitor_sdata that is created when only monitor interfaces are up. This causes the odd situation that it may not be possible to store the MU-MIMO configuration on monitor_sdata.
Fix this by storing that information on the VIF sdata and updating the monitor_sdata when available and the interface is up. Also, adjust the code that adds monitor_sdata so that it will configure MU-MIMO based on the newly added interface or one of the existing ones.
This should give a mostly consistent behaviour when configuring MU-MIMO on sniffer interfaces. Should the user configure MU-MIMO on multiple sniffer interfaces, then mac80211 will simply select one of the configurations. This behaviour should be good enough and avoids breaking user expectations in the common scenarios.
[Backport to 5.10: retain MU-MIMO configuration on the user monitor interface and copy it to the virtual monitor on activation or reconfiguration. Use vif.mu_mimo_owner, ieee80211_bss_info_change_notify(), and rtnl_dereference() in place of the newer link and wiphy APIs. Omit NO_VIRTUAL_MONITOR handling, which does not exist in this tree, and retain the existing monitors counter and initialization paths. Preserve the original virtual monitor creation condition, since monitors includes active monitors in 5.10, while allowing an existing virtual monitor to be reconfigured. Traverse mon_list using u.mntr.list and update the existing wake_up reconfiguration call site
instead of adding the newer duplicate call. No new functions are added. This also supplies the MU-MIMO validation context needed for the subsequent monitor TXQ guard in 2b04d6556964.]
Stable-dep-of: 2b04d6556964 ("wifi: mac80211: refuse to make a monitor active when it has no queue")
--- net/mac80211/cfg.c | 35 ++++++++++++++++++++++++------- net/mac80211/ieee80211_i.h | 3 ++- net/mac80211/iface.c | 43 ++++++++++++++++++++++++++++++++------ net/mac80211/util.c | 3 ++- 4 files changed, 68 insertions(+), 16 deletions(-)
net/mac80211/cfg.c +27 -8
@@ -39,11 +39,14 @@ static void ieee80211_set_mu_mimo_follow(struct ieee80211_sub_if_data *sdata,memcpy (sdata->vif.bss_conf.mu_group.position, params->vht_mumimo_groups +WLAN_MEMBERSHIP_LEN ,WLAN_USER_POSITION_LEN ); -ieee80211_bss_info_change_notify (sdata,BSS_CHANGED_MU_GROUPS ); +/* don't care about endianness - just check for 0 */ memcpy (&membership, params->vht_mumimo_groups,WLAN_MEMBERSHIP_LEN ); mu_mimo_groups = membership !=0 ; + +/* Unset following if configured explicitly */ +eth_broadcast_addr (sdata->u.mntr.mu_follow_addr); }if (params->vht_mumimo_follow_addr) {
@@ -51,16 +54,25 @@ static void ieee80211_set_mu_mimo_follow(struct ieee80211_sub_if_data *sdata,is_valid_ether_addr (params->vht_mumimo_follow_addr);ether_addr_copy (sdata->u.mntr.mu_follow_addr, params->vht_mumimo_follow_addr); + +/* Unset current membership until a management frame is RXed */ +memset (sdata->vif.bss_conf.mu_group.membership,0 , +WLAN_MEMBERSHIP_LEN ); } sdata->vif.mu_mimo_owner = mu_mimo_groups || mu_mimo_follow; + +/* Notify only after setting mu_mimo_owner */ +if (sdata->vif.mu_mimo_owner && + sdata->flags &IEEE80211_SDATA_IN_DRIVER ) +ieee80211_bss_info_change_notify (sdata,BSS_CHANGED_MU_GROUPS ); }static int ieee80211_set_mon_options (struct ieee80211_sub_if_data *sdata,struct vif_params *params) {struct ieee80211_local *local = sdata->local; -struct ieee80211_sub_if_data *monitor_sdata; +struct ieee80211_sub_if_data *monitor_sdata =NULL ;/* check flags first */ if (params->flags &&ieee80211_sdata_running (sdata)) {
@@ -79,17 +91,24 @@ static int ieee80211_set_mon_options(struct ieee80211_sub_if_data *sdata,return -EBUSY ; } -/* also validate MU-MIMO change */ - monitor_sdata =rtnl_dereference (local->monitor_sdata); - -if (!monitor_sdata && +/* validate whether MU-MIMO can be configured */ +if (!ieee80211_hw_check (&local->hw,WANT_MONITOR_VIF ) && (params->vht_mumimo_groups || params->vht_mumimo_follow_addr))return -EOPNOTSUPP ; +/* Also update dependent monitor_sdata if required */ +if (test_bit (SDATA_STATE_RUNNING , &sdata->state)) + monitor_sdata =rtnl_dereference (local->monitor_sdata); +/* apply all changes now - no failures allowed */ -if (monitor_sdata) -ieee80211_set_mu_mimo_follow (monitor_sdata, params); +if (ieee80211_hw_check (&local->hw,WANT_MONITOR_VIF )) { +/* This is copied in when the VIF is activated */ +ieee80211_set_mu_mimo_follow (sdata, params); + +if (monitor_sdata) +ieee80211_set_mu_mimo_follow (monitor_sdata, params); + }if (params->flags) {if (ieee80211_sdata_running (sdata)) {
net/mac80211/ieee80211_i.h +2 -1
@@ -1796,7 +1796,8 @@ void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, const int offset);int ieee80211_do_open (struct wireless_dev *wdev,bool coming_up);void ieee80211_sdata_stop (struct ieee80211_sub_if_data *sdata); -int ieee80211_add_virtual_monitor (struct ieee80211_local *local); +int ieee80211_add_virtual_monitor (struct ieee80211_local *local, +struct ieee80211_sub_if_data *creator_sdata);void ieee80211_del_virtual_monitor (struct ieee80211_local *local);bool __ieee80211_recalc_txpower (struct ieee80211_sub_if_data *sdata);
net/mac80211/iface.c +37 -6
74 lines not on this page · raw message
net/mac80211/util.c +2 -1
@@ -2610,8 +2610,9 @@ int ieee80211_reconfig(struct ieee80211_local *local) wake_up: +/* Passing NULL means an interface is picked for configuration */ if (local->monitors == local->open_count && local->monitors >0 ) -ieee80211_add_virtual_monitor (local); +ieee80211_add_virtual_monitor (local,NULL );/* * Clear the WLAN_STA_BLOCK_BA flag so new aggregation
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 wifi: mac80211: refuse to make a monitor active when it has no queue
From: Devin Wittmayer <[email protected]>
[ Upstream commit 2b04d6556964ae9f89819b86a0a7801e39c3aae5 ]
A monitor interface only gets a TXQ if it's created active, and one can't be added later. Setting the flag on a down interface is still allowed, so the driver is handed a monitor with no queue. ath9k dereferences it:
BUG: kernel NULL pointer dereference, address: 0000000000000066 RIP: 0010:ath_tx_node_init+0x49/0x170 [ath9k] ath9k_add_interface+0x10c/0x140 [ath9k] drv_add_interface+0x54/0x250 [mac80211] ieee80211_do_open+0x32f/0x800 [mac80211]
Reached with CAP_NET_ADMIN by "iw dev X set monitor active" followed by "ip link set X up". RTNL is held, so netlink operations block behind it.
Refuse the flag when there is no queue to give.
--- net/mac80211/cfg.c | 4 ++++ 1 file changed, 4 insertions(+)
net/mac80211/cfg.c +4 -0
@@ -91,6 +91,10 @@ static int ieee80211_set_mon_options(struct ieee80211_sub_if_data *sdata,return -EBUSY ; } +/* TXQs are reserved in ieee80211_if_add() and cannot be added later */ +if ((params->flags &MONITOR_FLAG_ACTIVE ) && !sdata->vif.txq) +return -EOPNOTSUPP ; +/* validate whether MU-MIMO can be configured */ if (!ieee80211_hw_check (&local->hw,WANT_MONITOR_VIF ) && (params->vht_mumimo_groups || params->vht_mumimo_follow_addr))
Signature · 1 line
2.53.0