blob: 0d06c598e33a1995ad22cbb2f9b9fd8a556f4f22 [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.liu7ca612c2025-04-25 09:23:36 +080020void ril_rsp_pack_send(mbtk_sim_type_enum sim_id, ATPortType_enum port, int fd, int ril_id, int msg_index, const void* data, int data_len);
21ATPortId_enum portType_2_portId(mbtk_sim_type_enum sim_id, ATPortType_enum port);
b.liu87afc4c2024-08-14 17:33:45 +080022
23/** Returns SIM_NOT_READY on error */
b.liu7ca612c2025-04-25 09:23:36 +080024mbtk_sim_state_enum ril_sim_state_get(mbtk_sim_type_enum sim_id, ATPortType_enum port)
b.liu87afc4c2024-08-14 17:33:45 +080025{
26 ATResponse *p_response = NULL;
27 int err;
28 mbtk_sim_state_enum ret = MBTK_SIM_STATE_UNKNOWN;
29 char *cpinLine;
30 char *cpinResult;
31
b.liu7ca612c2025-04-25 09:23:36 +080032 err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+CPIN?", "+CPIN:", &p_response);
b.liu87afc4c2024-08-14 17:33:45 +080033
34 if (err < 0 || p_response->success == 0 || !p_response->p_intermediates)
35 {
q.huang62b4d232025-09-11 14:02:11 +080036 if(err >= 0 && at_get_cme_error(p_response)==CME_SIM_NOT_INSERTED)
37 {
38 ret = MBTK_SIM_STATE_ABSENT;
39 }
40 else
41 {
42 ret = MBTK_SIM_STATE_NOT_READY;
43 }
b.liu87afc4c2024-08-14 17:33:45 +080044 goto done;
45 }
46
q.huang62b4d232025-09-11 14:02:11 +080047
b.liu87afc4c2024-08-14 17:33:45 +080048 /* CPIN? has succeeded, now look at the result */
49
50 cpinLine = p_response->p_intermediates->line;
51 err = at_tok_start (&cpinLine);
52
53 if (err < 0)
54 {
55 ret = MBTK_SIM_STATE_NOT_READY;
56 goto done;
57 }
58
59 err = at_tok_nextstr(&cpinLine, &cpinResult);
60
61 if (err < 0)
62 {
63 ret = MBTK_SIM_STATE_NOT_READY;
64 goto done;
65 }
66
67 if (0 == strcmp (cpinResult, "SIM PIN"))
68 {
69 ret = MBTK_SIM_STATE_SIM_PIN;
70 }
71 else if (0 == strcmp (cpinResult, "SIM PUK"))
72 {
73 ret = MBTK_SIM_STATE_SIM_PUK;
74 }
75 else if (0 == strcmp (cpinResult, "PH-SIMLOCK PIN"))
76 {
77 ret = MBTK_SIM_STATE_PH_SIMLOCK_PIN;
78 }
79 else if (0 == strcmp (cpinResult, "PH-SIMLOCK PIN"))
80 {
81 ret = MBTK_SIM_STATE_PH_SIMLOCK_PUK;
82 }
83 else if (0 == strcmp (cpinResult, "PH-FSIM PIN"))
84 {
85 ret = MBTK_SIM_STATE_PH_FSIM_PIN;
86 }
87 else if (0 == strcmp (cpinResult, "PH-FSIM PUK"))
88 {
89 ret = MBTK_SIM_STATE_PH_FSIM_PUK;
90 }
91 else if (0 == strcmp (cpinResult, "SIM PIN2"))
92 {
93 ret = MBTK_SIM_STATE_SIM_PIN2;
94 }
95 else if (0 == strcmp (cpinResult, "SIM PUK2"))
96 {
97 ret = MBTK_SIM_STATE_SIM_PUK2;
98 }
99 else if (0 == strcmp (cpinResult, "PH-NET PIN"))
100 {
101 ret = MBTK_SIM_STATE_PH_NET_PIN;
102 }
103 else if (0 == strcmp (cpinResult, "PH-NET PUK"))
104 {
105 ret = MBTK_SIM_STATE_PH_NET_PUK;
106 }
107 else if (0 == strcmp (cpinResult, "PH-NETSUB PIN"))
108 {
109 ret = MBTK_SIM_STATE_PH_NETSUB_PIN;
110 }
111 else if (0 == strcmp (cpinResult, "PH-NETSUB PUK"))
112 {
113 ret = MBTK_SIM_STATE_PH_NETSUB_PUK;
114 }
115 else if (0 == strcmp (cpinResult, "PH-SP PIN"))
116 {
117 ret = MBTK_SIM_STATE_PH_SP_PIN;
118 }
119 else if (0 == strcmp (cpinResult, "PH-SP PUK"))
120 {
121 ret = MBTK_SIM_STATE_PH_SP_PUK;
122 }
123 else if (0 == strcmp (cpinResult, "PH-CORP PIN"))
124 {
125 ret = MBTK_SIM_STATE_PH_CORP_PIN;
126 }
127 else if (0 == strcmp (cpinResult, "PH-CORP PUK"))
128 {
129 ret = MBTK_SIM_STATE_PH_CORP_PUK;
130 }
131 else if (0 == strcmp (cpinResult, "READY"))
132 {
133 ret = MBTK_SIM_STATE_READY;
134 } else {
135 ret = MBTK_SIM_STATE_ABSENT;
136 }
137
138done:
139 at_response_free(p_response);
140 p_response = NULL;
141 cpinResult = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800142 ril_info.sim_state[sim_id] = ret;
b.liu87afc4c2024-08-14 17:33:45 +0800143 return ret;
144}
145
146/*
147AT*EUICC?
148*EUICC: 1
149
150OK
151*/
b.liu7ca612c2025-04-25 09:23:36 +0800152static int req_sim_type_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, uint8 *type, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800153{
154 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800155// char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800156 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT*EUICC?", "*EUICC:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800157
158 if (err < 0 || response->success == 0 || !response->p_intermediates){
159 *cme_err = at_get_cme_error(response);
160 goto exit;
161 }
162
163 char *line = response->p_intermediates->line;
164 err = at_tok_start(&line);
165 if (err < 0)
166 {
167 goto exit;
168 }
169 int sim_card_type = -1;
170 err = at_tok_nextint(&line, &sim_card_type);
171 if (err < 0)
172 {
173 goto exit;
174 }
175 if(sim_card_type != -1)
176 *type = sim_card_type;
177 goto exit;
178exit:
179 at_response_free(response);
180 return err;
181}
182
183/*
184AT+ICCID
185+ICCID: 89860621330065648041
186
187OK
188*/
b.liu7ca612c2025-04-25 09:23:36 +0800189static int req_iccid_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, void *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800190{
191 ATResponse *response = NULL;
192 char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800193 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+ICCID", "+ICCID:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800194
195 if (err < 0 || response->success == 0 || !response->p_intermediates){
196 *cme_err = at_get_cme_error(response);
197 goto exit;
198 }
199
200 char *line = response->p_intermediates->line;
201 err = at_tok_start(&line);
202 if (err < 0)
203 {
204 goto exit;
205 }
206
207 err = at_tok_nextstr(&line, &tmp_ptr);
208 if (err < 0)
209 {
210 goto exit;
211 }
212
213 memcpy(data, tmp_ptr, strlen(tmp_ptr));
214exit:
215 at_response_free(response);
216 return err;
217}
218
219/*
220AT+CNUM?
221+CNUM: "","13980414101",129
222
223OK
224
225*/
b.liu7ca612c2025-04-25 09:23:36 +0800226static int req_phone_number_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, void *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800227{
228 ATResponse *response = NULL;
229 char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800230 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+CNUM?", "+CNUM:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800231 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
232 if(response) {
233 *cme_err = at_get_cme_error(response);
234 }
235 LOGD("AT+CNUM? fail.");
236 goto exit;
237 }
238
239 char *line = response->p_intermediates->line;
240 if(line == NULL) {
241 LOGD("line is NULL");
242 goto exit;
243 }
244 err = at_tok_start(&line);
245 if (err < 0)
246 {
247 goto exit;
248 }
249
250 err = at_tok_nextstr(&line, &tmp_ptr);
251 if (err < 0)
252 {
253 goto exit;
254 }
255
256 err = at_tok_nextstr(&line, &tmp_ptr);
257 if (err < 0)
258 {
259 goto exit;
260 }
261
262 memcpy(data, tmp_ptr, strlen(tmp_ptr));
263exit:
264 at_response_free(response);
265 return err;
266}
267
268
269/*
270AT+CIMI
271460068103383304
272
273OK
274
275*/
b.liu7ca612c2025-04-25 09:23:36 +0800276static int req_imsi_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, void *data, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800277{
278 ATResponse *response = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800279 int err = at_send_command_numeric(portType_2_portId(sim_id, port), "AT+CIMI", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800280
281 if (err < 0 || response->success == 0 || !response->p_intermediates){
282 *cme_err = at_get_cme_error(response);
283 goto exit;
284 }
285
286 memcpy(data, response->p_intermediates->line, strlen(response->p_intermediates->line));
287exit:
288 at_response_free(response);
289 return err;
290}
291
b.liu7ca612c2025-04-25 09:23:36 +0800292static int req_sim_lock_state_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, int *state, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800293{
294 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800295// char cmd[64]={0};
b.liu87afc4c2024-08-14 17:33:45 +0800296
b.liu7ca612c2025-04-25 09:23:36 +0800297 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+CLCK=SC,2", "+CLCK:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800298 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
299 if(response) {
300 *cme_err = at_get_cme_error(response);
301 }
302 LOGD("AT+CLCK fail.");
303 goto exit;
304 }
305
306 char *line = response->p_intermediates->line;
307 if(line == NULL) {
308 LOGD("line is NULL");
309 goto exit;
310 }
311 err = at_tok_start(&line);
312 if (err < 0)
313 {
314 goto exit;
315 }
316 err = at_tok_nextint(&line, state);
317 if (err < 0)
318 {
319 goto exit;
320 }
321
322exit:
323 at_response_free(response);
324 return err;
325}
326
327/*
328*
329AT+CLCK=SC,0,1234
330+CLCK: 0
331
332OK
333
334AT+CLCK=SC,1,1234
335+CLCK: 1
336
337OK
338
339*
340*/
b.liu7ca612c2025-04-25 09:23:36 +0800341static int req_sim_lock_switch(mbtk_sim_type_enum sim_id, ATPortType_enum port, bool enable, uint8* pin, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800342{
343 ATResponse *response = NULL;
344 char cmd[64]={0};
345 snprintf(cmd, sizeof(cmd), "AT+CLCK=SC,%d,%s", enable ? 1 : 0, pin);
b.liu7ca612c2025-04-25 09:23:36 +0800346 int err = at_send_command_singleline(portType_2_portId(sim_id, port), cmd, "+CLCK:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800347 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
348 if(response) {
349 *cme_err = at_get_cme_error(response);
350 }
351 LOGD("AT+CLCK fail.");
352 goto exit;
353 }
354
355 int ret;
356 char *line = response->p_intermediates->line;
357 if(line == NULL) {
358 LOGD("line is NULL");
359 goto exit;
360 }
361 err = at_tok_start(&line);
362 if (err < 0)
363 {
364 goto exit;
365 }
366 err = at_tok_nextint(&line, &ret);
367 if (err < 0)
368 {
369 goto exit;
370 }
371
372 if(enable) {
373 if(ret != 1) {
374 LOGW("+CLCK not 1.");
375 err = -1;
376 goto exit;
377 }
378 } else {
379 if(ret != 0) {
380 LOGW("+CLCK not 0.");
381 err = -1;
382 goto exit;
383 }
384 }
385
386exit:
387 at_response_free(response);
388 return err;
389}
390
b.liu7ca612c2025-04-25 09:23:36 +0800391static int req_sim_pin_change(mbtk_sim_type_enum sim_id, ATPortType_enum port, uint8* old_pin, uint8 *new_pin, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800392{
393 ATResponse *response = NULL;
394 char cmd[128]={0};
395 int err = 0;
396 int state;
b.liu7ca612c2025-04-25 09:23:36 +0800397 if(req_sim_lock_state_get(sim_id, port, &state, cme_err) || *cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800398 {
399 return -1;
400 }
401
402 if(state == 0) { // Sim lock not open.
b.liu7ca612c2025-04-25 09:23:36 +0800403 return req_sim_lock_switch(sim_id, port, TRUE, new_pin, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800404 } else {// Change password.
405 snprintf(cmd, sizeof(cmd), "AT+CPWD=SC,%s,%s", old_pin, new_pin);
b.liu7ca612c2025-04-25 09:23:36 +0800406 err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800407 if (err < 0 || response->success == 0){
408 if(cme_err) {
409 *cme_err = at_get_cme_error(response);
410 }
411 goto exit;
412 }
413 }
414
415exit:
416 at_response_free(response);
417 return err;
418}
419
b.liu7ca612c2025-04-25 09:23:36 +0800420static int req_sim_pin_verify(mbtk_sim_type_enum sim_id, ATPortType_enum port, uint8* pin, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800421{
422 ATResponse *response = NULL;
423 char cmd[64]={0};
424 sprintf(cmd, "AT+CPIN=%s", pin);
b.liu7ca612c2025-04-25 09:23:36 +0800425 int err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800426 if (err < 0 || response->success == 0){
427 if(cme_err) {
428 *cme_err = at_get_cme_error(response);
429 }
430 goto exit;
431 }
432
433exit:
434 at_response_free(response);
435 return err;
436}
437
b.liu7ca612c2025-04-25 09:23:36 +0800438static int req_sim_puk_verify(mbtk_sim_type_enum sim_id, ATPortType_enum port, uint8* puk, uint8* pin, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800439{
440 ATResponse *response = NULL;
441 char cmd[64]={0};
442 sprintf(cmd, "AT+CPIN=%s,%s", puk, pin);
b.liu7ca612c2025-04-25 09:23:36 +0800443 int err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800444 if (err < 0 || response->success == 0){
445 if(cme_err) {
446 *cme_err = at_get_cme_error(response);
447 }
448 goto exit;
449 }
450
451exit:
452 at_response_free(response);
453 return err;
454}
455
b.liu7ca612c2025-04-25 09:23:36 +0800456static int req_sim_lock_set(mbtk_sim_type_enum sim_id, ATPortType_enum port, mbtk_sim_lock_info_t *lock_info, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800457{
458 switch(lock_info->type)
459 {
460 case MBTK_SIM_LOCK_TYPE_DISABLE:
461 {
b.liu7ca612c2025-04-25 09:23:36 +0800462 return req_sim_lock_switch(sim_id, port, FALSE, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800463 }
464 case MBTK_SIM_LOCK_TYPE_ENABLE:
465 {
b.liu7ca612c2025-04-25 09:23:36 +0800466 return req_sim_lock_switch(sim_id, port, TRUE, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800467 }
468 case MBTK_SIM_LOCK_TYPE_CHANGE:
469 {
b.liu7ca612c2025-04-25 09:23:36 +0800470 return req_sim_pin_change(sim_id, port, lock_info->pin1, lock_info->pin2, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800471 }
472 case MBTK_SIM_LOCK_TYPE_VERIFY_PIN:
473 {
b.liu7ca612c2025-04-25 09:23:36 +0800474 return req_sim_pin_verify(sim_id, port, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800475 }
476 case MBTK_SIM_LOCK_TYPE_VERIFY_PUK:
477 {
b.liu7ca612c2025-04-25 09:23:36 +0800478 return req_sim_puk_verify(sim_id, port, lock_info->puk, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800479 }
480 default:
481 {
482 LOGE("Unknown type : %d", lock_info->type);
483 break;
484 }
485 }
486
487 return -1;
488}
489
490/*
491AT+EPIN?
492+EPIN: 3,0,10,0
493
494OK
495*/
b.liu7ca612c2025-04-25 09:23:36 +0800496static int req_pin_puk_last_times_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, mbtk_pin_puk_last_times_t *times, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800497{
498 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800499// char *tmp_ptr = NULL;
500 int tmp_int;
b.liu7ca612c2025-04-25 09:23:36 +0800501 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+EPIN?", "+EPIN:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800502
503 if (err < 0 || response->success == 0 || !response->p_intermediates){
504 *cme_err = at_get_cme_error(response);
505 goto exit;
506 }
507
508 char *line = response->p_intermediates->line;
509 err = at_tok_start(&line);
510 if (err < 0)
511 {
512 goto exit;
513 }
514 mbtk_pin_puk_last_times_t last_times={0};
b.liu62240ee2024-11-07 17:52:45 +0800515 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800516 if (err < 0)
517 {
518 goto exit;
519 }
b.liu62240ee2024-11-07 17:52:45 +0800520 last_times.p1_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800521 times->p1_retry = last_times.p1_retry;
b.liu62240ee2024-11-07 17:52:45 +0800522 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800523 if (err < 0)
524 {
525 goto exit;
526 }
b.liu62240ee2024-11-07 17:52:45 +0800527 last_times.p2_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800528 times->p2_retry = last_times.p2_retry;
b.liu62240ee2024-11-07 17:52:45 +0800529 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800530 if (err < 0)
531 {
532 goto exit;
533 }
b.liu62240ee2024-11-07 17:52:45 +0800534 last_times.puk1_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800535 times->puk1_retry = last_times.puk1_retry;
b.liu62240ee2024-11-07 17:52:45 +0800536 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800537 if (err < 0)
538 {
539 goto exit;
540 }
b.liu62240ee2024-11-07 17:52:45 +0800541 last_times.puk2_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800542 times->puk2_retry = last_times.puk2_retry;
543
544exit:
545 at_response_free(response);
546 return err;
547}
548
b.liu62240ee2024-11-07 17:52:45 +0800549
b.liu87afc4c2024-08-14 17:33:45 +0800550/*
551AT+CPOL?
552*EUICC: 1
553
554OK
555*/
b.liu7ca612c2025-04-25 09:23:36 +0800556static int req_plmn_get(mbtk_sim_type_enum sim_id, ATPortType_enum port, mbtk_plmn_info *info, int *cme_err)
b.liu87afc4c2024-08-14 17:33:45 +0800557{
558 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800559// char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800560 int err = at_send_command_multiline(portType_2_portId(sim_id, port), "AT+CPOL?", "+CPOL:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800561
562 if (err < 0 || response->success == 0 || !response->p_intermediates){
563 *cme_err = at_get_cme_error(response);
564 goto exit;
565 }
566
567 int mccmnc_type = -1;
568 int count = -1;
569 char *mccmnc_name = NULL;
570 ATLine* lines_ptr = response->p_intermediates;
571 char *line = NULL;
572 while(lines_ptr)
573 {
574 line = lines_ptr->line;
575 //if(strStartsWith(line, "+CPOL:"))
576 {
577 err = at_tok_start(&line);
578 if (err < 0)
579 {
580 goto exit;
581 }
582 err = at_tok_nextint(&line, &count);
583 if (err < 0)
584 {
585 goto exit;
586 }
587 info->count = count;
588
589 err = at_tok_nextint(&line, &mccmnc_type);
590 if (err < 0)
591 {
592 goto exit;
593 }
594 info->plmn[count-1].format = mccmnc_type;
595
596 err = at_tok_nextstr(&line, &mccmnc_name);
597 if (err < 0)
598 {
599 goto exit;
600 }
601 memcpy(info->plmn[count-1].name, mccmnc_name, strlen(mccmnc_name));
602 mccmnc_name = NULL;
603 }
604 lines_ptr = lines_ptr->p_next;
605 }
606
607exit:
608 at_response_free(response);
609 return err;
610}
611
b.liu7ca612c2025-04-25 09:23:36 +0800612/*
613>AT+SWITCHSIM?
614<+SWITCHSIM: 0
615
616<OK
617*/
618int req_dual_sim_get(ATPortType_enum port, mbtk_sim_type_enum *sim_id, int *cme_err)
619{
620 ATResponse *response = NULL;
621// char *tmp_ptr = NULL;
622 int err = at_send_command_singleline(portType_2_portId(MBTK_SIM_1, port), "AT+SWITCHSIM?", "+SWITCHSIM:", &response);
623
624 if (err < 0 || response->success == 0 || !response->p_intermediates){
625 if(cme_err) {
626 *cme_err = at_get_cme_error(response);
627 }
628 goto exit;
629 }
630
631 char *line = response->p_intermediates->line;
632 err = at_tok_start(&line);
633 if (err < 0)
634 {
635 goto exit;
636 }
637 int tmp_int = -1;
638 err = at_tok_nextint(&line, &tmp_int);
639 if (err < 0)
640 {
641 goto exit;
642 }
643 if(tmp_int != -1)
644 *sim_id = tmp_int;
645 goto exit;
646exit:
647 at_response_free(response);
648 return err;
649}
650
651/*
652>AT+SWITCHSIM?
653<+SWITCHSIM: 0
654
655<OK
656*/
657static int req_dual_sim_set(ATPortType_enum port, mbtk_sim_type_enum sim_id, int *cme_err)
658{
659 int err = -1;
660 ATResponse *response = NULL;
661
662 char cmd[64] = {0};
663 snprintf(cmd, sizeof(cmd), "AT+SWITCHSIM=%d", sim_id);
664 err = at_send_command(portType_2_portId(MBTK_SIM_1, port), cmd, &response);
665 if (err < 0 || response->success == 0){
666 *cme_err = at_get_cme_error(response);
667 goto exit;
668 }
669
670exit:
671 at_response_free(response);
672 return err;
673}
674
b.liu87afc4c2024-08-14 17:33:45 +0800675//void net_list_free(void *data);
676// Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
677// Otherwise, do not call pack_error_send().
678mbtk_ril_err_enum sim_pack_req_process(sock_cli_info_t* cli_info, ril_msg_pack_info_t* pack)
679{
680 mbtk_ril_err_enum err = MBTK_RIL_ERR_SUCCESS;
681 int cme_err = MBTK_RIL_ERR_CME_NON;
682 switch(pack->msg_id)
683 {
684 case RIL_MSG_ID_SIM_STATE:
685 {
686 if(pack->data_len == 0 || pack->data == NULL)
687 {
b.liu7ca612c2025-04-25 09:23:36 +0800688 mbtk_sim_state_enum state = ril_sim_state_get(cli_info->sim_id, cli_info->port);
b.liu87afc4c2024-08-14 17:33:45 +0800689 if(state == MBTK_SIM_STATE_UNKNOWN)
690 {
691 err = MBTK_RIL_ERR_UNKNOWN;
692 LOG("Get sim state fail.");
693 }
694 else
695 {
b.liu7ca612c2025-04-25 09:23:36 +0800696 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &state, sizeof(uint8));
b.liu87afc4c2024-08-14 17:33:45 +0800697 }
698 }
699 else // Set
700 {
701 err = MBTK_RIL_ERR_UNSUPPORTED;
702 LOG("Unsupport set sim state.");
703 }
704 break;
705 }
706 case RIL_MSG_ID_SIM_TYPE:
707 {
708 if(pack->data_len == 0 || pack->data == NULL)
709 {
710 uint8 sim_card_type;
b.liu7ca612c2025-04-25 09:23:36 +0800711 if(req_sim_type_get(cli_info->sim_id, cli_info->port, &sim_card_type, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800712 {
713 if(cme_err != MBTK_RIL_ERR_CME_NON) {
714 err = MBTK_RIL_ERR_CME + cme_err;
715 } else {
716 err = MBTK_RIL_ERR_UNKNOWN;
717 }
718 LOG("Get IMSI fail.");
719 }
720 else
721 {
b.liu7ca612c2025-04-25 09:23:36 +0800722 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &sim_card_type, sizeof(uint8));
b.liu87afc4c2024-08-14 17:33:45 +0800723 }
724 }
725 else // Set
726 {
727 err = MBTK_RIL_ERR_UNSUPPORTED;
728 LOG("Unsupport set sim type.");
729 }
730 break;
731 }
732 case RIL_MSG_ID_SIM_IMSI:
733 {
734 if(pack->data_len == 0 || pack->data == NULL)
735 {
736 char imsi[20] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800737 if(req_imsi_get(cli_info->sim_id, cli_info->port, imsi, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800738 {
739 if(cme_err != MBTK_RIL_ERR_CME_NON) {
740 err = MBTK_RIL_ERR_CME + cme_err;
741 } else {
742 err = MBTK_RIL_ERR_UNKNOWN;
743 }
744 LOG("Get IMSI fail.");
745 }
746 else
747 {
b.liu7ca612c2025-04-25 09:23:36 +0800748 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, imsi, strlen(imsi));
b.liu87afc4c2024-08-14 17:33:45 +0800749 }
750 }
751 else // Set
752 {
753 err = MBTK_RIL_ERR_UNSUPPORTED;
754 LOG("Unsupport set IMSI.");
755 }
756 break;
757 }
758 case RIL_MSG_ID_SIM_PN:
759 {
760 if(pack->data_len == 0 || pack->data == NULL)
761 {
762 char pn[50] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800763 if(req_phone_number_get(cli_info->sim_id, cli_info->port, pn, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800764 {
765 if(cme_err != MBTK_RIL_ERR_CME_NON) {
766 err = MBTK_RIL_ERR_CME + cme_err;
767 } else {
768 err = MBTK_RIL_ERR_UNKNOWN;
769 }
770 LOG("Get PN fail.");
771 }
772 else
773 {
b.liu7ca612c2025-04-25 09:23:36 +0800774 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, pn, strlen(pn));
b.liu87afc4c2024-08-14 17:33:45 +0800775 }
776 }
777 else // Set
778 {
779 err = MBTK_RIL_ERR_UNSUPPORTED;
780 LOG("Unsupport set PN.");
781 }
782 break;
783 }
784 case RIL_MSG_ID_SIM_ICCID:
785 {
786 if(pack->data_len == 0 || pack->data == NULL)
787 {
788 char iccid[50] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800789 if(req_iccid_get(cli_info->sim_id, cli_info->port, iccid, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800790 {
791 if(cme_err != MBTK_RIL_ERR_CME_NON) {
792 err = MBTK_RIL_ERR_CME + cme_err;
793 } else {
794 err = MBTK_RIL_ERR_UNKNOWN;
795 }
796 LOG("Get ICCID fail.");
797 }
798 else
799 {
b.liu7ca612c2025-04-25 09:23:36 +0800800 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, iccid, strlen(iccid));
b.liu87afc4c2024-08-14 17:33:45 +0800801 }
802 }
803 else // Set
804 {
805 err = MBTK_RIL_ERR_UNSUPPORTED;
806 LOG("Unsupport set ICCID.");
807 }
808 break;
809 }
810 case RIL_MSG_ID_SIM_LOCK:
811 {
812 if(pack->data_len == 0 || pack->data == NULL)
813 {
814 int state;
b.liu7ca612c2025-04-25 09:23:36 +0800815 if(req_sim_lock_state_get(cli_info->sim_id, cli_info->port, &state, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800816 {
817 if(cme_err != MBTK_RIL_ERR_CME_NON) {
818 err = MBTK_RIL_ERR_CME + cme_err;
819 } else {
820 err = MBTK_RIL_ERR_UNKNOWN;
821 }
822 LOG("Get sim lock state fail.");
823 }
824 else
825 {
b.liu7ca612c2025-04-25 09:23:36 +0800826 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &state, sizeof(uint8));
b.liu87afc4c2024-08-14 17:33:45 +0800827 }
828 }
829 else // Set
830 {
831 mbtk_sim_lock_info_t *lock_info = (mbtk_sim_lock_info_t*)pack->data;
b.liu7ca612c2025-04-25 09:23:36 +0800832 if(req_sim_lock_set(cli_info->sim_id, cli_info->port, lock_info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800833 {
834 if(cme_err != MBTK_RIL_ERR_CME_NON) {
835 err = MBTK_RIL_ERR_CME + cme_err;
836 } else {
837 err = MBTK_RIL_ERR_UNKNOWN;
838 }
839 LOG("Set sim lock fail.");
840 }
841 else
842 {
b.liu7ca612c2025-04-25 09:23:36 +0800843 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
b.liu87afc4c2024-08-14 17:33:45 +0800844 }
845 }
846 break;
847 }
848 case RIL_MSG_ID_SIM_PINPUK_TIMES:
849 {
850 if(pack->data_len == 0 || pack->data == NULL)
851 {
852 mbtk_pin_puk_last_times_t last_times;
b.liu7ca612c2025-04-25 09:23:36 +0800853 if(req_pin_puk_last_times_get(cli_info->sim_id, cli_info->port, &last_times, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800854 {
855 if(cme_err != MBTK_RIL_ERR_CME_NON) {
856 err = MBTK_RIL_ERR_CME + cme_err;
857 } else {
858 err = MBTK_RIL_ERR_UNKNOWN;
859 }
860 LOG("Get PIN/PUK Last times fail.");
861 }
862 else
863 {
b.liu7ca612c2025-04-25 09:23:36 +0800864 ril_rsp_pack_send(cli_info->sim_id, 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 +0800865 }
866 }
867 else // Set
868 {
869 err = MBTK_RIL_ERR_UNSUPPORTED;
870 LOG("Unsupport set PIN/PUK Last times.");
871 }
872 break;
873 }
874 case RIL_MSG_ID_SIM_PLMN:
875 {
876 if(pack->data_len == 0 || pack->data == NULL)
877 {
878 mbtk_plmn_info info;
879 memset(&info, 0, sizeof(mbtk_plmn_info));
b.liu7ca612c2025-04-25 09:23:36 +0800880 if(req_plmn_get(cli_info->sim_id, cli_info->port, &info, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
b.liu87afc4c2024-08-14 17:33:45 +0800881 {
882 if(cme_err != MBTK_RIL_ERR_CME_NON) {
883 err = MBTK_RIL_ERR_CME + cme_err;
884 } else {
885 err = MBTK_RIL_ERR_UNKNOWN;
886 }
887 LOG("Get PLMN list fail.");
888 }
889 else
890 {
b.liu7ca612c2025-04-25 09:23:36 +0800891 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &info, sizeof(mbtk_plmn_info));
b.liu87afc4c2024-08-14 17:33:45 +0800892 }
893 }
894 else // Set
895 {
896 err = MBTK_RIL_ERR_UNSUPPORTED;
897 LOG("Unsupport set PLMN list.");
898 }
899 break;
900 }
b.liu7ca612c2025-04-25 09:23:36 +0800901 case RIL_MSG_ID_SIM_SWITCH:
902 {
903 if(pack->data_len == 0 || pack->data == NULL)
904 {
905 mbtk_sim_type_enum sim_id;
906 if(req_dual_sim_get(cli_info->port, &sim_id, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
907 {
908 if(cme_err != MBTK_RIL_ERR_CME_NON) {
909 err = MBTK_RIL_ERR_CME + cme_err;
910 } else {
911 err = MBTK_RIL_ERR_UNKNOWN;
912 }
913 LOG("Get SWITCHSIM fail.");
914 }
915 else
916 {
917 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &sim_id, sizeof(mbtk_sim_type_enum));
918 }
919 }
920 else // Set
921 {
922 mbtk_sim_type_enum *sim_id = (mbtk_sim_type_enum*)pack->data;
923 if(req_dual_sim_set(cli_info->port, *sim_id, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
924 {
925 if(cme_err != MBTK_RIL_ERR_CME_NON) {
926 err = MBTK_RIL_ERR_CME + cme_err;
927 } else {
928 err = MBTK_RIL_ERR_UNKNOWN;
929 }
930 LOG("Set SWITCHSIM fail.");
931 }
932 else
933 {
934 ril_info.cur_sim_id = *sim_id;
935 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
936 }
937 }
938 break;
939 }
b.liu87afc4c2024-08-14 17:33:45 +0800940 default:
941 {
942 err = MBTK_RIL_ERR_REQ_UNKNOWN;
943 LOG("Unknown request : %s", id2str(pack->msg_id));
944 break;
945 }
946 }
947
948 return err;
949}
950