/* Wi-Fi Alliance Capabilities element - Capabilities field */
#define WFA_CAPA_QM_DSCP_POLICY BIT(0)
#define WFA_CAPA_QM_UNSOLIC_DSCP BIT(1)
+#define WFA_CAPA_QM_NON_EHT_SCS_TRAFFIC_DESC BIT(2)
struct ieee80211_neighbor_ap_info {
u8 tbtt_info_hdr;
#endif /* CONFIG_FILS */
+bool wpa_is_non_eht_scs_traffic_desc_supported(struct wpa_bss *bss)
+{
+ const u8 *wfa_capa;
+
+ if (!bss)
+ return false;
+
+ /* Get WFA capability from Beacon or Probe Response frame elements */
+ wfa_capa = wpa_bss_get_vendor_ie(bss, WFA_CAPA_IE_VENDOR_TYPE);
+ if (!wfa_capa)
+ wfa_capa = wpa_bss_get_vendor_ie_beacon(
+ bss, WFA_CAPA_IE_VENDOR_TYPE);
+
+ if (!wfa_capa || wfa_capa[1] < 6 || wfa_capa[6] < 1 ||
+ !(wfa_capa[7] & WFA_CAPA_QM_NON_EHT_SCS_TRAFFIC_DESC)) {
+ /* AP does not enable QM non EHT traffic description policy */
+ return false;
+ }
+
+ return true;
+}
+
+
static int wpas_populate_wfa_capa(struct wpa_supplicant *wpa_s,
struct wpa_bss *bss,
u8 *wpa_ie, size_t wpa_ie_len,
if (wpa_s->enable_dscp_policy_capa)
wfa_capa[0] |= WFA_CAPA_QM_DSCP_POLICY;
+ if (wpa_is_non_eht_scs_traffic_desc_supported(bss))
+ wfa_capa[0] |= WFA_CAPA_QM_NON_EHT_SCS_TRAFFIC_DESC;
+
if (!wfa_capa[0])
return wpa_ie_len;
struct pasn_auth *pasn_auth);
void wpas_pasn_auth_work_done(struct wpa_supplicant *wpa_s, int status);
+bool wpa_is_non_eht_scs_traffic_desc_supported(struct wpa_bss *bss);
+
#endif /* WPA_SUPPLICANT_I_H */