FAILED: patch "[PATCH] wifi: mac80211: refuse to make a monitor active when it has" failed to apply to 6.12-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.12-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-6.12.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 '2026092221-mashed-snippet-eb34@gregkh' --subject-prefix 'PATCH 6.12.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 6.12: omit NO_VIRTUAL_MONITOR handling, since this tree
only exposes WANT_MONITOR_VIF. Keep the existing monitors counter and cooked-monitor handling, and traverse mon_list through u.mntr.list. Update the existing reconfiguration call at wake_up rather than adding the later upstream call site. All three virtual-monitor creation calls now pass the configuration source, or NULL to select a running monitor.
Retain the MU-MIMO configuration changes so target 2b04d6556964 ("wifi: mac80211: refuse to make a monitor active when it has no queue") merges cleanly on top. No new functions are introduced. ]
Stable-dep-of: 2b04d6556964 ("wifi: mac80211: refuse to make a monitor active when it has no queue")
--- net/mac80211/cfg.c | 39 +++++++++++++++++++++++++--------- net/mac80211/ieee80211_i.h | 3 ++- net/mac80211/iface.c | 43 ++++++++++++++++++++++++++++++++------ net/mac80211/util.c | 3 ++- 4 files changed, 70 insertions(+), 18 deletions(-)
net/mac80211/cfg.c +29 -10
@@ -63,12 +63,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_link_info_change_notify (sdata, &sdata->deflink, -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) {
@@ -76,16 +78,26 @@ 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.bss_conf.mu_mimo_owner = mu_mimo_groups || mu_mimo_follow; + +/* Notify only after setting mu_mimo_owner */ +if (sdata->vif.bss_conf.mu_mimo_owner && + sdata->flags &IEEE80211_SDATA_IN_DRIVER ) +ieee80211_link_info_change_notify (sdata, &sdata->deflink, +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)) {
@@ -104,18 +116,25 @@ static int ieee80211_set_mon_options(struct ieee80211_sub_if_data *sdata,return -EBUSY ; } -/* also validate MU-MIMO change */ - monitor_sdata =wiphy_dereference (local->hw.wiphy, - 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 =wiphy_dereference (local->hw.wiphy, + local->monitor_sdata); +/* apply all changes now - no failures allowed */ -if (monitor_sdata &&ieee80211_hw_check (&local->hw,WANT_MONITOR_VIF )) -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
@@ -2045,7 +2045,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
@@ -2144,8 +2144,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
@@ -116,6 +116,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