blob: bb9d045a78585d0bce2fdcca8a86527dfb1c297e [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
b.liu68a94c92025-05-24 12:53:41 +0800229#define lib_mbtk_path "/lib/libmbtk_lib.so"
230pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER;
231static int data_call_lock = 0;
232static int data_init_flag = 0;
233static void *dlHandle_mbtk;
234static mbtk_info_handle_t* data_info_handle = NULL;
235static gsw_data_call_evt_cb_t gsw_data_call_evt_cb;
236
237Wan_State_ind_s *linkState_arr;
238
239static int Wan_State_ind_malloc(Wan_State_ind_s **linkState)
240{
241 (*linkState) = (Wan_State_ind_s *)malloc(sizeof(Wan_State_ind_s));
242 if((*linkState) == NULL)
243 {
244 LOGE("malloc Wan_State_ind_s fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800245 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800246 }
247
248 memset((*linkState), 0x00, sizeof(Wan_State_ind_s));
249
250 (*linkState)->handle = -1;
251 (*linkState)->cid = -1;
252 (*linkState)->state = 0;
253 (*linkState)->fail_cause = 0;
254
255 (*linkState)->type = (char *)malloc(GSW_PDP_TYPE_MAX_LEN);
256 memset((*linkState)->type, 0x00, GSW_PDP_TYPE_MAX_LEN);
257
258 (*linkState)->ifname = (char *)malloc(GSW_IFACE_NAME_MAX_LEN);
259 memset((*linkState)->ifname, 0x00, GSW_IFACE_NAME_MAX_LEN);
260
261 (*linkState)->v4_ip = (char *)malloc(GSW_PDP_ADDR_MAX_LEN);
262 memset((*linkState)->v4_ip, 0x00, GSW_PDP_ADDR_MAX_LEN);
263
264 (*linkState)->v4_pdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
265 memset((*linkState)->v4_pdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
266
267 (*linkState)->v4_sdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
268 memset((*linkState)->v4_sdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
269
270 (*linkState)->v4_gw = (char *)malloc(GSW_GETWAYS_ADDR_MAX_LEN);
271 memset((*linkState)->v4_gw, 0x00, GSW_GETWAYS_ADDR_MAX_LEN);
272
273 (*linkState)->v6_ip = (char *)malloc(GSW_PDP_ADDR_MAX_LEN);
274 memset((*linkState)->v6_ip, 0x00, GSW_PDP_ADDR_MAX_LEN);
275
276 (*linkState)->v6_pdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
277 memset((*linkState)->v6_pdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
278
279 (*linkState)->v6_sdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
280 memset((*linkState)->v6_sdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
281
282 return GSW_HAL_SUCCESS;
283}
284
285static int Wan_State_ind_free(Wan_State_ind_s **linkState)
286{
287 if ((*linkState) == NULL)
288 {
289 LOGE("(*linkState) is null\n");
xy.heb41615b2025-05-28 16:33:20 +0800290 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800291 }
292
293 free((*linkState)->type);
294 (*linkState)->type = NULL;
295
296 free((*linkState)->ifname);
297 (*linkState)->ifname = NULL;
298
299 free((*linkState)->v4_ip);
300 (*linkState)->v4_ip = NULL;
301
302 free((*linkState)->v4_pdns);
303 (*linkState)->v4_pdns = NULL;
304
305 free((*linkState)->v4_sdns);
306 (*linkState)->v4_sdns = NULL;
307
308 free((*linkState)->v4_gw);
309 (*linkState)->v4_gw = NULL;
310
311 free((*linkState)->v6_ip);
312 (*linkState)->v6_ip = NULL;
313
314 free((*linkState)->v6_pdns);
315 (*linkState)->v6_pdns = NULL;
316
317 free((*linkState)->v6_sdns);
318 (*linkState)->v6_sdns = NULL;
319
320
321 free((*linkState));
322 (*linkState) = NULL;
323
324 return GSW_HAL_SUCCESS;
325}
326
327static int mbtk_data_api_import()
328{
329 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
330 if (dlHandle_mbtk == NULL)
331 {
xy.heb41615b2025-05-28 16:33:20 +0800332 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800333 }
334
335 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
336 if (mbtk_log_init == NULL)
337 {
xy.heb41615b2025-05-28 16:33:20 +0800338 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800339 }
340
341 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
342 if (mbtk_log == NULL)
343 {
xy.heb41615b2025-05-28 16:33:20 +0800344 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800345 }
346
347 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
348 if (mbtk_info_handle_get == NULL)
349 {
350 LOGE("mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800351 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800352 }
353
354 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
355 if (mbtk_info_handle_free == NULL)
356 {
357 LOGE("mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800358 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800359 }
360
361 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");
362 if (mbtk_pdp_state_change_cb_reg == NULL)
363 {
364 LOGE("mbtk_pdp_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800365 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800366 }
367
368 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");
369 if (mbtk_qser_apn_set == NULL)
370 {
371 LOGE("mbtk_qser_apn_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800372 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800373 }
374
375 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");
376 if (mbtk_data_call_start == NULL)
377 {
378 LOGE("mbtk_data_call_start dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800379 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800380 }
381
382 mbtk_data_call_stop = (int (*)(mbtk_info_handle_t* handle, int cid, int timeout))dlsym(dlHandle_mbtk, "mbtk_data_call_stop");
383 if (mbtk_data_call_stop == NULL)
384 {
385 LOGE("mbtk_data_call_stop dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800386 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800387 }
388
389 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");
390 if (mbtk_data_call_state_get == NULL)
391 {
392 LOGE("mbtk_data_call_state_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800393 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800394 }
395
396 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");
397 if (mbtk_apn_set == NULL)
398 {
399 LOGE("mbtk_apn_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800400 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800401 }
402
403 ipv6_2_str = (int (*)(const void *ipv6, void *ipv6_str))dlsym(dlHandle_mbtk, "ipv6_2_str");
404 if (ipv6_2_str == NULL)
405 {
406 LOGE("ipv6_2_str dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800407 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800408 }
409
410 return GSW_HAL_SUCCESS;
411}
412
413
414
415static int data_call_state_query(int call_id,Wan_State_ind_s *linkState)
416{
417 int ret = -1;
418 mbtk_ipv4_info_t ipv4;
419 mbtk_ipv6_info_t ipv6;
420
421 LOGE("mbtk_data_call_state_get start\n");
422 ret = mbtk_data_call_state_get(data_info_handle, call_id, &ipv4, &ipv6);
423 LOGE("mbtk_data_call_state_get end\n");
424 if (ret != 0)
425 {
426 LOGE("mbtk_data_call_state_get fail\n");
427 return ret;
428 }
429
430 //ifname
431 sprintf(linkState->ifname, "ccinet%d", call_id-1);
432
433 //type
434 if(ipv4.valid)
435 {
436 if(ipv6.valid)
437 {
438 strcpy(linkState->type, "IPV4V6");
439 }
440 else {
441 strcpy(linkState->type, "IP");
442 }
443 }
444 else if(ipv6.valid)
445 {
446 strcpy(linkState->type, "IPV6");
447 }
448
449 //ip
450 LOGE("ipv4.valid = %d\n", ipv4.valid);
451 if(ipv4.valid)
452 {
453 if(linkState==NULL)
454 {
455 LOGE("linkState is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +0800456 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800457 }
458
459 //parse ipv4_addr,gw,dns,sdns
460 if(inet_ntop(AF_INET, &(ipv4.IPAddr), linkState->v4_ip , GSW_PDP_ADDR_MAX_LEN) == NULL) {
461 LOGE("IPv4 error.\n");
462 } else {
463 LOGE("IPv4 : %s\n", linkState->v4_ip);
464
465 }
466
467
468 if(inet_ntop(AF_INET, &(ipv4.GateWay), linkState->v4_gw , GSW_PDP_ADDR_MAX_LEN) == NULL) {
469 LOGE("GateWay error.\n");
470 } else {
471 LOGE("GateWay : %s\n", linkState->v4_gw);
472 }
473
474 if(inet_ntop(AF_INET, &(ipv4.PrimaryDNS), linkState->v4_pdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {
475 LOGE("PrimaryDNS error.\n");
476 } else {
477 LOGE("PrimaryDNS : %s\n", linkState->v4_pdns);
478 }
479
480 if(inet_ntop(AF_INET, &(ipv4.SecondaryDNS), linkState->v4_sdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {
481 LOGE("SecondaryDNS error.\n");
482 } else {
483 LOGE("SecondaryDNS : %s\n", linkState->v4_sdns);
484 }
485 }
486
487 LOGE("ipv6.valid = %d\n", ipv6.valid);
488 if(ipv6.valid)
489 {
490 //parse ipv6_addr,gw,dns,sdns
491 if(ipv6_2_str(&(ipv6.IPV6Addr), linkState->v6_ip)) {
492 LOGE("IPv6 error.\n");
493 } else {
494 LOGE("IPv6 : %s\n", linkState->v6_ip);
495 }
496
497 if(ipv6_2_str(&(ipv6.PrimaryDNS), linkState->v6_pdns)) {
498 LOGE("PrimaryDNS error.\n");
499 } else {
500 LOGE("PrimaryDNS : %s\n", linkState->v6_pdns);
501 }
502
503 if(ipv6_2_str(&(ipv6.SecondaryDNS), linkState->v6_sdns)) {
504 LOGE("SecondaryDNS error.\n");
505 } else {
506 LOGE("SecondaryDNS : %s\n", linkState->v6_sdns);
507 }
508 }
509
510
511
512 return GSW_HAL_SUCCESS;
513}
514
515
516static void data_call_state_change_cb(const void* data, int data_len)
517{
518 LOGE("data_call_state_change_cb() start\n");
519
520 if(data == NULL || data_len == 0)
521 {
522 return;
523 }
524
525 int ret = -1;
526
527 LOGD("Wan_State_ind_malloc start\n");
528 ret = Wan_State_ind_malloc(&linkState_arr);
529 if (ret != 0)
530 {
531 LOGE("Wan_State_ind_malloc[0] fail\n");
532 return ;
533 }
534
535 if(linkState_arr == NULL)
536 {
537 LOGE("linkState_arr is NULL");
538 return ;
539 }
540 else
541 {
542 LOGE("linkState_arr is not NULL");
543 }
544
545 uint8 *net_data = NULL;
546 net_data = (uint8 *)data;
547 //disconnected
548 LOGE("net_data = %d\n", *net_data);
549 if(*net_data > 100 && *net_data < 200)
550 {
551 int apn_id = *net_data - 100;
552 int handle_temp = apn_id-2;
553 LOGE("apn_id = %d\n", apn_id);
554 linkState_arr->state = 0;//disconnected
555 linkState_arr->cid = -1;
556 linkState_arr->handle = handle_temp;
557
558 //get data_call_state
559 if(!data_call_lock)
560 {
561 data_call_state_query(apn_id, linkState_arr);
562 }
563
564 if(gsw_data_call_evt_cb)
565 {
566 gsw_data_call_evt_cb(linkState_arr);
567 }
568 }
569
570 else if(*net_data > 200 && *net_data < 220)
571 {
572 LOGE("cid[%d] is open.\n", *net_data - 200);
573 int apn_id = *net_data-200;
574 int handle_temp = apn_id-2;
575
576 linkState_arr->state = 2;//connected
577 linkState_arr->cid = apn_id;
578 linkState_arr->handle = handle_temp;
579 //get data_call_state
580 if(!data_call_lock)
581 {
582 data_call_state_query(apn_id, linkState_arr);
583 }
584
585 if(gsw_data_call_evt_cb)
586 {
587 gsw_data_call_evt_cb(linkState_arr);
588 }
589 }
590
591 else if(*net_data > 220)
592 {
593 LOGE("cid [%d] is reopen.\n", *net_data - 220);
594 int apn_id = *net_data-220;
595 int handle_temp = apn_id-2;
596
597 linkState_arr->state = 2;//connected
598 linkState_arr->cid = apn_id;
599 linkState_arr->handle = handle_temp;
600
601 //get data_call_state
602 if(!data_call_lock)
603 {
604 data_call_state_query(apn_id, linkState_arr);
605 }
606
607 if(gsw_data_call_evt_cb)
608 {
609 gsw_data_call_evt_cb(linkState_arr);
610 }
611 }
612
613 else if(*net_data == 1)
614 {
615 LOGE("pdp is open.\n");
616 }
617
618 else
619 {
620 LOGE("unknown param [%d].\n", *net_data);
621 }
622
623 ret = Wan_State_ind_free(&linkState_arr);
624 if (ret != 0)
625 {
626 LOGE("Wan_State_ind_free fail\n");
627 }
628
629}
630
631
632
633
634
635
636/**
637 * @brief datacall sdk init
638 * @param [in] evt_cb callback function for data connection state change event
639 * call back;
640 * @retval 0: success
641 * @retval other: fail
642 */
643int gsw_data_call_init(gsw_data_call_evt_cb_t evt_cb)
644{
645 int ret;
646 ret = mbtk_data_api_import();
647 if (ret != 0)
648 {
xy.heb41615b2025-05-28 16:33:20 +0800649 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800650 }
651
652 if(data_init_flag != 0 && data_info_handle != NULL)
653 {
xy.heb41615b2025-05-28 16:33:20 +0800654 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800655 }
656
657 if (ret != GSW_HAL_SUCCESS)
658 {
659 LOGE("mbtk_data_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800660 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800661 }
662
663 data_info_handle = (mbtk_info_handle_t*)mbtk_info_handle_get();
664 if (data_info_handle == NULL)
665 {
666 LOGE("mbtk_info_handle_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800667 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800668 }
669
670 ret = mbtk_pdp_state_change_cb_reg((mbtk_info_handle_t*)data_info_handle, data_call_state_change_cb);
671 if (ret != 0)
672 {
673 LOGE("mbtk_pdp_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800674 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800675 }
676
677 gsw_data_call_evt_cb = evt_cb;
678 data_init_flag = 1;
679 return GSW_HAL_SUCCESS;
680}
681
682
683/**
684 * @brief data_call sdk deinit
685 * @param
686 * @retval 0: success
687 * @retval other: fail
688 */
689int gsw_data_call_deinit(void)
690{
691 int ret;
692 if(data_init_flag == 0 && data_info_handle == NULL)
693 {
xy.heb41615b2025-05-28 16:33:20 +0800694 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800695 }
696
697 ret = mbtk_info_handle_free((mbtk_info_handle_t**)&data_info_handle);
698 if (ret != 0)
699 {
700 LOGE("mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800701 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800702 }
703
704 data_init_flag = 0;
705 return GSW_HAL_SUCCESS;
706}
707
708/**
709 * @brief set apn parameters for data call
710 * @param [in/out] LinkInf apn info for pub or private datacall
711 * inlcude apn name mcc mnc, passwork apnid type cid etc
712 * @retval 0: success
713 * @retval other: fail
714 */
715int gsw_data_call_set_apn(Link_Info_s *LinkInf)
716{
717 if(data_init_flag == 0 && data_info_handle == NULL)
718 {
xy.heb41615b2025-05-28 16:33:20 +0800719 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800720 }
721
722 if(LinkInf == NULL)
723 {
724 LOGE("apn info is null\n");
xy.heb41615b2025-05-28 16:33:20 +0800725 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800726 }
727
728 int ret = 0;
729 mbtk_ip_type_enum ip_type;
730 int auth_type = -1;
731
732 //pdp type
733 if(strcmp(LinkInf->normalProtocol,"IPV4") == 0)
734 {
735 ip_type = MBTK_IP_TYPE_IP;
736 LOGE("pdp_type(protocol) is IPV4\n");
737 }
738 else if(strcmp(LinkInf->normalProtocol,"IPV6") == 0)
739 {
740 ip_type = MBTK_IP_TYPE_IPV6;
741 LOGE("pdp_type(protocol) is IPV6\n");
742 }
743 else if(strcmp(LinkInf->normalProtocol,"IPV4V6") == 0)
744 {
745 ip_type = MBTK_IP_TYPE_IPV4V6;
746 LOGE("pdp_type(protocol) is IPV4V6\n");
747 }
748 else
749 {
750 LOGE("pdp_type(protocol) error\n");
xy.heb41615b2025-05-28 16:33:20 +0800751 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800752 }
753
754 //auth type
755 auth_type = atoi(LinkInf->authType);
756
757 ret = mbtk_apn_set(data_info_handle, LinkInf->handle+2, ip_type, LinkInf -> apn, LinkInf -> usr, LinkInf -> pwd, (const void *)auth_type);
b.liu68a94c92025-05-24 12:53:41 +0800758 if(ret != 0)
759 {
hong.liu006db562025-06-05 17:19:27 +0800760 LOGE("[%s] mbtk_apn_set fail() fail.[%d]", __func__, ret);
xy.heb41615b2025-05-28 16:33:20 +0800761 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800762 }
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 {
xy.heb41615b2025-05-28 16:33:20 +0800782 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800783 }
784
785 if(LinkInf == NULL)
786 {
787 LOGE("apn info is null\n");
xy.heb41615b2025-05-28 16:33:20 +0800788 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800789 }
790
hong.liu006db562025-06-05 17:19:27 +0800791 ret = gsw_data_call_set_apn(LinkInf);
792 if(ret != GSW_HAL_SUCCESS)
793 {
794 LOGE("[%s] gsw_data_call_set_apn() fail", __func__);
795 return GSW_HAL_NORMAL_FAIL;
796 }
797
b.liu68a94c92025-05-24 12:53:41 +0800798 data_call_lock = 1;
799 ret = mbtk_data_call_start((mbtk_info_handle_t*)data_info_handle, linkid + 2, 0, FALSE, 0);
800 data_call_lock = 0;
801 if(ret != 0)
802 {
hong.liu006db562025-06-05 17:19:27 +0800803 LOGE("[%s] mbtk_data_call_start fail.[%d]\n", __func__, ret);
xy.heb41615b2025-05-28 16:33:20 +0800804 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800805 }
806
807 uint8_t cid_temp = (uint8_t)(linkid + 202);
808 data_call_state_change_cb(&cid_temp,1);
809
810 return GSW_HAL_SUCCESS;
811}
812
813
814/**
815 * @brief set apn parameters for data call
816 * @param [in] linkid
817 * @param [in/out] LinkInf link info req: apn info for pub or private datacall
818 * inlcude apn name mcc mnc, passwork apnid etc
819 * resp: data call link state ipaddress type etc
820 * @retval 0: success
821 * @retval other: fail
822 */
823int gsw_data_call_disconnect(int linkid, Link_Info_s *LinkInf)
824{
825 int ret = -1;
826 if(data_init_flag == 0 && data_info_handle == NULL)
827 {
xy.heb41615b2025-05-28 16:33:20 +0800828 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800829 }
830
831 if(LinkInf == NULL)
832 {
833 LOGE("apn info is null\n");
xy.heb41615b2025-05-28 16:33:20 +0800834 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800835 }
836 data_call_lock = 1;
837 ret = mbtk_data_call_stop((mbtk_info_handle_t*)data_info_handle, linkid + 2, 15);
838 data_call_lock = 0;
839 if(ret != 0)
840 {
841 LOGE("mbtk_data_call_stop fail,ret = %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +0800842 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800843 }
844
845 uint8_t cid_temp = (uint8_t)(linkid + 102);
846 data_call_state_change_cb(&cid_temp,1);
847
848 return GSW_HAL_SUCCESS;
849}
850
851
852/*
853 * @brief get mobile operator name
854 @param [in] linkid apn id
855 @param [out] data_pkt obtian actual data call network card data traffic
856 @retval 0: success
857 @retval 0: other: fail
858 */
859int gsw_get_data_call_pkt_stats(int linkid, gsw_data_pkt_stats *data_pkt)
860{
861 char temp_linkid[12] = {0};
862 char interface_name[32] = {0};
863 sprintf(temp_linkid,"%d",linkid+1);
864 snprintf(interface_name, sizeof(interface_name),"ccinet%s", temp_linkid);
865
866 uint64_t tx_bytes = 0;
867 uint64_t tx_packets = 0;
868 uint64_t tx_dropped = 0;
869 uint64_t rx_bytes = 0;
870 uint64_t rx_packets = 0;
871 uint64_t rx_dropped = 0;
872 char command[128] = {0};
873 char* temp;
874 char buffer[512] = {0};
875
876 snprintf(command, sizeof(command), "ifconfig %s", interface_name);
877
878 FILE *fp = popen(command, "r");
879 if(fp == NULL)
880 {
881 LOGE("popen fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800882 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800883 }
884
885 //read line by line
886 while (fgets(buffer, sizeof(buffer), fp) != NULL) {
887 // TX bytes
888 if (strstr(buffer, "TX bytes")) {
889 temp = strstr(buffer, "TX bytes");
890 sscanf(temp, " TX bytes:%llu ", &tx_bytes);
891 }
892 // TX packets
893 if (strstr(buffer, "TX packets")) {
894 sscanf(buffer, " TX packets:%llu ", &tx_packets);
895 sscanf(buffer, " TX packets:%*u errors:%*u dropped:%llu", &tx_dropped);
896 }
897 // RX bytes
898 if (strstr(buffer, "RX bytes")) {
899 LOGE("RX bytes %s\n",strstr(buffer, "RX bytes"));
900 sscanf(buffer, " RX bytes:%llu ", &rx_bytes);
901 }
902 // RX packets
903 if (strstr(buffer, "RX packets")) {
904 sscanf(buffer, " RX packets:%llu ", &rx_packets);
905 sscanf(buffer, " RX packets:%*u errors:%*u dropped:%llu", &rx_dropped);
906 }
907 }
908
909 // 关闭管道
910 pclose(fp);
911
912 // 输出结果
913 LOGE("TX Bytes: %llu\n", tx_bytes);
914 LOGE("TX Packets: %llu\n", tx_packets);
915 LOGE("TX Dropped: %llu\n", tx_dropped);
916 LOGE("RX Bytes: %llu\n", rx_bytes);
917 LOGE("RX Packets: %llu\n", rx_packets);
918 LOGE("RX Dropped: %llu\n", rx_dropped);
919
920 if(data_pkt == NULL)
921 {
922 LOGE("data_pkt is null\n");
xy.heb41615b2025-05-28 16:33:20 +0800923 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800924 }
925
926 else
927 {
928 data_pkt->tx_bytes = tx_bytes;
929 data_pkt->tx_pkts = tx_packets;
930 data_pkt->tx_dropped_pkts = tx_dropped;
931 data_pkt->rx_bytes = rx_bytes;
932 data_pkt->rx_pkts = rx_packets;
933 data_pkt->rx_dropped_pkts = rx_dropped;
934 }
935
936 return GSW_HAL_SUCCESS;
937
938}