blob: 8b4d78a292e5197bf6a5ca1576a5a912a474a50a [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};
wangyouqiang8ebeafe2024-04-15 10:07:44 +080043static bool qser_idx_pdp_state[QSER_APN_NUM];
wangyouqiange2498f12024-01-06 17:55:36 +080044static char qser_apn_add_save_state[QSER_APN_NUM + 1] = {0};
wangyouqianga24887d2024-04-08 18:31:23 +080045static char qser_apn_auth_state[QSER_APN_NUM + 1] = {0};
b.liuf37bd332024-03-18 13:51:24 +080046#if defined(MBTK_ALL_CID_SUPPORT)
47static int qser_apn_default_idx = -1;
wangyouqiang805b0f92024-04-07 17:06:13 +080048static int qser_default_pdp_idx = -1;
b.liuf37bd332024-03-18 13:51:24 +080049#else
50static int qser_apn_default_idx = 0xFF;
wangyouqiang805b0f92024-04-07 17:06:13 +080051static int qser_default_pdp_idx = 0;
b.liuf37bd332024-03-18 13:51:24 +080052#endif
wangyouqiang84179c82024-01-05 15:42:55 +080053/****************************VARIABLE***************************************/
54
55/******************************FUNC*****************************************/
b.liuf37bd332024-03-18 13:51:24 +080056#if defined(MBTK_ALL_CID_SUPPORT)
57int qser_route_config(int profile_idx)
58{
59 char buf[1024] = {0};
60 char dns[128] = {0};
61 int offset = 0;
62 int fd = -1;
63 mbtk_ipv4_info_t ipv4;
64 mbtk_ipv6_info_t ipv6;
65 sprintf(buf, "route add default dev ccinet%d", profile_idx -1);
66 system(buf);
67
68 int ret = mbtk_data_call_state_get(qser_info_handle, profile_idx, &ipv4, &ipv6);
69 if(ret != 0)
70 return -1;
71 else
72 {
73 memset(buf, 0x0, 1024);
74 memset(dns, 0x0, 128);
75 offset = sprintf(buf, "search lan\n");
76 if(ipv4.valid)
77 {
78 if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), dns, 32) == NULL) {
79 LOGD("PrimaryDNS error.");
80 } else {
81 LOGD("PrimaryDNS : %s", dns);
82 }
83 offset += sprintf(buf + offset, "nameserver %s\n", dns);
84 memset(dns, 0x0, 128);
85 if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), dns, 32) == NULL) {
86 LOGD("SecondaryDNS error.");
87 } else {
88 LOGD("SecondaryDNS : %s", dns);
89 }
90 offset += sprintf(buf + offset, "nameserver %s\n", dns);
91 }
92 if(ipv6.valid)
93 {
94 memset(dns, 0x0, 128);
95 if(ipv6_2_str(&(ipv6.PrimaryDNS), dns))
96 {
97 LOGD("PrimaryDNS error.");
98 } else {
99 LOGD("PrimaryDNS : %s", dns);
100 }
101 offset += sprintf(buf + offset, "nameserver %s\n", dns);
102 memset(dns, 0x0, 128);
103 if(ipv6_2_str(&(ipv6.SecondaryDNS), dns))
104 {
105 LOGD("SecondaryDNS error.");
106 } else {
107 LOGD("SecondaryDNS : %s", dns);
108 }
109 offset += sprintf(buf + offset, "nameserver %s\n", dns);
110 }
111
112 if(offset > 0)
113 {
114 fd = open("/tmp/resolv.conf", O_WRONLY | O_TRUNC);
115 if(fd < 0)
116 {
117 LOGD("mbtk_route_config : open fail.");
118 return -1;
119 }
120
121 ret = write(fd, buf, offset);
122 if(ret < 0)
123 {
124 LOGD("mbtk_route_config : write fail.");
125 }
126
127 close(fd);
128 }
129 }
130
131 return 0;
132}
133#endif
134
wangyouqiange2498f12024-01-06 17:55:36 +0800135char qser_get_apn_profile_idx(void)
136{
137 char i = 0;
wangyouqiang805b0f92024-04-07 17:06:13 +0800138 for(i = QSER_PROFILE_IDX_MIN; i <= QSER_PROFILE_IDX_MAX; i++)
wangyouqiange2498f12024-01-06 17:55:36 +0800139 {
140 if(qser_apn_info_state[i] == FALSE)
141 {
142 return i;
143 }
144 }
145
146 return i;
147}
148
149int qser_check_profile_idx(unsigned char profile_idx)
150{
151 if(profile_idx < QSER_PROFILE_IDX_MIN || profile_idx > QSER_PROFILE_IDX_MAX)
152 {
153 LOGE("[qser_data_call] IDX range error.");
154 return QSER_RESULT_FAIL;
155 }
156
157 if(qser_apn_info_state[profile_idx] != TRUE)
158 {
159 LOGE("[qser_data_call] profile_idx is not exist.");
160 return QSER_RESULT_FAIL;
161 }
162
163 return QSER_RESULT_SUCCESS;
164}
165
wangyouqiang84179c82024-01-05 15:42:55 +0800166int qser_apn_info_param_convert(int profile_idx, qser_apn_info_s *new_apn, mbtk_apn_info_t *old_apn)
167{
168 if(new_apn == NULL || old_apn == NULL)
169 {
170 LOGE("[qser_data_call] qser_apn_info_param_convert apn param is NULL.");
171 return QSER_RESULT_FAIL;
172 }
173
174 //get ip type
175 if(old_apn->ip_type == MBTK_IP_TYPE_IPV4V6) // IPV4V6
176 {
177 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4V6;
178 }
179 else if(old_apn->ip_type == MBTK_IP_TYPE_IP) // IPV4
180 {
181 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4;
182 }
183 else if(old_apn->ip_type == MBTK_IP_TYPE_IPV6) // IPV6
184 {
185 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV6;
186 }
187 else
188 {
189 new_apn->pdp_type = QSER_APN_PDP_TYPE_PPP;
190 }
191
192 //get apn name
193 if(strlen(old_apn->apn)+1 > QSER_APN_NAME_SIZE)
194 {
195 LOGE("[qser_data_call] apn_nmea length verylong.");
196 return QSER_RESULT_FAIL;
197 }
198 else
199 {
200 if(strlen(old_apn->apn) > 0)
201 {
202 memcpy(new_apn->apn_name, old_apn->apn,strlen(old_apn->apn)+1);
203 }
204 else
205 {
206 memset(new_apn->apn_name, 0x0, QSER_APN_NAME_SIZE);
207 }
208 }
209
210 //get apn user
211 if(strlen(old_apn->user)+1 > QSER_APN_USERNAME_SIZE)
212 {
213 LOGE("[qser_data_call] apn_user length verylong.");
214 return QSER_RESULT_FAIL;
215 }
216 else
217 {
218 if(strlen(old_apn->user) > 0)
219 {
220 memcpy(new_apn->username, old_apn->user, strlen(old_apn->user)+1);
221 }
222 else
223 {
224 memset(new_apn->username , 0x0, QSER_APN_USERNAME_SIZE);
225 }
226 }
227
228 //get apn password
229 if(strlen(old_apn->pass)+1 > QSER_APN_PASSWORD_SIZE)
230 {
231 LOGE("[qser_data_call] apn_password length verylong.");
232 return QSER_RESULT_FAIL;
233 }
234 else
235 {
236 if(strlen(old_apn->pass) > 0)
237 {
238 memcpy(new_apn->password, old_apn->pass, strlen(old_apn->pass)+1);
239 }
240 else
241 {
242 memset(new_apn->username , 0x0, QSER_APN_PASSWORD_SIZE);
243 }
244 }
245
246 //get apn proto
247 if(strlen(old_apn->auth) > 0)
248 {
249 if(strcmp(old_apn->auth, "NONE") == 0)
250 {
wangyouqianga24887d2024-04-08 18:31:23 +0800251 if(qser_apn_auth_state[profile_idx] == '1')
252 {
253 new_apn->auth_proto = QSER_APN_AUTH_PROTO_NONE;
254 }
255 else
256 {
257 new_apn->auth_proto = QSER_APN_AUTH_PROTO_DEFAULT;
258 }
wangyouqiang84179c82024-01-05 15:42:55 +0800259 }
260 else if(strcmp(old_apn->auth, "PAP") == 0)
261 {
262 new_apn->auth_proto = QSER_APN_AUTH_PROTO_PAP;
263 }
264 else if(strcmp(old_apn->auth, "CHAP") == 0)
265 {
266 new_apn->auth_proto = QSER_APN_AUTH_PROTO_CHAP;
267 }
268 else
269 {
270 LOGE("[qser_data_call] auth input error!");
271 return QSER_RESULT_FAIL;
272 }
273 }
274
275 //get apn type
276 new_apn->profile_idx = profile_idx;
277 memset(new_apn->apn_type, 0x0, QSER_APN_NAME_SIZE);
278 if(strlen(qser_apn_info[profile_idx].apn_type) > 0)
279 {
280 memcpy(new_apn->apn_type, qser_apn_info[profile_idx].apn_type, strlen(qser_apn_info[profile_idx].apn_type));
281 }
282
283 return QSER_RESULT_SUCCESS;
284}
285
r.xiaof6ec4822024-04-03 02:46:00 -0700286/*Check parameter*/
287int qser_check_apn_name_type(qser_apn_info_s *apn)
288{
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800289 if(apn == NULL)
290 {
291 LOGE("[qser_data_call] qser_check_apn_type apn is NULL!");
292 return QSER_RESULT_FAIL;
293 }
294
295 //check default idx = 0
296 int apn_name_length = strlen(apn->apn_name);
297 //LOGE("[qser_data_call] qser_apn_info[0].apn_name: %s!", qser_apn_info[0].apn_name);
298 char *p = strchr(qser_apn_info[0].apn_name, '.');
299 if(p == NULL)
300 {
301 LOGE("[qser_data_call] qser_check_apn_type not find!");
302 //return QSER_RESULT_FAIL;
303 }
304 else
305 {
306 int default_apn_name_length = p - (qser_apn_info[0].apn_name);
307 //LOGE("[qser_data_call] qser_check_apn_type default_apn_name_length = [%d]!", default_apn_name_length);
308 if(default_apn_name_length == apn_name_length)
309 {
310 int i = 0;
311 while(i < default_apn_name_length)
312 {
313 if(isalpha(qser_apn_info[0].apn_name[i]) && isalpha(apn->apn_name[i]))
314 {
315 if(tolower(qser_apn_info[0].apn_name[i]) != tolower(apn->apn_name[i]))
316 {
317 break;
318 }
319 }
320 else
321 {
322 //LOGE("[qser_data_call] not char!");
323 if(qser_apn_info[0].apn_name[i] != apn->apn_name[i])
324 {
325 break;
326 }
327 }
328
329 i++;
330 }
331
332 if(i == default_apn_name_length)
333 {
334 LOGE("[qser_data_call] apn_name is same!idx = [0]");
335 return QSER_RESULT_FAIL;
336 }
337 }
338 }
339 //check 1 -6
340 int pdp_type_tmp = 1;
r.xiaof6ec4822024-04-03 02:46:00 -0700341 for (;pdp_type_tmp < QSER_APN_NUM; pdp_type_tmp++)
342 {
wangyouqianga24887d2024-04-08 18:31:23 +0800343 if(pdp_type_tmp == apn->profile_idx)
344 {
345 continue;
346 }
347 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 -0700348 {
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800349 if(strcmp(qser_apn_info[pdp_type_tmp].apn_type, apn->apn_type) == 0)
wangyouqiang805b0f92024-04-07 17:06:13 +0800350 {
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800351 LOGE("[qser_data_call] apn_type is same!idx = [%d]", pdp_type_tmp);
wangyouqiang805b0f92024-04-07 17:06:13 +0800352 return QSER_RESULT_FAIL;
353 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800354 if (strcmp(qser_apn_info[pdp_type_tmp].apn_name, apn->apn_name) == 0)
355 {
356 if(qser_apn_info[pdp_type_tmp].pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
357 {
358 LOGE("[qser_data_call] apn_name is same and pdp_type is IPV4V6!idx = [%d]", pdp_type_tmp);
359 return QSER_RESULT_FAIL;
360 }
361
362 if(qser_apn_info[pdp_type_tmp].pdp_type == apn->pdp_type)
363 {
364 LOGE("[qser_data_call] pdp_type is same and pdp_type is same!idx = [%d]", pdp_type_tmp);
365 return QSER_RESULT_FAIL;
366 }
367 }
r.xiaof6ec4822024-04-03 02:46:00 -0700368 }
369 }
370
371 return QSER_RESULT_SUCCESS;
372}
373
wangyouqianga24887d2024-04-08 18:31:23 +0800374void qser_state_init(qser_data_call_state_s *state)
wangyouqiang805b0f92024-04-07 17:06:13 +0800375{
wangyouqianga24887d2024-04-08 18:31:23 +0800376 if(state != NULL)
wangyouqiang805b0f92024-04-07 17:06:13 +0800377 {
wangyouqianga24887d2024-04-08 18:31:23 +0800378 state->profile_idx = 0;
379 memset(state->name, 0x0, 16);
380 state->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
381 state->state = QSER_DATA_CALL_DISCONNECTED;
382 state->err = QSER_DATA_CALL_ERROR_NONE;
383 inet_aton("0.0.0.0", &(state->v4.ip));
384 inet_aton("0.0.0.0", &(state->v4.gateway));
385 inet_aton("0.0.0.0", &(state->v4.pri_dns));
386 inet_aton("0.0.0.0", &(state->v4.sec_dns));
387 inet_pton(AF_INET6, "::", &(state->v6.ip));
388 inet_pton(AF_INET6, "::", &(state->v6.gateway));
389 inet_pton(AF_INET6, "::", &(state->v6.pri_dns));
390 inet_pton(AF_INET6, "::", &(state->v6.sec_dns));
wangyouqiang805b0f92024-04-07 17:06:13 +0800391 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800392}
r.xiaof6ec4822024-04-03 02:46:00 -0700393
wangyouqiang84179c82024-01-05 15:42:55 +0800394void qser_wan_net_state_change_cb(const void* data, int data_len)
395{
396 if(data == NULL || data_len == 0)
397 {
398 return;
399 }
400
401 uint8 *net_data = NULL;
402 net_data = (uint8 *)data;
403
wangyouqianga24887d2024-04-08 18:31:23 +0800404 if(*net_data > 100 && *net_data < 200)
wangyouqiang84179c82024-01-05 15:42:55 +0800405 {
wangyouqianga24887d2024-04-08 18:31:23 +0800406 int idx = *net_data - 101;
407 if(idx <= QSER_PROFILE_IDX_MAX)
wangyouqiange2498f12024-01-06 17:55:36 +0800408 {
wangyouqianga24887d2024-04-08 18:31:23 +0800409 qser_data_call_state_s state = {0};
410 qser_state_init(&state);
411 state.profile_idx = idx;
wangyouqiange2498f12024-01-06 17:55:36 +0800412 state.state = QSER_DATA_CALL_DISCONNECTED;
wangyouqianga24887d2024-04-08 18:31:23 +0800413 if( idx == qser_default_pdp_idx )
wangyouqiang805b0f92024-04-07 17:06:13 +0800414 {
415 qser_default_pdp_idx = -1;
416 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800417 qser_idx_pdp_state[idx] = false;
wangyouqianga24887d2024-04-08 18:31:23 +0800418
419 if(qser_net_status_cb != NULL)
420 {
421 qser_net_status_cb(&state);
422 }
wangyouqiange2498f12024-01-06 17:55:36 +0800423 }
424 else
425 {
wangyouqianga24887d2024-04-08 18:31:23 +0800426 LOGE("[qser_data_call] cb fail,idx is %d.", idx);
wangyouqiange2498f12024-01-06 17:55:36 +0800427 }
wangyouqianga24887d2024-04-08 18:31:23 +0800428
429 }
430 else if(*net_data > 200)
431 {
432 LOGE("[qser_data_call] cid[%d] is open.", *net_data - 201);
433 }
434 else if(*net_data == 1)
435 {
436 LOGE("[qser_data_call] pdp is open.");
437 }
438 else
439 {
440 LOGE("[qser_data_call] unkonwn param [%d].", *net_data);
wangyouqiang84179c82024-01-05 15:42:55 +0800441 }
442}
wangyouqiange2498f12024-01-06 17:55:36 +0800443
444static void* data_call_async_thread(void* arg)
445{
446 qser_data_call_error_e err;
wangyouqianga24887d2024-04-08 18:31:23 +0800447
448 qser_data_call_s qser_data_backup = {0};
449 if(arg != NULL)
450 {
451 memcpy(&qser_data_backup, (qser_data_call_s *)arg, sizeof(qser_data_call_s));
452 }
453 else
454 {
455 LOGE("[qser_data_call] arg is NULL.");
456 }
457
458 qser_data_call_state_s state = {0};
459 qser_state_init(&state);
460 state.profile_idx = qser_data_backup.profile_idx;
461 state.ip_family = qser_data_backup.ip_family;
462
wangyouqiange2498f12024-01-06 17:55:36 +0800463 int ret = qser_data_call_start(&qser_data_backup, &err);
464 if(ret != QSER_RESULT_SUCCESS)
465 {
466 LOGE("[qser_data_call] qser_data_call_start() fail.");
wangyouqianga24887d2024-04-08 18:31:23 +0800467 state.err = err;
468 if(qser_net_status_cb != NULL)
469 {
470 qser_net_status_cb(&state);
471 }
wangyouqiange2498f12024-01-06 17:55:36 +0800472 }
wangyouqianga24887d2024-04-08 18:31:23 +0800473
474 qser_data_call_info_s info = {0};
475 ret = qser_data_call_info_get(qser_data_backup.profile_idx, qser_data_backup.ip_family, &info, &err);
476 if(ret != QSER_RESULT_SUCCESS)
477 {
478 LOGE("[qser_data_call] qser_data_call_info_get() fail.");
479 state.err = err;
480 if(qser_net_status_cb != NULL)
481 {
482 qser_net_status_cb(&state);
483 }
484 }
485
486 snprintf(state.name, 16, "ccinet%d", qser_data_backup.profile_idx);
487 state.state = QSER_DATA_CALL_CONNECTED;
488 state.err = err;
489 memcpy(&(state.v4), &(info.v4.addr), sizeof(struct v4_address_status));
490 memcpy(&(state.v6), &(info.v6.addr), sizeof(struct v6_address_status));
491 if(qser_net_status_cb != NULL)
492 {
493 qser_net_status_cb(&state);
494 }
wangyouqiange2498f12024-01-06 17:55:36 +0800495 return NULL;
496}
497
wangyouqiang84179c82024-01-05 15:42:55 +0800498/******************************FUNC*****************************************/
499
500/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +0800501int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
502{
wangyouqiang84179c82024-01-05 15:42:55 +0800503 //UNUSED(evt_cb);
504 if(!inited && qser_info_handle == NULL)
505 {
506 qser_info_handle = mbtk_info_handle_get();
507 if(qser_info_handle)
508 {
509 qser_info_handle_num++;
510 inited = TRUE;
511 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
512 }
513 else
514 {
515 LOGE("[qser_data_call] mbtk_info_handle_get() fail.");
516 return QSER_RESULT_FAIL;
517 }
518 }
519 else
520 {
521 if(!inited)
522 {
523 qser_info_handle_num++;
524 inited = TRUE;
525 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
526 }
527 }
528 qser_net_status_cb = evt_cb;
b.liu5fa9e772023-11-23 18:00:55 +0800529
wangyouqiange2498f12024-01-06 17:55:36 +0800530 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
531 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqianga24887d2024-04-08 18:31:23 +0800532 property_get("persist.qser.apn.auth", qser_apn_auth_state, "00000000");
wangyouqiange2498f12024-01-06 17:55:36 +0800533 mbtk_apn_info_t apns[10] = {0};
534 int apn_num = 10;
535 char qser_apn_type[32] = {0};
536 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
537 if(ret != 0)
538 {
539 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
540 return QSER_RESULT_FAIL;
541 }
542 else
543 {
544 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
545 {
546 int i = 0;
547 for(i = 0; i < apn_num; i++)
548 {
549 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
550 {
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800551 //LOGE("[qser_data_call] idx no open.");
552#if defined(MBTK_ALL_CID_SUPPORT)
553 if(apns[i].cid - 1 == 0)
554 {
555 qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]);
556 }
557#endif
wangyouqiange2498f12024-01-06 17:55:36 +0800558 continue;
559 }
b.liuf37bd332024-03-18 13:51:24 +0800560
561#if defined(MBTK_ALL_CID_SUPPORT)
562 if(qser_apn_add_save_state[apns[i].cid - 1] == '2')
563 {
564 qser_apn_default_idx = apns[i].cid - 1;
565 }
566#endif
567
wangyouqiange2498f12024-01-06 17:55:36 +0800568 if(qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]) != 0)
569 {
570 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
571 return QSER_RESULT_FAIL;
572 }
573 else
574 {
575 qser_apn_info_state[apns[i].cid - 1] = TRUE;
576 sprintf(qser_apn_type, "persist.qser.apn.type%d", apns[i].cid - 1);
577 property_get(qser_apn_type, qser_apn_info[apns[i].cid - 1].apn_type, NULL);
578 }
579 }
580 }
581 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800582
583 int idx = 0;
584 for(;idx < QSER_APN_NUM; idx++)
585 {
586 qser_idx_pdp_state[idx] = false;
587 }
wangyouqiang84179c82024-01-05 15:42:55 +0800588 LOGE("[qser_data_call] mbtk_info_handle_get() success.");
589 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800590}
591
592void qser_data_call_destroy(void)
593{
wangyouqiang84179c82024-01-05 15:42:55 +0800594 if(qser_info_handle)
595 {
596 LOGE("qser_info_handle_num = %d", qser_info_handle_num);
597 if(qser_info_handle_num == 1)
598 { // 最后一个引用,可释放。
599 int ret = mbtk_info_handle_free(&qser_info_handle);
600 if(ret)
601 {
602 LOGE("[qser_data_call] mbtk_info_handle_free() fail.");
603 }
604 else
605 {
606 qser_info_handle_num = 0;
607 qser_info_handle = NULL;
608 inited = FALSE;
609 }
610 }
611 else
612 {
613 qser_info_handle_num--;
614 }
615 }
616 else
617 {
618 LOGE("[qser_data_call] handle not inited.");
619 }
b.liu5fa9e772023-11-23 18:00:55 +0800620}
621
622int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
623{
wangyouqiang84179c82024-01-05 15:42:55 +0800624 //UNUSED(data_call);
625 //UNUSED(err);
626 if(data_call == NULL || err == NULL)
627 {
628 LOGE("[qser_data_call] data_call or err is NULL.");
629 if(err != NULL)
630 {
631 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
632 }
633 return QSER_RESULT_FAIL;
634 }
635
636 if(qser_info_handle == NULL)
637 {
638 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800639 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800640 return QSER_RESULT_FAIL;
641 }
b.liu5fa9e772023-11-23 18:00:55 +0800642
wangyouqiang805b0f92024-04-07 17:06:13 +0800643#if defined(MBTK_ALL_CID_SUPPORT)
644 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
645 {
646 LOGE("[qser_data_call] default pdp exist.");
647 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
648 return QSER_RESULT_FAIL;
649 }
650#endif
651
wangyouqiange2498f12024-01-06 17:55:36 +0800652 if(qser_check_profile_idx(data_call->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800653 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800654#if defined(MBTK_ALL_CID_SUPPORT)
655 if( data_call->profile_idx == 0 )
656 {
657 LOGE("[qser_data_call] profile_idx = 0.");
658 }
659 else
660#endif
661 {
662 LOGE("[qser_data_call] profile_idx is invalid.");
663 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
664 return QSER_RESULT_FAIL;
665 }
wangyouqiang84179c82024-01-05 15:42:55 +0800666 }
667
668 int ret = -1;
669 ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
670 if(ret != 0)
671 {
672 LOGE("[qser_data_call] mbtk_data_call_start fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800673 if(ret == MBTK_INFO_ERR_CID_EXIST)
674 {
675 *err = QSER_DATA_CALL_ERROR_PDP_ACTIVATE;
676 }
677 else
678 {
679 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
680 }
wangyouqiang84179c82024-01-05 15:42:55 +0800681 return QSER_RESULT_FAIL;
682 }
683 else
684 {
685 *err = QSER_DATA_CALL_ERROR_NONE;
686 }
wangyouqiange2498f12024-01-06 17:55:36 +0800687
b.liuf37bd332024-03-18 13:51:24 +0800688#if defined(MBTK_ALL_CID_SUPPORT)
689 if(qser_apn_default_idx == data_call->profile_idx)
690 {
691 qser_route_config(qser_apn_default_idx + 1);
wangyouqiang805b0f92024-04-07 17:06:13 +0800692 qser_default_pdp_idx = data_call->profile_idx;
b.liuf37bd332024-03-18 13:51:24 +0800693 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800694 else if(data_call->profile_idx == 0)
695 {
696 qser_route_config(1);
697 qser_default_pdp_idx = data_call->profile_idx;
698 }
699 else
700 {
701 //
702 }
703
b.liuf37bd332024-03-18 13:51:24 +0800704#endif
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800705 qser_idx_pdp_state[data_call->profile_idx] = true;
b.liuf37bd332024-03-18 13:51:24 +0800706
wangyouqiange2498f12024-01-06 17:55:36 +0800707 return QSER_RESULT_SUCCESS;
708}
709
710int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
711{
712 //UNUSED(data_call);
713 UNUSED(err);
714 if(data_call == NULL || err == NULL)
715 {
716 LOGE("[qser_data_call] data_call or err is NULL.");
717 if(err != NULL)
718 {
719 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
720 }
721 return QSER_RESULT_FAIL;
722 }
723
724 if(qser_info_handle == NULL)
725 {
726 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800727 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiange2498f12024-01-06 17:55:36 +0800728 return QSER_RESULT_FAIL;
729 }
730
wangyouqiang805b0f92024-04-07 17:06:13 +0800731#if defined(MBTK_ALL_CID_SUPPORT)
732 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
733 {
734 LOGE("[qser_data_call] default pdp exist.");
735 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
736 return QSER_RESULT_FAIL;
737 }
738#endif
739
wangyouqiange2498f12024-01-06 17:55:36 +0800740 if(qser_check_profile_idx(data_call->profile_idx) < 0)
741 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800742#if defined(MBTK_ALL_CID_SUPPORT)
743 if((data_call->profile_idx == 0) && (qser_default_pdp_idx < 0))
744 {
745 LOGE("[qser_data_call] profile_idx = 0 and not open default idx.");
746 }
747 else
748#endif
749 {
750 LOGE("[qser_data_call] profile_idx is invalid.");
751 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
752 return QSER_RESULT_FAIL;
753 }
754
wangyouqiange2498f12024-01-06 17:55:36 +0800755 }
756
757 pthread_attr_t thread_attr;
758 pthread_t data_call_thread_id;
759 pthread_attr_init(&thread_attr);
760 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
761 {
762 LOGE("[qser_data_call] pthread_attr_setdetachstate() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800763 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800764 return QSER_RESULT_FAIL;
765 }
766
wangyouqianga24887d2024-04-08 18:31:23 +0800767 //memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
768 if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, (void *) data_call))
wangyouqiange2498f12024-01-06 17:55:36 +0800769 {
770 LOGE("[qser_data_call] pthread_create() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800771 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800772 return QSER_RESULT_FAIL;
773 }
774 pthread_attr_destroy(&thread_attr);
wangyouqiange2498f12024-01-06 17:55:36 +0800775
wangyouqiang84179c82024-01-05 15:42:55 +0800776 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800777}
778
779int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
780{
wangyouqiang84179c82024-01-05 15:42:55 +0800781 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800782 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800783 //UNUSED(err);
784 if(err == NULL)
785 {
786 LOGE("[qser_data_call] err is NULL.");
787 return QSER_RESULT_FAIL;
788 }
b.liu5fa9e772023-11-23 18:00:55 +0800789
wangyouqiang84179c82024-01-05 15:42:55 +0800790 if(qser_info_handle == NULL)
791 {
792 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800793 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800794 return QSER_RESULT_FAIL;
795 }
796
wangyouqiange2498f12024-01-06 17:55:36 +0800797 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800798 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800799#if defined(MBTK_ALL_CID_SUPPORT)
800 if(profile_idx == 0)
801 {
802 LOGE("[qser_data_call] profile_idx = 0.");
803 }
804 else
805#endif
806 {
807 LOGE("[qser_data_call] profile_idx is invalid.");
808 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
809 return QSER_RESULT_FAIL;
810 }
wangyouqiang84179c82024-01-05 15:42:55 +0800811 }
812
813 int ret = -1;
814 ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
815 if(ret != 0)
816 {
817 LOGE("[qser_data_call] mbtk_data_call_stop fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800818 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
819 {
820 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
821 }
822 else
823 {
824 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
825 }
wangyouqiang84179c82024-01-05 15:42:55 +0800826 return QSER_RESULT_FAIL;
827 }
828 else
829 {
830 *err = QSER_DATA_CALL_ERROR_NONE;
831 }
wangyouqiange2498f12024-01-06 17:55:36 +0800832
wangyouqiang805b0f92024-04-07 17:06:13 +0800833#if defined(MBTK_ALL_CID_SUPPORT)
834 if(qser_default_pdp_idx == profile_idx)
835 {
836 qser_default_pdp_idx = -1;
837 }
838#endif
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800839 qser_idx_pdp_state[profile_idx] = false;
wangyouqiang805b0f92024-04-07 17:06:13 +0800840
wangyouqiang84179c82024-01-05 15:42:55 +0800841 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800842}
843
844int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
845 qser_data_call_info_s *info, qser_data_call_error_e *err)
846{
wangyouqiang84179c82024-01-05 15:42:55 +0800847 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800848 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800849 //UNUSED(info);
850 //UNUSED(err);
b.liu5fa9e772023-11-23 18:00:55 +0800851
wangyouqiang84179c82024-01-05 15:42:55 +0800852 if(info == NULL || err == NULL)
853 {
854 LOGE("[qser_data_call] info or err is NULL.");
855 if(err != NULL)
856 {
857 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
858 }
859 return QSER_RESULT_FAIL;
860 }
861
862 if(qser_info_handle == NULL)
863 {
864 LOGE("[qser_data_call] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800865 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800866 return QSER_RESULT_FAIL;
867 }
868
wangyouqiange2498f12024-01-06 17:55:36 +0800869 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800870 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800871#if defined(MBTK_ALL_CID_SUPPORT)
872 if(profile_idx == 0)
873 {
874 LOGE("[qser_data_call] profile_idx = 0.");
875 }
876 else
877#endif
878 {
879 LOGE("[qser_data_call] profile_idx is invalid.");
880 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
881 return QSER_RESULT_FAIL;
882 }
wangyouqiang84179c82024-01-05 15:42:55 +0800883 }
884
885 int ret = -1;
886 mbtk_ipv4_info_t ipv4;
887 mbtk_ipv6_info_t ipv6;
888#ifdef QSER_TEST
889 char v4_buff[32] = {0};
890 char v6_buff[128] = {0};
891#endif
892 memset(info, 0, sizeof(qser_data_call_info_s));
893 ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
894 if(ret != 0)
895 {
896 LOGE("[qser_data_call] mbtk_data_call_state_get fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800897 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
898 {
899 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
900 }
901 else
902 {
903 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
904 }
wangyouqiang84179c82024-01-05 15:42:55 +0800905 return QSER_RESULT_FAIL;
906 }
907 else
908 {
909 info->profile_idx = profile_idx;
910 if(ipv4.valid)
911 {
912 info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
913 info->v4.state = QSER_DATA_CALL_CONNECTED;
914 sprintf(info->v4.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800915 info->v4.addr.ip.s_addr = ipv4.IPAddr;
916 info->v4.addr.pri_dns.s_addr = ipv4.PrimaryDNS;
917 info->v4.addr.sec_dns.s_addr = ipv4.SecondaryDNS;
918
wangyouqiang84179c82024-01-05 15:42:55 +0800919#ifdef QSER_TEST
b.liuf37bd332024-03-18 13:51:24 +0800920 //LOGE("[qser_data_call] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
wangyouqiang84179c82024-01-05 15:42:55 +0800921 if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
922 LOGE("[qser_data_call] IP error.");
923 } else {
924 LOGE("[qser_data_call] IP : %s", v4_buff);
925 }
926 if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
927 LOGE("[qser_data_call] PrimaryDNS error.");
928 } else {
929 LOGE("[qser_data_call] PrimaryDNS : %s", v4_buff);
930 }
931 if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
932 LOGE("[qser_data_call] SecondaryDNS error.");
933 } else {
934 LOGE("[qser_data_call] SecondaryDNS : %s", v4_buff);
935 }
936#endif
937 }
938
939 if(ipv6.valid)
940 {
941 info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
942 info->v6.state = QSER_DATA_CALL_CONNECTED;
943 sprintf(info->v6.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800944 memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), sizeof(ipv6.IPV6Addr));
945 memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), sizeof(ipv6.PrimaryDNS));
946 memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), sizeof(ipv6.SecondaryDNS));
wangyouqiang84179c82024-01-05 15:42:55 +0800947#ifdef QSER_TEST
948 if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
949 {
950 LOGE("[qser_data_call] IP error.");
951 } else {
952 LOGE("[qser_data_call] IP : %s", v6_buff);
953 }
954 if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
955 {
956 LOGE("[qser_data_call] PrimaryDNS error.");
957 } else {
958 LOGE("[qser_data_call] PrimaryDNS : %s", v6_buff);
959 }
960 if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
961 {
962 LOGE("[qser_data_call] SecondaryDNS error.");
963 } else {
964 LOGE("[qser_data_call] SecondaryDNS : %s", v6_buff);
965 }
966#endif
967 }
968
969 if(ipv4.valid && ipv6.valid)
970 {
971 info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
972 }
973
974 if(!ipv4.valid && !ipv6.valid)
975 {
976 info->v4.state = QSER_DATA_CALL_DISCONNECTED;
977 info->v6.state = QSER_DATA_CALL_DISCONNECTED;
978 }
979 }
980
981 *err = QSER_DATA_CALL_ERROR_NONE;
982 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800983}
984
985int qser_apn_set(qser_apn_info_s *apn)
986{
wangyouqiang84179c82024-01-05 15:42:55 +0800987 //UNUSED(apn);
988 if(qser_info_handle == NULL)
989 {
990 LOGE("[qser_data_call] handle is NULL.");
991 return QSER_RESULT_FAIL;
992 }
993
994 if(apn == NULL)
995 {
996 LOGE("[qser_data_call] apn param is NULL.");
997 return QSER_RESULT_FAIL;
998 }
b.liu5fa9e772023-11-23 18:00:55 +0800999
wangyouqiange2498f12024-01-06 17:55:36 +08001000 if(qser_check_profile_idx(apn->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001001 {
wangyouqiange2498f12024-01-06 17:55:36 +08001002 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +08001003 return QSER_RESULT_FAIL;
1004 }
1005
1006 if(strlen(apn->apn_name) == 0)
1007 {
1008 LOGE("[qser_data_call] apn_name is NULL.");
1009 return QSER_RESULT_FAIL;
1010 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001011
1012#if 0
1013 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1014 {
1015 if(qser_apn_default_idx > -1)
1016 {
1017 LOGE("[qser_data_call] iot_default is exist.");
1018 return QSER_RESULT_FAIL;
1019 }
1020 }
1021#endif
1022
r.xiaof6ec4822024-04-03 02:46:00 -07001023 /*add name and type verify*/
1024 if (qser_check_apn_name_type(apn) < 0)
1025 {
1026 LOGE("[qser_data_call] check param error.");
1027 return QSER_RESULT_FAIL;
1028 }
wangyouqiang84179c82024-01-05 15:42:55 +08001029
1030 int ret = -1;
1031 char mbtk_auth[32]={0};
wangyouqiange2498f12024-01-06 17:55:36 +08001032 char qser_apn_type[32] = {0};
wangyouqiang84179c82024-01-05 15:42:55 +08001033 mbtk_ip_type_enum pdp_type = MBTK_IP_TYPE_IPV4V6;
r.xiaof6ec4822024-04-03 02:46:00 -07001034
wangyouqiang84179c82024-01-05 15:42:55 +08001035 if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
1036 {
1037 pdp_type = MBTK_IP_TYPE_IP;
1038 }
1039 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
1040 {
1041 pdp_type = MBTK_IP_TYPE_IPV6;
1042 }
1043 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
1044 {
1045 pdp_type = MBTK_IP_TYPE_IPV4V6;
1046 }
1047 else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
1048 {
1049 pdp_type = MBTK_IP_TYPE_PPP;
1050 }
1051 else
1052 {
1053 LOGE("[qser_data_call] pdp_type error.");
1054 return QSER_RESULT_FAIL;
1055 }
1056
1057 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE || apn->auth_proto == QSER_APN_AUTH_PROTO_DEFAULT)
1058 {
1059 memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
1060 }
1061 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP)
1062 {
1063 memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
1064 }
1065 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_CHAP)
1066 {
1067 memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
1068 }
1069 #if 0
1070 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
1071 {
1072 //NOT SUPPORT
1073 }
1074 #endif
1075 else
1076 {
1077 LOGE("[qser_data_call] auth input error!");
1078 return QSER_RESULT_FAIL;
1079 }
1080
1081 if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
1082 {
1083 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);
1084 }
1085 else
1086 {
1087 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);
1088 }
wangyouqiange2498f12024-01-06 17:55:36 +08001089
wangyouqiang84179c82024-01-05 15:42:55 +08001090 ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
1091 if(ret < 0)
1092 {
1093 LOGE("[qser_data_call] mbtk_apn_set fail!");
1094 return QSER_RESULT_FAIL;
1095 }
1096
wangyouqiange2498f12024-01-06 17:55:36 +08001097 sprintf(qser_apn_type, "persist.qser.apn.type%d", apn->profile_idx);
1098 property_set(qser_apn_type, apn->apn_type);
wangyouqianga24887d2024-04-08 18:31:23 +08001099 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE)
1100 {
1101 qser_apn_auth_state[apn->profile_idx] = '1';
1102 }
1103 else
1104 {
1105 qser_apn_auth_state[apn->profile_idx] = '0';
1106 }
1107 property_set("persist.qser.apn.auth", qser_apn_auth_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001108 memcpy(&qser_apn_info[apn->profile_idx], apn, sizeof(qser_apn_info_s));
wangyouqiang805b0f92024-04-07 17:06:13 +08001109
1110#if defined(MBTK_ALL_CID_SUPPORT)
wangyouqianga24887d2024-04-08 18:31:23 +08001111 if(strcmp(apn->apn_type, "iot_default") == 0)
wangyouqiang805b0f92024-04-07 17:06:13 +08001112 {
1113 qser_apn_add_save_state[apn->profile_idx] = '2';
1114 qser_apn_default_idx = apn->profile_idx;
1115 }
1116 else
1117#endif
1118 {
1119 qser_apn_add_save_state[apn->profile_idx] = '1';
1120 }
1121
wangyouqianga24887d2024-04-08 18:31:23 +08001122 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001123 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001124}
1125
1126int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
1127{
wangyouqiang84179c82024-01-05 15:42:55 +08001128 //UNUSED(profile_idx);
1129 //UNUSED(apn);
1130 if(qser_info_handle == NULL)
1131 {
1132 LOGE("[qser_data_call] handle is NULL.");
1133 return QSER_RESULT_FAIL;
1134 }
1135
1136 if(apn == NULL)
1137 {
1138 LOGE("[qser_data_call] apn param is NULL.");
1139 return QSER_RESULT_FAIL;
1140 }
b.liu5fa9e772023-11-23 18:00:55 +08001141
wangyouqiange2498f12024-01-06 17:55:36 +08001142 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001143 {
wangyouqiang805b0f92024-04-07 17:06:13 +08001144#if defined(MBTK_ALL_CID_SUPPORT)
1145 if(profile_idx != 0)
1146#endif
1147 {
1148 LOGE("[qser_data_call] profile_idx is invalid.");
1149 return QSER_RESULT_FAIL;
1150 }
wangyouqiang84179c82024-01-05 15:42:55 +08001151 }
1152
1153 //get apn info
1154 mbtk_apn_info_t apns[10] = {0};
1155 int apn_num = 10;
1156 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1157 if(ret != 0)
1158 {
1159 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
1160 return QSER_RESULT_FAIL;
1161 }
1162 else
1163 {
1164 int i = 0;
1165 for(i = 0; i < apn_num; i++)
1166 {
1167 if(apns[i].cid == profile_idx + 1)
1168 {
1169 LOGE("[qser_data_call] find IDX.");
1170 break;
1171 }
1172 }
1173
1174 if(i == apn_num)
1175 {
1176 LOGE("[qser_data_call] not find IDX.[apn_num = %d]", apn_num);
1177 return QSER_RESULT_FAIL;
1178 }
1179
1180 if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
1181 {
1182 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
1183 return QSER_RESULT_FAIL;
1184 }
1185 }
1186 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001187}
1188
1189int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
1190{
wangyouqiange2498f12024-01-06 17:55:36 +08001191 //UNUSED(apn);
1192 //UNUSED(profile_idx);
1193 if(qser_info_handle == NULL)
1194 {
1195 LOGE("[qser_data_call] handle is NULL.");
1196 return QSER_RESULT_FAIL;
1197 }
1198
1199 if(apn == NULL)
1200 {
1201 LOGE("[qser_data_call] apn param is NULL.");
1202 return QSER_RESULT_FAIL;
1203 }
b.liu5fa9e772023-11-23 18:00:55 +08001204
wangyouqiang805b0f92024-04-07 17:06:13 +08001205#if 0
b.liuf37bd332024-03-18 13:51:24 +08001206 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1207 {
1208 if(qser_apn_default_idx > -1)
1209 {
1210 LOGE("[qser_data_call] iot_default is exist.");
1211 return QSER_RESULT_FAIL;
1212 }
1213 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001214 /*add name and type verify*/
1215 if (qser_check_apn_name_type(apn) < 0)
1216 {
1217 LOGE("[qser_data_call] check param error.");
1218 return QSER_RESULT_FAIL;
1219 }
1220#endif
b.liuf37bd332024-03-18 13:51:24 +08001221
wangyouqiange2498f12024-01-06 17:55:36 +08001222 int ret = 0;
1223 char idx = qser_get_apn_profile_idx();
wangyouqiang805b0f92024-04-07 17:06:13 +08001224 if(idx > QSER_PROFILE_IDX_MAX)
wangyouqiange2498f12024-01-06 17:55:36 +08001225 {
1226 LOGE("[qser_data_call] idx is full.");
1227 return QSER_RESULT_FAIL;
1228 }
1229 else
1230 {
1231 qser_apn_info_state[idx] = TRUE;
1232 qser_apn_info_s set_apn;
1233 set_apn.profile_idx = idx;
1234 set_apn.pdp_type = apn->pdp_type;
1235 set_apn.auth_proto = apn->auth_proto;
1236 memcpy(set_apn.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
1237 memcpy(set_apn.username, apn->username, QSER_APN_USERNAME_SIZE);
1238 memcpy(set_apn.password, apn->password, QSER_APN_PASSWORD_SIZE);
1239 memcpy(set_apn.apn_type, apn->apn_type, QSER_APN_NAME_SIZE);
1240 ret = qser_apn_set(&set_apn);
1241 if(ret != 0)
1242 {
1243 LOGE("[qser_data_call] qser_apn_set fail.");
1244 qser_apn_info_state[idx] = FALSE;
1245 return QSER_RESULT_FAIL;
1246 }
1247 *profile_idx = idx;
wangyouqiange2498f12024-01-06 17:55:36 +08001248 }
1249 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001250}
1251
1252int qser_apn_del(unsigned char profile_idx)
1253{
wangyouqiange2498f12024-01-06 17:55:36 +08001254 //UNUSED(profile_idx);
1255 if(qser_info_handle == NULL)
1256 {
1257 LOGE("[qser_data_call] handle is NULL.");
1258 return QSER_RESULT_FAIL;
1259 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001260
1261 if(qser_idx_pdp_state[profile_idx] == true)
1262 {
1263 LOGE("[qser_data_call] profile_idx[%d] open pdp.", profile_idx);
1264 return QSER_RESULT_FAIL;
1265 }
b.liu5fa9e772023-11-23 18:00:55 +08001266
wangyouqiange2498f12024-01-06 17:55:36 +08001267 if(qser_check_profile_idx(profile_idx) < 0)
1268 {
1269 LOGE("[qser_data_call] profile_idx is invalid.");
1270 return QSER_RESULT_FAIL;
1271 }
1272
1273 qser_apn_info_state[profile_idx] = FALSE;
1274 qser_apn_add_save_state[profile_idx] = '0';
b.liuf37bd332024-03-18 13:51:24 +08001275
1276#if defined(MBTK_ALL_CID_SUPPORT)
1277 if(profile_idx == qser_apn_default_idx)
1278 {
1279 qser_apn_default_idx = -1;
1280 }
1281#endif
1282
wangyouqiange2498f12024-01-06 17:55:36 +08001283 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
1284 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001285}
1286
1287int qser_apn_get_list(qser_apn_info_list_s *apn_list)
1288{
wangyouqiang84179c82024-01-05 15:42:55 +08001289 //UNUSED(apn_list);
b.liu5fa9e772023-11-23 18:00:55 +08001290
wangyouqiang84179c82024-01-05 15:42:55 +08001291 if(qser_info_handle == NULL)
1292 {
1293 LOGE("[qser_data_call] handle is NULL.");
1294 return QSER_RESULT_FAIL;
1295 }
1296
1297 if(apn_list == NULL)
1298 {
1299 LOGE("[qser_data_call] apn_list param is NULL.");
1300 return QSER_RESULT_FAIL;
1301 }
1302
wangyouqiange2498f12024-01-06 17:55:36 +08001303 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
1304 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001305 mbtk_apn_info_t apns[10] = {0};
1306 int apn_num = 10;
1307 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1308 if(ret != 0)
1309 {
1310 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
1311 return QSER_RESULT_FAIL;
1312 }
1313 else
1314 {
1315 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
1316 {
1317 int i = 0;
wangyouqiange2498f12024-01-06 17:55:36 +08001318 apn_list->cnt = 0;
wangyouqiang84179c82024-01-05 15:42:55 +08001319 for(i = 0; i < apn_num; i++)
1320 {
wangyouqiange2498f12024-01-06 17:55:36 +08001321 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
1322 {
wangyouqiang805b0f92024-04-07 17:06:13 +08001323#if defined(MBTK_ALL_CID_SUPPORT)
1324 if((apns[i].cid - 1) != 0)
1325#endif
1326 {
1327 LOGE("[qser_data_call] idx no open.");
1328 continue;
1329 }
wangyouqiange2498f12024-01-06 17:55:36 +08001330 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001331 if(qser_apn_info_param_convert(apns[i].cid - 1, &apn_list->apn[apn_list->cnt], &apns[i]) != 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001332 {
1333 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
1334 return QSER_RESULT_FAIL;
1335 }
wangyouqiange2498f12024-01-06 17:55:36 +08001336 apn_list->cnt++;
wangyouqiang84179c82024-01-05 15:42:55 +08001337 }
wangyouqiang84179c82024-01-05 15:42:55 +08001338 }
1339 else if(apn_num > QSER_APN_MAX_LIST)
1340 {
1341 LOGE("[qser_data_call] apn_num overlong");
1342 return QSER_RESULT_FAIL;
1343 }
1344 else
1345 {
1346 apn_list->cnt = 0;
1347 }
1348 }
1349 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001350}
wangyouqiang84179c82024-01-05 15:42:55 +08001351/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +08001352