|
@@ -176,7 +176,7 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
uint16_t *additional_ielen,
|
|
|
uint8_t *additional_ie)
|
|
|
{
|
|
|
- tDot11fProbeRequest pr;
|
|
|
+ tDot11fProbeRequest *pr;
|
|
|
uint32_t status, bytes, payload;
|
|
|
uint8_t *frame;
|
|
|
void *packet;
|
|
@@ -226,13 +226,18 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
if (pesession)
|
|
|
vdev_id = pesession->vdev_id;
|
|
|
|
|
|
+ pr = qdf_mem_malloc(sizeof(*pr));
|
|
|
+ if (!pr) {
|
|
|
+ pe_err("memory alloc failed for probe request");
|
|
|
+ return QDF_STATUS_E_NOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
/* The scheme here is to fill out a 'tDot11fProbeRequest' structure */
|
|
|
/* and then hand it off to 'dot11f_pack_probe_request' (for */
|
|
|
- /* serialization). We start by zero-initializing the structure: */
|
|
|
- qdf_mem_zero((uint8_t *) &pr, sizeof(pr));
|
|
|
+ /* serialization). */
|
|
|
|
|
|
/* & delegating to assorted helpers: */
|
|
|
- populate_dot11f_ssid(mac_ctx, ssid, &pr.SSID);
|
|
|
+ populate_dot11f_ssid(mac_ctx, ssid, &pr->SSID);
|
|
|
|
|
|
if (addn_ielen && additional_ie)
|
|
|
p2pie = limGetP2pIEPtr(mac_ctx, additional_ie, addn_ielen);
|
|
@@ -247,15 +252,15 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
* In the below API pass channel number > 14, do that it fills
|
|
|
* only 11a rates in supported rates
|
|
|
*/
|
|
|
- populate_dot11f_supp_rates(mac_ctx, 15, &pr.SuppRates,
|
|
|
+ populate_dot11f_supp_rates(mac_ctx, 15, &pr->SuppRates,
|
|
|
pesession);
|
|
|
} else {
|
|
|
populate_dot11f_supp_rates(mac_ctx, channel,
|
|
|
- &pr.SuppRates, pesession);
|
|
|
+ &pr->SuppRates, pesession);
|
|
|
|
|
|
if (MLME_DOT11_MODE_11B != dot11mode) {
|
|
|
populate_dot11f_ext_supp_rates1(mac_ctx, channel,
|
|
|
- &pr.ExtSuppRates);
|
|
|
+ &pr->ExtSuppRates);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -265,20 +270,21 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
* RRM is enabled. It should be ok even if we add it into probe req when
|
|
|
* RRM is not enabled.
|
|
|
*/
|
|
|
- populate_dot11f_ds_params(mac_ctx, &pr.DSParams, channel);
|
|
|
+ populate_dot11f_ds_params(mac_ctx, &pr->DSParams, channel);
|
|
|
/* Call RRM module to get the tx power for management used. */
|
|
|
txPower = (uint8_t) rrm_get_mgmt_tx_power(mac_ctx, pesession);
|
|
|
- populate_dot11f_wfatpc(mac_ctx, &pr.WFATPC, txPower, 0);
|
|
|
+ populate_dot11f_wfatpc(mac_ctx, &pr->WFATPC, txPower, 0);
|
|
|
|
|
|
if (pesession) {
|
|
|
/* Include HT Capability IE */
|
|
|
if (pesession->htCapability &&
|
|
|
!(WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq)))
|
|
|
- populate_dot11f_ht_caps(mac_ctx, pesession, &pr.HTCaps);
|
|
|
+ populate_dot11f_ht_caps(mac_ctx, pesession,
|
|
|
+ &pr->HTCaps);
|
|
|
} else { /* !pesession */
|
|
|
if (IS_DOT11_MODE_HT(dot11mode) &&
|
|
|
!(WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq)))
|
|
|
- populate_dot11f_ht_caps(mac_ctx, NULL, &pr.HTCaps);
|
|
|
+ populate_dot11f_ht_caps(mac_ctx, NULL, &pr->HTCaps);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -288,11 +294,11 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
if (wlan_reg_is_24ghz_ch_freq(chan_freq)) {
|
|
|
if (mac_ctx->roam.configParam.channelBondingMode24GHz
|
|
|
== PHY_SINGLE_CHANNEL_CENTERED) {
|
|
|
- pr.HTCaps.supportedChannelWidthSet =
|
|
|
+ pr->HTCaps.supportedChannelWidthSet =
|
|
|
eHT_CHANNEL_WIDTH_20MHZ;
|
|
|
- pr.HTCaps.shortGI40MHz = 0;
|
|
|
+ pr->HTCaps.shortGI40MHz = 0;
|
|
|
} else {
|
|
|
- pr.HTCaps.supportedChannelWidthSet =
|
|
|
+ pr->HTCaps.supportedChannelWidthSet =
|
|
|
eHT_CHANNEL_WIDTH_40MHZ;
|
|
|
}
|
|
|
}
|
|
@@ -301,27 +307,27 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
if (pesession->vhtCapability &&
|
|
|
!(WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq))) {
|
|
|
populate_dot11f_vht_caps(mac_ctx, pesession,
|
|
|
- &pr.VHTCaps);
|
|
|
+ &pr->VHTCaps);
|
|
|
is_vht_enabled = true;
|
|
|
}
|
|
|
} else {
|
|
|
if (IS_DOT11_MODE_VHT(dot11mode) &&
|
|
|
!(WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq))) {
|
|
|
populate_dot11f_vht_caps(mac_ctx, pesession,
|
|
|
- &pr.VHTCaps);
|
|
|
+ &pr->VHTCaps);
|
|
|
is_vht_enabled = true;
|
|
|
}
|
|
|
}
|
|
|
if (pesession)
|
|
|
- populate_dot11f_ext_cap(mac_ctx, is_vht_enabled, &pr.ExtCap,
|
|
|
- pesession);
|
|
|
+ populate_dot11f_ext_cap(mac_ctx, is_vht_enabled, &pr->ExtCap,
|
|
|
+ pesession);
|
|
|
|
|
|
if (IS_DOT11_MODE_HE(dot11mode) && pesession)
|
|
|
lim_update_session_he_capable(mac_ctx, pesession);
|
|
|
|
|
|
- populate_dot11f_he_caps(mac_ctx, pesession, &pr.he_cap);
|
|
|
+ populate_dot11f_he_caps(mac_ctx, pesession, &pr->he_cap);
|
|
|
populate_dot11f_he_6ghz_cap(mac_ctx, pesession,
|
|
|
- &pr.he_6ghz_band_cap);
|
|
|
+ &pr->he_6ghz_band_cap);
|
|
|
|
|
|
if (addn_ielen && additional_ie) {
|
|
|
qdf_mem_zero((uint8_t *)&extracted_ext_cap,
|
|
@@ -355,11 +361,11 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
if (pesession) {
|
|
|
if (!qcn_ie)
|
|
|
populate_dot11f_qcn_ie(mac_ctx, pesession,
|
|
|
- &pr.qcn_ie,
|
|
|
+ &pr->qcn_ie,
|
|
|
QCN_IE_ATTR_ID_ALL);
|
|
|
else
|
|
|
populate_dot11f_qcn_ie(mac_ctx, pesession,
|
|
|
- &pr.qcn_ie,
|
|
|
+ &pr->qcn_ie,
|
|
|
QCN_IE_ATTR_ID_VHT_MCS11);
|
|
|
}
|
|
|
|
|
@@ -369,10 +375,10 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
* dot11f get packed payload size.
|
|
|
*/
|
|
|
if (extracted_ext_cap_flag)
|
|
|
- lim_merge_extcap_struct(&pr.ExtCap, &extracted_ext_cap, true);
|
|
|
+ lim_merge_extcap_struct(&pr->ExtCap, &extracted_ext_cap, true);
|
|
|
|
|
|
/* That's it-- now we pack it. First, how much space are we going to */
|
|
|
- status = dot11f_get_packed_probe_request_size(mac_ctx, &pr, &payload);
|
|
|
+ status = dot11f_get_packed_probe_request_size(mac_ctx, pr, &payload);
|
|
|
if (DOT11F_FAILED(status)) {
|
|
|
pe_err("Failed to calculate the packed size for a Probe Request (0x%08x)",
|
|
|
status);
|
|
@@ -390,6 +396,7 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
(void **)&packet);
|
|
|
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
|
|
|
pe_err("Failed to allocate %d bytes for a Probe Request", bytes);
|
|
|
+ qdf_mem_free(pr);
|
|
|
return QDF_STATUS_E_NOMEM;
|
|
|
}
|
|
|
/* Paranoia: */
|
|
@@ -400,7 +407,7 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
SIR_MAC_MGMT_PROBE_REQ, bssid, self_macaddr);
|
|
|
|
|
|
/* That done, pack the Probe Request: */
|
|
|
- status = dot11f_pack_probe_request(mac_ctx, &pr, frame +
|
|
|
+ status = dot11f_pack_probe_request(mac_ctx, pr, frame +
|
|
|
sizeof(tSirMacMgmtHdr),
|
|
|
payload, &payload);
|
|
|
if (DOT11F_FAILED(status)) {
|
|
@@ -410,6 +417,9 @@ lim_send_probe_req_mgmt_frame(struct mac_context *mac_ctx,
|
|
|
} else if (DOT11F_WARNED(status)) {
|
|
|
pe_warn("There were warnings while packing a Probe Request (0x%08x)", status);
|
|
|
}
|
|
|
+
|
|
|
+ qdf_mem_free(pr);
|
|
|
+
|
|
|
/* Append any AddIE if present. */
|
|
|
if (addn_ielen) {
|
|
|
qdf_mem_copy(frame + sizeof(tSirMacMgmtHdr) + payload,
|