sim: Read EFust and EFest
PATCH v2 1/1 sim: Read EFust and EFest
--- src/sim.c | 83 ++++++++++++++++++++++++++++++++++++++++++- src/simutil.h | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 189 insertions(+), 2 deletions(-)
src/sim.c +81 -2
@@ -95,6 +95,8 @@ struct ofono_sim {void *driver_data;struct ofono_atom *atom;DBusMessage *pending; +unsigned char service_ust[(SIM_UST_SERVICE_MAX -1 ) /8 +1 ]; +unsigned char service_est[(SIM_EST_SERVICE_MAX -1 ) /8 +1 ]; };struct msisdn_set_request {
@@ -128,6 +130,18 @@ static const char *const passwd_name[] = { [OFONO_SIM_PASSWORD_PHCORP_PUK] = "corppuk", }; +inline gboolean sim_get_ust (unsigned char *service_table, +enum sim_ust_service index) +{ +return (service_table[index /8 ] >> (index %8 )) &1 ; +} + +inline gboolean sim_get_est (unsigned char *service_table, +enum sim_est_service index) +{ +return (service_table[index /8 ] >> (index %8 )) &1 ; +} +static const char *sim_passwd_name (enum ofono_sim_password_type type) {return passwd_name[type];
@@ -1076,6 +1090,71 @@ static void sim_retrieve_imsi(struct ofono_sim *sim) sim->driver->read_imsi (sim, sim_imsi_cb, sim); } +static void sim_efest_read_cb (int ok,int length,int record, +const unsigned char *data, +int record_length,void *userdata) +{ +struct ofono_sim *sim = userdata; +int i; +int size; + +if (!ok) + goto out; + +if (length <1 ) { +ofono_error ("EFest shall contain@least one byte" ); + goto out; + } + + size =sizeof (sim->service_est) /sizeof (*sim->service_est); +for (i =0 ; i < size; i++) { +if (i >= length) + sim->service_est[i] =0 ; +else + sim->service_est[i] = data[i]; + } + +out: +sim_retrieve_imsi (sim); +} + +static void sim_efust_read_cb (int ok,int length,int record, +const unsigned char *data, +int record_length,void *userdata) +{ +struct ofono_sim *sim = userdata; +int i; +int size; + +if (!ok) + goto out; + +if (length <1 ) { +ofono_error ("EFust shall contain@least one byte" ); + goto out; + } + + size =sizeof (sim->service_ust) /sizeof (*sim->service_ust); +for (i =0 ; i < size; i++) { +if (i >= length) + sim->service_ust[i] =0 ; +else + sim->service_ust[i] = data[i]; + } + +out: +ofono_sim_read (sim,SIM_EFEST_FILEID , +OFONO_SIM_FILE_STRUCTURE_TRANSPARENT , + sim_efest_read_cb, sim); +} + +static inline void sim_retrieve_efust (struct ofono_sim *sim) +{ +ofono_sim_read (sim,SIM_EFUST_FILEID , +OFONO_SIM_FILE_STRUCTURE_TRANSPARENT , + sim_efust_read_cb, sim); +} +static void sim_pin_query_cb (const struct ofono_error *error,enum ofono_sim_password_type pin_type,void *data)
@@ -1110,13 +1189,13 @@ static void sim_pin_query_cb(const struct ofono_error *error, checkdone:if (pin_type ==OFONO_SIM_PASSWORD_NONE ) -sim_retrieve_imsi (sim); +sim_retrieve_efust (sim); }static void sim_pin_check (struct ofono_sim *sim) {if (!sim->driver->query_passwd_state) { -sim_retrieve_imsi (sim); +sim_retrieve_efust (sim);return ; }
src/simutil.h +108 -0
126 lines not on this page · raw message
Signature · 1 line
1.7.0.4
Hi Yang,
Quoted 249 lines
--- src/sim.c | 83 ++++++++++++++++++++++++++++++++++++++++++- src/simutil.h | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 189 insertions(+), 2 deletions(-)src/sim.c +81
-2@@ -95,6 +95,8 @@ struct ofono_sim {void *driver_data;struct ofono_atom *atom;DBusMessage *pending; +unsigned char service_ust[(SIM_UST_SERVICE_MAX -1 ) /8 +1 ]; +unsigned char service_est[(SIM_EST_SERVICE_MAX -1 ) /8 +1 ]; };struct msisdn_set_request {@@ -128,6 +130,18 @@ static const char *const passwd_name[] = { [OFONO_SIM_PASSWORD_PHCORP_PUK] = "corppuk", }; +inline gboolean sim_get_ust (unsigned char *service_table, +enum sim_ust_service index) +{ +return (service_table[index /8 ] >> (index %8 )) &1 ; +} + +inline gboolean sim_get_est (unsigned char *service_table, +enum sim_est_service index) +{ +return (service_table[index /8 ] >> (index %8 )) &1 ; +} +static const char *sim_passwd_name (enum ofono_sim_password_type type) {return passwd_name[type];@@ -1076,6 +1090,71 @@ static void sim_retrieve_imsi(struct ofono_sim *sim) sim->driver->read_imsi (sim, sim_imsi_cb, sim); } +static void sim_efest_read_cb (int ok,int length,int record, +const unsigned char *data, +int record_length,void *userdata) +{ +struct ofono_sim *sim = userdata; +int i; +int size; + +if (!ok) + goto out; + +if (length <1 ) { +ofono_error ("EFest shall contain at least one byte" ); + goto out; + } + + size =sizeof (sim->service_est) /sizeof (*sim->service_est); +for (i =0 ; i < size; i++) { +if (i >= length) + sim->service_est[i] =0 ; +else + sim->service_est[i] = data[i]; + } + +out: +sim_retrieve_imsi (sim); +} + +static void sim_efust_read_cb (int ok,int length,int record, +const unsigned char *data, +int record_length,void *userdata) +{ +struct ofono_sim *sim = userdata; +int i; +int size; + +if (!ok) + goto out; + +if (length <1 ) { +ofono_error ("EFust shall contain at least one byte" ); + goto out; + } + + size =sizeof (sim->service_ust) /sizeof (*sim->service_ust); +for (i =0 ; i < size; i++) { +if (i >= length) + sim->service_ust[i] =0 ; +else + sim->service_ust[i] = data[i]; + } + +out: +ofono_sim_read (sim,SIM_EFEST_FILEID , +OFONO_SIM_FILE_STRUCTURE_TRANSPARENT , + sim_efest_read_cb, sim); +} + +static inline void sim_retrieve_efust (struct ofono_sim *sim) +{ +ofono_sim_read (sim,SIM_EFUST_FILEID , +OFONO_SIM_FILE_STRUCTURE_TRANSPARENT , + sim_efust_read_cb, sim); +} +static void sim_pin_query_cb (const struct ofono_error *error,enum ofono_sim_password_type pin_type,void *data)@@ -1110,13 +1189,13 @@ static void sim_pin_query_cb(const struct ofono_error *error, checkdone:if (pin_type ==OFONO_SIM_PASSWORD_NONE ) -sim_retrieve_imsi (sim); +sim_retrieve_efust (sim); }static void sim_pin_check (struct ofono_sim *sim) {if (!sim->driver->query_passwd_state) { -sim_retrieve_imsi (sim); +sim_retrieve_efust (sim);return ; }src/simutil.h +102
-0@@ -26,9 +26,11 @@ enum sim_fileid {SIM_EF_CPHS_MWIS_FILEID =0x6f11 ,SIM_EF_CPHS_INFORMATION_FILEID =0x6f16 ,SIM_EF_CPHS_MBDN_FILEID =0x6f17 , +SIM_EFUST_FILEID =0x6f38 ,SIM_EFMSISDN_FILEID =0x6f40 ,SIM_EFSPN_FILEID =0x6f46 ,SIM_EFSDN_FILEID =0x6f49 , +SIM_EFEST_FILEID =0x6f56 ,SIM_EFAD_FILEID =0x6fad ,SIM_EFPHASE_FILEID =0x6fae , SIM_EFPNN_FILEID = 0x6fc5,@@ -53,6 +55,106 @@ enum sim_file_access { SIM_FILE_ACCESS_NEVER = 15, }; +/* 131.102 Section 4.2.8 */ +enum sim_ust_service { +SIM_UST_SERVICE_LOCAL_PHONE_BOOK =0 , +SIM_UST_SERVICE_FDN =1 , +SIM_UST_SERVICE_EXT_2 =2 , +SIM_UST_SERVICE_SDN =3 , +SIM_UST_SERVICE_EXT_3 =4 , +SIM_UST_SERVICE_BDN =5 , +SIM_UST_SERVICE_EXT_4 =6 , +SIM_UST_SERVICE_OCI_OCT =7 , +SIM_UST_SERVICE_ICI_ICT =8 , +SIM_UST_SERVICE_SMS =9 , +SIM_UST_SERVICE_SMSR =10 , +SIM_UST_SERVICE_SMSP =11 , +SIM_UST_SERVICE_AOC =12 , +SIM_UST_SERVICE_CCP2 =13 , +SIM_UST_SERVICE_CBS_ID =14 , +SIM_UST_SERVICE_CBS_ID_RANGE =15 , +SIM_UST_SERVICE_GROUP_ID_LEVEL_1 =16 , +SIM_UST_SERVICE_GROUP_ID_LEVEL_2 =17 , +SIM_UST_SERVICE_PROVIDER_NAME =18 , +SIM_UST_SERVICE_USER_PLMN =19 , +SIM_UST_SERVICE_MSISDN =20 , +SIM_UST_SERVICE_IMG =21 , +SIM_UST_SERVICE_SOLSA =22 , +SIM_UST_SERVICE_PRECEDENCE_PREEMPTION =23 , +SIM_UST_SERVICE_EMLPP =24 , +SIM_UST_SERVICE_GSM_ACCESS =26 , +SIM_UST_SERVICE_DATA_DOWNLOAD_SMS_PP =27 , +SIM_UST_SERVICE_DATA_DOWNLOAD_SMS_CB =28 , +SIM_UST_SERVICE_CALL_CONTROL_USIM =29 , +SIM_UST_SERVICE_MO_SMS_USIM =30 , +SIM_UST_SERVICE_RUN_AT_COMMAND =31 , +SIM_UST_SERVICE_ENABLED_SERVICE_TABLE =33 , +SIM_UST_SERVICE_ACL =34 , +SIM_UST_SERVICE_DEPERSONALISATION_CTRL_KEY =35 , +SIM_UST_SERVICE_NETWORK_LIST =36 , +SIM_UST_SERVICE_GSM_SECURITY_CONTEXT =37 , +SIM_UST_SERVICE_CPBCCH =38 , +SIM_UST_SERVICE_INVESTIGATION_SCAN =39 , +SIM_UST_SERVICE_MEXE =40 , +SIM_UST_SERVICE_OPERATOR_PLMN =41 , +SIM_UST_SERVICE_HPLMN =42 , +SIM_UST_SERVICE_EXT_5 =43 , +SIM_UST_SERVICE_PLMN_NETWORK_NAME =44 , +SIM_UST_SERVICE_OPERATOR_PLMN_LIST =45 , +SIM_UST_SERVICE_MAILBOX_DIALLING_NUMBERS =46 , +SIM_UST_SERVICE_MWIS =47 , +SIM_UST_SERVICE_CFIS =48 , +SIM_UST_SERVICE_PROVIDER_DISPLAY_INFO =50 , +SIM_UST_SERVICE_MMS =51 , +SIM_UST_SERVICE_EXT_8 =52 , +SIM_UST_SERVICE_CALL_CONTROL_GPRS_USIM =53 , +SIM_UST_SERVICE_MMS_USER_CONN_PARAM =54 , +SIM_UST_SERVICE_NIA =55 , +SIM_UST_SERVICE_EFVGCS_EFVGCSS =56 , +SIM_UST_SERVICE_EFVBS_EFVBSS =57 , +SIM_UST_SERVICE_PSEUDONYM =58 , +SIM_UST_SERVICE_USER_PLMN_I_WLAN =59 , +SIM_UST_SERVICE_OPERATOR_PLMN_I_WLAN =60 , +SIM_UST_SERVICE_USER_WSID =61 , +SIM_UST_SERVICE_OPERATOR_WSID =62 , +SIM_UST_SERVICE_VGCS_SECURITY =63 , +SIM_UST_SERVICE_VBS_SECURITY =64 , +SIM_UST_SERVICE_WLAN_REAUTH_ID =65 , +SIM_UST_SERVICE_MMS_STORAGE =66 , +SIM_UST_SERVICE_GBA =67 , +SIM_UST_SERVICE_MBMS_SECURITY =68 , +SIM_UST_SERVICE_USSD_APPLICATION_MODE =69 , +SIM_UST_SERVICE_EQUIVALENT_HPLMN =70 , +SIM_UST_SERVICE_ADDITIONAL_TERMINAL_PROFILE =71 , +SIM_UST_SERVICE_EQUIVALENT_HPLMN_IND =72 , +SIM_UST_SERVICE_LAST_RPLMN_IND =73 , +SIM_UST_SERVICE_OMA_BCAST_SC_PROFILE =74 , +SIM_UST_SERVICE_BGA_LOCAL_KEY =75 , +SIM_UST_SERVICE_TERMINAL_APPLICATIONS =76 , +SIM_UST_SERVICE_PROVIDER_NAME_ICON =77 , +SIM_UST_SERVICE_PLMN_NETWORK_NAME_ICON =78 , +SIM_UST_SERVICE_CONN_PARAM_USIM_IP =79 , +SIM_UST_SERVICE_HOME_I_WLAN_ID_LIST =80 , +SIM_UST_SERVICE_I_WLAN_EQUIVALENT_HPLMN_IND =81 , +SIM_UST_SERVICE_I_WLAN_HPLMN_PRIORITY_IND =82 , +SIM_UST_SERVICE_I_WLAN_LAST_PLMN =83 , +SIM_UST_SERVICE_EPS_INFO =84 , +SIM_UST_SERVICE_CSG_IND =85 , +SIM_UST_SERVICE_CALL_CONTROL_EPS_PDN_USIM =86 , +SIM_UST_SERVICE_HPLMN_DIRECT_ACCESS =87 , +SIM_UST_SERVICE_ECALL_DATA =88 , +SIM_UST_SERVICE_OPERATOR_CSG =89 , +SIM_UST_SERVICE_MAX +}; + +/* 131.102 Section 4.2.47 */ +enum sim_est_service { +SIM_EST_SERVICE_FDN =0 , +SIM_EST_SERVICE_BDN =1 , +SIM_EST_SERVICE_ACL =2 , +SIM_EST_SERVICE_MAX +}; +#define SIM_EFSPN_DC_HOME_PLMN_BIT 0x1#define SIM_EFSPN_DC_ROAMING_SPN_BIT 0x2
src/simutil.h gboolean sim_parse_3g_get_response(const unsigned char *data, int len, · line 376
Quoted 9 lines
src/simutil.h +6
-0@@ -266,3 +368,9 @@ gboolean sim_parse_3g_get_response(const unsigned char *data, int len,gboolean sim_parse_2g_get_response (const unsigned char *response,int len,int *file_len,int *record_len,int *structure,unsigned char *access); + + +inline gboolean sim_get_ust (unsigned char *service_table, +enum sim_ust_service index); +inline gboolean sim_get_est (unsigned char *service_table, +enum sim_est_service index);
this kind of usage of inline is not really helpful. In general speaking we let the compiler decide when to inline and when not. And in case of exported functions, I don't think anything can be done usefully here anyway. So just remove it.
Regards
Marcel