Message ID | 20250310200237.652950-2-aloka.dixit@oss.qualcomm.com |
---|---|
State | New |
Headers | show |
Series | wifi: MBSSID support in MLO | expand |
Hi Aloka, all, > + * @NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID: Link ID of the transmitted profile. > + * This parameter is mandatory if the transmitted profile is part of an MLD > + * and the interface getting configured is a non-transmitted profile. For all > + * other cases it will be ignored. So I guess it's a question of what "the interface getting configured" means, but I guess you could set up the transmitting interface? > @@ -5561,6 +5563,18 @@ static int nl80211_parse_mbssid_config(struct wiphy *wiphy, > } > > config->tx_wdev = tx_netdev->ieee80211_ptr; > + > + if (config->tx_wdev->valid_links) { > + if (!tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]) > + return -ENOLINK; > + > + config->tx_link_id = > + nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]); > + > + if (!(config->tx_wdev->valid_links & > + BIT(config->tx_link_id))) > + return -ENOLINK; > + } > } else { > config->tx_wdev = dev->ieee80211_ptr; > } So shouldn't that be one layer out, so the link ID can also apply if no interface index was given, i.e. we took the else branch? Seems like that should be applicable, or is there a specific reason not to apply in that case? johannes
On 3/12/2025 1:55 AM, Johannes Berg wrote: > Hi Aloka, all, > >> + * @NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID: Link ID of the transmitted profile. >> + * This parameter is mandatory if the transmitted profile is part of an MLD >> + * and the interface getting configured is a non-transmitted profile. For all >> + * other cases it will be ignored. > > So I guess it's a question of what "the interface getting configured" > means, but I guess you could set up the transmitting interface? > Right, if the interface getting configured is the transmitted profile the link_id is ignored. >> @@ -5561,6 +5563,18 @@ static int nl80211_parse_mbssid_config(struct wiphy *wiphy, >> } >> >> config->tx_wdev = tx_netdev->ieee80211_ptr; >> + >> + if (config->tx_wdev->valid_links) { >> + if (!tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]) >> + return -ENOLINK; >> + >> + config->tx_link_id = >> + nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]); >> + >> + if (!(config->tx_wdev->valid_links & >> + BIT(config->tx_link_id))) >> + return -ENOLINK; >> + } >> } else { >> config->tx_wdev = dev->ieee80211_ptr; >> } > > So shouldn't that be one layer out, so the link ID can also apply if no > interface index was given, i.e. we took the else branch? Seems like that > should be applicable, or is there a specific reason not to apply in that > case? The 'else' case in the highlighted snippet above is the same scenario as the 'else' case you referred to, which is one layer out: "else if (!config->index) {". Both are executed when the interface getting configured is the transmitting interface. The difference between these two 'else's is that in one case userspace explicitly provides "NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX" and in other it hasn't. Similarly, for MLO, mac80211 does not need the link_id of the tx interface because it already has the link_conf for it as part of basic AP configuration parameters, hence link_id is ignored in both 'else's. Thanks.
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 6b170a8d086c..0f7a4f410d45 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -1286,11 +1286,13 @@ struct cfg80211_crypto_settings { * struct cfg80211_mbssid_config - AP settings for multi bssid * * @tx_wdev: pointer to the transmitted interface in the MBSSID set + * @tx_link_id: link ID of the transmitted profile in an MLD, default is 0. * @index: index of this AP in the multi bssid group. * @ema: set to true if the beacons should be sent out in EMA mode. */ struct cfg80211_mbssid_config { struct wireless_dev *tx_wdev; + u8 tx_link_id; u8 index; bool ema; }; diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 9d8ecf20ef0d..ed2a181a2557 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -8022,6 +8022,11 @@ enum nl80211_sar_specs_attrs { * Setting this flag is permitted only if the driver advertises EMA support * by setting wiphy->ema_max_profile_periodicity to non-zero. * + * @NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID: Link ID of the transmitted profile. + * This parameter is mandatory if the transmitted profile is part of an MLD + * and the interface getting configured is a non-transmitted profile. For all + * other cases it will be ignored. + * * @__NL80211_MBSSID_CONFIG_ATTR_LAST: Internal * @NL80211_MBSSID_CONFIG_ATTR_MAX: highest attribute */ @@ -8033,6 +8038,7 @@ enum nl80211_mbssid_config_attributes { NL80211_MBSSID_CONFIG_ATTR_INDEX, NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX, NL80211_MBSSID_CONFIG_ATTR_EMA, + NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID, /* keep last */ __NL80211_MBSSID_CONFIG_ATTR_LAST, diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 2c4e06610a79..0ebbce9fbaf4 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -469,6 +469,8 @@ nl80211_mbssid_config_policy[NL80211_MBSSID_CONFIG_ATTR_MAX + 1] = { [NL80211_MBSSID_CONFIG_ATTR_INDEX] = { .type = NLA_U8 }, [NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX] = { .type = NLA_U32 }, [NL80211_MBSSID_CONFIG_ATTR_EMA] = { .type = NLA_FLAG }, + [NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID] = + NLA_POLICY_MAX(NLA_U8, IEEE80211_MLD_MAX_NUM_LINKS), }; static const struct nla_policy @@ -5561,6 +5563,18 @@ static int nl80211_parse_mbssid_config(struct wiphy *wiphy, } config->tx_wdev = tx_netdev->ieee80211_ptr; + + if (config->tx_wdev->valid_links) { + if (!tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]) + return -ENOLINK; + + config->tx_link_id = + nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]); + + if (!(config->tx_wdev->valid_links & + BIT(config->tx_link_id))) + return -ENOLINK; + } } else { config->tx_wdev = dev->ieee80211_ptr; }