blob: e26e35b3318d61e6f876a96969b71a940cb7f408 [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include "gsw_nw_interface.h"
2#include <stdint.h>
3#include <string.h>
4#include <stdbool.h>
5#include <stdio.h>
6#include <dlfcn.h>
7#include <stdlib.h>
8#include <sys/socket.h>
9#include <netinet/in.h>
10#include <arpa/inet.h>
11#include <pthread.h>
12
13
14//mbtk include
15#define MBTK_APN_NAME_SIZE 150+1
16#define MBTK_APN_USERNAME_SIZE 127+1
17#define MBTK_APN_PASSWORD_SIZE 127+1
18#define MBTK_APN_TYPE_SIZE 127+1
19
20
21#ifndef FALSE
22#define FALSE (0)
23#endif
24
25
26#ifndef TRUE
27#define TRUE (!FALSE)
28#endif
29
30
31
32
33typedef unsigned int uint32;
34typedef unsigned char uint8;
35typedef unsigned short uint16;
36typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
37typedef unsigned long long uint64_t;
38
39typedef struct
40{
41 int client_fd;
42 pthread_t read_thread_id;
43 int exit_fd[2];
44 bool is_waitting;
45 pthread_cond_t cond;
46 pthread_mutex_t mutex;
47
48 pthread_mutex_t send_mutex;
49
50 // Temp response data.
51 uint16 info_err;
52 uint16 data_len;
53 void *data;
54
55 //mbtk wyq for server_ready_status add start
56 char server_ready_status;
57 //mbtk wyq for server_ready_status add end
58
59 mbtk_info_callback_func net_state_cb;
60 mbtk_info_callback_func call_state_cb;
61 mbtk_info_callback_func sms_state_cb;
62 mbtk_info_callback_func radio_state_cb;
63 mbtk_info_callback_func sim_state_cb;
64 mbtk_info_callback_func pdp_state_cb;
65 //add signal by xr
66 mbtk_info_callback_func signal_state_cb;
67} mbtk_info_handle_t;
68
69typedef enum {
70 MBTK_IP_TYPE_IP,
71 MBTK_IP_TYPE_IPV6,
72 MBTK_IP_TYPE_IPV4V6,
73 MBTK_IP_TYPE_PPP
74} mbtk_ip_type_enum;
75
76typedef enum {
77 MBTK_APN_REQ_TYPE_SET = 0, // set apn req
78 MBTK_APN_REQ_TYPE_ADD // add apn req
79}mbtk_apn_req_type_enum;
80
81typedef enum {
82 MBTK_APN_AUTH_PROTO_DEFAULT = 0,
83 MBTK_APN_AUTH_PROTO_NONE,
84 MBTK_APN_AUTH_PROTO_PAP,
85 MBTK_APN_AUTH_PROTO_CHAP,
86#if 0
87 MBTK_APN_AUTH_PROTO_PAP_CHAP,
88 //NOT SUPPORT
89#endif
90} mbtk_apn_auth_proto_enum;
91
92
93typedef struct {
94 bool valid;
95 uint32 IPAddr;
96 uint32 PrimaryDNS;
97 uint32 SecondaryDNS;
98 uint32 GateWay;
99 uint32 NetMask;
100} __attribute__((packed)) mbtk_ipv4_info_t;
101
102typedef struct {
103 bool valid;
104 uint32 IPV6Addr[4];
105 uint32 PrimaryDNS[4];
106 uint32 SecondaryDNS[4];
107 uint32 GateWay[4];
108 uint32 NetMask[4];
109} __attribute__((packed)) mbtk_ipv6_info_t;
110
111
112
113typedef struct {
114 int cid; /*!< UMTS/CDMA profile ID. range: 0 - 7*/
115 mbtk_ip_type_enum ip_type; /*!< Packet Data Protocol (PDP) type specifies the type of data payload
116 exchanged over the airlink when the packet data session is
117 established with this profile. */
118 mbtk_apn_req_type_enum req_type; /*!< apn req type*/
119 mbtk_apn_auth_proto_enum auth_proto; /*!< Authentication Protocol. */
120 uint8 apn_name[MBTK_APN_NAME_SIZE]; /*!< A string parameter that is a logical name used to select the GGSN
121 and external packet data network. */
122 uint8 user_name[MBTK_APN_USERNAME_SIZE]; /*!< Username used during data network authentication. */
123 uint8 user_pass[MBTK_APN_PASSWORD_SIZE]; /*!< Password to be used during data network authentication. */
124 uint8 apn_type[MBTK_APN_TYPE_SIZE];
125} mbtk_qser_apn_info_s;
126
127static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
128static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
129int (*mbtk_pdp_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
130int (*mbtk_qser_apn_set)(mbtk_info_handle_t* handle, mbtk_qser_apn_info_s *apninfo, unsigned char *cid);
131int (*mbtk_data_call_start)(mbtk_info_handle_t* handle, int cid, int auto_conn_interval, bool boot_conn, int timeout);
132int (*mbtk_data_call_stop)(mbtk_info_handle_t* handle, int cid, int timeout);
133int (*mbtk_data_call_state_get)(mbtk_info_handle_t* handle, int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6);
134int (*mbtk_apn_set)(mbtk_info_handle_t* handle, int cid, mbtk_ip_type_enum ip_type, const void* apn_name, const void *user_name, const void *user_pass, const void *auth);
135int (*ipv6_2_str)(const void *ipv6, void *ipv6_str);
136static void (*mbtk_log)(int level, const char *format, ...);
137static void (*mbtk_log_init)(char *path, char *tag);
138
139#ifndef LOG_ERR_LEVEL
140#define LOG_ERR_LEVEL 3 /* error conditions */
141#endif
142#ifndef LOG_WARN_LEVEL
143#define LOG_WARN_LEVEL 4 /* warning conditions */
144#endif
145#ifndef LOG_INFO_LEVEL
146#define LOG_INFO_LEVEL 6 /* informational */
147#endif
148#ifndef LOG_DEBUG_LEVEL
149#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
150#endif
151#ifndef LOG_VERBOSE_LEVEL
152#define LOG_VERBOSE_LEVEL 8
153#endif
154
155#define LOGV(fmt, args ...) \
156 do{ \
157 char *file_ptr_1001 = __FILE__; \
158 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
159 char line_1001[10] = {0}; \
160 sprintf(line_1001, "%d", __LINE__); \
161 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
162 if(*ptr_1001 == '/') \
163 break; \
164 ptr_1001--; \
165 } \
166 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
167 } while(0)
168
169#define LOGI(fmt, args...) \
170 do{ \
171 char *file_ptr_1001 = __FILE__; \
172 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
173 char line_1001[10] = {0}; \
174 sprintf(line_1001, "%d", __LINE__); \
175 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
176 if(*ptr_1001 == '/') \
177 break; \
178 ptr_1001--; \
179 } \
180 mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
181 } while(0)
182
183#define LOGD(fmt, args...) \
184 do{ \
185 char *file_ptr_1001 = __FILE__; \
186 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
187 char line_1001[10] = {0}; \
188 sprintf(line_1001, "%d", __LINE__); \
189 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
190 if(*ptr_1001 == '/') \
191 break; \
192 ptr_1001--; \
193 } \
194 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
195 } while(0)
196
197#define LOGW(fmt, args...) \
198 do{ \
199 char *file_ptr_1001 = __FILE__; \
200 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
201 char line_1001[10] = {0}; \
202 sprintf(line_1001, "%d", __LINE__); \
203 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
204 if(*ptr_1001 == '/') \
205 break; \
206 ptr_1001--; \
207 } \
208 mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
209 } while(0)
210
211#define LOGE(fmt, args...) \
212 do{ \
213 char *file_ptr_1001 = __FILE__; \
214 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
215 char line_1001[10] = {0}; \
216 sprintf(line_1001, "%d", __LINE__); \
217 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
218 if(*ptr_1001 == '/') \
219 break; \
220 ptr_1001--; \
221 } \
222 mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
223 } while(0)
224
225
226//define
227#define GSW_HAL_FAIL GSW_HAL_NORMAL_FAIL
228#define lib_mbtk_path "/lib/libmbtk_lib.so"
229pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER;
230static int data_call_lock = 0;
231static int data_init_flag = 0;
232static void *dlHandle_mbtk;
233static mbtk_info_handle_t* data_info_handle = NULL;
234static gsw_data_call_evt_cb_t gsw_data_call_evt_cb;
235
236Wan_State_ind_s *linkState_arr;
237
238static int Wan_State_ind_malloc(Wan_State_ind_s **linkState)
239{
240 (*linkState) = (Wan_State_ind_s *)malloc(sizeof(Wan_State_ind_s));
241 if((*linkState) == NULL)
242 {
243 LOGE("malloc Wan_State_ind_s fail\n");
244 return GSW_HAL_FAIL;
245 }
246
247 memset((*linkState), 0x00, sizeof(Wan_State_ind_s));
248
249 (*linkState)->handle = -1;
250 (*linkState)->cid = -1;
251 (*linkState)->state = 0;
252 (*linkState)->fail_cause = 0;
253
254 (*linkState)->type = (char *)malloc(GSW_PDP_TYPE_MAX_LEN);
255 memset((*linkState)->type, 0x00, GSW_PDP_TYPE_MAX_LEN);
256
257 (*linkState)->ifname = (char *)malloc(GSW_IFACE_NAME_MAX_LEN);
258 memset((*linkState)->ifname, 0x00, GSW_IFACE_NAME_MAX_LEN);
259
260 (*linkState)->v4_ip = (char *)malloc(GSW_PDP_ADDR_MAX_LEN);
261 memset((*linkState)->v4_ip, 0x00, GSW_PDP_ADDR_MAX_LEN);
262
263 (*linkState)->v4_pdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
264 memset((*linkState)->v4_pdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
265
266 (*linkState)->v4_sdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
267 memset((*linkState)->v4_sdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
268
269 (*linkState)->v4_gw = (char *)malloc(GSW_GETWAYS_ADDR_MAX_LEN);
270 memset((*linkState)->v4_gw, 0x00, GSW_GETWAYS_ADDR_MAX_LEN);
271
272 (*linkState)->v6_ip = (char *)malloc(GSW_PDP_ADDR_MAX_LEN);
273 memset((*linkState)->v6_ip, 0x00, GSW_PDP_ADDR_MAX_LEN);
274
275 (*linkState)->v6_pdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
276 memset((*linkState)->v6_pdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
277
278 (*linkState)->v6_sdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
279 memset((*linkState)->v6_sdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
280
281 return GSW_HAL_SUCCESS;
282}
283
284static int Wan_State_ind_free(Wan_State_ind_s **linkState)
285{
286 if ((*linkState) == NULL)
287 {
288 LOGE("(*linkState) is null\n");
289 return GSW_HAL_FAIL;
290 }
291
292 free((*linkState)->type);
293 (*linkState)->type = NULL;
294
295 free((*linkState)->ifname);
296 (*linkState)->ifname = NULL;
297
298 free((*linkState)->v4_ip);
299 (*linkState)->v4_ip = NULL;
300
301 free((*linkState)->v4_pdns);
302 (*linkState)->v4_pdns = NULL;
303
304 free((*linkState)->v4_sdns);
305 (*linkState)->v4_sdns = NULL;
306
307 free((*linkState)->v4_gw);
308 (*linkState)->v4_gw = NULL;
309
310 free((*linkState)->v6_ip);
311 (*linkState)->v6_ip = NULL;
312
313 free((*linkState)->v6_pdns);
314 (*linkState)->v6_pdns = NULL;
315
316 free((*linkState)->v6_sdns);
317 (*linkState)->v6_sdns = NULL;
318
319
320 free((*linkState));
321 (*linkState) = NULL;
322
323 return GSW_HAL_SUCCESS;
324}
325
326static int mbtk_data_api_import()
327{
328 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
329 if (dlHandle_mbtk == NULL)
330 {
331 return GSW_HAL_FAIL;
332 }
333
334 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
335 if (mbtk_log_init == NULL)
336 {
337 return GSW_HAL_FAIL;
338 }
339
340 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
341 if (mbtk_log == NULL)
342 {
343 return GSW_HAL_FAIL;
344 }
345
346 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
347 if (mbtk_info_handle_get == NULL)
348 {
349 LOGE("mbtk_info_handle_get dlsym fail\n");
350 return GSW_HAL_FAIL;
351 }
352
353 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
354 if (mbtk_info_handle_free == NULL)
355 {
356 LOGE("mbtk_info_handle_free dlsym fail\n");
357 return GSW_HAL_FAIL;
358 }
359
360 mbtk_pdp_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_pdp_state_change_cb_reg");
361 if (mbtk_pdp_state_change_cb_reg == NULL)
362 {
363 LOGE("mbtk_pdp_state_change_cb_reg dlsym fail\n");
364 return GSW_HAL_FAIL;
365 }
366
367 mbtk_qser_apn_set = (int (*)(mbtk_info_handle_t* handle, mbtk_qser_apn_info_s *apninfo, unsigned char *cid))dlsym(dlHandle_mbtk, "mbtk_qser_apn_set");
368 if (mbtk_qser_apn_set == NULL)
369 {
370 LOGE("mbtk_qser_apn_set dlsym fail\n");
371 return GSW_HAL_FAIL;
372 }
373
374 mbtk_data_call_start = (int (*)(mbtk_info_handle_t* handle, int cid, int auto_conn_interval, bool boot_conn, int timeout))dlsym(dlHandle_mbtk, "mbtk_data_call_start");
375 if (mbtk_data_call_start == NULL)
376 {
377 LOGE("mbtk_data_call_start dlsym fail\n");
378 return GSW_HAL_FAIL;
379 }
380
381 mbtk_data_call_stop = (int (*)(mbtk_info_handle_t* handle, int cid, int timeout))dlsym(dlHandle_mbtk, "mbtk_data_call_stop");
382 if (mbtk_data_call_stop == NULL)
383 {
384 LOGE("mbtk_data_call_stop dlsym fail\n");
385 return GSW_HAL_FAIL;
386 }
387
388 mbtk_data_call_state_get = (int (*)(mbtk_info_handle_t* handle, int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6))dlsym(dlHandle_mbtk, "mbtk_data_call_state_get");
389 if (mbtk_data_call_state_get == NULL)
390 {
391 LOGE("mbtk_data_call_state_get dlsym fail\n");
392 return GSW_HAL_FAIL;
393 }
394
395 mbtk_apn_set = (int (*)(mbtk_info_handle_t* handle, int cid, mbtk_ip_type_enum ip_type, const void* apn_name, const void *user_name, const void *user_pass, const void *auth))dlsym(dlHandle_mbtk, "mbtk_apn_set");
396 if (mbtk_apn_set == NULL)
397 {
398 LOGE("mbtk_apn_set dlsym fail\n");
399 return GSW_HAL_FAIL;
400 }
401
402 ipv6_2_str = (int (*)(const void *ipv6, void *ipv6_str))dlsym(dlHandle_mbtk, "ipv6_2_str");
403 if (ipv6_2_str == NULL)
404 {
405 LOGE("ipv6_2_str dlsym fail\n");
406 return GSW_HAL_FAIL;
407 }
408
409 return GSW_HAL_SUCCESS;
410}
411
412
413
414static int data_call_state_query(int call_id,Wan_State_ind_s *linkState)
415{
416 int ret = -1;
417 mbtk_ipv4_info_t ipv4;
418 mbtk_ipv6_info_t ipv6;
419
420 LOGE("mbtk_data_call_state_get start\n");
421 ret = mbtk_data_call_state_get(data_info_handle, call_id, &ipv4, &ipv6);
422 LOGE("mbtk_data_call_state_get end\n");
423 if (ret != 0)
424 {
425 LOGE("mbtk_data_call_state_get fail\n");
426 return ret;
427 }
428
429 //ifname
430 sprintf(linkState->ifname, "ccinet%d", call_id-1);
431
432 //type
433 if(ipv4.valid)
434 {
435 if(ipv6.valid)
436 {
437 strcpy(linkState->type, "IPV4V6");
438 }
439 else {
440 strcpy(linkState->type, "IP");
441 }
442 }
443 else if(ipv6.valid)
444 {
445 strcpy(linkState->type, "IPV6");
446 }
447
448 //ip
449 LOGE("ipv4.valid = %d\n", ipv4.valid);
450 if(ipv4.valid)
451 {
452 if(linkState==NULL)
453 {
454 LOGE("linkState is NULL\n");
455 return GSW_HAL_FAIL;
456 }
457
458 //parse ipv4_addr,gw,dns,sdns
459 if(inet_ntop(AF_INET, &(ipv4.IPAddr), linkState->v4_ip , GSW_PDP_ADDR_MAX_LEN) == NULL) {
460 LOGE("IPv4 error.\n");
461 } else {
462 LOGE("IPv4 : %s\n", linkState->v4_ip);
463
464 }
465
466
467 if(inet_ntop(AF_INET, &(ipv4.GateWay), linkState->v4_gw , GSW_PDP_ADDR_MAX_LEN) == NULL) {
468 LOGE("GateWay error.\n");
469 } else {
470 LOGE("GateWay : %s\n", linkState->v4_gw);
471 }
472
473 if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), linkState->v4_pdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {
474 LOGE("PrimaryDNS error.\n");
475 } else {
476 LOGE("PrimaryDNS : %s\n", linkState->v4_pdns);
477 }
478
479 if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), linkState->v4_sdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {
480 LOGE("SecondaryDNS error.\n");
481 } else {
482 LOGE("SecondaryDNS : %s\n", linkState->v4_sdns);
483 }
484 }
485
486 LOGE("ipv6.valid = %d\n", ipv6.valid);
487 if(ipv6.valid)
488 {
489 //parse ipv6_addr,gw,dns,sdns
490 if(ipv6_2_str(&(ipv6.IPV6Addr), linkState->v6_ip)) {
491 LOGE("IPv6 error.\n");
492 } else {
493 LOGE("IPv6 : %s\n", linkState->v6_ip);
494 }
495
496 if(ipv6_2_str(&(ipv6.PrimaryDNS), linkState->v6_pdns)) {
497 LOGE("PrimaryDNS error.\n");
498 } else {
499 LOGE("PrimaryDNS : %s\n", linkState->v6_pdns);
500 }
501
502 if(ipv6_2_str(&(ipv6.SecondaryDNS), linkState->v6_sdns)) {
503 LOGE("SecondaryDNS error.\n");
504 } else {
505 LOGE("SecondaryDNS : %s\n", linkState->v6_sdns);
506 }
507 }
508
509
510
511 return GSW_HAL_SUCCESS;
512}
513
514
515static void data_call_state_change_cb(const void* data, int data_len)
516{
517 LOGE("data_call_state_change_cb() start\n");
518
519 if(data == NULL || data_len == 0)
520 {
521 return;
522 }
523
524 int ret = -1;
525
526 LOGD("Wan_State_ind_malloc start\n");
527 ret = Wan_State_ind_malloc(&linkState_arr);
528 if (ret != 0)
529 {
530 LOGE("Wan_State_ind_malloc[0] fail\n");
531 return ;
532 }
533
534 if(linkState_arr == NULL)
535 {
536 LOGE("linkState_arr is NULL");
537 return ;
538 }
539 else
540 {
541 LOGE("linkState_arr is not NULL");
542 }
543
544 uint8 *net_data = NULL;
545 net_data = (uint8 *)data;
546 //disconnected
547 LOGE("net_data = %d\n", *net_data);
548 if(*net_data > 100 && *net_data < 200)
549 {
550 int apn_id = *net_data - 100;
551 int handle_temp = apn_id-2;
552 LOGE("apn_id = %d\n", apn_id);
553 linkState_arr->state = 0;//disconnected
554 linkState_arr->cid = -1;
555 linkState_arr->handle = handle_temp;
556
557 //get data_call_state
558 if(!data_call_lock)
559 {
560 data_call_state_query(apn_id, linkState_arr);
561 }
562
563 if(gsw_data_call_evt_cb)
564 {
565 gsw_data_call_evt_cb(linkState_arr);
566 }
567 }
568
569 else if(*net_data > 200 && *net_data < 220)
570 {
571 LOGE("cid[%d] is open.\n", *net_data - 200);
572 int apn_id = *net_data-200;
573 int handle_temp = apn_id-2;
574
575 linkState_arr->state = 2;//connected
576 linkState_arr->cid = apn_id;
577 linkState_arr->handle = handle_temp;
578 //get data_call_state
579 if(!data_call_lock)
580 {
581 data_call_state_query(apn_id, linkState_arr);
582 }
583
584 if(gsw_data_call_evt_cb)
585 {
586 gsw_data_call_evt_cb(linkState_arr);
587 }
588 }
589
590 else if(*net_data > 220)
591 {
592 LOGE("cid [%d] is reopen.\n", *net_data - 220);
593 int apn_id = *net_data-220;
594 int handle_temp = apn_id-2;
595
596 linkState_arr->state = 2;//connected
597 linkState_arr->cid = apn_id;
598 linkState_arr->handle = handle_temp;
599
600 //get data_call_state
601 if(!data_call_lock)
602 {
603 data_call_state_query(apn_id, linkState_arr);
604 }
605
606 if(gsw_data_call_evt_cb)
607 {
608 gsw_data_call_evt_cb(linkState_arr);
609 }
610 }
611
612 else if(*net_data == 1)
613 {
614 LOGE("pdp is open.\n");
615 }
616
617 else
618 {
619 LOGE("unknown param [%d].\n", *net_data);
620 }
621
622 ret = Wan_State_ind_free(&linkState_arr);
623 if (ret != 0)
624 {
625 LOGE("Wan_State_ind_free fail\n");
626 }
627
628}
629
630
631
632
633
634
635/**
636 * @brief datacall sdk init
637 * @param [in] evt_cb callback function for data connection state change event
638 * call back;
639 * @retval 0: success
640 * @retval other: fail
641 */
642int gsw_data_call_init(gsw_data_call_evt_cb_t evt_cb)
643{
644 int ret;
645 ret = mbtk_data_api_import();
646 if (ret != 0)
647 {
648 return GSW_HAL_FAIL;
649 }
650
651 if(data_init_flag != 0 && data_info_handle != NULL)
652 {
653 return GSW_HAL_FAIL;
654 }
655
656 if (ret != GSW_HAL_SUCCESS)
657 {
658 LOGE("mbtk_data_api_import fail\n");
659 return GSW_HAL_FAIL;
660 }
661
662 data_info_handle = (mbtk_info_handle_t*)mbtk_info_handle_get();
663 if (data_info_handle == NULL)
664 {
665 LOGE("mbtk_info_handle_get fail\n");
666 return GSW_HAL_FAIL;
667 }
668
669 ret = mbtk_pdp_state_change_cb_reg((mbtk_info_handle_t*)data_info_handle, data_call_state_change_cb);
670 if (ret != 0)
671 {
672 LOGE("mbtk_pdp_state_change_cb_reg fail\n");
673 return GSW_HAL_FAIL;
674 }
675
676 gsw_data_call_evt_cb = evt_cb;
677 data_init_flag = 1;
678 return GSW_HAL_SUCCESS;
679}
680
681
682/**
683 * @brief data_call sdk deinit
684 * @param
685 * @retval 0: success
686 * @retval other: fail
687 */
688int gsw_data_call_deinit(void)
689{
690 int ret;
691 if(data_init_flag == 0 && data_info_handle == NULL)
692 {
693 return GSW_HAL_FAIL;
694 }
695
696 ret = mbtk_info_handle_free((mbtk_info_handle_t**)&data_info_handle);
697 if (ret != 0)
698 {
699 LOGE("mbtk_info_handle_free fail\n");
700 return GSW_HAL_FAIL;
701 }
702
703 data_init_flag = 0;
704 return GSW_HAL_SUCCESS;
705}
706
707/**
708 * @brief set apn parameters for data call
709 * @param [in/out] LinkInf apn info for pub or private datacall
710 * inlcude apn name mcc mnc, passwork apnid type cid etc
711 * @retval 0: success
712 * @retval other: fail
713 */
714int gsw_data_call_set_apn(Link_Info_s *LinkInf)
715{
716 if(data_init_flag == 0 && data_info_handle == NULL)
717 {
718 return GSW_HAL_FAIL;
719 }
720
721 if(LinkInf == NULL)
722 {
723 LOGE("apn info is null\n");
724 return GSW_HAL_FAIL;
725 }
726
727 int ret = 0;
728 mbtk_ip_type_enum ip_type;
729 int auth_type = -1;
730
731 //pdp type
732 if(strcmp(LinkInf->normalProtocol,"IPV4") == 0)
733 {
734 ip_type = MBTK_IP_TYPE_IP;
735 LOGE("pdp_type(protocol) is IPV4\n");
736 }
737 else if(strcmp(LinkInf->normalProtocol,"IPV6") == 0)
738 {
739 ip_type = MBTK_IP_TYPE_IPV6;
740 LOGE("pdp_type(protocol) is IPV6\n");
741 }
742 else if(strcmp(LinkInf->normalProtocol,"IPV4V6") == 0)
743 {
744 ip_type = MBTK_IP_TYPE_IPV4V6;
745 LOGE("pdp_type(protocol) is IPV4V6\n");
746 }
747 else
748 {
749 LOGE("pdp_type(protocol) error\n");
750 return GSW_HAL_FAIL;
751 }
752
753 //auth type
754 auth_type = atoi(LinkInf->authType);
755
756 ret = mbtk_apn_set(data_info_handle, LinkInf->handle+2, ip_type, LinkInf -> apn, LinkInf -> usr, LinkInf -> pwd, (const void *)auth_type);
757
758 if(ret != 0)
759 {
760 LOGE("mbtk_apn_set fail.");
761 return GSW_HAL_FAIL;
762 }
763
764 return GSW_HAL_SUCCESS;
765}
766
767
768/**
769 * @brief set apn parameters for data call
770 * @param [in] linkid data connetion link number
771 * @param [in/out] LinkInf link info req: apn info for pub or private datacall
772 * inlcude apn name mcc mnc, passwork apnid etc
773 * resp: data call link state ipaddress type etc
774 * @retval 0: success
775 * @retval other: fail
776 */
777int gsw_data_call_connect(int linkid, Link_Info_s *LinkInf)
778{
779 int ret = -1;
780 if(data_init_flag == 0 && data_info_handle == NULL)
781 {
782 return GSW_HAL_FAIL;
783 }
784
785 if(LinkInf == NULL)
786 {
787 LOGE("apn info is null\n");
788 return GSW_HAL_FAIL;
789 }
790
791 data_call_lock = 1;
792 ret = mbtk_data_call_start((mbtk_info_handle_t*)data_info_handle, linkid + 2, 0, FALSE, 0);
793 data_call_lock = 0;
794 if(ret != 0)
795 {
796 LOGE("mbtk_data_call_start fail,\n");
797 return GSW_HAL_FAIL;
798 }
799
800 uint8_t cid_temp = (uint8_t)(linkid + 202);
801 data_call_state_change_cb(&cid_temp,1);
802
803 return GSW_HAL_SUCCESS;
804}
805
806
807/**
808 * @brief set apn parameters for data call
809 * @param [in] linkid
810 * @param [in/out] LinkInf link info req: apn info for pub or private datacall
811 * inlcude apn name mcc mnc, passwork apnid etc
812 * resp: data call link state ipaddress type etc
813 * @retval 0: success
814 * @retval other: fail
815 */
816int gsw_data_call_disconnect(int linkid, Link_Info_s *LinkInf)
817{
818 int ret = -1;
819 if(data_init_flag == 0 && data_info_handle == NULL)
820 {
821 return GSW_HAL_FAIL;
822 }
823
824 if(LinkInf == NULL)
825 {
826 LOGE("apn info is null\n");
827 return GSW_HAL_FAIL;
828 }
829 data_call_lock = 1;
830 ret = mbtk_data_call_stop((mbtk_info_handle_t*)data_info_handle, linkid + 2, 15);
831 data_call_lock = 0;
832 if(ret != 0)
833 {
834 LOGE("mbtk_data_call_stop fail,ret = %d\n",ret);
835 return GSW_HAL_FAIL;
836 }
837
838 uint8_t cid_temp = (uint8_t)(linkid + 102);
839 data_call_state_change_cb(&cid_temp,1);
840
841 return GSW_HAL_SUCCESS;
842}
843
844
845/*
846 * @brief get mobile operator name
847 @param [in] linkid apn id
848 @param [out] data_pkt obtian actual data call network card data traffic
849 @retval 0: success
850 @retval 0: other: fail
851 */
852int gsw_get_data_call_pkt_stats(int linkid, gsw_data_pkt_stats *data_pkt)
853{
854 char temp_linkid[12] = {0};
855 char interface_name[32] = {0};
856 sprintf(temp_linkid,"%d",linkid+1);
857 snprintf(interface_name, sizeof(interface_name),"ccinet%s", temp_linkid);
858
859 uint64_t tx_bytes = 0;
860 uint64_t tx_packets = 0;
861 uint64_t tx_dropped = 0;
862 uint64_t rx_bytes = 0;
863 uint64_t rx_packets = 0;
864 uint64_t rx_dropped = 0;
865 char command[128] = {0};
866 char* temp;
867 char buffer[512] = {0};
868
869 snprintf(command, sizeof(command), "ifconfig %s", interface_name);
870
871 FILE *fp = popen(command, "r");
872 if(fp == NULL)
873 {
874 LOGE("popen fail\n");
875 return GSW_HAL_FAIL;
876 }
877
878 //read line by line
879 while (fgets(buffer, sizeof(buffer), fp) != NULL) {
880 // TX bytes
881 if (strstr(buffer, "TX bytes")) {
882 temp = strstr(buffer, "TX bytes");
883 sscanf(temp, " TX bytes:%llu ", &tx_bytes);
884 }
885 // TX packets
886 if (strstr(buffer, "TX packets")) {
887 sscanf(buffer, " TX packets:%llu ", &tx_packets);
888 sscanf(buffer, " TX packets:%*u errors:%*u dropped:%llu", &tx_dropped);
889 }
890 // RX bytes
891 if (strstr(buffer, "RX bytes")) {
892 LOGE("RX bytes %s\n",strstr(buffer, "RX bytes"));
893 sscanf(buffer, " RX bytes:%llu ", &rx_bytes);
894 }
895 // RX packets
896 if (strstr(buffer, "RX packets")) {
897 sscanf(buffer, " RX packets:%llu ", &rx_packets);
898 sscanf(buffer, " RX packets:%*u errors:%*u dropped:%llu", &rx_dropped);
899 }
900 }
901
902 // 关闭管道
903 pclose(fp);
904
905 // 输出结果
906 LOGE("TX Bytes: %llu\n", tx_bytes);
907 LOGE("TX Packets: %llu\n", tx_packets);
908 LOGE("TX Dropped: %llu\n", tx_dropped);
909 LOGE("RX Bytes: %llu\n", rx_bytes);
910 LOGE("RX Packets: %llu\n", rx_packets);
911 LOGE("RX Dropped: %llu\n", rx_dropped);
912
913 if(data_pkt == NULL)
914 {
915 LOGE("data_pkt is null\n");
916 return GSW_HAL_FAIL;
917 }
918
919 else
920 {
921 data_pkt->tx_bytes = tx_bytes;
922 data_pkt->tx_pkts = tx_packets;
923 data_pkt->tx_dropped_pkts = tx_dropped;
924 data_pkt->rx_bytes = rx_bytes;
925 data_pkt->rx_pkts = rx_packets;
926 data_pkt->rx_dropped_pkts = rx_dropped;
927 }
928
929 return GSW_HAL_SUCCESS;
930
931}