blob: 96e893c555fe976a8ff4d075a0a7df73c18c5004 [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>
q.huang6e4f4732025-07-22 18:46:32 +080012#include "gsw_log_interface.h"
b.liu68a94c92025-05-24 12:53:41 +080013
14
15//mbtk include
16#define MBTK_APN_NAME_SIZE 150+1
17#define MBTK_APN_USERNAME_SIZE 127+1
18#define MBTK_APN_PASSWORD_SIZE 127+1
19#define MBTK_APN_TYPE_SIZE 127+1
20
yq.wang22b1bae2025-06-10 13:09:59 +080021#define MBTK_CHANNEL_ID_1 1
22#define MBTK_CHANNEL_ID_2 2
b.liu68a94c92025-05-24 12:53:41 +080023
24#ifndef FALSE
25#define FALSE (0)
26#endif
27
28
29#ifndef TRUE
30#define TRUE (!FALSE)
31#endif
32
33
34
35
36typedef unsigned int uint32;
37typedef unsigned char uint8;
38typedef unsigned short uint16;
39typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
40typedef unsigned long long uint64_t;
41
42typedef struct
43{
44 int client_fd;
45 pthread_t read_thread_id;
46 int exit_fd[2];
47 bool is_waitting;
48 pthread_cond_t cond;
49 pthread_mutex_t mutex;
50
51 pthread_mutex_t send_mutex;
52
53 // Temp response data.
54 uint16 info_err;
55 uint16 data_len;
56 void *data;
57
58 //mbtk wyq for server_ready_status add start
59 char server_ready_status;
60 //mbtk wyq for server_ready_status add end
61
62 mbtk_info_callback_func net_state_cb;
63 mbtk_info_callback_func call_state_cb;
64 mbtk_info_callback_func sms_state_cb;
65 mbtk_info_callback_func radio_state_cb;
66 mbtk_info_callback_func sim_state_cb;
67 mbtk_info_callback_func pdp_state_cb;
68 //add signal by xr
69 mbtk_info_callback_func signal_state_cb;
70} mbtk_info_handle_t;
71
72typedef enum {
73 MBTK_IP_TYPE_IP,
74 MBTK_IP_TYPE_IPV6,
75 MBTK_IP_TYPE_IPV4V6,
76 MBTK_IP_TYPE_PPP
77} mbtk_ip_type_enum;
78
79typedef enum {
80 MBTK_APN_REQ_TYPE_SET = 0, // set apn req
81 MBTK_APN_REQ_TYPE_ADD // add apn req
82}mbtk_apn_req_type_enum;
83
84typedef enum {
85 MBTK_APN_AUTH_PROTO_DEFAULT = 0,
86 MBTK_APN_AUTH_PROTO_NONE,
87 MBTK_APN_AUTH_PROTO_PAP,
88 MBTK_APN_AUTH_PROTO_CHAP,
89#if 0
90 MBTK_APN_AUTH_PROTO_PAP_CHAP,
91 //NOT SUPPORT
92#endif
93} mbtk_apn_auth_proto_enum;
94
yq.wang22b1bae2025-06-10 13:09:59 +080095typedef enum {
96 GSW_ID_CONVERT_TYPE_LINKID = 0,
97 GSW_ID_CONVERT_TYPE_APNID
98}gsw_id_convert_type_e;
b.liu68a94c92025-05-24 12:53:41 +080099
100typedef struct {
101 bool valid;
102 uint32 IPAddr;
103 uint32 PrimaryDNS;
104 uint32 SecondaryDNS;
105 uint32 GateWay;
106 uint32 NetMask;
107} __attribute__((packed)) mbtk_ipv4_info_t;
108
109typedef struct {
110 bool valid;
111 uint32 IPV6Addr[4];
112 uint32 PrimaryDNS[4];
113 uint32 SecondaryDNS[4];
114 uint32 GateWay[4];
115 uint32 NetMask[4];
116} __attribute__((packed)) mbtk_ipv6_info_t;
117
b.liu68a94c92025-05-24 12:53:41 +0800118typedef struct {
119 int cid; /*!< UMTS/CDMA profile ID. range: 0 - 7*/
120 mbtk_ip_type_enum ip_type; /*!< Packet Data Protocol (PDP) type specifies the type of data payload
121 exchanged over the airlink when the packet data session is
122 established with this profile. */
123 mbtk_apn_req_type_enum req_type; /*!< apn req type*/
124 mbtk_apn_auth_proto_enum auth_proto; /*!< Authentication Protocol. */
125 uint8 apn_name[MBTK_APN_NAME_SIZE]; /*!< A string parameter that is a logical name used to select the GGSN
126 and external packet data network. */
127 uint8 user_name[MBTK_APN_USERNAME_SIZE]; /*!< Username used during data network authentication. */
128 uint8 user_pass[MBTK_APN_PASSWORD_SIZE]; /*!< Password to be used during data network authentication. */
129 uint8 apn_type[MBTK_APN_TYPE_SIZE];
130} mbtk_qser_apn_info_s;
131
yq.wangf0f589c2025-06-11 14:59:49 +0800132typedef struct{
133 uint8 cid; //cid number
134 bool connect_state; //true: connect, false: disconnect;
135 bool auto_urc; //urc generated by manual/auto dialing
136 uint8 pdp_result; //The cause of the dialing result
137 mbtk_ipv4_info_t ipv4; //ipv4 info
138 mbtk_ipv6_info_t ipv6; //ipv6 info
139}mbtk_pdp_cb_info_s;
140
b.liu68a94c92025-05-24 12:53:41 +0800141static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
142static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
143int (*mbtk_pdp_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
144int (*mbtk_qser_apn_set)(mbtk_info_handle_t* handle, mbtk_qser_apn_info_s *apninfo, unsigned char *cid);
145int (*mbtk_data_call_start)(mbtk_info_handle_t* handle, int cid, int auto_conn_interval, bool boot_conn, int timeout);
146int (*mbtk_data_call_stop)(mbtk_info_handle_t* handle, int cid, int timeout);
147int (*mbtk_data_call_state_get)(mbtk_info_handle_t* handle, int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6);
148int (*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);
149int (*ipv6_2_str)(const void *ipv6, void *ipv6_str);
b.liu68a94c92025-05-24 12:53:41 +0800150
l.yang6a42e4d2025-05-28 01:04:20 -0700151#define GSW_DATA "[HAL][GSW_DATA]"
152
b.liu68a94c92025-05-24 12:53:41 +0800153//define
b.liu68a94c92025-05-24 12:53:41 +0800154#define lib_mbtk_path "/lib/libmbtk_lib.so"
155pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER;
b.liu68a94c92025-05-24 12:53:41 +0800156static int data_init_flag = 0;
yq.wangf0f589c2025-06-11 14:59:49 +0800157static void *dlHandle_mbtk = NULL;
b.liu68a94c92025-05-24 12:53:41 +0800158static mbtk_info_handle_t* data_info_handle = NULL;
yq.wangf0f589c2025-06-11 14:59:49 +0800159static gsw_data_call_evt_cb_t gsw_data_call_evt_cb = NULL;
b.liu68a94c92025-05-24 12:53:41 +0800160
161Wan_State_ind_s *linkState_arr;
162
163static int Wan_State_ind_malloc(Wan_State_ind_s **linkState)
164{
165 (*linkState) = (Wan_State_ind_s *)malloc(sizeof(Wan_State_ind_s));
166 if((*linkState) == NULL)
167 {
q.huang6e4f4732025-07-22 18:46:32 +0800168 LOGE(GSW_DATA,"malloc Wan_State_ind_s fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800169 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800170 }
171
172 memset((*linkState), 0x00, sizeof(Wan_State_ind_s));
173
174 (*linkState)->handle = -1;
175 (*linkState)->cid = -1;
176 (*linkState)->state = 0;
177 (*linkState)->fail_cause = 0;
178
179 (*linkState)->type = (char *)malloc(GSW_PDP_TYPE_MAX_LEN);
180 memset((*linkState)->type, 0x00, GSW_PDP_TYPE_MAX_LEN);
181
182 (*linkState)->ifname = (char *)malloc(GSW_IFACE_NAME_MAX_LEN);
183 memset((*linkState)->ifname, 0x00, GSW_IFACE_NAME_MAX_LEN);
184
185 (*linkState)->v4_ip = (char *)malloc(GSW_PDP_ADDR_MAX_LEN);
186 memset((*linkState)->v4_ip, 0x00, GSW_PDP_ADDR_MAX_LEN);
187
188 (*linkState)->v4_pdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
189 memset((*linkState)->v4_pdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
190
191 (*linkState)->v4_sdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
192 memset((*linkState)->v4_sdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
193
194 (*linkState)->v4_gw = (char *)malloc(GSW_GETWAYS_ADDR_MAX_LEN);
195 memset((*linkState)->v4_gw, 0x00, GSW_GETWAYS_ADDR_MAX_LEN);
196
197 (*linkState)->v6_ip = (char *)malloc(GSW_PDP_ADDR_MAX_LEN);
198 memset((*linkState)->v6_ip, 0x00, GSW_PDP_ADDR_MAX_LEN);
199
200 (*linkState)->v6_pdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
201 memset((*linkState)->v6_pdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
202
203 (*linkState)->v6_sdns = (char *)malloc(GSW_DNS_ADDR_MAX_LEN);
204 memset((*linkState)->v6_sdns, 0x00, GSW_DNS_ADDR_MAX_LEN);
205
206 return GSW_HAL_SUCCESS;
207}
208
209static int Wan_State_ind_free(Wan_State_ind_s **linkState)
210{
211 if ((*linkState) == NULL)
212 {
q.huang6e4f4732025-07-22 18:46:32 +0800213 LOGE(GSW_DATA,"(*linkState) is null\n");
xy.heb41615b2025-05-28 16:33:20 +0800214 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800215 }
216
217 free((*linkState)->type);
218 (*linkState)->type = NULL;
219
220 free((*linkState)->ifname);
221 (*linkState)->ifname = NULL;
222
223 free((*linkState)->v4_ip);
224 (*linkState)->v4_ip = NULL;
225
226 free((*linkState)->v4_pdns);
227 (*linkState)->v4_pdns = NULL;
228
229 free((*linkState)->v4_sdns);
230 (*linkState)->v4_sdns = NULL;
231
232 free((*linkState)->v4_gw);
233 (*linkState)->v4_gw = NULL;
234
235 free((*linkState)->v6_ip);
236 (*linkState)->v6_ip = NULL;
237
238 free((*linkState)->v6_pdns);
239 (*linkState)->v6_pdns = NULL;
240
241 free((*linkState)->v6_sdns);
242 (*linkState)->v6_sdns = NULL;
243
244
245 free((*linkState));
246 (*linkState) = NULL;
247
248 return GSW_HAL_SUCCESS;
249}
250
251static int mbtk_data_api_import()
252{
253 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
254 if (dlHandle_mbtk == NULL)
255 {
xy.heb41615b2025-05-28 16:33:20 +0800256 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800257 }
b.liu68a94c92025-05-24 12:53:41 +0800258
259 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
260 if (mbtk_info_handle_get == NULL)
261 {
q.huang6e4f4732025-07-22 18:46:32 +0800262 LOGE(GSW_DATA,"mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800263 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800264 }
265
266 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
267 if (mbtk_info_handle_free == NULL)
268 {
q.huang6e4f4732025-07-22 18:46:32 +0800269 LOGE(GSW_DATA,"mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800270 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800271 }
272
273 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");
274 if (mbtk_pdp_state_change_cb_reg == NULL)
275 {
q.huang6e4f4732025-07-22 18:46:32 +0800276 LOGE(GSW_DATA,"mbtk_pdp_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800277 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800278 }
279
280 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");
281 if (mbtk_qser_apn_set == NULL)
282 {
q.huang6e4f4732025-07-22 18:46:32 +0800283 LOGE(GSW_DATA,"mbtk_qser_apn_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800284 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800285 }
286
287 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");
288 if (mbtk_data_call_start == NULL)
289 {
q.huang6e4f4732025-07-22 18:46:32 +0800290 LOGE(GSW_DATA,"mbtk_data_call_start dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800291 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800292 }
293
294 mbtk_data_call_stop = (int (*)(mbtk_info_handle_t* handle, int cid, int timeout))dlsym(dlHandle_mbtk, "mbtk_data_call_stop");
295 if (mbtk_data_call_stop == NULL)
296 {
q.huang6e4f4732025-07-22 18:46:32 +0800297 LOGE(GSW_DATA,"mbtk_data_call_stop dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800298 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800299 }
300
301 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");
302 if (mbtk_data_call_state_get == NULL)
303 {
q.huang6e4f4732025-07-22 18:46:32 +0800304 LOGE(GSW_DATA,"mbtk_data_call_state_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800305 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800306 }
307
308 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");
309 if (mbtk_apn_set == NULL)
310 {
q.huang6e4f4732025-07-22 18:46:32 +0800311 LOGE(GSW_DATA,"mbtk_apn_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800312 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800313 }
314
315 ipv6_2_str = (int (*)(const void *ipv6, void *ipv6_str))dlsym(dlHandle_mbtk, "ipv6_2_str");
316 if (ipv6_2_str == NULL)
317 {
q.huang6e4f4732025-07-22 18:46:32 +0800318 LOGE(GSW_DATA,"ipv6_2_str dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800319 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800320 }
321
322 return GSW_HAL_SUCCESS;
323}
324
325
326
yq.wangf0f589c2025-06-11 14:59:49 +0800327static int data_call_state_query(int call_id,Wan_State_ind_s *linkState, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6)
b.liu68a94c92025-05-24 12:53:41 +0800328{
b.liu68a94c92025-05-24 12:53:41 +0800329 //ifname
330 sprintf(linkState->ifname, "ccinet%d", call_id-1);
331
332 //type
yq.wangf0f589c2025-06-11 14:59:49 +0800333 if(ipv4->valid)
b.liu68a94c92025-05-24 12:53:41 +0800334 {
yq.wangf0f589c2025-06-11 14:59:49 +0800335 if(ipv6->valid)
b.liu68a94c92025-05-24 12:53:41 +0800336 {
337 strcpy(linkState->type, "IPV4V6");
338 }
yq.wangf0f589c2025-06-11 14:59:49 +0800339 else
340 {
b.liu68a94c92025-05-24 12:53:41 +0800341 strcpy(linkState->type, "IP");
342 }
343 }
yq.wangf0f589c2025-06-11 14:59:49 +0800344 else if(ipv6->valid)
b.liu68a94c92025-05-24 12:53:41 +0800345 {
346 strcpy(linkState->type, "IPV6");
347 }
348
349 //ip
q.huang6e4f4732025-07-22 18:46:32 +0800350 LOGD(GSW_DATA,"ipv4.valid = %d", ipv4->valid);
yq.wangf0f589c2025-06-11 14:59:49 +0800351 if(ipv4->valid)
b.liu68a94c92025-05-24 12:53:41 +0800352 {
353 if(linkState==NULL)
354 {
q.huang6e4f4732025-07-22 18:46:32 +0800355 LOGE(GSW_DATA,"linkState is NULL");
xy.heb41615b2025-05-28 16:33:20 +0800356 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800357 }
358
359 //parse ipv4_addr,gw,dns,sdns
yq.wangf0f589c2025-06-11 14:59:49 +0800360 if(inet_ntop(AF_INET, &(ipv4->IPAddr), linkState->v4_ip , GSW_PDP_ADDR_MAX_LEN) == NULL) {
q.huang6e4f4732025-07-22 18:46:32 +0800361 LOGE(GSW_DATA,"IPv4 error");
b.liu68a94c92025-05-24 12:53:41 +0800362 } else {
q.huang6e4f4732025-07-22 18:46:32 +0800363 LOGD(GSW_DATA,"IPv4 : %s", linkState->v4_ip);
b.liu68a94c92025-05-24 12:53:41 +0800364
365 }
366
367
yq.wangf0f589c2025-06-11 14:59:49 +0800368 if(inet_ntop(AF_INET, &(ipv4->GateWay), linkState->v4_gw , GSW_PDP_ADDR_MAX_LEN) == NULL) {
q.huang6e4f4732025-07-22 18:46:32 +0800369 LOGE(GSW_DATA,"GateWay error");
b.liu68a94c92025-05-24 12:53:41 +0800370 } else {
q.huang6e4f4732025-07-22 18:46:32 +0800371 LOGE(GSW_DATA,"GateWay : %s", linkState->v4_gw);
b.liu68a94c92025-05-24 12:53:41 +0800372 }
373
yq.wangf0f589c2025-06-11 14:59:49 +0800374 if(inet_ntop(AF_INET, &(ipv4->PrimaryDNS), linkState->v4_pdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {
q.huang6e4f4732025-07-22 18:46:32 +0800375 LOGE(GSW_DATA,"PrimaryDNS error");
b.liu68a94c92025-05-24 12:53:41 +0800376 } else {
q.huang6e4f4732025-07-22 18:46:32 +0800377 LOGD(GSW_DATA,"PrimaryDNS : %s", linkState->v4_pdns);
b.liu68a94c92025-05-24 12:53:41 +0800378 }
379
yq.wangf0f589c2025-06-11 14:59:49 +0800380 if(inet_ntop(AF_INET, &(ipv4->SecondaryDNS), linkState->v4_sdns , GSW_DNS_ADDR_MAX_LEN) == NULL) {
q.huang6e4f4732025-07-22 18:46:32 +0800381 LOGE(GSW_DATA,"SecondaryDNS error");
b.liu68a94c92025-05-24 12:53:41 +0800382 } else {
q.huang6e4f4732025-07-22 18:46:32 +0800383 LOGD(GSW_DATA,"SecondaryDNS : %s", linkState->v4_sdns);
b.liu68a94c92025-05-24 12:53:41 +0800384 }
385 }
386
q.huang6e4f4732025-07-22 18:46:32 +0800387 LOGD(GSW_DATA,"ipv6.valid = %d", ipv6->valid);
yq.wangf0f589c2025-06-11 14:59:49 +0800388 if(ipv6->valid)
b.liu68a94c92025-05-24 12:53:41 +0800389 {
390 //parse ipv6_addr,gw,dns,sdns
yq.wangf0f589c2025-06-11 14:59:49 +0800391 if(ipv6_2_str(&(ipv6->IPV6Addr), linkState->v6_ip)) {
q.huang6e4f4732025-07-22 18:46:32 +0800392 LOGE(GSW_DATA,"IPv6 error");
b.liu68a94c92025-05-24 12:53:41 +0800393 } else {
q.huang6e4f4732025-07-22 18:46:32 +0800394 LOGD(GSW_DATA,"IPv6 : %s", linkState->v6_ip);
b.liu68a94c92025-05-24 12:53:41 +0800395 }
396
yq.wangf0f589c2025-06-11 14:59:49 +0800397 if(ipv6_2_str(&(ipv6->PrimaryDNS), linkState->v6_pdns)) {
q.huang6e4f4732025-07-22 18:46:32 +0800398 LOGE(GSW_DATA,"PrimaryDNS error");
b.liu68a94c92025-05-24 12:53:41 +0800399 } else {
q.huang6e4f4732025-07-22 18:46:32 +0800400 LOGD(GSW_DATA,"PrimaryDNS : %s", linkState->v6_pdns);
b.liu68a94c92025-05-24 12:53:41 +0800401 }
402
yq.wangf0f589c2025-06-11 14:59:49 +0800403 if(ipv6_2_str(&(ipv6->SecondaryDNS), linkState->v6_sdns)) {
q.huang6e4f4732025-07-22 18:46:32 +0800404 LOGE(GSW_DATA,"SecondaryDNS error");
b.liu68a94c92025-05-24 12:53:41 +0800405 } else {
q.huang6e4f4732025-07-22 18:46:32 +0800406 LOGD(GSW_DATA,"SecondaryDNS : %s", linkState->v6_sdns);
b.liu68a94c92025-05-24 12:53:41 +0800407 }
408 }
409
b.liu68a94c92025-05-24 12:53:41 +0800410 return GSW_HAL_SUCCESS;
411}
412
413
414static void data_call_state_change_cb(const void* data, int data_len)
415{
q.huang6e4f4732025-07-22 18:46:32 +0800416 LOGE(GSW_DATA,"data_call_state_change_cb() start\n");
b.liu68a94c92025-05-24 12:53:41 +0800417
yq.wangf0f589c2025-06-11 14:59:49 +0800418 if(data == NULL || data_len != sizeof(mbtk_pdp_cb_info_s))
b.liu68a94c92025-05-24 12:53:41 +0800419 {
q.huang6e4f4732025-07-22 18:46:32 +0800420 LOGE(GSW_DATA,"data = [NULL], data_len(%d) != sizeof(mbtk_pdp_cb_info_s)(%d)", data_len, sizeof(mbtk_pdp_cb_info_s));
b.liu68a94c92025-05-24 12:53:41 +0800421 return;
422 }
423
424 int ret = -1;
425
q.huang6e4f4732025-07-22 18:46:32 +0800426 LOGD(GSW_DATA,"Wan_State_ind_malloc start\n");
b.liu68a94c92025-05-24 12:53:41 +0800427 ret = Wan_State_ind_malloc(&linkState_arr);
428 if (ret != 0)
429 {
q.huang6e4f4732025-07-22 18:46:32 +0800430 LOGE(GSW_DATA,"Wan_State_ind_malloc[0] fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800431 return ;
432 }
433
434 if(linkState_arr == NULL)
435 {
q.huang6e4f4732025-07-22 18:46:32 +0800436 LOGE(GSW_DATA,"linkState_arr is NULL");
b.liu68a94c92025-05-24 12:53:41 +0800437 return ;
438 }
439 else
440 {
q.huang6e4f4732025-07-22 18:46:32 +0800441 LOGE(GSW_DATA,"linkState_arr is not NULL");
b.liu68a94c92025-05-24 12:53:41 +0800442 }
443
yq.wangf0f589c2025-06-11 14:59:49 +0800444 mbtk_pdp_cb_info_s *pdp_cb_info = (mbtk_pdp_cb_info_s *)data;
445 linkState_arr->cid = pdp_cb_info->cid;
446 linkState_arr->handle = pdp_cb_info->cid;
447 if(pdp_cb_info->connect_state)
b.liu68a94c92025-05-24 12:53:41 +0800448 {
b.liu68a94c92025-05-24 12:53:41 +0800449 linkState_arr->state = 2;//connected
yq.wangf0f589c2025-06-11 14:59:49 +0800450 data_call_state_query(pdp_cb_info->cid, linkState_arr, &(pdp_cb_info->ipv4), &(pdp_cb_info->ipv6));
b.liu68a94c92025-05-24 12:53:41 +0800451 }
b.liu68a94c92025-05-24 12:53:41 +0800452 else
453 {
yq.wangf0f589c2025-06-11 14:59:49 +0800454 linkState_arr->state = 0;//disconnected
455 }
456
457 if(gsw_data_call_evt_cb)
458 {
459 gsw_data_call_evt_cb(linkState_arr);
b.liu68a94c92025-05-24 12:53:41 +0800460 }
461
462 ret = Wan_State_ind_free(&linkState_arr);
463 if (ret != 0)
464 {
q.huang6e4f4732025-07-22 18:46:32 +0800465 LOGE(GSW_DATA,"Wan_State_ind_free fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800466 }
467
468}
469
yq.wang22b1bae2025-06-10 13:09:59 +0800470static int gsw_id_convert_to_channel_id(int gsw_id, gsw_id_convert_type_e type, int *channel_id)
471{
472 if(GSW_ID_CONVERT_TYPE_LINKID == type)
473 {
474 switch(gsw_id)
475 {
476 case 0:
477 {
478 *channel_id = MBTK_CHANNEL_ID_2;
479 break;
480 }
481 case 1:
482 {
483 *channel_id = MBTK_CHANNEL_ID_1;
484 break;
485 }
486 default :
487 {
q.huang6e4f4732025-07-22 18:46:32 +0800488 LOGE(GSW_DATA,"[%s] gsw_id(linkid) unknown.[%d]", __func__, gsw_id);
yq.wang22b1bae2025-06-10 13:09:59 +0800489 return -1;
490 }
491 }
492 }
493 else
494 {
495 switch(gsw_id)
496 {
497 case 1:
498 case -2:
499 {
500 *channel_id = MBTK_CHANNEL_ID_1;
501 break;
502 }
503 case -1:
hong.liu7adeb602025-06-18 17:19:01 +0800504 case 2:
yq.wang22b1bae2025-06-10 13:09:59 +0800505 {
506 *channel_id = MBTK_CHANNEL_ID_2;
507 break;
508 }
509 default :
510 {
q.huang6e4f4732025-07-22 18:46:32 +0800511 LOGE(GSW_DATA,"[%s] gsw_id(apnid) unknown.[%d]", __func__, gsw_id);
yq.wang22b1bae2025-06-10 13:09:59 +0800512 return -1;
513 }
514 }
515 }
b.liu68a94c92025-05-24 12:53:41 +0800516
yq.wang22b1bae2025-06-10 13:09:59 +0800517 return 0;
518}
b.liu68a94c92025-05-24 12:53:41 +0800519
520
521
522
523/**
524 * @brief datacall sdk init
525 * @param [in] evt_cb callback function for data connection state change event
526 * call back;
527 * @retval 0: success
528 * @retval other: fail
529 */
530int gsw_data_call_init(gsw_data_call_evt_cb_t evt_cb)
531{
532 int ret;
533 ret = mbtk_data_api_import();
534 if (ret != 0)
535 {
xy.heb41615b2025-05-28 16:33:20 +0800536 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800537 }
538
539 if(data_init_flag != 0 && data_info_handle != NULL)
540 {
xy.heb41615b2025-05-28 16:33:20 +0800541 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800542 }
543
544 if (ret != GSW_HAL_SUCCESS)
545 {
q.huang6e4f4732025-07-22 18:46:32 +0800546 LOGE(GSW_DATA,"mbtk_data_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800547 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800548 }
549
550 data_info_handle = (mbtk_info_handle_t*)mbtk_info_handle_get();
551 if (data_info_handle == NULL)
552 {
q.huang6e4f4732025-07-22 18:46:32 +0800553 LOGE(GSW_DATA,"mbtk_info_handle_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800554 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800555 }
556
557 ret = mbtk_pdp_state_change_cb_reg((mbtk_info_handle_t*)data_info_handle, data_call_state_change_cb);
558 if (ret != 0)
559 {
q.huang6e4f4732025-07-22 18:46:32 +0800560 LOGE(GSW_DATA,"mbtk_pdp_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800561 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800562 }
hong.liud2417072025-06-27 07:10:37 -0700563
b.liu68a94c92025-05-24 12:53:41 +0800564 gsw_data_call_evt_cb = evt_cb;
565 data_init_flag = 1;
566 return GSW_HAL_SUCCESS;
567}
568
569
570/**
571 * @brief data_call sdk deinit
572 * @param
573 * @retval 0: success
574 * @retval other: fail
575 */
576int gsw_data_call_deinit(void)
577{
578 int ret;
q.huang09ae5bc2025-06-10 15:25:36 +0800579 if(data_init_flag == 0 || data_info_handle == NULL)
b.liu68a94c92025-05-24 12:53:41 +0800580 {
xy.heb41615b2025-05-28 16:33:20 +0800581 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800582 }
583
584 ret = mbtk_info_handle_free((mbtk_info_handle_t**)&data_info_handle);
585 if (ret != 0)
586 {
q.huang6e4f4732025-07-22 18:46:32 +0800587 LOGE(GSW_DATA,"mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800588 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800589 }
590
591 data_init_flag = 0;
592 return GSW_HAL_SUCCESS;
593}
594
595/**
596 * @brief set apn parameters for data call
597 * @param [in/out] LinkInf apn info for pub or private datacall
598 * inlcude apn name mcc mnc, passwork apnid type cid etc
599 * @retval 0: success
600 * @retval other: fail
601 */
602int gsw_data_call_set_apn(Link_Info_s *LinkInf)
603{
q.huang09ae5bc2025-06-10 15:25:36 +0800604 if(data_init_flag == 0 || data_info_handle == NULL)
b.liu68a94c92025-05-24 12:53:41 +0800605 {
xy.heb41615b2025-05-28 16:33:20 +0800606 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800607 }
608
609 if(LinkInf == NULL)
610 {
q.huang6e4f4732025-07-22 18:46:32 +0800611 LOGE(GSW_DATA,"apn info is null");
xy.heb41615b2025-05-28 16:33:20 +0800612 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800613 }
614
615 int ret = 0;
yq.wang22b1bae2025-06-10 13:09:59 +0800616 int cid = -1;
617 int apnid = -1;
b.liu68a94c92025-05-24 12:53:41 +0800618 mbtk_ip_type_enum ip_type;
yq.wang22b1bae2025-06-10 13:09:59 +0800619 char auth_type[GSW_AUTH_TYPE_MAX_LEN + 1] = {0};
b.liu68a94c92025-05-24 12:53:41 +0800620
621 //pdp type
yq.wang22b1bae2025-06-10 13:09:59 +0800622 if(strcmp(LinkInf->normalProtocol,"IP") == 0)
b.liu68a94c92025-05-24 12:53:41 +0800623 {
624 ip_type = MBTK_IP_TYPE_IP;
q.huang6e4f4732025-07-22 18:46:32 +0800625 LOGE(GSW_DATA,"pdp_type(protocol) is IP");
b.liu68a94c92025-05-24 12:53:41 +0800626 }
627 else if(strcmp(LinkInf->normalProtocol,"IPV6") == 0)
628 {
629 ip_type = MBTK_IP_TYPE_IPV6;
q.huang6e4f4732025-07-22 18:46:32 +0800630 LOGE(GSW_DATA,"pdp_type(protocol) is IPV6");
b.liu68a94c92025-05-24 12:53:41 +0800631 }
632 else if(strcmp(LinkInf->normalProtocol,"IPV4V6") == 0)
633 {
634 ip_type = MBTK_IP_TYPE_IPV4V6;
q.huang6e4f4732025-07-22 18:46:32 +0800635 LOGE(GSW_DATA,"pdp_type(protocol) is IPV4V6");
b.liu68a94c92025-05-24 12:53:41 +0800636 }
637 else
638 {
q.huang6e4f4732025-07-22 18:46:32 +0800639 LOGE(GSW_DATA,"pdp_type(protocol) error");
xy.heb41615b2025-05-28 16:33:20 +0800640 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800641 }
642
yq.wang22b1bae2025-06-10 13:09:59 +0800643 apnid = atoi(LinkInf->apnid);
644 ret = gsw_id_convert_to_channel_id(apnid, GSW_ID_CONVERT_TYPE_APNID, &cid);
645 if(0 != ret)
646 {
q.huang6e4f4732025-07-22 18:46:32 +0800647 LOGE(GSW_DATA,"[%s] gsw_id_convert_to_channel_id() fail", __func__);
yq.wang22b1bae2025-06-10 13:09:59 +0800648 return GSW_HAL_NORMAL_FAIL;
649 }
b.liu68a94c92025-05-24 12:53:41 +0800650
yq.wang22b1bae2025-06-10 13:09:59 +0800651 //bypass solution for authparams issue
652 #if 0
653 memset(LinkInf->usr, 0x00, sizeof(LinkInf->usr));
654 memset(LinkInf->pwd, 0x00, sizeof(LinkInf->pwd));
655 memset(LinkInf->authType, 0x00, sizeof(LinkInf->authType));
656 #endif
657 //auth type
658 memset(auth_type, 0x00, GSW_AUTH_TYPE_MAX_LEN + 1);
659 if(0 == strlen(LinkInf->authType) || 0 == strcmp(LinkInf->authType, "0"))
660 {
661 memcpy(auth_type, "NONE", strlen("NONE"));
662 }
663 else if(0 == strcmp(LinkInf->authType, "1"))
664 {
665 memcpy(auth_type, "PAP", strlen("PAP"));
666 }
667 else if(0 == strcmp(LinkInf->authType, "2"))
668 {
669 memcpy(auth_type, "CHAP", strlen("CHAP"));
670 }
671 else if(0 == strcmp(LinkInf->authType, "3"))
672 {
673 //nonsupport
q.huang6e4f4732025-07-22 18:46:32 +0800674 LOGE(GSW_DATA,"[%s] LinkInf->authType(3) nonsupport", __func__);
yq.wang22b1bae2025-06-10 13:09:59 +0800675 return GSW_HAL_NORMAL_FAIL;
676 }
677 else
678 {
q.huang6e4f4732025-07-22 18:46:32 +0800679 LOGE(GSW_DATA,"[%s] LinkInf->authType(%s) unknown", __func__, LinkInf->authType);
yq.wang22b1bae2025-06-10 13:09:59 +0800680 return GSW_HAL_NORMAL_FAIL;
681 }
682
683 ret = mbtk_apn_set(data_info_handle, cid, ip_type, LinkInf -> apn, LinkInf -> usr, LinkInf -> pwd, (const void *)auth_type);
b.liu68a94c92025-05-24 12:53:41 +0800684 if(ret != 0)
685 {
q.huang6e4f4732025-07-22 18:46:32 +0800686 LOGE(GSW_DATA,"[%s] mbtk_apn_set fail() fail.[%d]", __func__, ret);
xy.heb41615b2025-05-28 16:33:20 +0800687 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800688 }
689
690 return GSW_HAL_SUCCESS;
691}
692
693
694/**
695 * @brief set apn parameters for data call
696 * @param [in] linkid data connetion link number
697 * @param [in/out] LinkInf link info req: apn info for pub or private datacall
698 * inlcude apn name mcc mnc, passwork apnid etc
699 * resp: data call link state ipaddress type etc
700 * @retval 0: success
701 * @retval other: fail
702 */
703int gsw_data_call_connect(int linkid, Link_Info_s *LinkInf)
704{
705 int ret = -1;
yq.wang22b1bae2025-06-10 13:09:59 +0800706 int cid = -1;
q.huang09ae5bc2025-06-10 15:25:36 +0800707 if(data_init_flag == 0 || data_info_handle == NULL)
b.liu68a94c92025-05-24 12:53:41 +0800708 {
xy.heb41615b2025-05-28 16:33:20 +0800709 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800710 }
711
712 if(LinkInf == NULL)
713 {
q.huang6e4f4732025-07-22 18:46:32 +0800714 LOGE(GSW_DATA,"apn info is null");
xy.heb41615b2025-05-28 16:33:20 +0800715 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800716 }
717
hong.liu006db562025-06-05 17:19:27 +0800718 ret = gsw_data_call_set_apn(LinkInf);
719 if(ret != GSW_HAL_SUCCESS)
720 {
q.huang6e4f4732025-07-22 18:46:32 +0800721 LOGE(GSW_DATA,"[%s] gsw_data_call_set_apn() fail", __func__);
hong.liu006db562025-06-05 17:19:27 +0800722 return GSW_HAL_NORMAL_FAIL;
723 }
724
yq.wang22b1bae2025-06-10 13:09:59 +0800725 ret = gsw_id_convert_to_channel_id(linkid, GSW_ID_CONVERT_TYPE_LINKID, &cid);
726 if(0 != ret)
727 {
q.huang6e4f4732025-07-22 18:46:32 +0800728 LOGE(GSW_DATA,"[%s] gsw_id_convert_to_channel_id() fail", __func__);
yq.wang22b1bae2025-06-10 13:09:59 +0800729 return GSW_HAL_NORMAL_FAIL;
730 }
731
yq.wang22b1bae2025-06-10 13:09:59 +0800732 ret = mbtk_data_call_start((mbtk_info_handle_t*)data_info_handle, cid, 0, FALSE, 0);
b.liu68a94c92025-05-24 12:53:41 +0800733 if(ret != 0)
734 {
q.huang6e4f4732025-07-22 18:46:32 +0800735 LOGE(GSW_DATA,"[%s] mbtk_data_call_start fail.[%d]", __func__, ret);
xy.heb41615b2025-05-28 16:33:20 +0800736 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800737 }
738
yq.wang22b1bae2025-06-10 13:09:59 +0800739 LinkInf->handle = cid;
740 memset(LinkInf->apnid, 0x00, sizeof(LinkInf->apnid));
741 sprintf(LinkInf->apnid, "%d", cid);
b.liu68a94c92025-05-24 12:53:41 +0800742
743 return GSW_HAL_SUCCESS;
744}
745
746
747/**
748 * @brief set apn parameters for data call
749 * @param [in] linkid
750 * @param [in/out] LinkInf link info req: apn info for pub or private datacall
751 * inlcude apn name mcc mnc, passwork apnid etc
752 * resp: data call link state ipaddress type etc
753 * @retval 0: success
754 * @retval other: fail
755 */
756int gsw_data_call_disconnect(int linkid, Link_Info_s *LinkInf)
757{
758 int ret = -1;
yq.wang22b1bae2025-06-10 13:09:59 +0800759 int cid = -1;
q.huang09ae5bc2025-06-10 15:25:36 +0800760 if(data_init_flag == 0 || data_info_handle == NULL)
b.liu68a94c92025-05-24 12:53:41 +0800761 {
xy.heb41615b2025-05-28 16:33:20 +0800762 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800763 }
764
765 if(LinkInf == NULL)
766 {
q.huang6e4f4732025-07-22 18:46:32 +0800767 LOGE(GSW_DATA,"apn info is null");
xy.heb41615b2025-05-28 16:33:20 +0800768 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800769 }
770
yq.wang22b1bae2025-06-10 13:09:59 +0800771 ret = gsw_id_convert_to_channel_id(linkid, GSW_ID_CONVERT_TYPE_LINKID, &cid);
772 if(0 != ret)
773 {
q.huang6e4f4732025-07-22 18:46:32 +0800774 LOGE(GSW_DATA,"[%s] gsw_id_convert_to_channel_id() fail", __func__);
yq.wang22b1bae2025-06-10 13:09:59 +0800775 return GSW_HAL_NORMAL_FAIL;
776 }
777
yq.wang22b1bae2025-06-10 13:09:59 +0800778 ret = mbtk_data_call_stop((mbtk_info_handle_t*)data_info_handle, cid, 15);
yq.wang22b1bae2025-06-10 13:09:59 +0800779 if(ret != 0)
780 {
q.huang6e4f4732025-07-22 18:46:32 +0800781 LOGE(GSW_DATA,"[%s] mbtk_data_call_stop() fail.[%d]",__func__, ret);
yq.wang22b1bae2025-06-10 13:09:59 +0800782 return GSW_HAL_NORMAL_FAIL;
783 }
784
b.liu68a94c92025-05-24 12:53:41 +0800785 return GSW_HAL_SUCCESS;
786}
787
788
789/*
790 * @brief get mobile operator name
791 @param [in] linkid apn id
792 @param [out] data_pkt obtian actual data call network card data traffic
793 @retval 0: success
794 @retval 0: other: fail
795 */
796int gsw_get_data_call_pkt_stats(int linkid, gsw_data_pkt_stats *data_pkt)
797{
q.huang09ae5bc2025-06-10 15:25:36 +0800798
799 if(data_init_flag == 0 || data_info_handle == NULL)
800 {
801 return GSW_HAL_NORMAL_FAIL;
802 }
b.liu68a94c92025-05-24 12:53:41 +0800803 char temp_linkid[12] = {0};
804 char interface_name[32] = {0};
805 sprintf(temp_linkid,"%d",linkid+1);
806 snprintf(interface_name, sizeof(interface_name),"ccinet%s", temp_linkid);
807
808 uint64_t tx_bytes = 0;
809 uint64_t tx_packets = 0;
810 uint64_t tx_dropped = 0;
811 uint64_t rx_bytes = 0;
812 uint64_t rx_packets = 0;
813 uint64_t rx_dropped = 0;
814 char command[128] = {0};
815 char* temp;
816 char buffer[512] = {0};
817
818 snprintf(command, sizeof(command), "ifconfig %s", interface_name);
819
820 FILE *fp = popen(command, "r");
821 if(fp == NULL)
822 {
q.huang6e4f4732025-07-22 18:46:32 +0800823 LOGE(GSW_DATA,"popen fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800824 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800825 }
826
827 //read line by line
828 while (fgets(buffer, sizeof(buffer), fp) != NULL) {
829 // TX bytes
830 if (strstr(buffer, "TX bytes")) {
831 temp = strstr(buffer, "TX bytes");
832 sscanf(temp, " TX bytes:%llu ", &tx_bytes);
833 }
834 // TX packets
835 if (strstr(buffer, "TX packets")) {
836 sscanf(buffer, " TX packets:%llu ", &tx_packets);
837 sscanf(buffer, " TX packets:%*u errors:%*u dropped:%llu", &tx_dropped);
838 }
839 // RX bytes
840 if (strstr(buffer, "RX bytes")) {
q.huang6e4f4732025-07-22 18:46:32 +0800841 LOGE(GSW_DATA,"RX bytes %s\n",strstr(buffer, "RX bytes"));
b.liu68a94c92025-05-24 12:53:41 +0800842 sscanf(buffer, " RX bytes:%llu ", &rx_bytes);
843 }
844 // RX packets
845 if (strstr(buffer, "RX packets")) {
846 sscanf(buffer, " RX packets:%llu ", &rx_packets);
847 sscanf(buffer, " RX packets:%*u errors:%*u dropped:%llu", &rx_dropped);
848 }
849 }
850
851 // 关闭管道
852 pclose(fp);
853
854 // 输出结果
q.huang6e4f4732025-07-22 18:46:32 +0800855 LOGE(GSW_DATA,"TX Bytes: %llu\n", tx_bytes);
856 LOGE(GSW_DATA,"TX Packets: %llu\n", tx_packets);
857 LOGE(GSW_DATA,"TX Dropped: %llu\n", tx_dropped);
858 LOGE(GSW_DATA,"RX Bytes: %llu\n", rx_bytes);
859 LOGE(GSW_DATA,"RX Packets: %llu\n", rx_packets);
860 LOGE(GSW_DATA,"RX Dropped: %llu\n", rx_dropped);
b.liu68a94c92025-05-24 12:53:41 +0800861
862 if(data_pkt == NULL)
863 {
q.huang6e4f4732025-07-22 18:46:32 +0800864 LOGE(GSW_DATA,"data_pkt is null\n");
xy.heb41615b2025-05-28 16:33:20 +0800865 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800866 }
867
868 else
869 {
870 data_pkt->tx_bytes = tx_bytes;
871 data_pkt->tx_pkts = tx_packets;
872 data_pkt->tx_dropped_pkts = tx_dropped;
873 data_pkt->rx_bytes = rx_bytes;
874 data_pkt->rx_pkts = rx_packets;
875 data_pkt->rx_dropped_pkts = rx_dropped;
876 }
877
878 return GSW_HAL_SUCCESS;
879
880}