/* version string max length (including NULL) */
 #define WCN36XX_HAL_VERSION_LENGTH  64
 
+/* How many frames until we start a-mpdu TX session */
+#define WCN36XX_AMPDU_START_THRESH     20
+
+#define WCN36XX_MAX_SCAN_SSIDS         9
+#define WCN36XX_MAX_SCAN_IE_LEN                500
+
 /* message types for messages exchanged between WDI and HAL */
 enum wcn36xx_hal_host_msg_type {
        /* Init/De-Init */
 
        /* IE field */
        u16 ie_len;
-       u8 ie[0];
+       u8 ie[WCN36XX_MAX_SCAN_IE_LEN];
 } __packed;
 
 struct wcn36xx_hal_start_scan_offload_rsp_msg {
 
        struct wcn36xx_hal_start_scan_offload_req_msg msg_body;
        int ret, i;
 
+       if (req->ie_len > WCN36XX_MAX_SCAN_IE_LEN)
+               return -EINVAL;
+
        mutex_lock(&wcn->hal_mutex);
        INIT_HAL_MSG(msg_body, WCN36XX_HAL_START_SCAN_OFFLOAD_REQ);
 
        for (i = 0; i < msg_body.num_channel; i++)
                msg_body.channels[i] = req->channels[i]->hw_value;
 
+       msg_body.header.len -= WCN36XX_MAX_SCAN_IE_LEN;
+
+       if (req->ie_len > 0) {
+               msg_body.ie_len = req->ie_len;
+               msg_body.header.len += req->ie_len;
+               memcpy(msg_body.ie, req->ie, req->ie_len);
+       }
+
        PREPARE_HAL_BUF(wcn->hal_buf, msg_body);
 
        wcn36xx_dbg(WCN36XX_DBG_HAL,
 
 #define WLAN_NV_FILE               "wlan/prima/WCNSS_qcom_wlan_nv.bin"
 #define WCN36XX_AGGR_BUFFER_SIZE 64
 
-/* How many frames until we start a-mpdu TX session */
-#define WCN36XX_AMPDU_START_THRESH     20
-
-#define WCN36XX_MAX_SCAN_SSIDS         9
-#define WCN36XX_MAX_SCAN_IE_LEN                500
-
 extern unsigned int wcn36xx_dbg_mask;
 
 enum wcn36xx_debug_mask {