aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBala Krishna Bhamidipati <bbhami@codeaurora.org>2016-02-03 15:21:34 +0530
committerBala Krishna Bhamidipati <bbhami@codeaurora.org>2016-02-09 19:31:20 +0530
commitbc75a42a4f6d2eb5760360736e66b9b64da30421 (patch)
treef4ee9a4f26da68d0f39d67bd6883290999c1c562 /src
parentd2ce014bfc8f7100b5872aebafd0142689df23d3 (diff)
downloadandroid_external_wpa_supplicant_8-bc75a42a4f6d2eb5760360736e66b9b64da30421.tar.gz
android_external_wpa_supplicant_8-bc75a42a4f6d2eb5760360736e66b9b64da30421.tar.bz2
android_external_wpa_supplicant_8-bc75a42a4f6d2eb5760360736e66b9b64da30421.zip
eap_proxy: use a separate thread for qmi initialization.
QMI initialization , if done in eloop context , affects supplicant functionality. Since this QMI initialization takes more time , a separate thread is spawned for the same Change-Id: Id877ad8da5c73cabfef3bf4f4a2cd2a776ddd443 CRs-Fixed: 971522
Diffstat (limited to 'src')
-rw-r--r--src/eap_peer/eap_proxy_qmi.c46
-rw-r--r--src/eap_peer/eap_proxy_qmi.h1
2 files changed, 40 insertions, 7 deletions
diff --git a/src/eap_peer/eap_proxy_qmi.c b/src/eap_peer/eap_proxy_qmi.c
index 3850bb61..6f04acae 100644
--- a/src/eap_peer/eap_proxy_qmi.c
+++ b/src/eap_peer/eap_proxy_qmi.c
@@ -48,6 +48,7 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <sys/system_properties.h>
#endif
#endif
+#include <pthread.h>
#define IMSI_LENGTH 15
#define WPA_UIM_QMI_EVENT_MASK_CARD_STATUS \
@@ -550,18 +551,22 @@ static int eap_modem_compatible(struct dev_info *mdm_detect_info)
}
#endif /* CONFIG_EAP_PROXY_MDM_DETECT */
+static void exit_proxy_init(int signum)
+{
+ pthread_exit(NULL);
+}
-static void eap_proxy_post_init(void *eloop_ctx, void *timeout_ctx)
+static void eap_proxy_post_init(struct eap_proxy_sm *eap_proxy)
{
int qmiErrorCode;
int qmiRetCode;
- struct eap_proxy_sm *eap_proxy = eloop_ctx;
qmi_idl_service_object_type qmi_client_service_obj[MAX_NO_OF_SIM_SUPPORTED];
int index;
static Boolean flag = FALSE;
+ struct sigaction actions;
+ int ret = 0;
#ifdef CONFIG_EAP_PROXY_MDM_DETECT
struct dev_info mdm_detect_info;
- int ret = 0;
/* Call ESOC API to get the number of modems.
* If the number of modems is not zero, only then proceed
@@ -572,6 +577,7 @@ static void eap_proxy_post_init(void *eloop_ctx, void *timeout_ctx)
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 NULL;
@@ -579,11 +585,18 @@ static void eap_proxy_post_init(void *eloop_ctx, void *timeout_ctx)
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 NULL;
}
#endif /* CONFIG_EAP_PROXY_MDM_DETECT */
+ sigemptyset(&actions.sa_mask);
+ actions.sa_flags = 0;
+ actions.sa_handler = exit_proxy_init;
+ ret = sigaction(SIGUSR1,&actions,NULL);
+ if(ret < 0)
+ wpa_printf(MSG_DEBUG, "sigaction\n");
eap_proxy->proxy_state = EAP_PROXY_INITIALIZE;
eap_proxy->qmi_state = QMI_STATE_IDLE;
eap_proxy->key = NULL;
@@ -661,9 +674,8 @@ static void eap_proxy_post_init(void *eloop_ctx, void *timeout_ctx)
}
if ( flag == FALSE ) {
+ eap_proxy->proxy_state = EAP_PROXY_DISABLED;
wpa_printf(MSG_ERROR, "eap_proxy: flag = %d proxy init failed\n", flag);
- os_free(eap_proxy);
- eap_proxy = NULL;
return NULL;
}
@@ -677,6 +689,7 @@ static void eap_proxy_post_init(void *eloop_ctx, void *timeout_ctx)
wpa_printf (MSG_DEBUG,
"eap_proxy: %s: eap_proxy_init_counter %d\n", __func__, eap_proxy_init_counter);
wpa_printf (MSG_ERROR, "eap_proxy: Eap_proxy initialized successfully\n");
+ return NULL;
}
@@ -723,6 +736,8 @@ eap_proxy_init(void *eapol_ctx, struct eapol_callbacks *eapol_cb,
int qmiRetCode;
struct eap_proxy_sm *eap_proxy;
qmi_idl_service_object_type qmi_client_service_obj;
+ pthread_attr_t attr;
+ int ret = -1;
eap_proxy = os_malloc(sizeof(struct eap_proxy_sm));
if (NULL == eap_proxy) {
@@ -747,7 +762,12 @@ eap_proxy_init(void *eapol_ctx, struct eapol_callbacks *eapol_cb,
* 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_post_init, eap_proxy, NULL);
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ ret = pthread_create(&eap_proxy->thread_id, &attr, eap_proxy_post_init, eap_proxy);
+ if(ret < 0)
+ wpa_printf(MSG_ERROR, "eap_proxy: starting thread is failed %d\n", ret);
return eap_proxy;
}
@@ -762,6 +782,7 @@ void eap_proxy_deinit(struct eap_proxy_sm *eap_proxy)
if (NULL == eap_proxy)
return;
+ pthread_kill(eap_proxy->thread_id, SIGUSR1);
eap_proxy_init_counter--;
wpa_printf (MSG_DEBUG,
"eap_proxy: %s: eap_proxy_init_counter %d\n", __func__, eap_proxy_init_counter);
@@ -1918,6 +1939,11 @@ int eap_proxy_get_imsi(struct eap_proxy_sm *eap_proxy, char *imsi_buf,
int mnc_len;
int 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\n", __func__);
+ return FALSE;
+ }
if (!wpa_qmi_read_card_status(sim_num)) {
wpa_printf(MSG_INFO, "eap_proxy: Card not ready");
return -1;
@@ -1952,7 +1978,13 @@ int eap_proxy_notify_config(struct eap_proxy_sm *eap_proxy,
wpa_printf(MSG_ERROR, "eap_proxy: eap_proxy_notify_config\n");
if (!eap_proxy) {
wpa_printf(MSG_ERROR, "eap_proxy: is NULL");
- return -1;
+ 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,
diff --git a/src/eap_peer/eap_proxy_qmi.h b/src/eap_peer/eap_proxy_qmi.h
index 0be4fb57..d855ee6e 100644
--- a/src/eap_peer/eap_proxy_qmi.h
+++ b/src/eap_peer/eap_proxy_qmi.h
@@ -113,6 +113,7 @@ struct eap_proxy_sm {
int eap_type;
int user_selected_sim;
int eap_auth_session_flag[MAX_NO_OF_SIM_SUPPORTED];
+ pthread_t thread_id;
};
int eap_proxy_allowed_method(struct eap_peer_config *config, int vendor,