qcacld-3.0: Fetch link freq based on link mac addr from roam sync
Currently, link frequency is fetched from roam sync indication based on vdev_id. But the vdev_id is of assoc link in OWE/1x cases(where link vdev would be down as part of roam sync handling) but it would of non-assoc link in case of other modes like SAE/WPA2/.. So current fetching of frequency based vdev_id may give invalid frequency in SAE case as non-assoc link vdev_id is passed. Fetch the frequency based on link mac addr to avoid such failures. Change-Id: I0a5748ac351473d85b21f2da8d8f124715c4d595 CRs-Fixed: 3358448
This commit is contained in:

committed by
Madan Koyyalamudi

parent
fbbcbd919c
commit
f3438c702a
@@ -92,18 +92,17 @@ mlo_roam_get_chan_freq(uint8_t vdev_id,
|
|||||||
struct roam_offload_synch_ind *sync_ind);
|
struct roam_offload_synch_ind *sync_ind);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mlo_roam_get_link_freq - get given link frequency
|
* mlo_roam_get_link_freq_from_mac_addr - get given link frequency
|
||||||
*
|
|
||||||
* @vdev_id: vdev id
|
|
||||||
* @sync_ind: roam sync ind pointer
|
* @sync_ind: roam sync ind pointer
|
||||||
|
* @link_mac_addr: Link mac address
|
||||||
*
|
*
|
||||||
* This api will be called to get the link frequency.
|
* This api will be called to get the link frequency.
|
||||||
*
|
*
|
||||||
* Return: channel frequency
|
* Return: channel frequency
|
||||||
*/
|
*/
|
||||||
uint32_t
|
uint32_t
|
||||||
mlo_roam_get_link_freq(uint8_t vdev_id,
|
mlo_roam_get_link_freq_from_mac_addr(struct roam_offload_synch_ind *sync_ind,
|
||||||
struct roam_offload_synch_ind *sync_ind);
|
uint8_t *link_mac_addr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mlo_roam_get_link_id - get link id
|
* mlo_roam_get_link_id - get link id
|
||||||
|
@@ -426,18 +426,19 @@ bool is_multi_link_roam(struct roam_offload_synch_ind *sync_ind)
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
mlo_roam_get_link_freq(uint8_t vdev_id,
|
mlo_roam_get_link_freq_from_mac_addr(struct roam_offload_synch_ind *sync_ind,
|
||||||
struct roam_offload_synch_ind *sync_ind)
|
uint8_t *link_mac_addr)
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|
||||||
if (!sync_ind || !sync_ind->num_setup_links)
|
if (!sync_ind || !sync_ind->num_setup_links || !link_mac_addr)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = 0; i < sync_ind->num_setup_links; i++) {
|
for (i = 0; i < sync_ind->num_setup_links; i++)
|
||||||
if (sync_ind->ml_link[i].vdev_id != vdev_id)
|
if (!qdf_mem_cmp(sync_ind->ml_link[i].link_addr.bytes,
|
||||||
|
link_mac_addr,
|
||||||
|
QDF_MAC_ADDR_SIZE))
|
||||||
return sync_ind->ml_link[i].channel.mhz;
|
return sync_ind->ml_link[i].channel.mhz;
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -3954,7 +3954,7 @@ lim_gen_link_probe_rsp_roam(struct mac_context *mac_ctx,
|
|||||||
struct qdf_mac_addr sta_link_addr;
|
struct qdf_mac_addr sta_link_addr;
|
||||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
tSirProbeRespBeacon *probe_rsp;
|
tSirProbeRespBeacon *probe_rsp;
|
||||||
uint8_t *frame;
|
uint8_t *frame, *src_addr;
|
||||||
uint32_t frame_len;
|
uint32_t frame_len;
|
||||||
struct wlan_frame_hdr *hdr;
|
struct wlan_frame_hdr *hdr;
|
||||||
|
|
||||||
@@ -4016,10 +4016,16 @@ lim_gen_link_probe_rsp_roam(struct mac_context *mac_ctx,
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
src_addr = lim_get_src_addr_from_frame(&link_probe_rsp);
|
||||||
|
if (!src_addr) {
|
||||||
|
pe_err("MLO: Failed to fetch src address");
|
||||||
|
status = QDF_STATUS_E_FAILURE;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
lim_add_bcn_probe(session->vdev, link_probe_rsp.ptr,
|
lim_add_bcn_probe(session->vdev, link_probe_rsp.ptr,
|
||||||
link_probe_rsp.len,
|
link_probe_rsp.len,
|
||||||
mlo_roam_get_link_freq(session->vdev_id,
|
mlo_roam_get_link_freq_from_mac_addr(
|
||||||
roam_sync_ind),
|
roam_sync_ind, src_addr),
|
||||||
roam_sync_ind->rssi);
|
roam_sync_ind->rssi);
|
||||||
} else {
|
} else {
|
||||||
qdf_mem_free(probe_rsp);
|
qdf_mem_free(probe_rsp);
|
||||||
|
@@ -4680,3 +4680,14 @@ void lim_extract_ies_from_deauth_disassoc(struct pe_session *session,
|
|||||||
mlme_set_peer_disconnect_ies(session->vdev, &ie);
|
mlme_set_peer_disconnect_ies(session->vdev, &ie);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t *lim_get_src_addr_from_frame(struct element_info *frame)
|
||||||
|
{
|
||||||
|
struct wlan_frame_hdr *hdr;
|
||||||
|
|
||||||
|
if (!frame || !frame->len || frame->len < WLAN_MAC_HDR_LEN_3A)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hdr = (struct wlan_frame_hdr *)frame->ptr;
|
||||||
|
|
||||||
|
return hdr->i_addr2;
|
||||||
|
}
|
||||||
|
@@ -422,4 +422,16 @@ void lim_free_assoc_req_frm_buf(tpSirAssocReq assoc_req);
|
|||||||
bool lim_alloc_assoc_req_frm_buf(tpSirAssocReq assoc_req,
|
bool lim_alloc_assoc_req_frm_buf(tpSirAssocReq assoc_req,
|
||||||
qdf_nbuf_t buf, uint32_t mac_header_len,
|
qdf_nbuf_t buf, uint32_t mac_header_len,
|
||||||
uint32_t frame_len);
|
uint32_t frame_len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* lim_get_src_addr_from_frame() - Get source address of the frame
|
||||||
|
* @frame: frame ptr
|
||||||
|
*
|
||||||
|
* Extract source mac address of the frame
|
||||||
|
*
|
||||||
|
* Return: Ptr for extracted src mac address
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
uint8_t *
|
||||||
|
lim_get_src_addr_from_frame(struct element_info *frame);
|
||||||
#endif /* __LIM_ASSOC_UTILS_H */
|
#endif /* __LIM_ASSOC_UTILS_H */
|
||||||
|
Reference in New Issue
Block a user