summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/mac/src/include/parser_api.h7
-rw-r--r--core/mac/src/pe/include/lim_api.h4
-rw-r--r--core/mac/src/pe/lim/lim_api.c36
-rw-r--r--core/mac/src/pe/lim/lim_process_message_queue.c8
-rw-r--r--core/mac/src/sys/legacy/src/utils/src/parser_api.c2
-rw-r--r--core/sme/src/csr/csr_api_roam.c10
6 files changed, 63 insertions, 4 deletions
diff --git a/core/mac/src/include/parser_api.h b/core/mac/src/include/parser_api.h
index 01abc33c3091..dded689a21a9 100644
--- a/core/mac/src/include/parser_api.h
+++ b/core/mac/src/include/parser_api.h
@@ -60,8 +60,11 @@
#define MBO_IE_ASSOC_DISALLOWED_SUBATTR_ID 0x04
/* QCN IE definitions */
-#define QCN_IE_VERSION_SUBATTR_ID 1
-#define QCN_IE_VERSION_SUBATTR_LEN 2
+#define QCN_IE_HDR_LEN 6
+
+#define QCN_IE_VERSION_SUBATTR_ID 1
+#define QCN_IE_VERSION_SUBATTR_DATA_LEN 2
+#define QCN_IE_VERSION_SUBATTR_LEN 4
#define QCN_IE_VERSION_SUPPORTED 1
#define QCN_IE_SUBVERSION_SUPPORTED 0
diff --git a/core/mac/src/pe/include/lim_api.h b/core/mac/src/pe/include/lim_api.h
index 759854cb24ac..d733a87c4e71 100644
--- a/core/mac/src/pe/include/lim_api.h
+++ b/core/mac/src/pe/include/lim_api.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -327,5 +327,7 @@ static inline void lim_fill_join_rsp_ht_caps(tpPESession session,
#endif
QDF_STATUS lim_update_ext_cap_ie(tpAniSirGlobal mac_ctx,
uint8_t *ie_data, uint8_t *local_ie_buf, uint16_t *local_ie_len);
+QDF_STATUS lim_add_qcn_ie(tpAniSirGlobal mac_ctx, uint8_t *ie_data,
+ uint16_t *ie_len);
/************************************************************/
#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 79262a574172..aac04822c8ef 100644
--- a/core/mac/src/pe/lim/lim_api.c
+++ b/core/mac/src/pe/lim/lim_api.c
@@ -2345,3 +2345,39 @@ QDF_STATUS lim_update_ext_cap_ie(tpAniSirGlobal mac_ctx,
(*local_ie_len) += DOT11F_IE_EXTCAP_MAX_LEN;
return QDF_STATUS_SUCCESS;
}
+
+/**
+ * lim_add_qcn_ie() - Add QCN IE to a given IE buffer
+ *
+ * @mac_ctx: Pointer to Global MAC structure
+ * @ie_data: IE buffer
+ * @ie_len: length of the @ie_data
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS lim_add_qcn_ie(tpAniSirGlobal mac_ctx, uint8_t *ie_data,
+ uint16_t *ie_len)
+{
+ tDot11fIEQCN_IE qcn_ie;
+ uint8_t qcn_ie_hdr[QCN_IE_HDR_LEN]
+ = {IE_EID_VENDOR, DOT11F_IE_QCN_IE_MAX_LEN,
+ 0x8C, 0xFD, 0xF0, 0x1};
+
+ if (((*ie_len) + DOT11F_IE_QCN_IE_MAX_LEN) > MAX_DEFAULT_SCAN_IE_LEN) {
+ lim_log(mac_ctx, LOGE, FL("IE buffer not enough for QCN IE"));
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ /* Add QCN IE header */
+ qdf_mem_copy(ie_data + (*ie_len), qcn_ie_hdr, QCN_IE_HDR_LEN);
+ (*ie_len) += QCN_IE_HDR_LEN;
+
+ /* Retrieve Version sub-attribute data */
+ populate_dot11f_qcn_ie(&qcn_ie);
+
+ /* Add QCN IE data[version sub attribute] */
+ qdf_mem_copy(ie_data + (*ie_len), qcn_ie.version,
+ (QCN_IE_VERSION_SUBATTR_LEN));
+ (*ie_len) += (QCN_IE_VERSION_SUBATTR_LEN);
+ return QDF_STATUS_SUCCESS;
+}
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 53922c9dc126..f0d37da0f3b8 100644
--- a/core/mac/src/pe/lim/lim_process_message_queue.c
+++ b/core/mac/src/pe/lim/lim_process_message_queue.c
@@ -261,6 +261,7 @@ static void lim_process_set_default_scan_ie_request(tpAniSirGlobal mac_ctx,
uint16_t local_ie_len;
tSirMsgQ msg_q;
tSirRetStatus ret_code;
+ QDF_STATUS qdf_status;
if (!msg_buf) {
lim_log(mac_ctx, LOGE, FL("msg_buf is NULL"));
@@ -284,6 +285,13 @@ static void lim_process_set_default_scan_ie_request(tpAniSirGlobal mac_ctx,
goto scan_ie_send_fail;
}
+ if (mac_ctx->roam.configParam.qcn_ie_support) {
+ qdf_status = lim_add_qcn_ie(mac_ctx, local_ie_buf,
+ &local_ie_len);
+ if (QDF_IS_STATUS_ERROR(qdf_status))
+ goto scan_ie_send_fail;
+ }
+
wma_ie_params = qdf_mem_malloc(sizeof(*wma_ie_params) + local_ie_len);
if (!wma_ie_params) {
lim_log(mac_ctx, LOGE, FL("fail to alloc wma_ie_params"));
diff --git a/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/core/mac/src/sys/legacy/src/utils/src/parser_api.c
index 0eb6a848b7a9..fb2865db813f 100644
--- a/core/mac/src/sys/legacy/src/utils/src/parser_api.c
+++ b/core/mac/src/sys/legacy/src/utils/src/parser_api.c
@@ -1269,7 +1269,7 @@ void populate_dot11f_qcn_ie(tDot11fIEQCN_IE *pDot11f)
{
pDot11f->present = 1;
pDot11f->version[0] = QCN_IE_VERSION_SUBATTR_ID;
- pDot11f->version[1] = QCN_IE_VERSION_SUBATTR_LEN;
+ pDot11f->version[1] = QCN_IE_VERSION_SUBATTR_DATA_LEN;
pDot11f->version[2] = QCN_IE_VERSION_SUPPORTED;
pDot11f->version[3] = QCN_IE_SUBVERSION_SUPPORTED;
}
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index e177adc2fac3..334ebc0906e8 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -17716,6 +17716,11 @@ static void csr_update_driver_assoc_ies(tpAniSirGlobal mac_ctx,
uint8_t ese_ie[DOT11F_IE_ESEVERSION_MAX_LEN]
= { 0x0, 0x40, 0x96, 0x3, ESE_VERSION_SUPPORTED};
#endif
+ uint8_t qcn_ie[DOT11F_IE_QCN_IE_MAX_LEN]
+ = {0x8C, 0xFD, 0xF0, 0x1, QCN_IE_VERSION_SUBATTR_ID,
+ QCN_IE_VERSION_SUBATTR_DATA_LEN,
+ QCN_IE_VERSION_SUPPORTED,
+ QCN_IE_SUBVERSION_SUPPORTED};
if (session->pConnectBssDesc)
max_tx_pwr_cap = csr_get_cfg_max_tx_power(mac_ctx,
@@ -17763,6 +17768,11 @@ static void csr_update_driver_assoc_ies(tpAniSirGlobal mac_ctx,
}
ese_populate_addtional_ies(mac_ctx, session, req_buf);
+ /* Append QCN IE if g_support_qcn_ie INI is enabled */
+ if (mac_ctx->roam.configParam.qcn_ie_support)
+ csr_append_assoc_ies(mac_ctx, req_buf, IEEE80211_ELEMID_VENDOR,
+ DOT11F_IE_QCN_IE_MAX_LEN,
+ qcn_ie);
}
/**