diff --git a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h index 1c84de19a14f..907f650eeaab 100644 --- a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h +++ b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h @@ -66,6 +66,9 @@ #define QCA_OUI 0xf0fd8c #define QCA_OUI_WHC_TYPE 0x00 +/* Extender vendor specific IE */ +#define QCA_OUI_EXTENDER_TYPE 0x03 + /* Temporary vendor specific IE for 11n pre-standard interoperability */ #define VENDOR_HT_OUI 0x00904c #define VENDOR_HT_CAP_ID 51 @@ -1353,6 +1356,21 @@ is_he_op_oui(uint8_t *frm) ((ATH_HE_OP_SUBTYPE << 24) | ATH_HE_OUI)); } +/** + * is_extender_oui() - If vendor IE is EXTENDER OUI + * @frm: vendor IE pointer + * + * API to check if vendor IE is EXTENDER OUI + * + * Return: true if its EXTENDER OUI + */ +static inline bool +is_extender_oui(uint8_t *frm) +{ + return (frm[1] > 4) && (LE_READ_4(frm + 2) == + ((QCA_OUI_EXTENDER_TYPE << 24) | QCA_OUI)); +} + /** * wlan_parse_rsn_ie() - parse rsn ie * @rsn_ie: rsn ie ptr diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h index 88a9116b1592..e617ae8a3416 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h +++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h @@ -197,6 +197,7 @@ struct ie_list { uint8_t *esp; uint8_t *mbo_oce; uint8_t *muedca; + uint8_t *extender; }; enum scan_entry_connection_state { diff --git a/umac/scan/dispatcher/inc/wlan_scan_utils_api.h b/umac/scan/dispatcher/inc/wlan_scan_utils_api.h index 2ff72e82b498..0dbe8d3f7558 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_utils_api.h +++ b/umac/scan/dispatcher/inc/wlan_scan_utils_api.h @@ -655,6 +655,7 @@ util_scan_copy_beacon_data(struct scan_cache_entry *new_entry, old_ptr, new_ptr); ie_lst->esp = conv_ptr(ie_lst->esp, old_ptr, new_ptr); ie_lst->mbo_oce = conv_ptr(ie_lst->mbo_oce, old_ptr, new_ptr); + ie_lst->extender = conv_ptr(ie_lst->extender, old_ptr, new_ptr); return QDF_STATUS_SUCCESS; } @@ -1479,4 +1480,18 @@ enum wlan_band util_scan_scm_freq_to_band(uint16_t freq); */ bool util_is_scan_completed(struct scan_event *event, bool *success); +/** + * util_scan_entry_extenderie() - function to read extender IE + * @scan_entry: scan entry + * + * API, function to read extender IE + * + * Return: extenderie or NULL if ie is not present + */ +static inline uint8_t* +util_scan_entry_extenderie(struct scan_cache_entry *scan_entry) +{ + return scan_entry->ie_list.extender; +} + #endif diff --git a/umac/scan/dispatcher/src/wlan_scan_utils_api.c b/umac/scan/dispatcher/src/wlan_scan_utils_api.c index 2efaecb48cf0..bad4ec45dd25 100644 --- a/umac/scan/dispatcher/src/wlan_scan_utils_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_utils_api.c @@ -462,6 +462,8 @@ util_scan_parse_vendor_ie(struct scan_cache_entry *scan_params, scan_params->ie_list.bwnss_map = (((uint8_t *)ie) + 8); } else if (is_mbo_oce_oui((uint8_t *)ie)) { scan_params->ie_list.mbo_oce = (uint8_t *)ie; + } else if (is_extender_oui((uint8_t *)ie)) { + scan_params->ie_list.extender = (uint8_t *)ie; } return QDF_STATUS_SUCCESS; }