From: Johannes Berg Date: Wed, 15 Apr 2026 12:42:15 +0000 (+0200) Subject: wifi: cfg80211: provide HT/VHT operation for AP beacon X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0b8201bc23425104cf1ca4de9470bad2456bd2be;p=thirdparty%2Fkernel%2Flinux.git wifi: cfg80211: provide HT/VHT operation for AP beacon In addition to providing HE/EHT/UHR operation, also check and provide HT/VHT operation, so that drivers have it and can use it, e.g. to correctly calculate station bandwidth. Reviewed-by: Miriam Rachel Korenblit Link: https://patch.msgid.link/20260415144514.32ad98454543.Ia9692671b699164edcc0bdaf4fdbdbefc50b18f8@changeid Signed-off-by: Johannes Berg --- diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 7070e577342b2..a40ab36b8edb0 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -1398,6 +1398,8 @@ struct cfg80211_rnr_elems { * attribute is present in beacon data or not. * @ht_required: stations must support HT * @vht_required: stations must support VHT + * @ht_oper: HT operation element (or %NULL if HT isn't enabled) + * @vht_oper: VHT operation element (or %NULL if VHT isn't enabled) * @he_oper: HE operation IE (or %NULL if HE isn't enabled) * @eht_oper: EHT operation IE (or %NULL if EHT isn't enabled) * @uhr_oper: UHR operation (or %NULL if UHR isn't enabled) @@ -1427,6 +1429,8 @@ struct cfg80211_beacon_data { bool he_bss_color_valid; bool ht_required, vht_required; + const struct ieee80211_ht_operation *ht_oper; + const struct ieee80211_vht_operation *vht_oper; const struct ieee80211_he_operation *he_oper; const struct ieee80211_eht_operation *eht_oper; const struct ieee80211_uhr_operation *uhr_oper; diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index a4dbe6ff0045e..056c779fdb563 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -6730,6 +6730,24 @@ static int nl80211_calculate_ap_operation(struct genl_info *info, } } + op = cfg80211_find_elem(WLAN_EID_HT_OPERATION, ies, ies_len); + if (op) { + if (op->datalen < sizeof(*bcn->ht_oper)) { + GENL_SET_ERR_MSG(info, "bad HT operation in beacon"); + return -EINVAL; + } + bcn->ht_oper = (void *)op->data; + } + + op = cfg80211_find_elem(WLAN_EID_VHT_OPERATION, ies, ies_len); + if (op) { + if (op->datalen < sizeof(*bcn->vht_oper)) { + GENL_SET_ERR_MSG(info, "bad VHT operation in beacon"); + return -EINVAL; + } + bcn->vht_oper = (void *)op->data; + } + op = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_OPERATION, ies, ies_len); if (op) { if (!ieee80211_eht_oper_size_ok(op->data + 1,