From 0d2faeadd4798eea1ed97d7f92c6398b13db5393 Mon Sep 17 00:00:00 2001 From: Wonkyu Kwon Date: Mon, 9 Sep 2013 16:51:42 +0900 Subject: [PATCH] Change procedure of enabling uicc card emulation Change-Id: Id077f0deadb823df2f49ca31ec3c1112b97c9148 --- daemon/net_nfc_server_manager.c | 19 +-- daemon/net_nfc_server_se.c | 269 ++++++++++++++++++---------------------- daemon/net_nfc_server_se.h | 4 +- tests/net_nfc_test_snep.c | 75 +++++------ 4 files changed, 156 insertions(+), 211 deletions(-) diff --git a/daemon/net_nfc_server_manager.c b/daemon/net_nfc_server_manager.c index 2177479..f3bba02 100644 --- a/daemon/net_nfc_server_manager.c +++ b/daemon/net_nfc_server_manager.c @@ -132,24 +132,7 @@ static net_nfc_error_e manager_deactive(void) net_nfc_server_llcp_unregister_all(); /* keep_SE_select_value do not need to update vconf and gdbus_se_setting */ - // result = net_nfc_server_se_change_se(SECURE_ELEMENT_TYPE_INVALID); - - { - net_nfc_error_e result_ese, result_uicc; - - /*turn off ESE*/ - net_nfc_controller_set_secure_element_mode( - SECURE_ELEMENT_TYPE_ESE, - SECURE_ELEMENT_OFF_MODE, - &result_ese); - - /*turn off UICC*/ - net_nfc_controller_set_secure_element_mode( - SECURE_ELEMENT_TYPE_UICC, - SECURE_ELEMENT_OFF_MODE, - &result_uicc); - - } + result = net_nfc_server_se_disable_card_emulation(); if (net_nfc_controller_configure_discovery( NET_NFC_DISCOVERY_MODE_STOP, diff --git a/daemon/net_nfc_server_se.c b/daemon/net_nfc_server_se.c index 47e400b..08a3d61 100644 --- a/daemon/net_nfc_server_se.c +++ b/daemon/net_nfc_server_se.c @@ -29,6 +29,12 @@ #include "net_nfc_server_util.h" #include "net_nfc_server_se.h" +enum +{ + SE_UICC_UNAVAILABLE = -1, + SE_UICC_ON_PROGRESS = 0, + SE_UICC_READY = 1, +}; typedef struct _nfc_se_setting_t { @@ -50,6 +56,7 @@ static net_nfc_server_se_setting_t gdbus_se_setting; static TapiHandle *gdbus_uicc_handle; static net_nfc_target_handle_s *gdbus_ese_handle; +static int gdbus_uicc_ready; /* server_side */ typedef struct _ServerSeData ServerSeData; @@ -217,25 +224,51 @@ static net_nfc_error_e net_nfc_server_se_close_ese() return result; } - -/* UICC functions */ -static TelSimCardStatus_t _se_uicc_check_state(TapiHandle *handle) +static void _se_uicc_enable_card_emulation() { - TelSimCardStatus_t state = TAPI_SIM_STATUS_UNKNOWN; - int b_card_changed = 0; - int error; - - error = tel_get_sim_init_info(handle, - &state, - &b_card_changed); - if (error != 0) - { - DEBUG_ERR_MSG("error = [%d]", error); + net_nfc_error_e result; + + /*turn off ESE*/ + net_nfc_controller_set_secure_element_mode( + SECURE_ELEMENT_TYPE_ESE, + SECURE_ELEMENT_OFF_MODE, + &result); + + /*turn on UICC*/ + net_nfc_controller_set_secure_element_mode( + SECURE_ELEMENT_TYPE_UICC, + SECURE_ELEMENT_VIRTUAL_MODE, + &result); + if (result == NET_NFC_OK) { + INFO_MSG("card emulation changed to SECURE_ELEMENT_TYPE_UICC"); + + net_nfc_server_se_set_se_type(SECURE_ELEMENT_TYPE_UICC); + net_nfc_server_se_set_se_mode(SECURE_ELEMENT_VIRTUAL_MODE); + + if (vconf_set_int(VCONFKEY_NFC_SE_TYPE, + VCONFKEY_NFC_SE_TYPE_UICC) < 0) { + DEBUG_ERR_MSG("vconf_set_int failed"); + } + } else { + DEBUG_ERR_MSG("net_nfc_controller_set_secure_element_mode failed, [%d]", + result); } +} - DEBUG_SERVER_MSG("current sim init state = [%d]", state); +static void _se_uicc_prepare(void) +{ + char **cpList; - return state; + cpList = tel_get_cp_name_list(); + if (cpList != NULL) { + gdbus_uicc_handle = tel_init(cpList[0]); + if (gdbus_uicc_handle != NULL) { + } else { + DEBUG_ERR_MSG("tel_init() failed"); + } + } else { + DEBUG_ERR_MSG("tel_get_cp_name_list() failed"); + } } static void _se_uicc_status_noti_cb(TapiHandle *handle, @@ -249,47 +282,35 @@ static void _se_uicc_status_noti_cb(TapiHandle *handle, switch (*status) { case TAPI_SIM_STATUS_SIM_INIT_COMPLETED : - if (gdbus_se_setting.busy == true) - { - net_nfc_error_e result = NET_NFC_OK; - int ret; - int se_type; + gdbus_uicc_ready = SE_UICC_READY; - DEBUG_SERVER_MSG("TAPI_SIM_STATUS_SIM_INIT_COMPLETED"); + _se_uicc_prepare(); + + if (gdbus_se_setting.busy == true && + net_nfc_server_se_get_se_type() == SECURE_ELEMENT_TYPE_UICC) { gdbus_se_setting.busy = false; - /* keep_SE_select_value */ - ret = vconf_get_int(VCONFKEY_NFC_SE_TYPE, &se_type); - if (ret == 0) - { - if (se_type == SECURE_ELEMENT_TYPE_UICC) - { - net_nfc_controller_set_secure_element_mode( - SECURE_ELEMENT_TYPE_UICC, - SECURE_ELEMENT_VIRTUAL_MODE, &result); - if (result == NET_NFC_OK) { - DEBUG_SERVER_MSG( - "changed to SECURE_ELEMENT_TYPE_UICC"); - net_nfc_server_se_set_se_type( - SECURE_ELEMENT_TYPE_UICC); - net_nfc_server_se_set_se_mode( - SECURE_ELEMENT_VIRTUAL_MODE); - } else { - DEBUG_ERR_MSG( - "SECURE_ELEMENT_TYPE_UICC, SECURE_ELEMENT_VIRTUAL_MODE failed [%d]", - result); - } - - - } - } + _se_uicc_enable_card_emulation(); } break; case TAPI_SIM_STATUS_CARD_REMOVED : DEBUG_SERVER_MSG("TAPI_SIM_STATUS_CARD_REMOVED"); - /* do something */ + gdbus_uicc_ready = SE_UICC_UNAVAILABLE; + + if (net_nfc_server_se_get_se_type() == SECURE_ELEMENT_TYPE_UICC) { + net_nfc_error_e result; + + /*turn off UICC*/ + net_nfc_controller_set_secure_element_mode( + SECURE_ELEMENT_TYPE_UICC, + SECURE_ELEMENT_OFF_MODE, + &result); + + net_nfc_server_se_set_se_type(SECURE_ELEMENT_TYPE_INVALID); + net_nfc_server_se_set_se_mode(SECURE_ELEMENT_OFF_MODE); + } break; default: @@ -299,47 +320,31 @@ static void _se_uicc_status_noti_cb(TapiHandle *handle, static void _se_uicc_init(void) { - char **cpList; - - cpList = tel_get_cp_name_list(); - if (cpList != NULL) { - gdbus_uicc_handle = tel_init(cpList[0]); - if (gdbus_uicc_handle != NULL) { - tel_register_noti_event(gdbus_uicc_handle, - TAPI_NOTI_SIM_STATUS, - _se_uicc_status_noti_cb, - NULL); - - } else { - DEBUG_ERR_MSG("tel_init() failed"); - } - } else { - DEBUG_ERR_MSG("tel_get_cp_name_list() failed"); - } + _se_uicc_prepare(); + tel_register_noti_event(gdbus_uicc_handle, + TAPI_NOTI_SIM_STATUS, + _se_uicc_status_noti_cb, + NULL); } static void _se_uicc_deinit() { - tel_deregister_noti_event(gdbus_uicc_handle, - TAPI_NOTI_SIM_STATUS); + if (gdbus_uicc_handle != NULL) { + tel_deregister_noti_event(gdbus_uicc_handle, + TAPI_NOTI_SIM_STATUS); - tel_deinit(gdbus_uicc_handle); + tel_deinit(gdbus_uicc_handle); - gdbus_uicc_handle = NULL; + gdbus_uicc_handle = NULL; + } } - static net_nfc_target_handle_s* _se_uicc_open() { net_nfc_target_handle_s *result = NULL; - if (gdbus_uicc_handle != NULL) { - TelSimCardStatus_t status; - - status = _se_uicc_check_state(gdbus_uicc_handle); - if (status == TAPI_SIM_STATUS_SIM_INIT_COMPLETED) { - result = (net_nfc_target_handle_s *)gdbus_uicc_handle; - } + if (gdbus_uicc_ready == SE_UICC_READY && gdbus_uicc_handle != NULL) { + result = (net_nfc_target_handle_s *)gdbus_uicc_handle; } return result; @@ -347,7 +352,8 @@ static net_nfc_target_handle_s* _se_uicc_open() static bool _se_is_uicc_handle(net_nfc_target_handle_s *handle) { - return (gdbus_uicc_handle != NULL && + return (gdbus_uicc_ready == SE_UICC_READY && + gdbus_uicc_handle != NULL && (TapiHandle *)handle == gdbus_uicc_handle); } @@ -356,6 +362,28 @@ static void _se_uicc_close(net_nfc_target_handle_s *handle) } /* SE Functions */ +net_nfc_error_e net_nfc_server_se_disable_card_emulation() +{ + net_nfc_error_e result; + + net_nfc_server_se_set_se_type(SECURE_ELEMENT_TYPE_INVALID); + net_nfc_server_se_set_se_mode(SECURE_ELEMENT_OFF_MODE); + + /*turn off ESE*/ + net_nfc_controller_set_secure_element_mode( + SECURE_ELEMENT_TYPE_ESE, + SECURE_ELEMENT_OFF_MODE, + &result); + + /*turn off UICC*/ + net_nfc_controller_set_secure_element_mode( + SECURE_ELEMENT_TYPE_UICC, + SECURE_ELEMENT_OFF_MODE, + &result); + + return NET_NFC_OK; +} + net_nfc_error_e net_nfc_server_se_change_se(uint8_t type) { net_nfc_error_e result = NET_NFC_OK; @@ -363,45 +391,17 @@ net_nfc_error_e net_nfc_server_se_change_se(uint8_t type) switch (type) { case SECURE_ELEMENT_TYPE_UICC : if (gdbus_se_setting.busy == false) { - TelSimCardStatus_t state; + if (gdbus_uicc_ready == SE_UICC_READY) { + _se_uicc_enable_card_emulation(); + } else if (gdbus_uicc_ready == SE_UICC_ON_PROGRESS) { + INFO_MSG("waiting for uicc initializing complete..."); - /*turn off ESE*/ - net_nfc_controller_set_secure_element_mode( - SECURE_ELEMENT_TYPE_ESE, - SECURE_ELEMENT_OFF_MODE, - &result); - - state = _se_uicc_check_state(gdbus_uicc_handle); - if (state == TAPI_SIM_STATUS_SIM_INIT_COMPLETED || - state == TAPI_SIM_STATUS_CARD_NOT_PRESENT || - state == TAPI_SIM_STATUS_CARD_REMOVED) { - /*turn on UICC*/ - net_nfc_controller_set_secure_element_mode( - SECURE_ELEMENT_TYPE_UICC, - SECURE_ELEMENT_VIRTUAL_MODE, &result); - if (result == NET_NFC_OK) { - DEBUG_SERVER_MSG( - "changed to SECURE_ELEMENT_TYPE_UICC"); - - net_nfc_server_se_set_se_type( - SECURE_ELEMENT_TYPE_UICC); - net_nfc_server_se_set_se_mode( - SECURE_ELEMENT_VIRTUAL_MODE); - - if (vconf_set_int( - VCONFKEY_NFC_SE_TYPE, - VCONFKEY_NFC_SE_TYPE_UICC) != 0) - { - DEBUG_ERR_MSG("vconf_set_int failed"); - } - } else { - DEBUG_ERR_MSG("SECURE_ELEMENT_TYPE_UICC, SECURE_ELEMENT_VIRTUAL_MODE failed [%d]", - result); - } - } else { - DEBUG_SERVER_MSG("UICC is not ready. waiting UICC event"); + net_nfc_server_se_set_se_type(SECURE_ELEMENT_TYPE_UICC); + net_nfc_server_se_set_se_mode(SECURE_ELEMENT_VIRTUAL_MODE); gdbus_se_setting.busy = true; + } else { + result = NET_NFC_NOT_SUPPORTED; } } else { DEBUG_SERVER_MSG("Previous request is processing."); @@ -424,7 +424,7 @@ net_nfc_error_e net_nfc_server_se_change_se(uint8_t type) &result); if (result == NET_NFC_OK) { - DEBUG_SERVER_MSG("changed to SECURE_ELEMENT_TYPE_ESE"); + INFO_MSG("card emulation changed to SECURE_ELEMENT_TYPE_ESE"); net_nfc_server_se_set_se_type(SECURE_ELEMENT_TYPE_ESE); net_nfc_server_se_set_se_mode(SECURE_ELEMENT_VIRTUAL_MODE); @@ -434,45 +434,18 @@ net_nfc_error_e net_nfc_server_se_change_se(uint8_t type) DEBUG_ERR_MSG("vconf_set_int failed"); } } else { - DEBUG_ERR_MSG("SECURE_ELEMENT_TYPE_ESE, SECURE_ELEMENT_VIRTUAL_MODE failed [%d]", result); + DEBUG_ERR_MSG("net_nfc_controller_set_secure_element_mode failed, [%d]", result); } break; default: - { - net_nfc_error_e result_ese, result_uicc; - - net_nfc_server_se_set_se_type( - SECURE_ELEMENT_TYPE_INVALID); - net_nfc_server_se_set_se_mode(SECURE_ELEMENT_OFF_MODE); - - /*turn off ESE*/ - net_nfc_controller_set_secure_element_mode( - SECURE_ELEMENT_TYPE_ESE, - SECURE_ELEMENT_OFF_MODE, - &result_ese); - - /*turn off UICC*/ - net_nfc_controller_set_secure_element_mode( - SECURE_ELEMENT_TYPE_UICC, - SECURE_ELEMENT_OFF_MODE, - &result_uicc); + result = net_nfc_server_se_disable_card_emulation(); + if (result == NET_NFC_OK){ + INFO_MSG("card emulation turned off"); - if (result_ese != NET_NFC_INVALID_HANDLE - && result_uicc != NET_NFC_INVALID_HANDLE) { - DEBUG_SERVER_MSG("SE off all"); - if (vconf_set_int(VCONFKEY_NFC_SE_TYPE, - VCONFKEY_NFC_SE_TYPE_NONE) != 0) { - DEBUG_ERR_MSG("vconf_set_int failed"); - } - - result = NET_NFC_OK; - } - else - { - DEBUG_ERR_MSG("ALL OFF failed, ese [%d], uicc [%d]",result_ese, result_uicc); - - result = NET_NFC_INVALID_HANDLE; + if (vconf_set_int(VCONFKEY_NFC_SE_TYPE, + VCONFKEY_NFC_SE_TYPE_NONE) != 0) { + DEBUG_ERR_MSG("vconf_set_int failed"); } } break; diff --git a/daemon/net_nfc_server_se.h b/daemon/net_nfc_server_se.h index f5053b5..ddc30b6 100644 --- a/daemon/net_nfc_server_se.h +++ b/daemon/net_nfc_server_se.h @@ -29,6 +29,8 @@ uint8_t net_nfc_server_se_get_se_mode(); net_nfc_error_e net_nfc_server_se_change_se(uint8_t type); +net_nfc_error_e net_nfc_server_se_disable_card_emulation(); + /***************************************************************/ gboolean net_nfc_server_se_init(GDBusConnection *connection); @@ -39,4 +41,4 @@ void net_nfc_server_se_detected(void *info); void net_nfc_server_se_transaction_received(void *info); -#endif //__NET_NFC_SERVER_SE_H__ \ No newline at end of file +#endif //__NET_NFC_SERVER_SE_H__ diff --git a/tests/net_nfc_test_snep.c b/tests/net_nfc_test_snep.c index 1ee778a..e21e9d4 100644 --- a/tests/net_nfc_test_snep.c +++ b/tests/net_nfc_test_snep.c @@ -170,22 +170,22 @@ static void snep_register_server_cb(net_nfc_snep_handle_h target, run_next_callback(user_data); } -/* - static void snep_unregister_server_cb(net_nfc_snep_handle_h target, - net_nfc_snep_type_t event, - net_nfc_error_e result, - ndef_message_h msg, - void *user_data) - { +#if 0 +static void snep_unregister_server_cb(net_nfc_snep_handle_h target, + net_nfc_snep_type_t event, + net_nfc_error_e result, + ndef_message_h msg, + void *user_data) +{ - g_print("snep_register_server_cb Completed %d\n", event); - g_print("snep_register_server_cb Completed %d\n", result); + g_print("snep_register_server_cb Completed %d\n", event); + g_print("snep_register_server_cb Completed %d\n", result); - net_nfc_util_print_ndef_message (msg); + net_nfc_util_print_ndef_message (msg); - run_next_callback(user_data); - } - */ + run_next_callback(user_data); +} +#endif /******************************API Calls*********************************************/ @@ -221,7 +221,6 @@ void net_nfc_test_snep_start_server(gpointer data, user_data); g_print(" net_nfc_test_snep_start_server result: %d\n", result); - } void net_nfc_test_snep_server(gpointer data, @@ -244,37 +243,33 @@ void net_nfc_test_snep_server(gpointer data, user_data); g_print(" net_nfc_test_snep_start_server result: %d\n", result); - - } void net_nfc_test_snep_start_server_sync(gpointer data, gpointer user_data) { - /* - - net_nfc_error_e result; - guint out_result; - ndef_message_h msg=NULL; - - result = net_nfc_client_snep_start_server_sync(target_info->handle, - "urn:nfc:xsn:samsung.com:testllcp", - 16, - &out_result, - msg); +#if 0 + net_nfc_error_e result; + guint out_result; + ndef_message_h msg=NULL; - if(result != NET_NFC_OK) - { - g_print(" net_nfc_test_snep_start_server failed: %d\n", result); - run_next_callback(user_data); - return; - } + result = net_nfc_client_snep_start_server_sync(target_info->handle, + "urn:nfc:xsn:samsung.com:testllcp", + 16, + &out_result, + msg); - net_nfc_util_print_ndef_message (msg); - run_next_callback(user_data); - */ + if(result != NET_NFC_OK) + { + g_print(" net_nfc_test_snep_start_server failed: %d\n", result); + run_next_callback(user_data); + return; + } + net_nfc_util_print_ndef_message (msg); + run_next_callback(user_data); +#endif } @@ -290,7 +285,6 @@ void net_nfc_test_snep_start_client(gpointer data, user_data); g_print(" net_nfc_test_snep_start_client result: %d\n", result); - } @@ -328,7 +322,6 @@ void net_nfc_test_snep_send_client_request(gpointer data, g_print(" net_nfc_test_snep_send_client_request failed: %d\n", result); return; } - } @@ -347,7 +340,6 @@ void net_nfc_test_snep_register_server(gpointer data, g_print(" net_nfc_test_snep_register_server result: %d\n", result); run_next_callback(user_data); - } void net_nfc_test_snep_unregister_server(gpointer data, @@ -360,7 +352,6 @@ void net_nfc_test_snep_unregister_server(gpointer data, TEST_SAP); g_print(" net_nfc_test_snep_unregister_server result: %d\n", result); - } void net_nfc_test_snep_register_unregister_server(gpointer data, @@ -381,8 +372,6 @@ void net_nfc_test_snep_register_unregister_server(gpointer data, TEST_SAP); g_print(" net_nfc_test_snep_unregister_server result: %d\n", result); - - } @@ -400,5 +389,3 @@ void net_nfc_test_snep_stop_service_sync(gpointer data, g_print(" net_nfc_test_snep_register_server result: %d\n", result); } - - -- 2.7.4