Snap for 11479893 from 17d3a5b827601f00bc711e9262405025d941142a to 24Q2-release
Change-Id: I1d65abf72c6b64243ebd1f952aca6b6e45a88f8b
diff --git a/src/common/ieee802_11_common.c b/src/common/ieee802_11_common.c
index cc7af8c..dbe7b29 100644
--- a/src/common/ieee802_11_common.c
+++ b/src/common/ieee802_11_common.c
@@ -3686,3 +3686,50 @@
return ieee802_11_defrag_data(data, len, true);
}
+
+
+unsigned int is_ap_t2lm_negotiation_supported(const u8 *mle, size_t mle_len)
+{
+ u16 ml_control;
+ u16 mld_capabilities;
+ size_t offset =
+ 2 /* Multi Link Control */ +
+ 1 /* Common Info Length field */ +
+ ETH_ALEN /* MLD MAC Address field */;
+
+ if(!mle || mle_len < offset)
+ return 0;
+
+ ml_control = WPA_GET_LE16(mle);
+ wpa_printf(MSG_DEBUG, "%s: ML control field 0x%x", __func__, ml_control);
+
+ if (!(ml_control & BASIC_MULTI_LINK_CTRL_PRES_MLD_CAPA)) {
+ wpa_printf(MSG_DEBUG, "MLD capabilities not present");
+ return 0;
+ }
+
+ if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_LINK_ID)
+ offset++;
+
+ if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_BSS_PARAM_CH_COUNT)
+ offset++;
+
+ if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_MSD_INFO)
+ offset += 2;
+
+ if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_EML_CAPA)
+ offset += 2;
+
+ if (mle_len < (offset + 2)) {
+ wpa_printf(MSG_ERROR, "Not suffcient length for MLD capabilities");
+ return 0;
+ }
+
+ mld_capabilities = WPA_GET_LE16(mle + offset);
+ wpa_printf(MSG_DEBUG, "MLD capabilities 0x%x", mld_capabilities);
+ if(!(mld_capabilities &
+ EHT_ML_MLD_CAPA_TID_TO_LINK_MAP_NEG_SUPP_MSK))
+ return 0;
+
+ return 1;
+}
diff --git a/src/common/ieee802_11_common.h b/src/common/ieee802_11_common.h
index 854857e..6f4fe80 100644
--- a/src/common/ieee802_11_common.h
+++ b/src/common/ieee802_11_common.h
@@ -373,4 +373,5 @@
enum chan_width get_sta_operation_chan_width(enum chan_width ap_operation_chan_width,
struct supported_chan_width sta_supported_width);
+unsigned int is_ap_t2lm_negotiation_supported(const u8 *mle, size_t mle_len);
#endif /* IEEE802_11_COMMON_H */
diff --git a/wpa_supplicant/aidl/sta_iface.cpp b/wpa_supplicant/aidl/sta_iface.cpp
index 60b6eb1..99968df 100644
--- a/wpa_supplicant/aidl/sta_iface.cpp
+++ b/wpa_supplicant/aidl/sta_iface.cpp
@@ -1881,6 +1881,7 @@
}
capa.maxNumberRxSpatialStreams = wpa_s->connection_max_nss_rx;
capa.maxNumberTxSpatialStreams = wpa_s->connection_max_nss_tx;
+ capa.apTidToLinkMapNegotiationSupported = wpa_s->ap_t2lm_negotiation_support;
} else {
capa.technology = WifiTechnology::UNKNOWN;
capa.channelBandwidth = WifiChannelWidthInMhz::WIDTH_20;
@@ -2441,11 +2442,11 @@
}
::ndk::ScopedAStatus StaIface::configureMscsInternal(const MscsParams& params) {
- return createStatus(SupplicantStatusCode::FAILURE_UNSUPPORTED);
+ return ndk::ScopedAStatus::ok();
}
::ndk::ScopedAStatus StaIface::disableMscsInternal() {
- return createStatus(SupplicantStatusCode::FAILURE_UNSUPPORTED);
+ return ndk::ScopedAStatus::ok();
}
/**
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 7c23727..fc93305 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -3351,6 +3351,9 @@
}
if (req_elems.rrm_enabled)
wpa_s->rrm.rrm_used = 1;
+ wpa_s->ap_t2lm_negotiation_support =
+ is_ap_t2lm_negotiation_supported(resp_elems.basic_mle,
+ resp_elems.basic_mle_len);
}
}
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index 4b13f3e..0890110 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -986,6 +986,7 @@
unsigned int connection_channel_bandwidth:5;
unsigned int disable_mbo_oce:1;
unsigned int connection_11b_only:1;
+ unsigned int ap_t2lm_negotiation_support:1;
struct os_reltime last_mac_addr_change;
enum wpas_mac_addr_style last_mac_addr_style;