mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-11 15:33:03 +00:00
89 lines
2.7 KiB
Diff
89 lines
2.7 KiB
Diff
|
From: Felix Fietkau <nbd@nbd.name>
|
||
|
Date: Thu, 6 Jun 2024 12:19:08 +0200
|
||
|
Subject: [PATCH] wifi: mac80211: add support for DFS with multiple
|
||
|
radios
|
||
|
|
||
|
DFS can be supported with multi-channel combinations, as long as each DFS
|
||
|
capable radio only supports one channel.
|
||
|
|
||
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||
|
---
|
||
|
|
||
|
--- a/net/mac80211/main.c
|
||
|
+++ b/net/mac80211/main.c
|
||
|
@@ -1084,6 +1084,27 @@ static int ieee80211_init_cipher_suites(
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+static bool
|
||
|
+ieee80211_ifcomb_check(const struct ieee80211_iface_combination *c, int n_comb)
|
||
|
+{
|
||
|
+ int i, j;
|
||
|
+
|
||
|
+ for (i = 0; i < n_comb; i++, c++) {
|
||
|
+ /* DFS is not supported with multi-channel combinations yet */
|
||
|
+ if (c->radar_detect_widths &&
|
||
|
+ c->num_different_channels > 1)
|
||
|
+ return false;
|
||
|
+
|
||
|
+ /* mac80211 doesn't support more than one IBSS interface */
|
||
|
+ for (j = 0; j < c->n_limits; j++)
|
||
|
+ if ((c->limits[j].types & BIT(NL80211_IFTYPE_ADHOC)) &&
|
||
|
+ c->limits[j].max > 1)
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ return true;
|
||
|
+}
|
||
|
+
|
||
|
int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||
|
{
|
||
|
struct ieee80211_local *local = hw_to_local(hw);
|
||
|
@@ -1173,17 +1194,20 @@ int ieee80211_register_hw(struct ieee802
|
||
|
if (comb->num_different_channels > 1)
|
||
|
return -EINVAL;
|
||
|
}
|
||
|
- } else {
|
||
|
- /* DFS is not supported with multi-channel combinations yet */
|
||
|
- for (i = 0; i < local->hw.wiphy->n_iface_combinations; i++) {
|
||
|
- const struct ieee80211_iface_combination *comb;
|
||
|
+ }
|
||
|
|
||
|
- comb = &local->hw.wiphy->iface_combinations[i];
|
||
|
+ if (hw->wiphy->n_radio) {
|
||
|
+ for (i = 0; i < hw->wiphy->n_radio; i++) {
|
||
|
+ const struct wiphy_radio *radio = &hw->wiphy->radio[i];
|
||
|
|
||
|
- if (comb->radar_detect_widths &&
|
||
|
- comb->num_different_channels > 1)
|
||
|
+ if (!ieee80211_ifcomb_check(radio->iface_combinations,
|
||
|
+ radio->n_iface_combinations))
|
||
|
return -EINVAL;
|
||
|
}
|
||
|
+ } else {
|
||
|
+ if (!ieee80211_ifcomb_check(hw->wiphy->iface_combinations,
|
||
|
+ hw->wiphy->n_iface_combinations))
|
||
|
+ return -EINVAL;
|
||
|
}
|
||
|
|
||
|
/* Only HW csum features are currently compatible with mac80211 */
|
||
|
@@ -1313,18 +1337,6 @@ int ieee80211_register_hw(struct ieee802
|
||
|
hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
|
||
|
hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR);
|
||
|
|
||
|
- /* mac80211 doesn't support more than one IBSS interface right now */
|
||
|
- for (i = 0; i < hw->wiphy->n_iface_combinations; i++) {
|
||
|
- const struct ieee80211_iface_combination *c;
|
||
|
- int j;
|
||
|
-
|
||
|
- c = &hw->wiphy->iface_combinations[i];
|
||
|
-
|
||
|
- for (j = 0; j < c->n_limits; j++)
|
||
|
- if ((c->limits[j].types & BIT(NL80211_IFTYPE_ADHOC)) &&
|
||
|
- c->limits[j].max > 1)
|
||
|
- return -EINVAL;
|
||
|
- }
|
||
|
|
||
|
local->int_scan_req = kzalloc(sizeof(*local->int_scan_req) +
|
||
|
sizeof(void *) * channels, GFP_KERNEL);
|