blob: 6213176044e18de95889311ac32f9d469dcaf87e [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)
wangyouqiang3dcb3832024-04-24 15:22:50 +080024#if defined(MBTK_SG_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) {
wangyouqiangc42b85d2024-04-24 17:05:06 +080079 LOGE("[qser_data] PrimaryDNS error.");
b.liuf37bd332024-03-18 13:51:24 +080080 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +080081 LOGE("[qser_data] PrimaryDNS : %s", dns);
b.liuf37bd332024-03-18 13:51:24 +080082 }
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) {
wangyouqiangc42b85d2024-04-24 17:05:06 +080086 LOGE("[qser_data] SecondaryDNS error.");
b.liuf37bd332024-03-18 13:51:24 +080087 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +080088 LOGE("[qser_data] SecondaryDNS : %s", dns);
b.liuf37bd332024-03-18 13:51:24 +080089 }
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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +080097 LOGE("[qser_data] PrimaryDNS error.");
b.liuf37bd332024-03-18 13:51:24 +080098 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +080099 LOGE("[qser_data] PrimaryDNS : %s", dns);
b.liuf37bd332024-03-18 13:51:24 +0800100 }
101 offset += sprintf(buf + offset, "nameserver %s\n", dns);
102 memset(dns, 0x0, 128);
103 if(ipv6_2_str(&(ipv6.SecondaryDNS), dns))
104 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800105 LOGE("[qser_data] SecondaryDNS error.");
b.liuf37bd332024-03-18 13:51:24 +0800106 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800107 LOGE("[qser_data] SecondaryDNS : %s", dns);
b.liuf37bd332024-03-18 13:51:24 +0800108 }
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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800117 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800124 LOGE("[qser_data] mbtk_route_config : write fail.");
b.liuf37bd332024-03-18 13:51:24 +0800125 }
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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800153 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800159 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800170 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800195 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800213 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800231 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800270 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800291 LOGE("[qser_data] 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);
wangyouqiangc42b85d2024-04-24 17:05:06 +0800297 //LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800301 LOGE("[qser_data] 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;
wangyouqiangc42b85d2024-04-24 17:05:06 +0800307 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800322 //LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800334 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800351 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800358 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800364 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800426 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800432 LOGE("[qser_data] cid[%d] is open.", *net_data - 201);
wangyouqianga24887d2024-04-08 18:31:23 +0800433 }
434 else if(*net_data == 1)
435 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800436 LOGE("[qser_data] pdp is open.");
wangyouqianga24887d2024-04-08 18:31:23 +0800437 }
438 else
439 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800440 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800455 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800466 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800478 LOGE("[qser_data] 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);
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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800515 LOGE("[qser_data] mbtk_info_handle_get() fail.");
wangyouqiang84179c82024-01-05 15:42:55 +0800516 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");
wangyouqiangc42b85d2024-04-24 17:05:06 +0800531 LOGE("[qser_data] 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800539 LOGE("[qser_data] mbtk_apn_get fail. [ret = %d]",ret);
wangyouqiange2498f12024-01-06 17:55:36 +0800540 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800551 //LOGE("[qser_data] idx no open.");
wangyouqiang3dcb3832024-04-24 15:22:50 +0800552#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800553 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800570 LOGE("[qser_data] qser_apn_info_param_convert fail");
wangyouqiange2498f12024-01-06 17:55:36 +0800571 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 }
wangyouqiangc42b85d2024-04-24 17:05:06 +0800588 LOGE("[qser_data] mbtk_info_handle_get() success.");
wangyouqiang84179c82024-01-05 15:42:55 +0800589 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800596 LOGE("[qser_data] qser_info_handle_num = %d", qser_info_handle_num);
wangyouqiang84179c82024-01-05 15:42:55 +0800597 if(qser_info_handle_num == 1)
598 { // 最后一个引用,可释放。
599 int ret = mbtk_info_handle_free(&qser_info_handle);
600 if(ret)
601 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800602 LOGE("[qser_data] mbtk_info_handle_free() fail.");
wangyouqiang84179c82024-01-05 15:42:55 +0800603 }
604 else
605 {
606 qser_info_handle_num = 0;
607 qser_info_handle = NULL;
wangyouqiang45cfff82024-04-15 19:35:15 +0800608 qser_net_status_cb = NULL;
wangyouqiang84179c82024-01-05 15:42:55 +0800609 inited = FALSE;
610 }
611 }
612 else
613 {
614 qser_info_handle_num--;
wangyouqiang45cfff82024-04-15 19:35:15 +0800615 qser_net_status_cb = NULL;
wangyouqiang84179c82024-01-05 15:42:55 +0800616 }
617 }
618 else
619 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800620 LOGE("[qser_data] handle not inited.");
wangyouqiang84179c82024-01-05 15:42:55 +0800621 }
b.liu5fa9e772023-11-23 18:00:55 +0800622}
623
624int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
625{
wangyouqiang84179c82024-01-05 15:42:55 +0800626 //UNUSED(data_call);
627 //UNUSED(err);
628 if(data_call == NULL || err == NULL)
629 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800630 LOGE("[qser_data] data_call or err is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800631 if(err != NULL)
632 {
633 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
634 }
635 return QSER_RESULT_FAIL;
636 }
637
638 if(qser_info_handle == NULL)
639 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800640 LOGE("[qser_data] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800641 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800642 return QSER_RESULT_FAIL;
643 }
b.liu5fa9e772023-11-23 18:00:55 +0800644
wangyouqiang805b0f92024-04-07 17:06:13 +0800645#if defined(MBTK_ALL_CID_SUPPORT)
646 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
647 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800648 LOGE("[qser_data] default pdp exist.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800649 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
650 return QSER_RESULT_FAIL;
651 }
652#endif
653
wangyouqiange2498f12024-01-06 17:55:36 +0800654 if(qser_check_profile_idx(data_call->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800655 {
wangyouqiang3dcb3832024-04-24 15:22:50 +0800656#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +0800657 if( data_call->profile_idx == 0 )
658 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800659 LOGE("[qser_data] profile_idx = 0.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800660 }
661 else
662#endif
663 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800664 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800665 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
666 return QSER_RESULT_FAIL;
667 }
wangyouqiang84179c82024-01-05 15:42:55 +0800668 }
669
670 int ret = -1;
671 ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
672 if(ret != 0)
673 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800674 LOGE("[qser_data] mbtk_data_call_start fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800675 if(ret == MBTK_INFO_ERR_CID_EXIST)
676 {
677 *err = QSER_DATA_CALL_ERROR_PDP_ACTIVATE;
678 }
679 else
680 {
681 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
682 }
wangyouqiang84179c82024-01-05 15:42:55 +0800683 return QSER_RESULT_FAIL;
684 }
685 else
686 {
687 *err = QSER_DATA_CALL_ERROR_NONE;
688 }
wangyouqiange2498f12024-01-06 17:55:36 +0800689
b.liuf37bd332024-03-18 13:51:24 +0800690#if defined(MBTK_ALL_CID_SUPPORT)
691 if(qser_apn_default_idx == data_call->profile_idx)
692 {
693 qser_route_config(qser_apn_default_idx + 1);
wangyouqiang805b0f92024-04-07 17:06:13 +0800694 qser_default_pdp_idx = data_call->profile_idx;
b.liuf37bd332024-03-18 13:51:24 +0800695 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800696 else if(data_call->profile_idx == 0)
697 {
698 qser_route_config(1);
699 qser_default_pdp_idx = data_call->profile_idx;
700 }
701 else
702 {
703 //
704 }
705
b.liuf37bd332024-03-18 13:51:24 +0800706#endif
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800707 qser_idx_pdp_state[data_call->profile_idx] = true;
b.liuf37bd332024-03-18 13:51:24 +0800708
wangyouqiange2498f12024-01-06 17:55:36 +0800709 return QSER_RESULT_SUCCESS;
710}
711
712int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
713{
714 //UNUSED(data_call);
715 UNUSED(err);
716 if(data_call == NULL || err == NULL)
717 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800718 LOGE("[qser_data] data_call or err is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +0800719 if(err != NULL)
720 {
721 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
722 }
723 return QSER_RESULT_FAIL;
724 }
725
726 if(qser_info_handle == NULL)
727 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800728 LOGE("[qser_data] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800729 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiange2498f12024-01-06 17:55:36 +0800730 return QSER_RESULT_FAIL;
731 }
732
wangyouqiang805b0f92024-04-07 17:06:13 +0800733#if defined(MBTK_ALL_CID_SUPPORT)
734 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
735 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800736 LOGE("[qser_data] default pdp exist.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800737 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
738 return QSER_RESULT_FAIL;
739 }
740#endif
741
wangyouqiange2498f12024-01-06 17:55:36 +0800742 if(qser_check_profile_idx(data_call->profile_idx) < 0)
743 {
wangyouqiang3dcb3832024-04-24 15:22:50 +0800744#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +0800745 if((data_call->profile_idx == 0) && (qser_default_pdp_idx < 0))
746 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800747 LOGE("[qser_data] profile_idx = 0 and not open default idx.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800748 }
749 else
750#endif
751 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800752 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800753 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
754 return QSER_RESULT_FAIL;
755 }
756
wangyouqiange2498f12024-01-06 17:55:36 +0800757 }
758
759 pthread_attr_t thread_attr;
760 pthread_t data_call_thread_id;
761 pthread_attr_init(&thread_attr);
762 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
763 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800764 LOGE("[qser_data] pthread_attr_setdetachstate() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800765 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800766 return QSER_RESULT_FAIL;
767 }
768
wangyouqianga24887d2024-04-08 18:31:23 +0800769 //memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
770 if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, (void *) data_call))
wangyouqiange2498f12024-01-06 17:55:36 +0800771 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800772 LOGE("[qser_data] pthread_create() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800773 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800774 return QSER_RESULT_FAIL;
775 }
776 pthread_attr_destroy(&thread_attr);
wangyouqiange2498f12024-01-06 17:55:36 +0800777
wangyouqiang84179c82024-01-05 15:42:55 +0800778 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800779}
780
781int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
782{
wangyouqiang84179c82024-01-05 15:42:55 +0800783 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800784 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800785 //UNUSED(err);
786 if(err == NULL)
787 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800788 LOGE("[qser_data] err is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800789 return QSER_RESULT_FAIL;
790 }
b.liu5fa9e772023-11-23 18:00:55 +0800791
wangyouqiang84179c82024-01-05 15:42:55 +0800792 if(qser_info_handle == NULL)
793 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800794 LOGE("[qser_data] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800795 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800796 return QSER_RESULT_FAIL;
797 }
798
wangyouqiange2498f12024-01-06 17:55:36 +0800799 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800800 {
wangyouqiang3dcb3832024-04-24 15:22:50 +0800801#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +0800802 if(profile_idx == 0)
803 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800804 LOGE("[qser_data] profile_idx = 0.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800805 }
806 else
807#endif
808 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800809 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800810 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
811 return QSER_RESULT_FAIL;
812 }
wangyouqiang84179c82024-01-05 15:42:55 +0800813 }
814
815 int ret = -1;
816 ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
817 if(ret != 0)
818 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800819 LOGE("[qser_data] mbtk_data_call_stop fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800820 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
821 {
822 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
823 }
824 else
825 {
826 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
827 }
wangyouqiang84179c82024-01-05 15:42:55 +0800828 return QSER_RESULT_FAIL;
829 }
830 else
831 {
832 *err = QSER_DATA_CALL_ERROR_NONE;
833 }
wangyouqiange2498f12024-01-06 17:55:36 +0800834
wangyouqiang805b0f92024-04-07 17:06:13 +0800835#if defined(MBTK_ALL_CID_SUPPORT)
836 if(qser_default_pdp_idx == profile_idx)
837 {
838 qser_default_pdp_idx = -1;
839 }
840#endif
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800841 qser_idx_pdp_state[profile_idx] = false;
wangyouqiang805b0f92024-04-07 17:06:13 +0800842
wangyouqiang84179c82024-01-05 15:42:55 +0800843 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800844}
845
846int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
847 qser_data_call_info_s *info, qser_data_call_error_e *err)
848{
wangyouqiang84179c82024-01-05 15:42:55 +0800849 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800850 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800851 //UNUSED(info);
852 //UNUSED(err);
b.liu5fa9e772023-11-23 18:00:55 +0800853
wangyouqiang84179c82024-01-05 15:42:55 +0800854 if(info == NULL || err == NULL)
855 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800856 LOGE("[qser_data] info or err is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800857 if(err != NULL)
858 {
859 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
860 }
861 return QSER_RESULT_FAIL;
862 }
863
864 if(qser_info_handle == NULL)
865 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800866 LOGE("[qser_data] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800867 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800868 return QSER_RESULT_FAIL;
869 }
870
wangyouqiange2498f12024-01-06 17:55:36 +0800871 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800872 {
wangyouqiang3dcb3832024-04-24 15:22:50 +0800873#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +0800874 if(profile_idx == 0)
875 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800876 LOGE("[qser_data] profile_idx = 0.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800877 }
878 else
879#endif
880 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800881 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800882 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
883 return QSER_RESULT_FAIL;
884 }
wangyouqiang84179c82024-01-05 15:42:55 +0800885 }
886
887 int ret = -1;
888 mbtk_ipv4_info_t ipv4;
889 mbtk_ipv6_info_t ipv6;
890#ifdef QSER_TEST
891 char v4_buff[32] = {0};
892 char v6_buff[128] = {0};
893#endif
894 memset(info, 0, sizeof(qser_data_call_info_s));
895 ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
896 if(ret != 0)
897 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800898 LOGE("[qser_data] mbtk_data_call_state_get fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800899 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
900 {
901 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
902 }
903 else
904 {
905 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
906 }
wangyouqiang84179c82024-01-05 15:42:55 +0800907 return QSER_RESULT_FAIL;
908 }
909 else
910 {
911 info->profile_idx = profile_idx;
912 if(ipv4.valid)
913 {
914 info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
915 info->v4.state = QSER_DATA_CALL_CONNECTED;
916 sprintf(info->v4.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800917 info->v4.addr.ip.s_addr = ipv4.IPAddr;
918 info->v4.addr.pri_dns.s_addr = ipv4.PrimaryDNS;
919 info->v4.addr.sec_dns.s_addr = ipv4.SecondaryDNS;
920
wangyouqiang84179c82024-01-05 15:42:55 +0800921#ifdef QSER_TEST
wangyouqiangc42b85d2024-04-24 17:05:06 +0800922 //LOGE("[qser_data] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
wangyouqiang84179c82024-01-05 15:42:55 +0800923 if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800924 LOGE("[qser_data] IP error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800925 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800926 LOGE("[qser_data] IP : %s", v4_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800927 }
928 if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800929 LOGE("[qser_data] PrimaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800930 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800931 LOGE("[qser_data] PrimaryDNS : %s", v4_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800932 }
933 if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800934 LOGE("[qser_data] SecondaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800935 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800936 LOGE("[qser_data] SecondaryDNS : %s", v4_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800937 }
938#endif
939 }
940
941 if(ipv6.valid)
942 {
943 info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
944 info->v6.state = QSER_DATA_CALL_CONNECTED;
945 sprintf(info->v6.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800946 memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), sizeof(ipv6.IPV6Addr));
947 memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), sizeof(ipv6.PrimaryDNS));
948 memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), sizeof(ipv6.SecondaryDNS));
wangyouqiang84179c82024-01-05 15:42:55 +0800949#ifdef QSER_TEST
950 if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
951 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800952 LOGE("[qser_data] IP error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800953 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800954 LOGE("[qser_data] IP : %s", v6_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800955 }
956 if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
957 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800958 LOGE("[qser_data] PrimaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800959 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800960 LOGE("[qser_data] PrimaryDNS : %s", v6_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800961 }
962 if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
963 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800964 LOGE("[qser_data] SecondaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800965 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800966 LOGE("[qser_data] SecondaryDNS : %s", v6_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800967 }
968#endif
969 }
970
971 if(ipv4.valid && ipv6.valid)
972 {
973 info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
974 }
975
976 if(!ipv4.valid && !ipv6.valid)
977 {
978 info->v4.state = QSER_DATA_CALL_DISCONNECTED;
979 info->v6.state = QSER_DATA_CALL_DISCONNECTED;
980 }
981 }
982
983 *err = QSER_DATA_CALL_ERROR_NONE;
984 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800985}
986
987int qser_apn_set(qser_apn_info_s *apn)
988{
wangyouqiang84179c82024-01-05 15:42:55 +0800989 //UNUSED(apn);
990 if(qser_info_handle == NULL)
991 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800992 LOGE("[qser_data] handle is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800993 return QSER_RESULT_FAIL;
994 }
995
996 if(apn == NULL)
997 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800998 LOGE("[qser_data] apn param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800999 return QSER_RESULT_FAIL;
1000 }
b.liu5fa9e772023-11-23 18:00:55 +08001001
wangyouqiange2498f12024-01-06 17:55:36 +08001002 if(qser_check_profile_idx(apn->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001003 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001004 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +08001005 return QSER_RESULT_FAIL;
1006 }
1007
1008 if(strlen(apn->apn_name) == 0)
1009 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001010 LOGE("[qser_data] apn_name is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001011 return QSER_RESULT_FAIL;
1012 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001013
1014#if 0
1015 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1016 {
1017 if(qser_apn_default_idx > -1)
1018 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001019 LOGE("[qser_data] iot_default is exist.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001020 return QSER_RESULT_FAIL;
1021 }
1022 }
1023#endif
1024
r.xiaof6ec4822024-04-03 02:46:00 -07001025 /*add name and type verify*/
1026 if (qser_check_apn_name_type(apn) < 0)
1027 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001028 LOGE("[qser_data] check param error.");
r.xiaof6ec4822024-04-03 02:46:00 -07001029 return QSER_RESULT_FAIL;
1030 }
wangyouqiang84179c82024-01-05 15:42:55 +08001031
1032 int ret = -1;
1033 char mbtk_auth[32]={0};
wangyouqiange2498f12024-01-06 17:55:36 +08001034 char qser_apn_type[32] = {0};
wangyouqiang84179c82024-01-05 15:42:55 +08001035 mbtk_ip_type_enum pdp_type = MBTK_IP_TYPE_IPV4V6;
r.xiaof6ec4822024-04-03 02:46:00 -07001036
wangyouqiang84179c82024-01-05 15:42:55 +08001037 if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
1038 {
1039 pdp_type = MBTK_IP_TYPE_IP;
1040 }
1041 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
1042 {
1043 pdp_type = MBTK_IP_TYPE_IPV6;
1044 }
1045 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
1046 {
1047 pdp_type = MBTK_IP_TYPE_IPV4V6;
1048 }
1049 else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
1050 {
1051 pdp_type = MBTK_IP_TYPE_PPP;
1052 }
1053 else
1054 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001055 LOGE("[qser_data] pdp_type error.");
wangyouqiang84179c82024-01-05 15:42:55 +08001056 return QSER_RESULT_FAIL;
1057 }
1058
1059 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE || apn->auth_proto == QSER_APN_AUTH_PROTO_DEFAULT)
1060 {
1061 memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
1062 }
1063 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP)
1064 {
1065 memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
1066 }
1067 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_CHAP)
1068 {
1069 memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
1070 }
1071 #if 0
1072 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
1073 {
1074 //NOT SUPPORT
1075 }
1076 #endif
1077 else
1078 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001079 LOGE("[qser_data] auth input error!");
wangyouqiang84179c82024-01-05 15:42:55 +08001080 return QSER_RESULT_FAIL;
1081 }
1082
1083 if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
1084 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001085 LOGE("[qser_data] 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 +08001086 }
1087 else
1088 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001089 LOGE("[qser_data] 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 +08001090 }
wangyouqiange2498f12024-01-06 17:55:36 +08001091
wangyouqiang84179c82024-01-05 15:42:55 +08001092 ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
1093 if(ret < 0)
1094 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001095 LOGE("[qser_data] mbtk_apn_set fail!");
wangyouqiang84179c82024-01-05 15:42:55 +08001096 return QSER_RESULT_FAIL;
1097 }
1098
wangyouqiange2498f12024-01-06 17:55:36 +08001099 sprintf(qser_apn_type, "persist.qser.apn.type%d", apn->profile_idx);
1100 property_set(qser_apn_type, apn->apn_type);
wangyouqianga24887d2024-04-08 18:31:23 +08001101 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE)
1102 {
1103 qser_apn_auth_state[apn->profile_idx] = '1';
1104 }
1105 else
1106 {
1107 qser_apn_auth_state[apn->profile_idx] = '0';
1108 }
1109 property_set("persist.qser.apn.auth", qser_apn_auth_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001110 memcpy(&qser_apn_info[apn->profile_idx], apn, sizeof(qser_apn_info_s));
wangyouqiang805b0f92024-04-07 17:06:13 +08001111
1112#if defined(MBTK_ALL_CID_SUPPORT)
wangyouqianga24887d2024-04-08 18:31:23 +08001113 if(strcmp(apn->apn_type, "iot_default") == 0)
wangyouqiang805b0f92024-04-07 17:06:13 +08001114 {
1115 qser_apn_add_save_state[apn->profile_idx] = '2';
1116 qser_apn_default_idx = apn->profile_idx;
1117 }
1118 else
1119#endif
1120 {
1121 qser_apn_add_save_state[apn->profile_idx] = '1';
1122 }
1123
wangyouqianga24887d2024-04-08 18:31:23 +08001124 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001125 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001126}
1127
1128int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
1129{
wangyouqiang84179c82024-01-05 15:42:55 +08001130 //UNUSED(profile_idx);
1131 //UNUSED(apn);
1132 if(qser_info_handle == NULL)
1133 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001134 LOGE("[qser_data] handle is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001135 return QSER_RESULT_FAIL;
1136 }
1137
1138 if(apn == NULL)
1139 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001140 LOGE("[qser_data] apn param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001141 return QSER_RESULT_FAIL;
1142 }
b.liu5fa9e772023-11-23 18:00:55 +08001143
wangyouqiange2498f12024-01-06 17:55:36 +08001144 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001145 {
wangyouqiang3dcb3832024-04-24 15:22:50 +08001146#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +08001147 if(profile_idx != 0)
1148#endif
1149 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001150 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001151 return QSER_RESULT_FAIL;
1152 }
wangyouqiang84179c82024-01-05 15:42:55 +08001153 }
1154
1155 //get apn info
1156 mbtk_apn_info_t apns[10] = {0};
1157 int apn_num = 10;
1158 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1159 if(ret != 0)
1160 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001161 LOGE("[qser_data] mbtk_apn_get fail. [ret = %d]",ret);
wangyouqiang84179c82024-01-05 15:42:55 +08001162 return QSER_RESULT_FAIL;
1163 }
1164 else
1165 {
1166 int i = 0;
1167 for(i = 0; i < apn_num; i++)
1168 {
1169 if(apns[i].cid == profile_idx + 1)
1170 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001171 LOGE("[qser_data] find IDX.");
wangyouqiang84179c82024-01-05 15:42:55 +08001172 break;
1173 }
1174 }
1175
1176 if(i == apn_num)
1177 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001178 LOGE("[qser_data] not find IDX.[apn_num = %d]", apn_num);
wangyouqiang84179c82024-01-05 15:42:55 +08001179 return QSER_RESULT_FAIL;
1180 }
1181
1182 if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
1183 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001184 LOGE("[qser_data] qser_apn_info_param_convert fail");
wangyouqiang84179c82024-01-05 15:42:55 +08001185 return QSER_RESULT_FAIL;
1186 }
1187 }
1188 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001189}
1190
1191int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
1192{
wangyouqiange2498f12024-01-06 17:55:36 +08001193 //UNUSED(apn);
1194 //UNUSED(profile_idx);
1195 if(qser_info_handle == NULL)
1196 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001197 LOGE("[qser_data] handle is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +08001198 return QSER_RESULT_FAIL;
1199 }
1200
1201 if(apn == NULL)
1202 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001203 LOGE("[qser_data] apn param is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +08001204 return QSER_RESULT_FAIL;
1205 }
b.liu5fa9e772023-11-23 18:00:55 +08001206
wangyouqiang805b0f92024-04-07 17:06:13 +08001207#if 0
b.liuf37bd332024-03-18 13:51:24 +08001208 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1209 {
1210 if(qser_apn_default_idx > -1)
1211 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001212 LOGE("[qser_data] iot_default is exist.");
b.liuf37bd332024-03-18 13:51:24 +08001213 return QSER_RESULT_FAIL;
1214 }
1215 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001216 /*add name and type verify*/
1217 if (qser_check_apn_name_type(apn) < 0)
1218 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001219 LOGE("[qser_data] check param error.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001220 return QSER_RESULT_FAIL;
1221 }
1222#endif
b.liuf37bd332024-03-18 13:51:24 +08001223
wangyouqiange2498f12024-01-06 17:55:36 +08001224 int ret = 0;
1225 char idx = qser_get_apn_profile_idx();
wangyouqiang805b0f92024-04-07 17:06:13 +08001226 if(idx > QSER_PROFILE_IDX_MAX)
wangyouqiange2498f12024-01-06 17:55:36 +08001227 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001228 LOGE("[qser_data] idx is full.");
wangyouqiange2498f12024-01-06 17:55:36 +08001229 return QSER_RESULT_FAIL;
1230 }
1231 else
1232 {
1233 qser_apn_info_state[idx] = TRUE;
1234 qser_apn_info_s set_apn;
1235 set_apn.profile_idx = idx;
1236 set_apn.pdp_type = apn->pdp_type;
1237 set_apn.auth_proto = apn->auth_proto;
1238 memcpy(set_apn.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
1239 memcpy(set_apn.username, apn->username, QSER_APN_USERNAME_SIZE);
1240 memcpy(set_apn.password, apn->password, QSER_APN_PASSWORD_SIZE);
1241 memcpy(set_apn.apn_type, apn->apn_type, QSER_APN_NAME_SIZE);
1242 ret = qser_apn_set(&set_apn);
1243 if(ret != 0)
1244 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001245 LOGE("[qser_data] qser_apn_set fail.");
wangyouqiange2498f12024-01-06 17:55:36 +08001246 qser_apn_info_state[idx] = FALSE;
1247 return QSER_RESULT_FAIL;
1248 }
1249 *profile_idx = idx;
wangyouqiange2498f12024-01-06 17:55:36 +08001250 }
1251 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001252}
1253
1254int qser_apn_del(unsigned char profile_idx)
1255{
liuyang0e49d9a2024-04-23 21:04:54 +08001256 int ret = 0;
1257
wangyouqiange2498f12024-01-06 17:55:36 +08001258 //UNUSED(profile_idx);
1259 if(qser_info_handle == NULL)
1260 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001261 LOGE("[qser_data] handle is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +08001262 return QSER_RESULT_FAIL;
1263 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001264
1265 if(qser_idx_pdp_state[profile_idx] == true)
1266 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001267 LOGE("[qser_data] profile_idx[%d] open pdp.", profile_idx);
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001268 return QSER_RESULT_FAIL;
1269 }
b.liu5fa9e772023-11-23 18:00:55 +08001270
wangyouqiange2498f12024-01-06 17:55:36 +08001271 if(qser_check_profile_idx(profile_idx) < 0)
1272 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001273 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiange2498f12024-01-06 17:55:36 +08001274 return QSER_RESULT_FAIL;
1275 }
1276
liuyang0e49d9a2024-04-23 21:04:54 +08001277 ret = mbtk_apn_del(qser_info_handle, profile_idx);
1278
1279 if(ret < 0)
1280 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001281 LOGE("[qser_data] mbtk_apn_del fail!");
liuyang0e49d9a2024-04-23 21:04:54 +08001282 return QSER_RESULT_FAIL;
1283 }
1284
wangyouqiange2498f12024-01-06 17:55:36 +08001285 qser_apn_info_state[profile_idx] = FALSE;
1286 qser_apn_add_save_state[profile_idx] = '0';
b.liuf37bd332024-03-18 13:51:24 +08001287
1288#if defined(MBTK_ALL_CID_SUPPORT)
1289 if(profile_idx == qser_apn_default_idx)
1290 {
1291 qser_apn_default_idx = -1;
1292 }
1293#endif
1294
wangyouqiange2498f12024-01-06 17:55:36 +08001295 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
1296 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001297}
1298
1299int qser_apn_get_list(qser_apn_info_list_s *apn_list)
1300{
wangyouqiang84179c82024-01-05 15:42:55 +08001301 //UNUSED(apn_list);
b.liu5fa9e772023-11-23 18:00:55 +08001302
wangyouqiang84179c82024-01-05 15:42:55 +08001303 if(qser_info_handle == NULL)
1304 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001305 LOGE("[qser_data] handle is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001306 return QSER_RESULT_FAIL;
1307 }
1308
1309 if(apn_list == NULL)
1310 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001311 LOGE("[qser_data] apn_list param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001312 return QSER_RESULT_FAIL;
1313 }
1314
wangyouqiange2498f12024-01-06 17:55:36 +08001315 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
wangyouqiangc42b85d2024-04-24 17:05:06 +08001316 LOGE("[qser_data] qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001317 mbtk_apn_info_t apns[10] = {0};
1318 int apn_num = 10;
1319 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1320 if(ret != 0)
1321 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001322 LOGE("[qser_data] mbtk_apn_get fail. [ret = %d]",ret);
wangyouqiang84179c82024-01-05 15:42:55 +08001323 return QSER_RESULT_FAIL;
1324 }
1325 else
1326 {
1327 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
1328 {
1329 int i = 0;
wangyouqiange2498f12024-01-06 17:55:36 +08001330 apn_list->cnt = 0;
wangyouqiang84179c82024-01-05 15:42:55 +08001331 for(i = 0; i < apn_num; i++)
1332 {
wangyouqiange2498f12024-01-06 17:55:36 +08001333 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
1334 {
wangyouqiang3dcb3832024-04-24 15:22:50 +08001335#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +08001336 if((apns[i].cid - 1) != 0)
1337#endif
1338 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001339 LOGE("[qser_data] idx no open.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001340 continue;
1341 }
wangyouqiange2498f12024-01-06 17:55:36 +08001342 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001343 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 +08001344 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001345 LOGE("[qser_data] qser_apn_info_param_convert fail");
wangyouqiang84179c82024-01-05 15:42:55 +08001346 return QSER_RESULT_FAIL;
1347 }
wangyouqiange2498f12024-01-06 17:55:36 +08001348 apn_list->cnt++;
wangyouqiang84179c82024-01-05 15:42:55 +08001349 }
wangyouqiang84179c82024-01-05 15:42:55 +08001350 }
1351 else if(apn_num > QSER_APN_MAX_LIST)
1352 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001353 LOGE("[qser_data] apn_num overlong");
wangyouqiang84179c82024-01-05 15:42:55 +08001354 return QSER_RESULT_FAIL;
1355 }
1356 else
1357 {
1358 apn_list->cnt = 0;
1359 }
1360 }
1361 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001362}
wangyouqiang84179c82024-01-05 15:42:55 +08001363/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +08001364