wlan: Add changes for auth in send mgmt path

propagation from qcacld-3.0 to prima

Add changes to support authentication in send mgmt path.
With these changes, supplicant/upper layer can send
authentication frame for station mode.

Change-Id: I6807f49acc9284e69c6362e07a583ff26f15edca
CRs-Fixed: 2531064
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 51c9425..1ed8abd 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -4115,4 +4115,16 @@
  */
 VOS_STATUS sme_process_msg_callback(tHalHandle hal, vos_msg_t *msg);
 
+/**
+ * sme_send_mgmt_tx() - Sends mgmt frame from CSR to LIM
+ * @hal: The handle returned by mac_open
+ * @session_id: session id
+ * @buf: pointer to frame
+ * @len: frame length
+ *
+ * Return: eHalStatus
+ */
+eHalStatus sme_send_mgmt_tx(tHalHandle hal, uint8_t session_id,
+                                const uint8_t *buf, uint32_t len);
+
 #endif //#if !defined( __SME_API_H )
diff --git a/CORE/SME/inc/sme_Trace.h b/CORE/SME/inc/sme_Trace.h
index 77ff1d6..9fd4495 100644
--- a/CORE/SME/inc/sme_Trace.h
+++ b/CORE/SME/inc/sme_Trace.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2017, 2019 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -146,6 +146,7 @@
     TRACE_CODE_SME_RX_HDD_LPHB_CONFIG_REQ,
 #endif /* FEATURE_WLAN_LPHB */
     TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
+    TRACE_CODE_SME_RX_HDD_SEND_MGMT_TX,
     TRACE_CODE_SME_TX_HDD_CAP_TSF_REQ,
     TRACE_CODE_SME_TX_HDD_GET_TSF_REQ,
     TRACE_CODE_SME_DEL_STA_BA_SESSION_REQ,
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 7b19327..f7d81d4 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -15387,3 +15387,63 @@
 
          return dot11fUnpackIeRSN(mac_ctx, buf, buf_len, rsn_ie);
 }
+
+/**
+ * sme_prepare_mgmt_tx() - Prepares mgmt frame
+ * @hal: The handle returned by mac_open
+ * @session_id: session id
+ * @buf: pointer to frame
+ * @len: frame length
+ *
+ * Return: eHalStatus
+ */
+static eHalStatus sme_prepare_mgmt_tx(tHalHandle hal, uint8_t session_id,
+                                      const uint8_t *buf, uint32_t len)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
+    vos_msg_t vos_message;
+    struct sir_mgmt_msg *msg;
+    uint16_t msg_len;
+
+    VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+              ("prepares auth frame"));
+
+    msg_len = sizeof(*msg) + len;
+    msg = vos_mem_malloc(msg_len);
+    if (msg == NULL) {
+        status = eHAL_STATUS_FAILED_ALLOC;
+    } else {
+        msg->type = eWNI_SME_SEND_MGMT_FRAME_TX;
+        msg->msg_len = msg_len;
+        msg->session_id = session_id;
+        msg->data = (uint8_t *)msg + sizeof(*msg);
+        vos_mem_copy(msg->data, buf, len);
+        vos_message.bodyptr = msg;
+        vos_message.type =  eWNI_SME_SEND_MGMT_FRAME_TX;
+        vos_status = vos_mq_post_message(VOS_MQ_ID_PE, &vos_message);
+        if (!VOS_IS_STATUS_SUCCESS(vos_status)) {
+            vos_mem_free(msg);
+            status = eHAL_STATUS_FAILURE;
+        }
+    }
+    return status;
+}
+
+eHalStatus sme_send_mgmt_tx(tHalHandle hal, uint8_t session_id,
+                            const uint8_t *buf, uint32_t len)
+{
+    eHalStatus status = eHAL_STATUS_SUCCESS;
+    tpAniSirGlobal mac = PMAC_STRUCT(hal);
+
+    MTRACE(vos_trace(VOS_MODULE_ID_SME,
+           TRACE_CODE_SME_RX_HDD_SEND_MGMT_TX, session_id, 0));
+
+    status = sme_AcquireGlobalLock(&mac->sme);
+    if (HAL_STATUS_SUCCESS(status)) {
+        status = sme_prepare_mgmt_tx(hal, session_id, buf, len);
+        sme_ReleaseGlobalLock(&mac->sme);
+    }
+
+    return status;
+}