blob: c60077fcf149ab6b452fa96d9e2ed9f603d93379 [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
l.yang6a42e4d2025-05-28 01:04:20 -0700155#define GSW_DATA "[HAL][GSW_DATA]"
156
b.liu68a94c92025-05-24 12:53:41 +0800157#define LOGV(fmt, args ...) \
158 do{ \
159 char *file_ptr_1001 = __FILE__; \
160 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
161 char line_1001[10] = {0}; \
162 sprintf(line_1001, "%d", __LINE__); \
163 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
164 if(*ptr_1001 == '/') \
165 break; \
166 ptr_1001--; \
167 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700168 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_DATA"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800169 } while(0)
170
171#define LOGI(fmt, args...) \
172 do{ \
173 char *file_ptr_1001 = __FILE__; \
174 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
175 char line_1001[10] = {0}; \
176 sprintf(line_1001, "%d", __LINE__); \
177 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
178 if(*ptr_1001 == '/') \
179 break; \
180 ptr_1001--; \
181 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700182 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_DATA"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800183 } while(0)
184
185#define LOGD(fmt, args...) \
186 do{ \
187 char *file_ptr_1001 = __FILE__; \
188 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
189 char line_1001[10] = {0}; \
190 sprintf(line_1001, "%d", __LINE__); \
191 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
192 if(*ptr_1001 == '/') \
193 break; \
194 ptr_1001--; \
195 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700196 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_DATA"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800197 } while(0)
198
199#define LOGW(fmt, args...) \
200 do{ \
201 char *file_ptr_1001 = __FILE__; \
202 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
203 char line_1001[10] = {0}; \
204 sprintf(line_1001, "%d", __LINE__); \
205 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
206 if(*ptr_1001 == '/') \
207 break; \
208 ptr_1001--; \
209 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700210 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_DATA"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800211 } while(0)
212
213#define LOGE(fmt, args...) \
214 do{ \
215 char *file_ptr_1001 = __FILE__; \
216 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
217 char line_1001[10] = {0}; \
218 sprintf(line_1001, "%d", __LINE__); \
219 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
220 if(*ptr_1001 == '/') \
221 break; \
222 ptr_1001--; \
223 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700224 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_DATA"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800225 } while(0)
226
227
228//define
229#define GSW_HAL_FAIL GSW_HAL_NORMAL_FAIL
230#define lib_mbtk_path "/lib/libmbtk_lib.so"
231pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER;
232static int data_call_lock = 0;
233static int data_init_flag = 0;
234static void *dlHandle_mbtk;
235static mbtk_info_handle_t* data_info_handle = NULL;
236static gsw_data_call_evt_cb_t gsw_data_call_evt_cb;
237
238Wan_State_ind_s *linkState_arr;
239
240static int Wan_State_ind_malloc(Wan_State_ind_s **linkState)
241{
242 (*linkState) = (Wan_State_ind_s *)malloc(sizeof(Wan_State_ind_s));
243 if((*linkState) == NULL)
244 {
245 LOGE("malloc Wan_State_ind_s fail\n");
246 return GSW_HAL_FAIL;
247 }
248
249 memset((*linkState), 0x00, sizeof(Wan_State_ind_s));
250
251 (*linkState)->handle = -1;
252 (*linkState)->cid = -1;
253 (*linkState)->state = 0;
254 (*linkState)->fail_cause = 0;
255
256 (*linkState)->type = (char *)malloc(GSW_PDP_TYPE_MAX_LEN);
257 memset((*linkState)->type, 0x00, GSW_PDP_TYPE_MAX_LEN);
258
259 (*linkState)->ifname = (char *)malloc(GSW_IFACE_NAME_MAX_LEN);
260 memset((*linkState)->ifname, 0x00, GSW_IFACE_NAME_MAX_LEN);
261
262 (*linkState)->v4_ip = (char *)malloc(GSW_PDP_ADDR_MAX_LEN);
263 memset((*linkState)->v4_ip, 0x00, GSW_PDP_ADDR_MAX_LEN);
264
265 (*linkState)->v4_pdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
266 memset((*linkState)->v4_pdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
267
268 (*linkState)->v4_sdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
269 memset((*linkState)->v4_sdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
270
271 (*linkState)->v4_gw = (char *)malloc(GSW_GETWAYS_ADDR_MAX_LEN);
272 memset((*linkState)->v4_gw, 0x00, GSW_GETWAYS_ADDR_MAX_LEN);
273
274 (*linkState)->v6_ip = (char *)malloc(GSW_PDP_ADDR_MAX_LEN);
275 memset((*linkState)->v6_ip, 0x00, GSW_PDP_ADDR_MAX_LEN);
276
277 (*linkState)->v6_pdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
278 memset((*linkState)->v6_pdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
279
280 (*linkState)->v6_sdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
281 memset((*linkState)->v6_sdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
282
283 return GSW_HAL_SUCCESS;
284}
285
286static int Wan_State_ind_free(Wan_State_ind_s **linkState)
287{
288 if ((*linkState) == NULL)
289 {
290 LOGE("(*linkState) is null\n");
291 return GSW_HAL_FAIL;
292 }
293
294 free((*linkState)->type);
295 (*linkState)->type = NULL;
296
297 free((*linkState)->ifname);
298 (*linkState)->ifname = NULL;
299
300 free((*linkState)->v4_ip);
301 (*linkState)->v4_ip = NULL;
302
303 free((*linkState)->v4_pdns);
304 (*linkState)->v4_pdns = NULL;
305
306 free((*linkState)->v4_sdns);
307 (*linkState)->v4_sdns = NULL;
308
309 free((*linkState)->v4_gw);
310 (*linkState)->v4_gw = NULL;
311
312 free((*linkState)->v6_ip);
313 (*linkState)->v6_ip = NULL;
314
315 free((*linkState)->v6_pdns);
316 (*linkState)->v6_pdns = NULL;
317
318 free((*linkState)->v6_sdns);
319 (*linkState)->v6_sdns = NULL;
320
321
322 free((*linkState));
323 (*linkState) = NULL;
324
325 return GSW_HAL_SUCCESS;
326}
327
328static int mbtk_data_api_import()
329{
330 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
331 if (dlHandle_mbtk == NULL)
332 {
333 return GSW_HAL_FAIL;
334 }
335
336 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
337 if (mbtk_log_init == NULL)
338 {
339 return GSW_HAL_FAIL;
340 }
341
342 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
343 if (mbtk_log == NULL)
344 {
345 return GSW_HAL_FAIL;
346 }
347
348 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
349 if (mbtk_info_handle_get == NULL)
350 {
351 LOGE("mbtk_info_handle_get dlsym fail\n");
352 return GSW_HAL_FAIL;
353 }
354
355 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
356 if (mbtk_info_handle_free == NULL)
357 {
358 LOGE("mbtk_info_handle_free dlsym fail\n");
359 return GSW_HAL_FAIL;
360 }
361
362 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");
363 if (mbtk_pdp_state_change_cb_reg == NULL)
364 {
365 LOGE("mbtk_pdp_state_change_cb_reg dlsym fail\n");
366 return GSW_HAL_FAIL;
367 }
368
369 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");
370 if (mbtk_qser_apn_set == NULL)
371 {
372 LOGE("mbtk_qser_apn_set dlsym fail\n");
373 return GSW_HAL_FAIL;
374 }
375
376 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");
377 if (mbtk_data_call_start == NULL)
378 {
379 LOGE("mbtk_data_call_start dlsym fail\n");
380 return GSW_HAL_FAIL;
381 }
382
383 mbtk_data_call_stop = (int (*)(mbtk_info_handle_t* handle, int cid, int timeout))dlsym(dlHandle_mbtk, "mbtk_data_call_stop");
384 if (mbtk_data_call_stop == NULL)
385 {
386 LOGE("mbtk_data_call_stop dlsym fail\n");
387 return GSW_HAL_FAIL;
388 }
389
390 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");
391 if (mbtk_data_call_state_get == NULL)
392 {
393 LOGE("mbtk_data_call_state_get dlsym fail\n");
394 return GSW_HAL_FAIL;
395 }
396
397 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");
398 if (mbtk_apn_set == NULL)
399 {
400 LOGE("mbtk_apn_set dlsym fail\n");
401 return GSW_HAL_FAIL;
402 }
403
404 ipv6_2_str = (int (*)(const void *ipv6, void *ipv6_str))dlsym(dlHandle_mbtk, "ipv6_2_str");
405 if (ipv6_2_str == NULL)
406 {
407 LOGE("ipv6_2_str dlsym fail\n");
408 return GSW_HAL_FAIL;
409 }
410
411 return GSW_HAL_SUCCESS;
412}
413
414
415
416static int data_call_state_query(int call_id,Wan_State_ind_s *linkState)
417{
418 int ret = -1;
419 mbtk_ipv4_info_t ipv4;
420 mbtk_ipv6_info_t ipv6;
421
422 LOGE("mbtk_data_call_state_get start\n");
423 ret = mbtk_data_call_state_get(data_info_handle, call_id, &ipv4, &ipv6);
424 LOGE("mbtk_data_call_state_get end\n");
425 if (ret != 0)
426 {
427 LOGE("mbtk_data_call_state_get fail\n");
428 return ret;
429 }
430
431 //ifname
432 sprintf(linkState->ifname, "ccinet%d", call_id-1);
433
434 //type
435 if(ipv4.valid)
436 {
437 if(ipv6.valid)
438 {
439 strcpy(linkState->type, "IPV4V6");
440 }
441 else {
442 strcpy(linkState->type, "IP");
443 }
444 }
445 else if(ipv6.valid)
446 {
447 strcpy(linkState->type, "IPV6");
448 }
449
450 //ip
451 LOGE("ipv4.valid = %d\n", ipv4.valid);
452 if(ipv4.valid)
453 {
454 if(linkState==NULL)
455 {
456 LOGE("linkState is NULL\n");
457 return GSW_HAL_FAIL;
458 }
459
460 //parse ipv4_addr,gw,dns,sdns
461 if(inet_ntop(AF_INET, &(ipv4.IPAddr), linkState->v4_ip , GSW_PDP_ADDR_MAX_LEN) == NULL) {
462 LOGE("IPv4 error.\n");
463 } else {
464 LOGE("IPv4 : %s\n", linkState->v4_ip);
465
466 }
467
468
469 if(inet_ntop(AF_INET, &(ipv4.GateWay), linkState->v4_gw , GSW_PDP_ADDR_MAX_LEN) == NULL) {
470 LOGE("GateWay error.\n");
471 } else {
472 LOGE("GateWay : %s\n", linkState->v4_gw);
473 }
474
475 if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), linkState->v4_pdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {
476 LOGE("PrimaryDNS error.\n");
477 } else {
478 LOGE("PrimaryDNS : %s\n", linkState->v4_pdns);
479 }
480
481 if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), linkState->v4_sdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {
482 LOGE("SecondaryDNS error.\n");
483 } else {
484 LOGE("SecondaryDNS : %s\n", linkState->v4_sdns);
485 }
486 }
487
488 LOGE("ipv6.valid = %d\n", ipv6.valid);
489 if(ipv6.valid)
490 {
491 //parse ipv6_addr,gw,dns,sdns
492 if(ipv6_2_str(&(ipv6.IPV6Addr), linkState->v6_ip)) {
493 LOGE("IPv6 error.\n");
494 } else {
495 LOGE("IPv6 : %s\n", linkState->v6_ip);
496 }
497
498 if(ipv6_2_str(&(ipv6.PrimaryDNS), linkState->v6_pdns)) {
499 LOGE("PrimaryDNS error.\n");
500 } else {
501 LOGE("PrimaryDNS : %s\n", linkState->v6_pdns);
502 }
503
504 if(ipv6_2_str(&(ipv6.SecondaryDNS), linkState->v6_sdns)) {
505 LOGE("SecondaryDNS error.\n");
506 } else {
507 LOGE("SecondaryDNS : %s\n", linkState->v6_sdns);
508 }
509 }
510
511
512
513 return GSW_HAL_SUCCESS;
514}
515
516
517static void data_call_state_change_cb(const void* data, int data_len)
518{
519 LOGE("data_call_state_change_cb() start\n");
520
521 if(data == NULL || data_len == 0)
522 {
523 return;
524 }
525
526 int ret = -1;
527
528 LOGD("Wan_State_ind_malloc start\n");
529 ret = Wan_State_ind_malloc(&linkState_arr);
530 if (ret != 0)
531 {
532 LOGE("Wan_State_ind_malloc[0] fail\n");
533 return ;
534 }
535
536 if(linkState_arr == NULL)
537 {
538 LOGE("linkState_arr is NULL");
539 return ;
540 }
541 else
542 {
543 LOGE("linkState_arr is not NULL");
544 }
545
546 uint8 *net_data = NULL;
547 net_data = (uint8 *)data;
548 //disconnected
549 LOGE("net_data = %d\n", *net_data);
550 if(*net_data > 100 && *net_data < 200)
551 {
552 int apn_id = *net_data - 100;
553 int handle_temp = apn_id-2;
554 LOGE("apn_id = %d\n", apn_id);
555 linkState_arr->state = 0;//disconnected
556 linkState_arr->cid = -1;
557 linkState_arr->handle = handle_temp;
558
559 //get data_call_state
560 if(!data_call_lock)
561 {
562 data_call_state_query(apn_id, linkState_arr);
563 }
564
565 if(gsw_data_call_evt_cb)
566 {
567 gsw_data_call_evt_cb(linkState_arr);
568 }
569 }
570
571 else if(*net_data > 200 && *net_data < 220)
572 {
573 LOGE("cid[%d] is open.\n", *net_data - 200);
574 int apn_id = *net_data-200;
575 int handle_temp = apn_id-2;
576
577 linkState_arr->state = 2;//connected
578 linkState_arr->cid = apn_id;
579 linkState_arr->handle = handle_temp;
580 //get data_call_state
581 if(!data_call_lock)
582 {
583 data_call_state_query(apn_id, linkState_arr);
584 }
585
586 if(gsw_data_call_evt_cb)
587 {
588 gsw_data_call_evt_cb(linkState_arr);
589 }
590 }
591
592 else if(*net_data > 220)
593 {
594 LOGE("cid [%d] is reopen.\n", *net_data - 220);
595 int apn_id = *net_data-220;
596 int handle_temp = apn_id-2;
597
598 linkState_arr->state = 2;//connected
599 linkState_arr->cid = apn_id;
600 linkState_arr->handle = handle_temp;
601
602 //get data_call_state
603 if(!data_call_lock)
604 {
605 data_call_state_query(apn_id, linkState_arr);
606 }
607
608 if(gsw_data_call_evt_cb)
609 {
610 gsw_data_call_evt_cb(linkState_arr);
611 }
612 }
613
614 else if(*net_data == 1)
615 {
616 LOGE("pdp is open.\n");
617 }
618
619 else
620 {
621 LOGE("unknown param [%d].\n", *net_data);
622 }
623
624 ret = Wan_State_ind_free(&linkState_arr);
625 if (ret != 0)
626 {
627 LOGE("Wan_State_ind_free fail\n");
628 }
629
630}
631
632
633
634
635
636
637/**
638 * @brief datacall sdk init
639 * @param [in] evt_cb callback function for data connection state change event
640 * call back;
641 * @retval 0: success
642 * @retval other: fail
643 */
644int gsw_data_call_init(gsw_data_call_evt_cb_t evt_cb)
645{
646 int ret;
647 ret = mbtk_data_api_import();
648 if (ret != 0)
649 {
650 return GSW_HAL_FAIL;
651 }
652
653 if(data_init_flag != 0 && data_info_handle != NULL)
654 {
655 return GSW_HAL_FAIL;
656 }
657
658 if (ret != GSW_HAL_SUCCESS)
659 {
660 LOGE("mbtk_data_api_import fail\n");
661 return GSW_HAL_FAIL;
662 }
663
664 data_info_handle = (mbtk_info_handle_t*)mbtk_info_handle_get();
665 if (data_info_handle == NULL)
666 {
667 LOGE("mbtk_info_handle_get fail\n");
668 return GSW_HAL_FAIL;
669 }
670
671 ret = mbtk_pdp_state_change_cb_reg((mbtk_info_handle_t*)data_info_handle, data_call_state_change_cb);
672 if (ret != 0)
673 {
674 LOGE("mbtk_pdp_state_change_cb_reg fail\n");
675 return GSW_HAL_FAIL;
676 }
677
678 gsw_data_call_evt_cb = evt_cb;
679 data_init_flag = 1;
680 return GSW_HAL_SUCCESS;
681}
682
683
684/**
685 * @brief data_call sdk deinit
686 * @param
687 * @retval 0: success
688 * @retval other: fail
689 */
690int gsw_data_call_deinit(void)
691{
692 int ret;
693 if(data_init_flag == 0 && data_info_handle == NULL)
694 {
695 return GSW_HAL_FAIL;
696 }
697
698 ret = mbtk_info_handle_free((mbtk_info_handle_t**)&data_info_handle);
699 if (ret != 0)
700 {
701 LOGE("mbtk_info_handle_free fail\n");
702 return GSW_HAL_FAIL;
703 }
704
705 data_init_flag = 0;
706 return GSW_HAL_SUCCESS;
707}
708
709/**
710 * @brief set apn parameters for data call
711 * @param [in/out] LinkInf apn info for pub or private datacall
712 * inlcude apn name mcc mnc, passwork apnid type cid etc
713 * @retval 0: success
714 * @retval other: fail
715 */
716int gsw_data_call_set_apn(Link_Info_s *LinkInf)
717{
718 if(data_init_flag == 0 && data_info_handle == NULL)
719 {
720 return GSW_HAL_FAIL;
721 }
722
723 if(LinkInf == NULL)
724 {
725 LOGE("apn info is null\n");
726 return GSW_HAL_FAIL;
727 }
728
729 int ret = 0;
730 mbtk_ip_type_enum ip_type;
731 int auth_type = -1;
732
733 //pdp type
734 if(strcmp(LinkInf->normalProtocol,"IPV4") == 0)
735 {
736 ip_type = MBTK_IP_TYPE_IP;
737 LOGE("pdp_type(protocol) is IPV4\n");
738 }
739 else if(strcmp(LinkInf->normalProtocol,"IPV6") == 0)
740 {
741 ip_type = MBTK_IP_TYPE_IPV6;
742 LOGE("pdp_type(protocol) is IPV6\n");
743 }
744 else if(strcmp(LinkInf->normalProtocol,"IPV4V6") == 0)
745 {
746 ip_type = MBTK_IP_TYPE_IPV4V6;
747 LOGE("pdp_type(protocol) is IPV4V6\n");
748 }
749 else
750 {
751 LOGE("pdp_type(protocol) error\n");
752 return GSW_HAL_FAIL;
753 }
754
755 //auth type
756 auth_type = atoi(LinkInf->authType);
757
758 ret = mbtk_apn_set(data_info_handle, LinkInf->handle+2, ip_type, LinkInf -> apn, LinkInf -> usr, LinkInf -> pwd, (const void *)auth_type);
759
760 if(ret != 0)
761 {
762 LOGE("mbtk_apn_set fail.");
763 return GSW_HAL_FAIL;
764 }
765
766 return GSW_HAL_SUCCESS;
767}
768
769
770/**
771 * @brief set apn parameters for data call
772 * @param [in] linkid data connetion link number
773 * @param [in/out] LinkInf link info req: apn info for pub or private datacall
774 * inlcude apn name mcc mnc, passwork apnid etc
775 * resp: data call link state ipaddress type etc
776 * @retval 0: success
777 * @retval other: fail
778 */
779int gsw_data_call_connect(int linkid, Link_Info_s *LinkInf)
780{
781 int ret = -1;
782 if(data_init_flag == 0 && data_info_handle == NULL)
783 {
784 return GSW_HAL_FAIL;
785 }
786
787 if(LinkInf == NULL)
788 {
789 LOGE("apn info is null\n");
790 return GSW_HAL_FAIL;
791 }
792
793 data_call_lock = 1;
794 ret = mbtk_data_call_start((mbtk_info_handle_t*)data_info_handle, linkid + 2, 0, FALSE, 0);
795 data_call_lock = 0;
796 if(ret != 0)
797 {
798 LOGE("mbtk_data_call_start fail,\n");
799 return GSW_HAL_FAIL;
800 }
801
802 uint8_t cid_temp = (uint8_t)(linkid + 202);
803 data_call_state_change_cb(&cid_temp,1);
804
805 return GSW_HAL_SUCCESS;
806}
807
808
809/**
810 * @brief set apn parameters for data call
811 * @param [in] linkid
812 * @param [in/out] LinkInf link info req: apn info for pub or private datacall
813 * inlcude apn name mcc mnc, passwork apnid etc
814 * resp: data call link state ipaddress type etc
815 * @retval 0: success
816 * @retval other: fail
817 */
818int gsw_data_call_disconnect(int linkid, Link_Info_s *LinkInf)
819{
820 int ret = -1;
821 if(data_init_flag == 0 && data_info_handle == NULL)
822 {
823 return GSW_HAL_FAIL;
824 }
825
826 if(LinkInf == NULL)
827 {
828 LOGE("apn info is null\n");
829 return GSW_HAL_FAIL;
830 }
831 data_call_lock = 1;
832 ret = mbtk_data_call_stop((mbtk_info_handle_t*)data_info_handle, linkid + 2, 15);
833 data_call_lock = 0;
834 if(ret != 0)
835 {
836 LOGE("mbtk_data_call_stop fail,ret = %d\n",ret);
837 return GSW_HAL_FAIL;
838 }
839
840 uint8_t cid_temp = (uint8_t)(linkid + 102);
841 data_call_state_change_cb(&cid_temp,1);
842
843 return GSW_HAL_SUCCESS;
844}
845
846
847/*
848 * @brief get mobile operator name
849 @param [in] linkid apn id
850 @param [out] data_pkt obtian actual data call network card data traffic
851 @retval 0: success
852 @retval 0: other: fail
853 */
854int gsw_get_data_call_pkt_stats(int linkid, gsw_data_pkt_stats *data_pkt)
855{
856 char temp_linkid[12] = {0};
857 char interface_name[32] = {0};
858 sprintf(temp_linkid,"%d",linkid+1);
859 snprintf(interface_name, sizeof(interface_name),"ccinet%s", temp_linkid);
860
861 uint64_t tx_bytes = 0;
862 uint64_t tx_packets = 0;
863 uint64_t tx_dropped = 0;
864 uint64_t rx_bytes = 0;
865 uint64_t rx_packets = 0;
866 uint64_t rx_dropped = 0;
867 char command[128] = {0};
868 char* temp;
869 char buffer[512] = {0};
870
871 snprintf(command, sizeof(command), "ifconfig %s", interface_name);
872
873 FILE *fp = popen(command, "r");
874 if(fp == NULL)
875 {
876 LOGE("popen fail\n");
877 return GSW_HAL_FAIL;
878 }
879
880 //read line by line
881 while (fgets(buffer, sizeof(buffer), fp) != NULL) {
882 // TX bytes
883 if (strstr(buffer, "TX bytes")) {
884 temp = strstr(buffer, "TX bytes");
885 sscanf(temp, " TX bytes:%llu ", &tx_bytes);
886 }
887 // TX packets
888 if (strstr(buffer, "TX packets")) {
889 sscanf(buffer, " TX packets:%llu ", &tx_packets);
890 sscanf(buffer, " TX packets:%*u errors:%*u dropped:%llu", &tx_dropped);
891 }
892 // RX bytes
893 if (strstr(buffer, "RX bytes")) {
894 LOGE("RX bytes %s\n",strstr(buffer, "RX bytes"));
895 sscanf(buffer, " RX bytes:%llu ", &rx_bytes);
896 }
897 // RX packets
898 if (strstr(buffer, "RX packets")) {
899 sscanf(buffer, " RX packets:%llu ", &rx_packets);
900 sscanf(buffer, " RX packets:%*u errors:%*u dropped:%llu", &rx_dropped);
901 }
902 }
903
904 // 关闭管道
905 pclose(fp);
906
907 // 输出结果
908 LOGE("TX Bytes: %llu\n", tx_bytes);
909 LOGE("TX Packets: %llu\n", tx_packets);
910 LOGE("TX Dropped: %llu\n", tx_dropped);
911 LOGE("RX Bytes: %llu\n", rx_bytes);
912 LOGE("RX Packets: %llu\n", rx_packets);
913 LOGE("RX Dropped: %llu\n", rx_dropped);
914
915 if(data_pkt == NULL)
916 {
917 LOGE("data_pkt is null\n");
918 return GSW_HAL_FAIL;
919 }
920
921 else
922 {
923 data_pkt->tx_bytes = tx_bytes;
924 data_pkt->tx_pkts = tx_packets;
925 data_pkt->tx_dropped_pkts = tx_dropped;
926 data_pkt->rx_bytes = rx_bytes;
927 data_pkt->rx_pkts = rx_packets;
928 data_pkt->rx_dropped_pkts = rx_dropped;
929 }
930
931 return GSW_HAL_SUCCESS;
932
933}