blob: 94bf0089f8ccae953fe3e57de932261f713920ab [file] [log] [blame]
b.liud440f9f2025-04-18 10:44:31 +08001/*-----------------------------------------------------------------------------------------------*/
2/**
3 @file lynq_data_call.c
4 @brief data call service API
5*/
6/*-----------------------------------------------------------------------------------------------*/
7
8/*-------------------------------------------------------------------------------------------------
9 Copyright (c) 2024 mobiletek Wireless Solution, Co., Ltd. All Rights Reserved.
10 mobiletek Wireless Solution Proprietary and Confidential.
11-------------------------------------------------------------------------------------------------*/
12
13/*-------------------------------------------------------------------------------------------------
14 EDIT HISTORY
15 This section contains comments describing changes made to the file.
16 Notice that changes are listed in reverse chronological order.
17 $Header: $
18 when who what, where, why
19 -------- --------- -----------------------------------------------------------------
20 20241202 yq.wang Created.
21-------------------------------------------------------------------------------------------------*/
22
23#include <pthread.h>
24#include <cutils/properties.h>
25#include <string.h>
26#include <unistd.h>
27#include <sys/types.h>
28#include <sys/stat.h>
29#include <fcntl.h>
30//#include <sys/scoket.h>
31#include <netinet/in.h>
32#include <arpa/inet.h>
33
34#include "lynq_qser_data.h"
35#include "mbtk_type.h"
36#include "mbtk_ril_api.h"
37
38/*define*/
39#define QSER_DATA_CALL_FUNC __func__
40
41#define QSER_LOGE LOGE
42#define QSER_LOGD LOGD
43
44#define QSER_DEFAULT_APN_TYPE "iot_default"
45
46/*define*/
47
48/*enum*/
49typedef enum {
50 QSER_RESULT_SUCCESS = 0,
51 QSER_RESULT_FAIL,
52 QSER_RESULT_SERVER_NO_INIT,
53 QSER_RESULT_INVALID_PARAMS,
54}qser_result_e;
55
56/*enum*/
57
58/*struct*/
59typedef struct {
60 mbtk_ril_handle* handle;
61 qser_data_call_evt_cb_t net_status_cb;
62}qser_data_call_handle_s;
63
64/*struct*/
65
66/*----------------------------------------------DATA CALL FUNCTION-------------------------------------*/
67static qser_data_call_handle_s* qser_data_call_handle_get(void)
68{
69 static qser_data_call_handle_s data_call_handle = {0};
70
71 return &data_call_handle;
72}
73
74static int qser_apn_convert_to_qser_s(qser_apn_info_s *qser_apn, mbtk_apn_info_t *mbtk_apn)
75{
76 if(qser_apn == NULL || mbtk_apn == NULL)
77 {
78 QSER_LOGE("[%s] apn param is NULL.", QSER_DATA_CALL_FUNC);
79 return QSER_RESULT_FAIL;
80 }
81
82 int length = 0;
83 memset(qser_apn, 0x0, sizeof(qser_apn_info_s));
84 qser_apn->profile_idx = (unsigned char)(mbtk_apn->cid - 1);
85 //get ip type
86 if(mbtk_apn->ip_type == MBTK_IP_TYPE_IPV4V6) // IPV4V6
87 {
88 qser_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4V6;
89 }
90 else if(mbtk_apn->ip_type == MBTK_IP_TYPE_IP) // IPV4
91 {
92 qser_apn->pdp_type = QSER_APN_PDP_TYPE_IPV4;
93 }
94 else if(mbtk_apn->ip_type == MBTK_IP_TYPE_IPV6) // IPV6
95 {
96 qser_apn->pdp_type = QSER_APN_PDP_TYPE_IPV6;
97 }
98 else
99 {
100 qser_apn->pdp_type = QSER_APN_PDP_TYPE_PPP;
101 }
102
103 //get apn proto
104 qser_apn->auth_proto = (qser_apn_auth_proto_e)mbtk_apn->auth;
105
106 //get apn name
107 length = strlen((char *)mbtk_apn->apn);
108 if( length <= 0 || length > QSER_APN_NAME_SIZE)
109 {
110 QSER_LOGE("[%s] apn_nmea length fault.", QSER_DATA_CALL_FUNC);
111 return QSER_RESULT_FAIL;
112 }
113 else
114 {
115 memcpy(qser_apn->apn_name, mbtk_apn->apn, length);
116 }
117
118 //get apn user
119 length = strlen((char *)mbtk_apn->user);
120 if(length < 0 || length > QSER_APN_USERNAME_SIZE)
121 {
122 QSER_LOGE("[%s] user length fault.", QSER_DATA_CALL_FUNC);
123 return QSER_RESULT_FAIL;
124 }
125 else
126 {
127 memcpy(qser_apn->username, mbtk_apn->user, length);
128 }
129
130 //get apn password
131 length = strlen((char *)mbtk_apn->pass);
132 if(length < 0 || length > QSER_APN_PASSWORD_SIZE)
133 {
134 QSER_LOGE("[%s] pass length fault.", QSER_DATA_CALL_FUNC);
135 return QSER_RESULT_FAIL;
136 }
137 else
138 {
139 memcpy(qser_apn->password, mbtk_apn->pass, length);
140 }
141
142 //get apn type
143 length = strlen((char *)mbtk_apn->type);
144 if(length < 0 || length > QSER_APN_TYPE_SIZE)
145 {
146 QSER_LOGE("[%s] type length fault.", QSER_DATA_CALL_FUNC);
147 return QSER_RESULT_FAIL;
148 }
149 else
150 {
151 memcpy(qser_apn->apn_type, mbtk_apn->type, length);
152 }
153
154 return QSER_RESULT_SUCCESS;
155}
156
157static int qser_apn_convert_to_mbtk_s(mbtk_ril_cid_enum cid, mbtk_apn_info_t *mbtk_apn, qser_apn_info_s *qser_apn)
158{
159 if(mbtk_apn == NULL || qser_apn == NULL)
160 {
161 QSER_LOGE("[%s] apn param is NULL.", QSER_DATA_CALL_FUNC);
162 return QSER_RESULT_FAIL;
163 }
164
165 if(strlen(qser_apn->apn_name) > QSER_APN_NAME_SIZE || strlen(qser_apn->username) > QSER_APN_USERNAME_SIZE
166 || strlen(qser_apn->password) > QSER_APN_PASSWORD_SIZE || strlen(qser_apn->apn_type) > QSER_APN_TYPE_SIZE)
167 {
168 QSER_LOGE("[%s] apn length out of range.", QSER_DATA_CALL_FUNC);
169 return QSER_RESULT_INVALID_PARAMS;
170 }
171
172 memset(mbtk_apn, 0x0, sizeof(mbtk_apn_info_t));
173 mbtk_apn->cid = cid;
174
175 if(qser_apn->pdp_type == QSER_APN_PDP_TYPE_IPV4)
176 {
177 mbtk_apn->ip_type = MBTK_IP_TYPE_IP;
178 }
179 else if(qser_apn->pdp_type == QSER_APN_PDP_TYPE_IPV6)
180 {
181 mbtk_apn->ip_type = MBTK_IP_TYPE_IPV6;
182 }
183 else if(qser_apn->pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
184 {
185 mbtk_apn->ip_type = MBTK_IP_TYPE_IPV4V6;
186 }
187 else if(qser_apn->pdp_type == QSER_APN_PDP_TYPE_PPP)
188 {
189 mbtk_apn->ip_type = MBTK_IP_TYPE_PPP;
190 }
191 else
192 {
193 QSER_LOGE("[%s] pdp_type error.", QSER_DATA_CALL_FUNC);
194 return QSER_RESULT_FAIL;
195 }
196
197 //no support PAP_CHAP
198 if(qser_apn->auth_proto >= QSER_APN_AUTH_PROTO_DEFAULT && qser_apn->auth_proto < QSER_APN_AUTH_PROTO_PAP_CHAP)
199 {
200 mbtk_apn->auth = (mbtk_apn_auth_type_enum)qser_apn->auth_proto;
201 }
202 else
203 {
204 QSER_LOGE("[%s] auth_proto error.", QSER_DATA_CALL_FUNC);
205 return QSER_RESULT_FAIL;
206 }
207
208 mbtk_apn->auto_save = true;
209 mbtk_apn->auto_boot_call = false;
210
211 if(strlen(qser_apn->apn_type))
212 {
213 if(memcmp(qser_apn->apn_type, QSER_DEFAULT_APN_TYPE, strlen(QSER_DEFAULT_APN_TYPE)) == 0)
214 {
215 mbtk_apn->def_route = true;
216 mbtk_apn->as_dns = true;
217 }
218 memcpy(mbtk_apn->type, qser_apn->apn_type, strlen(qser_apn->apn_type));
219 }
220 else
221 {
222 mbtk_apn->def_route = false;
223 mbtk_apn->as_dns = false;
224 }
225
226 if(strlen(qser_apn->apn_name))
227 {
228 memcpy(mbtk_apn->apn, qser_apn->apn_name, strlen(qser_apn->apn_name));
229 }
230 else
231 {
232 QSER_LOGE("[%s] apn is empty.", QSER_DATA_CALL_FUNC);
233 return QSER_RESULT_FAIL;
234 }
235
236 if(strlen(qser_apn->username))
237 {
238 memcpy(mbtk_apn->user, qser_apn->username, strlen(qser_apn->username));
239 }
240 if(strlen(qser_apn->password))
241 {
242 memcpy(mbtk_apn->pass, qser_apn->password, strlen(qser_apn->password));
243 }
244
245 return QSER_RESULT_SUCCESS;
246}
247
248static void qser_netcard_state_init(qser_data_call_state_s *state)
249{
250 if(state != NULL)
251 {
252 state->profile_idx = 0;
253 memset(state->name, 0x0, 16);
254 state->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
255 state->state = QSER_DATA_CALL_DISCONNECTED;
256 state->err = QSER_DATA_CALL_ERROR_NONE;
257 inet_aton("0.0.0.0", &(state->v4.ip));
258 inet_aton("0.0.0.0", &(state->v4.gateway));
259 inet_aton("0.0.0.0", &(state->v4.pri_dns));
260 inet_aton("0.0.0.0", &(state->v4.sec_dns));
261 inet_pton(AF_INET6, "::", &(state->v6.ip));
262 inet_pton(AF_INET6, "::", &(state->v6.gateway));
263 inet_pton(AF_INET6, "::", &(state->v6.pri_dns));
264 inet_pton(AF_INET6, "::", &(state->v6.sec_dns));
265 }
266}
267
268static void qser_pdp_state_change_cb(const void* data, int data_len)
269{
270 if(data == NULL || data_len != sizeof(mbtk_ril_pdp_state_info_t))
271 {
272 QSER_LOGE("[%s] cb data fault.", QSER_DATA_CALL_FUNC);
273 return;
274 }
275
276 mbtk_ril_pdp_state_info_t pdp_data;
277 qser_data_call_state_s state = {0};
278 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
279 if(NULL == data_call_handle)
280 {
281 QSER_LOGE("[%s] qser_data_call_handle_get() fail.", QSER_DATA_CALL_FUNC);
282 return;
283 }
284
285
286 memset(&pdp_data, 0x0, sizeof(mbtk_ril_pdp_state_info_t));
287 memcpy(&pdp_data, data, sizeof(mbtk_ril_pdp_state_info_t));
288 QSER_LOGD("[%s] cid - %d, act - %d, auto_change - %d, reason - %d", QSER_DATA_CALL_FUNC, pdp_data.cid, pdp_data.action,
289 pdp_data.auto_change, pdp_data.reason);
290
291 qser_netcard_state_init(&state);
292 state.profile_idx = (char)(pdp_data.cid - 1);
293 snprintf(state.name, 16, "ccinet%d", state.profile_idx);
294 if(pdp_data.action)
295 {
296 state.state = QSER_DATA_CALL_CONNECTED;
297 }
298 else
299 {
300 state.state = QSER_DATA_CALL_DISCONNECTED;
301 }
302
303 if(pdp_data.ip_info_valid)
304 {
305 if(pdp_data.ip_info.ipv4.valid)
306 {
307 state.ip_family = QSER_DATA_CALL_TYPE_IPV4;
308 state.v4.ip.s_addr = pdp_data.ip_info.ipv4.IPAddr;
309 state.v4.pri_dns.s_addr = pdp_data.ip_info.ipv4.PrimaryDNS;
310 state.v4.sec_dns.s_addr = pdp_data.ip_info.ipv4.SecondaryDNS;
311 }
312
313 if(pdp_data.ip_info.ipv6.valid)
314 {
315 state.ip_family = QSER_DATA_CALL_TYPE_IPV6;
316 memcpy(&(state.v6.ip), &(pdp_data.ip_info.ipv6.IPV6Addr), sizeof(pdp_data.ip_info.ipv6.IPV6Addr));
317 memcpy(&(state.v6.pri_dns), &(pdp_data.ip_info.ipv6.PrimaryDNS), sizeof(pdp_data.ip_info.ipv6.PrimaryDNS));
318 memcpy(&(state.v6.sec_dns), &(pdp_data.ip_info.ipv6.SecondaryDNS), sizeof(pdp_data.ip_info.ipv6.SecondaryDNS));
319 }
320
321 if(pdp_data.ip_info.ipv4.valid && pdp_data.ip_info.ipv6.valid)
322 {
323 state.ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
324 }
325 }
326
327 if(data_call_handle->net_status_cb)
328 {
329 data_call_handle->net_status_cb(&state);
330 }
331}
332
333static void* qser_data_call_async_thread(void* arg)
334{
335 QSER_LOGD("[%s] entry func.", QSER_DATA_CALL_FUNC);
336 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
337 qser_data_call_error_e err = QSER_DATA_CALL_ERROR_NONE;
338
339 qser_data_call_state_s state = {0};
340 qser_data_call_s qser_data_backup = {0};
341 qser_data_call_info_s info = {0};
342 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
343 qser_netcard_state_init(&state);
344 if(arg != NULL)
345 {
346 memcpy(&qser_data_backup, (qser_data_call_s *)arg, sizeof(qser_data_call_s));
347 }
348 else
349 {
350 QSER_LOGD("[%s] arg is NULL.", QSER_DATA_CALL_FUNC);
351 state.err = QSER_DATA_CALL_ERROR_UNKNOWN;
352 if(data_call_handle->net_status_cb)
353 {
354 data_call_handle->net_status_cb(&state);
355 }
356 return NULL;
357 }
358
359 state.profile_idx = qser_data_backup.profile_idx;
360 snprintf(state.name, 16, "ccinet%d", qser_data_backup.profile_idx);
361 state.ip_family = qser_data_backup.ip_family;
362
363 ret = qser_data_call_start(&qser_data_backup, &err);
364 if(ret != MBTK_RIL_ERR_SUCCESS)
365 {
366 QSER_LOGE("[%s] qser_data_call_start() fail.", QSER_DATA_CALL_FUNC);
367 state.err = err;
368 }
369 else
370 {
371 state.state = QSER_DATA_CALL_CONNECTED;
372 ret = qser_data_call_info_get(qser_data_backup.profile_idx, qser_data_backup.ip_family, &info, &err);
373 if(ret != MBTK_RIL_ERR_SUCCESS)
374 {
375 QSER_LOGE("[%s] qser_data_call_info_get() fail.", QSER_DATA_CALL_FUNC);
376 state.err = err;
377 }
378 else
379 {
380 memcpy(&(state.v4), &(info.v4.addr), sizeof(struct v4_address_status));
381 memcpy(&(state.v6), &(info.v6.addr), sizeof(struct v6_address_status));
382 }
383 }
384
385 if(data_call_handle->net_status_cb)
386 {
387 data_call_handle->net_status_cb(&state);
388 }
389 return NULL;
390}
391
392/*----------------------------------------------DATA CALL FUNCTION-------------------------------------*/
393
394/*----------------------------------------------DATA CALL API------------------------------------------*/
395int qser_data_call_init(qser_data_call_evt_cb_t evt_cb)
396{
397 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
398 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
399 if(NULL == data_call_handle)
400 {
401 QSER_LOGE("[%s] qser_data_call_handle_get() fail.", QSER_DATA_CALL_FUNC);
402 return QSER_RESULT_FAIL;
403 }
404
405 if(NULL == data_call_handle->handle)
406 {
407 data_call_handle->handle = mbtk_ril_open(MBTK_AT_PORT_DATA);
408 if(NULL == data_call_handle->handle)
409 {
410 QSER_LOGE("[%s] mbtk_ril_open() fail.", QSER_DATA_CALL_FUNC);
411 return QSER_RESULT_FAIL;
412 }
413
414 ret = mbtk_pdp_state_change_cb_reg(qser_pdp_state_change_cb);
415 if(ret != MBTK_RIL_ERR_SUCCESS)
416 {
417 QSER_LOGE("[%s] mbtk_pdp_state_change_cb_reg() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
418 goto error_1;
419 }
420
421 data_call_handle->net_status_cb = evt_cb;
422 }
423
424 QSER_LOGD("[%s] data call init success.", QSER_DATA_CALL_FUNC);
425
426 return QSER_RESULT_SUCCESS;
427error_1:
428 if(data_call_handle->handle)
429 {
430 ret = mbtk_ril_close(MBTK_AT_PORT_DATA);
431 data_call_handle->handle = NULL;
432 }
433
434 return QSER_RESULT_FAIL;
435}
436
437void qser_data_call_destroy(void)
438{
439 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
440 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
441 if(NULL == data_call_handle || NULL == data_call_handle->handle)
442 {
443 QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
444 return;
445 }
446
447 data_call_handle->net_status_cb = NULL;
448
449 ret = mbtk_ril_close(MBTK_AT_PORT_DATA);
450 if(ret != MBTK_RIL_ERR_SUCCESS && ret != MBTK_RIL_ERR_PORT_NOT_CLOSE)
451 {
452 QSER_LOGE("[%s] mbtk_ril_close() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
453 return;
454 }
455 data_call_handle->handle = NULL;
456}
457
458int qser_data_call_start(qser_data_call_s *data_call, qser_data_call_error_e *err)
459{
460 if(data_call == NULL || err == NULL)
461 {
462 QSER_LOGE("[%s] data_call or err is NULL.", QSER_DATA_CALL_FUNC);
463 if(err != NULL)
464 {
465 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
466 }
467 return QSER_RESULT_FAIL;
468 }
469
470 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
471 int retry_interval[] = {5, 10};
472 mbtk_ip_info_t ip_info;
473 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
474 if(NULL == data_call_handle || NULL == data_call_handle->handle)
475 {
476 QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
477 *err = QSER_DATA_CALL_ERROR_NO_INIT;
478 return QSER_RESULT_SERVER_NO_INIT;
479 }
480
481 memset(&ip_info, 0x0, sizeof(mbtk_ip_info_t));
482 ret = mbtk_data_call_start(data_call_handle->handle, (mbtk_ril_cid_enum)(data_call->profile_idx + 1),
483 MBTK_DATA_CALL_ITEM_STATE_NON, MBTK_DATA_CALL_ITEM_STATE_NON, MBTK_DATA_CALL_ITEM_STATE_NON,
484 retry_interval, 2, 0, &ip_info);
485 if(ret != MBTK_RIL_ERR_SUCCESS)
486 {
487 QSER_LOGE("[%s] mbtk_data_call_start() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
488 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
489 return QSER_RESULT_FAIL;
490 }
491 else
492 {
493 *err = QSER_DATA_CALL_ERROR_NONE;
494 }
495
496 return QSER_RESULT_SUCCESS;
497}
498
499int qser_data_call_start_async(qser_data_call_s *data_call, qser_data_call_error_e *err)
500{
501 if(data_call == NULL || err == NULL)
502 {
503 QSER_LOGE("[%s] data_call or err is NULL.", QSER_DATA_CALL_FUNC);
504 if(err != NULL)
505 {
506 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
507 }
508 return QSER_RESULT_FAIL;
509 }
510
511 pthread_attr_t thread_attr;
512 pthread_t data_call_thread_id;
513 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
514 if(NULL == data_call_handle || NULL == data_call_handle->handle)
515 {
516 QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
517 *err = QSER_DATA_CALL_ERROR_NO_INIT;
518 return QSER_RESULT_SERVER_NO_INIT;
519 }
520
521 pthread_attr_init(&thread_attr);
522 if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
523 {
524 QSER_LOGE("[%s] pthread_attr_setdetachstate() fail.", QSER_DATA_CALL_FUNC);
525 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
526 return QSER_RESULT_FAIL;
527 }
528
529 if(pthread_create(&data_call_thread_id, &thread_attr, qser_data_call_async_thread, (void *) data_call))
530 {
531 QSER_LOGE("[%s] pthread_create() fail.", QSER_DATA_CALL_FUNC);
532 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
533 return QSER_RESULT_FAIL;
534 }
535 pthread_attr_destroy(&thread_attr);
536
537 return QSER_RESULT_SUCCESS;
538}
539
540int qser_data_call_stop(char profile_idx, qser_data_call_ip_family_e ip_family, qser_data_call_error_e *err)
541{
542 UNUSED(ip_family);
543
544 if(err == NULL)
545 {
546 QSER_LOGE("[%s] err is NULL.", QSER_DATA_CALL_FUNC);
547 return QSER_RESULT_FAIL;
548 }
549
550 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
551 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
552 if(NULL == data_call_handle || NULL == data_call_handle->handle)
553 {
554 QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
555 *err = QSER_DATA_CALL_ERROR_NO_INIT;
556 return QSER_RESULT_SERVER_NO_INIT;
557 }
558
559 ret = mbtk_data_call_stop(data_call_handle->handle, (mbtk_ril_cid_enum)(profile_idx + 1), 15);
560 if(ret != MBTK_RIL_ERR_SUCCESS)
561 {
562 QSER_LOGE("[%s] mbtk_data_call_stop() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
563 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
564 return QSER_RESULT_FAIL;
565 }
566 else
567 {
568 *err = QSER_DATA_CALL_ERROR_NONE;
569 }
570
571 return QSER_RESULT_SUCCESS;
572}
573
574int qser_data_call_info_get(char profile_idx,qser_data_call_ip_family_e ip_family,
575 qser_data_call_info_s *info, qser_data_call_error_e *err)
576{
577 UNUSED(ip_family);
578
579 if(info == NULL || err == NULL)
580 {
581 QSER_LOGE("[%s] info or err is NULL.", QSER_DATA_CALL_FUNC);
582 if(err != NULL)
583 {
584 *err = QSER_DATA_CALL_ERROR_INVALID_PARAMS;
585 }
586 return QSER_RESULT_FAIL;
587 }
588
589 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
590 mbtk_ip_info_t ip_info;
591 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
592 if(NULL == data_call_handle || NULL == data_call_handle->handle)
593 {
594 QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
595 *err = QSER_DATA_CALL_ERROR_NO_INIT;
596 return QSER_RESULT_SERVER_NO_INIT;
597 }
598
599#ifdef QSER_TEST
600 char v4_buff[32] = {0};
601 char v6_buff[128] = {0};
602#endif
603 memset(&ip_info, 0x0, sizeof(mbtk_ip_info_t));
604 memset(info, 0x0, sizeof(qser_data_call_info_s));
605 ret = mbtk_data_call_state_get(data_call_handle->handle, (mbtk_ril_cid_enum)(profile_idx + 1), &ip_info);
606 if(ret != MBTK_RIL_ERR_SUCCESS)
607 {
608 QSER_LOGE("[%s] mbtk_data_call_state_get fail.[%d]", QSER_DATA_CALL_FUNC, ret);
609 *err = QSER_DATA_CALL_ERROR_UNKNOWN;
610 return QSER_RESULT_FAIL;
611 }
612 else
613 {
614 info->profile_idx = profile_idx;
615 if(ip_info.ipv4.valid)
616 {
617 info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
618 info->v4.state = QSER_DATA_CALL_CONNECTED;
619 sprintf(info->v4.name, "ccinet%d", profile_idx);
620 info->v4.addr.ip.s_addr = ip_info.ipv4.IPAddr;
621 info->v4.addr.pri_dns.s_addr = ip_info.ipv4.PrimaryDNS;
622 info->v4.addr.sec_dns.s_addr = ip_info.ipv4.SecondaryDNS;
623 info->v4.reconnect = true;
624
625#ifdef QSER_TEST
626 //LOGE("[qser_data] IP: %x pri_DNS: %x sec_DNS: %x.", ipv4.IPAddr, ipv4.PrimaryDNS, ipv4.SecondaryDNS);
627 if(inet_ntop(AF_INET, &(info->v4.addr.ip), v4_buff, 32) == NULL) {
628 LOGE("[qser_data] IP error.");
629 } else {
630 LOGE("[qser_data] IP : %s", v4_buff);
631 }
632 if(inet_ntop(AF_INET, &(info->v4.addr.pri_dns), v4_buff, 32) == NULL) {
633 LOGE("[qser_data] PrimaryDNS error.");
634 } else {
635 LOGE("[qser_data] PrimaryDNS : %s", v4_buff);
636 }
637 if(inet_ntop(AF_INET, &(info->v4.addr.sec_dns), v4_buff, 32) == NULL) {
638 LOGE("[qser_data] SecondaryDNS error.");
639 } else {
640 LOGE("[qser_data] SecondaryDNS : %s", v4_buff);
641 }
642#endif
643 }
644
645 if(ip_info.ipv6.valid)
646 {
647 info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
648 info->v6.state = QSER_DATA_CALL_CONNECTED;
649 sprintf(info->v6.name, "ccinet%d", profile_idx);
650 memcpy(&(info->v6.addr.ip), &(ip_info.ipv6.IPV6Addr), sizeof(ip_info.ipv6.IPV6Addr));
651 memcpy(&(info->v6.addr.pri_dns), &(ip_info.ipv6.PrimaryDNS), sizeof(ip_info.ipv6.PrimaryDNS));
652 memcpy(&(info->v6.addr.sec_dns), &(ip_info.ipv6.SecondaryDNS), sizeof(ip_info.ipv6.SecondaryDNS));
653 info->v6.reconnect = true;
654
655#ifdef QSER_TEST
656 if(ipv6_2_str(&(info->v6.addr.ip), v6_buff))
657 {
658 LOGE("[qser_data] IP error.");
659 } else {
660 LOGE("[qser_data] IP : %s", v6_buff);
661 }
662 if(ipv6_2_str(&(info->v6.addr.pri_dns), v6_buff))
663 {
664 LOGE("[qser_data] PrimaryDNS error.");
665 } else {
666 LOGE("[qser_data] PrimaryDNS : %s", v6_buff);
667 }
668 if(ipv6_2_str(&(info->v6.addr.sec_dns), v6_buff))
669 {
670 LOGE("[qser_data] SecondaryDNS error.");
671 } else {
672 LOGE("[qser_data] SecondaryDNS : %s", v6_buff);
673 }
674#endif
675 }
676
677 if(ip_info.ipv4.valid && ip_info.ipv6.valid)
678 {
679 info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
680 }
681 }
682
683 *err = QSER_DATA_CALL_ERROR_NONE;
684 return QSER_RESULT_SUCCESS;
685}
686
687int qser_apn_set(qser_apn_info_s *apn)
688{
689 if(apn == NULL)
690 {
691 QSER_LOGE("[%s] apn param is NULL.", QSER_DATA_CALL_FUNC);
692 return QSER_RESULT_FAIL;
693 }
694
695 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
696 mbtk_apn_info_t apninfo;
697 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
698 if(NULL == data_call_handle || NULL == data_call_handle->handle)
699 {
700 QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
701 return QSER_RESULT_SERVER_NO_INIT;
702 }
703
704 if(qser_apn_convert_to_mbtk_s((mbtk_ril_cid_enum)(apn->profile_idx + 1), &apninfo, apn) != QSER_RESULT_SUCCESS)
705 {
706 QSER_LOGE("[%s] qser_apn_convert_to_mbtk_s() fail.", QSER_DATA_CALL_FUNC);
707 return QSER_RESULT_FAIL;
708 }
709
710 ret = mbtk_apn_set(data_call_handle->handle, &apninfo);
711 if(ret != MBTK_RIL_ERR_SUCCESS)
712 {
713 QSER_LOGE("[%s] mbtk_apn_set() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
714 return QSER_RESULT_FAIL;
715 }
716
717 return QSER_RESULT_SUCCESS;
718}
719
720int qser_apn_get(unsigned char profile_idx, qser_apn_info_s *apn)
721{
722 if(apn == NULL)
723 {
724 QSER_LOGE("[%s] apn param is NULL.", QSER_DATA_CALL_FUNC);
725 return QSER_RESULT_FAIL;
726 }
727
728 int i = 0;
729 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
730 mbtk_apn_info_array_t apninfo;
731 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
732 if(NULL == data_call_handle || NULL == data_call_handle->handle)
733 {
734 QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
735 return QSER_RESULT_SERVER_NO_INIT;
736 }
737
738 memset(&apninfo, 0x0, sizeof(mbtk_apn_info_array_t));
739 ret = mbtk_apn_get(data_call_handle->handle, &apninfo);
740 if(ret != MBTK_RIL_ERR_SUCCESS)
741 {
742 QSER_LOGE("[%s] mbtk_apn_get() fail. [%d]", QSER_DATA_CALL_FUNC, ret);
743 return QSER_RESULT_FAIL;
744 }
745 else
746 {
747 for(i = 0; i < apninfo.num; i++)
748 {
749 if(apninfo.apns[i].cid == (mbtk_ril_cid_enum)(profile_idx + 1))
750 {
751 QSER_LOGD("[%s] find idx[%d].", QSER_DATA_CALL_FUNC, profile_idx);
752 break;
753 }
754 }
755
756 if(i == apninfo.num)
757 {
758 QSER_LOGE("[%s] not find idx, max num[%d].", QSER_DATA_CALL_FUNC, apninfo.num);
759 return QSER_RESULT_FAIL;
760 }
761
762 if(qser_apn_convert_to_qser_s(apn, &(apninfo.apns[i])) != QSER_RESULT_SUCCESS)
763 {
764 QSER_LOGE("[%s] qser_apn_convert_to_qser_s() fail.", QSER_DATA_CALL_FUNC);
765 return QSER_RESULT_FAIL;
766 }
767 }
768
769 return QSER_RESULT_SUCCESS;
770}
771
772int qser_apn_add(qser_apn_add_s *apn, unsigned char *profile_idx)
773{
774 if(apn == NULL || profile_idx == NULL)
775 {
776 QSER_LOGE("[%s] apn param is NULL.", QSER_DATA_CALL_FUNC);
777 return QSER_RESULT_FAIL;
778 }
779
780 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
781 mbtk_apn_info_t apninfo;
782 qser_apn_info_s qser_info;
783 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
784 if(NULL == data_call_handle || NULL == data_call_handle->handle)
785 {
786 QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
787 return QSER_RESULT_SERVER_NO_INIT;
788 }
789
790 memset(&qser_info, 0x0, sizeof(qser_apn_info_s));
791 qser_info.profile_idx = MBTK_RIL_CID_NUL;
792 qser_info.pdp_type = apn->pdp_type;
793 qser_info.auth_proto = apn->auth_proto;
794 memcpy(qser_info.apn_name, apn->apn_name, QSER_APN_NAME_SIZE);
795 memcpy(qser_info.username, apn->username, QSER_APN_USERNAME_SIZE);
796 memcpy(qser_info.password, apn->password, QSER_APN_PASSWORD_SIZE);
797 memcpy(qser_info.apn_type, apn->apn_type, QSER_APN_TYPE_SIZE);
798 if(qser_apn_convert_to_mbtk_s(MBTK_RIL_CID_NUL, &apninfo, &qser_info) != QSER_RESULT_SUCCESS)
799 {
800 QSER_LOGE("[%s] apn_convert_to_mbtk_s() fail.", QSER_DATA_CALL_FUNC);
801 return QSER_RESULT_FAIL;
802 }
803
804 ret = mbtk_apn_set(data_call_handle->handle, &apninfo);
805 if(ret != MBTK_RIL_ERR_SUCCESS)
806 {
807 QSER_LOGE("[%s] mbtk_apn_set() fail.[%d]", QSER_DATA_CALL_FUNC, ret);
808 return QSER_RESULT_FAIL;
809 }
810
811 *profile_idx = (unsigned char)(apninfo.cid - 1);
812 return QSER_RESULT_SUCCESS;
813}
814
815int qser_apn_del(unsigned char profile_idx)
816{
817 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
818 mbtk_apn_info_t apninfo;
819 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
820 if(NULL == data_call_handle || NULL == data_call_handle->handle)
821 {
822 QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
823 return QSER_RESULT_SERVER_NO_INIT;
824 }
825
826 memset(&apninfo, 0x0, sizeof(mbtk_apn_info_t));
827 apninfo.cid = (mbtk_ril_cid_enum)(profile_idx + 1);
828 apninfo.auto_save = true;
829 ret = mbtk_apn_set(data_call_handle->handle, &(apninfo));
830 if(ret != MBTK_RIL_ERR_SUCCESS)
831 {
832 QSER_LOGE("[%s] mbtk_apn_set fail.[%d]", QSER_DATA_CALL_FUNC, ret);
833 return QSER_RESULT_FAIL;
834 }
835 return QSER_RESULT_SUCCESS;
836}
837
838int qser_apn_get_list(qser_apn_info_list_s *apn_list)
839{
840 if(apn_list == NULL)
841 {
842 QSER_LOGE("[%s] apn_list param is NULL.", QSER_DATA_CALL_FUNC);
843 return QSER_RESULT_FAIL;
844 }
845
846 int i = 0;
847 mbtk_ril_err_enum ret = MBTK_RIL_ERR_SUCCESS;
848 mbtk_apn_info_array_t apninfo;
849 qser_data_call_handle_s* data_call_handle = qser_data_call_handle_get();
850 if(NULL == data_call_handle || NULL == data_call_handle->handle)
851 {
852 QSER_LOGE("[%s] server not init.", QSER_DATA_CALL_FUNC);
853 return QSER_RESULT_SERVER_NO_INIT;
854 }
855
856 memset(&apninfo, 0x0, sizeof(mbtk_apn_info_array_t));
857 ret = mbtk_apn_get(data_call_handle->handle, &apninfo);
858 if(ret != MBTK_RIL_ERR_SUCCESS && ret != MBTK_RIL_ERR_CME)
859 {
860 QSER_LOGE("[%s] mbtk_apn_get() fail. [%d]", QSER_DATA_CALL_FUNC, ret);
861 return QSER_RESULT_FAIL;
862 }
863 else
864 {
865 if(apninfo.num > 0 && apninfo.num <= QSER_APN_MAX_LIST)
866 {
867 apn_list->cnt = 0;
868 for(i = 0; i < apninfo.num; i++)
869 {
870 if(qser_apn_convert_to_qser_s(&apn_list->apn[apn_list->cnt], &(apninfo.apns[i])) != QSER_RESULT_SUCCESS)
871 {
872 QSER_LOGE("[%s] qser_apn_convert_to_qser_s() fail.", QSER_DATA_CALL_FUNC);
873 return QSER_RESULT_FAIL;
874 }
875 apn_list->cnt++;
876 }
877 }
878 else if(apninfo.num > QSER_APN_MAX_LIST)
879 {
880 QSER_LOGE("[%s] apn_num overlong.", QSER_DATA_CALL_FUNC);
881 return QSER_RESULT_FAIL;
882 }
883 else
884 {
885 apn_list->cnt = 0;
886 }
887 }
888
889 return QSER_RESULT_SUCCESS;
890}
891/*----------------------------------------------DATA CALL API------------------------------------------*/
892