blob: 258c0550fdc1d39e919f4f546c1024ea49b389f8 [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.huang7172a4c2025-09-19 15:27:04 +080036 ret=MBTK_SIM_STATE_NOT_READY;
37 if(err >= 0 )
q.huang62b4d232025-09-11 14:02:11 +080038 {
q.huang7172a4c2025-09-19 15:27:04 +080039 int ret2=at_get_cme_error(p_response);
40 if(ret2==CME_SIM_NOT_INSERTED || ret2==CME_SIM_ABSENT)
41 {
42 ret = MBTK_SIM_STATE_ABSENT;
43 }
q.huang62b4d232025-09-11 14:02:11 +080044 }
b.liu87afc4c2024-08-14 17:33:45 +080045 goto done;
46 }
47
q.huang62b4d232025-09-11 14:02:11 +080048
b.liu87afc4c2024-08-14 17:33:45 +080049 /* CPIN? has succeeded, now look at the result */
50
51 cpinLine = p_response->p_intermediates->line;
52 err = at_tok_start (&cpinLine);
53
54 if (err < 0)
55 {
56 ret = MBTK_SIM_STATE_NOT_READY;
57 goto done;
58 }
59
60 err = at_tok_nextstr(&cpinLine, &cpinResult);
61
62 if (err < 0)
63 {
64 ret = MBTK_SIM_STATE_NOT_READY;
65 goto done;
66 }
67
68 if (0 == strcmp (cpinResult, "SIM PIN"))
69 {
70 ret = MBTK_SIM_STATE_SIM_PIN;
71 }
72 else if (0 == strcmp (cpinResult, "SIM PUK"))
73 {
74 ret = MBTK_SIM_STATE_SIM_PUK;
75 }
76 else if (0 == strcmp (cpinResult, "PH-SIMLOCK PIN"))
77 {
78 ret = MBTK_SIM_STATE_PH_SIMLOCK_PIN;
79 }
80 else if (0 == strcmp (cpinResult, "PH-SIMLOCK PIN"))
81 {
82 ret = MBTK_SIM_STATE_PH_SIMLOCK_PUK;
83 }
84 else if (0 == strcmp (cpinResult, "PH-FSIM PIN"))
85 {
86 ret = MBTK_SIM_STATE_PH_FSIM_PIN;
87 }
88 else if (0 == strcmp (cpinResult, "PH-FSIM PUK"))
89 {
90 ret = MBTK_SIM_STATE_PH_FSIM_PUK;
91 }
92 else if (0 == strcmp (cpinResult, "SIM PIN2"))
93 {
94 ret = MBTK_SIM_STATE_SIM_PIN2;
95 }
96 else if (0 == strcmp (cpinResult, "SIM PUK2"))
97 {
98 ret = MBTK_SIM_STATE_SIM_PUK2;
99 }
100 else if (0 == strcmp (cpinResult, "PH-NET PIN"))
101 {
102 ret = MBTK_SIM_STATE_PH_NET_PIN;
103 }
104 else if (0 == strcmp (cpinResult, "PH-NET PUK"))
105 {
106 ret = MBTK_SIM_STATE_PH_NET_PUK;
107 }
108 else if (0 == strcmp (cpinResult, "PH-NETSUB PIN"))
109 {
110 ret = MBTK_SIM_STATE_PH_NETSUB_PIN;
111 }
112 else if (0 == strcmp (cpinResult, "PH-NETSUB PUK"))
113 {
114 ret = MBTK_SIM_STATE_PH_NETSUB_PUK;
115 }
116 else if (0 == strcmp (cpinResult, "PH-SP PIN"))
117 {
118 ret = MBTK_SIM_STATE_PH_SP_PIN;
119 }
120 else if (0 == strcmp (cpinResult, "PH-SP PUK"))
121 {
122 ret = MBTK_SIM_STATE_PH_SP_PUK;
123 }
124 else if (0 == strcmp (cpinResult, "PH-CORP PIN"))
125 {
126 ret = MBTK_SIM_STATE_PH_CORP_PIN;
127 }
128 else if (0 == strcmp (cpinResult, "PH-CORP PUK"))
129 {
130 ret = MBTK_SIM_STATE_PH_CORP_PUK;
131 }
132 else if (0 == strcmp (cpinResult, "READY"))
133 {
134 ret = MBTK_SIM_STATE_READY;
135 } else {
136 ret = MBTK_SIM_STATE_ABSENT;
137 }
138
139done:
140 at_response_free(p_response);
141 p_response = NULL;
142 cpinResult = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800143 ril_info.sim_state[sim_id] = ret;
b.liu87afc4c2024-08-14 17:33:45 +0800144 return ret;
145}
146
147/*
148AT*EUICC?
149*EUICC: 1
150
151OK
152*/
b.liu7ca612c2025-04-25 09:23:36 +0800153static 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 +0800154{
155 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800156// char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800157 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT*EUICC?", "*EUICC:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800158
159 if (err < 0 || response->success == 0 || !response->p_intermediates){
160 *cme_err = at_get_cme_error(response);
161 goto exit;
162 }
163
164 char *line = response->p_intermediates->line;
165 err = at_tok_start(&line);
166 if (err < 0)
167 {
168 goto exit;
169 }
170 int sim_card_type = -1;
171 err = at_tok_nextint(&line, &sim_card_type);
172 if (err < 0)
173 {
174 goto exit;
175 }
176 if(sim_card_type != -1)
177 *type = sim_card_type;
178 goto exit;
179exit:
180 at_response_free(response);
181 return err;
182}
183
184/*
185AT+ICCID
186+ICCID: 89860621330065648041
187
188OK
189*/
b.liu7ca612c2025-04-25 09:23:36 +0800190static 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 +0800191{
192 ATResponse *response = NULL;
193 char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800194 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+ICCID", "+ICCID:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800195
196 if (err < 0 || response->success == 0 || !response->p_intermediates){
197 *cme_err = at_get_cme_error(response);
198 goto exit;
199 }
200
201 char *line = response->p_intermediates->line;
202 err = at_tok_start(&line);
203 if (err < 0)
204 {
205 goto exit;
206 }
207
208 err = at_tok_nextstr(&line, &tmp_ptr);
209 if (err < 0)
210 {
211 goto exit;
212 }
213
214 memcpy(data, tmp_ptr, strlen(tmp_ptr));
215exit:
216 at_response_free(response);
217 return err;
218}
219
220/*
221AT+CNUM?
222+CNUM: "","13980414101",129
223
224OK
225
226*/
b.liu7ca612c2025-04-25 09:23:36 +0800227static 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 +0800228{
229 ATResponse *response = NULL;
230 char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800231 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+CNUM?", "+CNUM:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800232 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
233 if(response) {
234 *cme_err = at_get_cme_error(response);
235 }
236 LOGD("AT+CNUM? fail.");
237 goto exit;
238 }
239
240 char *line = response->p_intermediates->line;
241 if(line == NULL) {
242 LOGD("line is NULL");
243 goto exit;
244 }
245 err = at_tok_start(&line);
246 if (err < 0)
247 {
248 goto exit;
249 }
250
251 err = at_tok_nextstr(&line, &tmp_ptr);
252 if (err < 0)
253 {
254 goto exit;
255 }
256
257 err = at_tok_nextstr(&line, &tmp_ptr);
258 if (err < 0)
259 {
260 goto exit;
261 }
262
263 memcpy(data, tmp_ptr, strlen(tmp_ptr));
264exit:
265 at_response_free(response);
266 return err;
267}
268
269
270/*
271AT+CIMI
272460068103383304
273
274OK
275
276*/
b.liu7ca612c2025-04-25 09:23:36 +0800277static 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 +0800278{
279 ATResponse *response = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800280 int err = at_send_command_numeric(portType_2_portId(sim_id, port), "AT+CIMI", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800281
282 if (err < 0 || response->success == 0 || !response->p_intermediates){
283 *cme_err = at_get_cme_error(response);
284 goto exit;
285 }
286
287 memcpy(data, response->p_intermediates->line, strlen(response->p_intermediates->line));
288exit:
289 at_response_free(response);
290 return err;
291}
292
b.liu7ca612c2025-04-25 09:23:36 +0800293static 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 +0800294{
295 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800296// char cmd[64]={0};
b.liu87afc4c2024-08-14 17:33:45 +0800297
b.liu7ca612c2025-04-25 09:23:36 +0800298 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 +0800299 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
300 if(response) {
301 *cme_err = at_get_cme_error(response);
302 }
303 LOGD("AT+CLCK fail.");
304 goto exit;
305 }
306
307 char *line = response->p_intermediates->line;
308 if(line == NULL) {
309 LOGD("line is NULL");
310 goto exit;
311 }
312 err = at_tok_start(&line);
313 if (err < 0)
314 {
315 goto exit;
316 }
317 err = at_tok_nextint(&line, state);
318 if (err < 0)
319 {
320 goto exit;
321 }
322
323exit:
324 at_response_free(response);
325 return err;
326}
327
328/*
329*
330AT+CLCK=SC,0,1234
331+CLCK: 0
332
333OK
334
335AT+CLCK=SC,1,1234
336+CLCK: 1
337
338OK
339
340*
341*/
b.liu7ca612c2025-04-25 09:23:36 +0800342static 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 +0800343{
344 ATResponse *response = NULL;
345 char cmd[64]={0};
346 snprintf(cmd, sizeof(cmd), "AT+CLCK=SC,%d,%s", enable ? 1 : 0, pin);
b.liu7ca612c2025-04-25 09:23:36 +0800347 int err = at_send_command_singleline(portType_2_portId(sim_id, port), cmd, "+CLCK:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800348 if (err < 0 || response == NULL || response->success == 0 || !response->p_intermediates){
349 if(response) {
350 *cme_err = at_get_cme_error(response);
351 }
352 LOGD("AT+CLCK fail.");
353 goto exit;
354 }
355
356 int ret;
357 char *line = response->p_intermediates->line;
358 if(line == NULL) {
359 LOGD("line is NULL");
360 goto exit;
361 }
362 err = at_tok_start(&line);
363 if (err < 0)
364 {
365 goto exit;
366 }
367 err = at_tok_nextint(&line, &ret);
368 if (err < 0)
369 {
370 goto exit;
371 }
372
373 if(enable) {
374 if(ret != 1) {
375 LOGW("+CLCK not 1.");
376 err = -1;
377 goto exit;
378 }
379 } else {
380 if(ret != 0) {
381 LOGW("+CLCK not 0.");
382 err = -1;
383 goto exit;
384 }
385 }
386
387exit:
388 at_response_free(response);
389 return err;
390}
391
b.liu7ca612c2025-04-25 09:23:36 +0800392static 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 +0800393{
394 ATResponse *response = NULL;
395 char cmd[128]={0};
396 int err = 0;
397 int state;
b.liu7ca612c2025-04-25 09:23:36 +0800398 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 +0800399 {
400 return -1;
401 }
402
403 if(state == 0) { // Sim lock not open.
b.liu7ca612c2025-04-25 09:23:36 +0800404 return req_sim_lock_switch(sim_id, port, TRUE, new_pin, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800405 } else {// Change password.
406 snprintf(cmd, sizeof(cmd), "AT+CPWD=SC,%s,%s", old_pin, new_pin);
b.liu7ca612c2025-04-25 09:23:36 +0800407 err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800408 if (err < 0 || response->success == 0){
409 if(cme_err) {
410 *cme_err = at_get_cme_error(response);
411 }
412 goto exit;
413 }
414 }
415
416exit:
417 at_response_free(response);
418 return err;
419}
420
b.liu7ca612c2025-04-25 09:23:36 +0800421static 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 +0800422{
423 ATResponse *response = NULL;
424 char cmd[64]={0};
425 sprintf(cmd, "AT+CPIN=%s", pin);
b.liu7ca612c2025-04-25 09:23:36 +0800426 int err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800427 if (err < 0 || response->success == 0){
428 if(cme_err) {
429 *cme_err = at_get_cme_error(response);
430 }
431 goto exit;
432 }
433
434exit:
435 at_response_free(response);
436 return err;
437}
438
b.liu7ca612c2025-04-25 09:23:36 +0800439static 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 +0800440{
441 ATResponse *response = NULL;
442 char cmd[64]={0};
443 sprintf(cmd, "AT+CPIN=%s,%s", puk, pin);
b.liu7ca612c2025-04-25 09:23:36 +0800444 int err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
b.liu87afc4c2024-08-14 17:33:45 +0800445 if (err < 0 || response->success == 0){
446 if(cme_err) {
447 *cme_err = at_get_cme_error(response);
448 }
449 goto exit;
450 }
451
452exit:
453 at_response_free(response);
454 return err;
455}
456
b.liu7ca612c2025-04-25 09:23:36 +0800457static 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 +0800458{
459 switch(lock_info->type)
460 {
461 case MBTK_SIM_LOCK_TYPE_DISABLE:
462 {
b.liu7ca612c2025-04-25 09:23:36 +0800463 return req_sim_lock_switch(sim_id, port, FALSE, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800464 }
465 case MBTK_SIM_LOCK_TYPE_ENABLE:
466 {
b.liu7ca612c2025-04-25 09:23:36 +0800467 return req_sim_lock_switch(sim_id, port, TRUE, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800468 }
469 case MBTK_SIM_LOCK_TYPE_CHANGE:
470 {
b.liu7ca612c2025-04-25 09:23:36 +0800471 return req_sim_pin_change(sim_id, port, lock_info->pin1, lock_info->pin2, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800472 }
473 case MBTK_SIM_LOCK_TYPE_VERIFY_PIN:
474 {
b.liu7ca612c2025-04-25 09:23:36 +0800475 return req_sim_pin_verify(sim_id, port, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800476 }
477 case MBTK_SIM_LOCK_TYPE_VERIFY_PUK:
478 {
b.liu7ca612c2025-04-25 09:23:36 +0800479 return req_sim_puk_verify(sim_id, port, lock_info->puk, lock_info->pin1, cme_err);
b.liu87afc4c2024-08-14 17:33:45 +0800480 }
481 default:
482 {
483 LOGE("Unknown type : %d", lock_info->type);
484 break;
485 }
486 }
487
488 return -1;
489}
490
491/*
492AT+EPIN?
493+EPIN: 3,0,10,0
494
495OK
496*/
b.liu7ca612c2025-04-25 09:23:36 +0800497static 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 +0800498{
499 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800500// char *tmp_ptr = NULL;
501 int tmp_int;
b.liu7ca612c2025-04-25 09:23:36 +0800502 int err = at_send_command_singleline(portType_2_portId(sim_id, port), "AT+EPIN?", "+EPIN:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800503
504 if (err < 0 || response->success == 0 || !response->p_intermediates){
505 *cme_err = at_get_cme_error(response);
506 goto exit;
507 }
508
509 char *line = response->p_intermediates->line;
510 err = at_tok_start(&line);
511 if (err < 0)
512 {
513 goto exit;
514 }
515 mbtk_pin_puk_last_times_t last_times={0};
b.liu62240ee2024-11-07 17:52:45 +0800516 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800517 if (err < 0)
518 {
519 goto exit;
520 }
b.liu62240ee2024-11-07 17:52:45 +0800521 last_times.p1_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800522 times->p1_retry = last_times.p1_retry;
b.liu62240ee2024-11-07 17:52:45 +0800523 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800524 if (err < 0)
525 {
526 goto exit;
527 }
b.liu62240ee2024-11-07 17:52:45 +0800528 last_times.p2_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800529 times->p2_retry = last_times.p2_retry;
b.liu62240ee2024-11-07 17:52:45 +0800530 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800531 if (err < 0)
532 {
533 goto exit;
534 }
b.liu62240ee2024-11-07 17:52:45 +0800535 last_times.puk1_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800536 times->puk1_retry = last_times.puk1_retry;
b.liu62240ee2024-11-07 17:52:45 +0800537 err = at_tok_nextint(&line, &tmp_int);
b.liu87afc4c2024-08-14 17:33:45 +0800538 if (err < 0)
539 {
540 goto exit;
541 }
b.liu62240ee2024-11-07 17:52:45 +0800542 last_times.puk2_retry = (uint8_t)tmp_int;
b.liu87afc4c2024-08-14 17:33:45 +0800543 times->puk2_retry = last_times.puk2_retry;
544
545exit:
546 at_response_free(response);
547 return err;
548}
549
b.liu62240ee2024-11-07 17:52:45 +0800550
b.liu87afc4c2024-08-14 17:33:45 +0800551/*
552AT+CPOL?
553*EUICC: 1
554
555OK
556*/
b.liu7ca612c2025-04-25 09:23:36 +0800557static 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 +0800558{
559 ATResponse *response = NULL;
b.liu62240ee2024-11-07 17:52:45 +0800560// char *tmp_ptr = NULL;
b.liu7ca612c2025-04-25 09:23:36 +0800561 int err = at_send_command_multiline(portType_2_portId(sim_id, port), "AT+CPOL?", "+CPOL:", &response);
b.liu87afc4c2024-08-14 17:33:45 +0800562
563 if (err < 0 || response->success == 0 || !response->p_intermediates){
564 *cme_err = at_get_cme_error(response);
565 goto exit;
566 }
567
568 int mccmnc_type = -1;
569 int count = -1;
570 char *mccmnc_name = NULL;
571 ATLine* lines_ptr = response->p_intermediates;
572 char *line = NULL;
573 while(lines_ptr)
574 {
575 line = lines_ptr->line;
576 //if(strStartsWith(line, "+CPOL:"))
577 {
578 err = at_tok_start(&line);
579 if (err < 0)
580 {
581 goto exit;
582 }
583 err = at_tok_nextint(&line, &count);
584 if (err < 0)
585 {
586 goto exit;
587 }
588 info->count = count;
589
590 err = at_tok_nextint(&line, &mccmnc_type);
591 if (err < 0)
592 {
593 goto exit;
594 }
595 info->plmn[count-1].format = mccmnc_type;
596
597 err = at_tok_nextstr(&line, &mccmnc_name);
598 if (err < 0)
599 {
600 goto exit;
601 }
602 memcpy(info->plmn[count-1].name, mccmnc_name, strlen(mccmnc_name));
603 mccmnc_name = NULL;
604 }
605 lines_ptr = lines_ptr->p_next;
606 }
607
608exit:
609 at_response_free(response);
610 return err;
611}
612
b.liu7ca612c2025-04-25 09:23:36 +0800613/*
614>AT+SWITCHSIM?
615<+SWITCHSIM: 0
616
617<OK
618*/
619int req_dual_sim_get(ATPortType_enum port, mbtk_sim_type_enum *sim_id, int *cme_err)
620{
621 ATResponse *response = NULL;
622// char *tmp_ptr = NULL;
623 int err = at_send_command_singleline(portType_2_portId(MBTK_SIM_1, port), "AT+SWITCHSIM?", "+SWITCHSIM:", &response);
624
625 if (err < 0 || response->success == 0 || !response->p_intermediates){
626 if(cme_err) {
627 *cme_err = at_get_cme_error(response);
628 }
629 goto exit;
630 }
631
632 char *line = response->p_intermediates->line;
633 err = at_tok_start(&line);
634 if (err < 0)
635 {
636 goto exit;
637 }
638 int tmp_int = -1;
639 err = at_tok_nextint(&line, &tmp_int);
640 if (err < 0)
641 {
642 goto exit;
643 }
644 if(tmp_int != -1)
645 *sim_id = tmp_int;
646 goto exit;
647exit:
648 at_response_free(response);
649 return err;
650}
651
652/*
653>AT+SWITCHSIM?
654<+SWITCHSIM: 0
655
656<OK
657*/
658static int req_dual_sim_set(ATPortType_enum port, mbtk_sim_type_enum sim_id, int *cme_err)
659{
660 int err = -1;
661 ATResponse *response = NULL;
662
663 char cmd[64] = {0};
664 snprintf(cmd, sizeof(cmd), "AT+SWITCHSIM=%d", sim_id);
665 err = at_send_command(portType_2_portId(MBTK_SIM_1, port), cmd, &response);
666 if (err < 0 || response->success == 0){
667 *cme_err = at_get_cme_error(response);
668 goto exit;
669 }
670
671exit:
672 at_response_free(response);
673 return err;
674}
675
b.liu87afc4c2024-08-14 17:33:45 +0800676//void net_list_free(void *data);
677// Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
678// Otherwise, do not call pack_error_send().
679mbtk_ril_err_enum sim_pack_req_process(sock_cli_info_t* cli_info, ril_msg_pack_info_t* pack)
680{
681 mbtk_ril_err_enum err = MBTK_RIL_ERR_SUCCESS;
682 int cme_err = MBTK_RIL_ERR_CME_NON;
683 switch(pack->msg_id)
684 {
685 case RIL_MSG_ID_SIM_STATE:
686 {
687 if(pack->data_len == 0 || pack->data == NULL)
688 {
b.liu7ca612c2025-04-25 09:23:36 +0800689 mbtk_sim_state_enum state = ril_sim_state_get(cli_info->sim_id, cli_info->port);
b.liu87afc4c2024-08-14 17:33:45 +0800690 if(state == MBTK_SIM_STATE_UNKNOWN)
691 {
692 err = MBTK_RIL_ERR_UNKNOWN;
693 LOG("Get sim state fail.");
694 }
695 else
696 {
b.liu7ca612c2025-04-25 09:23:36 +0800697 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 +0800698 }
699 }
700 else // Set
701 {
702 err = MBTK_RIL_ERR_UNSUPPORTED;
703 LOG("Unsupport set sim state.");
704 }
705 break;
706 }
707 case RIL_MSG_ID_SIM_TYPE:
708 {
709 if(pack->data_len == 0 || pack->data == NULL)
710 {
711 uint8 sim_card_type;
b.liu7ca612c2025-04-25 09:23:36 +0800712 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 +0800713 {
714 if(cme_err != MBTK_RIL_ERR_CME_NON) {
715 err = MBTK_RIL_ERR_CME + cme_err;
716 } else {
717 err = MBTK_RIL_ERR_UNKNOWN;
718 }
719 LOG("Get IMSI fail.");
720 }
721 else
722 {
b.liu7ca612c2025-04-25 09:23:36 +0800723 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 +0800724 }
725 }
726 else // Set
727 {
728 err = MBTK_RIL_ERR_UNSUPPORTED;
729 LOG("Unsupport set sim type.");
730 }
731 break;
732 }
733 case RIL_MSG_ID_SIM_IMSI:
734 {
735 if(pack->data_len == 0 || pack->data == NULL)
736 {
737 char imsi[20] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800738 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 +0800739 {
740 if(cme_err != MBTK_RIL_ERR_CME_NON) {
741 err = MBTK_RIL_ERR_CME + cme_err;
742 } else {
743 err = MBTK_RIL_ERR_UNKNOWN;
744 }
745 LOG("Get IMSI fail.");
746 }
747 else
748 {
b.liu7ca612c2025-04-25 09:23:36 +0800749 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 +0800750 }
751 }
752 else // Set
753 {
754 err = MBTK_RIL_ERR_UNSUPPORTED;
755 LOG("Unsupport set IMSI.");
756 }
757 break;
758 }
759 case RIL_MSG_ID_SIM_PN:
760 {
761 if(pack->data_len == 0 || pack->data == NULL)
762 {
763 char pn[50] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800764 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 +0800765 {
766 if(cme_err != MBTK_RIL_ERR_CME_NON) {
767 err = MBTK_RIL_ERR_CME + cme_err;
768 } else {
769 err = MBTK_RIL_ERR_UNKNOWN;
770 }
771 LOG("Get PN fail.");
772 }
773 else
774 {
b.liu7ca612c2025-04-25 09:23:36 +0800775 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 +0800776 }
777 }
778 else // Set
779 {
780 err = MBTK_RIL_ERR_UNSUPPORTED;
781 LOG("Unsupport set PN.");
782 }
783 break;
784 }
785 case RIL_MSG_ID_SIM_ICCID:
786 {
787 if(pack->data_len == 0 || pack->data == NULL)
788 {
789 char iccid[50] = {0};
b.liu7ca612c2025-04-25 09:23:36 +0800790 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 +0800791 {
792 if(cme_err != MBTK_RIL_ERR_CME_NON) {
793 err = MBTK_RIL_ERR_CME + cme_err;
794 } else {
795 err = MBTK_RIL_ERR_UNKNOWN;
796 }
797 LOG("Get ICCID fail.");
798 }
799 else
800 {
b.liu7ca612c2025-04-25 09:23:36 +0800801 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 +0800802 }
803 }
804 else // Set
805 {
806 err = MBTK_RIL_ERR_UNSUPPORTED;
807 LOG("Unsupport set ICCID.");
808 }
809 break;
810 }
811 case RIL_MSG_ID_SIM_LOCK:
812 {
813 if(pack->data_len == 0 || pack->data == NULL)
814 {
815 int state;
b.liu7ca612c2025-04-25 09:23:36 +0800816 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 +0800817 {
818 if(cme_err != MBTK_RIL_ERR_CME_NON) {
819 err = MBTK_RIL_ERR_CME + cme_err;
820 } else {
821 err = MBTK_RIL_ERR_UNKNOWN;
822 }
823 LOG("Get sim lock state fail.");
824 }
825 else
826 {
b.liu7ca612c2025-04-25 09:23:36 +0800827 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 +0800828 }
829 }
830 else // Set
831 {
832 mbtk_sim_lock_info_t *lock_info = (mbtk_sim_lock_info_t*)pack->data;
b.liu7ca612c2025-04-25 09:23:36 +0800833 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 +0800834 {
835 if(cme_err != MBTK_RIL_ERR_CME_NON) {
836 err = MBTK_RIL_ERR_CME + cme_err;
837 } else {
838 err = MBTK_RIL_ERR_UNKNOWN;
839 }
840 LOG("Set sim lock fail.");
841 }
842 else
843 {
b.liu7ca612c2025-04-25 09:23:36 +0800844 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 +0800845 }
846 }
847 break;
848 }
849 case RIL_MSG_ID_SIM_PINPUK_TIMES:
850 {
851 if(pack->data_len == 0 || pack->data == NULL)
852 {
853 mbtk_pin_puk_last_times_t last_times;
b.liu7ca612c2025-04-25 09:23:36 +0800854 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 +0800855 {
856 if(cme_err != MBTK_RIL_ERR_CME_NON) {
857 err = MBTK_RIL_ERR_CME + cme_err;
858 } else {
859 err = MBTK_RIL_ERR_UNKNOWN;
860 }
861 LOG("Get PIN/PUK Last times fail.");
862 }
863 else
864 {
b.liu7ca612c2025-04-25 09:23:36 +0800865 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 +0800866 }
867 }
868 else // Set
869 {
870 err = MBTK_RIL_ERR_UNSUPPORTED;
871 LOG("Unsupport set PIN/PUK Last times.");
872 }
873 break;
874 }
875 case RIL_MSG_ID_SIM_PLMN:
876 {
877 if(pack->data_len == 0 || pack->data == NULL)
878 {
879 mbtk_plmn_info info;
880 memset(&info, 0, sizeof(mbtk_plmn_info));
b.liu7ca612c2025-04-25 09:23:36 +0800881 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 +0800882 {
883 if(cme_err != MBTK_RIL_ERR_CME_NON) {
884 err = MBTK_RIL_ERR_CME + cme_err;
885 } else {
886 err = MBTK_RIL_ERR_UNKNOWN;
887 }
888 LOG("Get PLMN list fail.");
889 }
890 else
891 {
b.liu7ca612c2025-04-25 09:23:36 +0800892 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 +0800893 }
894 }
895 else // Set
896 {
897 err = MBTK_RIL_ERR_UNSUPPORTED;
898 LOG("Unsupport set PLMN list.");
899 }
900 break;
901 }
b.liu7ca612c2025-04-25 09:23:36 +0800902 case RIL_MSG_ID_SIM_SWITCH:
903 {
904 if(pack->data_len == 0 || pack->data == NULL)
905 {
906 mbtk_sim_type_enum sim_id;
907 if(req_dual_sim_get(cli_info->port, &sim_id, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
908 {
909 if(cme_err != MBTK_RIL_ERR_CME_NON) {
910 err = MBTK_RIL_ERR_CME + cme_err;
911 } else {
912 err = MBTK_RIL_ERR_UNKNOWN;
913 }
914 LOG("Get SWITCHSIM fail.");
915 }
916 else
917 {
918 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));
919 }
920 }
921 else // Set
922 {
923 mbtk_sim_type_enum *sim_id = (mbtk_sim_type_enum*)pack->data;
924 if(req_dual_sim_set(cli_info->port, *sim_id, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
925 {
926 if(cme_err != MBTK_RIL_ERR_CME_NON) {
927 err = MBTK_RIL_ERR_CME + cme_err;
928 } else {
929 err = MBTK_RIL_ERR_UNKNOWN;
930 }
931 LOG("Set SWITCHSIM fail.");
932 }
933 else
934 {
935 ril_info.cur_sim_id = *sim_id;
936 ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, NULL, 0);
937 }
938 }
939 break;
940 }
b.liu87afc4c2024-08-14 17:33:45 +0800941 default:
942 {
943 err = MBTK_RIL_ERR_REQ_UNKNOWN;
944 LOG("Unknown request : %s", id2str(pack->msg_id));
945 break;
946 }
947 }
948
949 return err;
950}
951