blob: 1d886f39a9f344d02e8f8e9ca097dbe2138726f0 [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)
wangyouqiang12a87812024-04-22 14:54:52 +080057static int qser_route_config(int profile_idx)
b.liuf37bd332024-03-18 13:51:24 +080058{
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)
wangyouqiang12a87812024-04-22 14:54:52 +080070 return QSER_RESULT_FAIL;
b.liuf37bd332024-03-18 13:51:24 +080071 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.");
wangyouqiang12a87812024-04-22 14:54:52 +0800118 return QSER_RESULT_FAIL;
b.liuf37bd332024-03-18 13:51:24 +0800119 }
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
wangyouqiang12a87812024-04-22 14:54:52 +0800135static char qser_get_apn_profile_idx(void)
wangyouqiange2498f12024-01-06 17:55:36 +0800136{
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
wangyouqiang12a87812024-04-22 14:54:52 +0800149static int qser_check_profile_idx(unsigned char profile_idx)
wangyouqiange2498f12024-01-06 17:55:36 +0800150{
151 if(profile_idx < QSER_PROFILE_IDX_MIN || profile_idx > QSER_PROFILE_IDX_MAX)
152 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800153 LOGE("IDX range error.");
wangyouqiange2498f12024-01-06 17:55:36 +0800154 return QSER_RESULT_FAIL;
155 }
156
157 if(qser_apn_info_state[profile_idx] != TRUE)
158 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800159 LOGE("profile_idx is not exist.");
wangyouqiange2498f12024-01-06 17:55:36 +0800160 return QSER_RESULT_FAIL;
161 }
162
163 return QSER_RESULT_SUCCESS;
164}
165
wangyouqiang12a87812024-04-22 14:54:52 +0800166static int qser_apn_info_param_convert(int profile_idx, qser_apn_info_s *new_apn, mbtk_apn_info_t *old_apn)
wangyouqiang84179c82024-01-05 15:42:55 +0800167{
168 if(new_apn == NULL || old_apn == NULL)
169 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800170 LOGE("qser_apn_info_param_convert apn param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800171 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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800195 LOGE("apn_nmea length verylong.");
wangyouqiang84179c82024-01-05 15:42:55 +0800196 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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800213 LOGE("apn_user length verylong.");
wangyouqiang84179c82024-01-05 15:42:55 +0800214 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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800231 LOGE("apn_password length verylong.");
wangyouqiang84179c82024-01-05 15:42:55 +0800232 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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800270 LOGE("auth input error!");
wangyouqiang84179c82024-01-05 15:42:55 +0800271 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*/
wangyouqiang12a87812024-04-22 14:54:52 +0800287static int qser_check_apn_name_type(qser_apn_info_s *apn)
r.xiaof6ec4822024-04-03 02:46:00 -0700288{
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800289 if(apn == NULL)
290 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800291 LOGE("qser_check_apn_type apn is NULL!");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800292 return QSER_RESULT_FAIL;
293 }
294
295 //check default idx = 0
296 int apn_name_length = strlen(apn->apn_name);
wangyouqiang45cfff82024-04-15 19:35:15 +0800297 //LOGE("qser_apn_info[0].apn_name: %s!", qser_apn_info[0].apn_name);
wangyouqiang12a87812024-04-22 14:54:52 +0800298 char *p = strstr(qser_apn_info[0].apn_name, "mnc");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800299 if(p == NULL)
300 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800301 LOGE("qser_check_apn_type not find!");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800302 //return QSER_RESULT_FAIL;
303 }
304 else
305 {
wangyouqiang12a87812024-04-22 14:54:52 +0800306 int default_apn_name_length = p - (qser_apn_info[0].apn_name) -1;
307 LOGE("qser_check_apn_type default_apn_name_length = [%d]!", default_apn_name_length);
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800308 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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800322 //LOGE("not char!");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800323 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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800334 LOGE("apn_name is same!idx = [0]");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800335 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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800351 LOGE("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 {
wangyouqiangce45a102024-04-18 18:08:29 +0800356 if(qser_apn_info[pdp_type_tmp].pdp_type == QSER_APN_PDP_TYPE_IPV4V6 || apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800357 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800358 LOGE("apn_name is same and pdp_type is IPV4V6!idx = [%d]", pdp_type_tmp);
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800359 return QSER_RESULT_FAIL;
360 }
361
362 if(qser_apn_info[pdp_type_tmp].pdp_type == apn->pdp_type)
363 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800364 LOGE("pdp_type is same and pdp_type is same!idx = [%d]", pdp_type_tmp);
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800365 return QSER_RESULT_FAIL;
366 }
367 }
r.xiaof6ec4822024-04-03 02:46:00 -0700368 }
369 }
370
371 return QSER_RESULT_SUCCESS;
372}
373
wangyouqiang12a87812024-04-22 14:54:52 +0800374static void 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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800426 LOGE("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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800432 LOGE("cid[%d] is open.", *net_data - 201);
wangyouqianga24887d2024-04-08 18:31:23 +0800433 }
434 else if(*net_data == 1)
435 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800436 LOGE("pdp is open.");
wangyouqianga24887d2024-04-08 18:31:23 +0800437 }
438 else
439 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800440 LOGE("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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800455 LOGE("arg is NULL.");
wangyouqianga24887d2024-04-08 18:31:23 +0800456 }
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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800466 LOGE("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 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800478 LOGE("qser_data_call_info_get() fail.");
wangyouqianga24887d2024-04-08 18:31:23 +0800479 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);
wangyouqiang45cfff82024-04-15 19:35:15 +0800504 mbtk_log_init("radio", "QSER_DATA_CALL");
wangyouqiang84179c82024-01-05 15:42:55 +0800505 if(!inited && qser_info_handle == NULL)
506 {
507 qser_info_handle = mbtk_info_handle_get();
508 if(qser_info_handle)
509 {
510 qser_info_handle_num++;
511 inited = TRUE;
512 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
513 }
514 else
515 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800516 LOGE("mbtk_info_handle_get() fail.");
wangyouqiang84179c82024-01-05 15:42:55 +0800517 return QSER_RESULT_FAIL;
518 }
519 }
520 else
521 {
522 if(!inited)
523 {
524 qser_info_handle_num++;
525 inited = TRUE;
526 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
527 }
528 }
529 qser_net_status_cb = evt_cb;
b.liu5fa9e772023-11-23 18:00:55 +0800530
wangyouqiange2498f12024-01-06 17:55:36 +0800531 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
wangyouqiang45cfff82024-04-15 19:35:15 +0800532 LOGE("qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqianga24887d2024-04-08 18:31:23 +0800533 property_get("persist.qser.apn.auth", qser_apn_auth_state, "00000000");
wangyouqiange2498f12024-01-06 17:55:36 +0800534 mbtk_apn_info_t apns[10] = {0};
535 int apn_num = 10;
536 char qser_apn_type[32] = {0};
537 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
538 if(ret != 0)
539 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800540 LOGE("mbtk_apn_get fail. [ret = %d]",ret);
wangyouqiange2498f12024-01-06 17:55:36 +0800541 return QSER_RESULT_FAIL;
542 }
543 else
544 {
545 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
546 {
547 int i = 0;
548 for(i = 0; i < apn_num; i++)
549 {
550 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
551 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800552 //LOGE("idx no open.");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800553#if defined(MBTK_ALL_CID_SUPPORT)
554 if(apns[i].cid - 1 == 0)
555 {
556 qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]);
557 }
558#endif
wangyouqiange2498f12024-01-06 17:55:36 +0800559 continue;
560 }
b.liuf37bd332024-03-18 13:51:24 +0800561
562#if defined(MBTK_ALL_CID_SUPPORT)
563 if(qser_apn_add_save_state[apns[i].cid - 1] == '2')
564 {
565 qser_apn_default_idx = apns[i].cid - 1;
566 }
567#endif
568
wangyouqiange2498f12024-01-06 17:55:36 +0800569 if(qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]) != 0)
570 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800571 LOGE("qser_apn_info_param_convert fail");
wangyouqiange2498f12024-01-06 17:55:36 +0800572 return QSER_RESULT_FAIL;
573 }
574 else
575 {
576 qser_apn_info_state[apns[i].cid - 1] = TRUE;
577 sprintf(qser_apn_type, "persist.qser.apn.type%d", apns[i].cid - 1);
578 property_get(qser_apn_type, qser_apn_info[apns[i].cid - 1].apn_type, NULL);
579 }
580 }
581 }
582 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800583
584 int idx = 0;
585 for(;idx < QSER_APN_NUM; idx++)
586 {
587 qser_idx_pdp_state[idx] = false;
588 }
wangyouqiang45cfff82024-04-15 19:35:15 +0800589 LOGE("mbtk_info_handle_get() success.");
wangyouqiang84179c82024-01-05 15:42:55 +0800590 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800591}
592
593void qser_data_call_destroy(void)
594{
wangyouqiang84179c82024-01-05 15:42:55 +0800595 if(qser_info_handle)
596 {
597 LOGE("qser_info_handle_num = %d", qser_info_handle_num);
598 if(qser_info_handle_num == 1)
599 { // 最后一个引用,可释放。
600 int ret = mbtk_info_handle_free(&qser_info_handle);
601 if(ret)
602 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800603 LOGE("mbtk_info_handle_free() fail.");
wangyouqiang84179c82024-01-05 15:42:55 +0800604 }
605 else
606 {
607 qser_info_handle_num = 0;
608 qser_info_handle = NULL;
wangyouqiang45cfff82024-04-15 19:35:15 +0800609 qser_net_status_cb = NULL;
wangyouqiang84179c82024-01-05 15:42:55 +0800610 inited = FALSE;
611 }
612 }
613 else
614 {
615 qser_info_handle_num--;
wangyouqiang45cfff82024-04-15 19:35:15 +0800616 qser_net_status_cb = NULL;
wangyouqiang84179c82024-01-05 15:42:55 +0800617 }
618 }
619 else
620 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800621 LOGE("handle not inited.");
wangyouqiang84179c82024-01-05 15:42:55 +0800622 }
b.liu5fa9e772023-11-23 18:00:55 +0800623}
624
625int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
626{
wangyouqiang84179c82024-01-05 15:42:55 +0800627 //UNUSED(data_call);
628 //UNUSED(err);
629 if(data_call == NULL || err == NULL)
630 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800631 LOGE("data_call or err is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800632 if(err != NULL)
633 {
634 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
635 }
636 return QSER_RESULT_FAIL;
637 }
638
639 if(qser_info_handle == NULL)
640 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800641 LOGE("handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800642 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800643 return QSER_RESULT_FAIL;
644 }
b.liu5fa9e772023-11-23 18:00:55 +0800645
wangyouqiang805b0f92024-04-07 17:06:13 +0800646#if defined(MBTK_ALL_CID_SUPPORT)
647 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
648 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800649 LOGE("default pdp exist.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800650 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
651 return QSER_RESULT_FAIL;
652 }
653#endif
654
wangyouqiange2498f12024-01-06 17:55:36 +0800655 if(qser_check_profile_idx(data_call->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800656 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800657#if defined(MBTK_ALL_CID_SUPPORT)
658 if( data_call->profile_idx == 0 )
659 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800660 LOGE("profile_idx = 0.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800661 }
662 else
663#endif
664 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800665 LOGE("profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800666 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
667 return QSER_RESULT_FAIL;
668 }
wangyouqiang84179c82024-01-05 15:42:55 +0800669 }
670
671 int ret = -1;
672 ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
673 if(ret != 0)
674 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800675 LOGE("mbtk_data_call_start fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800676 if(ret == MBTK_INFO_ERR_CID_EXIST)
677 {
678 *err = QSER_DATA_CALL_ERROR_PDP_ACTIVATE;
679 }
680 else
681 {
682 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
683 }
wangyouqiang84179c82024-01-05 15:42:55 +0800684 return QSER_RESULT_FAIL;
685 }
686 else
687 {
688 *err = QSER_DATA_CALL_ERROR_NONE;
689 }
wangyouqiange2498f12024-01-06 17:55:36 +0800690
b.liuf37bd332024-03-18 13:51:24 +0800691#if defined(MBTK_ALL_CID_SUPPORT)
692 if(qser_apn_default_idx == data_call->profile_idx)
693 {
694 qser_route_config(qser_apn_default_idx + 1);
wangyouqiang805b0f92024-04-07 17:06:13 +0800695 qser_default_pdp_idx = data_call->profile_idx;
b.liuf37bd332024-03-18 13:51:24 +0800696 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800697 else if(data_call->profile_idx == 0)
698 {
699 qser_route_config(1);
700 qser_default_pdp_idx = data_call->profile_idx;
701 }
702 else
703 {
704 //
705 }
706
b.liuf37bd332024-03-18 13:51:24 +0800707#endif
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800708 qser_idx_pdp_state[data_call->profile_idx] = true;
b.liuf37bd332024-03-18 13:51:24 +0800709
wangyouqiange2498f12024-01-06 17:55:36 +0800710 return QSER_RESULT_SUCCESS;
711}
712
713int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
714{
715 //UNUSED(data_call);
716 UNUSED(err);
717 if(data_call == NULL || err == NULL)
718 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800719 LOGE("data_call or err is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +0800720 if(err != NULL)
721 {
722 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
723 }
724 return QSER_RESULT_FAIL;
725 }
726
727 if(qser_info_handle == NULL)
728 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800729 LOGE("handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800730 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiange2498f12024-01-06 17:55:36 +0800731 return QSER_RESULT_FAIL;
732 }
733
wangyouqiang805b0f92024-04-07 17:06:13 +0800734#if defined(MBTK_ALL_CID_SUPPORT)
735 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
736 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800737 LOGE("default pdp exist.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800738 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
739 return QSER_RESULT_FAIL;
740 }
741#endif
742
wangyouqiange2498f12024-01-06 17:55:36 +0800743 if(qser_check_profile_idx(data_call->profile_idx) < 0)
744 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800745#if defined(MBTK_ALL_CID_SUPPORT)
746 if((data_call->profile_idx == 0) && (qser_default_pdp_idx < 0))
747 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800748 LOGE("profile_idx = 0 and not open default idx.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800749 }
750 else
751#endif
752 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800753 LOGE("profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800754 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
755 return QSER_RESULT_FAIL;
756 }
757
wangyouqiange2498f12024-01-06 17:55:36 +0800758 }
759
760 pthread_attr_t thread_attr;
761 pthread_t data_call_thread_id;
762 pthread_attr_init(&thread_attr);
763 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
764 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800765 LOGE("pthread_attr_setdetachstate() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800766 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800767 return QSER_RESULT_FAIL;
768 }
769
wangyouqianga24887d2024-04-08 18:31:23 +0800770 //memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
771 if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, (void *) data_call))
wangyouqiange2498f12024-01-06 17:55:36 +0800772 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800773 LOGE("pthread_create() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800774 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800775 return QSER_RESULT_FAIL;
776 }
777 pthread_attr_destroy(&thread_attr);
wangyouqiange2498f12024-01-06 17:55:36 +0800778
wangyouqiang84179c82024-01-05 15:42:55 +0800779 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800780}
781
782int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
783{
wangyouqiang84179c82024-01-05 15:42:55 +0800784 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800785 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800786 //UNUSED(err);
787 if(err == NULL)
788 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800789 LOGE("err is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800790 return QSER_RESULT_FAIL;
791 }
b.liu5fa9e772023-11-23 18:00:55 +0800792
wangyouqiang84179c82024-01-05 15:42:55 +0800793 if(qser_info_handle == NULL)
794 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800795 LOGE("handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800796 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800797 return QSER_RESULT_FAIL;
798 }
799
wangyouqiange2498f12024-01-06 17:55:36 +0800800 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800801 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800802#if defined(MBTK_ALL_CID_SUPPORT)
803 if(profile_idx == 0)
804 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800805 LOGE("profile_idx = 0.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800806 }
807 else
808#endif
809 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800810 LOGE("profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800811 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
812 return QSER_RESULT_FAIL;
813 }
wangyouqiang84179c82024-01-05 15:42:55 +0800814 }
815
816 int ret = -1;
817 ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
818 if(ret != 0)
819 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800820 LOGE("mbtk_data_call_stop fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800821 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
822 {
823 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
824 }
825 else
826 {
827 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
828 }
wangyouqiang84179c82024-01-05 15:42:55 +0800829 return QSER_RESULT_FAIL;
830 }
831 else
832 {
833 *err = QSER_DATA_CALL_ERROR_NONE;
834 }
wangyouqiange2498f12024-01-06 17:55:36 +0800835
wangyouqiang805b0f92024-04-07 17:06:13 +0800836#if defined(MBTK_ALL_CID_SUPPORT)
837 if(qser_default_pdp_idx == profile_idx)
838 {
839 qser_default_pdp_idx = -1;
840 }
841#endif
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800842 qser_idx_pdp_state[profile_idx] = false;
wangyouqiang805b0f92024-04-07 17:06:13 +0800843
wangyouqiang84179c82024-01-05 15:42:55 +0800844 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800845}
846
847int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
848 qser_data_call_info_s *info, qser_data_call_error_e *err)
849{
wangyouqiang84179c82024-01-05 15:42:55 +0800850 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800851 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800852 //UNUSED(info);
853 //UNUSED(err);
b.liu5fa9e772023-11-23 18:00:55 +0800854
wangyouqiang84179c82024-01-05 15:42:55 +0800855 if(info == NULL || err == NULL)
856 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800857 LOGE("info or err is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800858 if(err != NULL)
859 {
860 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
861 }
862 return QSER_RESULT_FAIL;
863 }
864
865 if(qser_info_handle == NULL)
866 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800867 LOGE("handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800868 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800869 return QSER_RESULT_FAIL;
870 }
871
wangyouqiange2498f12024-01-06 17:55:36 +0800872 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800873 {
wangyouqiang805b0f92024-04-07 17:06:13 +0800874#if defined(MBTK_ALL_CID_SUPPORT)
875 if(profile_idx == 0)
876 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800877 LOGE("profile_idx = 0.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800878 }
879 else
880#endif
881 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800882 LOGE("profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800883 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
884 return QSER_RESULT_FAIL;
885 }
wangyouqiang84179c82024-01-05 15:42:55 +0800886 }
887
888 int ret = -1;
889 mbtk_ipv4_info_t ipv4;
890 mbtk_ipv6_info_t ipv6;
891#ifdef QSER_TEST
892 char v4_buff[32] = {0};
893 char v6_buff[128] = {0};
894#endif
895 memset(info, 0, sizeof(qser_data_call_info_s));
896 ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
897 if(ret != 0)
898 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800899 LOGE("mbtk_data_call_state_get fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800900 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
901 {
902 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
903 }
904 else
905 {
906 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
907 }
wangyouqiang84179c82024-01-05 15:42:55 +0800908 return QSER_RESULT_FAIL;
909 }
910 else
911 {
912 info->profile_idx = profile_idx;
913 if(ipv4.valid)
914 {
915 info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
916 info->v4.state = QSER_DATA_CALL_CONNECTED;
917 sprintf(info->v4.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800918 info->v4.addr.ip.s_addr = ipv4.IPAddr;
919 info->v4.addr.pri_dns.s_addr = ipv4.PrimaryDNS;
920 info->v4.addr.sec_dns.s_addr = ipv4.SecondaryDNS;
921
wangyouqiang84179c82024-01-05 15:42:55 +0800922#ifdef QSER_TEST
wangyouqiang45cfff82024-04-15 19:35:15 +0800923 //LOGE("IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
wangyouqiang84179c82024-01-05 15:42:55 +0800924 if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
wangyouqiang45cfff82024-04-15 19:35:15 +0800925 LOGE("IP error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800926 } else {
wangyouqiang45cfff82024-04-15 19:35:15 +0800927 LOGE("IP : %s", v4_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800928 }
929 if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
wangyouqiang45cfff82024-04-15 19:35:15 +0800930 LOGE("PrimaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800931 } else {
wangyouqiang45cfff82024-04-15 19:35:15 +0800932 LOGE("PrimaryDNS : %s", v4_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800933 }
934 if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
wangyouqiang45cfff82024-04-15 19:35:15 +0800935 LOGE("SecondaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800936 } else {
wangyouqiang45cfff82024-04-15 19:35:15 +0800937 LOGE("SecondaryDNS : %s", v4_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800938 }
939#endif
940 }
941
942 if(ipv6.valid)
943 {
944 info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
945 info->v6.state = QSER_DATA_CALL_CONNECTED;
946 sprintf(info->v6.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800947 memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), sizeof(ipv6.IPV6Addr));
948 memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), sizeof(ipv6.PrimaryDNS));
949 memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), sizeof(ipv6.SecondaryDNS));
wangyouqiang84179c82024-01-05 15:42:55 +0800950#ifdef QSER_TEST
951 if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
952 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800953 LOGE("IP error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800954 } else {
wangyouqiang45cfff82024-04-15 19:35:15 +0800955 LOGE("IP : %s", v6_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800956 }
957 if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
958 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800959 LOGE("PrimaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800960 } else {
wangyouqiang45cfff82024-04-15 19:35:15 +0800961 LOGE("PrimaryDNS : %s", v6_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800962 }
963 if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
964 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800965 LOGE("SecondaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800966 } else {
wangyouqiang45cfff82024-04-15 19:35:15 +0800967 LOGE("SecondaryDNS : %s", v6_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800968 }
969#endif
970 }
971
972 if(ipv4.valid && ipv6.valid)
973 {
974 info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
975 }
976
977 if(!ipv4.valid && !ipv6.valid)
978 {
979 info->v4.state = QSER_DATA_CALL_DISCONNECTED;
980 info->v6.state = QSER_DATA_CALL_DISCONNECTED;
981 }
982 }
983
984 *err = QSER_DATA_CALL_ERROR_NONE;
985 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800986}
987
988int qser_apn_set(qser_apn_info_s *apn)
989{
wangyouqiang84179c82024-01-05 15:42:55 +0800990 //UNUSED(apn);
991 if(qser_info_handle == NULL)
992 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800993 LOGE("handle is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800994 return QSER_RESULT_FAIL;
995 }
996
997 if(apn == NULL)
998 {
wangyouqiang45cfff82024-04-15 19:35:15 +0800999 LOGE("apn param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001000 return QSER_RESULT_FAIL;
1001 }
b.liu5fa9e772023-11-23 18:00:55 +08001002
wangyouqiange2498f12024-01-06 17:55:36 +08001003 if(qser_check_profile_idx(apn->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001004 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001005 LOGE("profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +08001006 return QSER_RESULT_FAIL;
1007 }
1008
1009 if(strlen(apn->apn_name) == 0)
1010 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001011 LOGE("apn_name is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001012 return QSER_RESULT_FAIL;
1013 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001014
1015#if 0
1016 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1017 {
1018 if(qser_apn_default_idx > -1)
1019 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001020 LOGE("iot_default is exist.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001021 return QSER_RESULT_FAIL;
1022 }
1023 }
1024#endif
1025
r.xiaof6ec4822024-04-03 02:46:00 -07001026 /*add name and type verify*/
1027 if (qser_check_apn_name_type(apn) < 0)
1028 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001029 LOGE("check param error.");
r.xiaof6ec4822024-04-03 02:46:00 -07001030 return QSER_RESULT_FAIL;
1031 }
wangyouqiang84179c82024-01-05 15:42:55 +08001032
1033 int ret = -1;
1034 char mbtk_auth[32]={0};
wangyouqiange2498f12024-01-06 17:55:36 +08001035 char qser_apn_type[32] = {0};
wangyouqiang84179c82024-01-05 15:42:55 +08001036 mbtk_ip_type_enum pdp_type = MBTK_IP_TYPE_IPV4V6;
r.xiaof6ec4822024-04-03 02:46:00 -07001037
wangyouqiang84179c82024-01-05 15:42:55 +08001038 if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
1039 {
1040 pdp_type = MBTK_IP_TYPE_IP;
1041 }
1042 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
1043 {
1044 pdp_type = MBTK_IP_TYPE_IPV6;
1045 }
1046 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
1047 {
1048 pdp_type = MBTK_IP_TYPE_IPV4V6;
1049 }
1050 else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
1051 {
1052 pdp_type = MBTK_IP_TYPE_PPP;
1053 }
1054 else
1055 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001056 LOGE("pdp_type error.");
wangyouqiang84179c82024-01-05 15:42:55 +08001057 return QSER_RESULT_FAIL;
1058 }
1059
1060 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE || apn->auth_proto == QSER_APN_AUTH_PROTO_DEFAULT)
1061 {
1062 memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
1063 }
1064 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP)
1065 {
1066 memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
1067 }
1068 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_CHAP)
1069 {
1070 memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
1071 }
1072 #if 0
1073 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
1074 {
1075 //NOT SUPPORT
1076 }
1077 #endif
1078 else
1079 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001080 LOGE("auth input error!");
wangyouqiang84179c82024-01-05 15:42:55 +08001081 return QSER_RESULT_FAIL;
1082 }
1083
1084 if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
1085 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001086 LOGE("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);
wangyouqiang84179c82024-01-05 15:42:55 +08001087 }
1088 else
1089 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001090 LOGE("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);
wangyouqiang84179c82024-01-05 15:42:55 +08001091 }
wangyouqiange2498f12024-01-06 17:55:36 +08001092
wangyouqiang84179c82024-01-05 15:42:55 +08001093 ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
1094 if(ret < 0)
1095 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001096 LOGE("mbtk_apn_set fail!");
wangyouqiang84179c82024-01-05 15:42:55 +08001097 return QSER_RESULT_FAIL;
1098 }
1099
wangyouqiange2498f12024-01-06 17:55:36 +08001100 sprintf(qser_apn_type, "persist.qser.apn.type%d", apn->profile_idx);
1101 property_set(qser_apn_type, apn->apn_type);
wangyouqianga24887d2024-04-08 18:31:23 +08001102 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE)
1103 {
1104 qser_apn_auth_state[apn->profile_idx] = '1';
1105 }
1106 else
1107 {
1108 qser_apn_auth_state[apn->profile_idx] = '0';
1109 }
1110 property_set("persist.qser.apn.auth", qser_apn_auth_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001111 memcpy(&qser_apn_info[apn->profile_idx], apn, sizeof(qser_apn_info_s));
wangyouqiang805b0f92024-04-07 17:06:13 +08001112
1113#if defined(MBTK_ALL_CID_SUPPORT)
wangyouqianga24887d2024-04-08 18:31:23 +08001114 if(strcmp(apn->apn_type, "iot_default") == 0)
wangyouqiang805b0f92024-04-07 17:06:13 +08001115 {
1116 qser_apn_add_save_state[apn->profile_idx] = '2';
1117 qser_apn_default_idx = apn->profile_idx;
1118 }
1119 else
1120#endif
1121 {
1122 qser_apn_add_save_state[apn->profile_idx] = '1';
1123 }
1124
wangyouqianga24887d2024-04-08 18:31:23 +08001125 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001126 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001127}
1128
1129int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
1130{
wangyouqiang84179c82024-01-05 15:42:55 +08001131 //UNUSED(profile_idx);
1132 //UNUSED(apn);
1133 if(qser_info_handle == NULL)
1134 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001135 LOGE("handle is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001136 return QSER_RESULT_FAIL;
1137 }
1138
1139 if(apn == NULL)
1140 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001141 LOGE("apn param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001142 return QSER_RESULT_FAIL;
1143 }
b.liu5fa9e772023-11-23 18:00:55 +08001144
wangyouqiange2498f12024-01-06 17:55:36 +08001145 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001146 {
wangyouqiang805b0f92024-04-07 17:06:13 +08001147#if defined(MBTK_ALL_CID_SUPPORT)
1148 if(profile_idx != 0)
1149#endif
1150 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001151 LOGE("profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001152 return QSER_RESULT_FAIL;
1153 }
wangyouqiang84179c82024-01-05 15:42:55 +08001154 }
1155
1156 //get apn info
1157 mbtk_apn_info_t apns[10] = {0};
1158 int apn_num = 10;
1159 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1160 if(ret != 0)
1161 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001162 LOGE("mbtk_apn_get fail. [ret = %d]",ret);
wangyouqiang84179c82024-01-05 15:42:55 +08001163 return QSER_RESULT_FAIL;
1164 }
1165 else
1166 {
1167 int i = 0;
1168 for(i = 0; i < apn_num; i++)
1169 {
1170 if(apns[i].cid == profile_idx + 1)
1171 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001172 LOGE("find IDX.");
wangyouqiang84179c82024-01-05 15:42:55 +08001173 break;
1174 }
1175 }
1176
1177 if(i == apn_num)
1178 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001179 LOGE("not find IDX.[apn_num = %d]", apn_num);
wangyouqiang84179c82024-01-05 15:42:55 +08001180 return QSER_RESULT_FAIL;
1181 }
1182
1183 if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
1184 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001185 LOGE("qser_apn_info_param_convert fail");
wangyouqiang84179c82024-01-05 15:42:55 +08001186 return QSER_RESULT_FAIL;
1187 }
1188 }
1189 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001190}
1191
1192int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
1193{
wangyouqiange2498f12024-01-06 17:55:36 +08001194 //UNUSED(apn);
1195 //UNUSED(profile_idx);
1196 if(qser_info_handle == NULL)
1197 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001198 LOGE("handle is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +08001199 return QSER_RESULT_FAIL;
1200 }
1201
1202 if(apn == NULL)
1203 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001204 LOGE("apn param is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +08001205 return QSER_RESULT_FAIL;
1206 }
b.liu5fa9e772023-11-23 18:00:55 +08001207
wangyouqiang805b0f92024-04-07 17:06:13 +08001208#if 0
b.liuf37bd332024-03-18 13:51:24 +08001209 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1210 {
1211 if(qser_apn_default_idx > -1)
1212 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001213 LOGE("iot_default is exist.");
b.liuf37bd332024-03-18 13:51:24 +08001214 return QSER_RESULT_FAIL;
1215 }
1216 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001217 /*add name and type verify*/
1218 if (qser_check_apn_name_type(apn) < 0)
1219 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001220 LOGE("check param error.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001221 return QSER_RESULT_FAIL;
1222 }
1223#endif
b.liuf37bd332024-03-18 13:51:24 +08001224
wangyouqiange2498f12024-01-06 17:55:36 +08001225 int ret = 0;
1226 char idx = qser_get_apn_profile_idx();
wangyouqiang805b0f92024-04-07 17:06:13 +08001227 if(idx > QSER_PROFILE_IDX_MAX)
wangyouqiange2498f12024-01-06 17:55:36 +08001228 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001229 LOGE("idx is full.");
wangyouqiange2498f12024-01-06 17:55:36 +08001230 return QSER_RESULT_FAIL;
1231 }
1232 else
1233 {
1234 qser_apn_info_state[idx] = TRUE;
1235 qser_apn_info_s set_apn;
1236 set_apn.profile_idx = idx;
1237 set_apn.pdp_type = apn->pdp_type;
1238 set_apn.auth_proto = apn->auth_proto;
1239 memcpy(set_apn.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
1240 memcpy(set_apn.username, apn->username, QSER_APN_USERNAME_SIZE);
1241 memcpy(set_apn.password, apn->password, QSER_APN_PASSWORD_SIZE);
1242 memcpy(set_apn.apn_type, apn->apn_type, QSER_APN_NAME_SIZE);
1243 ret = qser_apn_set(&set_apn);
1244 if(ret != 0)
1245 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001246 LOGE("qser_apn_set fail.");
wangyouqiange2498f12024-01-06 17:55:36 +08001247 qser_apn_info_state[idx] = FALSE;
1248 return QSER_RESULT_FAIL;
1249 }
1250 *profile_idx = idx;
wangyouqiange2498f12024-01-06 17:55:36 +08001251 }
1252 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001253}
1254
1255int qser_apn_del(unsigned char profile_idx)
1256{
wangyouqiange2498f12024-01-06 17:55:36 +08001257 //UNUSED(profile_idx);
1258 if(qser_info_handle == NULL)
1259 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001260 LOGE("handle is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +08001261 return QSER_RESULT_FAIL;
1262 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001263
1264 if(qser_idx_pdp_state[profile_idx] == true)
1265 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001266 LOGE("profile_idx[%d] open pdp.", profile_idx);
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001267 return QSER_RESULT_FAIL;
1268 }
b.liu5fa9e772023-11-23 18:00:55 +08001269
wangyouqiange2498f12024-01-06 17:55:36 +08001270 if(qser_check_profile_idx(profile_idx) < 0)
1271 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001272 LOGE("profile_idx is invalid.");
wangyouqiange2498f12024-01-06 17:55:36 +08001273 return QSER_RESULT_FAIL;
1274 }
1275
1276 qser_apn_info_state[profile_idx] = FALSE;
1277 qser_apn_add_save_state[profile_idx] = '0';
b.liuf37bd332024-03-18 13:51:24 +08001278
1279#if defined(MBTK_ALL_CID_SUPPORT)
1280 if(profile_idx == qser_apn_default_idx)
1281 {
1282 qser_apn_default_idx = -1;
1283 }
1284#endif
1285
wangyouqiange2498f12024-01-06 17:55:36 +08001286 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
1287 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001288}
1289
1290int qser_apn_get_list(qser_apn_info_list_s *apn_list)
1291{
wangyouqiang84179c82024-01-05 15:42:55 +08001292 //UNUSED(apn_list);
b.liu5fa9e772023-11-23 18:00:55 +08001293
wangyouqiang84179c82024-01-05 15:42:55 +08001294 if(qser_info_handle == NULL)
1295 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001296 LOGE("handle is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001297 return QSER_RESULT_FAIL;
1298 }
1299
1300 if(apn_list == NULL)
1301 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001302 LOGE("apn_list param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001303 return QSER_RESULT_FAIL;
1304 }
1305
wangyouqiange2498f12024-01-06 17:55:36 +08001306 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
wangyouqiang45cfff82024-04-15 19:35:15 +08001307 LOGE("qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001308 mbtk_apn_info_t apns[10] = {0};
1309 int apn_num = 10;
1310 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1311 if(ret != 0)
1312 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001313 LOGE("mbtk_apn_get fail. [ret = %d]",ret);
wangyouqiang84179c82024-01-05 15:42:55 +08001314 return QSER_RESULT_FAIL;
1315 }
1316 else
1317 {
1318 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
1319 {
1320 int i = 0;
wangyouqiange2498f12024-01-06 17:55:36 +08001321 apn_list->cnt = 0;
wangyouqiang84179c82024-01-05 15:42:55 +08001322 for(i = 0; i < apn_num; i++)
1323 {
wangyouqiange2498f12024-01-06 17:55:36 +08001324 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
1325 {
wangyouqiang805b0f92024-04-07 17:06:13 +08001326#if defined(MBTK_ALL_CID_SUPPORT)
1327 if((apns[i].cid - 1) != 0)
1328#endif
1329 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001330 LOGE("idx no open.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001331 continue;
1332 }
wangyouqiange2498f12024-01-06 17:55:36 +08001333 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001334 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 +08001335 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001336 LOGE("qser_apn_info_param_convert fail");
wangyouqiang84179c82024-01-05 15:42:55 +08001337 return QSER_RESULT_FAIL;
1338 }
wangyouqiange2498f12024-01-06 17:55:36 +08001339 apn_list->cnt++;
wangyouqiang84179c82024-01-05 15:42:55 +08001340 }
wangyouqiang84179c82024-01-05 15:42:55 +08001341 }
1342 else if(apn_num > QSER_APN_MAX_LIST)
1343 {
wangyouqiang45cfff82024-04-15 19:35:15 +08001344 LOGE("apn_num overlong");
wangyouqiang84179c82024-01-05 15:42:55 +08001345 return QSER_RESULT_FAIL;
1346 }
1347 else
1348 {
1349 apn_list->cnt = 0;
1350 }
1351 }
1352 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001353}
wangyouqiang84179c82024-01-05 15:42:55 +08001354/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +08001355