From: Felix Fietkau <nbd@nbd.name>
To: Ben Greear <greearb@candelatech.com>
Cc: "linux-wireless@vger.kernel.org" <linux-wireless@vger.kernel.org>
Subject: Re: [RFC 1/2] cfg80211: add support for advertising multiple radios belonging to a wiphy
Date: Wed, 22 May 2024 16:46:11 +0200 [thread overview]
Message-ID: <8c279839-34da-4a3e-a807-64050d0af6ae@nbd.name> (raw)
In-Reply-To: <4f0d56b4-3911-21fb-1460-7f7ed1301cd3@candelatech.com>
On 22.05.24 16:23, Ben Greear wrote:
> On 5/22/24 05:30, Felix Fietkau wrote:
>> The prerequisite for MLO support in cfg80211/mac80211 is that all the links
>> participating in MLO must be from the same wiphy/ieee80211_hw. To meet this
>> expectation, some drivers may need to group multiple discrete hardware each
>> acting as a link in MLO under single wiphy.
>> With this change, the bands and supported frequencies of each individual
>> radio are reported to user space. This allows user space to figure out the
>> limitations of what combination of channels can be used concurrently.
>>
>> Signed-off-by: Felix Fietkau <nbd@nbd.name>
>> ---
>> include/net/cfg80211.h | 34 ++++++++++++++++
>> include/uapi/linux/nl80211.h | 48 +++++++++++++++++++++++
>> net/wireless/nl80211.c | 75 ++++++++++++++++++++++++++++++++++++
>> 3 files changed, 157 insertions(+)
>>
>> diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
>> index f2ca495ac9f8..58d8375ffa11 100644
>> --- a/include/net/cfg80211.h
>> +++ b/include/net/cfg80211.h
>> @@ -5407,6 +5407,34 @@ struct wiphy_iftype_akm_suites {
>> int n_akm_suites;
>> };
>>
>> +/**
>> + * struct wiphy_radio_freq_range - wiphy frequency range
>> + * @start_freq: start range edge frequency (kHz)
>> + * @end_freq: end range edge frequency (kHz)
>> + */
>> +struct wiphy_radio_freq_range {
>> + u32 start_freq;
>> + u32 end_freq;
>> +};
>> +
>> +
>> +/**
>> + * struct wiphy_radio - This structure describes a physical radio belonging
>> + * to a wiphy. It is used to describe concurrent-channel capabilities of the
>> + * phy. Only one channel can be active on the radio described by struct
>> + * wiphy_radio.
>> + *
>> + * @band_mask: Mask of enum nl80211_band describing the bands that the radio
>> + * can operate on.
>> + * @num_freq_range: number of elements in @freq_range
>> + * @freq_range: frequency range that the radio can operate on (optional)
>> + */
>> +struct wiphy_radio {
>> + u16 band_mask;
>> + u16 n_freq_range;
>> + const struct wiphy_radio_freq_range *freq_range;
>> +};
>
> Do you think we might should add the radio_idx in here so that we don't
> depend on position in the array in case we need to add/remove radios
> for some reason?
>
> Or radio MAC addr or some other more persistent way to detect exactly
> what this is in user-space?
Why would radios be added/removed at run time?
>> #define CFG80211_HW_TIMESTAMP_ALL_PEERS 0xffff
>>
>> /**
>> @@ -5625,6 +5653,9 @@ struct wiphy_iftype_akm_suites {
>> * A value of %CFG80211_HW_TIMESTAMP_ALL_PEERS indicates the driver
>> * supports enabling HW timestamping for all peers (i.e. no need to
>> * specify a mac address).
>> + *
>> + * @radio: radios belonging to this wiphy
>> + * @n_radio: number of radios
>> */
>> struct wiphy {
>> struct mutex mtx;
>> @@ -5775,6 +5806,9 @@ struct wiphy {
>>
>> u16 hw_timestamp_max_peers;
>>
>> + const struct wiphy_radio *radio;
>> + int n_radio;
>> +
>> char priv[] __aligned(NETDEV_ALIGN);
>> };
>>
>> diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
>> index f917bc6c9b6f..dfb01d673094 100644
>> --- a/include/uapi/linux/nl80211.h
>> +++ b/include/uapi/linux/nl80211.h
>> @@ -3401,6 +3401,8 @@ enum nl80211_attrs {
>>
>> NL80211_ATTR_ASSOC_SPP_AMSDU,
>>
>> + NL80211_ATTR_RADIOS,
>> +
>> /* add attributes here, update the policy in nl80211.c */
>>
>> __NL80211_ATTR_AFTER_LAST,
>> @@ -7999,4 +8001,50 @@ enum nl80211_ap_settings_flags {
>> NL80211_AP_SETTINGS_SA_QUERY_OFFLOAD_SUPPORT = 1 << 1,
>> };
>>
>> +/**
>> + * enum nl80211_wiphy_radio_attrs - wiphy radio attributes
>> + *
>> + * @__NL80211_WIPHY_RADIO_ATTR_INVALID: Invalid
>> + *
>> + * @NL80211_WIPHY_RADIO_ATTR_BAND_MASK: Bitmask of bands supported by this
>> + * radio.
>> + *
>> + * @NL80211_WIPHY_RADIO_ATTR_FREQ_RANGES: Nested array of frequency ranges
>> + * supported by this radio.
>> + *
>> + * @__NL80211_WIPHY_RADIO_ATTR_LAST: Internal
>> + * @NL80211_WIPHY_RADIO_ATTR_MAX: Highest attribute
>> + */
>> +enum nl80211_wiphy_radio_attrs {
>> + __NL80211_WIPHY_RADIO_ATTR_INVALID,
>> +
>> + NL80211_WIPHY_RADIO_ATTR_BAND_MASK,
>> + NL80211_WIPHY_RADIO_ATTR_FREQ_RANGES,
>> +
>> + /* keep last */
>> + __NL80211_WIPHY_RADIO_ATTR_LAST,
>> + NL80211_WIPHY_RADIO_ATTR_MAX = __NL80211_WIPHY_RADIO_ATTR_LAST - 1,
>> +};
>> +
>> +/**
>> + * enum nl80211_wiphy_radio_freq_range - wiphy radio frequency range
>> + *
>> + * @__NL80211_WIPHY_RADIO_FREQ_ATTR_INVALID: Invalid
>> + *
>> + * @NL80211_WIPHY_RADIO_FREQ_ATTR_START: Frequency range start
>> + * @NL80211_WIPHY_RADIO_FREQ_ATTR_END: Frequency range end
>> + *
>> + * @__NL80211_WIPHY_RADIO_FREQ_ATTR_LAST: Internal
>> + * @NL80211_WIPHY_RADIO_FREQ_ATTR_MAX: Highest attribute
>> + */
>> +enum nl80211_wiphy_radio_freq_range {
>> + __NL80211_WIPHY_RADIO_FREQ_ATTR_INVALID,
>> +
>> + NL80211_WIPHY_RADIO_FREQ_ATTR_START,
>> + NL80211_WIPHY_RADIO_FREQ_ATTR_END,
>> +
>> + __NL80211_WIPHY_RADIO_FREQ_ATTR_LAST,
>> + NL80211_WIPHY_RADIO_FREQ_ATTR_MAX = __NL80211_WIPHY_RADIO_FREQ_ATTR_LAST - 1,
>> +};
>> +
>> #endif /* __LINUX_NL80211_H */
>> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
>> index 3c0bca4238d3..c07abdf104ec 100644
>> --- a/net/wireless/nl80211.c
>> +++ b/net/wireless/nl80211.c
>> @@ -2392,6 +2392,78 @@ static int nl80211_put_mbssid_support(struct wiphy *wiphy, struct sk_buff *msg)
>> return -ENOBUFS;
>> }
>>
>> +static int nl80211_put_radio(struct wiphy *wiphy, struct sk_buff *msg, int idx)
>> +{
>> + const struct wiphy_radio *r = &wiphy->radio[idx];
>
> Maybe allow radio[] array to be sparse (ie, idx 0 is there, idx 2 is there, idx 1 is NULL
> because user wants to remove that radio from MLO consideration for whatever reason?
Why should the user want to do this?
- Felix
next prev parent reply other threads:[~2024-05-22 14:46 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-22 12:30 [RFC 1/2] cfg80211: add support for advertising multiple radios belonging to a wiphy Felix Fietkau
2024-05-22 12:30 ` [RFC 2/2] mac80211: ensure that only one channel context is active per radio Felix Fietkau
2024-05-22 14:23 ` [RFC 1/2] cfg80211: add support for advertising multiple radios belonging to a wiphy Ben Greear
2024-05-22 14:46 ` Felix Fietkau [this message]
2024-05-22 16:43 ` Ben Greear
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8c279839-34da-4a3e-a807-64050d0af6ae@nbd.name \
--to=nbd@nbd.name \
--cc=greearb@candelatech.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox