diff mbox series

[1/2] wifi: nl80211/cfg80211: Stop supporting cooked monitor

Message ID 20250204111352.7004-1-Alexander@wetzel-home.de
State New
Headers show
Series [1/2] wifi: nl80211/cfg80211: Stop supporting cooked monitor | expand

Commit Message

Alexander Wetzel Feb. 4, 2025, 11:13 a.m. UTC
Unconditionally start to refuse creating cooked monitor interfaces to
phase them out.

There is no feature flag for drivers to opt-in for cooked monitor and
all known users are using/preferring the modern API since the hostapd
release 1.0 in May 2012.

Signed-off-by: Alexander Wetzel <Alexander@wetzel-home.de>
---
That's kind of brutal... But still seems to be the best way.

While we keep NL80211_MNTR_FLAG_COOK_FRAMES around to not break software
like hostapd from compiling, nl80211 will refuse anyone from using it.
Which includes drivers which still may be fine with this feature.

But adding a feature flag for that outdated feature, assign it to all
drivers without knowing if they really support that any longer seems to
be a no-go. And adding an opt-out feature for something we plan to
remove also feels off.

That way we may be able to remove NL80211_MNTR_FLAG_COOK_FRAMES in some
years...

If you think that's too hard, there is another way:
I first tried to just refuse setting the flag in mac80211, but that
triggered a warning in nl80211 when rdev_add_virtual_intf() got the
error after green-lightening the flags in nl80211_parse_mon_options().

So we could add some code in nl80211 suppressing the warning when
MONITOR_FLAG_COOK_FRAMES is set. That would open up drivers to refuse
cooperation when someone tries to use the flag.

Alexander

---
 include/net/cfg80211.h       | 2 +-
 include/uapi/linux/nl80211.h | 4 ++--
 net/wireless/nl80211.c       | 4 ++++
 3 files changed, 7 insertions(+), 3 deletions(-)

Comments

Fedor Pchelkin Feb. 7, 2025, 10:37 a.m. UTC | #1
Alexander Wetzel wrote:
> I first tried to just refuse setting the flag in mac80211, but that
> triggered a warning in nl80211 when rdev_add_virtual_intf() got the
> error after green-lightening the flags in nl80211_parse_mon_options().
> 
> So we could add some code in nl80211 suppressing the warning when
> MONITOR_FLAG_COOK_FRAMES is set. That would open up drivers to refuse
> cooperation when someone tries to use the flag.

Is that the same WARNING which is being fixed at [1] or something new?

FWIW, I think the current series would not go to the stable trees (at
least there are no Fixes ot Cc: stable tags), while [1] should go there
to suppress the currently observed and triggerable WARNING regarding
setting the outdated cooked monitor mode mixed with some other modes.

[1]: https://lore.kernel.org/linux-wireless/20250131152657.5606-1-v.shevtsov@mt-integration.ru/
Fedor Pchelkin Feb. 14, 2025, 8:37 p.m. UTC | #2
On Fri, 07. Feb 13:27, Alexander Wetzel wrote:
> On 07.02.25 11:37, Fedor Pchelkin wrote:
> > Alexander Wetzel wrote:
> > > I first tried to just refuse setting the flag in mac80211, but that
> > > triggered a warning in nl80211 when rdev_add_virtual_intf() got the
> > > error after green-lightening the flags in nl80211_parse_mon_options().
> > > 
> > > So we could add some code in nl80211 suppressing the warning when
> > > MONITOR_FLAG_COOK_FRAMES is set. That would open up drivers to refuse
> > > cooperation when someone tries to use the flag.
> > 
> > Is that the same WARNING which is being fixed at [1] or something new?
> > 
> 
> While the patch here also kind of solves the issue from [1] it's unrelated.
> The warning I mentioned above was a different one. But since it was caused
> by experimental code never published noting I would call "new".
> 
> I tried to explain that mac80211 - or any other driver using nl80211 - can't
> refuse the cooked monitor flag with the current API to explain the brutal
> handling of that in the patch here.
> (The flag check should be handled within nl80211_parse_mon_options(). But
> since the drivers have no way to signal cooked monitor support it can't be
> checked there by any reasonable means.)
> 
> Here the WARN() my patch triggered:
> 
>         wdev = rdev_add_virtual_intf(rdev,
>                              nla_data(info->attrs[NL80211_ATTR_IFNAME]),
>                                 NET_NAME_USER, type, &params);
>         if (WARN_ON(!wdev)) {
>                 nlmsg_free(msg);
>                 return -EPROTO;
> 
> My not published patch refused the flag when rdev_add_virtual_intf() was
> creating the interface with the flag.
> 
> With the feedback from Johannes - that only mac80211 ever used cooked
> monitor mode - the current patch seems to be the preferred way and we don't
> have to find a better - and for sure ugly - way to handle that.
> 
> 
> > FWIW, I think the current series would not go to the stable trees (at
> > least there are no Fixes ot Cc: stable tags), while [1] should go there
> > to suppress the currently observed and triggerable WARNING regarding
> > setting the outdated cooked monitor mode mixed with some other modes.
> > 
> 
> I also would not like to drop cooked monitor support for any stable kernel.
> While that would fix some monitor handling issues I see no real need to even
> fix these in the stable series.
> Messung up virtual monitor interfaces by a special order creating them or
> using suspend/resume is hardly something the users of them will care about.
> Or they would have told us that long ago:-)

Okay, thanks for clarifying!
diff mbox series

Patch

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 363d7dd2255a..a72e7eb7027f 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -2265,7 +2265,7 @@  static inline int cfg80211_get_station(struct net_device *dev,
  * @MONITOR_FLAG_PLCPFAIL: pass frames with bad PLCP
  * @MONITOR_FLAG_CONTROL: pass control frames
  * @MONITOR_FLAG_OTHER_BSS: disable BSSID filtering
- * @MONITOR_FLAG_COOK_FRAMES: report frames after processing
+ * @MONITOR_FLAG_COOK_FRAMES: deprecated, will unconditionally be refused
  * @MONITOR_FLAG_ACTIVE: active monitor, ACKs frames on its MAC address
  * @MONITOR_FLAG_SKIP_TX: do not pass locally transmitted frames
  */
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index f6c1b181c886..9d8ecf20ef0d 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -4727,8 +4727,8 @@  enum nl80211_survey_info {
  * @NL80211_MNTR_FLAG_PLCPFAIL: pass frames with bad PLCP
  * @NL80211_MNTR_FLAG_CONTROL: pass control frames
  * @NL80211_MNTR_FLAG_OTHER_BSS: disable BSSID filtering
- * @NL80211_MNTR_FLAG_COOK_FRAMES: report frames after processing.
- *	overrides all other flags.
+ * @NL80211_MNTR_FLAG_COOK_FRAMES: deprecated
+ *	will unconditionally be refused
  * @NL80211_MNTR_FLAG_ACTIVE: use the configured MAC address
  *	and ACK incoming unicast packets.
  * @NL80211_MNTR_FLAG_SKIP_TX: do not pass local tx packets
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index d7d3da0f6833..8bd09110d393 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -4245,6 +4245,10 @@  static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev,
 		change = true;
 	}
 
+	/* MONITOR_FLAG_COOK_FRAMES is deprecated, refuse cooperation */
+	if (params->flags & MONITOR_FLAG_COOK_FRAMES)
+		return -EOPNOTSUPP;
+
 	if (params->flags & MONITOR_FLAG_ACTIVE &&
 	    !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR))
 		return -EOPNOTSUPP;