sim: Read EFust and EFest
PATCH v3 1/1 sim: Read EFust and EFest
--- src/sim.c | 81 +++++++++++++++++++++++++++++++++++++++++++- src/simutil.h | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 2 deletions(-)
src/sim.c +79 -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,16 @@ static const char *const passwd_name[] = { [OFONO_SIM_PASSWORD_PHCORP_PUK] = "corppuk", }; +gboolean sim_get_ust (unsigned char *service_table,enum sim_ust_service index) +{ +return (service_table[index /8 ] >> (index %8 )) &1 ; +} + +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 +1088,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 +1187,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 +105 -0
123 lines not on this page · raw message
Signature · 1 line
1.7.0.4
Hi Yang,
Quoted 10 lines · Yang Gu
--- src/sim.c | 81 +++++++++++++++++++++++++++++++++++++++++++- src/simutil.h | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 2 deletions(-)src/sim.c +0
-0
src/sim.c struct ofono_sim { · line 99
Quoted 5 lines
src/sim.c +2
-0@@ -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 ];
Hmm, honestly I'd rather see:
unsigned char *service_ust;
unsigned char ust_len;
etc
Quoted 7 lines
src/sim.c +0
-0};struct msisdn_set_request {@@ -128,6 +130,16 @@ static const char *const passwd_name[] = { [OFONO_SIM_PASSWORD_PHCORP_PUK] = "corppuk", };
src/sim.c static const char *const passwd_name[] = { · line 142
Quoted 10 lines
src/sim.c +10
-0+gboolean sim_get_ust (unsigned char *service_table,enum sim_ust_service index) +{ +return (service_table[index /8 ] >> (index %8 )) &1 ; +} + +gboolean sim_get_est (unsigned char *service_table,enum sim_est_service index) +{ +return (service_table[index /8 ] >> (index %8 )) &1 ; +} +
Please don't cross simutil.c vs sim.c boundary. These functions are declared in simutil.h. They should be defined in simutil.c, not here.
I suggest doing something like sim_get_est(unsigned char *est, unsigned char len, enum sim_est_service index)
and returning FALSE if the value is out of range.
Quoted 20 lines
src/sim.c +13
-0static const char *sim_passwd_name (enum ofono_sim_password_type type) {return passwd_name[type];@@ -1076,6 +1088,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" );
src/sim.c static void sim_retrieve_imsi(struct ofono_sim *sim) · line 1113
Quoted 10 lines
src/sim.c +10
-0+ 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]; + }
g_strdup might be easier here
Quoted 18 lines
src/sim.c +18
-0+ +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" );
src/sim.c static void sim_retrieve_imsi(struct ofono_sim *sim) · line 1141
Quoted 10 lines
src/sim.c +10
-0+ 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]; + }
Again, g_strdup might be easier. You might want to not bother reading EFest if the EFust failed.
Quoted 133 lines
src/sim.c +16
-2+ +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 +1187,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 +82
-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 ,
src/simutil.h enum sim_file_access { · line 147
Quoted 10 lines
src/simutil.h +10
-0+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
I'd say get rid of MAX...
src/simutil.h enum sim_file_access { · line 155
Quoted 8 lines
src/simutil.h +8
-0+}; + +/* 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
Same here
src/simutil.h gboolean sim_parse_3g_get_response(const unsigned char *data, int len, · line 373
Quoted 12 lines
src/simutil.h +5
-0+}; +#define SIM_EFSPN_DC_HOME_PLMN_BIT 0x1#define SIM_EFSPN_DC_ROAMING_SPN_BIT 0x2@@ -266,3 +368,6 @@ 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); + +gboolean sim_get_ust (unsigned char *service_table,enum sim_ust_service index); +gboolean sim_get_est (unsigned char *service_table,enum sim_est_service index);
Regards,
-Denis