blob: 0f18e770d5b70fe41d9591f6dc53ca6dd4830327 [file] [log] [blame]
b.liud440f9f2025-04-18 10:44:31 +08001#include "ql_type.h"
2#include "ql_data_call.h"
3#include "mbtk_info_api.h"
4
5typedef struct {
6 int apn_id;
7 ql_data_call_apn_config_t apn_info;
8} mbtk_data_call_apn_param_info_t;
9
10typedef struct {
11 QL_NET_DATA_CALL_RECONNECT_MODE_E reconnect_mode;
12 int time_num;
13 int time_list[QL_NET_MAX_RECONNECT_INTERVAL_LEN];
14 mbtk_data_call_apn_param_info_t *apn_param; // Point to data_call_apn_param_list.
15} mbtk_data_call_param_info_t;
16
17typedef struct {
18 ql_data_call_item_t call_info;
19 int is_background;
20
21 ql_data_call_status_t call_state;
22
23 mbtk_data_call_param_info_t call_param_info;
24} mbtk_data_call_info_t;
25
26static mbtk_info_handle_t* ql_info_handle = NULL;
27static mbtk_data_call_info_t data_call_info[QL_NET_MAX_DATA_CALL_NUM];
28static mbtk_data_call_apn_param_info_t data_call_apn_param_list[QL_NET_MAX_DATA_CALL_NUM];
29static ql_data_call_service_error_cb_f data_call_service_error_cb = NULL;
30static ql_data_call_status_ind_cb_f data_call_status_ind_cb = NULL;
31
32static int call_index_get_by_call_id(int call_id)
33{
34 int i = 0;
35 while(i < QL_NET_MAX_DATA_CALL_NUM) {
36 if(data_call_info[i].call_info.call_id == call_id) {
37 break;
38 }
39 i++;
40 }
41
42 if(i == QL_NET_MAX_DATA_CALL_NUM) {
43 return -1;
44 } else {
45 return i;
46 }
47}
48
49static int call_index_get_by_apn_id(int apn_id)
50{
51 int i = 0;
52 while(i < QL_NET_MAX_DATA_CALL_NUM) {
53 if(data_call_info[i].call_param_info.apn_param &&
54 data_call_info[i].call_param_info.apn_param->apn_id == apn_id) {
55 break;
56 }
57 i++;
58 }
59
60 if(i == QL_NET_MAX_DATA_CALL_NUM) {
61 return -1;
62 } else {
63 return i;
64 }
65}
66
67static void data_call_info_list_print()
68{
69 int i = 0;
70 while(i < QL_NET_MAX_DATA_CALL_NUM) {
71 if(data_call_info[i].call_info.call_id > 0) {
72 LOGD("CALL START : call_id - %d, call_name - %s, is_background - %d", data_call_info[i].call_info.call_id, data_call_info[i].call_info.call_name,
73 data_call_info[i].is_background);
74 LOGD("call_state : ip_ver - %d, call_status - %d, device - %s", data_call_info[i].call_state.ip_ver,
75 data_call_info[i].call_state.call_status, data_call_info[i].call_state.device);
76 LOGD("param_info : reconnect_mode - %d, time_num - %d", data_call_info[i].call_param_info.reconnect_mode,
77 data_call_info[i].call_param_info.time_num);
78 int j = 0;
79 while(j < data_call_info[i].call_param_info.time_num) {
80 LOGD("time_item[%d] - %d", j, data_call_info[i].call_param_info.time_list[j]);
81 j++;
82 }
83
84 if(data_call_info[i].call_param_info.apn_param) {
85 LOGD("apn_param : apn_id - %d, auth_pref - %d, ip_ver - %d, apn_name - %s, username - %s, password - %s", data_call_info[i].call_param_info.apn_param->apn_id,
86 data_call_info[i].call_param_info.apn_param->apn_info.auth_pref,
87 data_call_info[i].call_param_info.apn_param->apn_info.ip_ver,
88 data_call_info[i].call_param_info.apn_param->apn_info.apn_name,
89 data_call_info[i].call_param_info.apn_param->apn_info.username,
90 data_call_info[i].call_param_info.apn_param->apn_info.password);
91 } else {
92 LOGE("data_call_info[i]->call_param_info->apn_param is NULL.");
93 }
94 }
95 i++;
96 }
97}
98
99static void data_call_info_item_print(int call_id)
100{
101 int i = call_index_get_by_call_id(call_id);
102 if(i >= 0) {
103 LOGD("CALL START : call_id - %d, call_name - %s, is_background - %d", data_call_info[i].call_info.call_id, data_call_info[i].call_info.call_name,
104 data_call_info[i].is_background);
105 LOGD("call_state : ip_ver - %d, call_status - %d, device - %s", data_call_info[i].call_state.ip_ver,
106 data_call_info[i].call_state.call_status, data_call_info[i].call_state.device);
107 LOGD("param_info : reconnect_mode - %d, time_num - %d", data_call_info[i].call_param_info.reconnect_mode,
108 data_call_info[i].call_param_info.time_num);
109 int j = 0;
110 while(j < data_call_info[i].call_param_info.time_num) {
111 LOGD("time_item[%d] - %d", j, data_call_info[i].call_param_info.time_list[j]);
112 j++;
113 }
114
115 if(data_call_info[i].call_param_info.apn_param) {
116 LOGD("apn_param : apn_id - %d, auth_pref - %d, ip_ver - %d, apn_name - %s, username - %s, password - %s", data_call_info[i].call_param_info.apn_param->apn_id,
117 data_call_info[i].call_param_info.apn_param->apn_info.auth_pref,
118 data_call_info[i].call_param_info.apn_param->apn_info.ip_ver,
119 data_call_info[i].call_param_info.apn_param->apn_info.apn_name,
120 data_call_info[i].call_param_info.apn_param->apn_info.username,
121 data_call_info[i].call_param_info.apn_param->apn_info.password);
122 } else {
123 LOGE("data_call_info[i]->call_param_info->apn_param is NULL.");
124 }
125 }
126}
127
128
129static void ril_server_state_cb(const void* data, int data_len)
130{
131 if(data != NULL && data_len == sizeof(int)) {
132 const int *state = (const int*)data;
133 if(*state) {
134 if(data_call_service_error_cb) {
135 data_call_service_error_cb(QL_ERR_ABORTED);
136 }
137 }
138 }
139}
140
141static void data_call_state_change_cb(const void* data, int data_len)
142{
143 LOGD("data_call_state_change_cb() start.");
144 if(data == NULL || data_len == 0)
145 {
146 return;
147 }
148
149 // data_call_info_print();
150
151 uint8 *net_data = NULL;
152 net_data = (uint8 *)data;
153
154 if(*net_data > 100 && *net_data < 200)
155 {
156 int apn_id = *net_data - 100;
157 if(apn_id <= QL_NET_MAX_DATA_CALL_NUM)
158 {
159 int i = 0;
160 while(i < QL_NET_MAX_DATA_CALL_NUM) {
161
162 if(data_call_info[i].call_param_info.apn_param) {
163 if(data_call_info[i].call_param_info.apn_param->apn_id == apn_id) {
164 break;
165 } else {
166 LOGD("call_id = %d, apn_id = %d", data_call_info[i].call_info.call_id,
167 data_call_info[i].call_param_info.apn_param->apn_id);
168 }
169 }
170 i++;
171 }
172
173 if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this apn_id.
174 LOGW("Unknown apn_id : %d", apn_id);
175 return;
176 } else {
177 QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
178 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
179 if(data_call_status_ind_cb) {
180 data_call_status_ind_cb(data_call_info[i].call_info.call_id, pre_call_status,
181 &(data_call_info[i].call_state));
182 }
183 }
184 }
185 else
186 {
187 LOGE("[qser_data] cb fail,idx is %d.", apn_id);
188 }
189
190 }
191 else if(*net_data > 200 && *net_data < 220)
192 {
193 LOGE("[qser_data] cid[%d] is open.", *net_data - 200);
194 }
195 else if(*net_data > 220)
196 {
197 LOGE("[qser_data] cid[%d] is reopen.", *net_data - 220);
198 int apn_id = *net_data - 220;
199 if(apn_id <= QL_NET_MAX_DATA_CALL_NUM)
200 {
201 int i = 0;
202 while(i < QL_NET_MAX_DATA_CALL_NUM) {
203 if(data_call_info[i].call_param_info.apn_param
204 && data_call_info[i].call_param_info.apn_param->apn_id == apn_id) {
205 break;
206 }
207 i++;
208 }
209
210 if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this apn_id.
211 LOGW("Unknown apn_id : %d", apn_id);
212 return;
213 } else {
214 QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
215 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
216 if(data_call_status_ind_cb) {
217 data_call_status_ind_cb(data_call_info[i].call_info.call_id, pre_call_status,
218 &(data_call_info[i].call_state));
219 }
220 }
221 }
222 }
223 else if(*net_data == 1)
224 {
225 LOGE("[qser_data] pdp is open.");
226 }
227 else
228 {
229 LOGE("[qser_data] unkonwn param [%d].", *net_data);
230 }
231}
232
233static int data_call_state_query(int call_id)
234{
235 int i = call_index_get_by_call_id(call_id);
236 if(i < 0) {
237 LOGE("Unknown call_id : %d", call_id);
238 return -1;
239 }
240
241 // Get network information.
242 mbtk_ipv4_info_t ipv4;
243 mbtk_ipv6_info_t ipv6;
244 QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
245 int ret = mbtk_data_call_state_get(ql_info_handle, data_call_info[i].call_param_info.apn_param->apn_id, &ipv4, &ipv6);
246 if(ret != 0)
247 {
248 LOGE("mbtk_data_call_state_get fail.[ret = %d]", ret);
249 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_ERROR;
250 return -1;
251 }
252 else
253 {
254 data_call_info[i].call_state.has_addr = ipv4.valid;
255 if(ipv4.valid)
256 {
257 if(inet_ntop(AF_INET, &(ipv4.IPAddr), data_call_info[i].call_state.addr.addr , QL_NET_MAX_ADDR_LEN) == NULL) {
258 LOGE("IPv4 error.");
259 } else {
260 LOGD("IPv4 : %s", data_call_info[i].call_state.addr.addr);
261 }
262
263 if(inet_ntop(AF_INET, &(ipv4.NetMask), data_call_info[i].call_state.addr.netmask , QL_NET_MAX_ADDR_LEN) == NULL) {
264 LOGE("NetMask error.");
265 } else {
266 LOGD("NetMask : %s", data_call_info[i].call_state.addr.netmask);
267 }
268
269 if(inet_ntop(AF_INET, &(ipv4.GateWay), data_call_info[i].call_state.addr.gateway , QL_NET_MAX_ADDR_LEN) == NULL) {
270 LOGE("GateWay error.");
271 } else {
272 LOGD("GateWay : %s", data_call_info[i].call_state.addr.gateway);
273 }
274
275 if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), data_call_info[i].call_state.addr.dnsp , QL_NET_MAX_ADDR_LEN) == NULL) {
276 LOGE("PrimaryDNS error.");
277 } else {
278 LOGD("PrimaryDNS : %s", data_call_info[i].call_state.addr.dnsp);
279 }
280
281 if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), data_call_info[i].call_state.addr.dnss , QL_NET_MAX_ADDR_LEN) == NULL) {
282 LOGE("SecondaryDNS error.");
283 } else {
284 LOGD("SecondaryDNS : %s", data_call_info[i].call_state.addr.dnss);
285 }
286 }
287
288 data_call_info[i].call_state.has_addr6 = ipv6.valid;
289 if(ipv6.valid)
290 {
291 if(ipv6_2_str(&(ipv6.IPV6Addr), data_call_info[i].call_state.addr6.addr)) {
292 LOGE("IPv6 error.");
293 } else {
294 LOGD("IPv6 : %s", data_call_info[i].call_state.addr6.addr);
295 }
296
297 if(ipv6_2_str(&(ipv6.NetMask), data_call_info[i].call_state.addr6.prefix)) {
298 LOGE("prefix error.");
299 } else {
300 LOGD("prefix : %s", data_call_info[i].call_state.addr6.prefix);
301 }
302
303 if(ipv6_2_str(&(ipv6.GateWay), data_call_info[i].call_state.addr6.gateway)) {
304 LOGE("GateWay error.");
305 } else {
306 LOGD("GateWay : %s", data_call_info[i].call_state.addr6.gateway);
307 }
308
309 if(ipv6_2_str(&(ipv6.PrimaryDNS), data_call_info[i].call_state.addr6.dnsp)) {
310 LOGE("PrimaryDNS error.");
311 } else {
312 LOGD("PrimaryDNS : %s", data_call_info[i].call_state.addr6.dnsp);
313 }
314
315 if(ipv6_2_str(&(ipv6.SecondaryDNS), data_call_info[i].call_state.addr6.dnsp)) {
316 LOGE("SecondaryDNS error.");
317 } else {
318 LOGD("SecondaryDNS : %s", data_call_info[i].call_state.addr6.dnsp);
319 }
320 }
321
322 pre_call_status = data_call_info[i].call_state.call_status;
323#if 1
324 if(data_call_info[i].call_state.ip_ver == QL_NET_IP_VER_V4V6) {
325 if(ipv4.valid && !ipv6.valid) {
326 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED;
327 } else if(!ipv4.valid && ipv6.valid) {
328 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED;
329 } else if(ipv4.valid && ipv6.valid) {
330 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
331 } else {
332 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
333 }
334 } else if(data_call_info[i].call_state.ip_ver == QL_NET_IP_VER_V4) {
335 if(ipv4.valid) {
336 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
337 } else {
338 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
339 }
340 } else if(data_call_info[i].call_state.ip_ver == QL_NET_IP_VER_V6) {
341 if(ipv6.valid) {
342 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
343 } else {
344 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
345 }
346 } else {
347 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
348 }
349#else
350 if(ipv4.valid && ipv6.valid) {
351 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTED;
352 } else if(!ipv4.valid && ipv6.valid) {
353 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED;
354 } else if(ipv4.valid && !ipv6.valid) {
355 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED;
356 } else {
357 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_DISCONNECTED;
358 }
359#endif
360
361 if(data_call_status_ind_cb) {
362 data_call_status_ind_cb(call_id, pre_call_status,
363 &(data_call_info[i].call_state));
364 }
365 }
366
367 return 0;
368}
369
370
371/*-----------------------------------------------------------------------------------------------*/
372/**
373 @brief Initialize the data call service
374 @return
375 QL_ERR_OK - successful
376 QL_ERR_INVALID_ARG - as defined
377 QL_ERR_UNKNOWN - unknown error, failed to connect to service
378 QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
379 Other - error code defined by ql_type.h
380 */
381/*-----------------------------------------------------------------------------------------------*/
382int ql_data_call_init(void)
383{
384 if(ql_info_handle == NULL)
385 {
386
387 mbtk_log_init("radio", "QL_DATA_CALL");
388
389 ql_info_handle = mbtk_info_handle_get();
390 if(ql_info_handle)
391 {
392 memset(&data_call_info, 0, sizeof(data_call_info));
393 memset(&data_call_apn_param_list, 0, sizeof(data_call_apn_param_list));
394 return QL_ERR_OK;
395 } else {
396 LOGE("mbtk_info_handle_get() fail.");
397 return QL_ERR_UNKNOWN;
398 }
399 } else {
400 return QL_ERR_UNKNOWN;
401 }
402}
403
404/*-----------------------------------------------------------------------------------------------*/
405/**
406 @brief Create a data call instance
407 @param[in] call_id The unique identifier of the data call instance, specified by the user
408 @param[in] call_name Friendly data call name, specified by the user
409 @param[in] is_background Whether the data call status is maintained by the data call service daemon.
410 If it is 0, the data call instance will be deleted after the data call process exits.
411 @return
412 QL_ERR_OK - successful
413 QL_ERR_INVALID_ARG - as defined
414 QL_ERR_UNKNOWN - unknown error, failed to connect to service
415 QL_ERR_SERVICE_NOT_READY - service is not ready, need to retry
416 Other - error code defined by ql_type.h
417 */
418/*-----------------------------------------------------------------------------------------------*/
419int ql_data_call_create(int call_id, const char *call_name, int is_background)
420{
421 if(ql_info_handle == NULL)
422 {
423 return QL_ERR_SERVICE_NOT_READY;
424 }
425
426 if(call_id <= 0 || call_name == NULL || strlen(call_name) == 0
427 || strlen(call_name) > QL_NET_MAX_NAME_LEN) {
428 return QL_ERR_INVALID_ARG;
429 }
430
431 int i = 0;
432 while(i < QL_NET_MAX_DATA_CALL_NUM) {
433 if(data_call_info[i].call_info.call_id == 0) { // Not use.
434 break;
435 }
436 i++;
437 }
438
439 if(i == QL_NET_MAX_DATA_CALL_NUM) { // data_call item full.
440 LOGW("data_call instance is full.");
441 return QL_ERR_UNKNOWN;
442 }
443
444 data_call_info[i].call_info.call_id = call_id;
445 memcpy(data_call_info[i].call_info.call_name, call_name, strlen(call_name));
446 data_call_info[i].call_state.call_id = call_id;
447 memcpy(data_call_info[i].call_state.call_name, call_name, strlen(call_name));
448
449 data_call_info[i].is_background = is_background;
450
451 return QL_ERR_OK;
452}
453
454/*-----------------------------------------------------------------------------------------------*/
455/**
456 @brief Alloc for a data call configuration instance
457 @return
458 NULL - Not enough memory
459 Other - successful
460 */
461/*-----------------------------------------------------------------------------------------------*/
462ql_data_call_param_t *ql_data_call_param_alloc(void)
463{
464 ql_data_call_param_t *result = malloc(sizeof(mbtk_data_call_param_info_t));
465 if(result) {
466 memset(result, 0, sizeof(mbtk_data_call_param_info_t));
467 }
468
469 return result;
470}
471
472/*-----------------------------------------------------------------------------------------------*/
473/**
474 @brief Initialize the data call configuration instance
475 @param[in] param Point to the data call configuration instance
476 @return
477 QL_ERR_OK - Successful
478 QL_ERR_INVALID_ARG - Invalid arguments
479 */
480/*-----------------------------------------------------------------------------------------------*/
481int ql_data_call_param_init(ql_data_call_param_t *param)
482{
483 if(ql_info_handle == NULL)
484 {
485 return QL_ERR_SERVICE_NOT_READY;
486 }
487
488 if(param == NULL) {
489 return QL_ERR_INVALID_ARG;
490 }
491
492 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
493 memset(info, 0, sizeof(mbtk_data_call_param_info_t));
494
495 return QL_ERR_OK;
496}
497
498/*-----------------------------------------------------------------------------------------------*/
499/**
500 @brief Release the data call configuration instance
501 @param[in] param Point to the data call configuration instance
502 @return
503 QL_ERR_OK - Successful
504 QL_ERR_INVALID_ARG - Invalid arguments
505 */
506/*-----------------------------------------------------------------------------------------------*/
507int ql_data_call_param_free(ql_data_call_param_t *param)
508{
509 if(ql_info_handle == NULL)
510 {
511 return QL_ERR_SERVICE_NOT_READY;
512 }
513
514 if(param == NULL) {
515 return QL_ERR_INVALID_ARG;
516 }
517
518 free(param);
519
520 return QL_ERR_OK;
521}
522
523
524/*-----------------------------------------------------------------------------------------------*/
525/**
526 @brief Bind APN ID, range:1-16
527 @param[in] param Point to the data call configuration instance
528 @param[in] apn_id APN ID, range:1-16
529 @return
530 QL_ERR_OK - Successful
531 QL_ERR_INVALID_ARG - Invalid arguments
532 */
533/*-----------------------------------------------------------------------------------------------*/
534int ql_data_call_param_set_apn_id(ql_data_call_param_t *param, int apn_id)
535{
536 if(ql_info_handle == NULL)
537 {
538 return QL_ERR_SERVICE_NOT_READY;
539 }
540
541 // 1 - 7
542 if(param == NULL || apn_id <= 0 || apn_id > QL_NET_MAX_APN_ID) {
543 return QL_ERR_INVALID_ARG;
544 }
545
546
547 int i = 0;
548 while(i < QL_NET_MAX_DATA_CALL_NUM) {
549 if(data_call_apn_param_list[i].apn_id == apn_id) {
550 break;
551 }
552 i++;
553 }
554
555 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
556 if(info->apn_param != NULL) {
557 return QL_ERR_INVALID_ARG;
558 }
559 if(i == QL_NET_MAX_DATA_CALL_NUM) {
560 LOGW("No found apn_id : %d.", apn_id);
561 // Found next empty apn item.
562 int j = 0;
563 while(j < QL_NET_MAX_DATA_CALL_NUM) {
564 if(data_call_apn_param_list[j].apn_id <= 0) {
565 break;
566 }
567 j++;
568 }
569 if(j == QL_NET_MAX_DATA_CALL_NUM) { // Full
570 return QL_ERR_UNKNOWN;
571 }
572
573 info->apn_param = &(data_call_apn_param_list[j]);
574 info->apn_param->apn_id = apn_id;
575 } else {
576 // Found apn_id
577 info->apn_param = &(data_call_apn_param_list[i]);
578 }
579
580 return QL_ERR_OK;
581}
582
583/*-----------------------------------------------------------------------------------------------*/
584/**
585 @brief Get APN name from configuration instance
586 @param[in] param Point to the data call configuration instance
587 @param[out] buf APN ID
588 @return
589 QL_ERR_OK - Successful
590 QL_ERR_INVALID_ARG - Invalid arguments
591 */
592/*-----------------------------------------------------------------------------------------------*/
593int ql_data_call_param_get_apn_id(ql_data_call_param_t *param, int *apn_id)
594{
595 if(ql_info_handle == NULL)
596 {
597 return QL_ERR_SERVICE_NOT_READY;
598 }
599
600 if(param == NULL || apn_id == NULL) {
601 return QL_ERR_INVALID_ARG;
602 }
603
604 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
605 if(info->apn_param == NULL) {
606 return QL_ERR_INVALID_ARG;
607 }
608 *apn_id = info->apn_param->apn_id;
609
610 return QL_ERR_OK;
611}
612
613
614/*-----------------------------------------------------------------------------------------------*/
615/**
616 @brief Configure APN name
617 @param[in] param Point to the data call configuration instance
618 @param[in] apn_name APN name
619 @return
620 QL_ERR_OK - Successful
621 QL_ERR_INVALID_ARG - Invalid arguments
622 */
623/*-----------------------------------------------------------------------------------------------*/
624int ql_data_call_param_set_apn_name(ql_data_call_param_t *param, const char *apn_name)
625{
626 if(ql_info_handle == NULL)
627 {
628 return QL_ERR_SERVICE_NOT_READY;
629 }
630
631 if(param == NULL || apn_name == NULL || strlen(apn_name) == 0
632 || strlen(apn_name) > QL_NET_MAX_APN_NAME_LEN) {
633 return QL_ERR_INVALID_ARG;
634 }
635
636 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
637 if(info->apn_param == NULL) {
638 return QL_ERR_INVALID_ARG;
639 }
640 memcpy(info->apn_param->apn_info.apn_name, apn_name, strlen(apn_name));
641
642 return QL_ERR_OK;
643}
644
645/*-----------------------------------------------------------------------------------------------*/
646/**
647 @brief Get APN name from configuration instance
648 @param[in] param Point to the data call configuration instance
649 @param[out] buf APN name buffer
650 @param[in] buf_len APN name buffer size
651 @return
652 QL_ERR_OK - Successful
653 QL_ERR_INVALID_ARG - Invalid arguments
654 */
655/*-----------------------------------------------------------------------------------------------*/
656int ql_data_call_param_get_apn_name(ql_data_call_param_t *param, char *buf, int buf_len)
657{
658 if(ql_info_handle == NULL)
659 {
660 return QL_ERR_SERVICE_NOT_READY;
661 }
662
663 if(param == NULL || buf == NULL || buf_len <= 0) {
664 return QL_ERR_INVALID_ARG;
665 }
666
667 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
668 if(info->apn_param == NULL) {
669 return QL_ERR_INVALID_ARG;
670 }
671 if(strlen(info->apn_param->apn_info.apn_name) + 1 > buf_len) {
672 return QL_ERR_INVALID_ARG;
673 }
674 memcpy(buf, info->apn_param->apn_info.apn_name, strlen(info->apn_param->apn_info.apn_name));
675
676 return QL_ERR_OK;
677}
678
679/*-----------------------------------------------------------------------------------------------*/
680/**
681 @brief Configure APN user name
682 @param[in] param Point to the data call configuration instance
683 @param[in] user_name APN user name
684 @return
685 QL_ERR_OK - Successful
686 QL_ERR_INVALID_ARG - Invalid arguments
687 */
688/*-----------------------------------------------------------------------------------------------*/
689int ql_data_call_param_set_user_name(ql_data_call_param_t *param, const char *user_name)
690{
691 if(ql_info_handle == NULL)
692 {
693 return QL_ERR_SERVICE_NOT_READY;
694 }
695
696 if(param == NULL || user_name == NULL || strlen(user_name) == 0
697 || strlen(user_name) > QL_NET_MAX_APN_USERNAME_LEN) {
698 return QL_ERR_INVALID_ARG;
699 }
700
701 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
702 if(info->apn_param == NULL) {
703 return QL_ERR_INVALID_ARG;
704 }
705 memcpy(info->apn_param->apn_info.username, user_name, strlen(user_name));
706
707 return QL_ERR_OK;
708}
709
710/*-----------------------------------------------------------------------------------------------*/
711/**
712 @brief Get APN user name from configuration instance
713 @param[in] param Point to the data call configuration instance
714 @param[out] buf APN user name buffer
715 @param[in] buf_len APN user name buffer size
716 @return
717 QL_ERR_OK - Successful
718 QL_ERR_INVALID_ARG - Invalid arguments
719 */
720/*-----------------------------------------------------------------------------------------------*/
721int ql_data_call_param_get_user_name(ql_data_call_param_t *param, char *buf, int buf_len)
722{
723 if(ql_info_handle == NULL)
724 {
725 return QL_ERR_SERVICE_NOT_READY;
726 }
727
728 if(param == NULL || buf == NULL || buf_len <= 0) {
729 return QL_ERR_INVALID_ARG;
730 }
731
732 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
733 if(info->apn_param == NULL) {
734 return QL_ERR_INVALID_ARG;
735 }
736 if(strlen(info->apn_param->apn_info.username) + 1 > buf_len) {
737 return QL_ERR_INVALID_ARG;
738 }
739 memcpy(buf, info->apn_param->apn_info.username, strlen(info->apn_param->apn_info.username));
740
741 return QL_ERR_OK;
742}
743
744/*-----------------------------------------------------------------------------------------------*/
745/**
746 @brief Configure APN user password
747 @param[in] param Point to the data call configuration instance
748 @param[in] user_password APN user password
749 @return
750 QL_ERR_OK - Not enough memory
751 QL_ERR_INVALID_ARG - Invalid arguments
752 */
753/*-----------------------------------------------------------------------------------------------*/
754int ql_data_call_param_set_user_password(ql_data_call_param_t *param, const char *user_password)
755{
756 if(ql_info_handle == NULL)
757 {
758 return QL_ERR_SERVICE_NOT_READY;
759 }
760
761 if(param == NULL || user_password == NULL || strlen(user_password) == 0
762 || strlen(user_password) > QL_NET_MAX_APN_PASSWORD_LEN) {
763 return QL_ERR_INVALID_ARG;
764 }
765
766 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
767 if(info->apn_param == NULL) {
768 return QL_ERR_INVALID_ARG;
769 }
770 memcpy(info->apn_param->apn_info.password, user_password, strlen(user_password));
771
772 return QL_ERR_OK;
773}
774
775/*-----------------------------------------------------------------------------------------------*/
776/**
777 @brief Get APN user password from configuration instance
778 @param[in] param Point to the data call configuration instance
779 @param[out] buf APN user password buffer
780 @param[in] buf_len APN user password buffer size
781 @return
782 QL_ERR_OK - Not enough memory
783 QL_ERR_INVALID_ARG - Invalid arguments
784 */
785/*-----------------------------------------------------------------------------------------------*/
786int ql_data_call_param_get_user_password(ql_data_call_param_t *param, char *buf, int buf_len)
787{
788 if(ql_info_handle == NULL)
789 {
790 return QL_ERR_SERVICE_NOT_READY;
791 }
792
793 if(param == NULL || buf == NULL || buf_len <= 0) {
794 return QL_ERR_INVALID_ARG;
795 }
796
797 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
798 if(info->apn_param == NULL) {
799 return QL_ERR_INVALID_ARG;
800 }
801 if(strlen(info->apn_param->apn_info.password) + 1 > buf_len) {
802 return QL_ERR_INVALID_ARG;
803 }
804 memcpy(buf, info->apn_param->apn_info.password, strlen(info->apn_param->apn_info.password));
805
806 return QL_ERR_OK;
807}
808
809
810/*-----------------------------------------------------------------------------------------------*/
811/**
812 @brief Configure the data call authentication method
813 @param[in] param Point to the data call configuration instance
814 @param[in] auth_pref Defined by QL_DATA_CALL_AUTH_PREF_E
815 @return
816 QL_ERR_OK - Successful
817 QL_ERR_INVALID_ARG - Invalid arguments
818 */
819/*-----------------------------------------------------------------------------------------------*/
820int ql_data_call_param_set_auth_pref(ql_data_call_param_t *param, int auth_pref)
821{
822 if(ql_info_handle == NULL)
823 {
824 return QL_ERR_SERVICE_NOT_READY;
825 }
826
827 if(param == NULL) {
828 return QL_ERR_INVALID_ARG;
829 }
830
831 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
832 if(info->apn_param == NULL) {
833 return QL_ERR_INVALID_ARG;
834 }
835 info->apn_param->apn_info.auth_pref = (QL_NET_AUTH_PREF_E)auth_pref;
836
837 return QL_ERR_OK;
838
839}
840
841/*-----------------------------------------------------------------------------------------------*/
842/**
843 @brief Configure the data call authentication method
844 @param[in] param Point to the data call configuration instance
845 @param[out] p_data Store return value
846 @return
847 QL_ERR_OK - Successful
848 QL_ERR_INVALID_ARG - Invalid arguments
849 */
850/*-----------------------------------------------------------------------------------------------*/
851int ql_data_call_param_get_auth_pref(ql_data_call_param_t *param, int *p_data)
852{
853 if(ql_info_handle == NULL)
854 {
855 return QL_ERR_SERVICE_NOT_READY;
856 }
857
858 if(param == NULL || p_data == NULL) {
859 return QL_ERR_INVALID_ARG;
860 }
861
862 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
863 if(info->apn_param == NULL) {
864 return QL_ERR_INVALID_ARG;
865 }
866 *p_data = info->apn_param->apn_info.auth_pref;
867
868 return QL_ERR_OK;
869}
870
871
872/*-----------------------------------------------------------------------------------------------*/
873/**
874 @brief Configure the data call IP version
875 @param[in] param Point to the data call configuration instance
876 @param[in] ip_ver Defined by QL_NET_IP_VER_E
877 @return
878 QL_ERR_OK - Successful
879 QL_ERR_INVALID_ARG - Invalid arguments
880 */
881/*-----------------------------------------------------------------------------------------------*/
882int ql_data_call_param_set_ip_version(ql_data_call_param_t *param, int ip_ver)
883{
884 if(ql_info_handle == NULL)
885 {
886 return QL_ERR_SERVICE_NOT_READY;
887 }
888
889 if(param == NULL) {
890 return QL_ERR_INVALID_ARG;
891 }
892
893 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
894 if(info->apn_param == NULL) {
895 return QL_ERR_INVALID_ARG;
896 }
897 info->apn_param->apn_info.ip_ver = (QL_NET_IP_VER_E)ip_ver;
898
899 return QL_ERR_OK;
900}
901
902/*-----------------------------------------------------------------------------------------------*/
903/**
904 @brief Get IP version from configuration instance
905 @param[in] param Point to the data call configuration instance
906 @param[out] p_ver Store return value
907 @return
908 QL_ERR_OK - Successful
909 QL_ERR_INVALID_ARG - Invalid arguments
910 */
911/*-----------------------------------------------------------------------------------------------*/
912int ql_data_call_param_get_ip_version(ql_data_call_param_t *param, int *p_ver)
913{
914 if(ql_info_handle == NULL)
915 {
916 return QL_ERR_SERVICE_NOT_READY;
917 }
918
919 if(param == NULL || p_ver == NULL) {
920 return QL_ERR_INVALID_ARG;
921 }
922
923 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
924 if(info->apn_param == NULL) {
925 return QL_ERR_INVALID_ARG;
926 }
927 *p_ver = info->apn_param->apn_info.ip_ver;
928
929 return QL_ERR_OK;
930}
931
932/*-----------------------------------------------------------------------------------------------*/
933/**
934 @brief Configure the data call auto reconnection mode
935 @param[in] param Point to the data call configuration instance
936 @param[in] mode Defined by QL_NET_DATA_CALL_RECONNECT_MODE_E
937 @return
938 QL_ERR_OK - Successful
939 QL_ERR_INVALID_ARG - Invalid arguments
940 */
941/*-----------------------------------------------------------------------------------------------*/
942int ql_data_call_param_set_reconnect_mode(ql_data_call_param_t *param, int reconnect_mode)
943{
944 if(ql_info_handle == NULL)
945 {
946 return QL_ERR_SERVICE_NOT_READY;
947 }
948
949 if(param == NULL) {
950 return QL_ERR_INVALID_ARG;
951 }
952
953 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
954 info->reconnect_mode = reconnect_mode;
955
956 return QL_ERR_OK;
957}
958
959/*-----------------------------------------------------------------------------------------------*/
960/**
961 @brief Get auto reconnection mode from configuration instance
962 @param[in] param Point to the data call configuration instance
963 @param[out] p_mode Store return value
964 @return
965 QL_ERR_OK - Successful
966 QL_ERR_INVALID_ARG - Invalid arguments
967 */
968/*-----------------------------------------------------------------------------------------------*/
969int ql_data_call_param_get_reconnect_mode(ql_data_call_param_t *param, int *p_mode)
970{
971 if(ql_info_handle == NULL)
972 {
973 return QL_ERR_SERVICE_NOT_READY;
974 }
975
976 if(param == NULL || p_mode == NULL) {
977 return QL_ERR_INVALID_ARG;
978 }
979
980 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
981 *p_mode = info->reconnect_mode;
982
983 return QL_ERR_OK;
984}
985
986/*-----------------------------------------------------------------------------------------------*/
987/**
988 @brief Configure the data call auto reconnection interval
989 @param[in] param Point to the data call configuration instance
990 @param[in] time_list Interval time list in ms
991 @param[in] num Number of time list
992 @return
993 QL_ERR_OK - Successful
994 QL_ERR_INVALID_ARG - Invalid arguments
995 */
996/*-----------------------------------------------------------------------------------------------*/
997int ql_data_call_param_set_reconnect_interval(ql_data_call_param_t *param, int *time_list, int num)
998{
999 if(ql_info_handle == NULL)
1000 {
1001 return QL_ERR_SERVICE_NOT_READY;
1002 }
1003
1004 if(param == NULL || time_list == NULL || num <= 0 || num > QL_NET_MAX_RECONNECT_INTERVAL_LEN) {
1005 return QL_ERR_INVALID_ARG;
1006 }
1007
1008 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
1009 info->time_num = num;
1010 memcpy(&(info->time_list), time_list, sizeof(int) * num);
1011
1012 return QL_ERR_OK;
1013}
1014
1015/*-----------------------------------------------------------------------------------------------*/
1016/**
1017 @brief Get auto reconnection interval from configuration instance
1018 @param[in] param Point to the data call configuration instance
1019 @param[out] time_list Store return value
1020 @param[in,out] p_num
1021 @return
1022 QL_ERR_OK - Successful
1023 QL_ERR_INVALID_ARG - Invalid arguments
1024 */
1025/*-----------------------------------------------------------------------------------------------*/
1026int ql_data_call_param_get_reconnect_interval(ql_data_call_param_t *param, int *time_list, int *p_num)
1027{
1028 if(ql_info_handle == NULL)
1029 {
1030 return QL_ERR_SERVICE_NOT_READY;
1031 }
1032
1033 if(param == NULL || time_list == NULL || p_num == NULL) {
1034 return QL_ERR_INVALID_ARG;
1035 }
1036
1037 mbtk_data_call_param_info_t *info = (mbtk_data_call_param_info_t*)param;
1038 *p_num = info->time_num;
1039 int i = 0;
1040 for(; i < info->time_num; i++) {
1041 *(time_list + i) = info->time_list[i];
1042 }
1043
1044 return QL_ERR_OK;
1045}
1046
1047/*-----------------------------------------------------------------------------------------------*/
1048/**
1049 @brief Configure the specified data call instance
1050 @param[in] call_id Specify a data call instance
1051 @param[in] param Point to the data call configuration instance
1052 @return
1053 QL_ERR_OK - Successful
1054 QL_ERR_INVALID_ARG - Invalid arguments
1055 */
1056/*-----------------------------------------------------------------------------------------------*/
1057int ql_data_call_config(int call_id, ql_data_call_param_t *param)
1058{
1059 if(ql_info_handle == NULL)
1060 {
1061 return QL_ERR_SERVICE_NOT_READY;
1062 }
1063
1064 if(param == NULL) {
1065 return QL_ERR_INVALID_ARG;
1066 }
1067
1068 int i = 0;
1069 while(i < QL_NET_MAX_DATA_CALL_NUM) {
1070 if(data_call_info[i].call_info.call_id == call_id) {
1071 break;
1072 }
1073 i++;
1074 }
1075
1076 if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this call_id.
1077 LOGW("Unknown call_id : %d", call_id);
1078 return QL_ERR_UNKNOWN;
1079 }
1080
1081 memcpy(&(data_call_info[i].call_param_info), param, sizeof(mbtk_data_call_param_info_t));;
1082
1083 if(data_call_info[i].call_param_info.apn_param == NULL) {
1084 return QL_ERR_INVALID_ARG;
1085 }
1086 snprintf(data_call_info[i].call_state.device, QL_NET_MAX_NAME_LEN, "ccinet%d",
1087 data_call_info[i].call_param_info.apn_param->apn_id - 1);
1088 data_call_info[i].call_state.ip_ver = data_call_info[i].call_param_info.apn_param->apn_info.ip_ver;
1089 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_IDLE;
1090
1091 return QL_ERR_OK;
1092}
1093
1094/*-----------------------------------------------------------------------------------------------*/
1095/**
1096 @brief Get the specified data call configuration instance
1097 @param[in] call_id Specify a data call instance
1098 @param[in] param Point to the data call configuration instance
1099 @return
1100 QL_ERR_OK - Successful
1101 QL_ERR_INVALID_ARG - Invalid arguments
1102 */
1103/*-----------------------------------------------------------------------------------------------*/
1104int ql_data_call_get_config(int call_id, ql_data_call_param_t *param)
1105{
1106 if(ql_info_handle == NULL)
1107 {
1108 return QL_ERR_SERVICE_NOT_READY;
1109 }
1110
1111 if(param == NULL) {
1112 return QL_ERR_INVALID_ARG;
1113 }
1114
1115 int i = 0;
1116 while(i < QL_NET_MAX_DATA_CALL_NUM) {
1117 if(data_call_info[i].call_info.call_id == call_id) {
1118 break;
1119 }
1120 i++;
1121 }
1122
1123 if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this call_id.
1124 LOGW("Unknown call_id : %d", call_id);
1125 return QL_ERR_UNKNOWN;
1126 }
1127
1128 memcpy(param, &(data_call_info[i].call_param_info), sizeof(mbtk_data_call_param_info_t));
1129
1130 return QL_ERR_OK;
1131}
1132
1133/*-----------------------------------------------------------------------------------------------*/
1134/**
1135 @brief Start data call
1136 @param[in] call_id Specify a data call instance
1137 @return
1138 QL_ERR_OK - successful
1139 QL_ERR_NOT_INIT - uninitialized
1140 QL_ERR_SERVICE_NOT_READY - service is not ready
1141 QL_ERR_INVALID_ARG - Invalid arguments
1142 Other - error code defined by ql_type.h
1143 */
1144/*-----------------------------------------------------------------------------------------------*/
1145int ql_data_call_start(int call_id)
1146{
1147 if(ql_info_handle == NULL)
1148 {
1149 return QL_ERR_SERVICE_NOT_READY;
1150 }
1151
1152 int i = call_index_get_by_call_id(call_id);
1153 if(i < 0) {
1154 LOGE("Unknown call_id : %d", call_id);
1155 return QL_ERR_UNKNOWN;
1156 }
1157
1158 if(data_call_info[i].call_param_info.apn_param == NULL) {
1159 LOGE("data_call_info[i]->call_param_info->apn_param is NULL.");
1160 return QL_ERR_UNKNOWN;
1161 }
1162
1163 int ret = data_call_state_query(call_id);
1164 if(ret) {
1165 LOGE("data_call_state_query fail.");
1166 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_IDLE;
1167 // return QL_ERR_UNKNOWN;
1168 }
1169
1170 if(data_call_info[i].call_state.call_status == QL_NET_DATA_CALL_STATUS_PARTIAL_V4_CONNECTED
1171 || data_call_info[i].call_state.call_status == QL_NET_DATA_CALL_STATUS_PARTIAL_V6_CONNECTED
1172 || data_call_info[i].call_state.call_status == QL_NET_DATA_CALL_STATUS_CONNECTED) {
1173 LOGW("call_id %d has connected.", call_id);
1174 return QL_ERR_UNKNOWN;
1175 }
1176
1177 LOGD("Start Data Call : %d", call_id);
1178 data_call_info_item_print(call_id);
1179
1180 // Set APN in the first.
1181 mbtk_ip_type_enum ip_type;
1182 switch(data_call_info[i].call_param_info.apn_param->apn_info.ip_ver) {
1183 case QL_NET_IP_VER_V4:
1184 ip_type = MBTK_IP_TYPE_IP;
1185 break;
1186 case QL_NET_IP_VER_V6:
1187 ip_type = MBTK_IP_TYPE_IPV6;
1188 break;
1189 case QL_NET_IP_VER_V4V6:
1190 ip_type = MBTK_IP_TYPE_IPV4V6;
1191 break;
1192 default:
1193 LOGE("Unknown ip_ver.");
1194 return QL_ERR_UNKNOWN;
1195 }
1196
1197 char auth_type[64]={0};
1198 switch(data_call_info[i].call_param_info.apn_param->apn_info.auth_pref) {
1199 case QL_NET_AUTH_PREF_PAP_CHAP_NOT_ALLOWED:
1200 memcpy(auth_type,"NONE",strlen("NONE"));
1201 break;
1202 case QL_NET_AUTH_PREF_PAP_ONLY_ALLOWED:
1203 memcpy(auth_type,"PAP",strlen("PAP"));
1204 break;
1205 case QL_NET_AUTH_PREF_CHAP_ONLY_ALLOWED:
1206 memcpy(auth_type,"CHAP",strlen("CHAP"));
1207 break;
1208#if 0
1209 case QL_NET_AUTH_PREF_PAP_CHAP_BOTH_ALLOWED:
1210 apninfo.auth_proto = MBTK_APN_AUTH_PROTO_PAP_CHAP;
1211 break;
1212#endif
1213 default:
1214 LOGE("Unknown auth_pref.");
1215 return QL_ERR_UNKNOWN;
1216 }
1217
1218 ret = mbtk_apn_set(ql_info_handle, data_call_info[i].call_param_info.apn_param->apn_id, ip_type,
1219 data_call_info[i].call_param_info.apn_param->apn_info.apn_name,
1220 data_call_info[i].call_param_info.apn_param->apn_info.username,
1221 data_call_info[i].call_param_info.apn_param->apn_info.password, auth_type);
1222 if(ret) {
1223 LOGE("mbtk_apn_set fail.");
1224 return QL_ERR_UNKNOWN;
1225 }
1226
1227 // Start data call.
1228 int auto_conn_interval = 0;
1229 QL_NET_DATA_CALL_STATUS_E pre_call_status = data_call_info[i].call_state.call_status;
1230 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_CONNECTING;
1231 if(data_call_status_ind_cb) {
1232 data_call_status_ind_cb(call_id, pre_call_status,
1233 &(data_call_info[i].call_state));
1234 }
1235
1236 if(data_call_info[i].call_param_info.reconnect_mode == QL_NET_DATA_CALL_RECONNECT_NORMAL
1237 || data_call_info[i].call_param_info.reconnect_mode == QL_NET_DATA_CALL_RECONNECT_MODE_1
1238 || data_call_info[i].call_param_info.reconnect_mode == QL_NET_DATA_CALL_RECONNECT_MODE_2) {
1239 if(data_call_info[i].call_param_info.time_num > 0) {
1240 auto_conn_interval = data_call_info[i].call_param_info.time_list[0];
1241 }
1242 } else {
1243 auto_conn_interval = 0;
1244 }
1245
1246 ret = mbtk_data_call_start(ql_info_handle, data_call_info[i].call_param_info.apn_param->apn_id, auto_conn_interval,
1247 FALSE, 0);
1248 if(ret) {
1249 LOGE("mbtk_data_call_start fail.");
1250 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_ERROR;
1251 return QL_ERR_UNKNOWN;
1252 }
1253
1254 ret = data_call_state_query(call_id);
1255 if(ret) {
1256 LOGE("data_call_state_query fail.");
1257 data_call_info[i].call_state.call_status = QL_NET_DATA_CALL_STATUS_ERROR;
1258 return QL_ERR_UNKNOWN;
1259 }
1260
1261 return QL_ERR_OK;
1262}
1263
1264/*-----------------------------------------------------------------------------------------------*/
1265/**
1266 @brief Stop data call
1267 @param[in] call_id Specify a data call instance
1268 @return
1269 QL_ERR_OK - successful
1270 QL_ERR_NOT_INIT - uninitialized
1271 QL_ERR_SERVICE_NOT_READY - service is not ready
1272 QL_ERR_INVALID_ARG - Invalid arguments
1273 Other - error code defined by ql_type.h
1274 */
1275/*-----------------------------------------------------------------------------------------------*/
1276int ql_data_call_stop(int call_id)
1277{
1278 if(ql_info_handle == NULL)
1279 {
1280 return QL_ERR_SERVICE_NOT_READY;
1281 }
1282
1283 int i = 0;
1284 while(i < QL_NET_MAX_DATA_CALL_NUM) {
1285 if(data_call_info[i].call_info.call_id == call_id) {
1286 break;
1287 }
1288 i++;
1289 }
1290
1291 if(data_call_info[i].call_param_info.apn_param) {
1292 int ret = mbtk_data_call_stop(ql_info_handle, data_call_info[i].call_param_info.apn_param->apn_id, 15);
1293 if(ret) {
1294 LOGE("mbtk_data_call_stop() fail.");
1295 return QL_ERR_UNKNOWN;
1296 }
1297 } else {
1298 LOGE("data_call_info[i]->call_param_info->apn_param is NULL.");
1299 return QL_ERR_UNKNOWN;
1300 }
1301
1302 return QL_ERR_OK;
1303}
1304
1305/*-----------------------------------------------------------------------------------------------*/
1306/**
1307 @brief Delete a data call instance
1308 @param[in] call_id Specify a data call instance
1309 @return
1310 QL_ERR_OK - successful
1311 QL_ERR_NOT_INIT - uninitialized
1312 QL_ERR_SERVICE_NOT_READY - service is not ready
1313 QL_ERR_INVALID_ARG - Invalid arguments
1314 Other - error code defined by ql_type.h
1315 */
1316/*-----------------------------------------------------------------------------------------------*/
1317int ql_data_call_delete(int call_id)
1318{
1319 if(ql_info_handle == NULL)
1320 {
1321 return QL_ERR_SERVICE_NOT_READY;
1322 }
1323
1324 int i = 0;
1325 while(i < QL_NET_MAX_DATA_CALL_NUM) {
1326 if(data_call_info[i].call_info.call_id == call_id) {
1327 break;
1328 }
1329 i++;
1330 }
1331
1332 if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this call_id.
1333 LOGW("Unknown call_id : %d", call_id);
1334 return QL_ERR_UNKNOWN;
1335 }
1336
1337 if(data_call_info[i].call_param_info.apn_param) {
1338 memset(data_call_info[i].call_param_info.apn_param, 0, sizeof(mbtk_data_call_apn_param_info_t));
1339 }
1340 memset(&(data_call_info[i]), 0, sizeof(mbtk_data_call_info_t));
1341 return QL_ERR_OK;
1342}
1343
1344/*-----------------------------------------------------------------------------------------------*/
1345/**
1346 @brief Get the current data call instance list
1347 @param[out] list Data call instance array
1348 @param[in,out] list_len, in-> Data call instance array size, out->current data call instance number
1349 @return
1350 QL_ERR_OK - successful
1351 QL_ERR_NOT_INIT - uninitialized
1352 QL_ERR_SERVICE_NOT_READY - service is not ready
1353 QL_ERR_INVALID_ARG - Invalid arguments
1354 Other - error code defined by ql_type.h
1355 */
1356/*-----------------------------------------------------------------------------------------------*/
1357int ql_data_call_get_list(ql_data_call_item_t *list, int *list_len)
1358{
1359 if(ql_info_handle == NULL)
1360 {
1361 return QL_ERR_SERVICE_NOT_READY;
1362 }
1363
1364 if(list == NULL || list_len == NULL) {
1365 return QL_ERR_INVALID_ARG;
1366 }
1367
1368 int i = 0;
1369 *list_len = 0;
1370 while(i < QL_NET_MAX_DATA_CALL_NUM) {
1371 if(data_call_info[i].call_info.call_id > 0) {
1372 memset(&(list[*list_len]), 0, sizeof(ql_data_call_item_t));
1373 list[*list_len].call_id = data_call_info[i].call_info.call_id;
1374 memcpy(list[*list_len].call_name, data_call_info[i].call_info.call_name,
1375 strlen(data_call_info[i].call_info.call_name));
1376
1377 (*list_len)++;
1378 }
1379 i++;
1380 }
1381
1382 return QL_ERR_OK;
1383}
1384
1385/*-----------------------------------------------------------------------------------------------*/
1386/**
1387 @brief Get the data call status
1388 @param[in] call_id Specify a data call instance
1389 @param[out] p_sta Point to status instance
1390 @return
1391 QL_ERR_OK - successful
1392 QL_ERR_NOT_INIT - uninitialized
1393 QL_ERR_SERVICE_NOT_READY - service is not ready
1394 QL_ERR_INVALID_ARG - Invalid arguments
1395 Other - error code defined by ql_type.h
1396 */
1397/*-----------------------------------------------------------------------------------------------*/
1398int ql_data_call_get_status(int call_id, ql_data_call_status_t *p_sta)
1399{
1400 if(ql_info_handle == NULL)
1401 {
1402 return QL_ERR_SERVICE_NOT_READY;
1403 }
1404
1405 if(p_sta == NULL) {
1406 return QL_ERR_INVALID_ARG;
1407 }
1408
1409 int i = 0;
1410 while(i < QL_NET_MAX_DATA_CALL_NUM) {
1411 if(data_call_info[i].call_info.call_id == call_id) {
1412 break;
1413 }
1414 i++;
1415 }
1416
1417 if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this call_id.
1418 LOGW("Unknown call_id : %d", call_id);
1419 return QL_ERR_UNKNOWN;
1420 }
1421
1422 memcpy(p_sta, &(data_call_info[i].call_state), sizeof(ql_data_call_status_t));
1423
1424 return QL_ERR_OK;
1425}
1426
1427/*-----------------------------------------------------------------------------------------------*/
1428/**
1429 @brief Register data call status change event
1430 @param[in] cb
1431 @return
1432 QL_ERR_OK - successful
1433 QL_ERR_NOT_INIT - uninitialized
1434 QL_ERR_SERVICE_NOT_READY - service is not ready
1435 QL_ERR_INVALID_ARG - Invalid arguments
1436 Other - error code defined by ql_type.h
1437 */
1438/*-----------------------------------------------------------------------------------------------*/
1439int ql_data_call_set_status_ind_cb(ql_data_call_status_ind_cb_f cb)
1440{
1441 if(ql_info_handle == NULL)
1442 {
1443 return QL_ERR_UNKNOWN;
1444 } else {
1445 if(mbtk_pdp_state_change_cb_reg(ql_info_handle, data_call_state_change_cb))
1446 {
1447 return QL_ERR_UNKNOWN;
1448 }
1449
1450 data_call_status_ind_cb = cb;
1451 return QL_ERR_OK;
1452 }
1453}
1454
1455/*-----------------------------------------------------------------------------------------------*/
1456/**
1457 @brief Set APN related configuration.If the apn does not exist, it is automatically created.
1458 @param[in] apn_id APN ID, range:1-16
1459 @param[in] p_info APN configuration
1460 @return
1461 QL_ERR_OK - successful
1462 QL_ERR_NOT_INIT - uninitialized
1463 QL_ERR_SERVICE_NOT_READY - service is not ready
1464 QL_ERR_INVALID_ARG - Invalid arguments
1465 Other - error code defined by ql_type.h
1466 */
1467/*-----------------------------------------------------------------------------------------------*/
1468int ql_data_call_set_apn_config(int apn_id, ql_data_call_apn_config_t *p_info)
1469{
1470 if(ql_info_handle == NULL)
1471 {
1472 return QL_ERR_SERVICE_NOT_READY;
1473 }
1474
1475 if(p_info == NULL) {
1476 return QL_ERR_INVALID_ARG;
1477 }
1478
1479 int i = 0;
1480 while(i < QL_NET_MAX_DATA_CALL_NUM) {
1481 if(data_call_info[i].call_param_info.apn_param
1482 && data_call_info[i].call_param_info.apn_param->apn_id == apn_id) {
1483 break;
1484 }
1485 i++;
1486 }
1487
1488 if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this apn_id.
1489 LOGW("New apn_id : %d", apn_id);
1490 // New data call param.
1491 int j = 0;
1492 while(j < QL_NET_MAX_DATA_CALL_NUM) {
1493 if(data_call_apn_param_list[j].apn_id <= 0) {
1494 break;
1495 }
1496 j++;
1497 }
1498
1499 if(j == QL_NET_MAX_DATA_CALL_NUM) { // Full
1500 LOGW("data_call_apn_param_list is full.");
1501 return QL_ERR_UNKNOWN;
1502 }
1503
1504 data_call_apn_param_list[j].apn_id = apn_id;
1505 memcpy(&(data_call_apn_param_list[j].apn_info), p_info, sizeof(ql_data_call_apn_config_t));
1506 } else {
1507 memcpy(&(data_call_info[i].call_param_info.apn_param->apn_info), p_info, sizeof(ql_data_call_apn_config_t));
1508 }
1509
1510 return QL_ERR_OK;
1511}
1512
1513/*-----------------------------------------------------------------------------------------------*/
1514/**
1515 @brief Set APN related configuration. If the apn does not exist, it is automatically created and
1516 the default parameters are set.
1517 @param[in] apn_id APN ID, range:1-16
1518 @param[out] p_info APN configuration
1519 @return
1520 QL_ERR_OK - successful
1521 QL_ERR_NOT_INIT - uninitialized
1522 QL_ERR_SERVICE_NOT_READY - service is not ready
1523 QL_ERR_INVALID_ARG - Invalid arguments
1524 Other - error code defined by ql_type.h
1525 */
1526/*-----------------------------------------------------------------------------------------------*/
1527int ql_data_call_get_apn_config(int apn_id, ql_data_call_apn_config_t *p_info)
1528{
1529 if(ql_info_handle == NULL)
1530 {
1531 return QL_ERR_SERVICE_NOT_READY;
1532 }
1533
1534 if(p_info == NULL || p_info == NULL) {
1535 return QL_ERR_INVALID_ARG;
1536 }
1537
1538 int i = 0;
1539 while(i < QL_NET_MAX_DATA_CALL_NUM) {
1540 if(data_call_info[i].call_param_info.apn_param
1541 && data_call_info[i].call_param_info.apn_param->apn_id == apn_id) {
1542 break;
1543 }
1544 i++;
1545 }
1546
1547 if(i == QL_NET_MAX_DATA_CALL_NUM) { // No found this apn_id.
1548 LOGE("Unknown apn_id : %d", apn_id);
1549 return QL_ERR_UNKNOWN;
1550 } else {
1551 memcpy(p_info, &(data_call_info[i].call_param_info.apn_param->apn_info), sizeof(ql_data_call_apn_config_t));
1552 }
1553
1554 return QL_ERR_OK;
1555}
1556
1557/*-----------------------------------------------------------------------------------------------*/
1558/**
1559 @brief Set APN related configuration,APN ID:1
1560 @param[in] p_info APN configuration
1561 @return
1562 QL_ERR_OK - successful
1563 QL_ERR_NOT_INIT - uninitialized
1564 QL_ERR_SERVICE_NOT_READY - service is not ready
1565 QL_ERR_INVALID_ARG - Invalid arguments
1566 Other - error code defined by ql_type.h
1567 */
1568/*-----------------------------------------------------------------------------------------------*/
1569int ql_data_call_set_attach_apn_config(ql_data_call_apn_config_t *p_info)
1570{
1571 return ql_data_call_set_apn_config(1, p_info);
1572}
1573
1574/*-----------------------------------------------------------------------------------------------*/
1575/**
1576 @brief Registration server error callback. Currently, only if the server exits abnormally,
1577 the callback function will be executed, and the error code is QL_ERR_ABORTED;
1578 @param[in] cb Callback function
1579 @return
1580 QL_ERR_OK - successful
1581 Other - error code defined by ql_type.h
1582 */
1583/*-----------------------------------------------------------------------------------------------*/
1584int ql_data_call_set_service_error_cb(ql_data_call_service_error_cb_f cb)
1585{
1586 if(ql_info_handle == NULL)
1587 {
1588 return QL_ERR_UNKNOWN;
1589 } else {
1590 if(mbtk_ril_server_state_change_reg(ql_info_handle, ril_server_state_cb))
1591 {
1592 return QL_ERR_UNKNOWN;
1593 }
1594
1595 data_call_service_error_cb = cb;
1596 return QL_ERR_OK;
1597 }
1598}
1599
1600/*-----------------------------------------------------------------------------------------------*/
1601/**
1602 @brief Deinitialize the data call service
1603 @return
1604 QL_ERR_OK - successful
1605 Other - error code defined by ql_type.h
1606 */
1607/*-----------------------------------------------------------------------------------------------*/
1608int ql_data_call_deinit(void)
1609{
1610 if(ql_info_handle == NULL)
1611 {
1612 return QL_ERR_UNKNOWN;
1613 } else {
1614 if(mbtk_info_handle_free(&ql_info_handle))
1615 {
1616 return QL_ERR_UNKNOWN;
1617 }
1618
1619 return QL_ERR_OK;
1620 }
1621}