blob: 9e42d8522b8560a590666afba2eb99955f1e9545 [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};
wangyouqianga24887d2024-04-08 18:31:23 +080044static char qser_apn_auth_state[QSER_APN_NUM + 1] = {0};
b.liuf37bd332024-03-18 13:51:24 +080045#if defined(MBTK_ALL_CID_SUPPORT)
46static int qser_apn_default_idx = -1;
wangyouqiang805b0f92024-04-07 17:06:13 +080047static int qser_default_pdp_idx = -1;
b.liuf37bd332024-03-18 13:51:24 +080048#else
49static int qser_apn_default_idx = 0xFF;
wangyouqiang805b0f92024-04-07 17:06:13 +080050static int qser_default_pdp_idx = 0;
b.liuf37bd332024-03-18 13:51:24 +080051#endif
wangyouqiang84179c82024-01-05 15:42:55 +080052/****************************VARIABLE***************************************/
53
54/******************************FUNC*****************************************/
b.liuf37bd332024-03-18 13:51:24 +080055#if defined(MBTK_ALL_CID_SUPPORT)
56int qser_route_config(int profile_idx)
57{
58 char buf[1024] = {0};
59 char dns[128] = {0};
60 int offset = 0;
61 int fd = -1;
62 mbtk_ipv4_info_t ipv4;
63 mbtk_ipv6_info_t ipv6;
64 sprintf(buf, "route add default dev ccinet%d", profile_idx -1);
65 system(buf);
66
67 int ret = mbtk_data_call_state_get(qser_info_handle, profile_idx, &ipv4, &ipv6);
68 if(ret != 0)
69 return -1;
70 else
71 {
72 memset(buf, 0x0, 1024);
73 memset(dns, 0x0, 128);
74 offset = sprintf(buf, "search lan\n");
75 if(ipv4.valid)
76 {
77 if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), dns, 32) == NULL) {
78 LOGD("PrimaryDNS error.");
79 } else {
80 LOGD("PrimaryDNS : %s", dns);
81 }
82 offset += sprintf(buf + offset, "nameserver %s\n", dns);
83 memset(dns, 0x0, 128);
84 if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), dns, 32) == NULL) {
85 LOGD("SecondaryDNS error.");
86 } else {
87 LOGD("SecondaryDNS : %s", dns);
88 }
89 offset += sprintf(buf + offset, "nameserver %s\n", dns);
90 }
91 if(ipv6.valid)
92 {
93 memset(dns, 0x0, 128);
94 if(ipv6_2_str(&(ipv6.PrimaryDNS), dns))
95 {
96 LOGD("PrimaryDNS error.");
97 } else {
98 LOGD("PrimaryDNS : %s", dns);
99 }
100 offset += sprintf(buf + offset, "nameserver %s\n", dns);
101 memset(dns, 0x0, 128);
102 if(ipv6_2_str(&(ipv6.SecondaryDNS), dns))
103 {
104 LOGD("SecondaryDNS error.");
105 } else {
106 LOGD("SecondaryDNS : %s", dns);
107 }
108 offset += sprintf(buf + offset, "nameserver %s\n", dns);
109 }
110
111 if(offset > 0)
112 {
113 fd = open("/tmp/resolv.conf", O_WRONLY | O_TRUNC);
114 if(fd < 0)
115 {
116 LOGD("mbtk_route_config : open fail.");
117 return -1;
118 }
119
120 ret = write(fd, buf, offset);
121 if(ret < 0)
122 {
123 LOGD("mbtk_route_config : write fail.");
124 }
125
126 close(fd);
127 }
128 }
129
130 return 0;
131}
132#endif
133
wangyouqiange2498f12024-01-06 17:55:36 +0800134char qser_get_apn_profile_idx(void)
135{
136 char i = 0;
wangyouqiang805b0f92024-04-07 17:06:13 +0800137 for(i = QSER_PROFILE_IDX_MIN; i <= QSER_PROFILE_IDX_MAX; i++)
wangyouqiange2498f12024-01-06 17:55:36 +0800138 {
139 if(qser_apn_info_state[i] == FALSE)
140 {
141 return i;
142 }
143 }
144
145 return i;
146}
147
148int qser_check_profile_idx(unsigned char profile_idx)
149{
150 if(profile_idx < QSER_PROFILE_IDX_MIN || profile_idx > QSER_PROFILE_IDX_MAX)
151 {
152 LOGE("[qser_data_call] IDX range error.");
153 return QSER_RESULT_FAIL;
154 }
155
156 if(qser_apn_info_state[profile_idx] != TRUE)
157 {
158 LOGE("[qser_data_call] profile_idx is not exist.");
159 return QSER_RESULT_FAIL;
160 }
161
162 return QSER_RESULT_SUCCESS;
163}
164
wangyouqiang84179c82024-01-05 15:42:55 +0800165int qser_apn_info_param_convert(int profile_idx, qser_apn_info_s *new_apn, mbtk_apn_info_t *old_apn)
166{
167 if(new_apn == NULL || old_apn == NULL)
168 {
169 LOGE("[qser_data_call] qser_apn_info_param_convert apn param is NULL.");
170 return QSER_RESULT_FAIL;
171 }
172
173 //get ip type
174 if(old_apn->ip_type == MBTK_IP_TYPE_IPV4V6) // IPV4V6
175 {
176 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4V6;
177 }
178 else if(old_apn->ip_type == MBTK_IP_TYPE_IP) // IPV4
179 {
180 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4;
181 }
182 else if(old_apn->ip_type == MBTK_IP_TYPE_IPV6) // IPV6
183 {
184 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV6;
185 }
186 else
187 {
188 new_apn->pdp_type = QSER_APN_PDP_TYPE_PPP;
189 }
190
191 //get apn name
192 if(strlen(old_apn->apn)+1 > QSER_APN_NAME_SIZE)
193 {
194 LOGE("[qser_data_call] apn_nmea length verylong.");
195 return QSER_RESULT_FAIL;
196 }
197 else
198 {
199 if(strlen(old_apn->apn) > 0)
200 {
201 memcpy(new_apn->apn_name, old_apn->apn,strlen(old_apn->apn)+1);
202 }
203 else
204 {
205 memset(new_apn->apn_name, 0x0, QSER_APN_NAME_SIZE);
206 }
207 }
208
209 //get apn user
210 if(strlen(old_apn->user)+1 > QSER_APN_USERNAME_SIZE)
211 {
212 LOGE("[qser_data_call] apn_user length verylong.");
213 return QSER_RESULT_FAIL;
214 }
215 else
216 {
217 if(strlen(old_apn->user) > 0)
218 {
219 memcpy(new_apn->username, old_apn->user, strlen(old_apn->user)+1);
220 }
221 else
222 {
223 memset(new_apn->username , 0x0, QSER_APN_USERNAME_SIZE);
224 }
225 }
226
227 //get apn password
228 if(strlen(old_apn->pass)+1 > QSER_APN_PASSWORD_SIZE)
229 {
230 LOGE("[qser_data_call] apn_password length verylong.");
231 return QSER_RESULT_FAIL;
232 }
233 else
234 {
235 if(strlen(old_apn->pass) > 0)
236 {
237 memcpy(new_apn->password, old_apn->pass, strlen(old_apn->pass)+1);
238 }
239 else
240 {
241 memset(new_apn->username , 0x0, QSER_APN_PASSWORD_SIZE);
242 }
243 }
244
245 //get apn proto
246 if(strlen(old_apn->auth) > 0)
247 {
248 if(strcmp(old_apn->auth, "NONE") == 0)
249 {
wangyouqianga24887d2024-04-08 18:31:23 +0800250 if(qser_apn_auth_state[profile_idx] == '1')
251 {
252 new_apn->auth_proto = QSER_APN_AUTH_PROTO_NONE;
253 }
254 else
255 {
256 new_apn->auth_proto = QSER_APN_AUTH_PROTO_DEFAULT;
257 }
wangyouqiang84179c82024-01-05 15:42:55 +0800258 }
259 else if(strcmp(old_apn->auth, "PAP") == 0)
260 {
261 new_apn->auth_proto = QSER_APN_AUTH_PROTO_PAP;
262 }
263 else if(strcmp(old_apn->auth, "CHAP") == 0)
264 {
265 new_apn->auth_proto = QSER_APN_AUTH_PROTO_CHAP;
266 }
267 else
268 {
269 LOGE("[qser_data_call] auth input error!");
270 return QSER_RESULT_FAIL;
271 }
272 }
273
274 //get apn type
275 new_apn->profile_idx = profile_idx;
276 memset(new_apn->apn_type, 0x0, QSER_APN_NAME_SIZE);
277 if(strlen(qser_apn_info[profile_idx].apn_type) > 0)
278 {
279 memcpy(new_apn->apn_type, qser_apn_info[profile_idx].apn_type, strlen(qser_apn_info[profile_idx].apn_type));
280 }
281
282 return QSER_RESULT_SUCCESS;
283}
284
r.xiaof6ec4822024-04-03 02:46:00 -0700285/*Check parameter*/
286int qser_check_apn_name_type(qser_apn_info_s *apn)
287{
288 int pdp_type_tmp = 0;
289 for (;pdp_type_tmp < QSER_APN_NUM; pdp_type_tmp++)
290 {
wangyouqianga24887d2024-04-08 18:31:23 +0800291 if(pdp_type_tmp == apn->profile_idx)
292 {
293 continue;
294 }
295 if( (qser_apn_add_save_state[pdp_type_tmp] == '1') || (qser_apn_add_save_state[pdp_type_tmp] == '2') )
r.xiaof6ec4822024-04-03 02:46:00 -0700296 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800297 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)
298 {
299 LOGE("[qser_data_call] qser_check_apn_name_type error!");
300 return QSER_RESULT_FAIL;
301 }
r.xiaof6ec4822024-04-03 02:46:00 -0700302 }
303 }
304
305 return QSER_RESULT_SUCCESS;
306}
307
wangyouqianga24887d2024-04-08 18:31:23 +0800308void qser_state_init(qser_data_call_state_s *state)
wangyouqiang805b0f92024-04-07 17:06:13 +0800309{
wangyouqianga24887d2024-04-08 18:31:23 +0800310 if(state != NULL)
wangyouqiang805b0f92024-04-07 17:06:13 +0800311 {
wangyouqianga24887d2024-04-08 18:31:23 +0800312 state->profile_idx = 0;
313 memset(state->name, 0x0, 16);
314 state->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
315 state->state = QSER_DATA_CALL_DISCONNECTED;
316 state->err = QSER_DATA_CALL_ERROR_NONE;
317 inet_aton("0.0.0.0", &(state->v4.ip));
318 inet_aton("0.0.0.0", &(state->v4.gateway));
319 inet_aton("0.0.0.0", &(state->v4.pri_dns));
320 inet_aton("0.0.0.0", &(state->v4.sec_dns));
321 inet_pton(AF_INET6, "::", &(state->v6.ip));
322 inet_pton(AF_INET6, "::", &(state->v6.gateway));
323 inet_pton(AF_INET6, "::", &(state->v6.pri_dns));
324 inet_pton(AF_INET6, "::", &(state->v6.sec_dns));
wangyouqiang805b0f92024-04-07 17:06:13 +0800325 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800326}
r.xiaof6ec4822024-04-03 02:46:00 -0700327
wangyouqiang84179c82024-01-05 15:42:55 +0800328void qser_wan_net_state_change_cb(const void* data, int data_len)
329{
330 if(data == NULL || data_len == 0)
331 {
332 return;
333 }
334
335 uint8 *net_data = NULL;
336 net_data = (uint8 *)data;
337
wangyouqianga24887d2024-04-08 18:31:23 +0800338 if(*net_data > 100 && *net_data < 200)
wangyouqiang84179c82024-01-05 15:42:55 +0800339 {
wangyouqianga24887d2024-04-08 18:31:23 +0800340 int idx = *net_data - 101;
341 if(idx <= QSER_PROFILE_IDX_MAX)
wangyouqiange2498f12024-01-06 17:55:36 +0800342 {
wangyouqianga24887d2024-04-08 18:31:23 +0800343 qser_data_call_state_s state = {0};
344 qser_state_init(&state);
345 state.profile_idx = idx;
wangyouqiange2498f12024-01-06 17:55:36 +0800346 state.state = QSER_DATA_CALL_DISCONNECTED;
wangyouqianga24887d2024-04-08 18:31:23 +0800347 if( idx == qser_default_pdp_idx )
wangyouqiang805b0f92024-04-07 17:06:13 +0800348 {
349 qser_default_pdp_idx = -1;
350 }
wangyouqianga24887d2024-04-08 18:31:23 +0800351
352 if(qser_net_status_cb != NULL)
353 {
354 qser_net_status_cb(&state);
355 }
wangyouqiange2498f12024-01-06 17:55:36 +0800356 }
357 else
358 {
wangyouqianga24887d2024-04-08 18:31:23 +0800359 LOGE("[qser_data_call] cb fail,idx is %d.", idx);
wangyouqiange2498f12024-01-06 17:55:36 +0800360 }
wangyouqianga24887d2024-04-08 18:31:23 +0800361
362 }
363 else if(*net_data > 200)
364 {
365 LOGE("[qser_data_call] cid[%d] is open.", *net_data - 201);
366 }
367 else if(*net_data == 1)
368 {
369 LOGE("[qser_data_call] pdp is open.");
370 }
371 else
372 {
373 LOGE("[qser_data_call] unkonwn param [%d].", *net_data);
wangyouqiang84179c82024-01-05 15:42:55 +0800374 }
375}
wangyouqiange2498f12024-01-06 17:55:36 +0800376
377static void* data_call_async_thread(void* arg)
378{
379 qser_data_call_error_e err;
wangyouqianga24887d2024-04-08 18:31:23 +0800380
381 qser_data_call_s qser_data_backup = {0};
382 if(arg != NULL)
383 {
384 memcpy(&qser_data_backup, (qser_data_call_s *)arg, sizeof(qser_data_call_s));
385 }
386 else
387 {
388 LOGE("[qser_data_call] arg is NULL.");
389 }
390
391 qser_data_call_state_s state = {0};
392 qser_state_init(&state);
393 state.profile_idx = qser_data_backup.profile_idx;
394 state.ip_family = qser_data_backup.ip_family;
395
wangyouqiange2498f12024-01-06 17:55:36 +0800396 int ret = qser_data_call_start(&qser_data_backup, &err);
397 if(ret != QSER_RESULT_SUCCESS)
398 {
399 LOGE("[qser_data_call] qser_data_call_start() fail.");
wangyouqianga24887d2024-04-08 18:31:23 +0800400 state.err = err;
401 if(qser_net_status_cb != NULL)
402 {
403 qser_net_status_cb(&state);
404 }
wangyouqiange2498f12024-01-06 17:55:36 +0800405 }
wangyouqianga24887d2024-04-08 18:31:23 +0800406
407 qser_data_call_info_s info = {0};
408 ret = qser_data_call_info_get(qser_data_backup.profile_idx, qser_data_backup.ip_family, &info, &err);
409 if(ret != QSER_RESULT_SUCCESS)
410 {
411 LOGE("[qser_data_call] qser_data_call_info_get() fail.");
412 state.err = err;
413 if(qser_net_status_cb != NULL)
414 {
415 qser_net_status_cb(&state);
416 }
417 }
418
419 snprintf(state.name, 16, "ccinet%d", qser_data_backup.profile_idx);
420 state.state = QSER_DATA_CALL_CONNECTED;
421 state.err = err;
422 memcpy(&(state.v4), &(info.v4.addr), sizeof(struct v4_address_status));
423 memcpy(&(state.v6), &(info.v6.addr), sizeof(struct v6_address_status));
424 if(qser_net_status_cb != NULL)
425 {
426 qser_net_status_cb(&state);
427 }
wangyouqiange2498f12024-01-06 17:55:36 +0800428 return NULL;
429}
430
wangyouqiang84179c82024-01-05 15:42:55 +0800431/******************************FUNC*****************************************/
432
433/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +0800434int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
435{
wangyouqiang84179c82024-01-05 15:42:55 +0800436 //UNUSED(evt_cb);
437 if(!inited && qser_info_handle == NULL)
438 {
439 qser_info_handle = mbtk_info_handle_get();
440 if(qser_info_handle)
441 {
442 qser_info_handle_num++;
443 inited = TRUE;
444 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
445 }
446 else
447 {
448 LOGE("[qser_data_call] mbtk_info_handle_get() fail.");
449 return QSER_RESULT_FAIL;
450 }
451 }
452 else
453 {
454 if(!inited)
455 {
456 qser_info_handle_num++;
457 inited = TRUE;
458 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
459 }
460 }
461 qser_net_status_cb = evt_cb;
b.liu5fa9e772023-11-23 18:00:55 +0800462
wangyouqiange2498f12024-01-06 17:55:36 +0800463 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
464 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqianga24887d2024-04-08 18:31:23 +0800465 property_get("persist.qser.apn.auth", qser_apn_auth_state, "00000000");
wangyouqiange2498f12024-01-06 17:55:36 +0800466 mbtk_apn_info_t apns[10] = {0};
467 int apn_num = 10;
468 char qser_apn_type[32] = {0};
469 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
470 if(ret != 0)
471 {
472 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
473 return QSER_RESULT_FAIL;
474 }
475 else
476 {
477 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
478 {
479 int i = 0;
480 for(i = 0; i < apn_num; i++)
481 {
482 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
483 {
484 LOGE("[qser_data_call] idx no open.");
485 continue;
486 }
b.liuf37bd332024-03-18 13:51:24 +0800487
488#if defined(MBTK_ALL_CID_SUPPORT)
489 if(qser_apn_add_save_state[apns[i].cid - 1] == '2')
490 {
491 qser_apn_default_idx = apns[i].cid - 1;
492 }
493#endif
494
wangyouqiange2498f12024-01-06 17:55:36 +0800495 if(qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]) != 0)
496 {
497 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
498 return QSER_RESULT_FAIL;
499 }
500 else
501 {
502 qser_apn_info_state[apns[i].cid - 1] = TRUE;
503 sprintf(qser_apn_type, "persist.qser.apn.type%d", apns[i].cid - 1);
504 property_get(qser_apn_type, qser_apn_info[apns[i].cid - 1].apn_type, NULL);
505 }
506 }
507 }
508 }
wangyouqiang84179c82024-01-05 15:42:55 +0800509 LOGE("[qser_data_call] mbtk_info_handle_get() success.");
510 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800511}
512
513void qser_data_call_destroy(void)
514{
wangyouqiang84179c82024-01-05 15:42:55 +0800515 if(qser_info_handle)
516 {
517 LOGE("qser_info_handle_num = %d", qser_info_handle_num);
518 if(qser_info_handle_num == 1)
519 { // 最后一个引用,可释放。
520 int ret = mbtk_info_handle_free(&qser_info_handle);
521 if(ret)
522 {
523 LOGE("[qser_data_call] mbtk_info_handle_free() fail.");
524 }
525 else
526 {
527 qser_info_handle_num = 0;
528 qser_info_handle = NULL;
529 inited = FALSE;
530 }
531 }
532 else
533 {
534 qser_info_handle_num--;
535 }
536 }
537 else
538 {
539 LOGE("[qser_data_call] handle not inited.");
540 }
b.liu5fa9e772023-11-23 18:00:55 +0800541}
542
543int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
544{
wangyouqiang84179c82024-01-05 15:42:55 +0800545 //UNUSED(data_call);
546 //UNUSED(err);
547 if(data_call == NULL || err == NULL)
548 {
549 LOGE("[qser_data_call] data_call or err is NULL.");
550 if(err != NULL)
551 {
552 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
553 }
554 return QSER_RESULT_FAIL;
555 }
556
557 if(qser_info_handle == NULL)
558 {
559 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800560 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800561 return QSER_RESULT_FAIL;
562 }
b.liu5fa9e772023-11-23 18:00:55 +0800563
wangyouqiang805b0f92024-04-07 17:06:13 +0800564#if defined(MBTK_ALL_CID_SUPPORT)
565 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
566 {
567 LOGE("[qser_data_call] default pdp exist.");
568 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
569 return QSER_RESULT_FAIL;
570 }
571#endif
572
wangyouqiange2498f12024-01-06 17:55:36 +0800573 if(qser_check_profile_idx(data_call->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800574 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800575#if defined(MBTK_ALL_CID_SUPPORT)
576 if( data_call->profile_idx == 0 )
577 {
578 LOGE("[qser_data_call] profile_idx = 0.");
579 }
580 else
581#endif
582 {
583 LOGE("[qser_data_call] profile_idx is invalid.");
584 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
585 return QSER_RESULT_FAIL;
586 }
wangyouqiang84179c82024-01-05 15:42:55 +0800587 }
588
589 int ret = -1;
590 ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
591 if(ret != 0)
592 {
593 LOGE("[qser_data_call] mbtk_data_call_start fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800594 if(ret == MBTK_INFO_ERR_CID_EXIST)
595 {
596 *err = QSER_DATA_CALL_ERROR_PDP_ACTIVATE;
597 }
598 else
599 {
600 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
601 }
wangyouqiang84179c82024-01-05 15:42:55 +0800602 return QSER_RESULT_FAIL;
603 }
604 else
605 {
606 *err = QSER_DATA_CALL_ERROR_NONE;
607 }
wangyouqiange2498f12024-01-06 17:55:36 +0800608
b.liuf37bd332024-03-18 13:51:24 +0800609#if defined(MBTK_ALL_CID_SUPPORT)
610 if(qser_apn_default_idx == data_call->profile_idx)
611 {
612 qser_route_config(qser_apn_default_idx + 1);
wangyouqiang805b0f92024-04-07 17:06:13 +0800613 qser_default_pdp_idx = data_call->profile_idx;
b.liuf37bd332024-03-18 13:51:24 +0800614 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800615 else if(data_call->profile_idx == 0)
616 {
617 qser_route_config(1);
618 qser_default_pdp_idx = data_call->profile_idx;
619 }
620 else
621 {
622 //
623 }
624
b.liuf37bd332024-03-18 13:51:24 +0800625#endif
626
wangyouqiange2498f12024-01-06 17:55:36 +0800627 return QSER_RESULT_SUCCESS;
628}
629
630int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
631{
632 //UNUSED(data_call);
633 UNUSED(err);
634 if(data_call == NULL || err == NULL)
635 {
636 LOGE("[qser_data_call] data_call or err is NULL.");
637 if(err != NULL)
638 {
639 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
640 }
641 return QSER_RESULT_FAIL;
642 }
643
644 if(qser_info_handle == NULL)
645 {
646 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800647 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiange2498f12024-01-06 17:55:36 +0800648 return QSER_RESULT_FAIL;
649 }
650
wangyouqiang805b0f92024-04-07 17:06:13 +0800651#if defined(MBTK_ALL_CID_SUPPORT)
652 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
653 {
654 LOGE("[qser_data_call] default pdp exist.");
655 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
656 return QSER_RESULT_FAIL;
657 }
658#endif
659
wangyouqiange2498f12024-01-06 17:55:36 +0800660 if(qser_check_profile_idx(data_call->profile_idx) < 0)
661 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800662#if defined(MBTK_ALL_CID_SUPPORT)
663 if((data_call->profile_idx == 0) && (qser_default_pdp_idx < 0))
664 {
665 LOGE("[qser_data_call] profile_idx = 0 and not open default idx.");
666 }
667 else
668#endif
669 {
670 LOGE("[qser_data_call] profile_idx is invalid.");
671 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
672 return QSER_RESULT_FAIL;
673 }
674
wangyouqiange2498f12024-01-06 17:55:36 +0800675 }
676
677 pthread_attr_t thread_attr;
678 pthread_t data_call_thread_id;
679 pthread_attr_init(&thread_attr);
680 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
681 {
682 LOGE("[qser_data_call] pthread_attr_setdetachstate() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800683 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800684 return QSER_RESULT_FAIL;
685 }
686
wangyouqianga24887d2024-04-08 18:31:23 +0800687 //memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
688 if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, (void *) data_call))
wangyouqiange2498f12024-01-06 17:55:36 +0800689 {
690 LOGE("[qser_data_call] pthread_create() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800691 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800692 return QSER_RESULT_FAIL;
693 }
694 pthread_attr_destroy(&thread_attr);
wangyouqiange2498f12024-01-06 17:55:36 +0800695
wangyouqiang84179c82024-01-05 15:42:55 +0800696 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800697}
698
699int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
700{
wangyouqiang84179c82024-01-05 15:42:55 +0800701 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800702 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800703 //UNUSED(err);
704 if(err == NULL)
705 {
706 LOGE("[qser_data_call] err is NULL.");
707 return QSER_RESULT_FAIL;
708 }
b.liu5fa9e772023-11-23 18:00:55 +0800709
wangyouqiang84179c82024-01-05 15:42:55 +0800710 if(qser_info_handle == NULL)
711 {
712 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800713 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800714 return QSER_RESULT_FAIL;
715 }
716
wangyouqiange2498f12024-01-06 17:55:36 +0800717 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800718 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800719#if defined(MBTK_ALL_CID_SUPPORT)
720 if(profile_idx == 0)
721 {
722 LOGE("[qser_data_call] profile_idx = 0.");
723 }
724 else
725#endif
726 {
727 LOGE("[qser_data_call] profile_idx is invalid.");
728 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
729 return QSER_RESULT_FAIL;
730 }
wangyouqiang84179c82024-01-05 15:42:55 +0800731 }
732
733 int ret = -1;
734 ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
735 if(ret != 0)
736 {
737 LOGE("[qser_data_call] mbtk_data_call_stop fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800738 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
739 {
740 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
741 }
742 else
743 {
744 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
745 }
wangyouqiang84179c82024-01-05 15:42:55 +0800746 return QSER_RESULT_FAIL;
747 }
748 else
749 {
750 *err = QSER_DATA_CALL_ERROR_NONE;
751 }
wangyouqiange2498f12024-01-06 17:55:36 +0800752
wangyouqiang805b0f92024-04-07 17:06:13 +0800753#if defined(MBTK_ALL_CID_SUPPORT)
754 if(qser_default_pdp_idx == profile_idx)
755 {
756 qser_default_pdp_idx = -1;
757 }
758#endif
759
wangyouqiang84179c82024-01-05 15:42:55 +0800760 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800761}
762
763int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
764 qser_data_call_info_s *info, qser_data_call_error_e *err)
765{
wangyouqiang84179c82024-01-05 15:42:55 +0800766 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800767 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800768 //UNUSED(info);
769 //UNUSED(err);
b.liu5fa9e772023-11-23 18:00:55 +0800770
wangyouqiang84179c82024-01-05 15:42:55 +0800771 if(info == NULL || err == NULL)
772 {
773 LOGE("[qser_data_call] info or err is NULL.");
774 if(err != NULL)
775 {
776 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
777 }
778 return QSER_RESULT_FAIL;
779 }
780
781 if(qser_info_handle == NULL)
782 {
783 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800784 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800785 return QSER_RESULT_FAIL;
786 }
787
wangyouqiange2498f12024-01-06 17:55:36 +0800788 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800789 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800790#if defined(MBTK_ALL_CID_SUPPORT)
791 if(profile_idx == 0)
792 {
793 LOGE("[qser_data_call] profile_idx = 0.");
794 }
795 else
796#endif
797 {
798 LOGE("[qser_data_call] profile_idx is invalid.");
799 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
800 return QSER_RESULT_FAIL;
801 }
wangyouqiang84179c82024-01-05 15:42:55 +0800802 }
803
804 int ret = -1;
805 mbtk_ipv4_info_t ipv4;
806 mbtk_ipv6_info_t ipv6;
807#ifdef QSER_TEST
808 char v4_buff[32] = {0};
809 char v6_buff[128] = {0};
810#endif
811 memset(info, 0, sizeof(qser_data_call_info_s));
812 ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
813 if(ret != 0)
814 {
815 LOGE("[qser_data_call] mbtk_data_call_state_get fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800816 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
817 {
818 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
819 }
820 else
821 {
822 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
823 }
wangyouqiang84179c82024-01-05 15:42:55 +0800824 return QSER_RESULT_FAIL;
825 }
826 else
827 {
828 info->profile_idx = profile_idx;
829 if(ipv4.valid)
830 {
831 info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
832 info->v4.state = QSER_DATA_CALL_CONNECTED;
833 sprintf(info->v4.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800834 info->v4.addr.ip.s_addr = ipv4.IPAddr;
835 info->v4.addr.pri_dns.s_addr = ipv4.PrimaryDNS;
836 info->v4.addr.sec_dns.s_addr = ipv4.SecondaryDNS;
837
wangyouqiang84179c82024-01-05 15:42:55 +0800838#ifdef QSER_TEST
b.liuf37bd332024-03-18 13:51:24 +0800839 //LOGE("[qser_data_call] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
wangyouqiang84179c82024-01-05 15:42:55 +0800840 if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
841 LOGE("[qser_data_call] IP error.");
842 } else {
843 LOGE("[qser_data_call] IP : %s", v4_buff);
844 }
845 if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
846 LOGE("[qser_data_call] PrimaryDNS error.");
847 } else {
848 LOGE("[qser_data_call] PrimaryDNS : %s", v4_buff);
849 }
850 if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
851 LOGE("[qser_data_call] SecondaryDNS error.");
852 } else {
853 LOGE("[qser_data_call] SecondaryDNS : %s", v4_buff);
854 }
855#endif
856 }
857
858 if(ipv6.valid)
859 {
860 info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
861 info->v6.state = QSER_DATA_CALL_CONNECTED;
862 sprintf(info->v6.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800863 memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), sizeof(ipv6.IPV6Addr));
864 memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), sizeof(ipv6.PrimaryDNS));
865 memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), sizeof(ipv6.SecondaryDNS));
wangyouqiang84179c82024-01-05 15:42:55 +0800866#ifdef QSER_TEST
867 if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
868 {
869 LOGE("[qser_data_call] IP error.");
870 } else {
871 LOGE("[qser_data_call] IP : %s", v6_buff);
872 }
873 if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
874 {
875 LOGE("[qser_data_call] PrimaryDNS error.");
876 } else {
877 LOGE("[qser_data_call] PrimaryDNS : %s", v6_buff);
878 }
879 if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
880 {
881 LOGE("[qser_data_call] SecondaryDNS error.");
882 } else {
883 LOGE("[qser_data_call] SecondaryDNS : %s", v6_buff);
884 }
885#endif
886 }
887
888 if(ipv4.valid && ipv6.valid)
889 {
890 info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
891 }
892
893 if(!ipv4.valid && !ipv6.valid)
894 {
895 info->v4.state = QSER_DATA_CALL_DISCONNECTED;
896 info->v6.state = QSER_DATA_CALL_DISCONNECTED;
897 }
898 }
899
900 *err = QSER_DATA_CALL_ERROR_NONE;
901 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800902}
903
904int qser_apn_set(qser_apn_info_s *apn)
905{
wangyouqiang84179c82024-01-05 15:42:55 +0800906 //UNUSED(apn);
907 if(qser_info_handle == NULL)
908 {
909 LOGE("[qser_data_call] handle is NULL.");
910 return QSER_RESULT_FAIL;
911 }
912
913 if(apn == NULL)
914 {
915 LOGE("[qser_data_call] apn param is NULL.");
916 return QSER_RESULT_FAIL;
917 }
b.liu5fa9e772023-11-23 18:00:55 +0800918
wangyouqiange2498f12024-01-06 17:55:36 +0800919 if(qser_check_profile_idx(apn->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800920 {
wangyouqiange2498f12024-01-06 17:55:36 +0800921 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800922 return QSER_RESULT_FAIL;
923 }
924
925 if(strlen(apn->apn_name) == 0)
926 {
927 LOGE("[qser_data_call] apn_name is NULL.");
928 return QSER_RESULT_FAIL;
929 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800930
931#if 0
932 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
933 {
934 if(qser_apn_default_idx > -1)
935 {
936 LOGE("[qser_data_call] iot_default is exist.");
937 return QSER_RESULT_FAIL;
938 }
939 }
940#endif
941
r.xiaof6ec4822024-04-03 02:46:00 -0700942 /*add name and type verify*/
943 if (qser_check_apn_name_type(apn) < 0)
944 {
945 LOGE("[qser_data_call] check param error.");
946 return QSER_RESULT_FAIL;
947 }
wangyouqiang84179c82024-01-05 15:42:55 +0800948
949 int ret = -1;
950 char mbtk_auth[32]={0};
wangyouqiange2498f12024-01-06 17:55:36 +0800951 char qser_apn_type[32] = {0};
wangyouqiang84179c82024-01-05 15:42:55 +0800952 mbtk_ip_type_enum pdp_type = MBTK_IP_TYPE_IPV4V6;
r.xiaof6ec4822024-04-03 02:46:00 -0700953
wangyouqiang84179c82024-01-05 15:42:55 +0800954 if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
955 {
956 pdp_type = MBTK_IP_TYPE_IP;
957 }
958 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
959 {
960 pdp_type = MBTK_IP_TYPE_IPV6;
961 }
962 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
963 {
964 pdp_type = MBTK_IP_TYPE_IPV4V6;
965 }
966 else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
967 {
968 pdp_type = MBTK_IP_TYPE_PPP;
969 }
970 else
971 {
972 LOGE("[qser_data_call] pdp_type error.");
973 return QSER_RESULT_FAIL;
974 }
975
976 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE || apn->auth_proto == QSER_APN_AUTH_PROTO_DEFAULT)
977 {
978 memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
979 }
980 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP)
981 {
982 memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
983 }
984 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_CHAP)
985 {
986 memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
987 }
988 #if 0
989 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
990 {
991 //NOT SUPPORT
992 }
993 #endif
994 else
995 {
996 LOGE("[qser_data_call] auth input error!");
997 return QSER_RESULT_FAIL;
998 }
999
1000 if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
1001 {
1002 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);
1003 }
1004 else
1005 {
1006 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);
1007 }
wangyouqiange2498f12024-01-06 17:55:36 +08001008
wangyouqiang84179c82024-01-05 15:42:55 +08001009 ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
1010 if(ret < 0)
1011 {
1012 LOGE("[qser_data_call] mbtk_apn_set fail!");
1013 return QSER_RESULT_FAIL;
1014 }
1015
wangyouqiange2498f12024-01-06 17:55:36 +08001016 sprintf(qser_apn_type, "persist.qser.apn.type%d", apn->profile_idx);
1017 property_set(qser_apn_type, apn->apn_type);
wangyouqianga24887d2024-04-08 18:31:23 +08001018 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE)
1019 {
1020 qser_apn_auth_state[apn->profile_idx] = '1';
1021 }
1022 else
1023 {
1024 qser_apn_auth_state[apn->profile_idx] = '0';
1025 }
1026 property_set("persist.qser.apn.auth", qser_apn_auth_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001027 memcpy(&qser_apn_info[apn->profile_idx], apn, sizeof(qser_apn_info_s));
wangyouqiang805b0f92024-04-07 17:06:13 +08001028
1029#if defined(MBTK_ALL_CID_SUPPORT)
wangyouqianga24887d2024-04-08 18:31:23 +08001030 if(strcmp(apn->apn_type, "iot_default") == 0)
wangyouqiang805b0f92024-04-07 17:06:13 +08001031 {
1032 qser_apn_add_save_state[apn->profile_idx] = '2';
1033 qser_apn_default_idx = apn->profile_idx;
1034 }
1035 else
1036#endif
1037 {
1038 qser_apn_add_save_state[apn->profile_idx] = '1';
1039 }
1040
wangyouqianga24887d2024-04-08 18:31:23 +08001041 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001042 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001043}
1044
1045int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
1046{
wangyouqiang84179c82024-01-05 15:42:55 +08001047 //UNUSED(profile_idx);
1048 //UNUSED(apn);
1049 if(qser_info_handle == NULL)
1050 {
1051 LOGE("[qser_data_call] handle is NULL.");
1052 return QSER_RESULT_FAIL;
1053 }
1054
1055 if(apn == NULL)
1056 {
1057 LOGE("[qser_data_call] apn param is NULL.");
1058 return QSER_RESULT_FAIL;
1059 }
b.liu5fa9e772023-11-23 18:00:55 +08001060
wangyouqiange2498f12024-01-06 17:55:36 +08001061 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001062 {
wangyouqiang805b0f92024-04-07 17:06:13 +08001063#if defined(MBTK_ALL_CID_SUPPORT)
1064 if(profile_idx != 0)
1065#endif
1066 {
1067 LOGE("[qser_data_call] profile_idx is invalid.");
1068 return QSER_RESULT_FAIL;
1069 }
wangyouqiang84179c82024-01-05 15:42:55 +08001070 }
1071
1072 //get apn info
1073 mbtk_apn_info_t apns[10] = {0};
1074 int apn_num = 10;
1075 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1076 if(ret != 0)
1077 {
1078 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
1079 return QSER_RESULT_FAIL;
1080 }
1081 else
1082 {
1083 int i = 0;
1084 for(i = 0; i < apn_num; i++)
1085 {
1086 if(apns[i].cid == profile_idx + 1)
1087 {
1088 LOGE("[qser_data_call] find IDX.");
1089 break;
1090 }
1091 }
1092
1093 if(i == apn_num)
1094 {
1095 LOGE("[qser_data_call] not find IDX.[apn_num = %d]", apn_num);
1096 return QSER_RESULT_FAIL;
1097 }
1098
1099 if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
1100 {
1101 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
1102 return QSER_RESULT_FAIL;
1103 }
1104 }
1105 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001106}
1107
1108int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
1109{
wangyouqiange2498f12024-01-06 17:55:36 +08001110 //UNUSED(apn);
1111 //UNUSED(profile_idx);
1112 if(qser_info_handle == NULL)
1113 {
1114 LOGE("[qser_data_call] handle is NULL.");
1115 return QSER_RESULT_FAIL;
1116 }
1117
1118 if(apn == NULL)
1119 {
1120 LOGE("[qser_data_call] apn param is NULL.");
1121 return QSER_RESULT_FAIL;
1122 }
b.liu5fa9e772023-11-23 18:00:55 +08001123
wangyouqiang805b0f92024-04-07 17:06:13 +08001124#if 0
b.liuf37bd332024-03-18 13:51:24 +08001125 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1126 {
1127 if(qser_apn_default_idx > -1)
1128 {
1129 LOGE("[qser_data_call] iot_default is exist.");
1130 return QSER_RESULT_FAIL;
1131 }
1132 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001133 /*add name and type verify*/
1134 if (qser_check_apn_name_type(apn) < 0)
1135 {
1136 LOGE("[qser_data_call] check param error.");
1137 return QSER_RESULT_FAIL;
1138 }
1139#endif
b.liuf37bd332024-03-18 13:51:24 +08001140
wangyouqiange2498f12024-01-06 17:55:36 +08001141 int ret = 0;
1142 char idx = qser_get_apn_profile_idx();
wangyouqiang805b0f92024-04-07 17:06:13 +08001143 if(idx > QSER_PROFILE_IDX_MAX)
wangyouqiange2498f12024-01-06 17:55:36 +08001144 {
1145 LOGE("[qser_data_call] idx is full.");
1146 return QSER_RESULT_FAIL;
1147 }
1148 else
1149 {
1150 qser_apn_info_state[idx] = TRUE;
1151 qser_apn_info_s set_apn;
1152 set_apn.profile_idx = idx;
1153 set_apn.pdp_type = apn->pdp_type;
1154 set_apn.auth_proto = apn->auth_proto;
1155 memcpy(set_apn.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
1156 memcpy(set_apn.username, apn->username, QSER_APN_USERNAME_SIZE);
1157 memcpy(set_apn.password, apn->password, QSER_APN_PASSWORD_SIZE);
1158 memcpy(set_apn.apn_type, apn->apn_type, QSER_APN_NAME_SIZE);
1159 ret = qser_apn_set(&set_apn);
1160 if(ret != 0)
1161 {
1162 LOGE("[qser_data_call] qser_apn_set fail.");
1163 qser_apn_info_state[idx] = FALSE;
1164 return QSER_RESULT_FAIL;
1165 }
1166 *profile_idx = idx;
wangyouqiange2498f12024-01-06 17:55:36 +08001167 }
1168 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001169}
1170
1171int qser_apn_del(unsigned char profile_idx)
1172{
wangyouqiange2498f12024-01-06 17:55:36 +08001173 //UNUSED(profile_idx);
1174 if(qser_info_handle == NULL)
1175 {
1176 LOGE("[qser_data_call] handle is NULL.");
1177 return QSER_RESULT_FAIL;
1178 }
b.liu5fa9e772023-11-23 18:00:55 +08001179
wangyouqiange2498f12024-01-06 17:55:36 +08001180 if(qser_check_profile_idx(profile_idx) < 0)
1181 {
1182 LOGE("[qser_data_call] profile_idx is invalid.");
1183 return QSER_RESULT_FAIL;
1184 }
1185
1186 qser_apn_info_state[profile_idx] = FALSE;
1187 qser_apn_add_save_state[profile_idx] = '0';
b.liuf37bd332024-03-18 13:51:24 +08001188
1189#if defined(MBTK_ALL_CID_SUPPORT)
1190 if(profile_idx == qser_apn_default_idx)
1191 {
1192 qser_apn_default_idx = -1;
1193 }
1194#endif
1195
wangyouqiange2498f12024-01-06 17:55:36 +08001196 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
1197 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001198}
1199
1200int qser_apn_get_list(qser_apn_info_list_s *apn_list)
1201{
wangyouqiang84179c82024-01-05 15:42:55 +08001202 //UNUSED(apn_list);
b.liu5fa9e772023-11-23 18:00:55 +08001203
wangyouqiang84179c82024-01-05 15:42:55 +08001204 if(qser_info_handle == NULL)
1205 {
1206 LOGE("[qser_data_call] handle is NULL.");
1207 return QSER_RESULT_FAIL;
1208 }
1209
1210 if(apn_list == NULL)
1211 {
1212 LOGE("[qser_data_call] apn_list param is NULL.");
1213 return QSER_RESULT_FAIL;
1214 }
1215
wangyouqiange2498f12024-01-06 17:55:36 +08001216 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
1217 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001218 mbtk_apn_info_t apns[10] = {0};
1219 int apn_num = 10;
1220 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1221 if(ret != 0)
1222 {
1223 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
1224 return QSER_RESULT_FAIL;
1225 }
1226 else
1227 {
1228 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
1229 {
1230 int i = 0;
wangyouqiange2498f12024-01-06 17:55:36 +08001231 apn_list->cnt = 0;
wangyouqiang84179c82024-01-05 15:42:55 +08001232 for(i = 0; i < apn_num; i++)
1233 {
wangyouqiange2498f12024-01-06 17:55:36 +08001234 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
1235 {
wangyouqiang805b0f92024-04-07 17:06:13 +08001236#if defined(MBTK_ALL_CID_SUPPORT)
1237 if((apns[i].cid - 1) != 0)
1238#endif
1239 {
1240 LOGE("[qser_data_call] idx no open.");
1241 continue;
1242 }
wangyouqiange2498f12024-01-06 17:55:36 +08001243 }
wangyouqiang84179c82024-01-05 15:42:55 +08001244 if(qser_apn_info_param_convert(apns[i].cid - 1, &apn_list->apn[i], &apns[i]) != 0)
1245 {
1246 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
1247 return QSER_RESULT_FAIL;
1248 }
wangyouqiange2498f12024-01-06 17:55:36 +08001249 apn_list->cnt++;
wangyouqiang84179c82024-01-05 15:42:55 +08001250 }
wangyouqiang84179c82024-01-05 15:42:55 +08001251 }
1252 else if(apn_num > QSER_APN_MAX_LIST)
1253 {
1254 LOGE("[qser_data_call] apn_num overlong");
1255 return QSER_RESULT_FAIL;
1256 }
1257 else
1258 {
1259 apn_list->cnt = 0;
1260 }
1261 }
1262 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001263}
wangyouqiang84179c82024-01-05 15:42:55 +08001264/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +08001265