blob: ee9e75442ce78c2a689eb23916ed1e94a340e639 [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
wangyouqiangc1d72d22024-04-25 10:15:58 +080018#define MBTK_INFO_ERR_NO_APN 500
b.liuf37bd332024-03-18 13:51:24 +080019
wangyouqiange2498f12024-01-06 17:55:36 +080020#define QSER_APN_NUM 8
wangyouqiang84179c82024-01-05 15:42:55 +080021//default range: 0 - 7
22//AT+CGACT range: 1 - 8
23//1 default IDX, 8 IMS IDX
b.liuf37bd332024-03-18 13:51:24 +080024#if defined(MBTK_ALL_CID_SUPPORT)
wangyouqiang3dcb3832024-04-24 15:22:50 +080025#if defined(MBTK_SG_SUPPORT)
b.liuf37bd332024-03-18 13:51:24 +080026#define QSER_PROFILE_IDX_MIN 0
27#else
wangyouqiang84179c82024-01-05 15:42:55 +080028#define QSER_PROFILE_IDX_MIN 1
b.liuf37bd332024-03-18 13:51:24 +080029#endif
wangyouqiang805b0f92024-04-07 17:06:13 +080030#else
31#define QSER_PROFILE_IDX_MIN 1
32#endif
wangyouqiang84179c82024-01-05 15:42:55 +080033#define QSER_PROFILE_IDX_MAX 6
wangyouqiange2498f12024-01-06 17:55:36 +080034
wangyouqiang84179c82024-01-05 15:42:55 +080035/****************************DEFINE***************************************/
36
37/****************************VARIABLE***************************************/
38mbtk_info_handle_t* qser_info_handle = NULL;
39int qser_info_handle_num = 0;
40static bool inited = FALSE;
41static qser_data_call_evt_cb_t qser_net_status_cb = NULL;
wangyouqiange2498f12024-01-06 17:55:36 +080042static qser_apn_info_s qser_apn_info[QSER_APN_NUM] = {0};
43static bool qser_apn_info_state[QSER_APN_NUM] = {0};
wangyouqiang8ebeafe2024-04-15 10:07:44 +080044static bool qser_idx_pdp_state[QSER_APN_NUM];
wangyouqiange2498f12024-01-06 17:55:36 +080045static char qser_apn_add_save_state[QSER_APN_NUM + 1] = {0};
wangyouqianga24887d2024-04-08 18:31:23 +080046static char qser_apn_auth_state[QSER_APN_NUM + 1] = {0};
b.liuf37bd332024-03-18 13:51:24 +080047#if defined(MBTK_ALL_CID_SUPPORT)
48static int qser_apn_default_idx = -1;
wangyouqiang805b0f92024-04-07 17:06:13 +080049static int qser_default_pdp_idx = -1;
b.liuf37bd332024-03-18 13:51:24 +080050#else
51static int qser_apn_default_idx = 0xFF;
wangyouqiang805b0f92024-04-07 17:06:13 +080052static int qser_default_pdp_idx = 0;
b.liuf37bd332024-03-18 13:51:24 +080053#endif
wangyouqiang84179c82024-01-05 15:42:55 +080054/****************************VARIABLE***************************************/
55
56/******************************FUNC*****************************************/
b.liuf37bd332024-03-18 13:51:24 +080057#if defined(MBTK_ALL_CID_SUPPORT)
wangyouqiang12a87812024-04-22 14:54:52 +080058static int qser_route_config(int profile_idx)
b.liuf37bd332024-03-18 13:51:24 +080059{
60 char buf[1024] = {0};
61 char dns[128] = {0};
62 int offset = 0;
63 int fd = -1;
64 mbtk_ipv4_info_t ipv4;
65 mbtk_ipv6_info_t ipv6;
66 sprintf(buf, "route add default dev ccinet%d", profile_idx -1);
67 system(buf);
68
69 int ret = mbtk_data_call_state_get(qser_info_handle, profile_idx, &ipv4, &ipv6);
70 if(ret != 0)
wangyouqiang12a87812024-04-22 14:54:52 +080071 return QSER_RESULT_FAIL;
b.liuf37bd332024-03-18 13:51:24 +080072 else
73 {
74 memset(buf, 0x0, 1024);
75 memset(dns, 0x0, 128);
76 offset = sprintf(buf, "search lan\n");
77 if(ipv4.valid)
78 {
79 if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), dns, 32) == NULL) {
wangyouqiangc42b85d2024-04-24 17:05:06 +080080 LOGE("[qser_data] PrimaryDNS error.");
b.liuf37bd332024-03-18 13:51:24 +080081 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +080082 LOGE("[qser_data] PrimaryDNS : %s", dns);
b.liuf37bd332024-03-18 13:51:24 +080083 }
84 offset += sprintf(buf + offset, "nameserver %s\n", dns);
85 memset(dns, 0x0, 128);
86 if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), dns, 32) == NULL) {
wangyouqiangc42b85d2024-04-24 17:05:06 +080087 LOGE("[qser_data] SecondaryDNS error.");
b.liuf37bd332024-03-18 13:51:24 +080088 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +080089 LOGE("[qser_data] SecondaryDNS : %s", dns);
b.liuf37bd332024-03-18 13:51:24 +080090 }
91 offset += sprintf(buf + offset, "nameserver %s\n", dns);
92 }
93 if(ipv6.valid)
94 {
95 memset(dns, 0x0, 128);
96 if(ipv6_2_str(&(ipv6.PrimaryDNS), dns))
97 {
wangyouqiangc42b85d2024-04-24 17:05:06 +080098 LOGE("[qser_data] PrimaryDNS error.");
b.liuf37bd332024-03-18 13:51:24 +080099 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800100 LOGE("[qser_data] PrimaryDNS : %s", dns);
b.liuf37bd332024-03-18 13:51:24 +0800101 }
102 offset += sprintf(buf + offset, "nameserver %s\n", dns);
103 memset(dns, 0x0, 128);
104 if(ipv6_2_str(&(ipv6.SecondaryDNS), dns))
105 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800106 LOGE("[qser_data] SecondaryDNS error.");
b.liuf37bd332024-03-18 13:51:24 +0800107 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800108 LOGE("[qser_data] SecondaryDNS : %s", dns);
b.liuf37bd332024-03-18 13:51:24 +0800109 }
110 offset += sprintf(buf + offset, "nameserver %s\n", dns);
111 }
112
113 if(offset > 0)
114 {
115 fd = open("/tmp/resolv.conf", O_WRONLY | O_TRUNC);
116 if(fd < 0)
117 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800118 LOGE("[qser_data] mbtk_route_config : open fail.");
wangyouqiang12a87812024-04-22 14:54:52 +0800119 return QSER_RESULT_FAIL;
b.liuf37bd332024-03-18 13:51:24 +0800120 }
121
122 ret = write(fd, buf, offset);
123 if(ret < 0)
124 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800125 LOGE("[qser_data] mbtk_route_config : write fail.");
b.liuf37bd332024-03-18 13:51:24 +0800126 }
127
128 close(fd);
129 }
130 }
131
132 return 0;
133}
134#endif
135
wangyouqiang12a87812024-04-22 14:54:52 +0800136static char qser_get_apn_profile_idx(void)
wangyouqiange2498f12024-01-06 17:55:36 +0800137{
138 char i = 0;
wangyouqiang805b0f92024-04-07 17:06:13 +0800139 for(i = QSER_PROFILE_IDX_MIN; i <= QSER_PROFILE_IDX_MAX; i++)
wangyouqiange2498f12024-01-06 17:55:36 +0800140 {
141 if(qser_apn_info_state[i] == FALSE)
142 {
143 return i;
144 }
145 }
146
147 return i;
148}
149
wangyouqiang12a87812024-04-22 14:54:52 +0800150static int qser_check_profile_idx(unsigned char profile_idx)
wangyouqiange2498f12024-01-06 17:55:36 +0800151{
152 if(profile_idx < QSER_PROFILE_IDX_MIN || profile_idx > QSER_PROFILE_IDX_MAX)
153 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800154 LOGE("[qser_data] IDX range error.");
wangyouqiange2498f12024-01-06 17:55:36 +0800155 return QSER_RESULT_FAIL;
156 }
157
158 if(qser_apn_info_state[profile_idx] != TRUE)
159 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800160 LOGE("[qser_data] profile_idx is not exist.");
wangyouqiange2498f12024-01-06 17:55:36 +0800161 return QSER_RESULT_FAIL;
162 }
163
164 return QSER_RESULT_SUCCESS;
165}
166
wangyouqiang12a87812024-04-22 14:54:52 +0800167static 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 +0800168{
169 if(new_apn == NULL || old_apn == NULL)
170 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800171 LOGE("[qser_data] qser_apn_info_param_convert apn param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800172 return QSER_RESULT_FAIL;
173 }
174
175 //get ip type
176 if(old_apn->ip_type == MBTK_IP_TYPE_IPV4V6) // IPV4V6
177 {
178 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4V6;
179 }
180 else if(old_apn->ip_type == MBTK_IP_TYPE_IP) // IPV4
181 {
182 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4;
183 }
184 else if(old_apn->ip_type == MBTK_IP_TYPE_IPV6) // IPV6
185 {
186 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV6;
187 }
188 else
189 {
190 new_apn->pdp_type = QSER_APN_PDP_TYPE_PPP;
191 }
192
193 //get apn name
194 if(strlen(old_apn->apn)+1 > QSER_APN_NAME_SIZE)
195 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800196 LOGE("[qser_data] apn_nmea length verylong.");
wangyouqiang84179c82024-01-05 15:42:55 +0800197 return QSER_RESULT_FAIL;
198 }
199 else
200 {
201 if(strlen(old_apn->apn) > 0)
202 {
203 memcpy(new_apn->apn_name, old_apn->apn,strlen(old_apn->apn)+1);
204 }
205 else
206 {
207 memset(new_apn->apn_name, 0x0, QSER_APN_NAME_SIZE);
208 }
209 }
210
211 //get apn user
212 if(strlen(old_apn->user)+1 > QSER_APN_USERNAME_SIZE)
213 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800214 LOGE("[qser_data] apn_user length verylong.");
wangyouqiang84179c82024-01-05 15:42:55 +0800215 return QSER_RESULT_FAIL;
216 }
217 else
218 {
219 if(strlen(old_apn->user) > 0)
220 {
221 memcpy(new_apn->username, old_apn->user, strlen(old_apn->user)+1);
222 }
223 else
224 {
225 memset(new_apn->username , 0x0, QSER_APN_USERNAME_SIZE);
226 }
227 }
228
229 //get apn password
230 if(strlen(old_apn->pass)+1 > QSER_APN_PASSWORD_SIZE)
231 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800232 LOGE("[qser_data] apn_password length verylong.");
wangyouqiang84179c82024-01-05 15:42:55 +0800233 return QSER_RESULT_FAIL;
234 }
235 else
236 {
237 if(strlen(old_apn->pass) > 0)
238 {
239 memcpy(new_apn->password, old_apn->pass, strlen(old_apn->pass)+1);
240 }
241 else
242 {
243 memset(new_apn->username , 0x0, QSER_APN_PASSWORD_SIZE);
244 }
245 }
246
247 //get apn proto
248 if(strlen(old_apn->auth) > 0)
249 {
250 if(strcmp(old_apn->auth, "NONE") == 0)
251 {
wangyouqianga24887d2024-04-08 18:31:23 +0800252 if(qser_apn_auth_state[profile_idx] == '1')
253 {
254 new_apn->auth_proto = QSER_APN_AUTH_PROTO_NONE;
255 }
256 else
257 {
258 new_apn->auth_proto = QSER_APN_AUTH_PROTO_DEFAULT;
259 }
wangyouqiang84179c82024-01-05 15:42:55 +0800260 }
261 else if(strcmp(old_apn->auth, "PAP") == 0)
262 {
263 new_apn->auth_proto = QSER_APN_AUTH_PROTO_PAP;
264 }
265 else if(strcmp(old_apn->auth, "CHAP") == 0)
266 {
267 new_apn->auth_proto = QSER_APN_AUTH_PROTO_CHAP;
268 }
269 else
270 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800271 LOGE("[qser_data] auth input error!");
wangyouqiang84179c82024-01-05 15:42:55 +0800272 return QSER_RESULT_FAIL;
273 }
274 }
275
276 //get apn type
277 new_apn->profile_idx = profile_idx;
278 memset(new_apn->apn_type, 0x0, QSER_APN_NAME_SIZE);
279 if(strlen(qser_apn_info[profile_idx].apn_type) > 0)
280 {
281 memcpy(new_apn->apn_type, qser_apn_info[profile_idx].apn_type, strlen(qser_apn_info[profile_idx].apn_type));
282 }
283
284 return QSER_RESULT_SUCCESS;
285}
286
r.xiaof6ec4822024-04-03 02:46:00 -0700287/*Check parameter*/
wangyouqiang12a87812024-04-22 14:54:52 +0800288static int qser_check_apn_name_type(qser_apn_info_s *apn)
r.xiaof6ec4822024-04-03 02:46:00 -0700289{
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800290 if(apn == NULL)
291 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800292 LOGE("[qser_data] qser_check_apn_type apn is NULL!");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800293 return QSER_RESULT_FAIL;
294 }
295
296 //check default idx = 0
297 int apn_name_length = strlen(apn->apn_name);
wangyouqiangc42b85d2024-04-24 17:05:06 +0800298 //LOGE("[qser_data] qser_apn_info[0].apn_name: %s!", qser_apn_info[0].apn_name);
wangyouqiang12a87812024-04-22 14:54:52 +0800299 char *p = strstr(qser_apn_info[0].apn_name, "mnc");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800300 if(p == NULL)
301 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800302 LOGE("[qser_data] qser_check_apn_type not find!");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800303 //return QSER_RESULT_FAIL;
304 }
305 else
306 {
wangyouqiang12a87812024-04-22 14:54:52 +0800307 int default_apn_name_length = p - (qser_apn_info[0].apn_name) -1;
wangyouqiangc42b85d2024-04-24 17:05:06 +0800308 LOGE("[qser_data] qser_check_apn_type default_apn_name_length = [%d]!", default_apn_name_length);
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800309 if(default_apn_name_length == apn_name_length)
310 {
311 int i = 0;
312 while(i < default_apn_name_length)
313 {
314 if(isalpha(qser_apn_info[0].apn_name[i]) && isalpha(apn->apn_name[i]))
315 {
316 if(tolower(qser_apn_info[0].apn_name[i]) != tolower(apn->apn_name[i]))
317 {
318 break;
319 }
320 }
321 else
322 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800323 //LOGE("[qser_data] not char!");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800324 if(qser_apn_info[0].apn_name[i] != apn->apn_name[i])
325 {
326 break;
327 }
328 }
329
330 i++;
331 }
332
333 if(i == default_apn_name_length)
334 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800335 LOGE("[qser_data] apn_name is same!idx = [0]");
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800336 return QSER_RESULT_FAIL;
337 }
338 }
339 }
340 //check 1 -6
341 int pdp_type_tmp = 1;
r.xiaof6ec4822024-04-03 02:46:00 -0700342 for (;pdp_type_tmp < QSER_APN_NUM; pdp_type_tmp++)
343 {
wangyouqianga24887d2024-04-08 18:31:23 +0800344 if(pdp_type_tmp == apn->profile_idx)
345 {
346 continue;
347 }
348 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 -0700349 {
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800350 if(strcmp(qser_apn_info[pdp_type_tmp].apn_type, apn->apn_type) == 0)
wangyouqiang805b0f92024-04-07 17:06:13 +0800351 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800352 LOGE("[qser_data] apn_type is same!idx = [%d]", pdp_type_tmp);
wangyouqiang805b0f92024-04-07 17:06:13 +0800353 return QSER_RESULT_FAIL;
354 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800355 if (strcmp(qser_apn_info[pdp_type_tmp].apn_name, apn->apn_name) == 0)
356 {
wangyouqiangce45a102024-04-18 18:08:29 +0800357 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 +0800358 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800359 LOGE("[qser_data] apn_name is same and pdp_type is IPV4V6!idx = [%d]", pdp_type_tmp);
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800360 return QSER_RESULT_FAIL;
361 }
362
363 if(qser_apn_info[pdp_type_tmp].pdp_type == apn->pdp_type)
364 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800365 LOGE("[qser_data] pdp_type is same and pdp_type is same!idx = [%d]", pdp_type_tmp);
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800366 return QSER_RESULT_FAIL;
367 }
368 }
r.xiaof6ec4822024-04-03 02:46:00 -0700369 }
370 }
371
372 return QSER_RESULT_SUCCESS;
373}
374
wangyouqiang12a87812024-04-22 14:54:52 +0800375static void qser_state_init(qser_data_call_state_s *state)
wangyouqiang805b0f92024-04-07 17:06:13 +0800376{
wangyouqianga24887d2024-04-08 18:31:23 +0800377 if(state != NULL)
wangyouqiang805b0f92024-04-07 17:06:13 +0800378 {
wangyouqianga24887d2024-04-08 18:31:23 +0800379 state->profile_idx = 0;
380 memset(state->name, 0x0, 16);
381 state->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
382 state->state = QSER_DATA_CALL_DISCONNECTED;
383 state->err = QSER_DATA_CALL_ERROR_NONE;
384 inet_aton("0.0.0.0", &(state->v4.ip));
385 inet_aton("0.0.0.0", &(state->v4.gateway));
386 inet_aton("0.0.0.0", &(state->v4.pri_dns));
387 inet_aton("0.0.0.0", &(state->v4.sec_dns));
388 inet_pton(AF_INET6, "::", &(state->v6.ip));
389 inet_pton(AF_INET6, "::", &(state->v6.gateway));
390 inet_pton(AF_INET6, "::", &(state->v6.pri_dns));
391 inet_pton(AF_INET6, "::", &(state->v6.sec_dns));
wangyouqiang805b0f92024-04-07 17:06:13 +0800392 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800393}
r.xiaof6ec4822024-04-03 02:46:00 -0700394
wangyouqiang84179c82024-01-05 15:42:55 +0800395void qser_wan_net_state_change_cb(const void* data, int data_len)
396{
397 if(data == NULL || data_len == 0)
398 {
399 return;
400 }
401
402 uint8 *net_data = NULL;
403 net_data = (uint8 *)data;
404
wangyouqianga24887d2024-04-08 18:31:23 +0800405 if(*net_data > 100 && *net_data < 200)
wangyouqiang84179c82024-01-05 15:42:55 +0800406 {
wangyouqianga24887d2024-04-08 18:31:23 +0800407 int idx = *net_data - 101;
408 if(idx <= QSER_PROFILE_IDX_MAX)
wangyouqiange2498f12024-01-06 17:55:36 +0800409 {
wangyouqianga24887d2024-04-08 18:31:23 +0800410 qser_data_call_state_s state = {0};
411 qser_state_init(&state);
412 state.profile_idx = idx;
wangyouqiange2498f12024-01-06 17:55:36 +0800413 state.state = QSER_DATA_CALL_DISCONNECTED;
wangyouqianga24887d2024-04-08 18:31:23 +0800414 if( idx == qser_default_pdp_idx )
wangyouqiang805b0f92024-04-07 17:06:13 +0800415 {
416 qser_default_pdp_idx = -1;
417 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800418 qser_idx_pdp_state[idx] = false;
wangyouqianga24887d2024-04-08 18:31:23 +0800419
420 if(qser_net_status_cb != NULL)
421 {
422 qser_net_status_cb(&state);
423 }
wangyouqiange2498f12024-01-06 17:55:36 +0800424 }
425 else
426 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800427 LOGE("[qser_data] cb fail,idx is %d.", idx);
wangyouqiange2498f12024-01-06 17:55:36 +0800428 }
wangyouqianga24887d2024-04-08 18:31:23 +0800429
430 }
431 else if(*net_data > 200)
432 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800433 LOGE("[qser_data] cid[%d] is open.", *net_data - 201);
wangyouqianga24887d2024-04-08 18:31:23 +0800434 }
435 else if(*net_data == 1)
436 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800437 LOGE("[qser_data] pdp is open.");
wangyouqianga24887d2024-04-08 18:31:23 +0800438 }
439 else
440 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800441 LOGE("[qser_data] unkonwn param [%d].", *net_data);
wangyouqiang84179c82024-01-05 15:42:55 +0800442 }
443}
wangyouqiange2498f12024-01-06 17:55:36 +0800444
445static void* data_call_async_thread(void* arg)
446{
447 qser_data_call_error_e err;
wangyouqianga24887d2024-04-08 18:31:23 +0800448
449 qser_data_call_s qser_data_backup = {0};
450 if(arg != NULL)
451 {
452 memcpy(&qser_data_backup, (qser_data_call_s *)arg, sizeof(qser_data_call_s));
453 }
454 else
455 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800456 LOGE("[qser_data] arg is NULL.");
wangyouqianga24887d2024-04-08 18:31:23 +0800457 }
458
459 qser_data_call_state_s state = {0};
460 qser_state_init(&state);
461 state.profile_idx = qser_data_backup.profile_idx;
462 state.ip_family = qser_data_backup.ip_family;
463
wangyouqiange2498f12024-01-06 17:55:36 +0800464 int ret = qser_data_call_start(&qser_data_backup, &err);
465 if(ret != QSER_RESULT_SUCCESS)
466 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800467 LOGE("[qser_data] qser_data_call_start() fail.");
wangyouqianga24887d2024-04-08 18:31:23 +0800468 state.err = err;
469 if(qser_net_status_cb != NULL)
470 {
471 qser_net_status_cb(&state);
472 }
wangyouqiange2498f12024-01-06 17:55:36 +0800473 }
wangyouqianga24887d2024-04-08 18:31:23 +0800474
475 qser_data_call_info_s info = {0};
476 ret = qser_data_call_info_get(qser_data_backup.profile_idx, qser_data_backup.ip_family, &info, &err);
477 if(ret != QSER_RESULT_SUCCESS)
478 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800479 LOGE("[qser_data] qser_data_call_info_get() fail.");
wangyouqianga24887d2024-04-08 18:31:23 +0800480 state.err = err;
481 if(qser_net_status_cb != NULL)
482 {
483 qser_net_status_cb(&state);
484 }
485 }
486
487 snprintf(state.name, 16, "ccinet%d", qser_data_backup.profile_idx);
488 state.state = QSER_DATA_CALL_CONNECTED;
489 state.err = err;
490 memcpy(&(state.v4), &(info.v4.addr), sizeof(struct v4_address_status));
491 memcpy(&(state.v6), &(info.v6.addr), sizeof(struct v6_address_status));
492 if(qser_net_status_cb != NULL)
493 {
494 qser_net_status_cb(&state);
495 }
wangyouqiange2498f12024-01-06 17:55:36 +0800496 return NULL;
497}
498
wangyouqiang84179c82024-01-05 15:42:55 +0800499/******************************FUNC*****************************************/
500
501/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +0800502int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
503{
wangyouqiang84179c82024-01-05 15:42:55 +0800504 //UNUSED(evt_cb);
505 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 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800516 LOGE("[qser_data] 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");
wangyouqiangc42b85d2024-04-24 17:05:06 +0800532 LOGE("[qser_data] 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 {
wangyouqiangc1d72d22024-04-25 10:15:58 +0800540 if(ret == MBTK_INFO_ERR_NO_APN)
541 {
542 return QSER_RESULT_SUCCESS;
543 }
wangyouqiangc42b85d2024-04-24 17:05:06 +0800544 LOGE("[qser_data] mbtk_apn_get fail. [ret = %d]",ret);
wangyouqiangc1d72d22024-04-25 10:15:58 +0800545 qser_data_call_destroy();
wangyouqiange2498f12024-01-06 17:55:36 +0800546 return QSER_RESULT_FAIL;
547 }
548 else
549 {
550 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
551 {
552 int i = 0;
553 for(i = 0; i < apn_num; i++)
554 {
555 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
556 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800557 //LOGE("[qser_data] idx no open.");
wangyouqiang3dcb3832024-04-24 15:22:50 +0800558#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800559 if(apns[i].cid - 1 == 0)
560 {
561 qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]);
562 }
563#endif
wangyouqiange2498f12024-01-06 17:55:36 +0800564 continue;
565 }
b.liuf37bd332024-03-18 13:51:24 +0800566
567#if defined(MBTK_ALL_CID_SUPPORT)
568 if(qser_apn_add_save_state[apns[i].cid - 1] == '2')
569 {
570 qser_apn_default_idx = apns[i].cid - 1;
571 }
572#endif
573
wangyouqiange2498f12024-01-06 17:55:36 +0800574 if(qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]) != 0)
575 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800576 LOGE("[qser_data] qser_apn_info_param_convert fail");
wangyouqiange2498f12024-01-06 17:55:36 +0800577 return QSER_RESULT_FAIL;
578 }
579 else
580 {
581 qser_apn_info_state[apns[i].cid - 1] = TRUE;
582 sprintf(qser_apn_type, "persist.qser.apn.type%d", apns[i].cid - 1);
583 property_get(qser_apn_type, qser_apn_info[apns[i].cid - 1].apn_type, NULL);
584 }
585 }
586 }
587 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800588
589 int idx = 0;
590 for(;idx < QSER_APN_NUM; idx++)
591 {
592 qser_idx_pdp_state[idx] = false;
593 }
wangyouqiangc42b85d2024-04-24 17:05:06 +0800594 LOGE("[qser_data] mbtk_info_handle_get() success.");
wangyouqiang84179c82024-01-05 15:42:55 +0800595 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800596}
597
598void qser_data_call_destroy(void)
599{
wangyouqiang84179c82024-01-05 15:42:55 +0800600 if(qser_info_handle)
601 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800602 LOGE("[qser_data] qser_info_handle_num = %d", qser_info_handle_num);
wangyouqiang84179c82024-01-05 15:42:55 +0800603 if(qser_info_handle_num == 1)
604 { // 最后一个引用,可释放。
605 int ret = mbtk_info_handle_free(&qser_info_handle);
606 if(ret)
607 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800608 LOGE("[qser_data] mbtk_info_handle_free() fail.");
wangyouqiang84179c82024-01-05 15:42:55 +0800609 }
610 else
611 {
612 qser_info_handle_num = 0;
613 qser_info_handle = NULL;
wangyouqiang45cfff82024-04-15 19:35:15 +0800614 qser_net_status_cb = NULL;
wangyouqiang84179c82024-01-05 15:42:55 +0800615 inited = FALSE;
616 }
617 }
618 else
619 {
620 qser_info_handle_num--;
wangyouqiang45cfff82024-04-15 19:35:15 +0800621 qser_net_status_cb = NULL;
wangyouqiang84179c82024-01-05 15:42:55 +0800622 }
623 }
624 else
625 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800626 LOGE("[qser_data] handle not inited.");
wangyouqiang84179c82024-01-05 15:42:55 +0800627 }
b.liu5fa9e772023-11-23 18:00:55 +0800628}
629
630int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
631{
wangyouqiang84179c82024-01-05 15:42:55 +0800632 //UNUSED(data_call);
633 //UNUSED(err);
634 if(data_call == NULL || err == NULL)
635 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800636 LOGE("[qser_data] data_call or err is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800637 if(err != NULL)
638 {
639 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
640 }
641 return QSER_RESULT_FAIL;
642 }
643
644 if(qser_info_handle == NULL)
645 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800646 LOGE("[qser_data] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800647 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800648 return QSER_RESULT_FAIL;
649 }
b.liu5fa9e772023-11-23 18:00:55 +0800650
wangyouqiang805b0f92024-04-07 17:06:13 +0800651#if defined(MBTK_ALL_CID_SUPPORT)
652 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
653 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800654 LOGE("[qser_data] default pdp exist.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800655 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
656 return QSER_RESULT_FAIL;
657 }
658#endif
659
wangyouqiange2498f12024-01-06 17:55:36 +0800660 if(qser_check_profile_idx(data_call->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800661 {
wangyouqiang3dcb3832024-04-24 15:22:50 +0800662#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +0800663 if( data_call->profile_idx == 0 )
664 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800665 LOGE("[qser_data] profile_idx = 0.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800666 }
667 else
668#endif
669 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800670 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800671 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
672 return QSER_RESULT_FAIL;
673 }
wangyouqiang84179c82024-01-05 15:42:55 +0800674 }
675
676 int ret = -1;
677 ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
678 if(ret != 0)
679 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800680 LOGE("[qser_data] mbtk_data_call_start fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800681 if(ret == MBTK_INFO_ERR_CID_EXIST)
682 {
683 *err = QSER_DATA_CALL_ERROR_PDP_ACTIVATE;
684 }
685 else
686 {
687 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
688 }
wangyouqiang84179c82024-01-05 15:42:55 +0800689 return QSER_RESULT_FAIL;
690 }
691 else
692 {
693 *err = QSER_DATA_CALL_ERROR_NONE;
694 }
wangyouqiange2498f12024-01-06 17:55:36 +0800695
b.liuf37bd332024-03-18 13:51:24 +0800696#if defined(MBTK_ALL_CID_SUPPORT)
697 if(qser_apn_default_idx == data_call->profile_idx)
698 {
699 qser_route_config(qser_apn_default_idx + 1);
wangyouqiang805b0f92024-04-07 17:06:13 +0800700 qser_default_pdp_idx = data_call->profile_idx;
b.liuf37bd332024-03-18 13:51:24 +0800701 }
wangyouqiang805b0f92024-04-07 17:06:13 +0800702 else if(data_call->profile_idx == 0)
703 {
704 qser_route_config(1);
705 qser_default_pdp_idx = data_call->profile_idx;
706 }
707 else
708 {
709 //
710 }
711
b.liuf37bd332024-03-18 13:51:24 +0800712#endif
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800713 qser_idx_pdp_state[data_call->profile_idx] = true;
b.liuf37bd332024-03-18 13:51:24 +0800714
wangyouqiange2498f12024-01-06 17:55:36 +0800715 return QSER_RESULT_SUCCESS;
716}
717
718int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
719{
720 //UNUSED(data_call);
721 UNUSED(err);
722 if(data_call == NULL || err == NULL)
723 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800724 LOGE("[qser_data] data_call or err is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +0800725 if(err != NULL)
726 {
727 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
728 }
729 return QSER_RESULT_FAIL;
730 }
731
732 if(qser_info_handle == NULL)
733 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800734 LOGE("[qser_data] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800735 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiange2498f12024-01-06 17:55:36 +0800736 return QSER_RESULT_FAIL;
737 }
738
wangyouqiang805b0f92024-04-07 17:06:13 +0800739#if defined(MBTK_ALL_CID_SUPPORT)
740 if( ( (data_call->profile_idx == qser_apn_default_idx) || (data_call->profile_idx == 0) ) && (qser_default_pdp_idx >= 0) )
741 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800742 LOGE("[qser_data] default pdp exist.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800743 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
744 return QSER_RESULT_FAIL;
745 }
746#endif
747
wangyouqiange2498f12024-01-06 17:55:36 +0800748 if(qser_check_profile_idx(data_call->profile_idx) < 0)
749 {
wangyouqiang3dcb3832024-04-24 15:22:50 +0800750#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +0800751 if((data_call->profile_idx == 0) && (qser_default_pdp_idx < 0))
752 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800753 LOGE("[qser_data] profile_idx = 0 and not open default idx.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800754 }
755 else
756#endif
757 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800758 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800759 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
760 return QSER_RESULT_FAIL;
761 }
762
wangyouqiange2498f12024-01-06 17:55:36 +0800763 }
764
765 pthread_attr_t thread_attr;
766 pthread_t data_call_thread_id;
767 pthread_attr_init(&thread_attr);
768 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
769 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800770 LOGE("[qser_data] pthread_attr_setdetachstate() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800771 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800772 return QSER_RESULT_FAIL;
773 }
774
wangyouqianga24887d2024-04-08 18:31:23 +0800775 //memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
776 if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, (void *) data_call))
wangyouqiange2498f12024-01-06 17:55:36 +0800777 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800778 LOGE("[qser_data] pthread_create() fail.");
b.liuf37bd332024-03-18 13:51:24 +0800779 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
wangyouqiange2498f12024-01-06 17:55:36 +0800780 return QSER_RESULT_FAIL;
781 }
782 pthread_attr_destroy(&thread_attr);
wangyouqiange2498f12024-01-06 17:55:36 +0800783
wangyouqiang84179c82024-01-05 15:42:55 +0800784 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800785}
786
787int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
788{
wangyouqiang84179c82024-01-05 15:42:55 +0800789 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800790 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800791 //UNUSED(err);
792 if(err == NULL)
793 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800794 LOGE("[qser_data] err is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800795 return QSER_RESULT_FAIL;
796 }
b.liu5fa9e772023-11-23 18:00:55 +0800797
wangyouqiang84179c82024-01-05 15:42:55 +0800798 if(qser_info_handle == NULL)
799 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800800 LOGE("[qser_data] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800801 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800802 return QSER_RESULT_FAIL;
803 }
804
wangyouqiange2498f12024-01-06 17:55:36 +0800805 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800806 {
wangyouqiang3dcb3832024-04-24 15:22:50 +0800807#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +0800808 if(profile_idx == 0)
809 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800810 LOGE("[qser_data] profile_idx = 0.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800811 }
812 else
813#endif
814 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800815 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800816 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
817 return QSER_RESULT_FAIL;
818 }
wangyouqiang84179c82024-01-05 15:42:55 +0800819 }
820
821 int ret = -1;
822 ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
823 if(ret != 0)
824 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800825 LOGE("[qser_data] mbtk_data_call_stop fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800826 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
827 {
828 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
829 }
830 else
831 {
832 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
833 }
wangyouqiang84179c82024-01-05 15:42:55 +0800834 return QSER_RESULT_FAIL;
835 }
836 else
837 {
838 *err = QSER_DATA_CALL_ERROR_NONE;
839 }
wangyouqiange2498f12024-01-06 17:55:36 +0800840
wangyouqiang805b0f92024-04-07 17:06:13 +0800841#if defined(MBTK_ALL_CID_SUPPORT)
842 if(qser_default_pdp_idx == profile_idx)
843 {
844 qser_default_pdp_idx = -1;
845 }
846#endif
wangyouqiang8ebeafe2024-04-15 10:07:44 +0800847 qser_idx_pdp_state[profile_idx] = false;
wangyouqiang805b0f92024-04-07 17:06:13 +0800848
wangyouqiang84179c82024-01-05 15:42:55 +0800849 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800850}
851
852int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
853 qser_data_call_info_s *info, qser_data_call_error_e *err)
854{
wangyouqiang84179c82024-01-05 15:42:55 +0800855 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800856 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800857 //UNUSED(info);
858 //UNUSED(err);
b.liu5fa9e772023-11-23 18:00:55 +0800859
wangyouqiang84179c82024-01-05 15:42:55 +0800860 if(info == NULL || err == NULL)
861 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800862 LOGE("[qser_data] info or err is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800863 if(err != NULL)
864 {
865 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
866 }
867 return QSER_RESULT_FAIL;
868 }
869
870 if(qser_info_handle == NULL)
871 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800872 LOGE("[qser_data] handle is NULL.");
b.liuf37bd332024-03-18 13:51:24 +0800873 *err = QSER_DATA_CALL_ERROR_NO_INIT;
wangyouqiang84179c82024-01-05 15:42:55 +0800874 return QSER_RESULT_FAIL;
875 }
876
wangyouqiange2498f12024-01-06 17:55:36 +0800877 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800878 {
wangyouqiang3dcb3832024-04-24 15:22:50 +0800879#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +0800880 if(profile_idx == 0)
881 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800882 LOGE("[qser_data] profile_idx = 0.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800883 }
884 else
885#endif
886 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800887 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +0800888 *err = QSER_DATA_CALL_ERROR_IDX_NO_EXIST;
889 return QSER_RESULT_FAIL;
890 }
wangyouqiang84179c82024-01-05 15:42:55 +0800891 }
892
893 int ret = -1;
894 mbtk_ipv4_info_t ipv4;
895 mbtk_ipv6_info_t ipv6;
896#ifdef QSER_TEST
897 char v4_buff[32] = {0};
898 char v6_buff[128] = {0};
899#endif
900 memset(info, 0, sizeof(qser_data_call_info_s));
901 ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
902 if(ret != 0)
903 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800904 LOGE("[qser_data] mbtk_data_call_state_get fail.[ret = %d]", ret);
b.liuf37bd332024-03-18 13:51:24 +0800905 if(ret == MBTK_INFO_ERR_CID_NO_EXIST)
906 {
907 *err = QSER_DATA_CALL_ERROR_PDP_NO_ACTIVATE;
908 }
909 else
910 {
911 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
912 }
wangyouqiang84179c82024-01-05 15:42:55 +0800913 return QSER_RESULT_FAIL;
914 }
915 else
916 {
917 info->profile_idx = profile_idx;
918 if(ipv4.valid)
919 {
920 info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
921 info->v4.state = QSER_DATA_CALL_CONNECTED;
922 sprintf(info->v4.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800923 info->v4.addr.ip.s_addr = ipv4.IPAddr;
924 info->v4.addr.pri_dns.s_addr = ipv4.PrimaryDNS;
925 info->v4.addr.sec_dns.s_addr = ipv4.SecondaryDNS;
926
wangyouqiang84179c82024-01-05 15:42:55 +0800927#ifdef QSER_TEST
wangyouqiangc42b85d2024-04-24 17:05:06 +0800928 //LOGE("[qser_data] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
wangyouqiang84179c82024-01-05 15:42:55 +0800929 if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800930 LOGE("[qser_data] IP error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800931 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800932 LOGE("[qser_data] IP : %s", v4_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800933 }
934 if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800935 LOGE("[qser_data] PrimaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800936 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800937 LOGE("[qser_data] PrimaryDNS : %s", v4_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800938 }
939 if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800940 LOGE("[qser_data] SecondaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800941 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800942 LOGE("[qser_data] SecondaryDNS : %s", v4_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800943 }
944#endif
945 }
946
947 if(ipv6.valid)
948 {
949 info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
950 info->v6.state = QSER_DATA_CALL_CONNECTED;
951 sprintf(info->v6.name, "ccinet%d", profile_idx);
b.liuf37bd332024-03-18 13:51:24 +0800952 memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), sizeof(ipv6.IPV6Addr));
953 memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), sizeof(ipv6.PrimaryDNS));
954 memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), sizeof(ipv6.SecondaryDNS));
wangyouqiang84179c82024-01-05 15:42:55 +0800955#ifdef QSER_TEST
956 if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
957 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800958 LOGE("[qser_data] IP error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800959 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800960 LOGE("[qser_data] IP : %s", v6_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800961 }
962 if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
963 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800964 LOGE("[qser_data] PrimaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800965 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800966 LOGE("[qser_data] PrimaryDNS : %s", v6_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800967 }
968 if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
969 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800970 LOGE("[qser_data] SecondaryDNS error.");
wangyouqiang84179c82024-01-05 15:42:55 +0800971 } else {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800972 LOGE("[qser_data] SecondaryDNS : %s", v6_buff);
wangyouqiang84179c82024-01-05 15:42:55 +0800973 }
974#endif
975 }
976
977 if(ipv4.valid && ipv6.valid)
978 {
979 info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
980 }
981
982 if(!ipv4.valid && !ipv6.valid)
983 {
984 info->v4.state = QSER_DATA_CALL_DISCONNECTED;
985 info->v6.state = QSER_DATA_CALL_DISCONNECTED;
986 }
987 }
988
989 *err = QSER_DATA_CALL_ERROR_NONE;
990 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800991}
992
993int qser_apn_set(qser_apn_info_s *apn)
994{
wangyouqiang84179c82024-01-05 15:42:55 +0800995 //UNUSED(apn);
996 if(qser_info_handle == NULL)
997 {
wangyouqiangc42b85d2024-04-24 17:05:06 +0800998 LOGE("[qser_data] handle is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +0800999 return QSER_RESULT_FAIL;
1000 }
1001
1002 if(apn == NULL)
1003 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001004 LOGE("[qser_data] apn param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001005 return QSER_RESULT_FAIL;
1006 }
b.liu5fa9e772023-11-23 18:00:55 +08001007
wangyouqiange2498f12024-01-06 17:55:36 +08001008 if(qser_check_profile_idx(apn->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001009 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001010 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +08001011 return QSER_RESULT_FAIL;
1012 }
1013
1014 if(strlen(apn->apn_name) == 0)
1015 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001016 LOGE("[qser_data] apn_name is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001017 return QSER_RESULT_FAIL;
1018 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001019
1020#if 0
1021 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1022 {
1023 if(qser_apn_default_idx > -1)
1024 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001025 LOGE("[qser_data] iot_default is exist.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001026 return QSER_RESULT_FAIL;
1027 }
1028 }
1029#endif
1030
r.xiaof6ec4822024-04-03 02:46:00 -07001031 /*add name and type verify*/
1032 if (qser_check_apn_name_type(apn) < 0)
1033 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001034 LOGE("[qser_data] check param error.");
r.xiaof6ec4822024-04-03 02:46:00 -07001035 return QSER_RESULT_FAIL;
1036 }
wangyouqiang84179c82024-01-05 15:42:55 +08001037
1038 int ret = -1;
1039 char mbtk_auth[32]={0};
wangyouqiange2498f12024-01-06 17:55:36 +08001040 char qser_apn_type[32] = {0};
wangyouqiang84179c82024-01-05 15:42:55 +08001041 mbtk_ip_type_enum pdp_type = MBTK_IP_TYPE_IPV4V6;
r.xiaof6ec4822024-04-03 02:46:00 -07001042
wangyouqiang84179c82024-01-05 15:42:55 +08001043 if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
1044 {
1045 pdp_type = MBTK_IP_TYPE_IP;
1046 }
1047 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
1048 {
1049 pdp_type = MBTK_IP_TYPE_IPV6;
1050 }
1051 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
1052 {
1053 pdp_type = MBTK_IP_TYPE_IPV4V6;
1054 }
1055 else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
1056 {
1057 pdp_type = MBTK_IP_TYPE_PPP;
1058 }
1059 else
1060 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001061 LOGE("[qser_data] pdp_type error.");
wangyouqiang84179c82024-01-05 15:42:55 +08001062 return QSER_RESULT_FAIL;
1063 }
1064
1065 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE || apn->auth_proto == QSER_APN_AUTH_PROTO_DEFAULT)
1066 {
1067 memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
1068 }
1069 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP)
1070 {
1071 memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
1072 }
1073 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_CHAP)
1074 {
1075 memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
1076 }
1077 #if 0
1078 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
1079 {
1080 //NOT SUPPORT
1081 }
1082 #endif
1083 else
1084 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001085 LOGE("[qser_data] auth input error!");
wangyouqiang84179c82024-01-05 15:42:55 +08001086 return QSER_RESULT_FAIL;
1087 }
1088
1089 if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
1090 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001091 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 +08001092 }
1093 else
1094 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001095 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 +08001096 }
wangyouqiange2498f12024-01-06 17:55:36 +08001097
wangyouqiang84179c82024-01-05 15:42:55 +08001098 ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
1099 if(ret < 0)
1100 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001101 LOGE("[qser_data] mbtk_apn_set fail!");
wangyouqiang84179c82024-01-05 15:42:55 +08001102 return QSER_RESULT_FAIL;
1103 }
1104
wangyouqiange2498f12024-01-06 17:55:36 +08001105 sprintf(qser_apn_type, "persist.qser.apn.type%d", apn->profile_idx);
1106 property_set(qser_apn_type, apn->apn_type);
wangyouqianga24887d2024-04-08 18:31:23 +08001107 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE)
1108 {
1109 qser_apn_auth_state[apn->profile_idx] = '1';
1110 }
1111 else
1112 {
1113 qser_apn_auth_state[apn->profile_idx] = '0';
1114 }
1115 property_set("persist.qser.apn.auth", qser_apn_auth_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001116 memcpy(&qser_apn_info[apn->profile_idx], apn, sizeof(qser_apn_info_s));
wangyouqiang805b0f92024-04-07 17:06:13 +08001117
1118#if defined(MBTK_ALL_CID_SUPPORT)
wangyouqianga24887d2024-04-08 18:31:23 +08001119 if(strcmp(apn->apn_type, "iot_default") == 0)
wangyouqiang805b0f92024-04-07 17:06:13 +08001120 {
1121 qser_apn_add_save_state[apn->profile_idx] = '2';
1122 qser_apn_default_idx = apn->profile_idx;
1123 }
1124 else
1125#endif
1126 {
1127 qser_apn_add_save_state[apn->profile_idx] = '1';
1128 }
1129
wangyouqianga24887d2024-04-08 18:31:23 +08001130 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001131 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001132}
1133
1134int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
1135{
wangyouqiang84179c82024-01-05 15:42:55 +08001136 //UNUSED(profile_idx);
1137 //UNUSED(apn);
1138 if(qser_info_handle == NULL)
1139 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001140 LOGE("[qser_data] handle is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001141 return QSER_RESULT_FAIL;
1142 }
1143
1144 if(apn == NULL)
1145 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001146 LOGE("[qser_data] apn param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001147 return QSER_RESULT_FAIL;
1148 }
b.liu5fa9e772023-11-23 18:00:55 +08001149
wangyouqiange2498f12024-01-06 17:55:36 +08001150 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +08001151 {
wangyouqiang3dcb3832024-04-24 15:22:50 +08001152#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +08001153 if(profile_idx != 0)
1154#endif
1155 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001156 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001157 return QSER_RESULT_FAIL;
1158 }
wangyouqiang84179c82024-01-05 15:42:55 +08001159 }
1160
1161 //get apn info
1162 mbtk_apn_info_t apns[10] = {0};
1163 int apn_num = 10;
1164 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1165 if(ret != 0)
1166 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001167 LOGE("[qser_data] mbtk_apn_get fail. [ret = %d]",ret);
wangyouqiang84179c82024-01-05 15:42:55 +08001168 return QSER_RESULT_FAIL;
1169 }
1170 else
1171 {
1172 int i = 0;
1173 for(i = 0; i < apn_num; i++)
1174 {
1175 if(apns[i].cid == profile_idx + 1)
1176 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001177 LOGE("[qser_data] find IDX.");
wangyouqiang84179c82024-01-05 15:42:55 +08001178 break;
1179 }
1180 }
1181
1182 if(i == apn_num)
1183 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001184 LOGE("[qser_data] not find IDX.[apn_num = %d]", apn_num);
wangyouqiang84179c82024-01-05 15:42:55 +08001185 return QSER_RESULT_FAIL;
1186 }
1187
1188 if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
1189 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001190 LOGE("[qser_data] qser_apn_info_param_convert fail");
wangyouqiang84179c82024-01-05 15:42:55 +08001191 return QSER_RESULT_FAIL;
1192 }
1193 }
1194 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001195}
1196
1197int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
1198{
wangyouqiange2498f12024-01-06 17:55:36 +08001199 //UNUSED(apn);
1200 //UNUSED(profile_idx);
1201 if(qser_info_handle == NULL)
1202 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001203 LOGE("[qser_data] handle is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +08001204 return QSER_RESULT_FAIL;
1205 }
1206
1207 if(apn == NULL)
1208 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001209 LOGE("[qser_data] apn param is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +08001210 return QSER_RESULT_FAIL;
1211 }
b.liu5fa9e772023-11-23 18:00:55 +08001212
wangyouqiang805b0f92024-04-07 17:06:13 +08001213#if 0
b.liuf37bd332024-03-18 13:51:24 +08001214 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
1215 {
1216 if(qser_apn_default_idx > -1)
1217 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001218 LOGE("[qser_data] iot_default is exist.");
b.liuf37bd332024-03-18 13:51:24 +08001219 return QSER_RESULT_FAIL;
1220 }
1221 }
wangyouqiang805b0f92024-04-07 17:06:13 +08001222 /*add name and type verify*/
1223 if (qser_check_apn_name_type(apn) < 0)
1224 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001225 LOGE("[qser_data] check param error.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001226 return QSER_RESULT_FAIL;
1227 }
1228#endif
b.liuf37bd332024-03-18 13:51:24 +08001229
wangyouqiange2498f12024-01-06 17:55:36 +08001230 int ret = 0;
1231 char idx = qser_get_apn_profile_idx();
wangyouqiang805b0f92024-04-07 17:06:13 +08001232 if(idx > QSER_PROFILE_IDX_MAX)
wangyouqiange2498f12024-01-06 17:55:36 +08001233 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001234 LOGE("[qser_data] idx is full.");
wangyouqiange2498f12024-01-06 17:55:36 +08001235 return QSER_RESULT_FAIL;
1236 }
1237 else
1238 {
1239 qser_apn_info_state[idx] = TRUE;
1240 qser_apn_info_s set_apn;
1241 set_apn.profile_idx = idx;
1242 set_apn.pdp_type = apn->pdp_type;
1243 set_apn.auth_proto = apn->auth_proto;
1244 memcpy(set_apn.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
1245 memcpy(set_apn.username, apn->username, QSER_APN_USERNAME_SIZE);
1246 memcpy(set_apn.password, apn->password, QSER_APN_PASSWORD_SIZE);
1247 memcpy(set_apn.apn_type, apn->apn_type, QSER_APN_NAME_SIZE);
1248 ret = qser_apn_set(&set_apn);
1249 if(ret != 0)
1250 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001251 LOGE("[qser_data] qser_apn_set fail.");
wangyouqiange2498f12024-01-06 17:55:36 +08001252 qser_apn_info_state[idx] = FALSE;
1253 return QSER_RESULT_FAIL;
1254 }
1255 *profile_idx = idx;
wangyouqiange2498f12024-01-06 17:55:36 +08001256 }
1257 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001258}
1259
1260int qser_apn_del(unsigned char profile_idx)
1261{
liuyang0e49d9a2024-04-23 21:04:54 +08001262 int ret = 0;
1263
wangyouqiange2498f12024-01-06 17:55:36 +08001264 //UNUSED(profile_idx);
1265 if(qser_info_handle == NULL)
1266 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001267 LOGE("[qser_data] handle is NULL.");
wangyouqiange2498f12024-01-06 17:55:36 +08001268 return QSER_RESULT_FAIL;
1269 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001270
1271 if(qser_idx_pdp_state[profile_idx] == true)
1272 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001273 LOGE("[qser_data] profile_idx[%d] open pdp.", profile_idx);
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001274 return QSER_RESULT_FAIL;
1275 }
b.liu5fa9e772023-11-23 18:00:55 +08001276
wangyouqiange2498f12024-01-06 17:55:36 +08001277 if(qser_check_profile_idx(profile_idx) < 0)
1278 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001279 LOGE("[qser_data] profile_idx is invalid.");
wangyouqiange2498f12024-01-06 17:55:36 +08001280 return QSER_RESULT_FAIL;
1281 }
1282
liuyang0e49d9a2024-04-23 21:04:54 +08001283 ret = mbtk_apn_del(qser_info_handle, profile_idx);
1284
1285 if(ret < 0)
1286 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001287 LOGE("[qser_data] mbtk_apn_del fail!");
liuyang0e49d9a2024-04-23 21:04:54 +08001288 return QSER_RESULT_FAIL;
1289 }
1290
wangyouqiange2498f12024-01-06 17:55:36 +08001291 qser_apn_info_state[profile_idx] = FALSE;
1292 qser_apn_add_save_state[profile_idx] = '0';
b.liuf37bd332024-03-18 13:51:24 +08001293
1294#if defined(MBTK_ALL_CID_SUPPORT)
1295 if(profile_idx == qser_apn_default_idx)
1296 {
1297 qser_apn_default_idx = -1;
1298 }
1299#endif
1300
wangyouqiange2498f12024-01-06 17:55:36 +08001301 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
1302 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001303}
1304
1305int qser_apn_get_list(qser_apn_info_list_s *apn_list)
1306{
wangyouqiang84179c82024-01-05 15:42:55 +08001307 //UNUSED(apn_list);
b.liu5fa9e772023-11-23 18:00:55 +08001308
wangyouqiang84179c82024-01-05 15:42:55 +08001309 if(qser_info_handle == NULL)
1310 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001311 LOGE("[qser_data] handle is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001312 return QSER_RESULT_FAIL;
1313 }
1314
1315 if(apn_list == NULL)
1316 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001317 LOGE("[qser_data] apn_list param is NULL.");
wangyouqiang84179c82024-01-05 15:42:55 +08001318 return QSER_RESULT_FAIL;
1319 }
1320
wangyouqiange2498f12024-01-06 17:55:36 +08001321 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
wangyouqiangc42b85d2024-04-24 17:05:06 +08001322 LOGE("[qser_data] qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +08001323 mbtk_apn_info_t apns[10] = {0};
1324 int apn_num = 10;
1325 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
1326 if(ret != 0)
1327 {
wangyouqiangc1d72d22024-04-25 10:15:58 +08001328 if(ret == MBTK_INFO_ERR_NO_APN)
1329 {
1330 apn_list->cnt = 0;
1331 return QSER_RESULT_SUCCESS;
1332 }
wangyouqiangc42b85d2024-04-24 17:05:06 +08001333 LOGE("[qser_data] mbtk_apn_get fail. [ret = %d]",ret);
wangyouqiang84179c82024-01-05 15:42:55 +08001334 return QSER_RESULT_FAIL;
1335 }
1336 else
1337 {
1338 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
1339 {
1340 int i = 0;
wangyouqiange2498f12024-01-06 17:55:36 +08001341 apn_list->cnt = 0;
wangyouqiang84179c82024-01-05 15:42:55 +08001342 for(i = 0; i < apn_num; i++)
1343 {
wangyouqiange2498f12024-01-06 17:55:36 +08001344 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
1345 {
wangyouqiang3dcb3832024-04-24 15:22:50 +08001346#if defined(MBTK_ALL_CID_SUPPORT) && !defined(MBTK_SG_SUPPORT)
wangyouqiang805b0f92024-04-07 17:06:13 +08001347 if((apns[i].cid - 1) != 0)
1348#endif
1349 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001350 LOGE("[qser_data] idx no open.");
wangyouqiang805b0f92024-04-07 17:06:13 +08001351 continue;
1352 }
wangyouqiange2498f12024-01-06 17:55:36 +08001353 }
wangyouqiang8ebeafe2024-04-15 10:07:44 +08001354 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 +08001355 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001356 LOGE("[qser_data] qser_apn_info_param_convert fail");
wangyouqiang84179c82024-01-05 15:42:55 +08001357 return QSER_RESULT_FAIL;
1358 }
wangyouqiange2498f12024-01-06 17:55:36 +08001359 apn_list->cnt++;
wangyouqiang84179c82024-01-05 15:42:55 +08001360 }
wangyouqiang84179c82024-01-05 15:42:55 +08001361 }
1362 else if(apn_num > QSER_APN_MAX_LIST)
1363 {
wangyouqiangc42b85d2024-04-24 17:05:06 +08001364 LOGE("[qser_data] apn_num overlong");
wangyouqiang84179c82024-01-05 15:42:55 +08001365 return QSER_RESULT_FAIL;
1366 }
1367 else
1368 {
1369 apn_list->cnt = 0;
1370 }
1371 }
1372 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +08001373}
wangyouqiang84179c82024-01-05 15:42:55 +08001374/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +08001375