blob: 88f20742a3e8df7b198e038ed635d8add4e46011 [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>
wangyouqiang84179c82024-01-05 15:42:55 +08008/****************************DEFINE***************************************/
9#define QSER_RESULT_SUCCESS 0
10#define QSER_RESULT_FAIL -1
b.liu5fa9e772023-11-23 18:00:55 +080011
wangyouqiange2498f12024-01-06 17:55:36 +080012#define QSER_APN_NUM 8
wangyouqiang84179c82024-01-05 15:42:55 +080013//default range: 0 - 7
14//AT+CGACT range: 1 - 8
15//1 default IDX, 8 IMS IDX
16#define QSER_PROFILE_IDX_MIN 1
17#define QSER_PROFILE_IDX_MAX 6
wangyouqiange2498f12024-01-06 17:55:36 +080018
wangyouqiang84179c82024-01-05 15:42:55 +080019/****************************DEFINE***************************************/
20
21/****************************VARIABLE***************************************/
22mbtk_info_handle_t* qser_info_handle = NULL;
23int qser_info_handle_num = 0;
24static bool inited = FALSE;
25static qser_data_call_evt_cb_t qser_net_status_cb = NULL;
wangyouqiange2498f12024-01-06 17:55:36 +080026static qser_apn_info_s qser_apn_info[QSER_APN_NUM] = {0};
27static bool qser_apn_info_state[QSER_APN_NUM] = {0};
28static char qser_apn_add_save_state[QSER_APN_NUM + 1] = {0};
29static qser_data_call_s qser_data_backup;
30int now_idx = 0;
wangyouqiang84179c82024-01-05 15:42:55 +080031/****************************VARIABLE***************************************/
32
33/******************************FUNC*****************************************/
wangyouqiange2498f12024-01-06 17:55:36 +080034char qser_get_apn_profile_idx(void)
35{
36 char i = 0;
37 for(i = QSER_PROFILE_IDX_MIN; i < 8; i++)
38 {
39 if(qser_apn_info_state[i] == FALSE)
40 {
41 return i;
42 }
43 }
44
45 return i;
46}
47
48int qser_check_profile_idx(unsigned char profile_idx)
49{
50 if(profile_idx < QSER_PROFILE_IDX_MIN || profile_idx > QSER_PROFILE_IDX_MAX)
51 {
52 LOGE("[qser_data_call] IDX range error.");
53 return QSER_RESULT_FAIL;
54 }
55
56 if(qser_apn_info_state[profile_idx] != TRUE)
57 {
58 LOGE("[qser_data_call] profile_idx is not exist.");
59 return QSER_RESULT_FAIL;
60 }
61
62 return QSER_RESULT_SUCCESS;
63}
64
wangyouqiang84179c82024-01-05 15:42:55 +080065int qser_apn_info_param_convert(int profile_idx, qser_apn_info_s *new_apn, mbtk_apn_info_t *old_apn)
66{
67 if(new_apn == NULL || old_apn == NULL)
68 {
69 LOGE("[qser_data_call] qser_apn_info_param_convert apn param is NULL.");
70 return QSER_RESULT_FAIL;
71 }
72
73 //get ip type
74 if(old_apn->ip_type == MBTK_IP_TYPE_IPV4V6) // IPV4V6
75 {
76 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4V6;
77 }
78 else if(old_apn->ip_type == MBTK_IP_TYPE_IP) // IPV4
79 {
80 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4;
81 }
82 else if(old_apn->ip_type == MBTK_IP_TYPE_IPV6) // IPV6
83 {
84 new_apn->pdp_type = QSER_APN_PDP_TYPE_IPV6;
85 }
86 else
87 {
88 new_apn->pdp_type = QSER_APN_PDP_TYPE_PPP;
89 }
90
91 //get apn name
92 if(strlen(old_apn->apn)+1 > QSER_APN_NAME_SIZE)
93 {
94 LOGE("[qser_data_call] apn_nmea length verylong.");
95 return QSER_RESULT_FAIL;
96 }
97 else
98 {
99 if(strlen(old_apn->apn) > 0)
100 {
101 memcpy(new_apn->apn_name, old_apn->apn,strlen(old_apn->apn)+1);
102 }
103 else
104 {
105 memset(new_apn->apn_name, 0x0, QSER_APN_NAME_SIZE);
106 }
107 }
108
109 //get apn user
110 if(strlen(old_apn->user)+1 > QSER_APN_USERNAME_SIZE)
111 {
112 LOGE("[qser_data_call] apn_user length verylong.");
113 return QSER_RESULT_FAIL;
114 }
115 else
116 {
117 if(strlen(old_apn->user) > 0)
118 {
119 memcpy(new_apn->username, old_apn->user, strlen(old_apn->user)+1);
120 }
121 else
122 {
123 memset(new_apn->username , 0x0, QSER_APN_USERNAME_SIZE);
124 }
125 }
126
127 //get apn password
128 if(strlen(old_apn->pass)+1 > QSER_APN_PASSWORD_SIZE)
129 {
130 LOGE("[qser_data_call] apn_password length verylong.");
131 return QSER_RESULT_FAIL;
132 }
133 else
134 {
135 if(strlen(old_apn->pass) > 0)
136 {
137 memcpy(new_apn->password, old_apn->pass, strlen(old_apn->pass)+1);
138 }
139 else
140 {
141 memset(new_apn->username , 0x0, QSER_APN_PASSWORD_SIZE);
142 }
143 }
144
145 //get apn proto
146 if(strlen(old_apn->auth) > 0)
147 {
148 if(strcmp(old_apn->auth, "NONE") == 0)
149 {
150 new_apn->auth_proto = QSER_APN_AUTH_PROTO_NONE;
151 }
152 else if(strcmp(old_apn->auth, "PAP") == 0)
153 {
154 new_apn->auth_proto = QSER_APN_AUTH_PROTO_PAP;
155 }
156 else if(strcmp(old_apn->auth, "CHAP") == 0)
157 {
158 new_apn->auth_proto = QSER_APN_AUTH_PROTO_CHAP;
159 }
160 else
161 {
162 LOGE("[qser_data_call] auth input error!");
163 return QSER_RESULT_FAIL;
164 }
165 }
166
167 //get apn type
168 new_apn->profile_idx = profile_idx;
169 memset(new_apn->apn_type, 0x0, QSER_APN_NAME_SIZE);
170 if(strlen(qser_apn_info[profile_idx].apn_type) > 0)
171 {
172 memcpy(new_apn->apn_type, qser_apn_info[profile_idx].apn_type, strlen(qser_apn_info[profile_idx].apn_type));
173 }
174
175 return QSER_RESULT_SUCCESS;
176}
177
178void qser_wan_net_state_change_cb(const void* data, int data_len)
179{
180 if(data == NULL || data_len == 0)
181 {
182 return;
183 }
184
185 uint8 *net_data = NULL;
186 net_data = (uint8 *)data;
187
188 if(qser_net_status_cb != NULL)
189 {
wangyouqiange2498f12024-01-06 17:55:36 +0800190 qser_data_call_state_s state = {0};
191 state.profile_idx = now_idx;
192 state.ip_family = qser_apn_info[now_idx].pdp_type;
193 if((*net_data > 100 && *net_data < 200) || *net_data == 1)
194 {
195 state.state = QSER_DATA_CALL_CONNECTED;
196 state.err = QSER_DATA_CALL_ERROR_NONE;
197 }
198 else if(*net_data > 200)
199 {
200 state.state = QSER_DATA_CALL_DISCONNECTED;
201 state.err = QSER_DATA_CALL_ERROR_NONE;
202 }
203 else
204 {
205 return;
206 }
207
208 qser_net_status_cb(&state);
wangyouqiang84179c82024-01-05 15:42:55 +0800209 }
210}
wangyouqiange2498f12024-01-06 17:55:36 +0800211
212static void* data_call_async_thread(void* arg)
213{
214 qser_data_call_error_e err;
215 int ret = qser_data_call_start(&qser_data_backup, &err);
216 if(ret != QSER_RESULT_SUCCESS)
217 {
218 LOGE("[qser_data_call] qser_data_call_start() fail.");
219 }
220
221 return NULL;
222}
223
wangyouqiang84179c82024-01-05 15:42:55 +0800224/******************************FUNC*****************************************/
225
226/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +0800227int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
228{
wangyouqiang84179c82024-01-05 15:42:55 +0800229 //UNUSED(evt_cb);
230 if(!inited && qser_info_handle == NULL)
231 {
232 qser_info_handle = mbtk_info_handle_get();
233 if(qser_info_handle)
234 {
235 qser_info_handle_num++;
236 inited = TRUE;
237 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
238 }
239 else
240 {
241 LOGE("[qser_data_call] mbtk_info_handle_get() fail.");
242 return QSER_RESULT_FAIL;
243 }
244 }
245 else
246 {
247 if(!inited)
248 {
249 qser_info_handle_num++;
250 inited = TRUE;
251 mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
252 }
253 }
254 qser_net_status_cb = evt_cb;
b.liu5fa9e772023-11-23 18:00:55 +0800255
wangyouqiange2498f12024-01-06 17:55:36 +0800256 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
257 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
258 mbtk_apn_info_t apns[10] = {0};
259 int apn_num = 10;
260 char qser_apn_type[32] = {0};
261 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
262 if(ret != 0)
263 {
264 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
265 return QSER_RESULT_FAIL;
266 }
267 else
268 {
269 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
270 {
271 int i = 0;
272 for(i = 0; i < apn_num; i++)
273 {
274 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
275 {
276 LOGE("[qser_data_call] idx no open.");
277 continue;
278 }
279 if(qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]) != 0)
280 {
281 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
282 return QSER_RESULT_FAIL;
283 }
284 else
285 {
286 qser_apn_info_state[apns[i].cid - 1] = TRUE;
287 sprintf(qser_apn_type, "persist.qser.apn.type%d", apns[i].cid - 1);
288 property_get(qser_apn_type, qser_apn_info[apns[i].cid - 1].apn_type, NULL);
289 }
290 }
291 }
292 }
wangyouqiang84179c82024-01-05 15:42:55 +0800293 LOGE("[qser_data_call] mbtk_info_handle_get() success.");
294 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800295}
296
297void qser_data_call_destroy(void)
298{
wangyouqiang84179c82024-01-05 15:42:55 +0800299 if(qser_info_handle)
300 {
301 LOGE("qser_info_handle_num = %d", qser_info_handle_num);
302 if(qser_info_handle_num == 1)
303 { // 最后一个引用,可释放。
304 int ret = mbtk_info_handle_free(&qser_info_handle);
305 if(ret)
306 {
307 LOGE("[qser_data_call] mbtk_info_handle_free() fail.");
308 }
309 else
310 {
311 qser_info_handle_num = 0;
312 qser_info_handle = NULL;
313 inited = FALSE;
314 }
315 }
316 else
317 {
318 qser_info_handle_num--;
319 }
320 }
321 else
322 {
323 LOGE("[qser_data_call] handle not inited.");
324 }
b.liu5fa9e772023-11-23 18:00:55 +0800325}
326
327int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
328{
wangyouqiang84179c82024-01-05 15:42:55 +0800329 //UNUSED(data_call);
330 //UNUSED(err);
331 if(data_call == NULL || err == NULL)
332 {
333 LOGE("[qser_data_call] data_call or err is NULL.");
334 if(err != NULL)
335 {
336 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
337 }
338 return QSER_RESULT_FAIL;
339 }
340
341 if(qser_info_handle == NULL)
342 {
343 LOGE("[qser_data_call] handle is NULL.");
344 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
345 return QSER_RESULT_FAIL;
346 }
b.liu5fa9e772023-11-23 18:00:55 +0800347
wangyouqiange2498f12024-01-06 17:55:36 +0800348 if(qser_check_profile_idx(data_call->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800349 {
wangyouqiange2498f12024-01-06 17:55:36 +0800350 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800351 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
352 return QSER_RESULT_FAIL;
353 }
354
355 int ret = -1;
356 ret = mbtk_data_call_start(qser_info_handle, data_call->profile_idx + 1, 0, FALSE, 0);
357 if(ret != 0)
358 {
359 LOGE("[qser_data_call] mbtk_data_call_start fail.[ret = %d]", ret);
360 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
361 return QSER_RESULT_FAIL;
362 }
363 else
364 {
365 *err = QSER_DATA_CALL_ERROR_NONE;
366 }
wangyouqiange2498f12024-01-06 17:55:36 +0800367
368 now_idx = data_call->profile_idx;
369 return QSER_RESULT_SUCCESS;
370}
371
372int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
373{
374 //UNUSED(data_call);
375 UNUSED(err);
376 if(data_call == NULL || err == NULL)
377 {
378 LOGE("[qser_data_call] data_call or err is NULL.");
379 if(err != NULL)
380 {
381 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
382 }
383 return QSER_RESULT_FAIL;
384 }
385
386 if(qser_info_handle == NULL)
387 {
388 LOGE("[qser_data_call] handle is NULL.");
389 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
390 return QSER_RESULT_FAIL;
391 }
392
393 if(qser_check_profile_idx(data_call->profile_idx) < 0)
394 {
395 LOGE("[qser_data_call] profile_idx is invalid.");
396 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
397 return QSER_RESULT_FAIL;
398 }
399
400 pthread_attr_t thread_attr;
401 pthread_t data_call_thread_id;
402 pthread_attr_init(&thread_attr);
403 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
404 {
405 LOGE("[qser_data_call] pthread_attr_setdetachstate() fail.");
406 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
407 return QSER_RESULT_FAIL;
408 }
409
410 memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
411 if(pthread_create(&data_call_thread_id, &thread_attr, data_call_async_thread, NULL))
412 {
413 LOGE("[qser_data_call] pthread_create() fail.");
414 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
415 return QSER_RESULT_FAIL;
416 }
417 pthread_attr_destroy(&thread_attr);
418 now_idx = data_call->profile_idx;
419
wangyouqiang84179c82024-01-05 15:42:55 +0800420 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800421}
422
423int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
424{
wangyouqiang84179c82024-01-05 15:42:55 +0800425 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800426 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800427 //UNUSED(err);
428 if(err == NULL)
429 {
430 LOGE("[qser_data_call] err is NULL.");
431 return QSER_RESULT_FAIL;
432 }
b.liu5fa9e772023-11-23 18:00:55 +0800433
wangyouqiang84179c82024-01-05 15:42:55 +0800434 if(qser_info_handle == NULL)
435 {
436 LOGE("[qser_data_call] handle is NULL.");
437 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
438 return QSER_RESULT_FAIL;
439 }
440
wangyouqiange2498f12024-01-06 17:55:36 +0800441 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800442 {
wangyouqiange2498f12024-01-06 17:55:36 +0800443 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800444 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
445 return QSER_RESULT_FAIL;
446 }
447
448 int ret = -1;
449 ret = mbtk_data_call_stop(qser_info_handle, profile_idx + 1, 15);
450 if(ret != 0)
451 {
452 LOGE("[qser_data_call] mbtk_data_call_stop fail.[ret = %d]", ret);
453 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
454 return QSER_RESULT_FAIL;
455 }
456 else
457 {
458 *err = QSER_DATA_CALL_ERROR_NONE;
459 }
wangyouqiange2498f12024-01-06 17:55:36 +0800460
461 now_idx = 0;
wangyouqiang84179c82024-01-05 15:42:55 +0800462 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800463}
464
465int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
466 qser_data_call_info_s *info, qser_data_call_error_e *err)
467{
wangyouqiang84179c82024-01-05 15:42:55 +0800468 //UNUSED(profile_idx);
b.liu5fa9e772023-11-23 18:00:55 +0800469 UNUSED(ip_family);
wangyouqiang84179c82024-01-05 15:42:55 +0800470 //UNUSED(info);
471 //UNUSED(err);
b.liu5fa9e772023-11-23 18:00:55 +0800472
wangyouqiang84179c82024-01-05 15:42:55 +0800473 if(info == NULL || err == NULL)
474 {
475 LOGE("[qser_data_call] info or err is NULL.");
476 if(err != NULL)
477 {
478 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
479 }
480 return QSER_RESULT_FAIL;
481 }
482
483 if(qser_info_handle == NULL)
484 {
485 LOGE("[qser_data_call] handle is NULL.");
486 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
487 return QSER_RESULT_FAIL;
488 }
489
wangyouqiange2498f12024-01-06 17:55:36 +0800490 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800491 {
wangyouqiange2498f12024-01-06 17:55:36 +0800492 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800493 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
494 return QSER_RESULT_FAIL;
495 }
496
497 int ret = -1;
498 mbtk_ipv4_info_t ipv4;
499 mbtk_ipv6_info_t ipv6;
500#ifdef QSER_TEST
501 char v4_buff[32] = {0};
502 char v6_buff[128] = {0};
503#endif
504 memset(info, 0, sizeof(qser_data_call_info_s));
505 ret = mbtk_data_call_state_get(qser_info_handle, profile_idx + 1, &ipv4, &ipv6);
506 if(ret != 0)
507 {
508 LOGE("[qser_data_call] mbtk_data_call_state_get fail.[ret = %d]", ret);
509 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
510 return QSER_RESULT_FAIL;
511 }
512 else
513 {
514 info->profile_idx = profile_idx;
515 if(ipv4.valid)
516 {
517 info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
518 info->v4.state = QSER_DATA_CALL_CONNECTED;
519 sprintf(info->v4.name, "ccinet%d", profile_idx);
520 memcpy(&(info->v4.addr.ip), &(ipv4.IPAddr), 32);
521 memcpy(&(info->v4.addr.pri_dns), &(ipv4.PrimaryDNS), 32);
522 memcpy(&(info->v4.addr.sec_dns), &(ipv4.SecondaryDNS), 32);
523#ifdef QSER_TEST
524 if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
525 LOGE("[qser_data_call] IP error.");
526 } else {
527 LOGE("[qser_data_call] IP : %s", v4_buff);
528 }
529 if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
530 LOGE("[qser_data_call] PrimaryDNS error.");
531 } else {
532 LOGE("[qser_data_call] PrimaryDNS : %s", v4_buff);
533 }
534 if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
535 LOGE("[qser_data_call] SecondaryDNS error.");
536 } else {
537 LOGE("[qser_data_call] SecondaryDNS : %s", v4_buff);
538 }
539#endif
540 }
541
542 if(ipv6.valid)
543 {
544 info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
545 info->v6.state = QSER_DATA_CALL_CONNECTED;
546 sprintf(info->v6.name, "ccinet%d", profile_idx);
547 memcpy(&(info->v6.addr.ip), &(ipv6.IPV6Addr), 128);
548 memcpy(&(info->v6.addr.pri_dns), &(ipv6.PrimaryDNS), 128);
549 memcpy(&(info->v6.addr.sec_dns), &(ipv6.SecondaryDNS), 128);
550#ifdef QSER_TEST
551 if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
552 {
553 LOGE("[qser_data_call] IP error.");
554 } else {
555 LOGE("[qser_data_call] IP : %s", v6_buff);
556 }
557 if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
558 {
559 LOGE("[qser_data_call] PrimaryDNS error.");
560 } else {
561 LOGE("[qser_data_call] PrimaryDNS : %s", v6_buff);
562 }
563 if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
564 {
565 LOGE("[qser_data_call] SecondaryDNS error.");
566 } else {
567 LOGE("[qser_data_call] SecondaryDNS : %s", v6_buff);
568 }
569#endif
570 }
571
572 if(ipv4.valid && ipv6.valid)
573 {
574 info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
575 }
576
577 if(!ipv4.valid && !ipv6.valid)
578 {
579 info->v4.state = QSER_DATA_CALL_DISCONNECTED;
580 info->v6.state = QSER_DATA_CALL_DISCONNECTED;
581 }
582 }
583
584 *err = QSER_DATA_CALL_ERROR_NONE;
585 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800586}
587
588int qser_apn_set(qser_apn_info_s *apn)
589{
wangyouqiang84179c82024-01-05 15:42:55 +0800590 //UNUSED(apn);
591 if(qser_info_handle == NULL)
592 {
593 LOGE("[qser_data_call] handle is NULL.");
594 return QSER_RESULT_FAIL;
595 }
596
597 if(apn == NULL)
598 {
599 LOGE("[qser_data_call] apn param is NULL.");
600 return QSER_RESULT_FAIL;
601 }
b.liu5fa9e772023-11-23 18:00:55 +0800602
wangyouqiange2498f12024-01-06 17:55:36 +0800603 if(qser_check_profile_idx(apn->profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800604 {
wangyouqiange2498f12024-01-06 17:55:36 +0800605 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800606 return QSER_RESULT_FAIL;
607 }
608
609 if(strlen(apn->apn_name) == 0)
610 {
611 LOGE("[qser_data_call] apn_name is NULL.");
612 return QSER_RESULT_FAIL;
613 }
614
wangyouqiange2498f12024-01-06 17:55:36 +0800615 if(memcmp(apn->apn_type, "iot_default", strlen("iot_default")) == 0)
616 {
617 LOGE("[qser_data_call] iot_default is exist.");
618 return QSER_RESULT_FAIL;
619 }
620
wangyouqiang84179c82024-01-05 15:42:55 +0800621 int ret = -1;
622 char mbtk_auth[32]={0};
wangyouqiange2498f12024-01-06 17:55:36 +0800623 char qser_apn_type[32] = {0};
wangyouqiang84179c82024-01-05 15:42:55 +0800624 mbtk_ip_type_enum pdp_type = MBTK_IP_TYPE_IPV4V6;
625
626 if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
627 {
628 pdp_type = MBTK_IP_TYPE_IP;
629 }
630 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
631 {
632 pdp_type = MBTK_IP_TYPE_IPV6;
633 }
634 else if(apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
635 {
636 pdp_type = MBTK_IP_TYPE_IPV4V6;
637 }
638 else if(apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
639 {
640 pdp_type = MBTK_IP_TYPE_PPP;
641 }
642 else
643 {
644 LOGE("[qser_data_call] pdp_type error.");
645 return QSER_RESULT_FAIL;
646 }
647
648 if(apn->auth_proto == QSER_APN_AUTH_PROTO_NONE || apn->auth_proto == QSER_APN_AUTH_PROTO_DEFAULT)
649 {
650 memcpy(mbtk_auth,"NONE",strlen("NONE")+1);
651 }
652 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP)
653 {
654 memcpy(mbtk_auth,"PAP",strlen("PAP")+1);
655 }
656 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_CHAP)
657 {
658 memcpy(mbtk_auth,"CHAP",strlen("CHAP")+1);
659 }
660 #if 0
661 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
662 {
663 //NOT SUPPORT
664 }
665 #endif
666 else
667 {
668 LOGE("[qser_data_call] auth input error!");
669 return QSER_RESULT_FAIL;
670 }
671
672 if(strlen(apn->username) > 0 && strlen(apn->password) > 0)
673 {
674 LOGE("[qser_data_call] setapn: %d, %d, %s, %s, %s, %s, %s.",apn->profile_idx, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth, apn->apn_type);
675 }
676 else
677 {
678 LOGE("[qser_data_call] setapn: %d, %d, %s, NULL, NULL, %s, %s.",apn->profile_idx, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth, apn->apn_type);
679 }
wangyouqiange2498f12024-01-06 17:55:36 +0800680
wangyouqiang84179c82024-01-05 15:42:55 +0800681 ret = mbtk_apn_set(qser_info_handle, apn->profile_idx + 1, pdp_type, apn->apn_name, apn->username, apn->password, mbtk_auth);
682 if(ret < 0)
683 {
684 LOGE("[qser_data_call] mbtk_apn_set fail!");
685 return QSER_RESULT_FAIL;
686 }
687
wangyouqiange2498f12024-01-06 17:55:36 +0800688 sprintf(qser_apn_type, "persist.qser.apn.type%d", apn->profile_idx);
689 property_set(qser_apn_type, apn->apn_type);
wangyouqiang84179c82024-01-05 15:42:55 +0800690 memcpy(&qser_apn_info[apn->profile_idx], apn, sizeof(qser_apn_info_s));
691 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800692}
693
694int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
695{
wangyouqiang84179c82024-01-05 15:42:55 +0800696 //UNUSED(profile_idx);
697 //UNUSED(apn);
698 if(qser_info_handle == NULL)
699 {
700 LOGE("[qser_data_call] handle is NULL.");
701 return QSER_RESULT_FAIL;
702 }
703
704 if(apn == NULL)
705 {
706 LOGE("[qser_data_call] apn param is NULL.");
707 return QSER_RESULT_FAIL;
708 }
b.liu5fa9e772023-11-23 18:00:55 +0800709
wangyouqiange2498f12024-01-06 17:55:36 +0800710 if(qser_check_profile_idx(profile_idx) < 0)
wangyouqiang84179c82024-01-05 15:42:55 +0800711 {
wangyouqiange2498f12024-01-06 17:55:36 +0800712 LOGE("[qser_data_call] profile_idx is invalid.");
wangyouqiang84179c82024-01-05 15:42:55 +0800713 return QSER_RESULT_FAIL;
714 }
715
716 //get apn info
717 mbtk_apn_info_t apns[10] = {0};
718 int apn_num = 10;
719 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
720 if(ret != 0)
721 {
722 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
723 return QSER_RESULT_FAIL;
724 }
725 else
726 {
727 int i = 0;
728 for(i = 0; i < apn_num; i++)
729 {
730 if(apns[i].cid == profile_idx + 1)
731 {
732 LOGE("[qser_data_call] find IDX.");
733 break;
734 }
735 }
736
737 if(i == apn_num)
738 {
739 LOGE("[qser_data_call] not find IDX.[apn_num = %d]", apn_num);
740 return QSER_RESULT_FAIL;
741 }
742
743 if(qser_apn_info_param_convert(profile_idx, apn, &apns[i]) != 0)
744 {
745 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
746 return QSER_RESULT_FAIL;
747 }
748 }
749 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800750}
751
752int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
753{
wangyouqiange2498f12024-01-06 17:55:36 +0800754 //UNUSED(apn);
755 //UNUSED(profile_idx);
756 if(qser_info_handle == NULL)
757 {
758 LOGE("[qser_data_call] handle is NULL.");
759 return QSER_RESULT_FAIL;
760 }
761
762 if(apn == NULL)
763 {
764 LOGE("[qser_data_call] apn param is NULL.");
765 return QSER_RESULT_FAIL;
766 }
b.liu5fa9e772023-11-23 18:00:55 +0800767
wangyouqiange2498f12024-01-06 17:55:36 +0800768 int ret = 0;
769 char idx = qser_get_apn_profile_idx();
770 if(idx >= 8)
771 {
772 LOGE("[qser_data_call] idx is full.");
773 return QSER_RESULT_FAIL;
774 }
775 else
776 {
777 qser_apn_info_state[idx] = TRUE;
778 qser_apn_info_s set_apn;
779 set_apn.profile_idx = idx;
780 set_apn.pdp_type = apn->pdp_type;
781 set_apn.auth_proto = apn->auth_proto;
782 memcpy(set_apn.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
783 memcpy(set_apn.username, apn->username, QSER_APN_USERNAME_SIZE);
784 memcpy(set_apn.password, apn->password, QSER_APN_PASSWORD_SIZE);
785 memcpy(set_apn.apn_type, apn->apn_type, QSER_APN_NAME_SIZE);
786 ret = qser_apn_set(&set_apn);
787 if(ret != 0)
788 {
789 LOGE("[qser_data_call] qser_apn_set fail.");
790 qser_apn_info_state[idx] = FALSE;
791 return QSER_RESULT_FAIL;
792 }
793 *profile_idx = idx;
794 qser_apn_add_save_state[idx] = '1';
795 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
796 }
797 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800798}
799
800int qser_apn_del(unsigned char profile_idx)
801{
wangyouqiange2498f12024-01-06 17:55:36 +0800802 //UNUSED(profile_idx);
803 if(qser_info_handle == NULL)
804 {
805 LOGE("[qser_data_call] handle is NULL.");
806 return QSER_RESULT_FAIL;
807 }
b.liu5fa9e772023-11-23 18:00:55 +0800808
wangyouqiange2498f12024-01-06 17:55:36 +0800809 if(qser_check_profile_idx(profile_idx) < 0)
810 {
811 LOGE("[qser_data_call] profile_idx is invalid.");
812 return QSER_RESULT_FAIL;
813 }
814
815 qser_apn_info_state[profile_idx] = FALSE;
816 qser_apn_add_save_state[profile_idx] = '0';
817 property_set("persist.qser.datacall.apn", qser_apn_add_save_state);
818 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800819}
820
821int qser_apn_get_list(qser_apn_info_list_s *apn_list)
822{
wangyouqiang84179c82024-01-05 15:42:55 +0800823 //UNUSED(apn_list);
b.liu5fa9e772023-11-23 18:00:55 +0800824
wangyouqiang84179c82024-01-05 15:42:55 +0800825 if(qser_info_handle == NULL)
826 {
827 LOGE("[qser_data_call] handle is NULL.");
828 return QSER_RESULT_FAIL;
829 }
830
831 if(apn_list == NULL)
832 {
833 LOGE("[qser_data_call] apn_list param is NULL.");
834 return QSER_RESULT_FAIL;
835 }
836
wangyouqiange2498f12024-01-06 17:55:36 +0800837 property_get("persist.qser.datacall.apn", qser_apn_add_save_state, "00000000");
838 LOGE("[qser_data_call] qser_apn_add_save_state = %s", qser_apn_add_save_state);
wangyouqiang84179c82024-01-05 15:42:55 +0800839 mbtk_apn_info_t apns[10] = {0};
840 int apn_num = 10;
841 int ret = mbtk_apn_get(qser_info_handle, &apn_num, apns);
842 if(ret != 0)
843 {
844 LOGE("[qser_data_call] mbtk_apn_get fail. [ret = %d]",ret);
845 return QSER_RESULT_FAIL;
846 }
847 else
848 {
849 if(apn_num > 0 && apn_num <= QSER_APN_MAX_LIST)
850 {
851 int i = 0;
wangyouqiange2498f12024-01-06 17:55:36 +0800852 apn_list->cnt = 0;
wangyouqiang84179c82024-01-05 15:42:55 +0800853 for(i = 0; i < apn_num; i++)
854 {
wangyouqiange2498f12024-01-06 17:55:36 +0800855 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
856 {
857 LOGE("[qser_data_call] idx no open.");
858 continue;
859 }
wangyouqiang84179c82024-01-05 15:42:55 +0800860 if(qser_apn_info_param_convert(apns[i].cid - 1, &apn_list->apn[i], &apns[i]) != 0)
861 {
862 LOGE("[qser_data_call] qser_apn_info_param_convert fail");
863 return QSER_RESULT_FAIL;
864 }
wangyouqiange2498f12024-01-06 17:55:36 +0800865 apn_list->cnt++;
wangyouqiang84179c82024-01-05 15:42:55 +0800866 }
wangyouqiang84179c82024-01-05 15:42:55 +0800867 }
868 else if(apn_num > QSER_APN_MAX_LIST)
869 {
870 LOGE("[qser_data_call] apn_num overlong");
871 return QSER_RESULT_FAIL;
872 }
873 else
874 {
875 apn_list->cnt = 0;
876 }
877 }
878 return QSER_RESULT_SUCCESS;
b.liu5fa9e772023-11-23 18:00:55 +0800879}
wangyouqiang84179c82024-01-05 15:42:55 +0800880/****************************API***************************************/
b.liu5fa9e772023-11-23 18:00:55 +0800881