From 4bfffb4487372475672f5591ce76052dc1794b11 Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Fri, 27 Jul 2018 03:34:27 -0400 Subject: [PATCH] qcacld-3.0: Fix SAP 11g no ht protection failure 1.Scan entry uses MGMT_SUBTYPE_BEACON to specify the frame type. Correct lim_handle_sap_beacon to use MGMT_SUBTYPE_BEACON to check frame type. 2.lim_allocate_and_get_bcn return corrected pkt and pkt info. Change-Id: I607be66a376f5121d100db52a55faf32c088a94a CRs-Fixed: 2282274 --- .../src/pe/lim/lim_process_message_queue.c | 58 +++++++++++-------- core/mac/src/pe/sch/sch_beacon_process.c | 4 +- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/core/mac/src/pe/lim/lim_process_message_queue.c b/core/mac/src/pe/lim/lim_process_message_queue.c index 7867bf3800..311c77b189 100644 --- a/core/mac/src/pe/lim/lim_process_message_queue.c +++ b/core/mac/src/pe/lim/lim_process_message_queue.c @@ -782,53 +782,62 @@ static void lim_fill_sap_bcn_pkt_meta(struct scan_cache_entry *scan_entry, * * Return: QDF_STATUS */ -static QDF_STATUS lim_allocate_and_get_bcn(tpAniSirGlobal mac_ctx, - cds_pkt_t *pkt, - uint8_t *rx_pkt_info, - tSchBeaconStruct *bcn, +static QDF_STATUS lim_allocate_and_get_bcn( + tpAniSirGlobal mac_ctx, + cds_pkt_t **pkt, + uint8_t **rx_pkt_info, + tSchBeaconStruct **bcn, struct scan_cache_entry *scan_entry) { QDF_STATUS status; + uint8_t *rx_pkt_info_l = NULL; + tSchBeaconStruct *bcn_l = NULL; + cds_pkt_t *pkt_l = NULL; - pkt = qdf_mem_malloc(sizeof(*pkt)); - if (!pkt) { + pkt_l = qdf_mem_malloc(sizeof(cds_pkt_t)); + if (!pkt_l) { pe_err("Failed to allocate pkt"); return QDF_STATUS_E_FAILURE; } - status = wma_ds_peek_rx_packet_info(pkt, (void *)&rx_pkt_info, false); + status = wma_ds_peek_rx_packet_info( + pkt_l, (void *)&rx_pkt_info_l, false); if (!QDF_IS_STATUS_SUCCESS(status)) { pe_err("Failed to get Rx Pkt meta"); goto free; } - bcn = qdf_mem_malloc(sizeof(tSchBeaconStruct)); - if (!bcn) { + bcn_l = qdf_mem_malloc(sizeof(tSchBeaconStruct)); + if (!bcn_l) { pe_err("Failed to allocate bcn struct"); goto free; } - lim_fill_sap_bcn_pkt_meta(scan_entry, pkt); + lim_fill_sap_bcn_pkt_meta(scan_entry, pkt_l); /* Convert the beacon frame into a structure */ if (sir_convert_beacon_frame2_struct(mac_ctx, - (uint8_t *) rx_pkt_info, - bcn) != QDF_STATUS_SUCCESS) { - pe_err_rl("beacon parsing failed"); + (uint8_t *)rx_pkt_info_l, + bcn_l) != QDF_STATUS_SUCCESS) { + pe_err("beacon parsing failed"); goto free; } + *pkt = pkt_l; + *bcn = bcn_l; + *rx_pkt_info = rx_pkt_info_l; + return QDF_STATUS_SUCCESS; free: - if (pkt) { - qdf_mem_free(pkt); - pkt = NULL; + if (pkt_l) { + qdf_mem_free(pkt_l); + pkt_l = NULL; } - if (bcn) { - qdf_mem_free(bcn); - bcn = NULL; + if (bcn_l) { + qdf_mem_free(bcn_l); + bcn_l = NULL; } return QDF_STATUS_E_FAILURE; @@ -850,7 +859,7 @@ void lim_handle_sap_beacon(struct wlan_objmgr_pdev *pdev, return; } - if (scan_entry->frm_subtype != SIR_MAC_MGMT_BEACON) + if (scan_entry->frm_subtype != MGMT_SUBTYPE_BEACON) return; mac_ctx = cds_get_context(QDF_MODULE_ID_PE); @@ -869,10 +878,13 @@ void lim_handle_sap_beacon(struct wlan_objmgr_pdev *pdev, (filter->sap_channel[session_id] == scan_entry->channel.chan_idx)) { if (!pkt) { - status = lim_allocate_and_get_bcn(mac_ctx, pkt, - rx_pkt_info, bcn, scan_entry); - if (!QDF_IS_STATUS_SUCCESS(status)) + status = lim_allocate_and_get_bcn( + mac_ctx, &pkt, &rx_pkt_info, + &bcn, scan_entry); + if (!QDF_IS_STATUS_SUCCESS(status)) { + pe_debug("lim_allocate_and_get_bcn fail!"); return; + } } sch_beacon_process_for_ap(mac_ctx, session_id, rx_pkt_info, bcn); diff --git a/core/mac/src/pe/sch/sch_beacon_process.c b/core/mac/src/pe/sch/sch_beacon_process.c index 8dec830554..5bc5a503d1 100644 --- a/core/mac/src/pe/sch/sch_beacon_process.c +++ b/core/mac/src/pe/sch/sch_beacon_process.c @@ -1018,8 +1018,8 @@ void sch_beacon_process_for_ap(tpAniSirGlobal mac_ctx, tUpdateBeaconParams bcn_prm; if (!bcn || !rx_pkt_info) { - pe_err_rl("bcn %pK or rx_pkt_info %pKis NULL", - bcn, rx_pkt_info); + pe_debug("bcn %pK or rx_pkt_info %pKis NULL", + bcn, rx_pkt_info); return; }