blob: 33fcefb17e3f04466e0162fe0438b4ed9963295b [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>
b.liuf37bd332024-03-18 13:51:24 +08008#include <fcntl.h>
wangyouqiang84179c82024-01-05 15:42:55 +08009/****************************DEFINE***************************************/
10#define QSER_RESULT_SUCCESS 0
11#define QSER_RESULT_FAIL -1
b.liu5fa9e772023-11-23 18:00:55 +080012
b.liuf37bd332024-03-18 13:51:24 +080013#define MBTK_INFO_ERR_CID_EXIST 311
14#define MBTK_INFO_ERR_CID_NO_EXIST 312
15
wangyouqiange2498f12024-01-06 17:55:36 +080016#define QSER_APN_NUM 8
wangyouqiang84179c82024-01-05 15:42:55 +080017//default range: 0 - 7
18//AT+CGACT range: 1 - 8
19//1 default IDX, 8 IMS IDX
b.liuf37bd332024-03-18 13:51:24 +080020#if defined(MBTK_ALL_CID_SUPPORT)
21#define QSER_PROFILE_IDX_MIN 0
22#else
wangyouqiang84179c82024-01-05 15:42:55 +080023#define QSER_PROFILE_IDX_MIN 1
b.liuf37bd332024-03-18 13:51:24 +080024#endif
wangyouqiang84179c82024-01-05 15:42:55 +080025#define QSER_PROFILE_IDX_MAX 6
wangyouqiange2498f12024-01-06 17:55:36 +080026
wangyouqiang84179c82024-01-05 15:42:55 +080027/****************************DEFINE***************************************/
28
29/****************************VARIABLE***************************************/
30mbtk_info_handle_t* qser_info_handle = NULL;
31int qser_info_handle_num = 0;
32static bool inited = FALSE;
33static qser_data_call_evt_cb_t qser_net_status_cb = NULL;
wangyouqiange2498f12024-01-06 17:55:36 +080034static qser_apn_info_s qser_apn_info[QSER_APN_NUM] = {0};
35static bool qser_apn_info_state[QSER_APN_NUM] = {0};
36static char qser_apn_add_save_state[QSER_APN_NUM + 1] = {0};
37static qser_data_call_s qser_data_backup;
b.liuf37bd332024-03-18 13:51:24 +080038#if defined(MBTK_ALL_CID_SUPPORT)
39static int qser_apn_default_idx = -1;
40#else
41static int qser_apn_default_idx = 0xFF;
42#endif
wangyouqiange2498f12024-01-06 17:55:36 +080043int now_idx = 0;
wangyouqiang84179c82024-01-05 15:42:55 +080044/****************************VARIABLE***************************************/
45
46/******************************FUNC*****************************************/
b.liuf37bd332024-03-18 13:51:24 +080047#if defined(MBTK_ALL_CID_SUPPORT)
48int qser_route_config(int profile_idx)
49{
50 char buf[1024] = {0};
51 char dns[128] = {0};
52 int offset = 0;
53 int fd = -1;
54 mbtk_ipv4_info_t ipv4;
55 mbtk_ipv6_info_t ipv6;
56 sprintf(buf, "route add default dev ccinet%d", profile_idx -1);
57 system(buf);
58
59 int ret = mbtk_data_call_state_get(qser_info_handle, profile_idx, &ipv4, &ipv6);
60 if(ret != 0)
61 return -1;
62 else
63 {
64 memset(buf, 0x0, 1024);
65 memset(dns, 0x0, 128);
66 offset = sprintf(buf, "search lan\n");
67 if(ipv4.valid)
68 {
69 if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), dns, 32) == NULL) {
70 LOGD("PrimaryDNS error.");
71 } else {
72 LOGD("PrimaryDNS : %s", dns);
73 }
74 offset += sprintf(buf + offset, "nameserver %s\n", dns);
75 memset(dns, 0x0, 128);
76 if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), dns, 32) == NULL) {
77 LOGD("SecondaryDNS error.");
78 } else {
79 LOGD("SecondaryDNS : %s", dns);
80 }
81 offset += sprintf(buf + offset, "nameserver %s\n", dns);
82 }
83 if(ipv6.valid)
84 {
85 memset(dns, 0x0, 128);
86 if(ipv6_2_str(&(ipv6.PrimaryDNS), dns))
87 {
88 LOGD("PrimaryDNS error.");
89 } else {
90 LOGD("PrimaryDNS : %s", dns);
91 }
92 offset += sprintf(buf + offset, "nameserver %s\n", dns);
93 memset(dns, 0x0, 128);
94 if(ipv6_2_str(&(ipv6.SecondaryDNS), dns))
95 {
96 LOGD("SecondaryDNS error.");
97 } else {
98 LOGD("SecondaryDNS : %s", dns);
99 }
100 offset += sprintf(buf + offset, "nameserver %s\n", dns);
101 }
102
103 if(offset > 0)
104 {
105 fd = open("/tmp/resolv.conf", O_WRONLY | O_TRUNC);
106 if(fd < 0)
107 {
108 LOGD("mbtk_route_config : open fail.");
109 return -1;
110 }
111
112 ret = write(fd, buf, offset);
113 if(ret < 0)
114 {
115 LOGD("mbtk_route_config : write fail.");
116 }
117
118 close(fd);
119 }
120 }
121
122 return 0;
123}
124#endif
125
wangyouqiange2498f12024-01-06 17:55:36 +0800126char qser_get_apn_profile_idx(void)
127{
128 char i = 0;
129 for(i = QSER_PROFILE_IDX_MIN; i < 8; i++)
130 {
131 if(qser_apn_info_state[i] == FALSE)
132 {
133 return i;
134 }
135 }
136
137 return i;
138}
139
140int qser_check_profile_idx(unsigned char profile_idx)
141{
142 if(profile_idx < QSER_PROFILE_IDX_MIN || profile_idx > QSER_PROFILE_IDX_MAX)
143 {
144 LOGE("[qser_data_call] IDX range error.");
145 return QSER_RESULT_FAIL;
146 }
147
148 if(qser_apn_info_state[profile_idx] != TRUE)
149 {
150 LOGE("[qser_data_call] profile_idx is not exist.");
151 return QSER_RESULT_FAIL;
152 }
153
154 return QSER_RESULT_SUCCESS;
155}
156
wangyouqiang84179c82024-01-05 15:42:55 +0800157int qser_apn_info_param_convert(int profile_idx, qser_apn_info_s *new_apn, mbtk_apn_info_t *old_apn)
158{
159 if(new_apn == NULL || old_apn == NULL)
160 {
161 LOGE("[qser_data_call] qser_apn_info_param_convert apn param is NULL.");
162 return QSER_RESULT_FAIL;
163 }
164
165 //get ip type
166 if(old_apn->ip_type == MBTK_IP_TYPE_IPV4V6) // IPV4V6
167 {
168 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4V6;
169 }
170 else if(old_apn->ip_type == MBTK_IP_TYPE_IP) // IPV4
171 {
172 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4;
173 }
174 else if(old_apn->ip_type == MBTK_IP_TYPE_IPV6) // IPV6
175 {
176 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV6;
177 }
178 else
179 {
180 new_apn->pdp_type = QSER_APN_PDP_TYPE_PPP;
181 }
182
183 //get apn name
184 if(strlen(old_apn->apn)+1 > QSER_APN_NAME_SIZE)
185 {
186 LOGE("[qser_data_call] apn_nmea length verylong.");
187 return QSER_RESULT_FAIL;
188 }
189 else
190 {
191 if(strlen(old_apn->apn) > 0)
192 {
193 memcpy(new_apn->apn_name, old_apn->apn,strlen(old_apn->apn)+1);
194 }
195 else
196 {
197 memset(new_apn->apn_name, 0x0, QSER_APN_NAME_SIZE);
198 }
199 }
200
201 //get apn user
202 if(strlen(old_apn->user)+1 > QSER_APN_USERNAME_SIZE)
203 {
204 LOGE("[qser_data_call] apn_user length verylong.");
205 return QSER_RESULT_FAIL;
206 }
207 else
208 {
209 if(strlen(old_apn->user) > 0)
210 {
211 memcpy(new_apn->username, old_apn->user, strlen(old_apn->user)+1);
212 }
213 else
214 {
215 memset(new_apn->username , 0x0, QSER_APN_USERNAME_SIZE);
216 }
217 }
218
219 //get apn password
220 if(strlen(old_apn->pass)+1 > QSER_APN_PASSWORD_SIZE)
221 {
222 LOGE("[qser_data_call] apn_password length verylong.");
223 return QSER_RESULT_FAIL;
224 }
225 else
226 {
227 if(strlen(old_apn->pass) > 0)
228 {
229 memcpy(new_apn->password, old_apn->pass, strlen(old_apn->pass)+1);
230 }
231 else
232 {
233 memset(new_apn->username , 0x0, QSER_APN_PASSWORD_SIZE);
234 }
235 }
236
237 //get apn proto
238 if(strlen(old_apn->auth) > 0)
239 {
240 if(strcmp(old_apn->auth, "NONE") == 0)
241 {
242 new_apn->auth_proto = QSER_APN_AUTH_PROTO_NONE;
243 }
244 else if(strcmp(old_apn->auth, "PAP") == 0)
245 {
246 new_apn->auth_proto = QSER_APN_AUTH_PROTO_PAP;
247 }
248 else if(strcmp(old_apn->auth, "CHAP") == 0)
249 {
250 new_apn->auth_proto = QSER_APN_AUTH_PROTO_CHAP;
251 }
252 else
253 {
254 LOGE("[qser_data_call] auth input error!");
255 return QSER_RESULT_FAIL;
256 }
257 }
258
259 //get apn type
260 new_apn->profile_idx = profile_idx;
261 memset(new_apn->apn_type, 0x0, QSER_APN_NAME_SIZE);
262 if(strlen(qser_apn_info[profile_idx].apn_type) > 0)
263 {
264 memcpy(new_apn->apn_type, qser_apn_info[profile_idx].apn_type, strlen(qser_apn_info[profile_idx].apn_type));
265 }
266
267 return QSER_RESULT_SUCCESS;
268}
269
r.xiaof6ec4822024-04-03 02:46:00 -0700270/*Check parameter*/
271int qser_check_apn_name_type(qser_apn_info_s *apn)
272{
273 int pdp_type_tmp = 0;
274 for (;pdp_type_tmp < QSER_APN_NUM; pdp_type_tmp++)
275 {
276 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)
277 {
278 LOGE("[qser_data_call] qser_check_apn_name_type error!");
279 return QSER_RESULT_FAIL;
280 }
281 }
282
283 return QSER_RESULT_SUCCESS;
284}
285
286
wangyouqiang84179c82024-01-05 15:42:55 +0800287void qser_wan_net_state_change_cb(const void* data, int data_len)
288{
289 if(data == NULL || data_len == 0)
290 {
291 return;
292 }
293
294 uint8 *net_data = NULL;
295 net_data = (uint8 *)data;
296
297 if(qser_net_status_cb != NULL)
298 {
wangyouqiange2498f12024-01-06 17:55:36 +0800299 qser_data_call_state_s state = {0};
300 state.profile_idx = now_idx;
301 state.ip_family = qser_apn_info[now_idx].pdp_type;
302 if((*net_data > 100 && *net_data < 200) || *net_data == 1)
303 {
304 state.state = QSER_DATA_CALL_CONNECTED;
305 state.err = QSER_DATA_CALL_ERROR_NONE;
306 }
307 else if(*net_data > 200)
308 {
309 state.state = QSER_DATA_CALL_DISCONNECTED;
310 state.err = QSER_DATA_CALL_ERROR_NONE;
311 }
312 else
313 {
314 return;
315 }
316
317 qser_net_status_cb(&state);
wangyouqiang84179c82024-01-05 15:42:55 +0800318 }
319}
wangyouqiange2498f12024-01-06 17:55:36 +0800320
321static void* data_call_async_thread(void* arg)
322{
323 qser_data_call_error_e err;
324 int ret = qser_data_call_start(&qser_data_backup, &err);
325 if(ret != QSER_RESULT_SUCCESS)
326 {
327 LOGE("[qser_data_call] qser_data_call_start() fail.");
328 }
329
330 return NULL;
331}
332
wangyouqiang84179c82024-01-05 15:42:55 +0800333/******************************FUNC*****************************************/
334
335/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +0800336int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
337{
wangyouqiang84179c82024-01-05 15:42:55 +0800338 //UNUSED(evt_cb);
339 if(!inited && qser_info_handle == NULL)
340 {
341 qser_info_handle = mbtk_info_handle_get();
342 if(qser_info_handle)
343 {
344 qser_info_handle_num++;
345 inited = TRUE;
346 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
347 }
348 else
349 {
350 LOGE("[qser_data_call] mbtk_info_handle_get() fail.");
351 return QSER_RESULT_FAIL;
352 }
353 }
354 else
355 {
356 if(!inited)
357 {
358 qser_info_handle_num++;
359 inited = TRUE;
360 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
361 }
362 }
363 qser_net_status_cb = evt_cb;
b.liu5fa9e772023-11-23 18:00:55 +0800364
wangyouqiange2498f12024-01-06 17:55:36 +0800365 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
366 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
367 mbtk_apn_info_t apns[10] = {0};
368 int apn_num = 10;
369 char qser_apn_type[32] = {0};
370 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
371 if(ret != 0)
372 {
373 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
374 return QSER_RESULT_FAIL;
375 }
376 else
377 {
378 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
379 {
380 int i = 0;
381 for(i = 0; i < apn_num; i++)
382 {
383 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
384 {
385 LOGE("[qser_data_call] idx no open.");
386 continue;
387 }
b.liuf37bd332024-03-18 13:51:24 +0800388
389#if defined(MBTK_ALL_CID_SUPPORT)
390 if(qser_apn_add_save_state[apns[i].cid - 1] == '2')
391 {
392 qser_apn_default_idx = apns[i].cid - 1;
393 }
394#endif
395
wangyouqiange2498f12024-01-06 17:55:36 +0800396 if(qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]) != 0)
397 {
398 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
399 return QSER_RESULT_FAIL;
400 }
401 else
402 {
403 qser_apn_info_state[apns[i].cid - 1] = TRUE;
404 sprintf(qser_apn_type, "persist.qser.apn.type%d", apns[i].cid - 1);
405 property_get(qser_apn_type, qser_apn_info[apns[i].cid - 1].apn_type, NULL);
406 }
407 }
408 }
409 }
wangyouqiang84179c82024-01-05 15:42:55 +0800410 LOGE("[qser_data_call] mbtk_info_handle_get() success.");
411 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800412}
413
414void qser_data_call_destroy(void)
415{
wangyouqiang84179c82024-01-05 15:42:55 +0800416 if(qser_info_handle)
417 {
418 LOGE("qser_info_handle_num = %d", qser_info_handle_num);
419 if(qser_info_handle_num == 1)
420 { // 最后一个引用,可释放。
421 int ret = mbtk_info_handle_free(&qser_info_handle);
422 if(ret)
423 {
424 LOGE("[qser_data_call] mbtk_info_handle_free() fail.");
425 }
426 else
427 {
428 qser_info_handle_num = 0;
429 qser_info_handle = NULL;
430 inited = FALSE;
431 }
432 }
433 else
434 {
435 qser_info_handle_num--;
436 }
437 }
438 else
439 {
440 LOGE("[qser_data_call] handle not inited.");
441 }
b.liu5fa9e772023-11-23 18:00:55 +0800442}
443
444int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
445{
wangyouqiang84179c82024-01-05 15:42:55 +0800446 //UNUSED(data_call);
447 //UNUSED(err);
448 if(data_call == NULL || err == NULL)
449 {
450 LOGE("[qser_data_call] data_call or err is NULL.");
451 if(err != NULL)
452 {
453 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
454 }
455 return QSER_RESULT_FAIL;
456 }
457
458 if(qser_info_handle == NULL)
459 {
460 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800461 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800462 return QSER_RESULT_FAIL;
463 }
b.liu5fa9e772023-11-23 18:00:55 +0800464
wangyouqiange2498f12024-01-06 17:55:36 +0800465 if(qser_check_profile_idx(data_call->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800466 {
wangyouqiange2498f12024-01-06 17:55:36 +0800467 LOGE("[qser_data_call] profile_idx is invalid.");
b.liuf37bd332024-03-18 13:51:24 +0800468 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
wangyouqiang84179c82024-01-05 15:42:55 +0800469 return QSER_RESULT_FAIL;
470 }
471
472 int ret = -1;
473 ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
474 if(ret != 0)
475 {
476 LOGE("[qser_data_call] mbtk_data_call_start fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800477 if(ret == MBTK_INFO_ERR_CID_EXIST)
478 {
479 *err = QSER_DATA_CALL_ERROR_PDP_ACTIVATE;
480 }
481 else
482 {
483 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
484 }
wangyouqiang84179c82024-01-05 15:42:55 +0800485 return QSER_RESULT_FAIL;
486 }
487 else
488 {
489 *err = QSER_DATA_CALL_ERROR_NONE;
490 }
wangyouqiange2498f12024-01-06 17:55:36 +0800491
492 now_idx = data_call->profile_idx;
b.liuf37bd332024-03-18 13:51:24 +0800493
494#if defined(MBTK_ALL_CID_SUPPORT)
495 if(qser_apn_default_idx == data_call->profile_idx)
496 {
497 qser_route_config(qser_apn_default_idx + 1);
498 }
499#endif
500
wangyouqiange2498f12024-01-06 17:55:36 +0800501 return QSER_RESULT_SUCCESS;
502}
503
504int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
505{
506 //UNUSED(data_call);
507 UNUSED(err);
508 if(data_call == NULL || err == NULL)
509 {
510 LOGE("[qser_data_call] data_call or err is NULL.");
511 if(err != NULL)
512 {
513 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
514 }
515 return QSER_RESULT_FAIL;
516 }
517
518 if(qser_info_handle == NULL)
519 {
520 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800521 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiange2498f12024-01-06 17:55:36 +0800522 return QSER_RESULT_FAIL;
523 }
524
525 if(qser_check_profile_idx(data_call->profile_idx) < 0)
526 {
527 LOGE("[qser_data_call] profile_idx is invalid.");
b.liuf37bd332024-03-18 13:51:24 +0800528 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
wangyouqiange2498f12024-01-06 17:55:36 +0800529 return QSER_RESULT_FAIL;
530 }
531
532 pthread_attr_t thread_attr;
533 pthread_t data_call_thread_id;
534 pthread_attr_init(&thread_attr);
535 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
536 {
537 LOGE("[qser_data_call] pthread_attr_setdetachstate() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800538 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800539 return QSER_RESULT_FAIL;
540 }
541
542 memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
543 if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, NULL))
544 {
545 LOGE("[qser_data_call] pthread_create() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800546 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800547 return QSER_RESULT_FAIL;
548 }
549 pthread_attr_destroy(&thread_attr);
550 now_idx = data_call->profile_idx;
551
wangyouqiang84179c82024-01-05 15:42:55 +0800552 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800553}
554
555int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
556{
wangyouqiang84179c82024-01-05 15:42:55 +0800557 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800558 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800559 //UNUSED(err);
560 if(err == NULL)
561 {
562 LOGE("[qser_data_call] err is NULL.");
563 return QSER_RESULT_FAIL;
564 }
b.liu5fa9e772023-11-23 18:00:55 +0800565
wangyouqiang84179c82024-01-05 15:42:55 +0800566 if(qser_info_handle == NULL)
567 {
568 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800569 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800570 return QSER_RESULT_FAIL;
571 }
572
wangyouqiange2498f12024-01-06 17:55:36 +0800573 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800574 {
wangyouqiange2498f12024-01-06 17:55:36 +0800575 LOGE("[qser_data_call] profile_idx is invalid.");
b.liuf37bd332024-03-18 13:51:24 +0800576 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
wangyouqiang84179c82024-01-05 15:42:55 +0800577 return QSER_RESULT_FAIL;
578 }
579
580 int ret = -1;
581 ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
582 if(ret != 0)
583 {
584 LOGE("[qser_data_call] mbtk_data_call_stop fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800585 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
586 {
587 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
588 }
589 else
590 {
591 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
592 }
wangyouqiang84179c82024-01-05 15:42:55 +0800593 return QSER_RESULT_FAIL;
594 }
595 else
596 {
597 *err = QSER_DATA_CALL_ERROR_NONE;
598 }
wangyouqiange2498f12024-01-06 17:55:36 +0800599
600 now_idx = 0;
wangyouqiang84179c82024-01-05 15:42:55 +0800601 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800602}
603
604int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
605 qser_data_call_info_s *info, qser_data_call_error_e *err)
606{
wangyouqiang84179c82024-01-05 15:42:55 +0800607 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800608 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800609 //UNUSED(info);
610 //UNUSED(err);
b.liu5fa9e772023-11-23 18:00:55 +0800611
wangyouqiang84179c82024-01-05 15:42:55 +0800612 if(info == NULL || err == NULL)
613 {
614 LOGE("[qser_data_call] info or err is NULL.");
615 if(err != NULL)
616 {
617 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
618 }
619 return QSER_RESULT_FAIL;
620 }
621
622 if(qser_info_handle == NULL)
623 {
624 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800625 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800626 return QSER_RESULT_FAIL;
627 }
628
wangyouqiange2498f12024-01-06 17:55:36 +0800629 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800630 {
wangyouqiange2498f12024-01-06 17:55:36 +0800631 LOGE("[qser_data_call] profile_idx is invalid.");
b.liuf37bd332024-03-18 13:51:24 +0800632 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
wangyouqiang84179c82024-01-05 15:42:55 +0800633 return QSER_RESULT_FAIL;
634 }
635
636 int ret = -1;
637 mbtk_ipv4_info_t ipv4;
638 mbtk_ipv6_info_t ipv6;
639#ifdef QSER_TEST
640 char v4_buff[32] = {0};
641 char v6_buff[128] = {0};
642#endif
643 memset(info, 0, sizeof(qser_data_call_info_s));
644 ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
645 if(ret != 0)
646 {
647 LOGE("[qser_data_call] mbtk_data_call_state_get fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800648 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
649 {
650 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
651 }
652 else
653 {
654 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
655 }
wangyouqiang84179c82024-01-05 15:42:55 +0800656 return QSER_RESULT_FAIL;
657 }
658 else
659 {
660 info->profile_idx = profile_idx;
661 if(ipv4.valid)
662 {
663 info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
664 info->v4.state = QSER_DATA_CALL_CONNECTED;
665 sprintf(info->v4.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800666 info->v4.addr.ip.s_addr = ipv4.IPAddr;
667 info->v4.addr.pri_dns.s_addr = ipv4.PrimaryDNS;
668 info->v4.addr.sec_dns.s_addr = ipv4.SecondaryDNS;
669
wangyouqiang84179c82024-01-05 15:42:55 +0800670#ifdef QSER_TEST
b.liuf37bd332024-03-18 13:51:24 +0800671 //LOGE("[qser_data_call] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
wangyouqiang84179c82024-01-05 15:42:55 +0800672 if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
673 LOGE("[qser_data_call] IP error.");
674 } else {
675 LOGE("[qser_data_call] IP : %s", v4_buff);
676 }
677 if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
678 LOGE("[qser_data_call] PrimaryDNS error.");
679 } else {
680 LOGE("[qser_data_call] PrimaryDNS : %s", v4_buff);
681 }
682 if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
683 LOGE("[qser_data_call] SecondaryDNS error.");
684 } else {
685 LOGE("[qser_data_call] SecondaryDNS : %s", v4_buff);
686 }
687#endif
688 }
689
690 if(ipv6.valid)
691 {
692 info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
693 info->v6.state = QSER_DATA_CALL_CONNECTED;
694 sprintf(info->v6.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800695 memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), sizeof(ipv6.IPV6Addr));
696 memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), sizeof(ipv6.PrimaryDNS));
697 memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), sizeof(ipv6.SecondaryDNS));
wangyouqiang84179c82024-01-05 15:42:55 +0800698#ifdef QSER_TEST
699 if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
700 {
701 LOGE("[qser_data_call] IP error.");
702 } else {
703 LOGE("[qser_data_call] IP : %s", v6_buff);
704 }
705 if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
706 {
707 LOGE("[qser_data_call] PrimaryDNS error.");
708 } else {
709 LOGE("[qser_data_call] PrimaryDNS : %s", v6_buff);
710 }
711 if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
712 {
713 LOGE("[qser_data_call] SecondaryDNS error.");
714 } else {
715 LOGE("[qser_data_call] SecondaryDNS : %s", v6_buff);
716 }
717#endif
718 }
719
720 if(ipv4.valid && ipv6.valid)
721 {
722 info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
723 }
724
725 if(!ipv4.valid && !ipv6.valid)
726 {
727 info->v4.state = QSER_DATA_CALL_DISCONNECTED;
728 info->v6.state = QSER_DATA_CALL_DISCONNECTED;
729 }
730 }
731
732 *err = QSER_DATA_CALL_ERROR_NONE;
733 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800734}
735
736int qser_apn_set(qser_apn_info_s *apn)
737{
wangyouqiang84179c82024-01-05 15:42:55 +0800738 //UNUSED(apn);
739 if(qser_info_handle == NULL)
740 {
741 LOGE("[qser_data_call] handle is NULL.");
742 return QSER_RESULT_FAIL;
743 }
744
745 if(apn == NULL)
746 {
747 LOGE("[qser_data_call] apn param is NULL.");
748 return QSER_RESULT_FAIL;
749 }
b.liu5fa9e772023-11-23 18:00:55 +0800750
wangyouqiange2498f12024-01-06 17:55:36 +0800751 if(qser_check_profile_idx(apn->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800752 {
wangyouqiange2498f12024-01-06 17:55:36 +0800753 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800754 return QSER_RESULT_FAIL;
755 }
756
757 if(strlen(apn->apn_name) == 0)
758 {
759 LOGE("[qser_data_call] apn_name is NULL.");
760 return QSER_RESULT_FAIL;
761 }
r.xiaof6ec4822024-04-03 02:46:00 -0700762 /*add name and type verify*/
763 if (qser_check_apn_name_type(apn) < 0)
764 {
765 LOGE("[qser_data_call] check param error.");
766 return QSER_RESULT_FAIL;
767 }
wangyouqiang84179c82024-01-05 15:42:55 +0800768
b.liuf37bd332024-03-18 13:51:24 +0800769#if 0
wangyouqiange2498f12024-01-06 17:55:36 +0800770 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
771 {
772 LOGE("[qser_data_call] iot_default is exist.");
773 return QSER_RESULT_FAIL;
774 }
b.liuf37bd332024-03-18 13:51:24 +0800775#endif
wangyouqiange2498f12024-01-06 17:55:36 +0800776
wangyouqiang84179c82024-01-05 15:42:55 +0800777 int ret = -1;
778 char mbtk_auth[32]={0};
wangyouqiange2498f12024-01-06 17:55:36 +0800779 char qser_apn_type[32] = {0};
wangyouqiang84179c82024-01-05 15:42:55 +0800780 mbtk_ip_type_enum pdp_type = MBTK_IP_TYPE_IPV4V6;
r.xiaof6ec4822024-04-03 02:46:00 -0700781
wangyouqiang84179c82024-01-05 15:42:55 +0800782 if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
783 {
784 pdp_type = MBTK_IP_TYPE_IP;
785 }
786 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
787 {
788 pdp_type = MBTK_IP_TYPE_IPV6;
789 }
790 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
791 {
792 pdp_type = MBTK_IP_TYPE_IPV4V6;
793 }
794 else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
795 {
796 pdp_type = MBTK_IP_TYPE_PPP;
797 }
798 else
799 {
800 LOGE("[qser_data_call] pdp_type error.");
801 return QSER_RESULT_FAIL;
802 }
803
804 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE || apn->auth_proto == QSER_APN_AUTH_PROTO_DEFAULT)
805 {
806 memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
807 }
808 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP)
809 {
810 memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
811 }
812 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_CHAP)
813 {
814 memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
815 }
816 #if 0
817 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
818 {
819 //NOT SUPPORT
820 }
821 #endif
822 else
823 {
824 LOGE("[qser_data_call] auth input error!");
825 return QSER_RESULT_FAIL;
826 }
827
828 if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
829 {
830 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);
831 }
832 else
833 {
834 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);
835 }
wangyouqiange2498f12024-01-06 17:55:36 +0800836
wangyouqiang84179c82024-01-05 15:42:55 +0800837 ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
838 if(ret < 0)
839 {
840 LOGE("[qser_data_call] mbtk_apn_set fail!");
841 return QSER_RESULT_FAIL;
842 }
843
wangyouqiange2498f12024-01-06 17:55:36 +0800844 sprintf(qser_apn_type, "persist.qser.apn.type%d", apn->profile_idx);
845 property_set(qser_apn_type, apn->apn_type);
wangyouqiang84179c82024-01-05 15:42:55 +0800846 memcpy(&qser_apn_info[apn->profile_idx], apn, sizeof(qser_apn_info_s));
847 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800848}
849
850int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
851{
wangyouqiang84179c82024-01-05 15:42:55 +0800852 //UNUSED(profile_idx);
853 //UNUSED(apn);
854 if(qser_info_handle == NULL)
855 {
856 LOGE("[qser_data_call] handle is NULL.");
857 return QSER_RESULT_FAIL;
858 }
859
860 if(apn == NULL)
861 {
862 LOGE("[qser_data_call] apn param is NULL.");
863 return QSER_RESULT_FAIL;
864 }
b.liu5fa9e772023-11-23 18:00:55 +0800865
wangyouqiange2498f12024-01-06 17:55:36 +0800866 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800867 {
wangyouqiange2498f12024-01-06 17:55:36 +0800868 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800869 return QSER_RESULT_FAIL;
870 }
871
872 //get apn info
873 mbtk_apn_info_t apns[10] = {0};
874 int apn_num = 10;
875 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
876 if(ret != 0)
877 {
878 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
879 return QSER_RESULT_FAIL;
880 }
881 else
882 {
883 int i = 0;
884 for(i = 0; i < apn_num; i++)
885 {
886 if(apns[i].cid == profile_idx + 1)
887 {
888 LOGE("[qser_data_call] find IDX.");
889 break;
890 }
891 }
892
893 if(i == apn_num)
894 {
895 LOGE("[qser_data_call] not find IDX.[apn_num = %d]", apn_num);
896 return QSER_RESULT_FAIL;
897 }
898
899 if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
900 {
901 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
902 return QSER_RESULT_FAIL;
903 }
904 }
905 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800906}
907
908int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
909{
wangyouqiange2498f12024-01-06 17:55:36 +0800910 //UNUSED(apn);
911 //UNUSED(profile_idx);
912 if(qser_info_handle == NULL)
913 {
914 LOGE("[qser_data_call] handle is NULL.");
915 return QSER_RESULT_FAIL;
916 }
917
918 if(apn == NULL)
919 {
920 LOGE("[qser_data_call] apn param is NULL.");
921 return QSER_RESULT_FAIL;
922 }
b.liu5fa9e772023-11-23 18:00:55 +0800923
b.liuf37bd332024-03-18 13:51:24 +0800924 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
925 {
926 if(qser_apn_default_idx > -1)
927 {
928 LOGE("[qser_data_call] iot_default is exist.");
929 return QSER_RESULT_FAIL;
930 }
931 }
932
wangyouqiange2498f12024-01-06 17:55:36 +0800933 int ret = 0;
934 char idx = qser_get_apn_profile_idx();
935 if(idx >= 8)
936 {
937 LOGE("[qser_data_call] idx is full.");
938 return QSER_RESULT_FAIL;
939 }
940 else
941 {
942 qser_apn_info_state[idx] = TRUE;
943 qser_apn_info_s set_apn;
944 set_apn.profile_idx = idx;
945 set_apn.pdp_type = apn->pdp_type;
946 set_apn.auth_proto = apn->auth_proto;
947 memcpy(set_apn.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
948 memcpy(set_apn.username, apn->username, QSER_APN_USERNAME_SIZE);
949 memcpy(set_apn.password, apn->password, QSER_APN_PASSWORD_SIZE);
950 memcpy(set_apn.apn_type, apn->apn_type, QSER_APN_NAME_SIZE);
951 ret = qser_apn_set(&set_apn);
952 if(ret != 0)
953 {
954 LOGE("[qser_data_call] qser_apn_set fail.");
955 qser_apn_info_state[idx] = FALSE;
956 return QSER_RESULT_FAIL;
957 }
958 *profile_idx = idx;
b.liuf37bd332024-03-18 13:51:24 +0800959#if defined(MBTK_ALL_CID_SUPPORT)
960 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
961 {
962 qser_apn_add_save_state[idx] = '2';
963 qser_apn_default_idx = idx;
964 }
965 else
966#endif
967 {
968 qser_apn_add_save_state[idx] = '1';
969 }
970
wangyouqiange2498f12024-01-06 17:55:36 +0800971 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
972 }
973 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800974}
975
976int qser_apn_del(unsigned char profile_idx)
977{
wangyouqiange2498f12024-01-06 17:55:36 +0800978 //UNUSED(profile_idx);
979 if(qser_info_handle == NULL)
980 {
981 LOGE("[qser_data_call] handle is NULL.");
982 return QSER_RESULT_FAIL;
983 }
b.liu5fa9e772023-11-23 18:00:55 +0800984
wangyouqiange2498f12024-01-06 17:55:36 +0800985 if(qser_check_profile_idx(profile_idx) < 0)
986 {
987 LOGE("[qser_data_call] profile_idx is invalid.");
988 return QSER_RESULT_FAIL;
989 }
990
991 qser_apn_info_state[profile_idx] = FALSE;
992 qser_apn_add_save_state[profile_idx] = '0';
b.liuf37bd332024-03-18 13:51:24 +0800993
994#if defined(MBTK_ALL_CID_SUPPORT)
995 if(profile_idx == qser_apn_default_idx)
996 {
997 qser_apn_default_idx = -1;
998 }
999#endif
1000
wangyouqiange2498f12024-01-06 17:55:36 +08001001 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
1002 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001003}
1004
1005int qser_apn_get_list(qser_apn_info_list_s *apn_list)
1006{
wangyouqiang84179c82024-01-05 15:42:55 +08001007 //UNUSED(apn_list);
b.liu5fa9e772023-11-23 18:00:55 +08001008
wangyouqiang84179c82024-01-05 15:42:55 +08001009 if(qser_info_handle == NULL)
1010 {
1011 LOGE("[qser_data_call] handle is NULL.");
1012 return QSER_RESULT_FAIL;
1013 }
1014
1015 if(apn_list == NULL)
1016 {
1017 LOGE("[qser_data_call] apn_list param is NULL.");
1018 return QSER_RESULT_FAIL;
1019 }
1020
wangyouqiange2498f12024-01-06 17:55:36 +08001021 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
1022 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001023 mbtk_apn_info_t apns[10] = {0};
1024 int apn_num = 10;
1025 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1026 if(ret != 0)
1027 {
1028 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
1029 return QSER_RESULT_FAIL;
1030 }
1031 else
1032 {
1033 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
1034 {
1035 int i = 0;
wangyouqiange2498f12024-01-06 17:55:36 +08001036 apn_list->cnt = 0;
wangyouqiang84179c82024-01-05 15:42:55 +08001037 for(i = 0; i < apn_num; i++)
1038 {
wangyouqiange2498f12024-01-06 17:55:36 +08001039 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
1040 {
1041 LOGE("[qser_data_call] idx no open.");
1042 continue;
1043 }
wangyouqiang84179c82024-01-05 15:42:55 +08001044 if(qser_apn_info_param_convert(apns[i].cid - 1, &apn_list->apn[i], &apns[i]) != 0)
1045 {
1046 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
1047 return QSER_RESULT_FAIL;
1048 }
wangyouqiange2498f12024-01-06 17:55:36 +08001049 apn_list->cnt++;
wangyouqiang84179c82024-01-05 15:42:55 +08001050 }
wangyouqiang84179c82024-01-05 15:42:55 +08001051 }
1052 else if(apn_num > QSER_APN_MAX_LIST)
1053 {
1054 LOGE("[qser_data_call] apn_num overlong");
1055 return QSER_RESULT_FAIL;
1056 }
1057 else
1058 {
1059 apn_list->cnt = 0;
1060 }
1061 }
1062 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001063}
wangyouqiang84179c82024-01-05 15:42:55 +08001064/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +08001065