blob: 095b41a54a08d1a9e244f4d6c9394b8383bc6d21 [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
270void qser_wan_net_state_change_cb(const void* data, int data_len)
271{
272 if(data == NULL || data_len == 0)
273 {
274 return;
275 }
276
277 uint8 *net_data = NULL;
278 net_data = (uint8 *)data;
279
280 if(qser_net_status_cb != NULL)
281 {
wangyouqiange2498f12024-01-06 17:55:36 +0800282 qser_data_call_state_s state = {0};
283 state.profile_idx = now_idx;
284 state.ip_family = qser_apn_info[now_idx].pdp_type;
285 if((*net_data > 100 && *net_data < 200) || *net_data == 1)
286 {
287 state.state = QSER_DATA_CALL_CONNECTED;
288 state.err = QSER_DATA_CALL_ERROR_NONE;
289 }
290 else if(*net_data > 200)
291 {
292 state.state = QSER_DATA_CALL_DISCONNECTED;
293 state.err = QSER_DATA_CALL_ERROR_NONE;
294 }
295 else
296 {
297 return;
298 }
299
300 qser_net_status_cb(&state);
wangyouqiang84179c82024-01-05 15:42:55 +0800301 }
302}
wangyouqiange2498f12024-01-06 17:55:36 +0800303
304static void* data_call_async_thread(void* arg)
305{
306 qser_data_call_error_e err;
307 int ret = qser_data_call_start(&qser_data_backup, &err);
308 if(ret != QSER_RESULT_SUCCESS)
309 {
310 LOGE("[qser_data_call] qser_data_call_start() fail.");
311 }
312
313 return NULL;
314}
315
wangyouqiang84179c82024-01-05 15:42:55 +0800316/******************************FUNC*****************************************/
317
318/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +0800319int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
320{
wangyouqiang84179c82024-01-05 15:42:55 +0800321 //UNUSED(evt_cb);
322 if(!inited && qser_info_handle == NULL)
323 {
324 qser_info_handle = mbtk_info_handle_get();
325 if(qser_info_handle)
326 {
327 qser_info_handle_num++;
328 inited = TRUE;
329 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
330 }
331 else
332 {
333 LOGE("[qser_data_call] mbtk_info_handle_get() fail.");
334 return QSER_RESULT_FAIL;
335 }
336 }
337 else
338 {
339 if(!inited)
340 {
341 qser_info_handle_num++;
342 inited = TRUE;
343 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
344 }
345 }
346 qser_net_status_cb = evt_cb;
b.liu5fa9e772023-11-23 18:00:55 +0800347
wangyouqiange2498f12024-01-06 17:55:36 +0800348 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
349 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
350 mbtk_apn_info_t apns[10] = {0};
351 int apn_num = 10;
352 char qser_apn_type[32] = {0};
353 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
354 if(ret != 0)
355 {
356 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
357 return QSER_RESULT_FAIL;
358 }
359 else
360 {
361 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
362 {
363 int i = 0;
364 for(i = 0; i < apn_num; i++)
365 {
366 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
367 {
368 LOGE("[qser_data_call] idx no open.");
369 continue;
370 }
b.liuf37bd332024-03-18 13:51:24 +0800371
372#if defined(MBTK_ALL_CID_SUPPORT)
373 if(qser_apn_add_save_state[apns[i].cid - 1] == '2')
374 {
375 qser_apn_default_idx = apns[i].cid - 1;
376 }
377#endif
378
wangyouqiange2498f12024-01-06 17:55:36 +0800379 if(qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]) != 0)
380 {
381 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
382 return QSER_RESULT_FAIL;
383 }
384 else
385 {
386 qser_apn_info_state[apns[i].cid - 1] = TRUE;
387 sprintf(qser_apn_type, "persist.qser.apn.type%d", apns[i].cid - 1);
388 property_get(qser_apn_type, qser_apn_info[apns[i].cid - 1].apn_type, NULL);
389 }
390 }
391 }
392 }
wangyouqiang84179c82024-01-05 15:42:55 +0800393 LOGE("[qser_data_call] mbtk_info_handle_get() success.");
394 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800395}
396
397void qser_data_call_destroy(void)
398{
wangyouqiang84179c82024-01-05 15:42:55 +0800399 if(qser_info_handle)
400 {
401 LOGE("qser_info_handle_num = %d", qser_info_handle_num);
402 if(qser_info_handle_num == 1)
403 { // 最后一个引用,可释放。
404 int ret = mbtk_info_handle_free(&qser_info_handle);
405 if(ret)
406 {
407 LOGE("[qser_data_call] mbtk_info_handle_free() fail.");
408 }
409 else
410 {
411 qser_info_handle_num = 0;
412 qser_info_handle = NULL;
413 inited = FALSE;
414 }
415 }
416 else
417 {
418 qser_info_handle_num--;
419 }
420 }
421 else
422 {
423 LOGE("[qser_data_call] handle not inited.");
424 }
b.liu5fa9e772023-11-23 18:00:55 +0800425}
426
427int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
428{
wangyouqiang84179c82024-01-05 15:42:55 +0800429 //UNUSED(data_call);
430 //UNUSED(err);
431 if(data_call == NULL || err == NULL)
432 {
433 LOGE("[qser_data_call] data_call or err is NULL.");
434 if(err != NULL)
435 {
436 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
437 }
438 return QSER_RESULT_FAIL;
439 }
440
441 if(qser_info_handle == NULL)
442 {
443 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800444 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800445 return QSER_RESULT_FAIL;
446 }
b.liu5fa9e772023-11-23 18:00:55 +0800447
wangyouqiange2498f12024-01-06 17:55:36 +0800448 if(qser_check_profile_idx(data_call->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800449 {
wangyouqiange2498f12024-01-06 17:55:36 +0800450 LOGE("[qser_data_call] profile_idx is invalid.");
b.liuf37bd332024-03-18 13:51:24 +0800451 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
wangyouqiang84179c82024-01-05 15:42:55 +0800452 return QSER_RESULT_FAIL;
453 }
454
455 int ret = -1;
456 ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
457 if(ret != 0)
458 {
459 LOGE("[qser_data_call] mbtk_data_call_start fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800460 if(ret == MBTK_INFO_ERR_CID_EXIST)
461 {
462 *err = QSER_DATA_CALL_ERROR_PDP_ACTIVATE;
463 }
464 else
465 {
466 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
467 }
wangyouqiang84179c82024-01-05 15:42:55 +0800468 return QSER_RESULT_FAIL;
469 }
470 else
471 {
472 *err = QSER_DATA_CALL_ERROR_NONE;
473 }
wangyouqiange2498f12024-01-06 17:55:36 +0800474
475 now_idx = data_call->profile_idx;
b.liuf37bd332024-03-18 13:51:24 +0800476
477#if defined(MBTK_ALL_CID_SUPPORT)
478 if(qser_apn_default_idx == data_call->profile_idx)
479 {
480 qser_route_config(qser_apn_default_idx + 1);
481 }
482#endif
483
wangyouqiange2498f12024-01-06 17:55:36 +0800484 return QSER_RESULT_SUCCESS;
485}
486
487int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
488{
489 //UNUSED(data_call);
490 UNUSED(err);
491 if(data_call == NULL || err == NULL)
492 {
493 LOGE("[qser_data_call] data_call or err is NULL.");
494 if(err != NULL)
495 {
496 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
497 }
498 return QSER_RESULT_FAIL;
499 }
500
501 if(qser_info_handle == NULL)
502 {
503 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800504 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiange2498f12024-01-06 17:55:36 +0800505 return QSER_RESULT_FAIL;
506 }
507
508 if(qser_check_profile_idx(data_call->profile_idx) < 0)
509 {
510 LOGE("[qser_data_call] profile_idx is invalid.");
b.liuf37bd332024-03-18 13:51:24 +0800511 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
wangyouqiange2498f12024-01-06 17:55:36 +0800512 return QSER_RESULT_FAIL;
513 }
514
515 pthread_attr_t thread_attr;
516 pthread_t data_call_thread_id;
517 pthread_attr_init(&thread_attr);
518 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
519 {
520 LOGE("[qser_data_call] pthread_attr_setdetachstate() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800521 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800522 return QSER_RESULT_FAIL;
523 }
524
525 memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
526 if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, NULL))
527 {
528 LOGE("[qser_data_call] pthread_create() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800529 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800530 return QSER_RESULT_FAIL;
531 }
532 pthread_attr_destroy(&thread_attr);
533 now_idx = data_call->profile_idx;
534
wangyouqiang84179c82024-01-05 15:42:55 +0800535 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800536}
537
538int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
539{
wangyouqiang84179c82024-01-05 15:42:55 +0800540 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800541 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800542 //UNUSED(err);
543 if(err == NULL)
544 {
545 LOGE("[qser_data_call] err is NULL.");
546 return QSER_RESULT_FAIL;
547 }
b.liu5fa9e772023-11-23 18:00:55 +0800548
wangyouqiang84179c82024-01-05 15:42:55 +0800549 if(qser_info_handle == NULL)
550 {
551 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800552 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800553 return QSER_RESULT_FAIL;
554 }
555
wangyouqiange2498f12024-01-06 17:55:36 +0800556 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800557 {
wangyouqiange2498f12024-01-06 17:55:36 +0800558 LOGE("[qser_data_call] profile_idx is invalid.");
b.liuf37bd332024-03-18 13:51:24 +0800559 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
wangyouqiang84179c82024-01-05 15:42:55 +0800560 return QSER_RESULT_FAIL;
561 }
562
563 int ret = -1;
564 ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
565 if(ret != 0)
566 {
567 LOGE("[qser_data_call] mbtk_data_call_stop fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800568 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
569 {
570 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
571 }
572 else
573 {
574 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
575 }
wangyouqiang84179c82024-01-05 15:42:55 +0800576 return QSER_RESULT_FAIL;
577 }
578 else
579 {
580 *err = QSER_DATA_CALL_ERROR_NONE;
581 }
wangyouqiange2498f12024-01-06 17:55:36 +0800582
583 now_idx = 0;
wangyouqiang84179c82024-01-05 15:42:55 +0800584 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800585}
586
587int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
588 qser_data_call_info_s *info, qser_data_call_error_e *err)
589{
wangyouqiang84179c82024-01-05 15:42:55 +0800590 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800591 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800592 //UNUSED(info);
593 //UNUSED(err);
b.liu5fa9e772023-11-23 18:00:55 +0800594
wangyouqiang84179c82024-01-05 15:42:55 +0800595 if(info == NULL || err == NULL)
596 {
597 LOGE("[qser_data_call] info or err is NULL.");
598 if(err != NULL)
599 {
600 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
601 }
602 return QSER_RESULT_FAIL;
603 }
604
605 if(qser_info_handle == NULL)
606 {
607 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800608 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800609 return QSER_RESULT_FAIL;
610 }
611
wangyouqiange2498f12024-01-06 17:55:36 +0800612 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800613 {
wangyouqiange2498f12024-01-06 17:55:36 +0800614 LOGE("[qser_data_call] profile_idx is invalid.");
b.liuf37bd332024-03-18 13:51:24 +0800615 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
wangyouqiang84179c82024-01-05 15:42:55 +0800616 return QSER_RESULT_FAIL;
617 }
618
619 int ret = -1;
620 mbtk_ipv4_info_t ipv4;
621 mbtk_ipv6_info_t ipv6;
622#ifdef QSER_TEST
623 char v4_buff[32] = {0};
624 char v6_buff[128] = {0};
625#endif
626 memset(info, 0, sizeof(qser_data_call_info_s));
627 ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
628 if(ret != 0)
629 {
630 LOGE("[qser_data_call] mbtk_data_call_state_get fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800631 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
632 {
633 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
634 }
635 else
636 {
637 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
638 }
wangyouqiang84179c82024-01-05 15:42:55 +0800639 return QSER_RESULT_FAIL;
640 }
641 else
642 {
643 info->profile_idx = profile_idx;
644 if(ipv4.valid)
645 {
646 info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
647 info->v4.state = QSER_DATA_CALL_CONNECTED;
648 sprintf(info->v4.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800649 info->v4.addr.ip.s_addr = ipv4.IPAddr;
650 info->v4.addr.pri_dns.s_addr = ipv4.PrimaryDNS;
651 info->v4.addr.sec_dns.s_addr = ipv4.SecondaryDNS;
652
wangyouqiang84179c82024-01-05 15:42:55 +0800653#ifdef QSER_TEST
b.liuf37bd332024-03-18 13:51:24 +0800654 //LOGE("[qser_data_call] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
wangyouqiang84179c82024-01-05 15:42:55 +0800655 if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
656 LOGE("[qser_data_call] IP error.");
657 } else {
658 LOGE("[qser_data_call] IP : %s", v4_buff);
659 }
660 if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
661 LOGE("[qser_data_call] PrimaryDNS error.");
662 } else {
663 LOGE("[qser_data_call] PrimaryDNS : %s", v4_buff);
664 }
665 if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
666 LOGE("[qser_data_call] SecondaryDNS error.");
667 } else {
668 LOGE("[qser_data_call] SecondaryDNS : %s", v4_buff);
669 }
670#endif
671 }
672
673 if(ipv6.valid)
674 {
675 info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
676 info->v6.state = QSER_DATA_CALL_CONNECTED;
677 sprintf(info->v6.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800678 memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), sizeof(ipv6.IPV6Addr));
679 memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), sizeof(ipv6.PrimaryDNS));
680 memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), sizeof(ipv6.SecondaryDNS));
wangyouqiang84179c82024-01-05 15:42:55 +0800681#ifdef QSER_TEST
682 if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
683 {
684 LOGE("[qser_data_call] IP error.");
685 } else {
686 LOGE("[qser_data_call] IP : %s", v6_buff);
687 }
688 if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
689 {
690 LOGE("[qser_data_call] PrimaryDNS error.");
691 } else {
692 LOGE("[qser_data_call] PrimaryDNS : %s", v6_buff);
693 }
694 if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
695 {
696 LOGE("[qser_data_call] SecondaryDNS error.");
697 } else {
698 LOGE("[qser_data_call] SecondaryDNS : %s", v6_buff);
699 }
700#endif
701 }
702
703 if(ipv4.valid && ipv6.valid)
704 {
705 info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
706 }
707
708 if(!ipv4.valid && !ipv6.valid)
709 {
710 info->v4.state = QSER_DATA_CALL_DISCONNECTED;
711 info->v6.state = QSER_DATA_CALL_DISCONNECTED;
712 }
713 }
714
715 *err = QSER_DATA_CALL_ERROR_NONE;
716 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800717}
718
719int qser_apn_set(qser_apn_info_s *apn)
720{
wangyouqiang84179c82024-01-05 15:42:55 +0800721 //UNUSED(apn);
722 if(qser_info_handle == NULL)
723 {
724 LOGE("[qser_data_call] handle is NULL.");
725 return QSER_RESULT_FAIL;
726 }
727
728 if(apn == NULL)
729 {
730 LOGE("[qser_data_call] apn param is NULL.");
731 return QSER_RESULT_FAIL;
732 }
b.liu5fa9e772023-11-23 18:00:55 +0800733
wangyouqiange2498f12024-01-06 17:55:36 +0800734 if(qser_check_profile_idx(apn->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800735 {
wangyouqiange2498f12024-01-06 17:55:36 +0800736 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800737 return QSER_RESULT_FAIL;
738 }
739
740 if(strlen(apn->apn_name) == 0)
741 {
742 LOGE("[qser_data_call] apn_name is NULL.");
743 return QSER_RESULT_FAIL;
744 }
745
b.liuf37bd332024-03-18 13:51:24 +0800746#if 0
wangyouqiange2498f12024-01-06 17:55:36 +0800747 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
748 {
749 LOGE("[qser_data_call] iot_default is exist.");
750 return QSER_RESULT_FAIL;
751 }
b.liuf37bd332024-03-18 13:51:24 +0800752#endif
wangyouqiange2498f12024-01-06 17:55:36 +0800753
wangyouqiang84179c82024-01-05 15:42:55 +0800754 int ret = -1;
755 char mbtk_auth[32]={0};
wangyouqiange2498f12024-01-06 17:55:36 +0800756 char qser_apn_type[32] = {0};
wangyouqiang84179c82024-01-05 15:42:55 +0800757 mbtk_ip_type_enum pdp_type = MBTK_IP_TYPE_IPV4V6;
758
759 if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
760 {
761 pdp_type = MBTK_IP_TYPE_IP;
762 }
763 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
764 {
765 pdp_type = MBTK_IP_TYPE_IPV6;
766 }
767 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
768 {
769 pdp_type = MBTK_IP_TYPE_IPV4V6;
770 }
771 else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
772 {
773 pdp_type = MBTK_IP_TYPE_PPP;
774 }
775 else
776 {
777 LOGE("[qser_data_call] pdp_type error.");
778 return QSER_RESULT_FAIL;
779 }
780
781 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE || apn->auth_proto == QSER_APN_AUTH_PROTO_DEFAULT)
782 {
783 memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
784 }
785 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP)
786 {
787 memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
788 }
789 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_CHAP)
790 {
791 memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
792 }
793 #if 0
794 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
795 {
796 //NOT SUPPORT
797 }
798 #endif
799 else
800 {
801 LOGE("[qser_data_call] auth input error!");
802 return QSER_RESULT_FAIL;
803 }
804
805 if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
806 {
807 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);
808 }
809 else
810 {
811 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);
812 }
wangyouqiange2498f12024-01-06 17:55:36 +0800813
wangyouqiang84179c82024-01-05 15:42:55 +0800814 ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
815 if(ret < 0)
816 {
817 LOGE("[qser_data_call] mbtk_apn_set fail!");
818 return QSER_RESULT_FAIL;
819 }
820
wangyouqiange2498f12024-01-06 17:55:36 +0800821 sprintf(qser_apn_type, "persist.qser.apn.type%d", apn->profile_idx);
822 property_set(qser_apn_type, apn->apn_type);
wangyouqiang84179c82024-01-05 15:42:55 +0800823 memcpy(&qser_apn_info[apn->profile_idx], apn, sizeof(qser_apn_info_s));
824 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800825}
826
827int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
828{
wangyouqiang84179c82024-01-05 15:42:55 +0800829 //UNUSED(profile_idx);
830 //UNUSED(apn);
831 if(qser_info_handle == NULL)
832 {
833 LOGE("[qser_data_call] handle is NULL.");
834 return QSER_RESULT_FAIL;
835 }
836
837 if(apn == NULL)
838 {
839 LOGE("[qser_data_call] apn param is NULL.");
840 return QSER_RESULT_FAIL;
841 }
b.liu5fa9e772023-11-23 18:00:55 +0800842
wangyouqiange2498f12024-01-06 17:55:36 +0800843 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800844 {
wangyouqiange2498f12024-01-06 17:55:36 +0800845 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800846 return QSER_RESULT_FAIL;
847 }
848
849 //get apn info
850 mbtk_apn_info_t apns[10] = {0};
851 int apn_num = 10;
852 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
853 if(ret != 0)
854 {
855 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
856 return QSER_RESULT_FAIL;
857 }
858 else
859 {
860 int i = 0;
861 for(i = 0; i < apn_num; i++)
862 {
863 if(apns[i].cid == profile_idx + 1)
864 {
865 LOGE("[qser_data_call] find IDX.");
866 break;
867 }
868 }
869
870 if(i == apn_num)
871 {
872 LOGE("[qser_data_call] not find IDX.[apn_num = %d]", apn_num);
873 return QSER_RESULT_FAIL;
874 }
875
876 if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
877 {
878 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
879 return QSER_RESULT_FAIL;
880 }
881 }
882 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800883}
884
885int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
886{
wangyouqiange2498f12024-01-06 17:55:36 +0800887 //UNUSED(apn);
888 //UNUSED(profile_idx);
889 if(qser_info_handle == NULL)
890 {
891 LOGE("[qser_data_call] handle is NULL.");
892 return QSER_RESULT_FAIL;
893 }
894
895 if(apn == NULL)
896 {
897 LOGE("[qser_data_call] apn param is NULL.");
898 return QSER_RESULT_FAIL;
899 }
b.liu5fa9e772023-11-23 18:00:55 +0800900
b.liuf37bd332024-03-18 13:51:24 +0800901 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
902 {
903 if(qser_apn_default_idx > -1)
904 {
905 LOGE("[qser_data_call] iot_default is exist.");
906 return QSER_RESULT_FAIL;
907 }
908 }
909
wangyouqiange2498f12024-01-06 17:55:36 +0800910 int ret = 0;
911 char idx = qser_get_apn_profile_idx();
912 if(idx >= 8)
913 {
914 LOGE("[qser_data_call] idx is full.");
915 return QSER_RESULT_FAIL;
916 }
917 else
918 {
919 qser_apn_info_state[idx] = TRUE;
920 qser_apn_info_s set_apn;
921 set_apn.profile_idx = idx;
922 set_apn.pdp_type = apn->pdp_type;
923 set_apn.auth_proto = apn->auth_proto;
924 memcpy(set_apn.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
925 memcpy(set_apn.username, apn->username, QSER_APN_USERNAME_SIZE);
926 memcpy(set_apn.password, apn->password, QSER_APN_PASSWORD_SIZE);
927 memcpy(set_apn.apn_type, apn->apn_type, QSER_APN_NAME_SIZE);
928 ret = qser_apn_set(&set_apn);
929 if(ret != 0)
930 {
931 LOGE("[qser_data_call] qser_apn_set fail.");
932 qser_apn_info_state[idx] = FALSE;
933 return QSER_RESULT_FAIL;
934 }
935 *profile_idx = idx;
b.liuf37bd332024-03-18 13:51:24 +0800936#if defined(MBTK_ALL_CID_SUPPORT)
937 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
938 {
939 qser_apn_add_save_state[idx] = '2';
940 qser_apn_default_idx = idx;
941 }
942 else
943#endif
944 {
945 qser_apn_add_save_state[idx] = '1';
946 }
947
wangyouqiange2498f12024-01-06 17:55:36 +0800948 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
949 }
950 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800951}
952
953int qser_apn_del(unsigned char profile_idx)
954{
wangyouqiange2498f12024-01-06 17:55:36 +0800955 //UNUSED(profile_idx);
956 if(qser_info_handle == NULL)
957 {
958 LOGE("[qser_data_call] handle is NULL.");
959 return QSER_RESULT_FAIL;
960 }
b.liu5fa9e772023-11-23 18:00:55 +0800961
wangyouqiange2498f12024-01-06 17:55:36 +0800962 if(qser_check_profile_idx(profile_idx) < 0)
963 {
964 LOGE("[qser_data_call] profile_idx is invalid.");
965 return QSER_RESULT_FAIL;
966 }
967
968 qser_apn_info_state[profile_idx] = FALSE;
969 qser_apn_add_save_state[profile_idx] = '0';
b.liuf37bd332024-03-18 13:51:24 +0800970
971#if defined(MBTK_ALL_CID_SUPPORT)
972 if(profile_idx == qser_apn_default_idx)
973 {
974 qser_apn_default_idx = -1;
975 }
976#endif
977
wangyouqiange2498f12024-01-06 17:55:36 +0800978 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
979 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800980}
981
982int qser_apn_get_list(qser_apn_info_list_s *apn_list)
983{
wangyouqiang84179c82024-01-05 15:42:55 +0800984 //UNUSED(apn_list);
b.liu5fa9e772023-11-23 18:00:55 +0800985
wangyouqiang84179c82024-01-05 15:42:55 +0800986 if(qser_info_handle == NULL)
987 {
988 LOGE("[qser_data_call] handle is NULL.");
989 return QSER_RESULT_FAIL;
990 }
991
992 if(apn_list == NULL)
993 {
994 LOGE("[qser_data_call] apn_list param is NULL.");
995 return QSER_RESULT_FAIL;
996 }
997
wangyouqiange2498f12024-01-06 17:55:36 +0800998 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
999 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001000 mbtk_apn_info_t apns[10] = {0};
1001 int apn_num = 10;
1002 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1003 if(ret != 0)
1004 {
1005 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
1006 return QSER_RESULT_FAIL;
1007 }
1008 else
1009 {
1010 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
1011 {
1012 int i = 0;
wangyouqiange2498f12024-01-06 17:55:36 +08001013 apn_list->cnt = 0;
wangyouqiang84179c82024-01-05 15:42:55 +08001014 for(i = 0; i < apn_num; i++)
1015 {
wangyouqiange2498f12024-01-06 17:55:36 +08001016 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
1017 {
1018 LOGE("[qser_data_call] idx no open.");
1019 continue;
1020 }
wangyouqiang84179c82024-01-05 15:42:55 +08001021 if(qser_apn_info_param_convert(apns[i].cid - 1, &apn_list->apn[i], &apns[i]) != 0)
1022 {
1023 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
1024 return QSER_RESULT_FAIL;
1025 }
wangyouqiange2498f12024-01-06 17:55:36 +08001026 apn_list->cnt++;
wangyouqiang84179c82024-01-05 15:42:55 +08001027 }
wangyouqiang84179c82024-01-05 15:42:55 +08001028 }
1029 else if(apn_num > QSER_APN_MAX_LIST)
1030 {
1031 LOGE("[qser_data_call] apn_num overlong");
1032 return QSER_RESULT_FAIL;
1033 }
1034 else
1035 {
1036 apn_list->cnt = 0;
1037 }
1038 }
1039 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001040}
wangyouqiang84179c82024-01-05 15:42:55 +08001041/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +08001042