Message ID | cover.a50ea6fd728e14cfdaafeb9cfac003364713c8e7.1719843147.git-series.nbd@nbd.name |
---|---|
Headers | show |
Series | cfg80211/mac80211: support defining multiple radios per wiphy | expand |
On 7/1/2024 7:43 PM, Felix Fietkau wrote: > 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> > --- > net/mac80211/main.c | 32 ++++++++++++++++++++++++-------- > 1 file changed, 24 insertions(+), 8 deletions(-) > > diff --git a/net/mac80211/main.c b/net/mac80211/main.c > index 7578ea56c12f..58bebfdaa062 100644 > --- a/net/mac80211/main.c > +++ b/net/mac80211/main.c > @@ -1091,6 +1091,21 @@ static int ieee80211_init_cipher_suites(struct ieee80211_local *local) > return 0; > } > > +static bool > +ieee80211_ifcomb_check_radar(const struct ieee80211_iface_combination *comb, > + int n_comb) > +{ > + int i; > + > + /* DFS is not supported with multi-channel combinations yet */ > + for (i = 0; i < n_comb; i++, comb++) > + if (comb->radar_detect_widths && > + comb->num_different_channels > 1) > + return false; > + > + return true; > +} > + > int ieee80211_register_hw(struct ieee80211_hw *hw) > { > struct ieee80211_local *local = hw_to_local(hw); > @@ -1177,17 +1192,18 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) > 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]; > + } else 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_radar(radio->iface_combinations, > + radio->n_iface_combinations)) > return -EINVAL; > } > + } else { > + if (!ieee80211_ifcomb_check_radar(hw->wiphy->iface_combinations, > + hw->wiphy->n_iface_combinations)) > + return -EINVAL; > } > > /* Only HW csum features are currently compatible with mac80211 */ In ieee80211_register_hw(), mac80211 check the global iface combination against the IBSS interface max. This check may fail for the radio specific iface combination advertisement since global iface combination is sum of all radio capabilities, no ?
On 02.07.24 12:58, Karthikeyan Periyasamy wrote: > > > On 7/1/2024 7:43 PM, Felix Fietkau wrote: >> 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> >> --- >> net/mac80211/main.c | 32 ++++++++++++++++++++++++-------- >> 1 file changed, 24 insertions(+), 8 deletions(-) >> >> diff --git a/net/mac80211/main.c b/net/mac80211/main.c >> index 7578ea56c12f..58bebfdaa062 100644 >> --- a/net/mac80211/main.c >> +++ b/net/mac80211/main.c >> @@ -1091,6 +1091,21 @@ static int ieee80211_init_cipher_suites(struct ieee80211_local *local) >> return 0; >> } >> >> +static bool >> +ieee80211_ifcomb_check_radar(const struct ieee80211_iface_combination *comb, >> + int n_comb) >> +{ >> + int i; >> + >> + /* DFS is not supported with multi-channel combinations yet */ >> + for (i = 0; i < n_comb; i++, comb++) >> + if (comb->radar_detect_widths && >> + comb->num_different_channels > 1) >> + return false; >> + >> + return true; >> +} >> + >> int ieee80211_register_hw(struct ieee80211_hw *hw) >> { >> struct ieee80211_local *local = hw_to_local(hw); >> @@ -1177,17 +1192,18 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) >> 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]; >> + } else 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_radar(radio->iface_combinations, >> + radio->n_iface_combinations)) >> return -EINVAL; >> } >> + } else { >> + if (!ieee80211_ifcomb_check_radar(hw->wiphy->iface_combinations, >> + hw->wiphy->n_iface_combinations)) >> + return -EINVAL; >> } >> >> /* Only HW csum features are currently compatible with mac80211 */ > > In ieee80211_register_hw(), mac80211 check the global iface combination > against the IBSS interface max. > > This check may fail for the radio specific iface combination > advertisement since global iface combination is sum of all radio > capabilities, no ? You're right, will fix. Thanks, - Felix