diff --git a/hostapd/Android.mk b/hostapd/Android.mk
index a64ec79..b4b0fea 100644
--- a/hostapd/Android.mk
+++ b/hostapd/Android.mk
@@ -1072,7 +1072,7 @@
 OBJS_c += src/utils/edit_simple.c
 endif
 
-ifeq ($(filter gce_x86 gce_x86_64 calypso, $(TARGET_DEVICE)),)
+ifeq ($(filter gce_x86 gce_x86_64 calypso generic_x86 generic_x86_64 generic generic_arm64, $(TARGET_DEVICE)),)
 ifdef CONFIG_CTRL_IFACE_HIDL
 HOSTAPD_USE_HIDL=y
 L_CFLAGS += -DCONFIG_CTRL_IFACE_HIDL
diff --git a/hostapd/hidl/1.0/hostapd.cpp b/hostapd/hidl/1.0/hostapd.cpp
index ee8cfc8..3cd78b3 100644
--- a/hostapd/hidl/1.0/hostapd.cpp
+++ b/hostapd/hidl/1.0/hostapd.cpp
@@ -138,19 +138,26 @@
 
 	// Hw Mode String
 	std::string hw_mode_as_string;
+	std::string ht_cap_vht_oper_chwidth_as_string;
 	switch (iface_params.channelParams.band) {
 	case IHostapd::Band::BAND_2_4_GHZ:
 		hw_mode_as_string = "hw_mode=g";
 		break;
 	case IHostapd::Band::BAND_5_GHZ:
-		hw_mode_as_string = "hw_mode=a\n"
-		    "ht_capab=[HT40+]\n"
-		    "vht_oper_chwidth=1";
+		hw_mode_as_string = "hw_mode=a";
+		if (iface_params.channelParams.enableAcs) {
+			ht_cap_vht_oper_chwidth_as_string =
+			    "ht_capab=[HT40+]\n"
+			    "vht_oper_chwidth=1";
+		}
 		break;
 	case IHostapd::Band::BAND_ANY:
-		hw_mode_as_string = "hw_mode=any\n"
-		    "ht_capab=[HT40+]\n"
-		    "vht_oper_chwidth=1";
+		hw_mode_as_string = "hw_mode=any";
+		if (iface_params.channelParams.enableAcs) {
+			ht_cap_vht_oper_chwidth_as_string =
+			    "ht_capab=[HT40+]\n"
+			    "vht_oper_chwidth=1";
+		}
 		break;
 	default:
 		wpa_printf(MSG_ERROR, "Invalid band");
@@ -160,6 +167,7 @@
 	return StringPrintf(
 	    "interface=%s\n"
 	    "driver=nl80211\n"
+	    "ctrl_interface=/data/vendor/wifi/hostapd/ctrl\n"
 	    // ssid2 signals to hostapd that the value is not a literal value
 	    // for use as a SSID.  In this case, we're giving it a hex
 	    // std::string and hostapd needs to expect that.
@@ -168,6 +176,7 @@
 	    "ieee80211n=%d\n"
 	    "ieee80211ac=%d\n"
 	    "%s\n"
+	    "%s\n"
 	    "ignore_broadcast_ssid=%d\n"
 	    "wowlan_triggers=any\n"
 	    "%s\n",
@@ -175,8 +184,8 @@
 	    channel_config_as_string.c_str(),
 	    iface_params.hwModeParams.enable80211N ? 1 : 0,
 	    iface_params.hwModeParams.enable80211AC ? 1 : 0,
-	    hw_mode_as_string.c_str(), nw_params.isHidden ? 1 : 0,
-	    encryption_config_as_string.c_str());
+	    hw_mode_as_string.c_str(), ht_cap_vht_oper_chwidth_as_string.c_str(),
+	    nw_params.isHidden ? 1 : 0, encryption_config_as_string.c_str());
 }
 }  // namespace
 
diff --git a/hostapd/main.c b/hostapd/main.c
index 8d90b38..6c0490f 100644
--- a/hostapd/main.c
+++ b/hostapd/main.c
@@ -661,14 +661,8 @@
 	interfaces.reload_config = hostapd_reload_config;
 	interfaces.config_read_cb = hostapd_config_read;
 	interfaces.for_each_interface = hostapd_for_each_interface;
-#ifdef CONFIG_CTRL_IFACE_HIDL
-	// No per-netdev setup for HIDL control interface.
-	interfaces.ctrl_iface_init = NULL;
-	interfaces.ctrl_iface_deinit = NULL;
-#else /* CONFIG_CTRL_IFACE_HIDL */
 	interfaces.ctrl_iface_init = hostapd_ctrl_iface_init;
 	interfaces.ctrl_iface_deinit = hostapd_ctrl_iface_deinit;
-#endif /* CONFIG_CTRL_IFACE_HIDL */
 	interfaces.driver_init = hostapd_driver_init;
 	interfaces.global_iface_path = NULL;
 	interfaces.global_iface_name = NULL;
@@ -908,9 +902,8 @@
 		wpa_printf(MSG_ERROR, "Failed to initialize HIDL interface");
 		goto out;
 	}
-#else /* CONFIG_CTRL_IFACE_HIDL */
-	hostapd_global_ctrl_iface_init(&interfaces);
 #endif /* CONFIG_CTRL_IFACE_HIDL */
+	hostapd_global_ctrl_iface_init(&interfaces);
 
 	if (hostapd_global_run(&interfaces, daemonize, pid_file)) {
 		wpa_printf(MSG_ERROR, "Failed to start eloop");
@@ -922,9 +915,8 @@
  out:
 #ifdef CONFIG_CTRL_IFACE_HIDL
 	hostapd_hidl_deinit(&interfaces);
-#else /* CONFIG_CTRL_IFACE_HIDL */
-	hostapd_global_ctrl_iface_deinit(&interfaces);
 #endif /* CONFIG_CTRL_IFACE_HIDL */
+	hostapd_global_ctrl_iface_deinit(&interfaces);
 	/* Deinitialize all interfaces */
 	for (i = 0; i < interfaces.count; i++) {
 		if (!interfaces.iface[i])
diff --git a/src/eap_peer/eap_proxy_qmi.c b/src/eap_peer/eap_proxy_qmi.c
deleted file mode 100644
index 2d40dce..0000000
--- a/src/eap_peer/eap_proxy_qmi.c
+++ /dev/null
@@ -1,2447 +0,0 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of The Linux Foundation nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-
-#include "includes.h"
-#include "common.h"
-
-#ifdef CONFIG_EAP_PROXY
-#include "qmi_client.h"
-#include "eap_proxy_qmi.h"
-#include "qmi_client.h"
-#include "qmi_idl_lib.h"
-#include "authentication_service_v01.h"
-#include "user_identity_module_v01.h"
-#include "eap_config.h"
-#include "common/wpa_ctrl.h"
-#if defined(ANDROID)
-#include <cutils/properties.h>
-#ifdef CONFIG_EAP_PROXY_MDM_DETECT
-#include "mdm_detect.h"
-#endif /* CONFIG_EAP_PROXY_MDM_DETECT */
-#if defined(__BIONIC_FORTIFY)
-#include <sys/system_properties.h>
-#endif
-#endif
-#include <pthread.h>
-#include <sys/syscall.h>
-#include <sys/types.h>
-
-#define IMSI_LENGTH 15
-#define WPA_UIM_QMI_EVENT_MASK_CARD_STATUS        \
-                                        (1 << QMI_UIM_EVENT_CARD_STATUS_BIT_V01)
-#define WPA_UIM_QMI_EVENT_READ_TRANSPARENT_REQ    \
-                                        (1 << QMI_UIM_READ_TRANSPARENT_REQ_V01)
-
-/* Default timeout (in milli-seconds) for synchronous QMI message */
-#define WPA_UIM_QMI_DEFAULT_TIMEOUT               5000
-
-#define EAP_PROXY_PROPERTY_BASEBAND     "ro.baseband"
-#ifdef CONFIG_EAP_PROXY_MSM8994_TARGET
-#define EAP_PROXY_TARGET_PLATFORM       "ro.board.platform"
-#endif /* CONFIG_EAP_PROXY_MSM8994_TARGET */
-#if defined(__BIONIC_FORTIFY)
-#define EAP_PROXY_PROPERTY_BASEBAND_SIZE   PROP_VALUE_MAX
-#else
-#define EAP_PROXY_PROPERTY_BASEBAND_SIZE   10
-#endif
-#define EAP_PROXY_BASEBAND_VALUE_MSM       "msm"
-#define EAP_PROXY_BASEBAND_VALUE_APQ       "apq"
-#define EAP_PROXY_BASEBAND_VALUE_SVLTE1    "svlte1"
-#define EAP_PROXY_BASEBAND_VALUE_SVLTE2A   "svlte2a"
-#define EAP_PROXY_BASEBAND_VALUE_SGLTE     "sglte"
-#define EAP_PROXY_BASEBAND_VALUE_CSFB      "csfb"
-#define EAP_PROXY_BASEBAND_VALUE_MDMUSB    "mdm"
-#ifdef CONFIG_EAP_PROXY_MSM8994_TARGET
-#define EAP_PROXY_TARGET_PLATFORM_MSM8994  "msm8994"
-#endif /* CONFIG_EAP_PROXY_MSM8994_TARGET */
-#define EAP_PROXY_TARGET_FUSION4_5_PCIE    "fusion4_5_pcie"
-#define EAP_PROXY_BASEBAND_VALUE_UNDEFINED "undefined"
-
-#ifndef ANDROID
-#ifdef SYS_gettid
-static inline pid_t gettid(void)
-{
-        return syscall(SYS_gettid);
-}
-#else
-static inline pid_t gettid(void)
-{
-        return -1;
-}
-#endif
-#endif
-
-static Boolean wpa_qmi_ssr = FALSE;
-static void eap_proxy_qmi_deinit(struct eap_proxy_sm *eap_proxy);
-static void eap_proxy_eapol_sm_set_bool(struct eap_proxy_sm *sm,
-                         enum eapol_bool_var var, Boolean value);
-struct eap_proxy_sm *
-eap_proxy_init(void *eapol_ctx, const struct eapol_callbacks *eapol_cb,
-	       void *msg_ctx);
-static Boolean eap_proxy_eapol_sm_get_bool(struct eap_proxy_sm *sm,
-                                        enum eapol_bool_var var);
-
-/* Call-back function to process an authenticationr result indication from
- * QMI EAP service */
-static void handle_qmi_eap_ind(qmi_client_type user_handle,
-                unsigned int msg_id,
-                void* ind_buf,
-                unsigned int ind_buf_len,
-                void* ind_cb_data);
-
-static u8 *eap_proxy_getKey(struct eap_proxy_sm *eap_proxy);
-static u8 * eap_proxy_get_keys(struct eap_proxy_sm *sm);
-static enum eap_proxy_status eap_proxy_qmi_response_wait(struct eap_proxy_sm *eap_proxy);
-static int eap_proxy_is_state_changed(struct eap_proxy_sm *sm);
-static enum eap_proxy_status eap_proxy_process(struct eap_proxy_sm  *eap_proxy,
-                                        u8 *eapReqData, int eapReqDataLen, struct eap_sm *eap_sm);
-static char bin_to_hexchar(u8 ch);
-
-static void wpa_qmi_client_indication_cb
-(
-        qmi_client_type                user_handle,
-        unsigned long                  msg_id,
-        unsigned char                 *ind_buf_ptr,
-        int                            ind_buf_len,
-        void                          *ind_cb_data
-);
-static void dump_buff(u8 *buff, int len);
-#ifdef CONFIG_CTRL_IFACE
-static const char *eap_proxy_sm_state_txt(int state);
-#endif /* CONFIG_CTRL_IFACE */
-static Boolean eap_proxy_build_identity(struct eap_proxy_sm *eap_proxy, u8 id,
-                                                 struct eap_sm *eap_sm);
-
-#ifdef SIM_AKA_IDENTITY_IMSI
-static char *imsi;
-static int imsi_len_g = 0;
-static int card_mnc_len = -1;
-#ifdef CONFIG_EAP_PROXY_DUAL_SIM
-static unsigned int slot = 0;
-static unsigned int session_type;
-#endif /* CONFIG_EAP_PROXY_DUAL_SIM */
-
-static Boolean wpa_qmi_register_events(int sim_num, wpa_uim_struct_type *wpa_uim);
-static Boolean wpa_qmi_read_card_imsi(int sim_num, wpa_uim_struct_type *wpa_uim);
-static Boolean wpa_qmi_read_card_status(int sim_num, wpa_uim_struct_type *wpa_uim);
-static Boolean wpa_qmi_register_auth_inds(struct eap_proxy_sm *eap_proxy);
-
-#endif
-#define EAP_SUB_TYPE_SIM_START     0x0a
-#define EAP_SUB_TYPE_AKA_IDENTITY  0x05
-#define EAP_RESP_TYPE_NAK             3
-
-
-#ifdef SIM_AKA_IDENTITY_IMSI
-static void wpa_qmi_client_indication_cb
-(
-        qmi_client_type                user_handle,
-        unsigned long                  msg_id,
-        unsigned char                 *ind_buf_ptr,
-        int                            ind_buf_len,
-        void                          *ind_cb_data
-)
-{
-	u32 decoded_payload_len = 0;
-	qmi_client_error_type qmi_err = QMI_NO_ERR;
-	void * decoded_payload = NULL;
-	struct eap_proxy_sm *eap_proxy = ind_cb_data;
-	uim_status_change_ind_msg_v01* status_change_ind_ptr = NULL;
-	struct wpa_supplicant *wpa_s = NULL;
-	u32 i, card_info_len = 0;
-
-	wpa_printf(MSG_DEBUG, "eap_proxy: %s: msg_id=0x%lx", __func__, msg_id);
-
-	if (user_handle == NULL) {
-		wpa_printf(MSG_ERROR, "eap_proxy: qmi_client_type missing in callback");
-		return;
-	}
-
-	if (eap_proxy == NULL) {
-		wpa_printf(MSG_ERROR, "eap_proxy: not initialized, discard client indiataion");
-		return;
-	}
-
-	if (ind_buf_ptr == NULL) {
-		wpa_printf(MSG_ERROR, "eap_proxy: indication buffer NULL, discard client indiataion");
-		return;
-	}
-
-	qmi_idl_get_message_c_struct_len(uim_get_service_object_v01(),
-					 QMI_IDL_INDICATION, msg_id,
-					 &decoded_payload_len);
-
-	if(!decoded_payload_len) {
-		wpa_printf(MSG_ERROR, "eap_proxy: cann't decode payload, discard client indiataion");
-		return;
-	}
-
-	decoded_payload = os_zalloc(decoded_payload_len);
-	if (decoded_payload == NULL) {
-		wpa_printf(MSG_ERROR, "eap_proxy: failed to allocate memory");
-		return;
-	}
-
-	qmi_err = qmi_client_message_decode(user_handle,
-					    QMI_IDL_INDICATION, msg_id,
-					    ind_buf_ptr, ind_buf_len,
-					    decoded_payload, decoded_payload_len);
-
-	if (qmi_err == QMI_NO_ERR) {
-		switch (msg_id) {
-		case QMI_UIM_STATUS_CHANGE_IND_V01:
-			status_change_ind_ptr = (uim_status_change_ind_msg_v01*)decoded_payload;
-			if (!status_change_ind_ptr->card_status_valid)
-				goto fail;
-
-			card_info_len = status_change_ind_ptr->card_status.card_info_len;
-			for (i = 0; i < card_info_len; i++) {
-				if(UIM_CARD_STATE_ABSENT_V01 ==
-				    status_change_ind_ptr->card_status.card_info[i].card_state) {
-					wpa_printf(MSG_DEBUG, "eap_proxy: %s SIM card removed. flush pmksa entries.", __func__);
-					eap_proxy->eapol_cb->eap_proxy_notify_sim_status(eap_proxy->ctx, SIM_STATE_ERROR);
-					break; /* only one flush will do */
-				}
-			}
-			break;
-		default:
-			wpa_printf(MSG_DEBUG, "eap_proxy: Unknown QMI Indicaiton %lu", msg_id);
-			break;
-		}
-	}
-fail:
-	os_free(decoded_payload);
-	return;
-}
-
-static Boolean wpa_qmi_register_auth_inds(struct eap_proxy_sm *eap_proxy)
-{
-        qmi_client_error_type               qmi_err_code      = 0;
-        auth_indication_register_resp_msg_v01  event_resp_msg;
-        auth_indication_register_req_msg_v01 event_reg_params;
-
-        /* Register for events first */
-        os_memset(&event_reg_params, 0, sizeof(auth_indication_register_req_msg_v01));
-        os_memset(&event_resp_msg, 0, sizeof(auth_indication_register_resp_msg_v01));
-
-        event_reg_params.report_eap_notification_code_valid = TRUE;
-        event_reg_params.report_eap_notification_code = 1;
-
-        wpa_printf(MSG_DEBUG, "registering for notification codes\n");
-        qmi_err_code = qmi_client_send_msg_sync(
-                        eap_proxy->qmi_auth_svc_client_ptr[eap_proxy->user_selected_sim],
-                        QMI_AUTH_INDICATION_REGISTER_REQ_V01,
-                        (void *) &event_reg_params,
-                        sizeof(auth_indication_register_req_msg_v01),
-                        (void*) &event_resp_msg,
-                        sizeof(auth_indication_register_resp_msg_v01),
-                        WPA_UIM_QMI_DEFAULT_TIMEOUT);
-
-        if (qmi_err_code != QMI_NO_ERR ||
-            (event_resp_msg.resp.result != QMI_RESULT_SUCCESS_V01 &&
-             event_resp_msg.resp.error != QMI_ERR_NO_EFFECT_V01)) {
-                wpa_printf(MSG_ERROR,"QMI-ERROR Error for "
-                           "QMI_AUTH_INDICATION_REGISTER_REQ_V01, qmi_err_code=%d"
-                           "Error=%d\n", qmi_err_code,
-                            event_resp_msg.resp.error);
-                return FALSE;
-        }
-
-        return TRUE;
-
-}
-
-static Boolean wpa_qmi_register_events(int sim_num, wpa_uim_struct_type *wpa_uim)
-{
-        qmi_client_error_type               qmi_err_code      = 0;
-        uim_event_reg_resp_msg_v01          event_resp_msg;
-        uim_event_reg_req_msg_v01           event_reg_params;
-
-        /* Register for events first */
-        os_memset(&event_reg_params, 0, sizeof(uim_event_reg_req_msg_v01));
-        os_memset(&event_resp_msg, 0, sizeof(uim_event_reg_resp_msg_v01));
-
-        event_reg_params.event_mask |= (WPA_UIM_QMI_EVENT_MASK_CARD_STATUS);
-        qmi_err_code = qmi_client_send_msg_sync(wpa_uim[sim_num].qmi_uim_svc_client_ptr,
-                                                QMI_UIM_EVENT_REG_REQ_V01,
-                                                (void *) &event_reg_params,
-                                                sizeof(uim_event_reg_req_msg_v01),
-                                                (void *) &event_resp_msg,
-                                                sizeof(uim_event_reg_resp_msg_v01),
-                                                WPA_UIM_QMI_DEFAULT_TIMEOUT);
-
-        wpa_printf(MSG_ERROR, "eap_proxy: QMI_UIM_EVENT_REG_REQ_V01, "
-                   "qmi_err_code: 0x%x wpa_uim[%d].qmi_uim_svc_client_ptr =%p"
-                   "Error=0x%x", qmi_err_code, sim_num,
-                    wpa_uim[sim_num].qmi_uim_svc_client_ptr,
-                    event_resp_msg.resp.error);
-
-        if (qmi_err_code != QMI_NO_ERR ||
-            (event_resp_msg.resp.result != QMI_RESULT_SUCCESS_V01 &&
-             event_resp_msg.resp.error != QMI_ERR_NO_EFFECT_V01)) {
-                wpa_printf(MSG_ERROR,"QMI-ERROR Error for "
-                           "QMI_UIM_EVENT_REG_REQ_V01, qmi_err_code=%d"
-                           "Error=%d\n", qmi_err_code,
-                            event_resp_msg.resp.error);
-                return FALSE;
-        }
-
-        if(event_resp_msg.event_mask_valid)
-        {
-                wpa_printf(MSG_ERROR, "eap_proxy: event_resp_msg.event=%d,\n",
-                           event_resp_msg.event_mask);
-
-        }
-
-        if (wpa_qmi_read_card_status(sim_num, wpa_uim))
-                return TRUE;
-        else {
-                wpa_printf(MSG_ERROR,"eap_proxy: Error while reading SIM card status\n");
-                return FALSE;
-        }
-}
-
-static Boolean wpa_qmi_read_card_status(int sim_num, wpa_uim_struct_type *wpa_uim)
-{
-        unsigned int                        i = 0, j = 0;
-        Boolean                             card_found = FALSE;
-        qmi_client_error_type               qmi_err_code      = 0;
-        uim_get_card_status_resp_msg_v01   card_status_resp_msg;
-
-        wpa_printf (MSG_ERROR, "eap_proxy: reading card %d values\n", sim_num+1);
-        os_memset(&card_status_resp_msg,
-                  0,
-                  sizeof(uim_get_card_status_resp_msg_v01));
-        qmi_err_code = qmi_client_send_msg_sync(wpa_uim[sim_num].qmi_uim_svc_client_ptr,
-                                                QMI_UIM_GET_CARD_STATUS_REQ_V01,
-                                                NULL,
-                                                0,
-                                                (void *)&card_status_resp_msg,
-                                                sizeof(uim_get_card_status_resp_msg_v01),
-                                                WPA_UIM_QMI_DEFAULT_TIMEOUT);
-
-        if (qmi_err_code != QMI_NO_ERR ||
-            card_status_resp_msg.resp.result != QMI_RESULT_SUCCESS_V01) {
-                wpa_printf(MSG_ERROR, "QMI-ERROR Error for "
-                           "QMI_UIM_GET_CARD_STATUS_REQ_V01, qmi_err_code: 0x%x\n "
-                           "resp_err = %d \n", qmi_err_code, card_status_resp_msg.resp.error);
-                return FALSE;
-        }
-
-        /* Updated global card status if needed */
-        if (!card_status_resp_msg.card_status_valid ||
-            (card_status_resp_msg.resp.result != QMI_RESULT_SUCCESS_V01)) {
-                wpa_printf(MSG_ERROR, "eap_proxy: card_status is not valid !\n");
-                return FALSE;
-        }
-        /* Update global in case of new card state or error code */
-        i = sim_num;
-        if ( i < QMI_UIM_CARDS_MAX_V01 &&
-             i < card_status_resp_msg.card_status.card_info_len ) {
-                wpa_printf(MSG_ERROR, "eap_proxy: card_info[i].card_state: 0x%x\n",
-                        card_status_resp_msg.card_status.card_info[i].card_state);
-                wpa_printf(MSG_ERROR, "eap_proxy: card_info[i].error_code: 0x%x\n",
-                        card_status_resp_msg.card_status.card_info[i].error_code);
-
-                wpa_uim[sim_num].card_info[i].card_state =
-                        card_status_resp_msg.card_status.card_info[i].card_state;
-
-                wpa_uim[sim_num].card_info[i].card_error_code =
-                        card_status_resp_msg.card_status.card_info[i].error_code;
-#ifdef CONFIG_EAP_PROXY_DUAL_SIM
-            do {
-                   if (card_status_resp_msg.card_status.index_gw_pri != 0xFFFF) {
-                        slot = (card_status_resp_msg.card_status.index_gw_pri & 0xFF00) >> 8;
-                        if (slot == i) {
-                            session_type = UIM_SESSION_TYPE_PRIMARY_GW_V01;
-                            wpa_printf (MSG_ERROR, "eap_proxy: read_card_status:"
-                                        " prime slot = %d\n", slot);
-                            break;
-                        }
-                   }
-                   if (card_status_resp_msg.card_status.index_gw_sec != 0xFFFF) {
-                        slot = (card_status_resp_msg.card_status.index_gw_sec & 0xFF00) >> 8;
-                        if (slot == i) {
-                            session_type = UIM_SESSION_TYPE_SECONDARY_GW_V01;
-                            wpa_printf (MSG_ERROR, "eap_proxy: read_card_status: "
-                                        "second slot = %d\n", slot);
-                            break;
-                        }
-                   }
-                   wpa_printf (MSG_ERROR, "eap_proxy: read_card_status: Not GW it's 1x\n");
-                   return FALSE;
-                }while(0);
-
-                if (slot > 1){
-                            wpa_printf (MSG_ERROR, "eap_proxy: read_card_status: "
-                                        "INVALID slot = %d and i = %d\n", slot, i);
-                        return FALSE;
-                }
-#endif /* CONFIG_EAP_PROXY_DUAL_SIM */
-
-                if (card_status_resp_msg.card_status.card_info[i].card_state ==
-                    UIM_CARD_STATE_PRESENT_V01) {
-                        for (j = 0 ; j < QMI_UIM_APPS_MAX_V01 ; j++) {
-                                wpa_uim[sim_num].card_info[i].app_type = card_status_resp_msg.
-                                        card_status.card_info[i].app_info[j].app_type;
-
-                                wpa_uim[sim_num].card_info[i].app_state = card_status_resp_msg.
-                                        card_status.card_info[i].app_info[j].app_state;
-
-                                if (((card_status_resp_msg.card_status.card_info[i].
-                                     app_info[j].app_type == 1) || (card_status_resp_msg.
-                                     card_status.card_info[i].app_info[j].app_type == 2)) &&
-                                    (card_status_resp_msg.card_status.card_info[i].app_info[j].
-                                     app_state == UIM_APP_STATE_READY_V01)) {
-                                        wpa_printf(MSG_ERROR, "eap_proxy: card READY\n");
-                                        wpa_printf(MSG_ERROR, "eap_proxy: card_info[i].app_ty"
-                                                "pe: 0x%x\n", card_status_resp_msg.card_status.
-                                                card_info[i].app_info[j].app_type);
-                                        wpa_printf(MSG_ERROR, "eap_proxy: card_info[i].app_sta"
-                                                "te : 0x%x\n", card_status_resp_msg.card_status
-                                                .card_info[i].app_info[j].app_state);
-                                        card_found = TRUE;
-                                        break;
-                                }
-                        }
-                }
-
-                if (card_found) {
-                        wpa_printf(MSG_ERROR, "eap_proxy: card found for SIM = %d\n", sim_num+1);
-                }
-        }
-
-        if ((!card_found) || (i == QMI_UIM_CARDS_MAX_V01) ||
-                (j == QMI_UIM_APPS_MAX_V01)) {
-                wpa_printf(MSG_ERROR, "eap_proxy: SIM/USIM not ready card_found=%d\n",card_found);
-                return FALSE;
-        }
-
-        wpa_printf(MSG_ERROR, "eap_proxy: SIM/USIM ready\n");
-        wpa_uim[sim_num].card_ready_idx = i;
-
-        return TRUE;
-} /* wpa_qmi_read_card_status */
-
-static int check_for_3_digit()
-{
-        int mcc = 0,i =0;
-        /*
-        -- 3 digits if MCC belongs to this group: 302, 310, 311, 312, 313, 314, 315,
-        316, 334, 348 (decimal)
-        -- 2 digits in all other cases
-        Note: imsi values are hex characters
-        */
-        int valid_mcc[] = {302, 310, 311, 312, 313, 314, 315, 316, 334, 348};
-
-        mcc = ((imsi[0]-0x30)*100) + ((imsi[1]-0x30)*10) + (imsi[2]-0x30);
-
-        wpa_printf(MSG_ERROR, "mcc from the SIM is %d\n", mcc);
-        for(i = 0; i < sizeof(valid_mcc)/sizeof(valid_mcc[0]); i++)
-        {
-                if(mcc == valid_mcc[i])
-                        return 1;
-        }
-        return 0;
-}
-
-static Boolean wpa_qmi_read_card_imsi(int sim_num, wpa_uim_struct_type *wpa_uim)
-{
-        int                     length;
-        unsigned char           *data;
-        int                     src = 0, dst = 0;
-        Boolean                 card_found = FALSE,
-        qmi_status = TRUE;
-        qmi_client_error_type               qmi_err_code = 0;
-        uim_read_transparent_req_msg_v01   qmi_read_trans_req;
-        uim_read_transparent_resp_msg_v01  read_trans_resp;
-        card_mnc_len = -1;
-
-
-        os_memset(&read_trans_resp, 0,
-                  sizeof(uim_read_transparent_resp_msg_v01));
-        os_memset(&qmi_read_trans_req, 0,
-                        sizeof(uim_read_transparent_req_msg_v01));
-
-        qmi_read_trans_req.read_transparent.length = 0;
-        qmi_read_trans_req.read_transparent.offset = 0;
-        qmi_read_trans_req.file_id.file_id = 0x6F07;
-        qmi_read_trans_req.file_id.path_len = 4;
-
-#ifdef CONFIG_EAP_PROXY_DUAL_SIM
-        wpa_printf (MSG_ERROR, "eap_proxy: read_card_imsi: session_type = %d\n", session_type);
-        qmi_read_trans_req.session_information.session_type = session_type;
-#else
-        qmi_read_trans_req.session_information.session_type =
-                                UIM_SESSION_TYPE_PRIMARY_GW_V01;
-#endif /* CONFIG_EAP_PROXY_DUAL_SIM */
-        qmi_read_trans_req.session_information.aid_len = 0;
-
-        /* For USIM*/
-        if ((wpa_uim[sim_num].card_info[wpa_uim[sim_num].card_ready_idx].app_type ==
-                UIM_APP_TYPE_USIM_V01)) {
-                qmi_read_trans_req.file_id.path[0] = 0x00;
-                qmi_read_trans_req.file_id.path[1] = 0x3F;
-                qmi_read_trans_req.file_id.path[2] = 0xFF;
-                qmi_read_trans_req.file_id.path[3] = 0x7F;
-
-        } else /* For SIM*/
-        if ((wpa_uim[sim_num].card_info[wpa_uim[sim_num].card_ready_idx].app_type ==
-                UIM_APP_TYPE_SIM_V01)) {
-                qmi_read_trans_req.file_id.path[0] = 0x00;
-                qmi_read_trans_req.file_id.path[1] = 0x3F;
-                qmi_read_trans_req.file_id.path[2] = 0x20;
-                qmi_read_trans_req.file_id.path[3] = 0x7F;
-        }
-        else {
-                return FALSE;
-        }
-
-        qmi_err_code = qmi_client_send_msg_sync(wpa_uim[sim_num].qmi_uim_svc_client_ptr,
-                                        QMI_UIM_READ_TRANSPARENT_REQ_V01,
-                                        (void *)&qmi_read_trans_req,
-                                        sizeof(uim_read_transparent_req_msg_v01),
-                                        (void *) &read_trans_resp,
-                                        sizeof(uim_read_transparent_resp_msg_v01),
-                                        WPA_UIM_QMI_DEFAULT_TIMEOUT);
-        if (QMI_NO_ERR != qmi_err_code ||
-            read_trans_resp.resp.result != QMI_RESULT_SUCCESS_V01) {
-                wpa_printf(MSG_ERROR, "QMI-ERROR Unable to read IMSI from UIM service;"
-                           " error_ret=%d; qmi_err=%d\n", qmi_err_code,
-                           read_trans_resp.resp.error);
-                qmi_status = FALSE;
-        }
-
-        if (QMI_NO_ERR == qmi_err_code) {
-                if (read_trans_resp.read_result_valid) {
-                        length  =
-                                read_trans_resp.read_result.content_len;
-                        data    =
-                                read_trans_resp.read_result.content;
-                                wpa_printf(MSG_ERROR,
-                                        "eap_proxy: IMSI SIM content length = %d\n",
-                                        length);
-
-                        /* Received IMSI is in the 3GPP format
-                                converting it into ascii string */
-                        imsi = os_zalloc(2 * length);
-                        if (imsi == NULL) {
-                                wpa_printf(MSG_ERROR,
-                                        "eap_proxy: Couldn't allocate memmory for imsi");
-                                return FALSE;
-                        }
-                        for (src = 1, dst = 0;
-                                (src < length) && (dst < (length * 2));
-                                src++) {
-                                wpa_printf(MSG_ERROR,
-                                        "eap_proxy: IMSI read from SIM = %d src %d\n",
-                                        data[src], src);
-                                if(data[src] == 0xFF) {
-                                        break;
-                                }
-                                if (src > 1) {
-                                        imsi[dst] = bin_to_hexchar(data[src] & 0x0F);
-                                        dst++;
-                                        wpa_printf(MSG_ERROR,
-                                        "eap_proxy: IMSI dst = %d dst %d\n",
-                                        imsi[dst-1], dst);
-                                }
-                                /* Process upper part of byte for all bytes */
-                                imsi[dst] = bin_to_hexchar(data[src] >> 4);
-                                dst++;
-                                wpa_printf(MSG_ERROR,
-                                        "eap_proxy: IMSI dst = %d dst %d\n",
-                                        imsi[dst-1], dst);
-                        }
-                                imsi_len_g = (data[0]*2 - 1); //dst;
-                                wpa_printf(MSG_ERROR,
-                                        "eap_proxy: IMSI first digit = %d read length = %d"
-                                        "imsi %20s\n", data[0],imsi_len_g, imsi);
-                        } else{
-                                wpa_printf(MSG_ERROR,
-                                        "eap_proxy: IMSI read failure read_result_valid = %d\n",
-                                        read_trans_resp.read_result_valid);
-                                qmi_status = FALSE;
-                        }
-                }
-        /* READ EF_AD */
-        /* if qmi_status is FALSE, UIM read for mnc may not be required - To Do */
-        qmi_read_trans_req.file_id.file_id = 0x6FAD;
-        qmi_err_code = qmi_client_send_msg_sync(wpa_uim[sim_num].qmi_uim_svc_client_ptr,
-                                        QMI_UIM_READ_TRANSPARENT_REQ_V01,
-                                        (void *)&qmi_read_trans_req,
-                                        sizeof(uim_read_transparent_req_msg_v01),
-                                        (void *)&read_trans_resp,
-                                        sizeof(uim_read_transparent_resp_msg_v01),
-                                        WPA_UIM_QMI_DEFAULT_TIMEOUT);
-        if (QMI_NO_ERR != qmi_err_code ||
-           read_trans_resp.resp.result != QMI_RESULT_SUCCESS_V01) {
-                wpa_printf(MSG_ERROR, "QMI-ERROR Unable to read MNC from UIM service;"
-                           " error_ret=%d; qmi_err=%d\n", qmi_err_code,
-                           read_trans_resp.resp.error);
-                qmi_status = FALSE;
-        }
-        if (QMI_NO_ERR == qmi_err_code) {
-                if (read_trans_resp.read_result_valid) {
-                        length  =
-                                read_trans_resp.read_result.content_len;
-                        data    =
-                                read_trans_resp.read_result.content;
-
-                        if(length >= 4)
-                                card_mnc_len = 0x0f & data[3];
-                        if ((card_mnc_len != 2) && (card_mnc_len != 3)) {
-                                if(check_for_3_digit())
-                                        card_mnc_len = 3;
-                                else
-                                        card_mnc_len = 2;
-                                wpa_printf(MSG_ERROR, "Failed to get MNC length from (U)SIM "
-                                "assuming %d as mcc %s to 3 digit mnc group\n",
-                                card_mnc_len, card_mnc_len == 3? "belongs":"not belongs");
-                        }
-                }
-        }
-
-
-        return qmi_status;
-} /* wpa_qmi_read_card_imsi */
-#endif /* SIM_AKA_IDENTITY_IMSI */
-
-#ifdef CONFIG_EAP_PROXY_MDM_DETECT
-static int eap_modem_compatible(struct dev_info *mdm_detect_info)
-{
-        char args[EAP_PROXY_PROPERTY_BASEBAND_SIZE] = {0};
-        int ret = 0;
-
-        /* Get the hardware property */
-        ret = property_get(EAP_PROXY_PROPERTY_BASEBAND, args, "");
-        if (ret > EAP_PROXY_PROPERTY_BASEBAND_SIZE){
-                wpa_printf(MSG_ERROR,"eap_proxy: property [%s] has size [%d] that exceeds max [%d]",
-                           EAP_PROXY_PROPERTY_BASEBAND,
-                           ret,
-                           EAP_PROXY_PROPERTY_BASEBAND_SIZE);
-                return FALSE;
-        }
-
-        /* This will check for the type of hardware, and if the hardware type
-         * needs external modem, it will check if the modem type is external */
-        if(!os_strncmp(EAP_PROXY_BASEBAND_VALUE_APQ, args, 3)) {
-                for (ret = 0; ret < mdm_detect_info->num_modems; ret++) {
-                        if (mdm_detect_info->mdm_list[ret].type == MDM_TYPE_EXTERNAL) {
-                                wpa_printf(MSG_INFO, "eap_proxy: hardware supports external modem");
-                                return TRUE;
-                        }
-                }
-                wpa_printf(MSG_ERROR, "eap_proxy: hardware does not support external modem");
-                return FALSE;
-        }
-        return TRUE;
-}
-#endif /* CONFIG_EAP_PROXY_MDM_DETECT */
-
-void wpa_qmi_register_notification(void *eloop_ctx, void *timeout_ctx)
-{
-        struct eap_proxy_sm *eap_proxy = eloop_ctx;
-        wpa_printf(MSG_DEBUG, "eap_proxy: %s", __func__);
-
-        eap_proxy_qmi_deinit(eap_proxy);
-        eap_proxy_init(eap_proxy, NULL, NULL);
-}
-
-void wpa_qmi_handle_ssr(qmi_client_type user_handle, qmi_client_error_type error, void *err_cb_data)
-{
-        struct eap_proxy_sm *eap_proxy = err_cb_data;
-
-        wpa_printf(MSG_DEBUG, "eap_proxy: %s ", __func__);
-
-        wpa_qmi_ssr = TRUE;
-        if (eap_proxy->qmi_ssr_in_progress) {
-                wpa_printf(MSG_DEBUG, "eap_proxy: qmi_ssr_in_progress for eap_proxy=%p Skip another.", eap_proxy);
-        } else {
-                eap_proxy->qmi_ssr_in_progress = TRUE;
-                eloop_register_timeout(0, 0, wpa_qmi_register_notification, eap_proxy, NULL);
-        }
-}
-
-static void eap_proxy_post_init(struct eap_proxy_sm *eap_proxy)
-{
-        int qmiErrorCode;
-        int qmiRetCode;
-        qmi_idl_service_object_type qmi_client_service_obj[MAX_NO_OF_SIM_SUPPORTED];
-        int index;
-        static Boolean flag = FALSE;
-        int ret = 0;
-        wpa_uim_struct_type *wpa_uim = eap_proxy->wpa_uim;
-#ifdef CONFIG_EAP_PROXY_MDM_DETECT
-        struct dev_info mdm_detect_info;
-
-        /* Call ESOC API to get the number of modems.
-         * If the number of modems is not zero, only then proceed
-         * with the eap_proxy intialization.
-         */
-        ret = get_system_info(&mdm_detect_info);
-        if (ret > 0)
-                wpa_printf(MSG_ERROR, "eap_proxy: Failed to get system info, ret %d", ret);
-
-        if (mdm_detect_info.num_modems == 0) {
-                eap_proxy->proxy_state = EAP_PROXY_DISABLED;
-                wpa_printf(MSG_ERROR, "eap_proxy: No Modem support for this target"
-                           " number of modems is %d", mdm_detect_info.num_modems);
-                return;
-        }
-        wpa_printf(MSG_DEBUG, "eap_proxy: num_modems = %d", mdm_detect_info.num_modems);
-
-        if(eap_modem_compatible(&mdm_detect_info) == FALSE) {
-                eap_proxy->proxy_state = EAP_PROXY_DISABLED;
-                wpa_printf(MSG_ERROR, "eap_proxy: build does not support EAP-SIM feature");
-                return;
-        }
-#endif /* CONFIG_EAP_PROXY_MDM_DETECT */
-        eap_proxy->proxy_state = EAP_PROXY_INITIALIZE;
-        eap_proxy->qmi_state = QMI_STATE_IDLE;
-        eap_proxy->key = NULL;
-        eap_proxy->emsk = NULL;
-        eap_proxy->session_id = NULL;
-        eap_proxy->session_id_len = 0;
-        eap_proxy->iskey_valid = FALSE;
-        eap_proxy->is_state_changed = FALSE;
-        eap_proxy->isEap = FALSE;
-        eap_proxy->eap_type = EAP_TYPE_NONE;
-        eap_proxy->user_selected_sim = 0;
-
-#ifdef CONFIG_EAP_PROXY_DUAL_SIM
-        wpa_printf (MSG_ERROR,
-                "eap_proxy: eap_proxy Initializing for DUAL SIM build %d tid %d",
-                MAX_NO_OF_SIM_SUPPORTED, gettid());
-#else
-        wpa_printf (MSG_ERROR,
-                "eap_proxy: eap_proxy Initializing for Single SIM build %d tid %d",
-                MAX_NO_OF_SIM_SUPPORTED, gettid());
-#endif
-
-
-        for (index = 0; index < MAX_NO_OF_SIM_SUPPORTED; ++index) {
-
-#ifdef SIM_AKA_IDENTITY_IMSI
-                if (FALSE == eap_proxy->qmi_uim_svc_client_initialized[index])  {
-                        qmi_client_os_params eap_os_params;
-                        /* Init QMI_UIM service for EAP-SIM/AKA */
-                        os_memset(&eap_os_params, 0, sizeof(qmi_client_os_params));
-
-                        qmiErrorCode = qmi_client_init_instance(
-                                        uim_get_service_object_v01(),
-                                        QMI_CLIENT_INSTANCE_ANY,
-                                        wpa_qmi_client_indication_cb,
-                                        eap_proxy, &eap_os_params,
-                                        10000,
-                                        &wpa_uim[index].qmi_uim_svc_client_ptr);
-
-                        if ((wpa_uim[index].qmi_uim_svc_client_ptr == NULL) || (qmiErrorCode > 0)) {
-                                wpa_printf(MSG_ERROR, "eap_proxy: Could not register with QMI UIM"
-                                        "Service, qmi_uim_svc_client_ptr: %p,qmi_err_code: %d\n",
-                                        wpa_uim[index].qmi_uim_svc_client_ptr, qmiErrorCode);
-                                wpa_uim[index].qmi_uim_svc_client_ptr = NULL;
-                                flag = FALSE;
-                                continue;
-                        }
-                        eap_proxy->qmi_uim_svc_client_initialized[index] = TRUE;
-
-                        wpa_printf (MSG_ERROR, "eap_proxy: QMI uim service client initialized with"
-                                "success tid is %d %p %d\n",
-                                gettid(), wpa_uim[index].qmi_uim_svc_client_ptr, qmiErrorCode);
-                        /* Register the card events with the QMI / UIM */
-                        wpa_qmi_register_events(index, wpa_uim);
-                        qmiErrorCode = qmi_client_register_error_cb(
-                                wpa_uim[index].qmi_uim_svc_client_ptr, wpa_qmi_handle_ssr, eap_proxy);
-                        wpa_printf(MSG_DEBUG,
-                                "eap_proxy: qmi_client_register_error_cb() status %d\n", qmiErrorCode);
-                        wpa_qmi_ssr = FALSE;
-                } else
-                        wpa_printf (MSG_ERROR, "eap_proxy: QMI uim service client is already init"
-                                "ialized tid is %d \n", gettid());
-
-
-                qmi_client_os_params eap_os_params;
-                os_memset(&eap_os_params, 0, sizeof(qmi_client_os_params));
-
-                qmiErrorCode = qmi_client_init_instance(auth_get_service_object_v01(),
-                                                        QMI_CLIENT_INSTANCE_ANY,
-                                                        handle_qmi_eap_ind,
-                                                        eap_proxy,
-                                                        &eap_os_params,
-                                                        10000,
-                                                        &eap_proxy->qmi_auth_svc_client_ptr[index]);
-
-
-                if ((eap_proxy->qmi_auth_svc_client_ptr[index] == NULL) || (qmiErrorCode > 0)) {
-                        wpa_printf(MSG_ERROR, "eap_proxy: Could not register with QMI auth Service "
-                                        "qmi_auth_svc_client_ptr: %p,qmi_err_code: %d\n",
-                                        eap_proxy->qmi_auth_svc_client_ptr[index], qmiErrorCode);
-                        eap_proxy->qmi_auth_svc_client_ptr[index] = NULL;
-                        flag = FALSE;
-                        continue;
-                }
-                wpa_printf (MSG_ERROR, "eap_proxy: QMI auth service client initialized with success"
-                        " tid is %d  %p eapol_proxy=%p\n", gettid(),
-                                eap_proxy->qmi_auth_svc_client_ptr[index], eap_proxy);
-                flag = TRUE;
-                /* Register for the notifications from QMI / AUTH */
-                wpa_qmi_register_auth_inds(eap_proxy);
-#endif /* SIM_AKA_IDENTITY_IMSI */
-        }
-
-        if ( flag == FALSE ) {
-                eap_proxy->proxy_state = EAP_PROXY_DISABLED;
-                wpa_printf(MSG_ERROR, "eap_proxy: flag = %d proxy init failed\n", flag);
-                return;
-        }
-
-        eap_proxy->qmi_ssr_in_progress = FALSE;
-        eap_proxy->proxy_state = EAP_PROXY_IDLE;
-        eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapSuccess, FALSE);
-        eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapFail, FALSE);
-        eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapRestart, FALSE);
-        eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapResp, FALSE);
-        eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapNoResp, FALSE);
-        wpa_printf (MSG_ERROR, "eap_proxy: Eap_proxy initialized successfully"
-                " tid is %d \n", gettid());
-        return;
-
-}
-
-int eap_auth_end_eap_session(qmi_client_type qmi_auth_svc_client_ptr)
-{
-        qmi_client_error_type qmiRetCode = 0;
-        auth_end_eap_session_resp_msg_v01 end_eap_session_resp_msg ;
-
-        wpa_printf(MSG_ERROR, "eap_proxy: eap_auth_end_eap_session: Ending EAP auth session");
-
-
-        /* Send QMI_AUTH_END_EAP_SESSION_REQ */
-
-        os_memset(&end_eap_session_resp_msg,
-                        0,
-                        sizeof(auth_end_eap_session_resp_msg_v01));
-
-        qmiRetCode = qmi_client_send_msg_sync(qmi_auth_svc_client_ptr,
-                                              QMI_AUTH_END_EAP_SESSION_REQ_V01,
-                                              NULL,
-                                              0,
-                                              (void *) &end_eap_session_resp_msg,
-                                              sizeof(auth_end_eap_session_resp_msg_v01),
-                                              WPA_UIM_QMI_DEFAULT_TIMEOUT);
-
-        if (QMI_NO_ERR != qmiRetCode ||
-            end_eap_session_resp_msg.resp.result != QMI_RESULT_SUCCESS_V01) {
-                wpa_printf(MSG_ERROR, "QMI-ERROR Unable to End the EAP session;"
-                                " error_ret=%d; qmi_err=%d\n", qmiRetCode,
-                                end_eap_session_resp_msg.resp.error);
-                return -1;
-        }
-
-        wpa_printf(MSG_ERROR, "eap_proxy: eap_auth_end_eap_session:"
-                " EAP auth session ended successfuly");
-
-        return 0;
-}
-
-static void eap_proxy_schedule_thread(void *eloop_ctx, void *timeout_ctx)
-{
-        struct eap_proxy_sm *eap_proxy = eloop_ctx;
-        int ret = -1;
-
-        ret = pthread_create(&eap_proxy->thread_id, NULL, eap_proxy_post_init, eap_proxy);
-        if(ret < 0)
-               wpa_printf(MSG_ERROR, "eap_proxy: starting thread is failed %d\n", ret);
-}
-
-struct eap_proxy_sm *
-eap_proxy_init(void *eapol_ctx, const struct eapol_callbacks *eapol_cb,
-               void *msg_ctx)
-{
-        int qmiErrorCode;
-        int qmiRetCode;
-        struct eap_proxy_sm *eap_proxy;
-        qmi_idl_service_object_type    qmi_client_service_obj;
-
-        wpa_printf(MSG_DEBUG, "eap_proxy: %s  "
-                 "wpa_qmi_ssr %d", __func__, wpa_qmi_ssr);
-        if(wpa_qmi_ssr) {
-                eap_proxy = eapol_ctx;
-        } else {
-                eap_proxy =  os_zalloc(sizeof(struct eap_proxy_sm));
-                if (NULL == eap_proxy) {
-                        wpa_printf(MSG_ERROR, "Error memory alloc  for eap_proxy"
-                                "eap_proxy_init\n");
-                        return NULL;
-                }
-                os_memset(eap_proxy, 0, sizeof(*eap_proxy));
-                eap_proxy->ctx = eapol_ctx;
-                eap_proxy->eapol_cb = eapol_cb;
-                eap_proxy->msg_ctx = msg_ctx;
-        }
-
-        eap_proxy->proxy_state = EAP_PROXY_DISABLED;
-
-        /* delay the qmi client initialization after the eloop_run starts,
-        * in order to avoid the case of daemonize enabled, which exits the
-        * parent process that created the qmi client context.
-        */
-
-        eloop_register_timeout(0, 0, eap_proxy_schedule_thread, eap_proxy, NULL);
-        return eap_proxy;
-}
-
-
-static void eap_proxy_qmi_deinit(struct eap_proxy_sm *eap_proxy)
-{
-        int qmiRetCode;
-        int qmiErrorCode;
-        int index;
-        wpa_uim_struct_type *wpa_uim = eap_proxy->wpa_uim;
-
-        if (NULL == eap_proxy)
-                return;
-        /* Waiting for eap_proxy_post_init to exit normally.
-         * The eap_proxy_post_init may wait for QMI responese.
-         * Force killing the thread will cause problem in QMI lib.
-         */
-        pthread_join(eap_proxy->thread_id, NULL);
-        eap_proxy->proxy_state = EAP_PROXY_DISABLED;
-
-        for (index = 0; index < MAX_NO_OF_SIM_SUPPORTED; ++index) {
-                if (TRUE == eap_proxy->eap_auth_session_flag[index]) {
-
-                        /* end the current EAP session */
-                        if(eap_auth_end_eap_session(eap_proxy->qmi_auth_svc_client_ptr[index]) < 0 ){
-                                wpa_printf(MSG_ERROR, "eap_proxy: Unable to end the EAP session for"
-                                                " client %d", index+1);
-                        } else {
-                                wpa_printf(MSG_ERROR, "eap_proxy: Ended the QMI EAP session for "
-                                                "client %d\n",
-                                                index+1);
-                                eap_proxy->eap_auth_session_flag[index] = FALSE;
-                        }
-                } else {
-                        wpa_printf (MSG_ERROR, "eap_proxy: session not started"
-                                " for client = %d\n", index+1);
-                }
-
-                if ((TRUE == eap_proxy->qmi_uim_svc_client_initialized[index]))  {
-                        qmiRetCode = qmi_client_release(wpa_uim[index].qmi_uim_svc_client_ptr);
-                        if (QMI_NO_ERR != qmiRetCode) {
-                                wpa_printf (MSG_ERROR, "eap_proxy: Unable to Releas the connection"
-                                                " to uim service for client=%d; error_ret=%d\n;",
-                                                index+1, qmiRetCode);
-                        }
-                        wpa_printf(MSG_ERROR, "eap_proxy: Released QMI UIM service client\n");
-                        eap_proxy->qmi_uim_svc_client_initialized[index] = FALSE;
-                }
-
-                if (NULL != eap_proxy->qmi_auth_svc_client_ptr[index]) {
-                        qmiRetCode = qmi_client_release(eap_proxy->qmi_auth_svc_client_ptr[index]);
-                        if (QMI_NO_ERR != qmiRetCode) {
-                                wpa_printf (MSG_ERROR, "eap_proxy: Unable to Releas the connection"
-                                                " to auth service for client=%d; error_ret=%d\n;",
-                                                index+1, qmiRetCode);
-                        }  else {
-                                wpa_printf(MSG_ERROR, "eap_proxy: Released QMI EAP service client\n");
-                        }
-                }
-
-        }
-
-        if (NULL != eap_proxy->key) {
-                os_free(eap_proxy->key);
-                eap_proxy->key = NULL;
-        }
-        if (eap_proxy->emsk) {
-                os_free(eap_proxy->emsk);
-                eap_proxy->emsk = NULL;
-        }
-        if (eap_proxy->session_id) {
-                os_free(eap_proxy->session_id);
-                eap_proxy->session_id = NULL;
-                eap_proxy->session_id_len = 0;
-        }
-
-        eap_proxy->iskey_valid = FALSE;
-        eap_proxy->is_state_changed = FALSE;
-        eap_proxy->user_selected_sim = 0;
-
-}
-
-void eap_proxy_deinit(struct eap_proxy_sm *eap_proxy)
-{
-        eap_proxy_qmi_deinit(eap_proxy);
-        if (eap_proxy != NULL) {
-            os_free(eap_proxy);
-            eap_proxy = NULL;
-            wpa_printf(MSG_INFO, "eap_proxy: eap_proxy Deinitialzed\n");
-        }
-}
-
-/* Call-back function to process an authentication result indication
-*  from QMI EAP service */
-static void handle_qmi_eap_ind(qmi_client_type user_handle,
-                               unsigned int msg_id,
-                               void* ind_buf,
-                               unsigned int ind_buf_len,
-                               void* ind_cb_data)
-{
-        qmi_client_error_type qmi_err;
-        auth_eap_session_result_ind_msg_v01 eap_session_result;
-        memset(&eap_session_result, 0, sizeof(auth_eap_session_result_ind_msg_v01));
-        eap_session_result.eap_result = -1;
-        struct eap_proxy_sm *sm = (struct eap_proxy_sm *)ind_cb_data;
-
-        auth_eap_notification_code_ind_msg_v01 eap_notification;
-        memset(&eap_notification, 0, sizeof(auth_eap_notification_code_ind_msg_v01));
-
-        wpa_printf(MSG_ERROR, "eap_proxy: Handle_qmi_eap_ind msgId =%d  sm=%p\n", msg_id,sm);
-        /* Decode */
-
-        switch(msg_id)
-        {
-                case QMI_AUTH_EAP_SESSION_RESULT_IND_V01:
-
-                        qmi_err = qmi_client_message_decode(user_handle, QMI_IDL_INDICATION,
-                                        msg_id, (void*)ind_buf, ind_buf_len,
-                                        &eap_session_result,
-                                        sizeof(auth_eap_session_result_ind_msg_v01));
-                        if (qmi_err != QMI_NO_ERR)
-                        {
-                                wpa_printf(MSG_ERROR, "eap_proxy: Error in qmi_client_message_de"
-                                        "code; error_code=%d \n", qmi_err);
-                                sm->srvc_result = EAP_PROXY_QMI_SRVC_FAILURE;
-                                return;
-                        }
-                        if ((eap_session_result.eap_result == 0) &&
-                            (QMI_STATE_RESP_TIME_OUT != sm->qmi_state)) {
-                                sm->proxy_state = EAP_PROXY_AUTH_SUCCESS;
-                                sm->qmi_state = QMI_STATE_RESP_RECEIVED;
-                                wpa_printf(MSG_ERROR, "eap_proxy: Handle_qmi_eap_ind EAP PROXY AUTH"
-                                        " SUCCESS %p set to %d\n",
-                                        (void *)&sm->qmi_state, sm->qmi_state);
-                        } else {
-                                sm->proxy_state = EAP_PROXY_AUTH_FAILURE;
-                                wpa_printf(MSG_ERROR, "eap_proxy: Handle_qmi_eap_ind EAP PROXY AUTH"
-                                        " FAILURE \n");
-                        }
-                        sm->srvc_result = EAP_PROXY_QMI_SRVC_SUCCESS;
-                        break;
-
-                case QMI_AUTH_EAP_NOTIFICATION_CODE_IND_V01:
-
-                        qmi_err = qmi_client_message_decode(user_handle, QMI_IDL_INDICATION,
-                                        msg_id, (void*)ind_buf, ind_buf_len,
-                                        &eap_notification,
-                                        sizeof(auth_eap_notification_code_ind_msg_v01));
-                        if (qmi_err != QMI_NO_ERR)
-                        {
-                                wpa_printf(MSG_ERROR, "eap_proxy: Error in qmi_client_"
-                                        "message_decode; error_code=%d \n", qmi_err);
-                        }
-                        sm->notification_code = eap_notification.eap_notification_code;
-                        wpa_printf(MSG_ERROR, "eap_proxy: notificatio code is %x\n",
-                                        eap_notification.eap_notification_code);
-                        break;
-
-                default:
-                        wpa_printf(MSG_ERROR, "eap_proxy: An unexpected msg Id=%d"
-                                        " is given\n", msg_id);
-                        break;
-        }
-
-
-}
-
-
-/* Call-back function to process an EAP response from QMI EAP service */
-static void handle_qmi_eap_reply(
-                qmi_client_type userHandle, unsigned int msg_id,
-                void *resp_c_struct, unsigned int resp_c_struct_len,
-                void *userData, qmi_client_error_type sysErrCode)
-{
-        struct eap_proxy_sm *eap_proxy = (struct eap_proxy_sm *)userData;
-        auth_send_eap_packet_resp_msg_v01* rspData =
-                (auth_send_eap_packet_resp_msg_v01*)resp_c_struct;
-
-        u8 *resp_data;
-        u32 length;
-
-        wpa_printf(MSG_ERROR, "eap_proxy: %s started\n", __func__);
-        if (eap_proxy == NULL) {
-                wpa_printf(MSG_ERROR, "eap_proxy: eap_proxy is NULL");
-                return;
-        }
-        if (QMI_STATE_RESP_PENDING == eap_proxy->qmi_state) {
-
-                wpa_printf(MSG_ERROR, "eap_proxy: user_selected_sim = %d\n",
-                           eap_proxy->user_selected_sim+1);
-
-
-                if (QMI_NO_ERR != sysErrCode) {
-                        wpa_printf(MSG_ERROR, "eap_proxy: An error is encountered with"
-                                        " the request: sysErrorCode=%d\n",
-                                        sysErrCode);
-                        eap_proxy->qmi_state = QMI_STATE_RESP_TIME_OUT;
-                        return;
-                }
-
-                if (NULL == rspData) {
-                        wpa_printf(MSG_ERROR, "eap_proxy: Response data is NULL\n");
-                        eap_proxy->qmi_state = QMI_STATE_RESP_TIME_OUT;
-                        return;
-                }
-                if((QMI_AUTH_SEND_EAP_PACKET_REQ_V01 != msg_id) &&
-                   (QMI_AUTH_SEND_EAP_PACKET_EXT_REQ_V01 != msg_id))
-                {
-                        wpa_printf(MSG_ERROR, "eap_proxy: Invalid msgId =%d\n", msg_id);
-                        eap_proxy->qmi_state = QMI_STATE_RESP_TIME_OUT;
-                        return;
-                }
-
-                /* ensure the reply packet exists  */
-                if (rspData->eap_response_pkt_len <= 0 ||
-                    rspData->eap_response_pkt_len > QMI_AUTH_EAP_RESP_PACKET_EXT_MAX_V01) {
-                        wpa_printf(MSG_ERROR, "eap_proxy: Reply packet is of invalid length %d"
-                                " error %d result %d\n", rspData->eap_response_pkt_len,
-                                rspData->resp.error, rspData->resp.result);
-                        eap_proxy->qmi_state = QMI_STATE_RESP_TIME_OUT;
-                        return;
-                }
-
-                length = rspData->eap_response_pkt_len;
-                eap_proxy->qmi_resp_data.eap_send_pkt_resp.length = length;
-                /* allocate a buffer to store the response data; size is EAP resp len field */
-                eap_proxy->qmi_resp_data.eap_send_pkt_resp.resp_data =
-                        os_malloc(rspData->eap_response_pkt_len);
-
-                resp_data =
-                        (u8 *)eap_proxy->qmi_resp_data.eap_send_pkt_resp.resp_data;
-
-                if (NULL == resp_data) {
-                        wpa_printf(MSG_ERROR, "eap_proxy: Unable to allocate memory for"
-                                        " reply packet\n");
-                        eap_proxy->qmi_state = QMI_STATE_RESP_TIME_OUT;
-
-                        return;
-                }
-
-                /* copy the response data to the allocated buffer */
-                os_memcpy(resp_data,
-                                rspData->eap_response_pkt, length);
-                eap_proxy->qmi_state = QMI_STATE_RESP_RECEIVED;
-                wpa_printf(MSG_ERROR, "eap_proxy: **HANDLE_QMI_EAP_REPLY CALLBACK ENDDED **");
-
-                wpa_printf(MSG_ERROR, "eap_proxy: Dump Resp Data len %d\n", length);
-                dump_buff(resp_data, length);
-        }
-
-        return;
-}
-
-static enum eap_proxy_status eap_proxy_process(struct eap_proxy_sm  *eap_proxy,
-                                        u8 *eapReqData, int eapReqDataLen, struct eap_sm *eap_sm)
-{
-        struct eap_hdr *hdr;
-        int qmiErrorCode;
-        enum eap_proxy_status proxy_status = EAP_PROXY_SUCCESS;
-        auth_send_eap_packet_req_msg_v01 eap_send_packet_req;
-        auth_send_eap_packet_resp_msg_v01 eap_send_packet_resp;
-        qmi_txn_handle async_txn_hdl = 0;
-
-        auth_send_eap_packet_ext_req_msg_v01 eap_send_packet_ext_req;
-        auth_send_eap_packet_ext_resp_msg_v01 eap_send_packet_ext_resp;
-
-
-        hdr = (struct eap_hdr *)eapReqData;
-        if ((EAP_CODE_REQUEST == hdr->code) &&
-            (EAP_TYPE_IDENTITY == eapReqData[4])) {
-                if (eap_proxy_eapol_sm_get_bool(eap_proxy, EAPOL_eapRestart) &&
-                    eap_proxy_eapol_sm_get_bool(eap_proxy, EAPOL_portEnabled)) {
-                        wpa_printf (MSG_ERROR, "eap_proxy: Already Authenticated."
-                                    " Clear all the flags");
-                        eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapSuccess, FALSE);
-                        eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapFail, FALSE);
-                        eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapResp, FALSE);
-                        eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapNoResp, FALSE);
-                        if (eap_proxy->key) {
-                                os_free(eap_proxy->key);
-                                eap_proxy->key = NULL;
-                        }
-                        if (eap_proxy->emsk) {
-                                os_free(eap_proxy->emsk);
-                                eap_proxy->emsk = NULL;
-                        }
-                        if (eap_proxy->session_id) {
-                                os_free(eap_proxy->session_id);
-                                eap_proxy->session_id = NULL;
-                                eap_proxy->session_id_len = 0;
-                        }
-                        eap_proxy->iskey_valid = FALSE;
-                        eap_proxy->is_state_changed = TRUE;
-                }
-                eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapRestart, FALSE);
-
-                if(eap_proxy_build_identity(eap_proxy, hdr->identifier, eap_sm)) {
-                        eap_proxy->proxy_state = EAP_PROXY_IDENTITY;
-                } else {
-                        wpa_printf(MSG_ERROR, "eap_proxy: Error in build identity\n");
-                        return EAP_PROXY_FAILURE;
-                }
-        }
-        wpa_printf(MSG_ERROR, "eap_proxy: ***********Dump ReqData len %d***********",
-                eapReqDataLen);
-        dump_buff(eapReqData, eapReqDataLen);
-        if (eapReqDataLen <= QMI_AUTH_EAP_REQ_PACKET_MAX_V01) {
-                os_memset(&eap_send_packet_req, 0, sizeof(auth_send_eap_packet_req_msg_v01));
-                os_memset(&eap_send_packet_resp, 0, sizeof(auth_send_eap_packet_resp_msg_v01));
-                eap_send_packet_req.eap_request_pkt_len = eapReqDataLen ;
-                memcpy(eap_send_packet_req.eap_request_pkt, eapReqData, eapReqDataLen);
-        } else if (eapReqDataLen <= QMI_AUTH_EAP_REQ_PACKET_EXT_MAX_V01) {
-                os_memset(&eap_send_packet_ext_req, 0,
-                        sizeof(auth_send_eap_packet_ext_req_msg_v01));
-                os_memset(&eap_send_packet_ext_resp, 0,
-                        sizeof(auth_send_eap_packet_ext_resp_msg_v01));
-                eap_send_packet_ext_req.eap_request_ext_pkt_len = eapReqDataLen;
-                memcpy(eap_send_packet_ext_req.eap_request_ext_pkt, eapReqData, eapReqDataLen);
-        } else {
-                        wpa_printf(MSG_ERROR, "eap_proxy: Error in eap_send_packet_req\n");
-                        return EAP_PROXY_FAILURE;
-        }
-
-        wpa_printf(MSG_ERROR, "eap_proxy: SIM selected by User: Selected sim = %d\n",
-                eap_proxy->user_selected_sim+1);
-        if (eap_proxy->qmi_state != QMI_STATE_IDLE) {
-                wpa_printf(MSG_ERROR, "Error in QMI state=%d\n",
-                                         eap_proxy->qmi_state);
-                return EAP_PROXY_FAILURE;
-        }
-
-        wpa_printf (MSG_ERROR, "eap_proxy: In eap_proxy_process case %d\n", hdr->code);
-        eap_proxy->qmi_state = QMI_STATE_RESP_PENDING;
-
-        if(eapReqDataLen <= QMI_AUTH_EAP_REQ_PACKET_MAX_V01) {
-                qmiErrorCode = qmi_client_send_msg_async(
-                                eap_proxy->qmi_auth_svc_client_ptr[eap_proxy->user_selected_sim],
-                                QMI_AUTH_SEND_EAP_PACKET_REQ_V01,
-                                (void *) &eap_send_packet_req,
-                                sizeof(auth_send_eap_packet_req_msg_v01),
-                                (void *) &eap_send_packet_resp,
-                                sizeof(auth_send_eap_packet_resp_msg_v01),
-                                &handle_qmi_eap_reply, eap_proxy,
-                                &async_txn_hdl);
-        } else if(eapReqDataLen <= QMI_AUTH_EAP_REQ_PACKET_EXT_MAX_V01) {
-                qmiErrorCode = qmi_client_send_msg_async(
-                                eap_proxy->qmi_auth_svc_client_ptr[eap_proxy->user_selected_sim],
-                                QMI_AUTH_SEND_EAP_PACKET_EXT_REQ_V01,
-                                (void *) &eap_send_packet_ext_req,
-                                sizeof(auth_send_eap_packet_ext_req_msg_v01),
-                                (void *) &eap_send_packet_ext_resp,
-                                sizeof(auth_send_eap_packet_ext_resp_msg_v01),
-                                &handle_qmi_eap_reply, eap_proxy,
-                                &async_txn_hdl);
-        }
-
-        if (QMI_NO_ERR != qmiErrorCode) {
-                wpa_printf(MSG_ERROR, "QMI-ERROR Error in sending EAP packet;"
-                                " error_code=%d\n", qmiErrorCode);
-                eap_proxy->proxy_state = EAP_PROXY_DISCARD;
-                eap_proxy_eapol_sm_set_bool(eap_proxy, EAPOL_eapNoResp, TRUE);
-                eap_proxy->qmi_state = QMI_STATE_RESP_PENDING;
-                return EAP_PROXY_FAILURE;
-        } else {
-                wpa_printf (MSG_ERROR, "eap_proxy: In eap_proxy_process case %d\n", hdr->code);
-                switch (hdr->code) {
-                case EAP_CODE_SUCCESS:
-                        if (EAP_PROXY_SUCCESS !=
-                                eap_proxy_qmi_response_wait(eap_proxy)) {
-                                eap_proxy->proxy_state = EAP_PROXY_DISCARD;
-                                eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                        EAPOL_eapNoResp, TRUE);
-                                return EAP_PROXY_FAILURE;
-                        } else if( eap_proxy->proxy_state == EAP_PROXY_AUTH_SUCCESS ) {
-                                eap_proxy_get_keys(eap_proxy);
-                                eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                 EAPOL_eapSuccess, TRUE);
-        /*
-         * RFC 4137 does not clear eapReq here, but this seems to be required
-         * to avoid processing the same request twice when state machine is
-         * initialized.
-         */
-                        eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                        EAPOL_eapReq, FALSE);
-
-        /*
-         * RFC 4137 does not set eapNoResp here, but this seems to be required
-         * to get EAPOL Supplicant backend state machine into SUCCESS state. In
-         * addition, either eapResp or eapNoResp is required to be set after
-         * processing the received EAP frame.
-         */
-                        eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                EAPOL_eapNoResp, TRUE);
-
-                        wpa_msg(eap_proxy->msg_ctx, MSG_INFO, WPA_EVENT_EAP_SUCCESS
-                                "eap_proxy: EAP authentication completed successfully");
-
-                        eap_proxy->is_state_changed = TRUE;
-
-                                /* Retrieve the keys  and store*/
-                        } else if( eap_proxy->proxy_state == EAP_PROXY_AUTH_FAILURE ){
-
-                                eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                EAPOL_eapFail, TRUE);
-                                eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                EAPOL_eapReq, FALSE);
-                                eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                EAPOL_eapNoResp, TRUE);
-                                eap_proxy->is_state_changed = TRUE;
-
-                        }
-
-                        break;
-
-                case EAP_CODE_FAILURE:
-                        wpa_printf (MSG_ERROR,
-                                "eap_proxy: in eap_proxy_process case EAP_CODE_FAILURE\n");
-                        eap_proxy->proxy_state = EAP_PROXY_AUTH_FAILURE;
-                        eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                EAPOL_eapFail, TRUE);
-
-        /*
-         * RFC 4137 does not clear eapReq here, but this seems to be required
-         * to avoid processing the same request twice when state machine is
-         * initialized.
-        */
-                        eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                EAPOL_eapReq, FALSE);
-
-        /*
-         * RFC 4137 does not set eapNoResp here. However, either eapResp or
-         * eapNoResp is required to be set after processing the received EAP
-         * frame.
-         */
-                        eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                EAPOL_eapNoResp, TRUE);
-
-                        wpa_msg(eap_proxy->msg_ctx, MSG_INFO, WPA_EVENT_EAP_FAILURE
-                                "EAP authentication failed notification code 0x%x",
-                                eap_proxy->notification_code);
-
-                        eap_proxy->is_state_changed = TRUE;
-                        break;
-
-                case EAP_CODE_REQUEST:
-                                        eap_proxy->proxy_state = EAP_PROXY_SEND_RESPONSE;
-                        if (EAP_PROXY_SUCCESS !=
-                                eap_proxy_qmi_response_wait(eap_proxy)) {
-                                eap_proxy->proxy_state = EAP_PROXY_DISCARD;
-                                eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                        EAPOL_eapNoResp, TRUE);
-                                return EAP_PROXY_FAILURE;
-                        } else {
-                                eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                        EAPOL_eapResp, TRUE);
-                                eap_proxy->proxy_state =
-                                                EAP_PROXY_SEND_RESPONSE;
-                        }
-
-                        eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                                EAPOL_eapReq, FALSE);
-                        eap_proxy->is_state_changed = TRUE;
-                        break;
-
-                default:
-                        wpa_printf(MSG_ERROR, "eap_proxy: Error in sending EAP packet;"
-                                         " error_code=%d\n", qmiErrorCode);
-                        eap_proxy->proxy_state = EAP_PROXY_DISCARD;
-                        eap_proxy_eapol_sm_set_bool(eap_proxy,
-                                EAPOL_eapNoResp, TRUE);
-                        return EAP_PROXY_FAILURE;
-                }
-        }
-
-        return EAP_PROXY_SUCCESS;
-}
-
-
-
-static u8 *eap_proxy_getKey(struct eap_proxy_sm *eap_proxy)
-{
-        int qmiErrorCode;
-        int qmiRetCode;
-
-        auth_get_eap_session_keys_resp_msg_v01 key_resp_msg;
-        os_memset(&key_resp_msg, 0, sizeof(auth_get_eap_session_keys_resp_msg_v01));
-
-        qmiRetCode = qmi_client_send_msg_sync(
-                        eap_proxy->qmi_auth_svc_client_ptr[eap_proxy->user_selected_sim],
-                        QMI_AUTH_GET_EAP_SESSION_KEYS_REQ_V01,
-                        NULL,
-                        0,
-                        (void *) &key_resp_msg,
-                        sizeof(auth_get_eap_session_keys_resp_msg_v01),
-                        WPA_UIM_QMI_DEFAULT_TIMEOUT);
-
-
-        /* see if the MSK is acquired successfully */
-        if (QMI_NO_ERR != qmiRetCode || key_resp_msg.resp.result != QMI_RESULT_SUCCESS_V01) {
-                wpa_printf(MSG_ERROR, "QMI-ERROR Unable to get session keys;"
-                                 " err_code=%d qmiErr=%d\n", qmiRetCode, key_resp_msg.resp.error);
-                eap_proxy->key = NULL;
-                return NULL;
-        }
-        wpa_printf(MSG_ERROR, "eap_proxy: %s:session_key_len =%d", __func__,
-                key_resp_msg.session_key_len);
-
-        if(key_resp_msg.session_key_len <=0 ||
-           key_resp_msg.session_key_len > EAP_PROXY_KEYING_DATA_LEN)
-        {
-                return NULL;
-
-        }
-        eap_proxy->key = os_malloc(EAP_PROXY_KEYING_DATA_LEN);
-        if(eap_proxy->key == NULL)
-                return NULL;
-
-        memset(eap_proxy->key, 0, EAP_PROXY_KEYING_DATA_LEN);
-        memcpy(eap_proxy->key, key_resp_msg.session_key, key_resp_msg.session_key_len);
-
-        eap_proxy->iskey_valid = TRUE;
-        eap_proxy->proxy_state = EAP_PROXY_AUTH_SUCCESS;
-
-        wpa_printf(MSG_ERROR, "eap_proxy: eap_proxy_getkey EAP KEYS ");
-        dump_buff(eap_proxy->key, EAP_PROXY_KEYING_DATA_LEN);
-
-        return eap_proxy->key;
-}
-
-static u8 * eap_proxy_get_keys(struct eap_proxy_sm *sm)
-{
-	int qmiRetCode;
-
-	auth_get_eap_auth_credentials_req_msg_v01 key_req_msg;
-	auth_get_eap_auth_credentials_resp_msg_v01 key_resp_msg;
-
-	os_memset(&key_req_msg, 0,
-		  sizeof(auth_get_eap_auth_credentials_req_msg_v01));
-	os_memset(&key_resp_msg, 0,
-		  sizeof(auth_get_eap_auth_credentials_resp_msg_v01));
-
-	key_req_msg.cred_request_mask = QMI_AUTH_MASK_EAP_CRED_MSK_V01 |
-					QMI_AUTH_MASK_EAP_CRED_EXT_MSK_V01 |
-					QMI_AUTH_MASK_EAP_CRED_SESSION_ID_V01;
-
-	qmiRetCode = qmi_client_send_msg_sync(
-			sm->qmi_auth_svc_client_ptr[sm->user_selected_sim],
-			QMI_AUTH_GET_EAP_AUTH_CREDENTIALS_REQ_V01,
-			&key_req_msg,
-			sizeof(auth_get_eap_auth_credentials_req_msg_v01),
-			&key_resp_msg,
-			sizeof(auth_get_eap_auth_credentials_resp_msg_v01),
-			WPA_UIM_QMI_DEFAULT_TIMEOUT);
-
-	/* see if the keys are acquired successfully */
-	if (QMI_NO_ERR != qmiRetCode ||
-	    key_resp_msg.resp.result != QMI_RESULT_SUCCESS_V01) {
-	        wpa_printf(MSG_ERROR,
-			   "QMI-ERROR Unable to get keys, err_code=%d qmiErr=%d "
-			   "Try using msg QMI_AUTH_GET_EAP_SESSION_KEYS_REQ_V01",
-			   qmiRetCode, key_resp_msg.resp.error);
-	        return eap_proxy_getKey(sm);
-	}
-
-	wpa_printf(MSG_DEBUG, "eap_proxy: qmi msk_valid:%d emsk_valid:%d session_id_valid:%d",
-		   key_resp_msg.msk_valid, key_resp_msg.ext_msk_valid,
-		   key_resp_msg.session_id_valid);
-
-	if (key_resp_msg.msk_valid && key_resp_msg.msk_len > 0 &&
-	    key_resp_msg.msk_len <= EAP_PROXY_KEYING_DATA_LEN) {
-		os_free(sm->key);
-		sm->key = os_zalloc(EAP_PROXY_KEYING_DATA_LEN);
-		if (sm->key != NULL) {
-			os_memcpy(sm->key, key_resp_msg.msk,
-				  key_resp_msg.msk_len);
-			sm->iskey_valid = TRUE;
-			sm->proxy_state = EAP_PROXY_AUTH_SUCCESS;
-			wpa_hexdump_key(MSG_DEBUG, "eap_proxy: session key",
-					sm->key, EAP_PROXY_KEYING_DATA_LEN);
-
-		}
-	}
-
-	if (key_resp_msg.ext_msk_valid && key_resp_msg.ext_msk_len > 0 &&
-	    key_resp_msg.ext_msk_len <= EAP_PROXY_KEYING_DATA_LEN) {
-		os_free(sm->emsk);
-		sm->emsk = os_zalloc(EAP_PROXY_KEYING_DATA_LEN);
-		if (sm->emsk != NULL) {
-			os_memcpy(sm->emsk, key_resp_msg.ext_msk,
-				  key_resp_msg.ext_msk_len);
-			wpa_hexdump_key(MSG_DEBUG, "eap_proxy: emsk", sm->emsk,
-					EAP_PROXY_KEYING_DATA_LEN);
-		}
-	}
-
-	if (key_resp_msg.session_id_valid) {
-		os_free(sm->session_id);
-		sm->session_id = os_zalloc(key_resp_msg.session_id_len);
-		if (sm->session_id != NULL) {
-			os_memcpy(sm->session_id, key_resp_msg.session_id,
-				  key_resp_msg.session_id_len);
-			sm->session_id_len = key_resp_msg.session_id_len;
-			wpa_hexdump_key(MSG_DEBUG, "eap_proxy: session_id",
-					sm->session_id, sm->session_id_len);
-		}
-	}
-
-	return sm->key;
-}
-
-/**
- * eap_key_available - Get key availability (eapKeyAvailable variable)
- * @sm: Pointer to EAP state machine allocated with eap_sm_init()
- * Returns: 1 if EAP keying material is available, 0 if not
- */
-int eap_proxy_key_available(struct eap_proxy_sm *sm)
-{
-        return sm ? sm->iskey_valid : 0;
-}
-
-
-static int eap_proxy_is_state_changed(struct eap_proxy_sm *sm)
-{
-        if (NULL == sm)
-                return 0;
-
-        if (TRUE == sm->is_state_changed) {
-                sm->is_state_changed = FALSE;
-                return 1;
-        } else {
-                return 0;
-        }
-}
-
-
-/**
- * eap_get_eapKeyData - Get master session key (MSK) from EAP state machine
- * @sm: Pointer to EAP state machine allocated with eap_sm_init()
- * @len: Pointer to variable that will be set to number of bytes in the key
- * Returns: Pointer to the EAP keying data or %NULL on failure
- *
- * Fetch EAP keying material (MSK, eapKeyData) from the EAP state machine. The
- * key is available only after a successful authentication. EAP state machine
- * continues to manage the key data and the caller must not change or free the
- * returned data.
- */
-const u8 * eap_proxy_get_eapKeyData(struct eap_proxy_sm *sm, size_t *len)
-{
-        if (sm == NULL || sm->key == NULL) {
-                *len = 0;
-                return NULL;
-        }
-
-        *len = EAP_PROXY_KEYING_DATA_LEN;
-        return sm->key;
-}
-
-
-u8 * eap_proxy_get_eap_session_id(struct eap_proxy_sm *sm, size_t *len)
-{
-	u8 *id;
-
-	*len = 0;
-	if (sm == NULL || sm->session_id == NULL)
-		return NULL;
-
-	id = os_malloc(sm->session_id_len);
-	if (id == NULL)
-		return NULL;
-
-	os_memcpy(id, sm->session_id, sm->session_id_len);
-	*len = sm->session_id_len;
-	return id;
-}
-
-
-u8 * eap_proxy_get_emsk(struct eap_proxy_sm *sm, size_t *len)
-{
-	u8 *emsk;
-
-	*len = 0;
-	if (sm == NULL || sm->emsk == NULL)
-		return NULL;
-
-	emsk = os_malloc(EAP_PROXY_KEYING_DATA_LEN);
-	if (emsk == NULL)
-		return NULL;
-
-	os_memcpy(emsk, sm->emsk, EAP_PROXY_KEYING_DATA_LEN);
-	*len = EAP_PROXY_KEYING_DATA_LEN;
-	return emsk;
-}
-
-
-void eap_proxy_sm_abort(struct eap_proxy_sm *sm)
-{
-	if (sm == NULL)
-		return;
-
-	if (sm->key) {
-		os_free(sm->key);
-		sm->key = NULL;
-	}
-
-	if (sm->emsk) {
-		os_free(sm->emsk);
-		sm->emsk = NULL;
-	}
-
-	if (sm->session_id) {
-		os_free(sm->session_id);
-		sm->session_id = NULL;
-		sm->session_id_len = 0;
-	}
-
-	sm->iskey_valid = FALSE;
-}
-
-
-/**
- * eap_proxy_get_eapRespData - Get EAP response data
- * @sm: Pointer to EAP state machine allocated with eap_sm_init()
- * @len: Pointer to variable that will be set to the length of the response
- * Returns: Pointer to the EAP response (eapRespData) or %NULL on failure
- *
- * Fetch EAP response (eapRespData) from the EAP state machine. This data is
- * available when EAP state machine has processed an incoming EAP request. The
- * EAP state machine does not maintain a reference to the response after this
- * function is called and the caller is responsible for freeing the data.
- */
-struct wpabuf * eap_proxy_get_eapRespData(struct eap_proxy_sm *eap_proxy)
-{
-        struct wpabuf *resp;
-        int len;
-        //int i;
-
-        wpa_printf(MSG_ERROR, "eap_proxy: eap_proxy_get_eapRespData");
-        if ( (eap_proxy == NULL) ||
-             (eap_proxy->qmi_resp_data.eap_send_pkt_resp.resp_data == NULL)
-           )
-        {
-                return NULL;
-        }
-
-        len = eap_proxy->qmi_resp_data.eap_send_pkt_resp.length;
-        wpa_printf(MSG_ERROR, "eap_proxy: eap_proxy_get_eapRespData len = %d", len);
-        resp = wpabuf_alloc(len);
-        if (resp == NULL) {
-                wpa_printf(MSG_ERROR, "eap_proxy: buf allocation failed\n");
-                return NULL;
-        }
-
-        resp->used = len;
-        os_memcpy(resp->buf, eap_proxy->qmi_resp_data.eap_send_pkt_resp.resp_data,
-                   len);
-        /*
-        for (i = 0; i < len; i++) {
-                wpa_printf (MSG_ERROR, "%c", resp->buf[i]);
-        }
-        */
-        os_free(eap_proxy->qmi_resp_data.eap_send_pkt_resp.resp_data);
-        eap_proxy->qmi_resp_data.eap_send_pkt_resp.resp_data = NULL;
-        eap_proxy->qmi_resp_data.eap_send_pkt_resp.length = 0;
-
-        return resp;
-}
-
-
-static enum eap_proxy_status eap_proxy_qmi_response_wait(struct eap_proxy_sm *eap_proxy)
-{
-
-        int count = 0;
-
-        wpa_printf(MSG_DEBUG, "eap_proxy_qmi_response_wait: Start blocking "
-                   "wait eap_proxy=%p",eap_proxy);
-        do {
-                count++;
-                if (count > QMI_RESP_TIME_OUT / 2) {
-                        wpa_printf(MSG_ERROR,
-                                   "eap_proxy: eap_proxy_qmi_response_wait "
-                                   "!QMI STATE %d TIME_OUT\n",
-                                   eap_proxy->qmi_state);
-                        eap_proxy->qmi_state = QMI_STATE_RESP_TIME_OUT;
-                        break;
-                }
-
-                os_sleep(0, 2000);
-
-                if ((QMI_STATE_RESP_RECEIVED == eap_proxy->qmi_state) ||
-                   (QMI_STATE_RESP_TIME_OUT == eap_proxy->qmi_state))
-                        break;
-        } while (1);
-
-        wpa_printf(MSG_DEBUG, "eap_proxy: eap_proxy_qmi_response_wait: Wait done after %d "
-                   "iterations: qmi_state=%d", count,
-                   eap_proxy->qmi_state);
-
-        if (QMI_STATE_RESP_TIME_OUT == eap_proxy->qmi_state) {
-                wpa_printf(MSG_ERROR, "eap_proxy: QMI state Response Time out\n");
-                eap_proxy->proxy_state = EAP_PROXY_DISCARD;
-                return EAP_PROXY_FAILURE;
-        }
-        eap_proxy->qmi_state = QMI_STATE_IDLE;
-
-        return EAP_PROXY_SUCCESS;
-}
-
-
-static void eap_proxy_eapol_sm_set_bool(struct eap_proxy_sm *sm,
-                        enum eapol_bool_var var, Boolean value)
-{
-        sm->eapol_cb->set_bool(sm->ctx, var, value);
-}
-
-
-static Boolean eap_proxy_eapol_sm_get_bool(struct eap_proxy_sm *sm,
-                         enum eapol_bool_var var)
-{
-        return  sm->eapol_cb->get_bool(sm->ctx, var);
-}
-
-
-int eap_proxy_sm_step(struct eap_proxy_sm *sm, struct eap_sm *eap_sm)
-{
-        if ((sm->proxy_state != EAP_PROXY_INITIALIZE) &&
-                                 (sm->proxy_state != EAP_PROXY_DISABLED)) {
-                if (TRUE == sm->isEap) {
-                        if(!eap_proxy_process(sm, sm->eapReqData,
-                                                 sm->eapReqDataLen,eap_sm)) {
-                                sm->proxy_state = EAP_PROXY_AUTH_FAILURE;
-                                eap_proxy_eapol_sm_set_bool(sm, EAPOL_eapRestart, TRUE);
-                        }
-                        sm->isEap = FALSE;
-                }
-        }
-        return eap_proxy_is_state_changed(sm);
-}
-
-
-enum eap_proxy_status
-eap_proxy_packet_update(struct eap_proxy_sm *eap_proxy, u8 *eapReqData,
-                        int eapReqDataLen)
-{
-        eap_proxy->eapReqData = eapReqData;
-        eap_proxy->eapReqDataLen = eapReqDataLen;
-        eap_proxy->isEap = TRUE;
-        return EAP_PROXY_SUCCESS;
-}
-
-
-static void dump_buff(u8 *buff, int len)
-{
-        wpa_printf(MSG_ERROR, "eap_proxy: ---- EAP Buffer----LEN %d",len);
-
-        while (len > 32) {
-                wpa_hexdump(MSG_DEBUG, "eap_proxy:", buff, 32);
-                buff += 32;
-                len -= 32;
-        }
-        wpa_hexdump(MSG_DEBUG, "eap_proxy: ", buff, len);
-}
-
-static char bin_to_hexchar(u8 ch)
-{
-        if (ch < 0x0a) {
-                return ch + '0';
-        }
-        return ch + 'a' - 10;
-}
-static Boolean eap_proxy_build_identity(struct eap_proxy_sm *eap_proxy, u8 id, struct eap_sm *eap_sm)
-{
-        struct eap_hdr *resp;
-        unsigned int len;
-        u8 identity_len = 0, ret;
-        u8 imsi_id_len = 0;
-        int mnc_len = -1;
-        u8 *pos;
-        int qmiRetCode;
-        u8 idx = 0, mcc_idx = 0;
-        unsigned char *identity = NULL;
-        unsigned char *imsi_identity = NULL;
-        auth_start_eap_session_req_msg_v01 eap_auth_start;
-        auth_start_eap_session_resp_msg_v01 eap_auth_start_resp;
-        auth_set_subscription_binding_req_msg_v01 sub_req_binding;
-        auth_set_subscription_binding_resp_msg_v01 sub_resp_binding;
-
-        struct eap_method_type *m;
-        eap_identity_format_e identity_format = EAP_IDENTITY_ANNONYMOUS;
-        Boolean simEnabled = FALSE, akaEnabled = FALSE;
-        struct eap_peer_config *config = eap_get_config(eap_sm);
-        const char *realm_3gpp = "@wlan.mnc000.mcc000.3gppnetwork.org";
-        int sim_num;
-
-        wpa_printf(MSG_ERROR, "eap_proxy: %s\n", __func__);
-        sim_num = config->sim_num - 1;
-        os_memset(&eap_auth_start, 0, sizeof(eap_auth_start));
-        os_memset(&eap_auth_start_resp, 0, sizeof(eap_auth_start_resp));
-
-        eap_auth_start.user_id_len = 0;
-        m = config->eap_methods;
-
-        if (sim_num >= MAX_NO_OF_SIM_SUPPORTED || sim_num < 0) {
-                wpa_printf (MSG_ERROR, "eap_proxy: Invalid SIM selected sim by user = %d\n",
-                             sim_num+1);
-                return FALSE;
-        }
-        wpa_printf(MSG_ERROR, "eap_proxy: User selected sim = %d\n", sim_num + 1);
-
-        if (m != NULL) {
-                for (idx = 0; m[idx].vendor != EAP_VENDOR_IETF ||
-                                m[idx].method != EAP_TYPE_NONE; idx++) {
-                        if (m[idx].method == EAP_TYPE_AKA) {
-                                akaEnabled = TRUE;
-                                eap_auth_start.eap_method_mask_valid = 1;
-                                eap_auth_start.eap_method_mask |= QMI_AUTH_EAP_METHOD_MASK_AKA_V01;
-                                wpa_printf(MSG_ERROR, "eap_proxy: AKA Enabled\n");
-                        } else if (m[idx].method == EAP_TYPE_SIM) {
-                                simEnabled = TRUE;
-                                eap_auth_start.eap_method_mask_valid = 1;
-                                eap_auth_start.eap_method_mask |= QMI_AUTH_EAP_METHOD_MASK_SIM_V01;
-                                wpa_printf(MSG_ERROR, "eap_proxy: SIM Enabled\n");
-#ifdef CONFIG_EAP_PROXY_AKA_PRIME
-                        } else if (m[idx].method == EAP_TYPE_AKA_PRIME) {
-                                eap_auth_start.eap_method_mask_valid = 1;
-                                eap_auth_start.eap_method_mask |=
-                                        QMI_AUTH_EAP_METHOD_MASK_AKA_PRIME_V01;
-                                wpa_printf(MSG_ERROR, "eap_proxy: AKA Prime Enabled\n");
-#endif /* CONFIG_EAP_PROXY_AKA_PRIME */
-                        }
-                }
-        } else {
-                wpa_printf(MSG_ERROR, "eap_proxy: eap_methods is NULL!\n");
-                return FALSE;
-        }
-
-        eap_auth_start.eap_method_mask_valid = 1;
-
-        idx = 0;
-#ifdef SIM_AKA_IMSI_RAW_ENABLED
-
-        identity_format = EAP_IDENTITY_IMSI_RAW;
-        eap_auth_start.user_id_valid = 1;
-        wpa_printf(MSG_ERROR, "eap_proxy: EAP_IDENTITY_IMSI_RAW selected %d \n",
-                eap_auth_start.user_id_len);
-
-#else /* SIM_AKA_IMSI_RAW_ENABLED */
-
-        if (config->identity_len && config->identity != NULL) {
-                for (idx = 0; idx < config->identity_len; idx++) {
-                        if (config->identity[idx] == 64) {
-                                wpa_printf(MSG_ERROR, "eap_proxy: @ found \n");
-                                mcc_idx = idx;
-                                if ((mcc_idx + 18) > config->identity_len)
-                                        mcc_idx = 0;
-                                else {
-                                        /* Looking for mnc and mcc pattern */
-                                        if (109 == config->identity[mcc_idx + 6] &&
-                                                (110 == config->identity[mcc_idx + 7]) &&
-                                                (99 == config->identity[mcc_idx + 8]) &&
-                                                (109 == config->identity[mcc_idx + 13]) &&
-                                                (99 == config->identity[mcc_idx + 14]) &&
-                                                (99 == config->identity[mcc_idx + 15])) {
-                                                mcc_idx += 9;
-                                        } else
-                                                mcc_idx = 0;
-                                }
-                                break;
-                        }
-                }
-
-                wpa_printf(MSG_ERROR, "eap_proxy: idx %d\n", idx);
-                wpa_printf(MSG_ERROR, "eap_proxy: mcc idx %d\n", mcc_idx);
-
-                if (!idx && (config->identity_len == 1)) {
-                        /* config file : @ */
-                        config->identity_len = 0;
-                        identity_format = EAP_IDENTITY_IMSI_3GPP_REALM;
-                        wpa_printf(MSG_ERROR, "eap_proxy: EAP_IDENTITY_IMSI_3GPP_REALM "
-                                "selected \n");
-                } else if (idx && (idx < config->identity_len) && (config->identity != NULL)) {
-
-                        /* config file : <>@<> or <>@<wlan.mnc000.mcc000.<>.<> */
-                        identity_len = config->identity_len;
-                        identity = os_malloc(config->identity_len);
-
-                        if (NULL != identity) {
-                                os_memset(identity, 0, config->identity_len);
-                                os_memcpy(identity, config->identity,
-                                                config->identity_len);
-                        }
-
-                        /* To Do for 3GPP realm */
-                        identity_format = EAP_IDENTITY_CFG_3GPP_REALM;
-                        eap_auth_start.user_id_valid = 1;
-                        wpa_printf(MSG_ERROR, "eap_proxy: EAP_IDENTITY_CFG_3GPP_REALM "
-                                "selected %d \n", eap_auth_start.user_id_len);
-
-                } else if ((idx == config->identity_len) && config->identity_len &&
-                                        (config->identity != NULL)) {
-
-                        /* config file : <identity in RAW format >*/
-                        identity_len = config->identity_len;
-                        identity = os_malloc(config->identity_len);
-
-                        if (NULL != identity) {
-                                os_memset(identity, 0, config->identity_len);
-                                os_memcpy(identity, config->identity,
-                                                config->identity_len);
-                        }
-
-                        identity_format = EAP_IDENTITY_CFG_RAW;
-                        eap_auth_start.user_id_valid = 1;
-                        wpa_printf(MSG_ERROR, "eap_proxy: EAP_IDENTITY_CFG_RAW selected %d \n",
-                                eap_auth_start.user_id_len);
-                } else if (!idx && mcc_idx) {
-
-                        /* config file: @wlan.mnc000.mcc000.<>.<> */
-                        identity_len = config->identity_len;
-                        identity = os_malloc(config->identity_len);
-
-                        if (NULL != identity) {
-                                os_memset(identity, 0, config->identity_len);
-                                os_memcpy(identity, config->identity,
-                                         config->identity_len);
-                        }
-
-                        identity_format = EAP_IDENTITY_IMSI_3GPP_REALM;
-                        eap_auth_start.user_id_valid = 1;
-                        wpa_printf(MSG_ERROR, "eap_proxy: config EAP_IDENTITY_IMSI_3GPP_REALM "
-                                "selected %d\n", eap_auth_start.user_id_len);
-                }
-        } else {
-
-                if (config->anonymous_identity_len && config->anonymous_identity != NULL) {
-
-                        eap_auth_start.eap_meta_identity_len = config->anonymous_identity_len;
-                        os_memcpy(&eap_auth_start.eap_meta_identity ,
-                                                config->anonymous_identity ,
-                                                config->anonymous_identity_len);
-
-                        identity_format = EAP_IDENTITY_ANNONYMOUS;
-                        eap_auth_start.eap_meta_identity_valid = 1;
-                        wpa_printf(MSG_ERROR, "eap_proxy: EAP_IDENTITY_ANNONYMOUS selected user id "
-                                "%d, annonymous %d\n", eap_auth_start.user_id_len,
-                                eap_auth_start.eap_meta_identity_len);
-                } else {
-                        /* config file doesn't contain any identity
-                                generating IMSI@realm */
-                        identity_format = EAP_IDENTITY_IMSI_3GPP_REALM;
-                        eap_auth_start.user_id_valid = 1;
-                        wpa_printf(MSG_ERROR, "eap_proxy: EAP_IDENTITY_IMSI_3GPP_REALM id len %d\n",
-                                eap_auth_start.user_id_len);
-                }
-        }
-#endif /* SIM_AKA_IMSI_RAW_ENABLED */
-        if (identity_format == EAP_IDENTITY_IMSI_3GPP_REALM ||
-                identity_format == EAP_IDENTITY_IMSI_RAW || mcc_idx) {
-
-                wpa_printf(MSG_ERROR, "eap_proxy: EAP_IDENTITY_IMSI_3GPP_REALM is selected\n");
-                if (!wpa_qmi_read_card_status(sim_num, eap_proxy->wpa_uim)) {
-                        wpa_printf(MSG_INFO, "eap_proxy: Read Card Status failed, return\n");
-                        if (NULL != identity) {
-                                os_free(identity);
-                                identity = NULL;
-                        }
-                        return FALSE;
-                }
-
-                if (!wpa_qmi_read_card_imsi(sim_num, eap_proxy->wpa_uim)) {
-                        wpa_printf(MSG_INFO, "eap_proxy: Read Card IMSI failed, return\n");
-                        if (NULL != identity) {
-                                os_free(identity);
-                                identity = NULL;
-                        }
-                        return FALSE;
-                }
-
-                if (imsi == NULL) {
-                        wpa_printf(MSG_INFO, "eap_proxy: IMSI not available, return\n");
-                        if (NULL != identity) {
-                                os_free(identity);
-                                identity = NULL;
-                        }
-                        return FALSE;
-                } else {
-                        wpa_printf(MSG_ERROR, "eap_proxy: IMSI not NULL \n");
-                        if (NULL == identity)
-                                wpa_printf(MSG_ERROR,
-                                        "eap_proxy: config file doesn't contain identity \n");
-                        else
-                                wpa_printf(MSG_ERROR, "eap_proxy: config file contains identity\n");
-
-                        wpa_printf(MSG_ERROR, "eap_proxy: eap_type: %d\n", eap_proxy->eap_type);
-
-                        if (!idx) {
-
-                                /* IMSI is expected as username */
-                                wpa_printf(MSG_ERROR, "eap_proxy:  username is not available in"
-                                        " config picking IMSI \n");
-
-                                if (config->identity_len > 1)
-                                        /* @realm provided in config */
-                                        imsi_identity =
-                                                os_malloc(1 + IMSI_LENGTH + config->identity_len);
-                                else if (identity_format == EAP_IDENTITY_IMSI_3GPP_REALM)
-                                        /* IMSI@realm not provided through config */
-                                        imsi_identity =
-                                                os_malloc(1 + IMSI_LENGTH + os_strlen(realm_3gpp));
-                                else
-                                        /* IMSI RAW */
-                                        imsi_identity = os_malloc(1 + IMSI_LENGTH);
-
-                                if (NULL == imsi_identity) {
-                                        wpa_printf(MSG_ERROR, "eap_proxy: Memory not available\n");
-                                        if (NULL != identity) {
-                                                os_free(identity);
-                                                identity = NULL;
-                                        }
-                                        return FALSE;
-                                } else {
-                                        if (config->identity_len > 1)
-                                                os_memset(imsi_identity, 0,
-                                                        (1 + IMSI_LENGTH + config->identity_len));
-                                        else if (identity_format == EAP_IDENTITY_IMSI_3GPP_REALM)
-                                                os_memset(imsi_identity, 0,
-                                                        (1 + IMSI_LENGTH + os_strlen(realm_3gpp)));
-                                        else
-                                                os_memset(imsi_identity, 0, (1 + IMSI_LENGTH));
-
-                                        if (eap_proxy->eap_type == EAP_TYPE_SIM)
-                                                imsi_identity[0] = '1';
-                                        else if (eap_proxy->eap_type == EAP_TYPE_AKA)
-                                                imsi_identity[0] = '0';
-#ifdef CONFIG_EAP_PROXY_AKA_PRIME
-                                        else if (eap_proxy->eap_type == EAP_TYPE_AKA_PRIME)
-                                                imsi_identity[0] = '6';
-#endif /* CONFIG_EAP_PROXY_AKA_PRIME */
-                                        else
-                                                /* Default value is set as SIM */
-                                                imsi_identity[0] = '1';
-
-                                        /* copying IMSI value */
-                                        os_memcpy(imsi_identity + 1 , imsi , imsi_len_g);
-
-                                        if (config->identity_len > 1 && NULL != identity) {
-                                                /* copying realm tag */
-                                                os_memcpy(imsi_identity + 1 + imsi_len_g , identity,
-                                                        config->identity_len);
-                                                imsi_id_len = imsi_len_g + 1 + config->identity_len;
-                                                os_free(identity);
-                                                identity = NULL;
-                                        } else if(identity_format == EAP_IDENTITY_IMSI_3GPP_REALM) {
-                                                /* realm is not available so append it */
-                                                os_memcpy(imsi_identity + 1 + imsi_len_g,
-                                                        realm_3gpp, os_strlen(realm_3gpp));
-                                                imsi_id_len = imsi_len_g + 1 +
-                                                        os_strlen(realm_3gpp);
-                                        } else
-                                                /* IMSI RAW */
-                                                imsi_id_len = imsi_len_g + 1;
-                                }
-                        } else if (identity) {
-                                /* idx is non-zero implies username available */
-                                imsi_identity = identity;
-                                imsi_id_len = config->identity_len;
-                        }
-                }
-
-                if (identity_format == EAP_IDENTITY_IMSI_3GPP_REALM || mcc_idx) {
-
-                        if (0 == idx) {
-                        /* id = @wlan.mnc000.mcc000.<>.<> realm exist
-                                but need to insert mnc and mcc values */
-                                idx = imsi_len_g + 1;
-                        }
-
-                        if (imsi_identity != NULL) {
-                                /* mcc valus */
-                                imsi_identity[idx + 16] = imsi[0];
-                                imsi_identity[idx + 17] = imsi[1];
-                                imsi_identity[idx + 18] = imsi[2];
-                        }
-
-                        /* mnc valus */
-                        mnc_len = card_mnc_len;
-                        wpa_printf(MSG_ERROR, "eap_proxy: card mnc len %d\n", card_mnc_len);
-
-                        if ((mnc_len == 2) && (imsi_identity != NULL)) {
-                                imsi_identity[idx + 9]  = '0';
-                                imsi_identity[idx + 10] = imsi[3];
-                                imsi_identity[idx + 11] = imsi[4];
-                        } else if ((mnc_len == 3) && (imsi_identity != NULL)) {
-                                imsi_identity[idx + 9]  = imsi[3];
-                                imsi_identity[idx + 10] = imsi[4];
-                                imsi_identity[idx + 11] = imsi[5];
-                        }
-                        wpa_printf(MSG_ERROR, "eap_proxy:  Appending 3gpp realm\n ");
-                }
-                identity = imsi_identity;
-                identity_len = imsi_id_len;
-                eap_auth_start.user_id_valid = 1;
-        }
-
-        eap_auth_start.user_id_len = identity_len;
-
-        if(identity_len >= QMI_AUTH_EAP_IDENTITY_MAX_CHAR_V01)
-        {
-                wpa_printf(MSG_ERROR, "eap_proxy: Invalid User Identity length =%d",identity_len);
-                return FALSE;
-        }
-
-        if(identity)
-        {
-                memcpy(&eap_auth_start.user_id, identity, identity_len);
-                eap_auth_start.user_id_valid = 1;
-        }
-
-        wpa_printf(MSG_ERROR, "eap_proxy: eap auth user identity  - %20s length-%d\n ",
-                    eap_auth_start.user_id, eap_auth_start.user_id_len);
-
-        if ( (sim_num < 0) || (sim_num >= MAX_NO_OF_SIM_SUPPORTED)) {
-                wpa_printf(MSG_ERROR, "eap_proxy: SIM: Invalid SIM selected by "
-                            "User: Selected sim = %d\n", sim_num+1);
-                return FALSE;
-        }
-
-
-        eap_proxy->user_selected_sim = sim_num;
-        wpa_printf(MSG_ERROR, "eap_proxy: SIM selected by User: Selected sim = %d\n",
-                    eap_proxy->user_selected_sim+1);
-
-        memset(&sub_req_binding, 0, sizeof(auth_set_subscription_binding_req_msg_v01));
-        memset(&sub_resp_binding, 0, sizeof(auth_set_subscription_binding_resp_msg_v01));
-#ifdef CONFIG_EAP_PROXY_DUAL_SIM
-        if (sim_num == 0) {
-                sub_req_binding.bind_subs = AUTH_PRIMARY_SUBS_V01;
-                qmiRetCode = qmi_client_send_msg_sync(eap_proxy->qmi_auth_svc_client_ptr[sim_num],
-                                QMI_AUTH_SET_SUBSCRIPTION_BINDING_REQ_V01,
-                                                (void *) &sub_req_binding,
-                                                sizeof(auth_set_subscription_binding_req_msg_v01),
-                                                (void *) &sub_resp_binding,
-                                                sizeof(auth_set_subscription_binding_resp_msg_v01),
-                                                WPA_UIM_QMI_DEFAULT_TIMEOUT);
-
-                if ((QMI_NO_ERR != qmiRetCode ||
-                     sub_resp_binding.resp.result != QMI_RESULT_SUCCESS_V01 ) &&
-                    (QMI_ERR_OP_DEVICE_UNSUPPORTED_V01 != sub_resp_binding.resp.error)) {
-                        wpa_printf(MSG_ERROR, "QMI-ERROR Unable to get the qmi_auth_set_subscriptio"
-                                "n_binding for sim 1; error_ret=%d; error_code=%d\n", qmiRetCode,
-                                sub_resp_binding.resp.error);
-                        return FALSE;
-                }
-                wpa_printf (MSG_ERROR, "eap_proxy: Binded with PRIMARY Subscription\n");
-        } else if (sim_num == 1) {
-                sub_req_binding.bind_subs = AUTH_SECONDARY_SUBS_V01;
-                qmiRetCode = qmi_client_send_msg_sync(eap_proxy->qmi_auth_svc_client_ptr[sim_num],
-                                QMI_AUTH_SET_SUBSCRIPTION_BINDING_REQ_V01,
-                                                (void *) &sub_req_binding,
-                                                sizeof(auth_set_subscription_binding_req_msg_v01),
-                                                (void *) &sub_resp_binding,
-                                                sizeof(auth_set_subscription_binding_resp_msg_v01),
-                                                WPA_UIM_QMI_DEFAULT_TIMEOUT);
-
-                if (QMI_NO_ERR != qmiRetCode ||
-                    sub_resp_binding.resp.result != QMI_RESULT_SUCCESS_V01 ) {
-                        wpa_printf(MSG_ERROR, "QMI-ERROR Unable to get the qmi_auth_set_subscriptio"
-                                "n_binding for sim 2; error_ret=%d; error_code=%d\n", qmiRetCode,
-                                sub_resp_binding.resp.error);
-                        return FALSE;
-                }
-
-                wpa_printf (MSG_ERROR, "eap_proxy: Binded with SECONDARY Subscription\n");
-        } else {
-                wpa_printf(MSG_ERROR, "eap_proxy: Invalid SIM selected by User: "
-                        "Selected sim = %d\n", sim_num+1);
-                return FALSE;
-        }
-#endif
-        if (TRUE == eap_proxy->eap_auth_session_flag[sim_num]) {
-                if(eap_auth_end_eap_session(eap_proxy->qmi_auth_svc_client_ptr[sim_num]) < 0) {
-                        wpa_printf(MSG_ERROR, "eap_proxy: Unable to end the EAP session;"
-                                                " sim_num%d;", sim_num);
-                        }
-                        eap_proxy->eap_auth_session_flag[sim_num] = FALSE;
-        }
-
-        if (FALSE == eap_proxy->eap_auth_session_flag[sim_num]) {
-                        wpa_printf(MSG_ERROR, "eap_proxy: eap_auth_start values\n");
-                        wpa_printf(MSG_ERROR, "eap_proxy: eap_auth_start.eap_method_mask = %d\n",
-                                eap_auth_start.eap_method_mask);
-                        wpa_printf(MSG_ERROR, "eap_proxy: eap_auth_start.user_id_len = %d\n",
-                                eap_auth_start.user_id_len);
-                        wpa_printf(MSG_ERROR, "eap_proxy: eap_auth_start.eap_meta_id_len = %d\n",
-                                eap_auth_start.eap_meta_identity_len);
-                        wpa_printf(MSG_ERROR, "eap_auth_start.eap_sim_aka_algo = %d\n",
-                                eap_auth_start.eap_sim_aka_algo);
-        qmiRetCode = qmi_client_send_msg_sync(eap_proxy->qmi_auth_svc_client_ptr[sim_num],
-                                                QMI_AUTH_START_EAP_SESSION_REQ_V01,
-                                                (void *) &eap_auth_start,
-                                                sizeof(auth_start_eap_session_req_msg_v01),
-                                                (void *) &eap_auth_start_resp,
-                                                sizeof(auth_start_eap_session_resp_msg_v01),
-                                                WPA_UIM_QMI_DEFAULT_TIMEOUT);
-        if (QMI_NO_ERR != qmiRetCode ||
-            eap_auth_start_resp.resp.result != QMI_RESULT_SUCCESS_V01) {
-                wpa_printf(MSG_ERROR, " QMI-ERROR Unable to start the EAP session;"
-                           " error_ret=%d; qmi_err=%d\n", qmiRetCode,
-                           eap_auth_start_resp.resp.error);
-                if(eap_auth_start.eap_method_mask == QMI_AUTH_EAP_METHOD_MASK_AKA_PRIME_V01 &&
-                   eap_auth_start_resp.resp.error == QMI_ERR_INVALID_ARG_V01)
-                        wpa_printf(MSG_ERROR, "QMI-ERROR AKA' not supported\n");
-
-                return FALSE;
-                }
-                eap_proxy->eap_auth_session_flag[sim_num] = TRUE;
-                eap_proxy->notification_code = 0;
-                eap_proxy->qmi_state = QMI_STATE_IDLE;
-                wpa_printf(MSG_ERROR, "eap_proxy: EAP session started"
-                           " error_ret=%d; Resp=%d\n", qmiRetCode,
-                            eap_auth_start_resp.resp.error);
-        }
-
-        return TRUE;
-}
-
-
-
-#ifdef CONFIG_CTRL_IFACE
-
-/**
- * eap_proxyl_sm_get_status - Get EAP state machine status
- * @sm: Pointer to EAP state machine allocated with eap_sm_init()
- * @buf: Buffer for status information
- * @buflen: Maximum buffer length
- * @verbose: Whether to include verbose status information
- * Returns: Number of bytes written to buf.
- *
- * Query EAP state machine for status information. This function fills in a
- * text area with current status information from the EAPOL state machine. If
- * the buffer (buf) is not large enough, status information will be truncated
- * to fit the buffer.
- */
-int eap_proxy_sm_get_status(struct eap_proxy_sm *sm, char *buf, size_t buflen,
-                            int verbose)
-{
-        int len, ret;
-
-        if (sm == NULL)
-                return 0;
-
-        len = os_snprintf(buf, buflen, "eap_proxy: EAP state=%s\n",
-                          eap_proxy_sm_state_txt(sm->proxy_state));
-        if (len < 0 || (size_t)len >= buflen)
-                return 0;
-
-        if (sm->eap_type != EAP_TYPE_NONE) {
-                char name[8];
-
-                if (sm->eap_type == EAP_TYPE_SIM)
-                        os_strlcpy(name, "SIM", 4);
-                else if (sm->eap_type == EAP_TYPE_AKA)
-                        os_strlcpy(name, "AKA", 4);
-                else if (sm->eap_type == EAP_TYPE_AKA_PRIME)
-                        os_strlcpy(name, "AKA'", 5);
-                else
-                        os_strlcpy(name, "Unknown", 8);
-
-                ret = os_snprintf(buf + len, buflen - len,
-                                "selectedMethod=%d (EAP-%s)\n",
-                                        sm->eap_type, name);
-                if (ret < 0 || (size_t)ret >= buflen - len)
-                        return len;
-                len += ret;
-        }
-
-        return len;
-}
-
-
-static const char *eap_proxy_sm_state_txt(int state)
-{
-        switch (state) {
-        case EAP_PROXY_INITIALIZE:
-                return "INITIALIZE";
-        case EAP_PROXY_DISABLED:
-                return "DISABLED";
-        case EAP_PROXY_IDLE:
-                return "IDLE";
-        case EAP_PROXY_RECEIVED:
-                return "RECEIVED";
-        case EAP_PROXY_GET_METHOD:
-                return "GET_METHOD";
-        case EAP_PROXY_METHOD:
-                return "METHOD";
-        case EAP_PROXY_SEND_RESPONSE:
-                return "SEND_RESPONSE";
-        case EAP_PROXY_DISCARD:
-                return "DISCARD";
-        case EAP_PROXY_IDENTITY:
-                return "IDENTITY";
-        case EAP_PROXY_NOTIFICATION:
-                return "NOTIFICATION";
-        case EAP_PROXY_RETRANSMIT:
-                return "RETRANSMIT";
-        case EAP_PROXY_AUTH_SUCCESS:
-                return "SUCCESS";
-        case EAP_PROXY_AUTH_FAILURE:
-                return "FAILURE";
-        default:
-                return "UNKNOWN";
-        }
-}
-#endif /* CONFIG_CTRL_IFACE */
-
-
-/**
- * eap_proxy_get_imsi - Get IMSI
- * @config_sim_num: sim number for the configuration, -1 if not specified
- * @imsi_buf: Buffer for returning IMSI
- * @imsi_len: Buffer for returning IMSI length
- * Returns: MNC length (2 or 3) or -1 on error
- */
-int eap_proxy_get_imsi(struct eap_proxy_sm *eap_proxy, int config_sim_num,
-		       char *imsi_buf, size_t *imsi_len)
-{
-#ifdef SIM_AKA_IDENTITY_IMSI
-	int mnc_len;
-	int sim_num;
-
-	if (config_sim_num > 0) {
-		sim_num = config_sim_num - 1;
-		if (sim_num >= MAX_NO_OF_SIM_SUPPORTED) {
-			wpa_printf(MSG_ERROR,
-				   "eap_proxy: Invalid user sim %d selected",
-				   config_sim_num);
-			return -1;
-		}
-	} else {
-		sim_num = eap_proxy->user_selected_sim;
-	}
-
-	if ((eap_proxy->proxy_state == EAP_PROXY_DISABLED) ||
-	    (eap_proxy->proxy_state == EAP_PROXY_INITIALIZE)) {
-		wpa_printf(MSG_ERROR,
-			   "eap_proxy:%s: Not initialized", __func__);
-		return -1;
-	}
-
-	if (!wpa_qmi_read_card_status(sim_num, eap_proxy->wpa_uim)) {
-		wpa_printf(MSG_INFO, "eap_proxy: Card not ready");
-		return -1;
-	}
-
-	if (!wpa_qmi_read_card_imsi(sim_num, eap_proxy->wpa_uim) ||
-	    imsi == NULL) {
-		wpa_printf(MSG_INFO, "eap_proxy: Failed to read card IMSI");
-		return -1;
-	}
-
-	*imsi_len = os_strlen(imsi);
-	os_memcpy(imsi_buf, imsi, *imsi_len + 1);
-
-	mnc_len = card_mnc_len;
-	if (mnc_len < 2 || mnc_len > 3)
-		mnc_len = 3; /* Default to 3 if MNC length is unknown */
-
-	os_free(imsi);
-	imsi = NULL;
-
-	return mnc_len;
-#else /* SIM_AKA_IDENTITY_IMSI */
-	return -1;
-#endif /* SIM_AKA_IDENTITY_IMSI */
-}
-
-int eap_proxy_notify_config(struct eap_proxy_sm *eap_proxy,
-                            struct eap_peer_config *config)
-{
-        int ret_val;
-
-        wpa_printf(MSG_ERROR, "eap_proxy: eap_proxy_notify_config\n");
-        if (!eap_proxy) {
-                wpa_printf(MSG_ERROR, "eap_proxy: is NULL");
-                return FALSE;
-        }
-
-        if ((eap_proxy->proxy_state == EAP_PROXY_DISABLED) ||
-            (eap_proxy->proxy_state == EAP_PROXY_INITIALIZE)) {
-                wpa_printf(MSG_ERROR, "eap_proxy: Not initialized\n");
-                return FALSE;
-        }
-
-        if ( config && eap_proxy_allowed_method(config, EAP_VENDOR_IETF,
-                        EAP_TYPE_SIM)) {
-                eap_proxy->eap_type =  EAP_TYPE_SIM;
-                ret_val = TRUE;
-        } else if ( config && eap_proxy_allowed_method(config, EAP_VENDOR_IETF,
-                                EAP_TYPE_AKA)) {
-                eap_proxy->eap_type =  EAP_TYPE_AKA;
-                ret_val = TRUE;
-        } else if ( config && eap_proxy_allowed_method(config, EAP_VENDOR_IETF,
-                                EAP_TYPE_AKA_PRIME)) {
-                eap_proxy->eap_type =  EAP_TYPE_AKA_PRIME;
-                ret_val = TRUE;
-        } else
-                ret_val = FALSE;
-
-        return ret_val;
-}
-
-int eap_proxy_allowed_method(struct eap_peer_config *config, int vendor,
-                              u32 method)
-{
-        int i;
-        struct eap_method_type *m;
-
-        wpa_printf(MSG_ERROR, "eap_proxy: eap_proxy_allowed_method");
-        if (config == NULL || config->eap_methods == NULL)
-                return -1;
-
-        m = config->eap_methods;
-        for (i = 0; m[i].vendor != EAP_VENDOR_IETF ||
-                     m[i].method != EAP_TYPE_NONE; i++) {
-                if (m[i].vendor == vendor && m[i].method == method)
-                        return 1;
-        }
-        return 0;
-}
-
-#endif  /* CONFIG_EAP_PROXY */
diff --git a/src/eap_peer/eap_proxy_qmi.h b/src/eap_peer/eap_proxy_qmi.h
deleted file mode 100644
index 43fb962..0000000
--- a/src/eap_peer/eap_proxy_qmi.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*--------------------------------------------------------------------------
-Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of The Linux Foundation nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------*/
-
-#ifndef EAP_PROXY_QMI_H
-#define EAP_PROXY_QMI_H
-
-
-#include "eap_i.h"
-#include "eap_config.h"
-#include "eloop.h"
-#include "eapol_supp/eapol_supp_sm.h"
-#include "user_identity_module_v01.h"
-
-/*msec Response Timeout*/
-#define QMI_RESP_TIME_OUT 2000
-#define EAP_PROXY_KEYING_DATA_LEN 64
-
-#ifdef CONFIG_EAP_PROXY_DUAL_SIM
-#define MAX_NO_OF_SIM_SUPPORTED 2
-#else
-#define MAX_NO_OF_SIM_SUPPORTED 1
-#endif /* CONFIG_EAP_PROXY_DUAL_SIM */
-
-typedef enum {
-        QMI_STATE_IDLE = 0x00,
-        QMI_STATE_RESP_PENDING  = 0x01,
-        QMI_STATE_RESP_RECEIVED = 0x02,
-        QMI_STATE_RESP_TIME_OUT = 0x03
-} qmi_state_e;
-
-typedef enum {
-        EAP_PROXY_QMI_SRVC_NO_RESULT,
-        EAP_PROXY_QMI_SRVC_SUCCESS,
-        EAP_PROXY_QMI_SRVC_FAILURE
-} eap_proxy_qmi_srv_result;
-
-/* should match the EAP_state  of eap_i.h */
-typedef enum {
-        EAP_PROXY_INITIALIZE, EAP_PROXY_DISABLED, EAP_PROXY_IDLE, EAP_PROXY_RECEIVED,
-        EAP_PROXY_GET_METHOD, EAP_PROXY_METHOD, EAP_PROXY_SEND_RESPONSE,
-        EAP_PROXY_DISCARD, EAP_PROXY_IDENTITY, EAP_PROXY_NOTIFICATION,
-        EAP_PROXY_RETRANSMIT,
-        EAP_PROXY_AUTH_SUCCESS,  EAP_PROXY_AUTH_FAILURE
-} eap_proxy_state;
-
-
-enum eap_proxy_status {
-        EAP_PROXY_FAILURE = 0x00,
-        EAP_PROXY_SUCCESS
-};
-
-typedef enum {
-        EAP_IDENTITY_ANNONYMOUS = 0x00,
-        EAP_IDENTITY_IMSI_RAW  = 0x02,
-        EAP_IDENTITY_IMSI_3GPP_REALM = 0x03,
-        EAP_IDENTITY_IMSI_REALM = 0x04,
-        EAP_IDENTITY_CFG_RAW = 0x05,
-        EAP_IDENTITY_CFG_3GPP_REALM = 0x06,
-        EAP_IDENTITY_CFG_REALM = 0x07,
-} eap_identity_format_e;
-
-typedef union
-{
-        struct
-        {
-                void *resp_data; /* Pointer to the Response Packet*/
-                unsigned long length;     /*Length of the Response Packet*/
-        }eap_send_pkt_resp;
-
-}qmi_eap_sync_rsp_data_type;
-
-typedef struct {
-        uim_card_state_enum_v01                      card_state;
-        uim_card_error_code_enum_v01                 card_error_code;
-        u8                                           app_state;
-        u8                                           app_type;
-} wpa_uim_card_info_type;
-
-typedef struct {
-        int                                   card_ready_idx;
-        wpa_uim_card_info_type                card_info[QMI_UIM_CARDS_MAX_V01];
-        qmi_client_type                       qmi_uim_svc_client_ptr;
-        int                                   qmi_msg_lib_handle;
-} wpa_uim_struct_type;
-
-
-struct eap_proxy_sm {
-        qmi_client_type qmi_auth_svc_client_ptr[MAX_NO_OF_SIM_SUPPORTED];
-        qmi_state_e qmi_state;
-        eap_proxy_qmi_srv_result srvc_result;
-        qmi_eap_sync_rsp_data_type qmi_resp_data;
-        eap_proxy_state  proxy_state;
-        Boolean iskey_valid;
-        u8 *key;
-        Boolean is_state_changed;
-        void *ctx;
-        void *msg_ctx;
-        struct eapol_callbacks *eapol_cb;
-        u8 *eapReqData;
-        size_t eapReqDataLen;
-        Boolean isEap;
-        int eap_type;
-        int user_selected_sim;
-        int eap_auth_session_flag[MAX_NO_OF_SIM_SUPPORTED];
-        int notification_code;
-        pthread_t thread_id;
-        wpa_uim_struct_type   wpa_uim[MAX_NO_OF_SIM_SUPPORTED];
-        Boolean qmi_uim_svc_client_initialized[MAX_NO_OF_SIM_SUPPORTED];
-        Boolean qmi_ssr_in_progress;
-        u8 *session_id;
-        size_t session_id_len;
-        u8 *emsk;
-};
-
-int eap_proxy_allowed_method(struct eap_peer_config *config, int vendor,
-                              u32 method);
-
-#endif /* EAP_PROXY_QMI_H */
diff --git a/wpa_supplicant/eap_proxy_qmi.mak b/wpa_supplicant/eap_proxy_qmi.mak
deleted file mode 100644
index 0a046f6..0000000
--- a/wpa_supplicant/eap_proxy_qmi.mak
+++ /dev/null
@@ -1,19 +0,0 @@
-CFLAGS += -DSIM_AKA_IDENTITY_IMSI
-CFLAGS += -DSIM_AKA_IMSI_RAW_ENABLED
-
-CFLAGS += $(shell $(PKG_CONFIG) --cflags qmi qmi-framework)
-
-LIBS += $(shell $(PKG_CONFIG) --libs qmi qmi-framework) -lpthread
-
-# EAP-AKA' (enable CONFIG_PCSC, if EAP-AKA' is used).
-# This requires CONFIG_EAP_AKA to be enabled, too.
-# This is supported only in B Family devices.
-CONFIG_EAP_AKA_PRIME=y
-
-ifdef CONFIG_EAP_PROXY_AKA_PRIME
-CFLAGS += -DCONFIG_EAP_PROXY_AKA_PRIME
-endif
-
-ifdef CONFIG_EAP_PROXY_DUAL_SIM
-CFLAGS += -DCONFIG_EAP_PROXY_DUAL_SIM
-endif
diff --git a/wpa_supplicant/eap_proxy_qmi.mk b/wpa_supplicant/eap_proxy_qmi.mk
deleted file mode 100644
index 535be77..0000000
--- a/wpa_supplicant/eap_proxy_qmi.mk
+++ /dev/null
@@ -1,37 +0,0 @@
-
-LOCAL_PATH := $(call my-dir)
-
-ifeq ($(BOARD_HAS_QCOM_WLAN), true)
-L_CFLAGS += -DSIM_AKA_IDENTITY_IMSI
-#L_CFLAGS += -DSIM_AKA_IMSI_RAW_ENABLED
-
-ifdef CONFIG_EAP_PROXY_DUAL_SIM
-L_CFLAGS += -DCONFIG_EAP_PROXY_DUAL_SIM
-endif
-
-LIB_SHARED_EAP_PROXY := libqmi_cci libqmiservices libidl
-INCLUDES += $(TARGET_OUT_HEADERS)/qmi-framework/inc
-INCLUDES += $(TARGET_OUT_HEADERS)/qmi/inc
-INCLUDES += $(TARGET_OUT_HEADERS)/qmi/platform
-INCLUDES += $(TARGET_OUT_HEADERS)/qmi/core/lib/inc
-
-ifdef CONFIG_EAP_PROXY_MDM_DETECT
-L_CFLAGS += -DCONFIG_EAP_PROXY_MDM_DETECT
-INCLUDES += $(TARGET_OUT_HEADERS)/libmdmdetect/inc
-LIB_SHARED_EAP_PROXY += libmdmdetect
-endif
-
-# EAP-AKA' (enable CONFIG_PCSC, if EAP-AKA' is used).
-# This requires CONFIG_EAP_AKA to be enabled, too.
-# This is supported only in B Family devices.
-ifdef CONFIG_EAP_PROXY_AKA_PRIME
-L_CFLAGS += -DCONFIG_EAP_PROXY_AKA_PRIME
-endif
-
-ifdef CONFIG_EAP_PROXY_MSM8994_TARGET
-L_CFLAGS += -DCONFIG_EAP_PROXY_MSM8994_TARGET
-endif
-
-#ANDROID_SETGROUPS_OVERRIDE := AID_RADIO AID_WIFI AID_KEYSTORE AID_DIAG AID_INET AID_QCOM_DIAG AID_NET_RAW AID_LOG
-L_CFLAGS += -DANDROID_SETGROUPS_OVERRIDE=1001,1010,1017,2002,1003,3009,3004,1007
-endif
diff --git a/wpa_supplicant/hidl/1.1/supplicant.cpp b/wpa_supplicant/hidl/1.1/supplicant.cpp
index 7631eac..4785c37 100644
--- a/wpa_supplicant/hidl/1.1/supplicant.cpp
+++ b/wpa_supplicant/hidl/1.1/supplicant.cpp
@@ -62,7 +62,7 @@
 /**
  * Copy |src_file_path| to |dest_file_path| if it exists.
  *
- * Returns 1 if |src_file_path| does not exists,
+ * Returns 1 if |src_file_path| does not exist or not accessible,
  * Returns -1 if the copy fails.
  * Returns 0 if the copy succeeds.
  */
@@ -70,7 +70,8 @@
     const std::string& src_file_path, const std::string& dest_file_path)
 {
 	int ret = access(src_file_path.c_str(), R_OK);
-	if ((ret != 0) && (errno == ENOENT)) {
+	// Sepolicy denial (2018+ device) will return EACCESS instead of ENOENT.
+	if ((ret != 0) && ((errno == ENOENT) || (errno == EACCES))) {
 		return 1;
 	}
 	ret = copyFile(src_file_path, dest_file_path);
