diff --git a/core/mac/src/pe/include/lim_api.h b/core/mac/src/pe/include/lim_api.h index f7db25ef36..2499b0be5f 100644 --- a/core/mac/src/pe/include/lim_api.h +++ b/core/mac/src/pe/include/lim_api.h @@ -491,5 +491,23 @@ void lim_handle_sap_beacon(struct wlan_objmgr_pdev *pdev, */ enum ani_akm_type lim_translate_rsn_oui_to_akm_type(uint8_t auth_suite[4]); +#ifdef WLAN_SUPPORT_TWT +/** + * lim_fill_roamed_peer_twt_caps() - Update Peer TWT capabilities + * @mac_ctx: Pointer to mac context + * @vdev_id: vdev id + * @roam_synch: Pointer to roam synch indication + * + * Return: None + */ +void lim_fill_roamed_peer_twt_caps(struct mac_context *mac_ctx, uint8_t vdev_id, + struct roam_offload_synch_ind *roam_synch); +#else +static inline +void lim_fill_roamed_peer_twt_caps(struct mac_context *mac_ctx, uint8_t vdev_id, + struct roam_offload_synch_ind *roam_synch) +{} +#endif + /************************************************************/ #endif /* __LIM_API_H */ diff --git a/core/mac/src/pe/lim/lim_api.c b/core/mac/src/pe/lim/lim_api.c index f62d77abbb..b9e6b5af43 100644 --- a/core/mac/src/pe/lim/lim_api.c +++ b/core/mac/src/pe/lim/lim_api.c @@ -74,6 +74,7 @@ #include #include "cfg_ucfg_api.h" #include "wlan_mlme_public_struct.h" +#include "wlan_mlme_twt_api.h" #include "wlan_scan_utils_api.h" #include #include @@ -2381,6 +2382,55 @@ lim_fill_fils_ft(struct pe_session *src_session, {} #endif +#ifdef WLAN_SUPPORT_TWT +void +lim_fill_roamed_peer_twt_caps(struct mac_context *mac_ctx, + uint8_t vdev_id, + struct roam_offload_synch_ind *roam_synch) +{ + uint8_t *reassoc_body; + uint16_t len; + uint32_t status; + tDot11fReAssocResponse *reassoc_rsp; + struct pe_session *pe_session; + + pe_session = pe_find_session_by_vdev_id(mac_ctx, vdev_id); + if (!pe_session) { + pe_err("session not found for given vdev_id %d", vdev_id); + return; + } + + reassoc_rsp = qdf_mem_malloc(sizeof(*reassoc_rsp)); + if (!reassoc_rsp) + return; + + len = roam_synch->reassocRespLength - sizeof(tSirMacMgmtHdr); + reassoc_body = (uint8_t *)roam_synch + sizeof(tSirMacMgmtHdr) + + roam_synch->reassocRespOffset; + + status = dot11f_unpack_re_assoc_response(mac_ctx, reassoc_body, len, + reassoc_rsp, false); + if (DOT11F_FAILED(status)) { + pe_err("Failed to parse a Re-association Rsp (0x%08x, %d bytes):", + status, len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_INFO, + reassoc_body, len); + qdf_mem_free(reassoc_rsp); + return; + } else if (DOT11F_WARNED(status)) { + pe_debug("Warnings while unpacking a Re-association Rsp (0x%08x, %d bytes):", + status, len); + } + + if (lim_is_session_he_capable(pe_session)) + mlme_set_twt_peer_capabilities(mac_ctx->psoc, + &roam_synch->bssid, + &reassoc_rsp->he_cap, + &reassoc_rsp->he_op); + qdf_mem_free(reassoc_rsp); +} +#endif + /** * lim_check_ft_initial_im_association() - To check FT initial mobility(im) * association diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 56f1a51625..cdee53c595 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -1014,6 +1014,8 @@ wma_roam_update_vdev(tp_wma_handle wma, wma_add_sta(wma, add_sta_params); qdf_mem_copy(bssid, roam_synch_ind_ptr->bssid.bytes, QDF_MAC_ADDR_SIZE); + lim_fill_roamed_peer_twt_caps(wma->mac_context, vdev_id, + roam_synch_ind_ptr); qdf_mem_free(add_sta_params); }