blob: 040b96f6718d57d626fbe4b1de713e669aa82810 [file] [log] [blame]
b.liu4e243dc2023-11-27 11:20:00 +08001#include "lynq-qser-data.h"
2#include "mbtk_type.h"
wangyouqiang84179c82024-01-05 15:42:55 +08003#include "mbtk_info_api.h"
b.liu5fa9e772023-11-23 18:00:55 +08004
wangyouqiange2498f12024-01-06 17:55:36 +08005#include <pthread.h>
6#include <cutils/properties.h>
7#include <string.h>
wangyouqiang805b0f92024-04-07 17:06:13 +08008#include <unistd.h>
9#include <sys/types.h>
10#include <sys/stat.h>
b.liuf37bd332024-03-18 13:51:24 +080011#include <fcntl.h>
wangyouqiang84179c82024-01-05 15:42:55 +080012/****************************DEFINE***************************************/
13#define QSER_RESULT_SUCCESS 0
14#define QSER_RESULT_FAIL -1
b.liu5fa9e772023-11-23 18:00:55 +080015
b.liuf37bd332024-03-18 13:51:24 +080016#define MBTK_INFO_ERR_CID_EXIST 311
17#define MBTK_INFO_ERR_CID_NO_EXIST 312
18
wangyouqiange2498f12024-01-06 17:55:36 +080019#define QSER_APN_NUM 8
wangyouqiang84179c82024-01-05 15:42:55 +080020//default range: 0 - 7
21//AT+CGACT range: 1 - 8
22//1 default IDX, 8 IMS IDX
b.liuf37bd332024-03-18 13:51:24 +080023#if defined(MBTK_ALL_CID_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +080024#if defined(MBTK_ALL_APN_SUPPORT)
b.liuf37bd332024-03-18 13:51:24 +080025#define QSER_PROFILE_IDX_MIN 0
26#else
wangyouqiang84179c82024-01-05 15:42:55 +080027#define QSER_PROFILE_IDX_MIN 1
b.liuf37bd332024-03-18 13:51:24 +080028#endif
wangyouqiang805b0f92024-04-07 17:06:13 +080029#else
30#define QSER_PROFILE_IDX_MIN 1
31#endif
wangyouqiang84179c82024-01-05 15:42:55 +080032#define QSER_PROFILE_IDX_MAX 6
wangyouqiange2498f12024-01-06 17:55:36 +080033
wangyouqiang84179c82024-01-05 15:42:55 +080034/****************************DEFINE***************************************/
35
36/****************************VARIABLE***************************************/
37mbtk_info_handle_t* qser_info_handle = NULL;
38int qser_info_handle_num = 0;
39static bool inited = FALSE;
40static qser_data_call_evt_cb_t qser_net_status_cb = NULL;
wangyouqiange2498f12024-01-06 17:55:36 +080041static qser_apn_info_s qser_apn_info[QSER_APN_NUM] = {0};
42static bool qser_apn_info_state[QSER_APN_NUM] = {0};
43static char qser_apn_add_save_state[QSER_APN_NUM + 1] = {0};
44static qser_data_call_s qser_data_backup;
wangyouqiang805b0f92024-04-07 17:06:13 +080045static bool qser_start_async = false;
b.liuf37bd332024-03-18 13:51:24 +080046#if defined(MBTK_ALL_CID_SUPPORT)
47static int qser_apn_default_idx = -1;
wangyouqiang805b0f92024-04-07 17:06:13 +080048static int qser_default_pdp_idx = -1;
b.liuf37bd332024-03-18 13:51:24 +080049#else
50static int qser_apn_default_idx = 0xFF;
wangyouqiang805b0f92024-04-07 17:06:13 +080051static int qser_default_pdp_idx = 0;
b.liuf37bd332024-03-18 13:51:24 +080052#endif
wangyouqiange2498f12024-01-06 17:55:36 +080053int now_idx = 0;
wangyouqiang84179c82024-01-05 15:42:55 +080054/****************************VARIABLE***************************************/
55
56/******************************FUNC*****************************************/
b.liuf37bd332024-03-18 13:51:24 +080057#if defined(MBTK_ALL_CID_SUPPORT)
58int qser_route_config(int profile_idx)
59{
60 char buf[1024] = {0};
61 char dns[128] = {0};
62 int offset = 0;
63 int fd = -1;
64 mbtk_ipv4_info_t ipv4;
65 mbtk_ipv6_info_t ipv6;
66 sprintf(buf, "route add default dev ccinet%d", profile_idx -1);
67 system(buf);
68
69 int ret = mbtk_data_call_state_get(qser_info_handle, profile_idx, &ipv4, &ipv6);
70 if(ret != 0)
71 return -1;
72 else
73 {
74 memset(buf, 0x0, 1024);
75 memset(dns, 0x0, 128);
76 offset = sprintf(buf, "search lan\n");
77 if(ipv4.valid)
78 {
79 if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), dns, 32) == NULL) {
80 LOGD("PrimaryDNS error.");
81 } else {
82 LOGD("PrimaryDNS : %s", dns);
83 }
84 offset += sprintf(buf + offset, "nameserver %s\n", dns);
85 memset(dns, 0x0, 128);
86 if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), dns, 32) == NULL) {
87 LOGD("SecondaryDNS error.");
88 } else {
89 LOGD("SecondaryDNS : %s", dns);
90 }
91 offset += sprintf(buf + offset, "nameserver %s\n", dns);
92 }
93 if(ipv6.valid)
94 {
95 memset(dns, 0x0, 128);
96 if(ipv6_2_str(&(ipv6.PrimaryDNS), dns))
97 {
98 LOGD("PrimaryDNS error.");
99 } else {
100 LOGD("PrimaryDNS : %s", dns);
101 }
102 offset += sprintf(buf + offset, "nameserver %s\n", dns);
103 memset(dns, 0x0, 128);
104 if(ipv6_2_str(&(ipv6.SecondaryDNS), dns))
105 {
106 LOGD("SecondaryDNS error.");
107 } else {
108 LOGD("SecondaryDNS : %s", dns);
109 }
110 offset += sprintf(buf + offset, "nameserver %s\n", dns);
111 }
112
113 if(offset > 0)
114 {
115 fd = open("/tmp/resolv.conf", O_WRONLY | O_TRUNC);
116 if(fd < 0)
117 {
118 LOGD("mbtk_route_config : open fail.");
119 return -1;
120 }
121
122 ret = write(fd, buf, offset);
123 if(ret < 0)
124 {
125 LOGD("mbtk_route_config : write fail.");
126 }
127
128 close(fd);
129 }
130 }
131
132 return 0;
133}
134#endif
135
wangyouqiange2498f12024-01-06 17:55:36 +0800136char qser_get_apn_profile_idx(void)
137{
138 char i = 0;
wangyouqiang805b0f92024-04-07 17:06:13 +0800139 for(i = QSER_PROFILE_IDX_MIN; i <= QSER_PROFILE_IDX_MAX; i++)
wangyouqiange2498f12024-01-06 17:55:36 +0800140 {
141 if(qser_apn_info_state[i] == FALSE)
142 {
143 return i;
144 }
145 }
146
147 return i;
148}
149
150int qser_check_profile_idx(unsigned char profile_idx)
151{
152 if(profile_idx < QSER_PROFILE_IDX_MIN || profile_idx > QSER_PROFILE_IDX_MAX)
153 {
154 LOGE("[qser_data_call] IDX range error.");
155 return QSER_RESULT_FAIL;
156 }
157
158 if(qser_apn_info_state[profile_idx] != TRUE)
159 {
160 LOGE("[qser_data_call] profile_idx is not exist.");
161 return QSER_RESULT_FAIL;
162 }
163
164 return QSER_RESULT_SUCCESS;
165}
166
wangyouqiang84179c82024-01-05 15:42:55 +0800167int qser_apn_info_param_convert(int profile_idx, qser_apn_info_s *new_apn, mbtk_apn_info_t *old_apn)
168{
169 if(new_apn == NULL || old_apn == NULL)
170 {
171 LOGE("[qser_data_call] qser_apn_info_param_convert apn param is NULL.");
172 return QSER_RESULT_FAIL;
173 }
174
175 //get ip type
176 if(old_apn->ip_type == MBTK_IP_TYPE_IPV4V6) // IPV4V6
177 {
178 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4V6;
179 }
180 else if(old_apn->ip_type == MBTK_IP_TYPE_IP) // IPV4
181 {
182 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4;
183 }
184 else if(old_apn->ip_type == MBTK_IP_TYPE_IPV6) // IPV6
185 {
186 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV6;
187 }
188 else
189 {
190 new_apn->pdp_type = QSER_APN_PDP_TYPE_PPP;
191 }
192
193 //get apn name
194 if(strlen(old_apn->apn)+1 > QSER_APN_NAME_SIZE)
195 {
196 LOGE("[qser_data_call] apn_nmea length verylong.");
197 return QSER_RESULT_FAIL;
198 }
199 else
200 {
201 if(strlen(old_apn->apn) > 0)
202 {
203 memcpy(new_apn->apn_name, old_apn->apn,strlen(old_apn->apn)+1);
204 }
205 else
206 {
207 memset(new_apn->apn_name, 0x0, QSER_APN_NAME_SIZE);
208 }
209 }
210
211 //get apn user
212 if(strlen(old_apn->user)+1 > QSER_APN_USERNAME_SIZE)
213 {
214 LOGE("[qser_data_call] apn_user length verylong.");
215 return QSER_RESULT_FAIL;
216 }
217 else
218 {
219 if(strlen(old_apn->user) > 0)
220 {
221 memcpy(new_apn->username, old_apn->user, strlen(old_apn->user)+1);
222 }
223 else
224 {
225 memset(new_apn->username , 0x0, QSER_APN_USERNAME_SIZE);
226 }
227 }
228
229 //get apn password
230 if(strlen(old_apn->pass)+1 > QSER_APN_PASSWORD_SIZE)
231 {
232 LOGE("[qser_data_call] apn_password length verylong.");
233 return QSER_RESULT_FAIL;
234 }
235 else
236 {
237 if(strlen(old_apn->pass) > 0)
238 {
239 memcpy(new_apn->password, old_apn->pass, strlen(old_apn->pass)+1);
240 }
241 else
242 {
243 memset(new_apn->username , 0x0, QSER_APN_PASSWORD_SIZE);
244 }
245 }
246
247 //get apn proto
248 if(strlen(old_apn->auth) > 0)
249 {
250 if(strcmp(old_apn->auth, "NONE") == 0)
251 {
252 new_apn->auth_proto = QSER_APN_AUTH_PROTO_NONE;
253 }
254 else if(strcmp(old_apn->auth, "PAP") == 0)
255 {
256 new_apn->auth_proto = QSER_APN_AUTH_PROTO_PAP;
257 }
258 else if(strcmp(old_apn->auth, "CHAP") == 0)
259 {
260 new_apn->auth_proto = QSER_APN_AUTH_PROTO_CHAP;
261 }
262 else
263 {
264 LOGE("[qser_data_call] auth input error!");
265 return QSER_RESULT_FAIL;
266 }
267 }
268
269 //get apn type
270 new_apn->profile_idx = profile_idx;
271 memset(new_apn->apn_type, 0x0, QSER_APN_NAME_SIZE);
272 if(strlen(qser_apn_info[profile_idx].apn_type) > 0)
273 {
274 memcpy(new_apn->apn_type, qser_apn_info[profile_idx].apn_type, strlen(qser_apn_info[profile_idx].apn_type));
275 }
276
277 return QSER_RESULT_SUCCESS;
278}
279
r.xiaof6ec4822024-04-03 02:46:00 -0700280/*Check parameter*/
281int qser_check_apn_name_type(qser_apn_info_s *apn)
282{
283 int pdp_type_tmp = 0;
284 for (;pdp_type_tmp < QSER_APN_NUM; pdp_type_tmp++)
285 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800286 if(qser_apn_add_save_state[pdp_type_tmp] == '1')
r.xiaof6ec4822024-04-03 02:46:00 -0700287 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800288 if (strcmp(qser_apn_info[pdp_type_tmp].apn_name, apn->apn_name) == 0 || strcmp(qser_apn_info[pdp_type_tmp].apn_type, apn->apn_type) == 0)
289 {
290 LOGE("[qser_data_call] qser_check_apn_name_type error!");
291 return QSER_RESULT_FAIL;
292 }
r.xiaof6ec4822024-04-03 02:46:00 -0700293 }
294 }
295
296 return QSER_RESULT_SUCCESS;
297}
298
wangyouqiang805b0f92024-04-07 17:06:13 +0800299int qser_get_ip(char *buf, char *check_buf, char *ip_buf)
300{
301 int i = 0, num = 0;
302 char *p1 = strstr(buf, check_buf);
303 if(p1 != NULL)
304 {
305 p1 += strlen(check_buf);
306 for(; i < 32; i++)
307 {
308 if(*(p1 + i) >= '0' && *(p1 + i) <= '9' || *(p1 + i) == '.' || *(p1 + i) == ':')
309 {
310 num++;
311 }
312 else
313 {
314 break;
315 }
316 }
317
318 memcpy(ip_buf, p1, num);
319
320 }
321 else
322 {
323 return QSER_RESULT_FAIL;
324 }
325
326 return QSER_RESULT_SUCCESS;
327}
328
329int qser_get_ip_info(qser_data_call_state_s *state)
330{
331 if(state == NULL)
332 {
333 LOGE("[qser_data_call] state is NULL");
334 return QSER_RESULT_FAIL;
335 }
336
337 //get ip
338 FILE *fp = NULL;
339 int ret = QSER_RESULT_FAIL;
340 char buffer[1024] = {0};
341 char path[32] = {0};
342 char ipv4[32] = {0};
343 char ipv6[64] = {0};
344
345 sprintf(path, "ifconfig ccinet%d", state->profile_idx);
346 fp = popen(path, "r");
347 if (fp == NULL)
348 {
349 LOGE("[qser_data_call] popen fail");
350 return QSER_RESULT_FAIL;
351 }
352
353 fread(buffer,1, sizeof(buffer) -1, fp);
354 pclose(fp);
355
356 ret = qser_get_ip(buffer, "inet addr:", ipv4);
357 if(ret == QSER_RESULT_SUCCESS)
358 {
359 LOGE("[qser_data_call] ipv4: %s len: %d", ipv4, strlen(ipv4));
360 //ip and gateway is same
361 }
362 else
363 {
364 LOGE("[qser_data_call] ipv4 is invain");
365 }
366
367 ret = qser_get_ip(buffer, "inet6 addr: ", ipv6);
368 if(ret == QSER_RESULT_SUCCESS)
369 {
370 LOGE("[qser_data_call] ipv4: %s len: %d", ipv6, strlen(ipv6));
371 }
372 else
373 {
374 LOGE("[qser_data_call] ipv4 is invain");
375 }
376
377 //get DNS
378 int fd = -1;
379 int i = 0;
380 char *p = NULL;
381 char DNS_v4[32] = {0};
382 char DNS_v6[64] = {0};
383
384 fd = open("/etc/resolv.conf", O_RDWR);
385 if(fd < 0)
386 {
387 LOGE("[qser_data_call] open fail");
388 return QSER_RESULT_FAIL;
389 }
390
391 memset(buffer, 0x0, 1024);
392 ret = read(fd, buffer, 1023);
393 close(fd);
394 if(ret < 0)
395 {
396 LOGE("[qser_data_call] open fail");
397 return QSER_RESULT_FAIL;
398 }
399
400 p = buffer;
401 for(; i < 4; i++)
402 {
403 switch(i)
404 {
405 case 0:
406 case 1:
407 {
408 memset(DNS_v4, 0x0, 32);
409 ret = qser_get_ip(buffer, "nameserver ", DNS_v4);
410 if(ret == QSER_RESULT_SUCCESS)
411 {
412 LOGE("[qser_data_call] DNS_v4: %s len: %d", DNS_v4, strlen(DNS_v4));
413 }
414 else
415 {
416 LOGE("[qser_data_call] DNS_v4 is invain");
417 }
418 break;
419 }
420 case 2:
421 case 3:
422 {
423 memset(DNS_v6, 0x0, 64);
424 ret = qser_get_ip(buffer, "nameserver ", DNS_v6);
425 if(ret == QSER_RESULT_SUCCESS)
426 {
427 LOGE("[qser_data_call] DNS_v6: %s len: %d", DNS_v6, strlen(DNS_v6));
428 }
429 else
430 {
431 LOGE("[qser_data_call] DNS_v6 is invain");
432 }
433 break;
434 }
435 default:
436 {
437 break;
438 }
439 }
440
441 p = strstr(p, "nameserver ");
442 p += strlen("nameserver ");
443 }
444
445 return QSER_RESULT_SUCCESS;
446}
r.xiaof6ec4822024-04-03 02:46:00 -0700447
wangyouqiang84179c82024-01-05 15:42:55 +0800448void qser_wan_net_state_change_cb(const void* data, int data_len)
449{
450 if(data == NULL || data_len == 0)
451 {
452 return;
453 }
454
455 uint8 *net_data = NULL;
456 net_data = (uint8 *)data;
457
458 if(qser_net_status_cb != NULL)
459 {
wangyouqiange2498f12024-01-06 17:55:36 +0800460 qser_data_call_state_s state = {0};
461 state.profile_idx = now_idx;
462 state.ip_family = qser_apn_info[now_idx].pdp_type;
463 if((*net_data > 100 && *net_data < 200) || *net_data == 1)
464 {
465 state.state = QSER_DATA_CALL_CONNECTED;
466 state.err = QSER_DATA_CALL_ERROR_NONE;
467 }
468 else if(*net_data > 200)
469 {
470 state.state = QSER_DATA_CALL_DISCONNECTED;
471 state.err = QSER_DATA_CALL_ERROR_NONE;
wangyouqiang805b0f92024-04-07 17:06:13 +0800472 if( (*net_data -200) == qser_default_pdp_idx )
473 {
474 qser_default_pdp_idx = -1;
475 }
wangyouqiange2498f12024-01-06 17:55:36 +0800476 }
477 else
478 {
479 return;
480 }
481
wangyouqiang805b0f92024-04-07 17:06:13 +0800482 qser_get_ip_info(&state);
483 if(qser_start_async == true)
484 {
485 qser_net_status_cb(&state);
486 }
wangyouqiang84179c82024-01-05 15:42:55 +0800487 }
488}
wangyouqiange2498f12024-01-06 17:55:36 +0800489
490static void* data_call_async_thread(void* arg)
491{
492 qser_data_call_error_e err;
wangyouqiang805b0f92024-04-07 17:06:13 +0800493 qser_start_async = true;
wangyouqiange2498f12024-01-06 17:55:36 +0800494 int ret = qser_data_call_start(&qser_data_backup, &err);
495 if(ret != QSER_RESULT_SUCCESS)
496 {
497 LOGE("[qser_data_call] qser_data_call_start() fail.");
498 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800499 qser_start_async = false;
wangyouqiange2498f12024-01-06 17:55:36 +0800500 return NULL;
501}
502
wangyouqiang84179c82024-01-05 15:42:55 +0800503/******************************FUNC*****************************************/
504
505/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +0800506int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
507{
wangyouqiang84179c82024-01-05 15:42:55 +0800508 //UNUSED(evt_cb);
509 if(!inited && qser_info_handle == NULL)
510 {
511 qser_info_handle = mbtk_info_handle_get();
512 if(qser_info_handle)
513 {
514 qser_info_handle_num++;
515 inited = TRUE;
516 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
517 }
518 else
519 {
520 LOGE("[qser_data_call] mbtk_info_handle_get() fail.");
521 return QSER_RESULT_FAIL;
522 }
523 }
524 else
525 {
526 if(!inited)
527 {
528 qser_info_handle_num++;
529 inited = TRUE;
530 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
531 }
532 }
533 qser_net_status_cb = evt_cb;
b.liu5fa9e772023-11-23 18:00:55 +0800534
wangyouqiange2498f12024-01-06 17:55:36 +0800535 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
536 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
537 mbtk_apn_info_t apns[10] = {0};
538 int apn_num = 10;
539 char qser_apn_type[32] = {0};
540 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
541 if(ret != 0)
542 {
543 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
544 return QSER_RESULT_FAIL;
545 }
546 else
547 {
548 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
549 {
550 int i = 0;
551 for(i = 0; i < apn_num; i++)
552 {
553 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
554 {
555 LOGE("[qser_data_call] idx no open.");
556 continue;
557 }
b.liuf37bd332024-03-18 13:51:24 +0800558
559#if defined(MBTK_ALL_CID_SUPPORT)
560 if(qser_apn_add_save_state[apns[i].cid - 1] == '2')
561 {
562 qser_apn_default_idx = apns[i].cid - 1;
563 }
564#endif
565
wangyouqiange2498f12024-01-06 17:55:36 +0800566 if(qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]) != 0)
567 {
568 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
569 return QSER_RESULT_FAIL;
570 }
571 else
572 {
573 qser_apn_info_state[apns[i].cid - 1] = TRUE;
574 sprintf(qser_apn_type, "persist.qser.apn.type%d", apns[i].cid - 1);
575 property_get(qser_apn_type, qser_apn_info[apns[i].cid - 1].apn_type, NULL);
576 }
577 }
578 }
579 }
wangyouqiang84179c82024-01-05 15:42:55 +0800580 LOGE("[qser_data_call] mbtk_info_handle_get() success.");
581 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800582}
583
584void qser_data_call_destroy(void)
585{
wangyouqiang84179c82024-01-05 15:42:55 +0800586 if(qser_info_handle)
587 {
588 LOGE("qser_info_handle_num = %d", qser_info_handle_num);
589 if(qser_info_handle_num == 1)
590 { // 最后一个引用,可释放。
591 int ret = mbtk_info_handle_free(&qser_info_handle);
592 if(ret)
593 {
594 LOGE("[qser_data_call] mbtk_info_handle_free() fail.");
595 }
596 else
597 {
598 qser_info_handle_num = 0;
599 qser_info_handle = NULL;
600 inited = FALSE;
601 }
602 }
603 else
604 {
605 qser_info_handle_num--;
606 }
607 }
608 else
609 {
610 LOGE("[qser_data_call] handle not inited.");
611 }
b.liu5fa9e772023-11-23 18:00:55 +0800612}
613
614int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
615{
wangyouqiang84179c82024-01-05 15:42:55 +0800616 //UNUSED(data_call);
617 //UNUSED(err);
618 if(data_call == NULL || err == NULL)
619 {
620 LOGE("[qser_data_call] data_call or err is NULL.");
621 if(err != NULL)
622 {
623 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
624 }
625 return QSER_RESULT_FAIL;
626 }
627
628 if(qser_info_handle == NULL)
629 {
630 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800631 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800632 return QSER_RESULT_FAIL;
633 }
b.liu5fa9e772023-11-23 18:00:55 +0800634
wangyouqiang805b0f92024-04-07 17:06:13 +0800635#if defined(MBTK_ALL_CID_SUPPORT)
636 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
637 {
638 LOGE("[qser_data_call] default pdp exist.");
639 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
640 return QSER_RESULT_FAIL;
641 }
642#endif
643
wangyouqiange2498f12024-01-06 17:55:36 +0800644 if(qser_check_profile_idx(data_call->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800645 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800646#if defined(MBTK_ALL_CID_SUPPORT)
647 if( data_call->profile_idx == 0 )
648 {
649 LOGE("[qser_data_call] profile_idx = 0.");
650 }
651 else
652#endif
653 {
654 LOGE("[qser_data_call] profile_idx is invalid.");
655 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
656 return QSER_RESULT_FAIL;
657 }
wangyouqiang84179c82024-01-05 15:42:55 +0800658 }
659
660 int ret = -1;
661 ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
662 if(ret != 0)
663 {
664 LOGE("[qser_data_call] mbtk_data_call_start fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800665 if(ret == MBTK_INFO_ERR_CID_EXIST)
666 {
667 *err = QSER_DATA_CALL_ERROR_PDP_ACTIVATE;
668 }
669 else
670 {
671 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
672 }
wangyouqiang84179c82024-01-05 15:42:55 +0800673 return QSER_RESULT_FAIL;
674 }
675 else
676 {
677 *err = QSER_DATA_CALL_ERROR_NONE;
678 }
wangyouqiange2498f12024-01-06 17:55:36 +0800679
680 now_idx = data_call->profile_idx;
b.liuf37bd332024-03-18 13:51:24 +0800681
682#if defined(MBTK_ALL_CID_SUPPORT)
683 if(qser_apn_default_idx == data_call->profile_idx)
684 {
685 qser_route_config(qser_apn_default_idx + 1);
wangyouqiang805b0f92024-04-07 17:06:13 +0800686 qser_default_pdp_idx = data_call->profile_idx;
b.liuf37bd332024-03-18 13:51:24 +0800687 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800688 else if(data_call->profile_idx == 0)
689 {
690 qser_route_config(1);
691 qser_default_pdp_idx = data_call->profile_idx;
692 }
693 else
694 {
695 //
696 }
697
b.liuf37bd332024-03-18 13:51:24 +0800698#endif
699
wangyouqiange2498f12024-01-06 17:55:36 +0800700 return QSER_RESULT_SUCCESS;
701}
702
703int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
704{
705 //UNUSED(data_call);
706 UNUSED(err);
707 if(data_call == NULL || err == NULL)
708 {
709 LOGE("[qser_data_call] data_call or err is NULL.");
710 if(err != NULL)
711 {
712 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
713 }
714 return QSER_RESULT_FAIL;
715 }
716
717 if(qser_info_handle == NULL)
718 {
719 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800720 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiange2498f12024-01-06 17:55:36 +0800721 return QSER_RESULT_FAIL;
722 }
723
wangyouqiang805b0f92024-04-07 17:06:13 +0800724#if defined(MBTK_ALL_CID_SUPPORT)
725 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
726 {
727 LOGE("[qser_data_call] default pdp exist.");
728 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
729 return QSER_RESULT_FAIL;
730 }
731#endif
732
wangyouqiange2498f12024-01-06 17:55:36 +0800733 if(qser_check_profile_idx(data_call->profile_idx) < 0)
734 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800735#if defined(MBTK_ALL_CID_SUPPORT)
736 if((data_call->profile_idx == 0) && (qser_default_pdp_idx < 0))
737 {
738 LOGE("[qser_data_call] profile_idx = 0 and not open default idx.");
739 }
740 else
741#endif
742 {
743 LOGE("[qser_data_call] profile_idx is invalid.");
744 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
745 return QSER_RESULT_FAIL;
746 }
747
wangyouqiange2498f12024-01-06 17:55:36 +0800748 }
749
750 pthread_attr_t thread_attr;
751 pthread_t data_call_thread_id;
752 pthread_attr_init(&thread_attr);
753 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
754 {
755 LOGE("[qser_data_call] pthread_attr_setdetachstate() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800756 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800757 return QSER_RESULT_FAIL;
758 }
759
760 memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
761 if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, NULL))
762 {
763 LOGE("[qser_data_call] pthread_create() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800764 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800765 return QSER_RESULT_FAIL;
766 }
767 pthread_attr_destroy(&thread_attr);
768 now_idx = data_call->profile_idx;
769
wangyouqiang84179c82024-01-05 15:42:55 +0800770 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800771}
772
773int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
774{
wangyouqiang84179c82024-01-05 15:42:55 +0800775 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800776 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800777 //UNUSED(err);
778 if(err == NULL)
779 {
780 LOGE("[qser_data_call] err is NULL.");
781 return QSER_RESULT_FAIL;
782 }
b.liu5fa9e772023-11-23 18:00:55 +0800783
wangyouqiang84179c82024-01-05 15:42:55 +0800784 if(qser_info_handle == NULL)
785 {
786 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800787 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800788 return QSER_RESULT_FAIL;
789 }
790
wangyouqiange2498f12024-01-06 17:55:36 +0800791 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800792 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800793#if defined(MBTK_ALL_CID_SUPPORT)
794 if(profile_idx == 0)
795 {
796 LOGE("[qser_data_call] profile_idx = 0.");
797 }
798 else
799#endif
800 {
801 LOGE("[qser_data_call] profile_idx is invalid.");
802 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
803 return QSER_RESULT_FAIL;
804 }
wangyouqiang84179c82024-01-05 15:42:55 +0800805 }
806
807 int ret = -1;
808 ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
809 if(ret != 0)
810 {
811 LOGE("[qser_data_call] mbtk_data_call_stop fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800812 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
813 {
814 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
815 }
816 else
817 {
818 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
819 }
wangyouqiang84179c82024-01-05 15:42:55 +0800820 return QSER_RESULT_FAIL;
821 }
822 else
823 {
824 *err = QSER_DATA_CALL_ERROR_NONE;
825 }
wangyouqiange2498f12024-01-06 17:55:36 +0800826
827 now_idx = 0;
wangyouqiang805b0f92024-04-07 17:06:13 +0800828#if defined(MBTK_ALL_CID_SUPPORT)
829 if(qser_default_pdp_idx == profile_idx)
830 {
831 qser_default_pdp_idx = -1;
832 }
833#endif
834
wangyouqiang84179c82024-01-05 15:42:55 +0800835 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800836}
837
838int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
839 qser_data_call_info_s *info, qser_data_call_error_e *err)
840{
wangyouqiang84179c82024-01-05 15:42:55 +0800841 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800842 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800843 //UNUSED(info);
844 //UNUSED(err);
b.liu5fa9e772023-11-23 18:00:55 +0800845
wangyouqiang84179c82024-01-05 15:42:55 +0800846 if(info == NULL || err == NULL)
847 {
848 LOGE("[qser_data_call] info or err is NULL.");
849 if(err != NULL)
850 {
851 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
852 }
853 return QSER_RESULT_FAIL;
854 }
855
856 if(qser_info_handle == NULL)
857 {
858 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800859 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800860 return QSER_RESULT_FAIL;
861 }
862
wangyouqiange2498f12024-01-06 17:55:36 +0800863 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800864 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800865#if defined(MBTK_ALL_CID_SUPPORT)
866 if(profile_idx == 0)
867 {
868 LOGE("[qser_data_call] profile_idx = 0.");
869 }
870 else
871#endif
872 {
873 LOGE("[qser_data_call] profile_idx is invalid.");
874 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
875 return QSER_RESULT_FAIL;
876 }
wangyouqiang84179c82024-01-05 15:42:55 +0800877 }
878
879 int ret = -1;
880 mbtk_ipv4_info_t ipv4;
881 mbtk_ipv6_info_t ipv6;
882#ifdef QSER_TEST
883 char v4_buff[32] = {0};
884 char v6_buff[128] = {0};
885#endif
886 memset(info, 0, sizeof(qser_data_call_info_s));
887 ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
888 if(ret != 0)
889 {
890 LOGE("[qser_data_call] mbtk_data_call_state_get fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800891 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
892 {
893 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
894 }
895 else
896 {
897 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
898 }
wangyouqiang84179c82024-01-05 15:42:55 +0800899 return QSER_RESULT_FAIL;
900 }
901 else
902 {
903 info->profile_idx = profile_idx;
904 if(ipv4.valid)
905 {
906 info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
907 info->v4.state = QSER_DATA_CALL_CONNECTED;
908 sprintf(info->v4.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800909 info->v4.addr.ip.s_addr = ipv4.IPAddr;
910 info->v4.addr.pri_dns.s_addr = ipv4.PrimaryDNS;
911 info->v4.addr.sec_dns.s_addr = ipv4.SecondaryDNS;
912
wangyouqiang84179c82024-01-05 15:42:55 +0800913#ifdef QSER_TEST
b.liuf37bd332024-03-18 13:51:24 +0800914 //LOGE("[qser_data_call] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
wangyouqiang84179c82024-01-05 15:42:55 +0800915 if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
916 LOGE("[qser_data_call] IP error.");
917 } else {
918 LOGE("[qser_data_call] IP : %s", v4_buff);
919 }
920 if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
921 LOGE("[qser_data_call] PrimaryDNS error.");
922 } else {
923 LOGE("[qser_data_call] PrimaryDNS : %s", v4_buff);
924 }
925 if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
926 LOGE("[qser_data_call] SecondaryDNS error.");
927 } else {
928 LOGE("[qser_data_call] SecondaryDNS : %s", v4_buff);
929 }
930#endif
931 }
932
933 if(ipv6.valid)
934 {
935 info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
936 info->v6.state = QSER_DATA_CALL_CONNECTED;
937 sprintf(info->v6.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800938 memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), sizeof(ipv6.IPV6Addr));
939 memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), sizeof(ipv6.PrimaryDNS));
940 memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), sizeof(ipv6.SecondaryDNS));
wangyouqiang84179c82024-01-05 15:42:55 +0800941#ifdef QSER_TEST
942 if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
943 {
944 LOGE("[qser_data_call] IP error.");
945 } else {
946 LOGE("[qser_data_call] IP : %s", v6_buff);
947 }
948 if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
949 {
950 LOGE("[qser_data_call] PrimaryDNS error.");
951 } else {
952 LOGE("[qser_data_call] PrimaryDNS : %s", v6_buff);
953 }
954 if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
955 {
956 LOGE("[qser_data_call] SecondaryDNS error.");
957 } else {
958 LOGE("[qser_data_call] SecondaryDNS : %s", v6_buff);
959 }
960#endif
961 }
962
963 if(ipv4.valid && ipv6.valid)
964 {
965 info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
966 }
967
968 if(!ipv4.valid && !ipv6.valid)
969 {
970 info->v4.state = QSER_DATA_CALL_DISCONNECTED;
971 info->v6.state = QSER_DATA_CALL_DISCONNECTED;
972 }
973 }
974
975 *err = QSER_DATA_CALL_ERROR_NONE;
976 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800977}
978
979int qser_apn_set(qser_apn_info_s *apn)
980{
wangyouqiang84179c82024-01-05 15:42:55 +0800981 //UNUSED(apn);
982 if(qser_info_handle == NULL)
983 {
984 LOGE("[qser_data_call] handle is NULL.");
985 return QSER_RESULT_FAIL;
986 }
987
988 if(apn == NULL)
989 {
990 LOGE("[qser_data_call] apn param is NULL.");
991 return QSER_RESULT_FAIL;
992 }
b.liu5fa9e772023-11-23 18:00:55 +0800993
wangyouqiange2498f12024-01-06 17:55:36 +0800994 if(qser_check_profile_idx(apn->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800995 {
wangyouqiange2498f12024-01-06 17:55:36 +0800996 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800997 return QSER_RESULT_FAIL;
998 }
999
1000 if(strlen(apn->apn_name) == 0)
1001 {
1002 LOGE("[qser_data_call] apn_name is NULL.");
1003 return QSER_RESULT_FAIL;
1004 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001005
1006#if 0
1007 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1008 {
1009 if(qser_apn_default_idx > -1)
1010 {
1011 LOGE("[qser_data_call] iot_default is exist.");
1012 return QSER_RESULT_FAIL;
1013 }
1014 }
1015#endif
1016
r.xiaof6ec4822024-04-03 02:46:00 -07001017 /*add name and type verify*/
1018 if (qser_check_apn_name_type(apn) < 0)
1019 {
1020 LOGE("[qser_data_call] check param error.");
1021 return QSER_RESULT_FAIL;
1022 }
wangyouqiang84179c82024-01-05 15:42:55 +08001023
1024 int ret = -1;
1025 char mbtk_auth[32]={0};
wangyouqiange2498f12024-01-06 17:55:36 +08001026 char qser_apn_type[32] = {0};
wangyouqiang84179c82024-01-05 15:42:55 +08001027 mbtk_ip_type_enum pdp_type = MBTK_IP_TYPE_IPV4V6;
r.xiaof6ec4822024-04-03 02:46:00 -07001028
wangyouqiang84179c82024-01-05 15:42:55 +08001029 if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
1030 {
1031 pdp_type = MBTK_IP_TYPE_IP;
1032 }
1033 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
1034 {
1035 pdp_type = MBTK_IP_TYPE_IPV6;
1036 }
1037 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
1038 {
1039 pdp_type = MBTK_IP_TYPE_IPV4V6;
1040 }
1041 else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
1042 {
1043 pdp_type = MBTK_IP_TYPE_PPP;
1044 }
1045 else
1046 {
1047 LOGE("[qser_data_call] pdp_type error.");
1048 return QSER_RESULT_FAIL;
1049 }
1050
1051 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE || apn->auth_proto == QSER_APN_AUTH_PROTO_DEFAULT)
1052 {
1053 memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
1054 }
1055 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP)
1056 {
1057 memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
1058 }
1059 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_CHAP)
1060 {
1061 memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
1062 }
1063 #if 0
1064 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
1065 {
1066 //NOT SUPPORT
1067 }
1068 #endif
1069 else
1070 {
1071 LOGE("[qser_data_call] auth input error!");
1072 return QSER_RESULT_FAIL;
1073 }
1074
1075 if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
1076 {
1077 LOGE("[qser_data_call] setapn: %d, %d, %s, %s, %s, %s, %s.",apn->profile_idx, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth, apn->apn_type);
1078 }
1079 else
1080 {
1081 LOGE("[qser_data_call] setapn: %d, %d, %s, NULL, NULL, %s, %s.",apn->profile_idx, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth, apn->apn_type);
1082 }
wangyouqiange2498f12024-01-06 17:55:36 +08001083
wangyouqiang84179c82024-01-05 15:42:55 +08001084 ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
1085 if(ret < 0)
1086 {
1087 LOGE("[qser_data_call] mbtk_apn_set fail!");
1088 return QSER_RESULT_FAIL;
1089 }
1090
wangyouqiange2498f12024-01-06 17:55:36 +08001091 sprintf(qser_apn_type, "persist.qser.apn.type%d", apn->profile_idx);
1092 property_set(qser_apn_type, apn->apn_type);
wangyouqiang84179c82024-01-05 15:42:55 +08001093 memcpy(&qser_apn_info[apn->profile_idx], apn, sizeof(qser_apn_info_s));
wangyouqiang805b0f92024-04-07 17:06:13 +08001094
1095#if defined(MBTK_ALL_CID_SUPPORT)
1096 if(memcmp(apn->apn_type, "iot_default", strlen(apn->apn_type)) == 0)
1097 {
1098 qser_apn_add_save_state[apn->profile_idx] = '2';
1099 qser_apn_default_idx = apn->profile_idx;
1100 }
1101 else
1102#endif
1103 {
1104 qser_apn_add_save_state[apn->profile_idx] = '1';
1105 }
1106
wangyouqiang84179c82024-01-05 15:42:55 +08001107 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001108}
1109
1110int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
1111{
wangyouqiang84179c82024-01-05 15:42:55 +08001112 //UNUSED(profile_idx);
1113 //UNUSED(apn);
1114 if(qser_info_handle == NULL)
1115 {
1116 LOGE("[qser_data_call] handle is NULL.");
1117 return QSER_RESULT_FAIL;
1118 }
1119
1120 if(apn == NULL)
1121 {
1122 LOGE("[qser_data_call] apn param is NULL.");
1123 return QSER_RESULT_FAIL;
1124 }
b.liu5fa9e772023-11-23 18:00:55 +08001125
wangyouqiange2498f12024-01-06 17:55:36 +08001126 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001127 {
wangyouqiang805b0f92024-04-07 17:06:13 +08001128#if defined(MBTK_ALL_CID_SUPPORT)
1129 if(profile_idx != 0)
1130#endif
1131 {
1132 LOGE("[qser_data_call] profile_idx is invalid.");
1133 return QSER_RESULT_FAIL;
1134 }
wangyouqiang84179c82024-01-05 15:42:55 +08001135 }
1136
1137 //get apn info
1138 mbtk_apn_info_t apns[10] = {0};
1139 int apn_num = 10;
1140 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1141 if(ret != 0)
1142 {
1143 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
1144 return QSER_RESULT_FAIL;
1145 }
1146 else
1147 {
1148 int i = 0;
1149 for(i = 0; i < apn_num; i++)
1150 {
1151 if(apns[i].cid == profile_idx + 1)
1152 {
1153 LOGE("[qser_data_call] find IDX.");
1154 break;
1155 }
1156 }
1157
1158 if(i == apn_num)
1159 {
1160 LOGE("[qser_data_call] not find IDX.[apn_num = %d]", apn_num);
1161 return QSER_RESULT_FAIL;
1162 }
1163
1164 if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
1165 {
1166 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
1167 return QSER_RESULT_FAIL;
1168 }
1169 }
1170 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001171}
1172
1173int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
1174{
wangyouqiange2498f12024-01-06 17:55:36 +08001175 //UNUSED(apn);
1176 //UNUSED(profile_idx);
1177 if(qser_info_handle == NULL)
1178 {
1179 LOGE("[qser_data_call] handle is NULL.");
1180 return QSER_RESULT_FAIL;
1181 }
1182
1183 if(apn == NULL)
1184 {
1185 LOGE("[qser_data_call] apn param is NULL.");
1186 return QSER_RESULT_FAIL;
1187 }
b.liu5fa9e772023-11-23 18:00:55 +08001188
wangyouqiang805b0f92024-04-07 17:06:13 +08001189#if 0
b.liuf37bd332024-03-18 13:51:24 +08001190 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1191 {
1192 if(qser_apn_default_idx > -1)
1193 {
1194 LOGE("[qser_data_call] iot_default is exist.");
1195 return QSER_RESULT_FAIL;
1196 }
1197 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001198 /*add name and type verify*/
1199 if (qser_check_apn_name_type(apn) < 0)
1200 {
1201 LOGE("[qser_data_call] check param error.");
1202 return QSER_RESULT_FAIL;
1203 }
1204#endif
b.liuf37bd332024-03-18 13:51:24 +08001205
wangyouqiange2498f12024-01-06 17:55:36 +08001206 int ret = 0;
1207 char idx = qser_get_apn_profile_idx();
wangyouqiang805b0f92024-04-07 17:06:13 +08001208 if(idx > QSER_PROFILE_IDX_MAX)
wangyouqiange2498f12024-01-06 17:55:36 +08001209 {
1210 LOGE("[qser_data_call] idx is full.");
1211 return QSER_RESULT_FAIL;
1212 }
1213 else
1214 {
1215 qser_apn_info_state[idx] = TRUE;
1216 qser_apn_info_s set_apn;
1217 set_apn.profile_idx = idx;
1218 set_apn.pdp_type = apn->pdp_type;
1219 set_apn.auth_proto = apn->auth_proto;
1220 memcpy(set_apn.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
1221 memcpy(set_apn.username, apn->username, QSER_APN_USERNAME_SIZE);
1222 memcpy(set_apn.password, apn->password, QSER_APN_PASSWORD_SIZE);
1223 memcpy(set_apn.apn_type, apn->apn_type, QSER_APN_NAME_SIZE);
1224 ret = qser_apn_set(&set_apn);
1225 if(ret != 0)
1226 {
1227 LOGE("[qser_data_call] qser_apn_set fail.");
1228 qser_apn_info_state[idx] = FALSE;
1229 return QSER_RESULT_FAIL;
1230 }
1231 *profile_idx = idx;
b.liuf37bd332024-03-18 13:51:24 +08001232
wangyouqiange2498f12024-01-06 17:55:36 +08001233 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
1234 }
1235 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001236}
1237
1238int qser_apn_del(unsigned char profile_idx)
1239{
wangyouqiange2498f12024-01-06 17:55:36 +08001240 //UNUSED(profile_idx);
1241 if(qser_info_handle == NULL)
1242 {
1243 LOGE("[qser_data_call] handle is NULL.");
1244 return QSER_RESULT_FAIL;
1245 }
b.liu5fa9e772023-11-23 18:00:55 +08001246
wangyouqiange2498f12024-01-06 17:55:36 +08001247 if(qser_check_profile_idx(profile_idx) < 0)
1248 {
1249 LOGE("[qser_data_call] profile_idx is invalid.");
1250 return QSER_RESULT_FAIL;
1251 }
1252
1253 qser_apn_info_state[profile_idx] = FALSE;
1254 qser_apn_add_save_state[profile_idx] = '0';
b.liuf37bd332024-03-18 13:51:24 +08001255
1256#if defined(MBTK_ALL_CID_SUPPORT)
1257 if(profile_idx == qser_apn_default_idx)
1258 {
1259 qser_apn_default_idx = -1;
1260 }
1261#endif
1262
wangyouqiange2498f12024-01-06 17:55:36 +08001263 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
1264 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001265}
1266
1267int qser_apn_get_list(qser_apn_info_list_s *apn_list)
1268{
wangyouqiang84179c82024-01-05 15:42:55 +08001269 //UNUSED(apn_list);
b.liu5fa9e772023-11-23 18:00:55 +08001270
wangyouqiang84179c82024-01-05 15:42:55 +08001271 if(qser_info_handle == NULL)
1272 {
1273 LOGE("[qser_data_call] handle is NULL.");
1274 return QSER_RESULT_FAIL;
1275 }
1276
1277 if(apn_list == NULL)
1278 {
1279 LOGE("[qser_data_call] apn_list param is NULL.");
1280 return QSER_RESULT_FAIL;
1281 }
1282
wangyouqiange2498f12024-01-06 17:55:36 +08001283 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
1284 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001285 mbtk_apn_info_t apns[10] = {0};
1286 int apn_num = 10;
1287 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1288 if(ret != 0)
1289 {
1290 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
1291 return QSER_RESULT_FAIL;
1292 }
1293 else
1294 {
1295 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
1296 {
1297 int i = 0;
wangyouqiange2498f12024-01-06 17:55:36 +08001298 apn_list->cnt = 0;
wangyouqiang84179c82024-01-05 15:42:55 +08001299 for(i = 0; i < apn_num; i++)
1300 {
wangyouqiange2498f12024-01-06 17:55:36 +08001301 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
1302 {
wangyouqiang805b0f92024-04-07 17:06:13 +08001303#if defined(MBTK_ALL_CID_SUPPORT)
1304 if((apns[i].cid - 1) != 0)
1305#endif
1306 {
1307 LOGE("[qser_data_call] idx no open.");
1308 continue;
1309 }
wangyouqiange2498f12024-01-06 17:55:36 +08001310 }
wangyouqiang84179c82024-01-05 15:42:55 +08001311 if(qser_apn_info_param_convert(apns[i].cid - 1, &apn_list->apn[i], &apns[i]) != 0)
1312 {
1313 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
1314 return QSER_RESULT_FAIL;
1315 }
wangyouqiange2498f12024-01-06 17:55:36 +08001316 apn_list->cnt++;
wangyouqiang84179c82024-01-05 15:42:55 +08001317 }
wangyouqiang84179c82024-01-05 15:42:55 +08001318 }
1319 else if(apn_num > QSER_APN_MAX_LIST)
1320 {
1321 LOGE("[qser_data_call] apn_num overlong");
1322 return QSER_RESULT_FAIL;
1323 }
1324 else
1325 {
1326 apn_list->cnt = 0;
1327 }
1328 }
1329 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001330}
wangyouqiang84179c82024-01-05 15:42:55 +08001331/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +08001332