blob: a0fc554c25406bad11cb9e6e80de2974c504d444 [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 {
36 ret = MBTK_SIM_STATE_NOT_READY;
37 goto done;
38 }
39
40 switch (at_get_cme_error(p_response))
41 {
42 case CME_SUCCESS:
43 break;
44
45 case CME_SIM_NOT_INSERTED:
46 ret = MBTK_SIM_STATE_ABSENT;
47 goto done;
48
49 default:
50 ret = MBTK_SIM_STATE_NOT_READY;
51 goto done;
52 }
53
54 /* CPIN? has succeeded, now look at the result */
55
56 cpinLine = p_response->p_intermediates->line;
57 err = at_tok_start (&cpinLine);
58
59 if (err < 0)
60 {
61 ret = MBTK_SIM_STATE_NOT_READY;
62 goto done;
63 }
64
65 err = at_tok_nextstr(&cpinLine, &cpinResult);
66
67 if (err < 0)
68 {
69 ret = MBTK_SIM_STATE_NOT_READY;
70 goto done;
71 }
72
73 if (0 == strcmp (cpinResult, "SIM PIN"))
74 {
75 ret = MBTK_SIM_STATE_SIM_PIN;
76 }
77 else if (0 == strcmp (cpinResult, "SIM PUK"))
78 {
79 ret = MBTK_SIM_STATE_SIM_PUK;
80 }
81 else if (0 == strcmp (cpinResult, "PH-SIMLOCK PIN"))
82 {
83 ret = MBTK_SIM_STATE_PH_SIMLOCK_PIN;
84 }
85 else if (0 == strcmp (cpinResult, "PH-SIMLOCK PIN"))
86 {
87 ret = MBTK_SIM_STATE_PH_SIMLOCK_PUK;
88 }
89 else if (0 == strcmp (cpinResult, "PH-FSIM PIN"))
90 {
91 ret = MBTK_SIM_STATE_PH_FSIM_PIN;
92 }
93 else if (0 == strcmp (cpinResult, "PH-FSIM PUK"))
94 {
95 ret = MBTK_SIM_STATE_PH_FSIM_PUK;
96 }
97 else if (0 == strcmp (cpinResult, "SIM PIN2"))
98 {
99 ret = MBTK_SIM_STATE_SIM_PIN2;
100 }
101 else if (0 == strcmp (cpinResult, "SIM PUK2"))
102 {
103 ret = MBTK_SIM_STATE_SIM_PUK2;
104 }
105 else if (0 == strcmp (cpinResult, "PH-NET PIN"))
106 {
107 ret = MBTK_SIM_STATE_PH_NET_PIN;
108 }
109 else if (0 == strcmp (cpinResult, "PH-NET PUK"))
110 {
111 ret = MBTK_SIM_STATE_PH_NET_PUK;
112 }
113 else if (0 == strcmp (cpinResult, "PH-NETSUB PIN"))
114 {
115 ret = MBTK_SIM_STATE_PH_NETSUB_PIN;
116 }
117 else if (0 == strcmp (cpinResult, "PH-NETSUB PUK"))
118 {
119 ret = MBTK_SIM_STATE_PH_NETSUB_PUK;
120 }
121 else if (0 == strcmp (cpinResult, "PH-SP PIN"))
122 {
123 ret = MBTK_SIM_STATE_PH_SP_PIN;
124 }
125 else if (0 == strcmp (cpinResult, "PH-SP PUK"))
126 {
127 ret = MBTK_SIM_STATE_PH_SP_PUK;
128 }
129 else if (0 == strcmp (cpinResult, "PH-CORP PIN"))
130 {
131 ret = MBTK_SIM_STATE_PH_CORP_PIN;
132 }
133 else if (0 == strcmp (cpinResult, "PH-CORP PUK"))
134 {
135 ret = MBTK_SIM_STATE_PH_CORP_PUK;
136 }
137 else if (0 == strcmp (cpinResult, "READY"))
138 {
139 ret = MBTK_SIM_STATE_READY;
140 } else {
141 ret = MBTK_SIM_STATE_ABSENT;
142 }
143
144done:
145 at_response_free(p_response);
146 p_response = NULL;
147 cpinResult = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800148 ril_info.sim_state[sim_id] = ret;
b.liu87afc4c2024-08-14 17:33:45 +0800149 return ret;
150}
151
152/*
153AT*EUICC?
154*EUICC: 1
155
156OK
157*/
b.liu7ca612c2025-04-25 09:23:36 +0800158static 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 +0800159{
160 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800161// char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800162 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT*EUICC?", "*EUICC:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800163
164 if (err < 0 || response->success == 0 || !response->p_intermediates){
165 *cme_err = at_get_cme_error(response);
166 goto exit;
167 }
168
169 char *line = response->p_intermediates->line;
170 err = at_tok_start(&line);
171 if (err < 0)
172 {
173 goto exit;
174 }
175 int sim_card_type = -1;
176 err = at_tok_nextint(&line, &sim_card_type);
177 if (err < 0)
178 {
179 goto exit;
180 }
181 if(sim_card_type != -1)
182 *type = sim_card_type;
183 goto exit;
184exit:
185 at_response_free(response);
186 return err;
187}
188
189/*
190AT+ICCID
191+ICCID: 89860621330065648041
192
193OK
194*/
b.liu7ca612c2025-04-25 09:23:36 +0800195static 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 +0800196{
197 ATResponse *response = NULL;
198 char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800199 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+ICCID", "+ICCID:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800200
201 if (err < 0 || response->success == 0 || !response->p_intermediates){
202 *cme_err = at_get_cme_error(response);
203 goto exit;
204 }
205
206 char *line = response->p_intermediates->line;
207 err = at_tok_start(&line);
208 if (err < 0)
209 {
210 goto exit;
211 }
212
213 err = at_tok_nextstr(&line, &tmp_ptr);
214 if (err < 0)
215 {
216 goto exit;
217 }
218
219 memcpy(data, tmp_ptr, strlen(tmp_ptr));
220exit:
221 at_response_free(response);
222 return err;
223}
224
225/*
226AT+CNUM?
227+CNUM: "","13980414101",129
228
229OK
230
231*/
b.liu7ca612c2025-04-25 09:23:36 +0800232static 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 +0800233{
234 ATResponse *response = NULL;
235 char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800236 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+CNUM?", "+CNUM:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800237 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
238 if(response) {
239 *cme_err = at_get_cme_error(response);
240 }
241 LOGD("AT+CNUM? fail.");
242 goto exit;
243 }
244
245 char *line = response->p_intermediates->line;
246 if(line == NULL) {
247 LOGD("line is NULL");
248 goto exit;
249 }
250 err = at_tok_start(&line);
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 err = at_tok_nextstr(&line, &tmp_ptr);
263 if (err < 0)
264 {
265 goto exit;
266 }
267
268 memcpy(data, tmp_ptr, strlen(tmp_ptr));
269exit:
270 at_response_free(response);
271 return err;
272}
273
274
275/*
276AT+CIMI
277460068103383304
278
279OK
280
281*/
b.liu7ca612c2025-04-25 09:23:36 +0800282static 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 +0800283{
284 ATResponse *response = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800285 int err = at_send_command_numeric(portType_2_portId(sim_id, port), "AT+CIMI", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800286
287 if (err < 0 || response->success == 0 || !response->p_intermediates){
288 *cme_err = at_get_cme_error(response);
289 goto exit;
290 }
291
292 memcpy(data, response->p_intermediates->line, strlen(response->p_intermediates->line));
293exit:
294 at_response_free(response);
295 return err;
296}
297
b.liu7ca612c2025-04-25 09:23:36 +0800298static 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 +0800299{
300 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800301// char cmd[64]={0};
b.liu87afc4c2024-08-14 17:33:45 +0800302
b.liu7ca612c2025-04-25 09:23:36 +0800303 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 +0800304 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
305 if(response) {
306 *cme_err = at_get_cme_error(response);
307 }
308 LOGD("AT+CLCK fail.");
309 goto exit;
310 }
311
312 char *line = response->p_intermediates->line;
313 if(line == NULL) {
314 LOGD("line is NULL");
315 goto exit;
316 }
317 err = at_tok_start(&line);
318 if (err < 0)
319 {
320 goto exit;
321 }
322 err = at_tok_nextint(&line, state);
323 if (err < 0)
324 {
325 goto exit;
326 }
327
328exit:
329 at_response_free(response);
330 return err;
331}
332
333/*
334*
335AT+CLCK=SC,0,1234
336+CLCK: 0
337
338OK
339
340AT+CLCK=SC,1,1234
341+CLCK: 1
342
343OK
344
345*
346*/
b.liu7ca612c2025-04-25 09:23:36 +0800347static 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 +0800348{
349 ATResponse *response = NULL;
350 char cmd[64]={0};
351 snprintf(cmd, sizeof(cmd), "AT+CLCK=SC,%d,%s", enable ? 1 : 0, pin);
b.liu7ca612c2025-04-25 09:23:36 +0800352 int err = at_send_command_singleline(portType_2_portId(sim_id, port), cmd, "+CLCK:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800353 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
354 if(response) {
355 *cme_err = at_get_cme_error(response);
356 }
357 LOGD("AT+CLCK fail.");
358 goto exit;
359 }
360
361 int ret;
362 char *line = response->p_intermediates->line;
363 if(line == NULL) {
364 LOGD("line is NULL");
365 goto exit;
366 }
367 err = at_tok_start(&line);
368 if (err < 0)
369 {
370 goto exit;
371 }
372 err = at_tok_nextint(&line, &ret);
373 if (err < 0)
374 {
375 goto exit;
376 }
377
378 if(enable) {
379 if(ret != 1) {
380 LOGW("+CLCK not 1.");
381 err = -1;
382 goto exit;
383 }
384 } else {
385 if(ret != 0) {
386 LOGW("+CLCK not 0.");
387 err = -1;
388 goto exit;
389 }
390 }
391
392exit:
393 at_response_free(response);
394 return err;
395}
396
b.liu7ca612c2025-04-25 09:23:36 +0800397static 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 +0800398{
399 ATResponse *response = NULL;
400 char cmd[128]={0};
401 int err = 0;
402 int state;
b.liu7ca612c2025-04-25 09:23:36 +0800403 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 +0800404 {
405 return -1;
406 }
407
408 if(state == 0) { // Sim lock not open.
b.liu7ca612c2025-04-25 09:23:36 +0800409 return req_sim_lock_switch(sim_id, port, TRUE, new_pin, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800410 } else {// Change password.
411 snprintf(cmd, sizeof(cmd), "AT+CPWD=SC,%s,%s", old_pin, new_pin);
b.liu7ca612c2025-04-25 09:23:36 +0800412 err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800413 if (err < 0 || response->success == 0){
414 if(cme_err) {
415 *cme_err = at_get_cme_error(response);
416 }
417 goto exit;
418 }
419 }
420
421exit:
422 at_response_free(response);
423 return err;
424}
425
b.liu7ca612c2025-04-25 09:23:36 +0800426static 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 +0800427{
428 ATResponse *response = NULL;
429 char cmd[64]={0};
430 sprintf(cmd, "AT+CPIN=%s", pin);
b.liu7ca612c2025-04-25 09:23:36 +0800431 int err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800432 if (err < 0 || response->success == 0){
433 if(cme_err) {
434 *cme_err = at_get_cme_error(response);
435 }
436 goto exit;
437 }
438
439exit:
440 at_response_free(response);
441 return err;
442}
443
b.liu7ca612c2025-04-25 09:23:36 +0800444static 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 +0800445{
446 ATResponse *response = NULL;
447 char cmd[64]={0};
448 sprintf(cmd, "AT+CPIN=%s,%s", puk, pin);
b.liu7ca612c2025-04-25 09:23:36 +0800449 int err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800450 if (err < 0 || response->success == 0){
451 if(cme_err) {
452 *cme_err = at_get_cme_error(response);
453 }
454 goto exit;
455 }
456
457exit:
458 at_response_free(response);
459 return err;
460}
461
b.liu7ca612c2025-04-25 09:23:36 +0800462static 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 +0800463{
464 switch(lock_info->type)
465 {
466 case MBTK_SIM_LOCK_TYPE_DISABLE:
467 {
b.liu7ca612c2025-04-25 09:23:36 +0800468 return req_sim_lock_switch(sim_id, port, FALSE, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800469 }
470 case MBTK_SIM_LOCK_TYPE_ENABLE:
471 {
b.liu7ca612c2025-04-25 09:23:36 +0800472 return req_sim_lock_switch(sim_id, port, TRUE, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800473 }
474 case MBTK_SIM_LOCK_TYPE_CHANGE:
475 {
b.liu7ca612c2025-04-25 09:23:36 +0800476 return req_sim_pin_change(sim_id, port, lock_info->pin1, lock_info->pin2, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800477 }
478 case MBTK_SIM_LOCK_TYPE_VERIFY_PIN:
479 {
b.liu7ca612c2025-04-25 09:23:36 +0800480 return req_sim_pin_verify(sim_id, port, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800481 }
482 case MBTK_SIM_LOCK_TYPE_VERIFY_PUK:
483 {
b.liu7ca612c2025-04-25 09:23:36 +0800484 return req_sim_puk_verify(sim_id, port, lock_info->puk, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800485 }
486 default:
487 {
488 LOGE("Unknown type : %d", lock_info->type);
489 break;
490 }
491 }
492
493 return -1;
494}
495
496/*
497AT+EPIN?
498+EPIN: 3,0,10,0
499
500OK
501*/
b.liu7ca612c2025-04-25 09:23:36 +0800502static 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 +0800503{
504 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800505// char *tmp_ptr = NULL;
506 int tmp_int;
b.liu7ca612c2025-04-25 09:23:36 +0800507 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+EPIN?", "+EPIN:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800508
509 if (err < 0 || response->success == 0 || !response->p_intermediates){
510 *cme_err = at_get_cme_error(response);
511 goto exit;
512 }
513
514 char *line = response->p_intermediates->line;
515 err = at_tok_start(&line);
516 if (err < 0)
517 {
518 goto exit;
519 }
520 mbtk_pin_puk_last_times_t last_times={0};
b.liu62240ee2024-11-07 17:52:45 +0800521 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800522 if (err < 0)
523 {
524 goto exit;
525 }
b.liu62240ee2024-11-07 17:52:45 +0800526 last_times.p1_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800527 times->p1_retry = last_times.p1_retry;
b.liu62240ee2024-11-07 17:52:45 +0800528 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800529 if (err < 0)
530 {
531 goto exit;
532 }
b.liu62240ee2024-11-07 17:52:45 +0800533 last_times.p2_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800534 times->p2_retry = last_times.p2_retry;
b.liu62240ee2024-11-07 17:52:45 +0800535 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800536 if (err < 0)
537 {
538 goto exit;
539 }
b.liu62240ee2024-11-07 17:52:45 +0800540 last_times.puk1_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800541 times->puk1_retry = last_times.puk1_retry;
b.liu62240ee2024-11-07 17:52:45 +0800542 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800543 if (err < 0)
544 {
545 goto exit;
546 }
b.liu62240ee2024-11-07 17:52:45 +0800547 last_times.puk2_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800548 times->puk2_retry = last_times.puk2_retry;
549
550exit:
551 at_response_free(response);
552 return err;
553}
554
b.liu62240ee2024-11-07 17:52:45 +0800555
b.liu87afc4c2024-08-14 17:33:45 +0800556/*
557AT+CPOL?
558*EUICC: 1
559
560OK
561*/
b.liu7ca612c2025-04-25 09:23:36 +0800562static 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 +0800563{
564 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800565// char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800566 int err = at_send_command_multiline(portType_2_portId(sim_id, port), "AT+CPOL?", "+CPOL:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800567
568 if (err < 0 || response->success == 0 || !response->p_intermediates){
569 *cme_err = at_get_cme_error(response);
570 goto exit;
571 }
572
573 int mccmnc_type = -1;
574 int count = -1;
575 char *mccmnc_name = NULL;
576 ATLine* lines_ptr = response->p_intermediates;
577 char *line = NULL;
578 while(lines_ptr)
579 {
580 line = lines_ptr->line;
581 //if(strStartsWith(line, "+CPOL:"))
582 {
583 err = at_tok_start(&line);
584 if (err < 0)
585 {
586 goto exit;
587 }
588 err = at_tok_nextint(&line, &count);
589 if (err < 0)
590 {
591 goto exit;
592 }
593 info->count = count;
594
595 err = at_tok_nextint(&line, &mccmnc_type);
596 if (err < 0)
597 {
598 goto exit;
599 }
600 info->plmn[count-1].format = mccmnc_type;
601
602 err = at_tok_nextstr(&line, &mccmnc_name);
603 if (err < 0)
604 {
605 goto exit;
606 }
607 memcpy(info->plmn[count-1].name, mccmnc_name, strlen(mccmnc_name));
608 mccmnc_name = NULL;
609 }
610 lines_ptr = lines_ptr->p_next;
611 }
612
613exit:
614 at_response_free(response);
615 return err;
616}
617
b.liu7ca612c2025-04-25 09:23:36 +0800618/*
619>AT+SWITCHSIM?
620<+SWITCHSIM: 0
621
622<OK
623*/
624int req_dual_sim_get(ATPortType_enum port, mbtk_sim_type_enum *sim_id, int *cme_err)
625{
626 ATResponse *response = NULL;
627// char *tmp_ptr = NULL;
628 int err = at_send_command_singleline(portType_2_portId(MBTK_SIM_1, port), "AT+SWITCHSIM?", "+SWITCHSIM:", &response);
629
630 if (err < 0 || response->success == 0 || !response->p_intermediates){
631 if(cme_err) {
632 *cme_err = at_get_cme_error(response);
633 }
634 goto exit;
635 }
636
637 char *line = response->p_intermediates->line;
638 err = at_tok_start(&line);
639 if (err < 0)
640 {
641 goto exit;
642 }
643 int tmp_int = -1;
644 err = at_tok_nextint(&line, &tmp_int);
645 if (err < 0)
646 {
647 goto exit;
648 }
649 if(tmp_int != -1)
650 *sim_id = tmp_int;
651 goto exit;
652exit:
653 at_response_free(response);
654 return err;
655}
656
657/*
658>AT+SWITCHSIM?
659<+SWITCHSIM: 0
660
661<OK
662*/
663static int req_dual_sim_set(ATPortType_enum port, mbtk_sim_type_enum sim_id, int *cme_err)
664{
665 int err = -1;
666 ATResponse *response = NULL;
667
668 char cmd[64] = {0};
669 snprintf(cmd, sizeof(cmd), "AT+SWITCHSIM=%d", sim_id);
670 err = at_send_command(portType_2_portId(MBTK_SIM_1, port), cmd, &response);
671 if (err < 0 || response->success == 0){
672 *cme_err = at_get_cme_error(response);
673 goto exit;
674 }
675
676exit:
677 at_response_free(response);
678 return err;
679}
680
b.liu87afc4c2024-08-14 17:33:45 +0800681//void net_list_free(void *data);
682// Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
683// Otherwise, do not call pack_error_send().
684mbtk_ril_err_enum sim_pack_req_process(sock_cli_info_t* cli_info, ril_msg_pack_info_t* pack)
685{
686 mbtk_ril_err_enum err = MBTK_RIL_ERR_SUCCESS;
687 int cme_err = MBTK_RIL_ERR_CME_NON;
688 switch(pack->msg_id)
689 {
690 case RIL_MSG_ID_SIM_STATE:
691 {
692 if(pack->data_len == 0 || pack->data == NULL)
693 {
b.liu7ca612c2025-04-25 09:23:36 +0800694 mbtk_sim_state_enum state = ril_sim_state_get(cli_info->sim_id, cli_info->port);
b.liu87afc4c2024-08-14 17:33:45 +0800695 if(state == MBTK_SIM_STATE_UNKNOWN)
696 {
697 err = MBTK_RIL_ERR_UNKNOWN;
698 LOG("Get sim state fail.");
699 }
700 else
701 {
b.liu7ca612c2025-04-25 09:23:36 +0800702 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 +0800703 }
704 }
705 else // Set
706 {
707 err = MBTK_RIL_ERR_UNSUPPORTED;
708 LOG("Unsupport set sim state.");
709 }
710 break;
711 }
712 case RIL_MSG_ID_SIM_TYPE:
713 {
714 if(pack->data_len == 0 || pack->data == NULL)
715 {
716 uint8 sim_card_type;
b.liu7ca612c2025-04-25 09:23:36 +0800717 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 +0800718 {
719 if(cme_err != MBTK_RIL_ERR_CME_NON) {
720 err = MBTK_RIL_ERR_CME + cme_err;
721 } else {
722 err = MBTK_RIL_ERR_UNKNOWN;
723 }
724 LOG("Get IMSI fail.");
725 }
726 else
727 {
b.liu7ca612c2025-04-25 09:23:36 +0800728 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 +0800729 }
730 }
731 else // Set
732 {
733 err = MBTK_RIL_ERR_UNSUPPORTED;
734 LOG("Unsupport set sim type.");
735 }
736 break;
737 }
738 case RIL_MSG_ID_SIM_IMSI:
739 {
740 if(pack->data_len == 0 || pack->data == NULL)
741 {
742 char imsi[20] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800743 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 +0800744 {
745 if(cme_err != MBTK_RIL_ERR_CME_NON) {
746 err = MBTK_RIL_ERR_CME + cme_err;
747 } else {
748 err = MBTK_RIL_ERR_UNKNOWN;
749 }
750 LOG("Get IMSI fail.");
751 }
752 else
753 {
b.liu7ca612c2025-04-25 09:23:36 +0800754 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 +0800755 }
756 }
757 else // Set
758 {
759 err = MBTK_RIL_ERR_UNSUPPORTED;
760 LOG("Unsupport set IMSI.");
761 }
762 break;
763 }
764 case RIL_MSG_ID_SIM_PN:
765 {
766 if(pack->data_len == 0 || pack->data == NULL)
767 {
768 char pn[50] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800769 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 +0800770 {
771 if(cme_err != MBTK_RIL_ERR_CME_NON) {
772 err = MBTK_RIL_ERR_CME + cme_err;
773 } else {
774 err = MBTK_RIL_ERR_UNKNOWN;
775 }
776 LOG("Get PN fail.");
777 }
778 else
779 {
b.liu7ca612c2025-04-25 09:23:36 +0800780 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 +0800781 }
782 }
783 else // Set
784 {
785 err = MBTK_RIL_ERR_UNSUPPORTED;
786 LOG("Unsupport set PN.");
787 }
788 break;
789 }
790 case RIL_MSG_ID_SIM_ICCID:
791 {
792 if(pack->data_len == 0 || pack->data == NULL)
793 {
794 char iccid[50] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800795 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 +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 ICCID fail.");
803 }
804 else
805 {
b.liu7ca612c2025-04-25 09:23:36 +0800806 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 +0800807 }
808 }
809 else // Set
810 {
811 err = MBTK_RIL_ERR_UNSUPPORTED;
812 LOG("Unsupport set ICCID.");
813 }
814 break;
815 }
816 case RIL_MSG_ID_SIM_LOCK:
817 {
818 if(pack->data_len == 0 || pack->data == NULL)
819 {
820 int state;
b.liu7ca612c2025-04-25 09:23:36 +0800821 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 +0800822 {
823 if(cme_err != MBTK_RIL_ERR_CME_NON) {
824 err = MBTK_RIL_ERR_CME + cme_err;
825 } else {
826 err = MBTK_RIL_ERR_UNKNOWN;
827 }
828 LOG("Get sim lock state fail.");
829 }
830 else
831 {
b.liu7ca612c2025-04-25 09:23:36 +0800832 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 +0800833 }
834 }
835 else // Set
836 {
837 mbtk_sim_lock_info_t *lock_info = (mbtk_sim_lock_info_t*)pack->data;
b.liu7ca612c2025-04-25 09:23:36 +0800838 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 +0800839 {
840 if(cme_err != MBTK_RIL_ERR_CME_NON) {
841 err = MBTK_RIL_ERR_CME + cme_err;
842 } else {
843 err = MBTK_RIL_ERR_UNKNOWN;
844 }
845 LOG("Set sim lock fail.");
846 }
847 else
848 {
b.liu7ca612c2025-04-25 09:23:36 +0800849 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 +0800850 }
851 }
852 break;
853 }
854 case RIL_MSG_ID_SIM_PINPUK_TIMES:
855 {
856 if(pack->data_len == 0 || pack->data == NULL)
857 {
858 mbtk_pin_puk_last_times_t last_times;
b.liu7ca612c2025-04-25 09:23:36 +0800859 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 +0800860 {
861 if(cme_err != MBTK_RIL_ERR_CME_NON) {
862 err = MBTK_RIL_ERR_CME + cme_err;
863 } else {
864 err = MBTK_RIL_ERR_UNKNOWN;
865 }
866 LOG("Get PIN/PUK Last times fail.");
867 }
868 else
869 {
b.liu7ca612c2025-04-25 09:23:36 +0800870 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 +0800871 }
872 }
873 else // Set
874 {
875 err = MBTK_RIL_ERR_UNSUPPORTED;
876 LOG("Unsupport set PIN/PUK Last times.");
877 }
878 break;
879 }
880 case RIL_MSG_ID_SIM_PLMN:
881 {
882 if(pack->data_len == 0 || pack->data == NULL)
883 {
884 mbtk_plmn_info info;
885 memset(&info, 0, sizeof(mbtk_plmn_info));
b.liu7ca612c2025-04-25 09:23:36 +0800886 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 +0800887 {
888 if(cme_err != MBTK_RIL_ERR_CME_NON) {
889 err = MBTK_RIL_ERR_CME + cme_err;
890 } else {
891 err = MBTK_RIL_ERR_UNKNOWN;
892 }
893 LOG("Get PLMN list fail.");
894 }
895 else
896 {
b.liu7ca612c2025-04-25 09:23:36 +0800897 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 +0800898 }
899 }
900 else // Set
901 {
902 err = MBTK_RIL_ERR_UNSUPPORTED;
903 LOG("Unsupport set PLMN list.");
904 }
905 break;
906 }
b.liu7ca612c2025-04-25 09:23:36 +0800907 case RIL_MSG_ID_SIM_SWITCH:
908 {
909 if(pack->data_len == 0 || pack->data == NULL)
910 {
911 mbtk_sim_type_enum sim_id;
912 if(req_dual_sim_get(cli_info->port, &sim_id, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
913 {
914 if(cme_err != MBTK_RIL_ERR_CME_NON) {
915 err = MBTK_RIL_ERR_CME + cme_err;
916 } else {
917 err = MBTK_RIL_ERR_UNKNOWN;
918 }
919 LOG("Get SWITCHSIM fail.");
920 }
921 else
922 {
923 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));
924 }
925 }
926 else // Set
927 {
928 mbtk_sim_type_enum *sim_id = (mbtk_sim_type_enum*)pack->data;
929 if(req_dual_sim_set(cli_info->port, *sim_id, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
930 {
931 if(cme_err != MBTK_RIL_ERR_CME_NON) {
932 err = MBTK_RIL_ERR_CME + cme_err;
933 } else {
934 err = MBTK_RIL_ERR_UNKNOWN;
935 }
936 LOG("Set SWITCHSIM fail.");
937 }
938 else
939 {
940 ril_info.cur_sim_id = *sim_id;
941 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
942 }
943 }
944 break;
945 }
b.liu87afc4c2024-08-14 17:33:45 +0800946 default:
947 {
948 err = MBTK_RIL_ERR_REQ_UNKNOWN;
949 LOG("Unknown request : %s", id2str(pack->msg_id));
950 break;
951 }
952 }
953
954 return err;
955}
956