blob: fc9221e882be554f842eddd1e152a79f3b5f51f9 [file] [log] [blame]
b.liu87afc4c2024-08-14 17:33:45 +08001#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <errno.h>
5#include <sys/socket.h>
6#include <sys/un.h>
7#include <netinet/in.h>
8#include <pthread.h>
9#include <sys/epoll.h>
10#include <fcntl.h>
11#include <signal.h>
12
13#include "mbtk_type.h"
14#include "mbtk_ril.h"
15#include "atchannel.h"
16#include "at_tok.h"
17#include "mbtk_utils.h"
18#include "ril_info.h"
19
b.liub171c9a2024-11-12 19:23:29 +080020void ril_rsp_pack_send(ATPortType_enum port, int fd, int ril_id, int msg_index, const void* data, int data_len);
b.liu87afc4c2024-08-14 17:33:45 +080021
22/** Returns SIM_NOT_READY on error */
b.liub171c9a2024-11-12 19:23:29 +080023mbtk_sim_state_enum ril_sim_state_get(ATPortType_enum port)
b.liu87afc4c2024-08-14 17:33:45 +080024{
25 ATResponse *p_response = NULL;
26 int err;
27 mbtk_sim_state_enum ret = MBTK_SIM_STATE_UNKNOWN;
28 char *cpinLine;
29 char *cpinResult;
30
b.liub171c9a2024-11-12 19:23:29 +080031 err = at_send_command_singleline(port, "AT+CPIN?", "+CPIN:", &p_response);
b.liu87afc4c2024-08-14 17:33:45 +080032
33 if (err < 0 || p_response->success == 0 || !p_response->p_intermediates)
34 {
35 ret = MBTK_SIM_STATE_NOT_READY;
36 goto done;
37 }
38
39 switch (at_get_cme_error(p_response))
40 {
41 case CME_SUCCESS:
42 break;
43
44 case CME_SIM_NOT_INSERTED:
45 ret = MBTK_SIM_STATE_ABSENT;
46 goto done;
47
48 default:
49 ret = MBTK_SIM_STATE_NOT_READY;
50 goto done;
51 }
52
53 /* CPIN? has succeeded, now look at the result */
54
55 cpinLine = p_response->p_intermediates->line;
56 err = at_tok_start (&cpinLine);
57
58 if (err < 0)
59 {
60 ret = MBTK_SIM_STATE_NOT_READY;
61 goto done;
62 }
63
64 err = at_tok_nextstr(&cpinLine, &cpinResult);
65
66 if (err < 0)
67 {
68 ret = MBTK_SIM_STATE_NOT_READY;
69 goto done;
70 }
71
72 if (0 == strcmp (cpinResult, "SIM PIN"))
73 {
74 ret = MBTK_SIM_STATE_SIM_PIN;
75 }
76 else if (0 == strcmp (cpinResult, "SIM PUK"))
77 {
78 ret = MBTK_SIM_STATE_SIM_PUK;
79 }
80 else if (0 == strcmp (cpinResult, "PH-SIMLOCK PIN"))
81 {
82 ret = MBTK_SIM_STATE_PH_SIMLOCK_PIN;
83 }
84 else if (0 == strcmp (cpinResult, "PH-SIMLOCK PIN"))
85 {
86 ret = MBTK_SIM_STATE_PH_SIMLOCK_PUK;
87 }
88 else if (0 == strcmp (cpinResult, "PH-FSIM PIN"))
89 {
90 ret = MBTK_SIM_STATE_PH_FSIM_PIN;
91 }
92 else if (0 == strcmp (cpinResult, "PH-FSIM PUK"))
93 {
94 ret = MBTK_SIM_STATE_PH_FSIM_PUK;
95 }
96 else if (0 == strcmp (cpinResult, "SIM PIN2"))
97 {
98 ret = MBTK_SIM_STATE_SIM_PIN2;
99 }
100 else if (0 == strcmp (cpinResult, "SIM PUK2"))
101 {
102 ret = MBTK_SIM_STATE_SIM_PUK2;
103 }
104 else if (0 == strcmp (cpinResult, "PH-NET PIN"))
105 {
106 ret = MBTK_SIM_STATE_PH_NET_PIN;
107 }
108 else if (0 == strcmp (cpinResult, "PH-NET PUK"))
109 {
110 ret = MBTK_SIM_STATE_PH_NET_PUK;
111 }
112 else if (0 == strcmp (cpinResult, "PH-NETSUB PIN"))
113 {
114 ret = MBTK_SIM_STATE_PH_NETSUB_PIN;
115 }
116 else if (0 == strcmp (cpinResult, "PH-NETSUB PUK"))
117 {
118 ret = MBTK_SIM_STATE_PH_NETSUB_PUK;
119 }
120 else if (0 == strcmp (cpinResult, "PH-SP PIN"))
121 {
122 ret = MBTK_SIM_STATE_PH_SP_PIN;
123 }
124 else if (0 == strcmp (cpinResult, "PH-SP PUK"))
125 {
126 ret = MBTK_SIM_STATE_PH_SP_PUK;
127 }
128 else if (0 == strcmp (cpinResult, "PH-CORP PIN"))
129 {
130 ret = MBTK_SIM_STATE_PH_CORP_PIN;
131 }
132 else if (0 == strcmp (cpinResult, "PH-CORP PUK"))
133 {
134 ret = MBTK_SIM_STATE_PH_CORP_PUK;
135 }
136 else if (0 == strcmp (cpinResult, "READY"))
137 {
138 ret = MBTK_SIM_STATE_READY;
139 } else {
140 ret = MBTK_SIM_STATE_ABSENT;
141 }
142
143done:
144 at_response_free(p_response);
145 p_response = NULL;
146 cpinResult = NULL;
147 ril_info.sim_state = ret;
148 return ret;
149}
150
151/*
152AT*EUICC?
153*EUICC: 1
154
155OK
156*/
b.liub171c9a2024-11-12 19:23:29 +0800157static int req_sim_type_get(ATPortType_enum port, uint8 *type, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800158{
159 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800160// char *tmp_ptr = NULL;
b.liub171c9a2024-11-12 19:23:29 +0800161 int err = at_send_command_singleline(port, "AT*EUICC?", "*EUICC:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800162
163 if (err < 0 || response->success == 0 || !response->p_intermediates){
164 *cme_err = at_get_cme_error(response);
165 goto exit;
166 }
167
168 char *line = response->p_intermediates->line;
169 err = at_tok_start(&line);
170 if (err < 0)
171 {
172 goto exit;
173 }
174 int sim_card_type = -1;
175 err = at_tok_nextint(&line, &sim_card_type);
176 if (err < 0)
177 {
178 goto exit;
179 }
180 if(sim_card_type != -1)
181 *type = sim_card_type;
182 goto exit;
183exit:
184 at_response_free(response);
185 return err;
186}
187
188/*
189AT+ICCID
190+ICCID: 89860621330065648041
191
192OK
193*/
b.liub171c9a2024-11-12 19:23:29 +0800194static int req_iccid_get(ATPortType_enum port, void *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800195{
196 ATResponse *response = NULL;
197 char *tmp_ptr = NULL;
b.liub171c9a2024-11-12 19:23:29 +0800198 int err = at_send_command_singleline(port, "AT+ICCID", "+ICCID:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800199
200 if (err < 0 || response->success == 0 || !response->p_intermediates){
201 *cme_err = at_get_cme_error(response);
202 goto exit;
203 }
204
205 char *line = response->p_intermediates->line;
206 err = at_tok_start(&line);
207 if (err < 0)
208 {
209 goto exit;
210 }
211
212 err = at_tok_nextstr(&line, &tmp_ptr);
213 if (err < 0)
214 {
215 goto exit;
216 }
217
218 memcpy(data, tmp_ptr, strlen(tmp_ptr));
219exit:
220 at_response_free(response);
221 return err;
222}
223
224/*
225AT+CNUM?
226+CNUM: "","13980414101",129
227
228OK
229
230*/
b.liub171c9a2024-11-12 19:23:29 +0800231static int req_phone_number_get(ATPortType_enum port, void *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800232{
233 ATResponse *response = NULL;
234 char *tmp_ptr = NULL;
b.liub171c9a2024-11-12 19:23:29 +0800235 int err = at_send_command_singleline(port, "AT+CNUM?", "+CNUM:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800236 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
237 if(response) {
238 *cme_err = at_get_cme_error(response);
239 }
240 LOGD("AT+CNUM? fail.");
241 goto exit;
242 }
243
244 char *line = response->p_intermediates->line;
245 if(line == NULL) {
246 LOGD("line is NULL");
247 goto exit;
248 }
249 err = at_tok_start(&line);
250 if (err < 0)
251 {
252 goto exit;
253 }
254
255 err = at_tok_nextstr(&line, &tmp_ptr);
256 if (err < 0)
257 {
258 goto exit;
259 }
260
261 err = at_tok_nextstr(&line, &tmp_ptr);
262 if (err < 0)
263 {
264 goto exit;
265 }
266
267 memcpy(data, tmp_ptr, strlen(tmp_ptr));
268exit:
269 at_response_free(response);
270 return err;
271}
272
273
274/*
275AT+CIMI
276460068103383304
277
278OK
279
280*/
b.liub171c9a2024-11-12 19:23:29 +0800281static int req_imsi_get(ATPortType_enum port, void *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800282{
283 ATResponse *response = NULL;
b.liub171c9a2024-11-12 19:23:29 +0800284 int err = at_send_command_numeric(port, "AT+CIMI", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800285
286 if (err < 0 || response->success == 0 || !response->p_intermediates){
287 *cme_err = at_get_cme_error(response);
288 goto exit;
289 }
290
291 memcpy(data, response->p_intermediates->line, strlen(response->p_intermediates->line));
292exit:
293 at_response_free(response);
294 return err;
295}
296
b.liub171c9a2024-11-12 19:23:29 +0800297static int req_sim_lock_state_get(ATPortType_enum port, int *state, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800298{
299 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800300// char cmd[64]={0};
b.liu87afc4c2024-08-14 17:33:45 +0800301
b.liub171c9a2024-11-12 19:23:29 +0800302 int err = at_send_command_singleline(port, "AT+CLCK=SC,2", "+CLCK:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800303 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
304 if(response) {
305 *cme_err = at_get_cme_error(response);
306 }
307 LOGD("AT+CLCK fail.");
308 goto exit;
309 }
310
311 char *line = response->p_intermediates->line;
312 if(line == NULL) {
313 LOGD("line is NULL");
314 goto exit;
315 }
316 err = at_tok_start(&line);
317 if (err < 0)
318 {
319 goto exit;
320 }
321 err = at_tok_nextint(&line, state);
322 if (err < 0)
323 {
324 goto exit;
325 }
326
327exit:
328 at_response_free(response);
329 return err;
330}
331
332/*
333*
334AT+CLCK=SC,0,1234
335+CLCK: 0
336
337OK
338
339AT+CLCK=SC,1,1234
340+CLCK: 1
341
342OK
343
344*
345*/
b.liub171c9a2024-11-12 19:23:29 +0800346static int req_sim_lock_switch(ATPortType_enum port, bool enable, uint8* pin, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800347{
348 ATResponse *response = NULL;
349 char cmd[64]={0};
350 snprintf(cmd, sizeof(cmd), "AT+CLCK=SC,%d,%s", enable ? 1 : 0, pin);
b.liub171c9a2024-11-12 19:23:29 +0800351 int err = at_send_command_singleline(port, cmd, "+CLCK:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800352 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
353 if(response) {
354 *cme_err = at_get_cme_error(response);
355 }
356 LOGD("AT+CLCK fail.");
357 goto exit;
358 }
359
360 int ret;
361 char *line = response->p_intermediates->line;
362 if(line == NULL) {
363 LOGD("line is NULL");
364 goto exit;
365 }
366 err = at_tok_start(&line);
367 if (err < 0)
368 {
369 goto exit;
370 }
371 err = at_tok_nextint(&line, &ret);
372 if (err < 0)
373 {
374 goto exit;
375 }
376
377 if(enable) {
378 if(ret != 1) {
379 LOGW("+CLCK not 1.");
380 err = -1;
381 goto exit;
382 }
383 } else {
384 if(ret != 0) {
385 LOGW("+CLCK not 0.");
386 err = -1;
387 goto exit;
388 }
389 }
390
391exit:
392 at_response_free(response);
393 return err;
394}
395
b.liub171c9a2024-11-12 19:23:29 +0800396static int req_sim_pin_change(ATPortType_enum port, uint8* old_pin, uint8 *new_pin, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800397{
398 ATResponse *response = NULL;
399 char cmd[128]={0};
400 int err = 0;
401 int state;
b.liub171c9a2024-11-12 19:23:29 +0800402 if(req_sim_lock_state_get(port, &state, cme_err) || *cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800403 {
404 return -1;
405 }
406
407 if(state == 0) { // Sim lock not open.
b.liub171c9a2024-11-12 19:23:29 +0800408 return req_sim_lock_switch(port, TRUE, new_pin, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800409 } else {// Change password.
410 snprintf(cmd, sizeof(cmd), "AT+CPWD=SC,%s,%s", old_pin, new_pin);
b.liub171c9a2024-11-12 19:23:29 +0800411 err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800412 if (err < 0 || response->success == 0){
413 if(cme_err) {
414 *cme_err = at_get_cme_error(response);
415 }
416 goto exit;
417 }
418 }
419
420exit:
421 at_response_free(response);
422 return err;
423}
424
b.liub171c9a2024-11-12 19:23:29 +0800425static int req_sim_pin_verify(ATPortType_enum port, uint8* pin, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800426{
427 ATResponse *response = NULL;
428 char cmd[64]={0};
429 sprintf(cmd, "AT+CPIN=%s", pin);
b.liub171c9a2024-11-12 19:23:29 +0800430 int err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800431 if (err < 0 || response->success == 0){
432 if(cme_err) {
433 *cme_err = at_get_cme_error(response);
434 }
435 goto exit;
436 }
437
438exit:
439 at_response_free(response);
440 return err;
441}
442
b.liub171c9a2024-11-12 19:23:29 +0800443static int req_sim_puk_verify(ATPortType_enum port, uint8* puk, uint8* pin, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800444{
445 ATResponse *response = NULL;
446 char cmd[64]={0};
447 sprintf(cmd, "AT+CPIN=%s,%s", puk, pin);
b.liub171c9a2024-11-12 19:23:29 +0800448 int err = at_send_command(port, cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800449 if (err < 0 || response->success == 0){
450 if(cme_err) {
451 *cme_err = at_get_cme_error(response);
452 }
453 goto exit;
454 }
455
456exit:
457 at_response_free(response);
458 return err;
459}
460
b.liub171c9a2024-11-12 19:23:29 +0800461static int req_sim_lock_set(ATPortType_enum port, mbtk_sim_lock_info_t *lock_info, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800462{
463 switch(lock_info->type)
464 {
465 case MBTK_SIM_LOCK_TYPE_DISABLE:
466 {
b.liub171c9a2024-11-12 19:23:29 +0800467 return req_sim_lock_switch(port, FALSE, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800468 }
469 case MBTK_SIM_LOCK_TYPE_ENABLE:
470 {
b.liub171c9a2024-11-12 19:23:29 +0800471 return req_sim_lock_switch(port, TRUE, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800472 }
473 case MBTK_SIM_LOCK_TYPE_CHANGE:
474 {
b.liub171c9a2024-11-12 19:23:29 +0800475 return req_sim_pin_change(port, lock_info->pin1, lock_info->pin2, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800476 }
477 case MBTK_SIM_LOCK_TYPE_VERIFY_PIN:
478 {
b.liub171c9a2024-11-12 19:23:29 +0800479 return req_sim_pin_verify(port, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800480 }
481 case MBTK_SIM_LOCK_TYPE_VERIFY_PUK:
482 {
b.liub171c9a2024-11-12 19:23:29 +0800483 return req_sim_puk_verify(port, lock_info->puk, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800484 }
485 default:
486 {
487 LOGE("Unknown type : %d", lock_info->type);
488 break;
489 }
490 }
491
492 return -1;
493}
494
495/*
496AT+EPIN?
497+EPIN: 3,0,10,0
498
499OK
500*/
b.liub171c9a2024-11-12 19:23:29 +0800501static int req_pin_puk_last_times_get(ATPortType_enum port, mbtk_pin_puk_last_times_t *times, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800502{
503 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800504// char *tmp_ptr = NULL;
505 int tmp_int;
b.liub171c9a2024-11-12 19:23:29 +0800506 int err = at_send_command_singleline(port, "AT+EPIN?", "+EPIN:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800507
508 if (err < 0 || response->success == 0 || !response->p_intermediates){
509 *cme_err = at_get_cme_error(response);
510 goto exit;
511 }
512
513 char *line = response->p_intermediates->line;
514 err = at_tok_start(&line);
515 if (err < 0)
516 {
517 goto exit;
518 }
519 mbtk_pin_puk_last_times_t last_times={0};
b.liu62240ee2024-11-07 17:52:45 +0800520 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800521 if (err < 0)
522 {
523 goto exit;
524 }
b.liu62240ee2024-11-07 17:52:45 +0800525 last_times.p1_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800526 times->p1_retry = last_times.p1_retry;
b.liu62240ee2024-11-07 17:52:45 +0800527 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800528 if (err < 0)
529 {
530 goto exit;
531 }
b.liu62240ee2024-11-07 17:52:45 +0800532 last_times.p2_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800533 times->p2_retry = last_times.p2_retry;
b.liu62240ee2024-11-07 17:52:45 +0800534 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800535 if (err < 0)
536 {
537 goto exit;
538 }
b.liu62240ee2024-11-07 17:52:45 +0800539 last_times.puk1_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800540 times->puk1_retry = last_times.puk1_retry;
b.liu62240ee2024-11-07 17:52:45 +0800541 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800542 if (err < 0)
543 {
544 goto exit;
545 }
b.liu62240ee2024-11-07 17:52:45 +0800546 last_times.puk2_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800547 times->puk2_retry = last_times.puk2_retry;
548
549exit:
550 at_response_free(response);
551 return err;
552}
553
b.liu62240ee2024-11-07 17:52:45 +0800554
b.liu87afc4c2024-08-14 17:33:45 +0800555/*
556AT+CPOL?
557*EUICC: 1
558
559OK
560*/
b.liub171c9a2024-11-12 19:23:29 +0800561static int req_plmn_get(ATPortType_enum port, mbtk_plmn_info *info, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800562{
563 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800564// char *tmp_ptr = NULL;
b.liub171c9a2024-11-12 19:23:29 +0800565 int err = at_send_command_multiline(port, "AT+CPOL?", "+CPOL:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800566
567 if (err < 0 || response->success == 0 || !response->p_intermediates){
568 *cme_err = at_get_cme_error(response);
569 goto exit;
570 }
571
572 int mccmnc_type = -1;
573 int count = -1;
574 char *mccmnc_name = NULL;
575 ATLine* lines_ptr = response->p_intermediates;
576 char *line = NULL;
577 while(lines_ptr)
578 {
579 line = lines_ptr->line;
580 //if(strStartsWith(line, "+CPOL:"))
581 {
582 err = at_tok_start(&line);
583 if (err < 0)
584 {
585 goto exit;
586 }
587 err = at_tok_nextint(&line, &count);
588 if (err < 0)
589 {
590 goto exit;
591 }
592 info->count = count;
593
594 err = at_tok_nextint(&line, &mccmnc_type);
595 if (err < 0)
596 {
597 goto exit;
598 }
599 info->plmn[count-1].format = mccmnc_type;
600
601 err = at_tok_nextstr(&line, &mccmnc_name);
602 if (err < 0)
603 {
604 goto exit;
605 }
606 memcpy(info->plmn[count-1].name, mccmnc_name, strlen(mccmnc_name));
607 mccmnc_name = NULL;
608 }
609 lines_ptr = lines_ptr->p_next;
610 }
611
612exit:
613 at_response_free(response);
614 return err;
615}
616
617//void net_list_free(void *data);
618// Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
619// Otherwise, do not call pack_error_send().
620mbtk_ril_err_enum sim_pack_req_process(sock_cli_info_t* cli_info, ril_msg_pack_info_t* pack)
621{
622 mbtk_ril_err_enum err = MBTK_RIL_ERR_SUCCESS;
623 int cme_err = MBTK_RIL_ERR_CME_NON;
624 switch(pack->msg_id)
625 {
626 case RIL_MSG_ID_SIM_STATE:
627 {
628 if(pack->data_len == 0 || pack->data == NULL)
629 {
b.liub171c9a2024-11-12 19:23:29 +0800630 mbtk_sim_state_enum state = ril_sim_state_get(cli_info->port);
b.liu87afc4c2024-08-14 17:33:45 +0800631 if(state == MBTK_SIM_STATE_UNKNOWN)
632 {
633 err = MBTK_RIL_ERR_UNKNOWN;
634 LOG("Get sim state fail.");
635 }
636 else
637 {
b.liub171c9a2024-11-12 19:23:29 +0800638 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &state, sizeof(uint8));
b.liu87afc4c2024-08-14 17:33:45 +0800639 }
640 }
641 else // Set
642 {
643 err = MBTK_RIL_ERR_UNSUPPORTED;
644 LOG("Unsupport set sim state.");
645 }
646 break;
647 }
648 case RIL_MSG_ID_SIM_TYPE:
649 {
650 if(pack->data_len == 0 || pack->data == NULL)
651 {
652 uint8 sim_card_type;
b.liub171c9a2024-11-12 19:23:29 +0800653 if(req_sim_type_get(cli_info->port, &sim_card_type, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800654 {
655 if(cme_err != MBTK_RIL_ERR_CME_NON) {
656 err = MBTK_RIL_ERR_CME + cme_err;
657 } else {
658 err = MBTK_RIL_ERR_UNKNOWN;
659 }
660 LOG("Get IMSI fail.");
661 }
662 else
663 {
b.liub171c9a2024-11-12 19:23:29 +0800664 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &sim_card_type, sizeof(uint8));
b.liu87afc4c2024-08-14 17:33:45 +0800665 }
666 }
667 else // Set
668 {
669 err = MBTK_RIL_ERR_UNSUPPORTED;
670 LOG("Unsupport set sim type.");
671 }
672 break;
673 }
674 case RIL_MSG_ID_SIM_IMSI:
675 {
676 if(pack->data_len == 0 || pack->data == NULL)
677 {
678 char imsi[20] = {0};
b.liub171c9a2024-11-12 19:23:29 +0800679 if(req_imsi_get(cli_info->port, imsi, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800680 {
681 if(cme_err != MBTK_RIL_ERR_CME_NON) {
682 err = MBTK_RIL_ERR_CME + cme_err;
683 } else {
684 err = MBTK_RIL_ERR_UNKNOWN;
685 }
686 LOG("Get IMSI fail.");
687 }
688 else
689 {
b.liub171c9a2024-11-12 19:23:29 +0800690 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, imsi, strlen(imsi));
b.liu87afc4c2024-08-14 17:33:45 +0800691 }
692 }
693 else // Set
694 {
695 err = MBTK_RIL_ERR_UNSUPPORTED;
696 LOG("Unsupport set IMSI.");
697 }
698 break;
699 }
700 case RIL_MSG_ID_SIM_PN:
701 {
702 if(pack->data_len == 0 || pack->data == NULL)
703 {
704 char pn[50] = {0};
b.liub171c9a2024-11-12 19:23:29 +0800705 if(req_phone_number_get(cli_info->port, pn, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800706 {
707 if(cme_err != MBTK_RIL_ERR_CME_NON) {
708 err = MBTK_RIL_ERR_CME + cme_err;
709 } else {
710 err = MBTK_RIL_ERR_UNKNOWN;
711 }
712 LOG("Get PN fail.");
713 }
714 else
715 {
b.liub171c9a2024-11-12 19:23:29 +0800716 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, pn, strlen(pn));
b.liu87afc4c2024-08-14 17:33:45 +0800717 }
718 }
719 else // Set
720 {
721 err = MBTK_RIL_ERR_UNSUPPORTED;
722 LOG("Unsupport set PN.");
723 }
724 break;
725 }
726 case RIL_MSG_ID_SIM_ICCID:
727 {
728 if(pack->data_len == 0 || pack->data == NULL)
729 {
730 char iccid[50] = {0};
b.liub171c9a2024-11-12 19:23:29 +0800731 if(req_iccid_get(cli_info->port, iccid, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800732 {
733 if(cme_err != MBTK_RIL_ERR_CME_NON) {
734 err = MBTK_RIL_ERR_CME + cme_err;
735 } else {
736 err = MBTK_RIL_ERR_UNKNOWN;
737 }
738 LOG("Get ICCID fail.");
739 }
740 else
741 {
b.liub171c9a2024-11-12 19:23:29 +0800742 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, iccid, strlen(iccid));
b.liu87afc4c2024-08-14 17:33:45 +0800743 }
744 }
745 else // Set
746 {
747 err = MBTK_RIL_ERR_UNSUPPORTED;
748 LOG("Unsupport set ICCID.");
749 }
750 break;
751 }
752 case RIL_MSG_ID_SIM_LOCK:
753 {
754 if(pack->data_len == 0 || pack->data == NULL)
755 {
756 int state;
b.liub171c9a2024-11-12 19:23:29 +0800757 if(req_sim_lock_state_get(cli_info->port, &state, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800758 {
759 if(cme_err != MBTK_RIL_ERR_CME_NON) {
760 err = MBTK_RIL_ERR_CME + cme_err;
761 } else {
762 err = MBTK_RIL_ERR_UNKNOWN;
763 }
764 LOG("Get sim lock state fail.");
765 }
766 else
767 {
b.liub171c9a2024-11-12 19:23:29 +0800768 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &state, sizeof(uint8));
b.liu87afc4c2024-08-14 17:33:45 +0800769 }
770 }
771 else // Set
772 {
773 mbtk_sim_lock_info_t *lock_info = (mbtk_sim_lock_info_t*)pack->data;
b.liub171c9a2024-11-12 19:23:29 +0800774 if(req_sim_lock_set(cli_info->port, lock_info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800775 {
776 if(cme_err != MBTK_RIL_ERR_CME_NON) {
777 err = MBTK_RIL_ERR_CME + cme_err;
778 } else {
779 err = MBTK_RIL_ERR_UNKNOWN;
780 }
781 LOG("Set sim lock fail.");
782 }
783 else
784 {
b.liub171c9a2024-11-12 19:23:29 +0800785 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +0800786 }
787 }
788 break;
789 }
790 case RIL_MSG_ID_SIM_PINPUK_TIMES:
791 {
792 if(pack->data_len == 0 || pack->data == NULL)
793 {
794 mbtk_pin_puk_last_times_t last_times;
b.liub171c9a2024-11-12 19:23:29 +0800795 if(req_pin_puk_last_times_get(cli_info->port, &last_times, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800796 {
797 if(cme_err != MBTK_RIL_ERR_CME_NON) {
798 err = MBTK_RIL_ERR_CME + cme_err;
799 } else {
800 err = MBTK_RIL_ERR_UNKNOWN;
801 }
802 LOG("Get PIN/PUK Last times fail.");
803 }
804 else
805 {
b.liub171c9a2024-11-12 19:23:29 +0800806 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &last_times, sizeof(mbtk_pin_puk_last_times_t));
b.liu87afc4c2024-08-14 17:33:45 +0800807 }
808 }
809 else // Set
810 {
811 err = MBTK_RIL_ERR_UNSUPPORTED;
812 LOG("Unsupport set PIN/PUK Last times.");
813 }
814 break;
815 }
816 case RIL_MSG_ID_SIM_PLMN:
817 {
818 if(pack->data_len == 0 || pack->data == NULL)
819 {
820 mbtk_plmn_info info;
821 memset(&info, 0, sizeof(mbtk_plmn_info));
b.liub171c9a2024-11-12 19:23:29 +0800822 if(req_plmn_get(cli_info->port, &info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800823 {
824 if(cme_err != MBTK_RIL_ERR_CME_NON) {
825 err = MBTK_RIL_ERR_CME + cme_err;
826 } else {
827 err = MBTK_RIL_ERR_UNKNOWN;
828 }
829 LOG("Get PLMN list fail.");
830 }
831 else
832 {
b.liub171c9a2024-11-12 19:23:29 +0800833 ril_rsp_pack_send(cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &info, sizeof(mbtk_plmn_info));
b.liu87afc4c2024-08-14 17:33:45 +0800834 }
835 }
836 else // Set
837 {
838 err = MBTK_RIL_ERR_UNSUPPORTED;
839 LOG("Unsupport set PLMN list.");
840 }
841 break;
842 }
843 default:
844 {
845 err = MBTK_RIL_ERR_REQ_UNKNOWN;
846 LOG("Unknown request : %s", id2str(pack->msg_id));
847 break;
848 }
849 }
850
851 return err;
852}
853