blob: 45a957d4d3dac861e4163e296927429e3c1538c5 [file] [log] [blame]
qs.xiong1af5daf2022-03-14 09:12:12 -04001/**@File lib_wifi6.c
2* @Brief :about function test
3* @details :
you.chen35020192022-05-06 11:30:57 +08004* @Author : you.chen
5* @Date : 2022-4-6
qs.xiong1af5daf2022-03-14 09:12:12 -04006* @Version : V1.0
7* @copy ritght : Copyright (c) MobileTek
8*/
9#include <log/log.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050010#include <stdio.h>
11#include <sys/types.h>
you.chen35020192022-05-06 11:30:57 +080012#include <stdlib.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050013#include <string.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050014#include "libwifi6.h"
you.chen35020192022-05-06 11:30:57 +080015#include <wpa_ctrl.h>
16#include <string.h>
17#include <time.h>
18#include <pthread.h>
19#include <sys/socket.h>
20#include <netinet/in.h>
21#include <arpa/inet.h>
22#include <netdb.h>
23#include <ifaddrs.h>
qs.xiong9fbf74e2023-03-28 13:38:22 +080024#include "log/log.h"
qs.xiong7a105ce2022-03-02 09:43:11 -050025
qs.xiong1af5daf2022-03-14 09:12:12 -040026#ifdef __cplusplus
27extern "C" {
28#endif
29#ifdef __cplusplus
30}
31#endif
you.chen35020192022-05-06 11:30:57 +080032
qs.xiong9fbf74e2023-03-28 13:38:22 +080033#undef LOG_TAG
34#define LOG_TAG "LYNQ_WIFI"
you.chen35020192022-05-06 11:30:57 +080035#define MAX_CMD 128
36#define MAX_RET 4096
qs.xiongf1b525b2022-03-31 00:58:23 -040037#define MODE_LEN 10
you.chen35020192022-05-06 11:30:57 +080038#define CTRL_STA 0
39#define CTRL_AP 1
40#define AP_NETWORK_0 0
41
42pthread_t g_ap_watcher_pid = 0;
43volatile int g_ap_watcher_stop_flag = 0;
you.chena6fa5b22022-05-18 10:28:19 +080044volatile int g_ap_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080045
46pthread_t g_sta_watcher_pid = 0;
47volatile int g_sta_watcher_stop_flag = 0;
you.chen9ac66392022-08-06 17:01:16 +080048volatile int g_sta_scan_finish_flag = 1;
you.chena6fa5b22022-05-18 10:28:19 +080049volatile int g_sta_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080050
51void * g_ap_callback_priv = NULL;
52AP_CALLBACK_FUNC_PTR g_ap_callback_func = NULL;
53void * g_sta_callback_priv = NULL;
54STA_CALLBACK_FUNC_PTR g_sta_callback_func = NULL;
55
56//const char * CTRL_PATH="/var/run/wpa_supplicant";
57const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/ap0"};
58//const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/wlan0"};
59const char * cmd_list_networks = "LIST_NETWORKS";
60const char * cmd_save_config = "SAVE_CONFIG";
you.chen6c2dd9c2022-05-16 17:55:28 +080061const char * cmd_disconnect = "DISCONNECT";
62const char * cmd_remove_all = "REMOVE_NETWORK all";
you.chen35020192022-05-06 11:30:57 +080063const char * state_scan_result = "CTRL-EVENT-SCAN-RESULTS";
you.chen9ac66392022-08-06 17:01:16 +080064const char * STATE_COMPLETED = "COMPLETED";
you.chen35020192022-05-06 11:30:57 +080065
you.chend2fef3f2023-02-13 10:50:35 +080066struct local_wpa_ctrl{
67 struct wpa_ctrl *ctrl;
68 pthread_mutex_t mutex;
69};
70
71static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
72
73static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
you.chen35020192022-05-06 11:30:57 +080074
you.chen0f5c6432022-11-07 18:31:14 +080075//you.chen add for tv-box start
76volatile int g_gbw_enabled = 0;
77char * g_gbw_mac = NULL;
78pthread_t g_gbw_watcher_pid = 0;
79static int startGBW();
80static int stopGBW();
81//you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +080082
83typedef struct __curr_status_info {
84 ap_info_s *ap;
85 char * state;
86 int net_no;
87}curr_status_info;
qs.xiong97fa59b2022-04-07 05:41:29 -040088
you.chend2fef3f2023-02-13 10:50:35 +080089static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
90 char *reply, size_t *reply_len,
91 void (*msg_cb)(char *msg, size_t len))
92{
93 int ret;
94 if (ctrl->ctrl == NULL) {
qs.xiong9fbf74e2023-03-28 13:38:22 +080095 RLOGE("local_wpa_ctrl_request ctrl is null\n");
you.chend2fef3f2023-02-13 10:50:35 +080096 return -1;
97 }
98 pthread_mutex_lock(&ctrl->mutex);
99 ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
100 pthread_mutex_unlock(&ctrl->mutex);
101 return ret;
102}
103
104static struct local_wpa_ctrl * inner_get_wpa_ctrl(int index) {
105 int repeat_cnt;
106 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
107 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800108 RLOGD("inner_get_wpa_ctrl\n");
you.chend2fef3f2023-02-13 10:50:35 +0800109 for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
110 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
111// printf("wait enable finish\n");
112 usleep(500 * 1000);
113 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
114 }
115 if (NULL == g_lynq_wpa_ctrl[index]) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800116 RLOGE("NULL == g_lynq_wpa_ctrl[index]");
you.chend2fef3f2023-02-13 10:50:35 +0800117 goto out_addr;
118 }
119 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
120 g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
121 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800122 RLOGE("wpa_ctrl_open fail\n");
you.chend2fef3f2023-02-13 10:50:35 +0800123 goto out_addr;
124 }
125 pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
126 }
127 lynq_wpa_ctrl = g_lynq_wpa_ctrl[index];
128out_addr:
129 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
130 return lynq_wpa_ctrl;
131}
132
qs.xiong97fa59b2022-04-07 05:41:29 -0400133#define PRINT_AND_RETURN_VALUE(str,value) \
qs.xiong97fa59b2022-04-07 05:41:29 -0400134{\
you.chen35020192022-05-06 11:30:57 +0800135 perror((str));\
136 return (value);\
qs.xiong97fa59b2022-04-07 05:41:29 -0400137}
138
you.chen35020192022-05-06 11:30:57 +0800139#define CHECK_IDX(idx, type) do { \
140 if ( (idx == LYNQ_WIFI_INTERFACE_0 && type != CTRL_STA) || (idx == LYNQ_WIFI_INTERFACE_1 && type != CTRL_AP) \
141 || idx < LYNQ_WIFI_INTERFACE_0 || idx > LYNQ_WIFI_INTERFACE_1 ) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800142 RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
you.chen35020192022-05-06 11:30:57 +0800143 return -1; \
144 } \
145 }while (0)
146
147#define CHECK_WPA_CTRL(index) int ret = 0;\
148 size_t reply_len = MAX_RET; \
149 char cmd_reply[MAX_RET]={0}; \
you.chend2fef3f2023-02-13 10:50:35 +0800150 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
you.chen35020192022-05-06 11:30:57 +0800151 do{ \
you.chend2fef3f2023-02-13 10:50:35 +0800152 lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
153 if (NULL == lynq_wpa_ctrl) return -1; \
you.chen35020192022-05-06 11:30:57 +0800154 }while(0)
155
156#define DO_REQUEST(cmd_str) do { \
157 reply_len = MAX_RET;\
158 cmd_reply[0] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800159 RLOGD("to call [%s]\n", cmd_str); \
you.chend2fef3f2023-02-13 10:50:35 +0800160 ret = local_wpa_ctrl_request(lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL); \
you.chen35020192022-05-06 11:30:57 +0800161 if (ret != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800162 RLOGE("call "#cmd_str" fail %d\n", ret); \
you.chen35020192022-05-06 11:30:57 +0800163 return ret; \
164 } \
165 cmd_reply[reply_len+1] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800166 RLOGD("cmd replay [ %s ]\n", cmd_reply); \
you.chen35020192022-05-06 11:30:57 +0800167 }while(0)
168
169#define DO_OK_FAIL_REQUEST(cmd_str) do { \
170 DO_REQUEST(cmd_str); \
171 if (reply_len >=4 && memcmp(cmd_reply, "FAIL", 4) == 0 ) {\
qs.xiong9fbf74e2023-03-28 13:38:22 +0800172 RLOGE("cmd "#cmd_str" return FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800173 return -1; \
174 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800175 RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800176 return -1; \
177 } \
178 }while (0)
179
180
you.chend2fef3f2023-02-13 10:50:35 +0800181static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
you.chen35020192022-05-06 11:30:57 +0800182
183static void APWatcherThreadProc() {
184 size_t len = MAX_RET;
185 char msg_notify[MAX_RET];
186
you.chen6c2dd9c2022-05-16 17:55:28 +0800187 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800188 g_ap_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800189
qs.xiong9fbf74e2023-03-28 13:38:22 +0800190 while (g_ap_watcher_stop_flag == 0)
191 {
192 if (lynq_wpa_ctrl == NULL)
193 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800194 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[CTRL_AP]); //@todo temp change
qs.xiong9fbf74e2023-03-28 13:38:22 +0800195 if (lynq_wpa_ctrl == NULL)
196 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800197 usleep(100*1000);
198 continue;
199 }
200
201 wpa_ctrl_attach(lynq_wpa_ctrl);
you.chena6fa5b22022-05-18 10:28:19 +0800202 g_ap_watcher_started_flag = 1;
you.chen6c2dd9c2022-05-16 17:55:28 +0800203 }
204
qs.xiong9fbf74e2023-03-28 13:38:22 +0800205 if ( 0 == wpa_ctrl_pending(lynq_wpa_ctrl))
206 {
you.chen35020192022-05-06 11:30:57 +0800207 usleep(100*1000);
208 continue;
209 }
you.chen6c2dd9c2022-05-16 17:55:28 +0800210 memset(msg_notify, 0, MAX_RET);
211 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800212 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
213 {
you.chen35020192022-05-06 11:30:57 +0800214 msg_notify[len+1] = '\0';
qs.xiong455c30b2023-04-12 11:40:02 +0800215 RLOGD("APWatcherThreadProc ap------> %s\n", msg_notify);
you.chen0f5c6432022-11-07 18:31:14 +0800216//you.chen change for tv-box start
qs.xiong9fbf74e2023-03-28 13:38:22 +0800217 if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
218 {
you.chen0f5c6432022-11-07 18:31:14 +0800219 if (g_ap_callback_func != NULL)
220 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_DISCONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800221 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
222 {
223 RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
224 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
225 {
you.chen0f5c6432022-11-07 18:31:14 +0800226 stopGBW();
227 }
228 }
you.chen35020192022-05-06 11:30:57 +0800229 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800230 else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
231 {
you.chen0f5c6432022-11-07 18:31:14 +0800232 if (g_ap_callback_func != NULL)
233 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_CONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800234 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
235 {
236 RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
237 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
238 {
you.chen0f5c6432022-11-07 18:31:14 +0800239 startGBW();
240 }
241 }
you.chen35020192022-05-06 11:30:57 +0800242 }
you.chen0f5c6432022-11-07 18:31:14 +0800243//you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +0800244 } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
245 } // end while (g_ap_watcher_stop_flag == 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800246 if (lynq_wpa_ctrl != NULL)
247 {
you.chen92fd5d32022-05-25 10:09:47 +0800248 wpa_ctrl_detach(lynq_wpa_ctrl);
249 wpa_ctrl_close(lynq_wpa_ctrl);
250 }
qs.xiong97fa59b2022-04-07 05:41:29 -0400251}
252
qs.xiong455c30b2023-04-12 11:40:02 +0800253void get_state_error(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error)
254{
255 char *pReason;
256 *error = LYNQ_WAIT_CONNECT_ACTIVE;
257 if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
258 {
259 *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
260 RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d\n",*state,*error);
261 return;
262 }
263
264 if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
265 {
266 *state = LYNQ_WIFI_STA_STATUS_CONNECT;
267 RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
268 return;
269 }
270
271 if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
272 {
273 pReason = strstr(modify, "reason=");
274 if (pReason != NULL)
275 {
276 pReason += strlen("reason=");
277 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
278 {
279 *error = LYNQ_TIME_OUT;
280 }
281 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
282 {
283 *error = LYNQ_PSW_ERROR;
284 }
285 else
286 {
287 *error = LYNQ_UNSPECIFIED_REASON;
288 }
289 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
290 RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d\n",*state,*error);
291 return;
292 }
293 else
294 {
295 *error = LYNQ_UNSPECIFIED_REASON;
296 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
297 return;
298 }
299
300 }
301
302 if (strstr(modify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
303 {
304 *error = LYNQ_NOT_FIND_AP;
305 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
306 RLOGD("CTRL-EVENT-NETWORK-NOT-FOUND state:%d,error:%d\n",*state,*error);
307 return;
308 }
309
310
311 if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
312 {
313 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
314 pReason = strstr(modify, "status_code=");
315 if (pReason != NULL)
316 {
317 pReason += strlen("status_code=");
318 if (memcmp(pReason, "17", 2) == 0)
319 {
320 *error = LYNQ_AP_UNABLE_HANDLE;
321 }
322 else if (memcmp(pReason, "1",1) == 0)
323 {
324 *error = LYNQ_UNSPECIFIED_REASON;
325 }
326 else
327 {
328 *error = LYNQ_UNSPECIFIED_REASON;
329 }
330
331 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
332 RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d\n",*state,*error);
333 return;
334 }
335 else
336 {
337 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
338 *error = LYNQ_UNSPECIFIED_REASON;
339 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
340 RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d\n",*state,*error);
341 return;
342 }
343 }
344
345 if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
346 {
347 RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
348 *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
349 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
350 RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d\n",*state,*error);
351 return;
352 }
353
354 if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
355 {
356 RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
357 *error = LYNQ_WAIT_CONNECT_ACTIVE;
358 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
359 RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
360 return;
361 }
362
363 *error = LYNQ_UNSPECIFIED_REASON;
364 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
365 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
366 return;
367
368}
369
you.chen35020192022-05-06 11:30:57 +0800370static void STAWatcherThreadProc() {
371 size_t len = MAX_RET;
372 char msg_notify[MAX_RET];
you.chen35020192022-05-06 11:30:57 +0800373 error_number_s error;
qs.xiong455c30b2023-04-12 11:40:02 +0800374 lynq_wifi_sta_status_s state;
qs.xiongf1b525b2022-03-31 00:58:23 -0400375
you.chen6c2dd9c2022-05-16 17:55:28 +0800376 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800377 g_sta_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800378
qs.xiong9fbf74e2023-03-28 13:38:22 +0800379 while (g_sta_watcher_stop_flag == 0)
380 {
381 if (lynq_wpa_ctrl == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800382 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800383 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[CTRL_STA]);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800384 if (lynq_wpa_ctrl == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800385 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800386 usleep(100*1000);
387 continue;
388 }
389
390 wpa_ctrl_attach(lynq_wpa_ctrl);
you.chena6fa5b22022-05-18 10:28:19 +0800391 g_sta_watcher_started_flag = 1;
you.chen6c2dd9c2022-05-16 17:55:28 +0800392 }
393
qs.xiong9fbf74e2023-03-28 13:38:22 +0800394 if ( 0 == wpa_ctrl_pending(lynq_wpa_ctrl))
qs.xiong455c30b2023-04-12 11:40:02 +0800395 {
you.chen35020192022-05-06 11:30:57 +0800396 usleep(100*1000);
397 continue;
398 }
you.chen6c2dd9c2022-05-16 17:55:28 +0800399 memset(msg_notify, 0, MAX_RET);
400 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800401 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiong455c30b2023-04-12 11:40:02 +0800402 {
you.chen35020192022-05-06 11:30:57 +0800403 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800404 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
405 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800406 {
you.chen35020192022-05-06 11:30:57 +0800407 g_sta_scan_finish_flag = 1;
408 }
409
qs.xiong9fbf74e2023-03-28 13:38:22 +0800410 if (g_sta_callback_func == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800411 {
you.chen35020192022-05-06 11:30:57 +0800412 continue;
413 }
qs.xiong455c30b2023-04-12 11:40:02 +0800414 get_state_error(msg_notify,&state,&error);
415 g_sta_callback_func(g_sta_callback_priv, state, error);
416
you.chen35020192022-05-06 11:30:57 +0800417 }
418 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800419 if (lynq_wpa_ctrl != NULL)
420 {
you.chen92fd5d32022-05-25 10:09:47 +0800421 wpa_ctrl_detach(lynq_wpa_ctrl);
422 wpa_ctrl_close(lynq_wpa_ctrl);
423 }
qs.xiongf1b525b2022-03-31 00:58:23 -0400424}
425
qs.xiong1af5daf2022-03-14 09:12:12 -0400426int lynq_wifi_enable(void)
427{
you.chen35020192022-05-06 11:30:57 +0800428 int ret = 0;
you.chen6c2dd9c2022-05-16 17:55:28 +0800429 int i;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800430 RLOGD("enter lynq_wifi_enable");
you.chend2fef3f2023-02-13 10:50:35 +0800431 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
432
qs.xiong9fbf74e2023-03-28 13:38:22 +0800433 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
434 {
you.chend2fef3f2023-02-13 10:50:35 +0800435 goto out_enable;
436 }
437
you.chen35020192022-05-06 11:30:57 +0800438 const char * cmd_check_service =
439 "state=`systemctl is-active wg870_drv_insmod.service`\n"
440 "[ \"\"$state == \"active\" ] && exit 0\n"
441 "[ \"\"$state == \"inactive\" ] && systemctl start wg870_drv_insmod.service\n";
442// if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL) {
443// return 0;
444// }
qs.xiong1af5daf2022-03-14 09:12:12 -0400445
you.chen35020192022-05-06 11:30:57 +0800446 ret = system(cmd_check_service);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800447 if (ret != 0)
448 {
449 //printf("service state %d\n", ret);
450 RLOGE("[wifi error]service state %d",ret);
you.chend2fef3f2023-02-13 10:50:35 +0800451 ret = -1;
452 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800453 }
lhfe8da902022-10-11 18:55:36 +0800454
qs.xiong9fbf74e2023-03-28 13:38:22 +0800455 RLOGD("check service state is OK");
456 for (i=0; i<10; i++)
457 {
you.chena6fa5b22022-05-18 10:28:19 +0800458 if (system("connmanctl technologies | grep -q \"/net/connman/technology/wifi\"") == 0) {
you.chen6c2dd9c2022-05-16 17:55:28 +0800459 break;
460 }
461 usleep(300*1000);
462 }
463
qs.xiong9fbf74e2023-03-28 13:38:22 +0800464 if (i >= 10)
465 {
466 RLOGE("[wifi error] check connman technologies no wifi");
you.chend2fef3f2023-02-13 10:50:35 +0800467 ret = -1;
468 goto out_enable;
you.chen6c2dd9c2022-05-16 17:55:28 +0800469 }
470
you.chen9f17e4d2022-06-06 17:18:18 +0800471 //@todo delete add temp check for socket avilable start (20220606)
472 for (i=0; i<60; i++)
473 {
474 if (system("netstat -an | grep -q DGRAM") == 0) {
475 break;
476 }
477 sleep(1);
478 }
479
480 if (i >= 60)
481 {
you.chend2fef3f2023-02-13 10:50:35 +0800482 ret = -1;
483 goto out_enable;
you.chen9f17e4d2022-06-06 17:18:18 +0800484 }
485 //@todo delete add temp check for socket avilable end (20220606)
486
qs.xiong9fbf74e2023-03-28 13:38:22 +0800487 if (0 != system("ifconfig | grep -q ap0"))
488 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800489 system("connmanctl enable wifi");
you.chena6fa5b22022-05-18 10:28:19 +0800490 usleep(300*1000);
you.chen01bfac32022-06-07 10:36:00 +0800491 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disconnect");
you.chen6c2dd9c2022-05-16 17:55:28 +0800492 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 DRIVER interface_create ap0");
you.chena6fa5b22022-05-18 10:28:19 +0800493 usleep(300*1000);
you.chen6c2dd9c2022-05-16 17:55:28 +0800494 system("connmanctl tether wifi on lynq 1qaz@WSX#$%^");
you.chena6fa5b22022-05-18 10:28:19 +0800495 usleep(300*1000);
you.chen01bfac32022-06-07 10:36:00 +0800496 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=ap0 disconnect");
you.chen6c2dd9c2022-05-16 17:55:28 +0800497 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800498 if (g_ap_watcher_pid == 0 )
qs.xiong55f32762023-02-16 15:59:45 +0800499 {
you.chen35020192022-05-06 11:30:57 +0800500 ret=pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800501 if(ret<0)
502 {
503 RLOGE("[wifi error]creat APWatcherThreadProc fail");
you.chend2fef3f2023-02-13 10:50:35 +0800504 ret = -1;
505 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800506 }
507 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800508
509 RLOGD("creat APWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +0800510 if (g_sta_watcher_pid == 0 ) {
511 ret=pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800512 if(ret<0)
513 {
514 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
you.chend2fef3f2023-02-13 10:50:35 +0800515 ret = -1;
516 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800517 }
518 }
519
qs.xiong9fbf74e2023-03-28 13:38:22 +0800520 RLOGD("creat STAWatcherTheradProc susccs");
521 for (i=0; i<10; i++)
522 {
you.chena6fa5b22022-05-18 10:28:19 +0800523 usleep(300*1000);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800524 if (g_ap_watcher_started_flag == 1 && g_sta_watcher_started_flag == 1)
525 {
you.chena6fa5b22022-05-18 10:28:19 +0800526 break;
527 }
528 }
529
you.chend2fef3f2023-02-13 10:50:35 +0800530 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
531 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
532 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
533 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
534out_enable:
535 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800536 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500537}
538
qs.xiong1af5daf2022-03-14 09:12:12 -0400539int lynq_wifi_disable(void)
540{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800541 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800542 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800543 g_ap_watcher_stop_flag = 1;
544 g_sta_watcher_stop_flag = 1;
545 if (g_ap_watcher_pid != 0)
546 pthread_join(g_ap_watcher_pid, NULL);
547 if (g_sta_watcher_pid != 0)
548 pthread_join(g_sta_watcher_pid, NULL);
549 if (g_lynq_wpa_ctrl[0] != NULL)
550 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
551 if (g_lynq_wpa_ctrl[1] != NULL)
552 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
553 g_ap_watcher_pid = 0;
554 g_sta_watcher_pid = 0;
555 g_lynq_wpa_ctrl[0] = NULL;
556 g_lynq_wpa_ctrl[1] = NULL;
557 system("systemctl stop wg870_drv_insmod.service");
you.chend2fef3f2023-02-13 10:50:35 +0800558 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
559 return 0;
560}
561
562static inline char inner_convert_char(char in)
563{
564 if (in >= '0' && in <= '9')
565 {
566 return in - '0';
567 }
568 else if (in >= 'a' && in <= 'f')
569 {
570 return in - 'a' + 10;
571 }
572 else if (in >= 'A' && in <= 'F')
573 {
574 return in - 'A' + 10;
575 }
576 else
577 {
578 return '\xff';
579 }
580}
581
582static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
583{
584 char *p;
585 size_t pos = 0;
586 if (NULL == out_ssid)
587 return;
588 //printf("input ssid=[%s]\n", ssid);
589 memset(out_ssid, 0, out_ssid_len);
590 if (NULL == ssid)
591 return;
592 p = strchr(ssid, '\\');
593 if (NULL == p)
594 {
595 strncpy(out_ssid, ssid, out_ssid_len);
596 //printf(" first %s\n", out_ssid);
597 }
598 else
599 {
600 pos = p - ssid;
601 memcpy(out_ssid, ssid, pos);
602 //printf("pos %lu -- %s\n", pos, out_ssid);
603 for(; pos < out_ssid_len; pos ++)
604 {
605 if (p[0] == '\0')
606 {
607 //printf(" out %s\n", out_ssid);
608 return;
609 }
610 else if (p[0] != '\\')
611 {
612 out_ssid[pos] = p[0];
613 p += 1;
614 }
615 else if (p[1] == 'x' || p[1] == 'X')
616 {
617 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
618 p += 4;
619 }
620 else if (p[1] == '\\')
621 {
622 out_ssid[pos] = '\\';
623 p += 2;
624 }
625 else if (p[1] == 't')
626 {
627 out_ssid[pos] = '\t';
628 p += 2;
629 }
630 else if (p[1] == 'r')
631 {
632 out_ssid[pos] = '\r';
633 p += 2;
634 }
635 else if (p[1] == 'n')
636 {
637 out_ssid[pos] = '\n';
638 p += 2;
639 }//todo find a better way to convert?
640 }
641 }
642 //printf(" out %s\n", out_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -0500643}
qs.xiong1af5daf2022-03-14 09:12:12 -0400644
you.chen35020192022-05-06 11:30:57 +0800645static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +0800646 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +0800647 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +0800648 RLOGD("enter inner_get_param");
649 if (out_put == NULL)
650 {
651 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +0800652 return -1;
653 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800654 if (param_name == NULL)
655 {
656 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +0800657 return -1;
658 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800659 if (param_name[0] == '\0')
660 {
661 RLOGE("param is empty");
you.chen35020192022-05-06 11:30:57 +0800662 return -1;
663 }
664
665 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
666
667 CHECK_WPA_CTRL(interface);
668
669 DO_REQUEST(lynq_cmd_get);
670
qs.xiong9fbf74e2023-03-28 13:38:22 +0800671 if (memcmp(cmd_reply, "FAIL", 4) == 0)
672 {
673 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +0800674 return -1;
675 }
676
you.chena6fa5b22022-05-18 10:28:19 +0800677// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +0800678 if (strcmp(param_name, "ssid") == 0)
679 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800680 if (cmd_reply[0] == '\"')
681 {
you.chend2fef3f2023-02-13 10:50:35 +0800682 ssid_len = reply_len - 1;
683 memcpy(out_put, cmd_reply + 1, ssid_len);
684 if (out_put[ssid_len-1] == '\"')
685 {
686 out_put[ssid_len-1] = '\0';
687 }
688 else
689 {
690 out_put[ssid_len] = '\0';
691 }
692 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800693 else
694 {
you.chend2fef3f2023-02-13 10:50:35 +0800695 ssid_len = reply_len / 2;
696 for(i=0; i<ssid_len; i++)
697 {
698 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
699 }
700 out_put[ssid_len] = '\0';
701 }
702 }
703 else
704 {
705 memcpy(out_put, cmd_reply, reply_len + 1);
706 }
you.chen35020192022-05-06 11:30:57 +0800707 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -0500708}
qs.xiong1af5daf2022-03-14 09:12:12 -0400709
you.chen35020192022-05-06 11:30:57 +0800710static int lynq_split(char * str, int len, char delimiter, char * results[]) {
711 int ret = 0;
712 char * end = str + len - 1;
713 results[ret++] = str;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800714 while(str < end)
715 {
716 if (*str == delimiter)
717 {
you.chen35020192022-05-06 11:30:57 +0800718 *str++ = '\0';
719 results[ret++] = str;
720 continue;
721 }
722 str++;
723 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800724 if (*str == delimiter)
725 {
you.chen35020192022-05-06 11:30:57 +0800726 *str = '\0';
727 }
qs.xiong1af5daf2022-03-14 09:12:12 -0400728
you.chen35020192022-05-06 11:30:57 +0800729 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500730}
731
you.chend2fef3f2023-02-13 10:50:35 +0800732static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
733{
734 char * p;
735 int ret = 0;
736 char cmd[256]={0};
737 if (NULL == mac || NULL == ip)
you.chen35020192022-05-06 11:30:57 +0800738 return -1;
you.chend2fef3f2023-02-13 10:50:35 +0800739 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +0800740 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-02-13 10:50:35 +0800741 ret = exec_cmd(cmd, ip, ip_len);
742 p = strchr(ip, '\n');
743 if (NULL != p)
744 {
745 *p = '\0';
you.chen35020192022-05-06 11:30:57 +0800746 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800747 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +0800748 return ret;
749}
750
you.chend2fef3f2023-02-13 10:50:35 +0800751static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +0800752 struct in_addr addr ={0};
753 struct hostent *ht;
754
qs.xiong9fbf74e2023-03-28 13:38:22 +0800755 if (ip == NULL || *ip == '\0' || hostname == NULL)
756 {
757 RLOGE("ip == NULL or hostname == NULL");
758 return -1;
you.chen35020192022-05-06 11:30:57 +0800759 }
760
you.chend2fef3f2023-02-13 10:50:35 +0800761 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800762 if (inet_aton(ip, &addr) == 0)
763 {
you.chen35020192022-05-06 11:30:57 +0800764 printf("---inet_aton fail\n");
765 return -1;
766 }
767
768 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
769
qs.xiong9fbf74e2023-03-28 13:38:22 +0800770 if (ht == NULL)
771 {
772 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-05-06 11:30:57 +0800773 herror(NULL);
774 return -1;
775 }
776
777 strcpy(hostname, ht->h_name);
778
779 return 0;
780}
781
782static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
783{
784 int count, index, words_count;
785 char * split_lines[128]= {0};
786 char * split_words[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +0800787 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +0800788 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +0800789 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-05-06 11:30:57 +0800790
791 CHECK_WPA_CTRL(ap_sta);
792
793 DO_REQUEST(lynq_wifi_list_networks);
794
795 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
796
797 //@todo check ssid field to compatible
798
799 ret = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800800 for(index=1; index < count; index++)
801 {
you.chen35020192022-05-06 11:30:57 +0800802 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800803 if (words_count > 2)
804 {
you.chend2fef3f2023-02-13 10:50:35 +0800805 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +0800806 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
807 {
you.chen35020192022-05-06 11:30:57 +0800808 net_no_list[ret++] = atoi(split_words[0]);
809 }
810 }
811 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800812 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +0800813 return ret;
814}
815
816static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +0800817 size_t i=0;
you.chen35020192022-05-06 11:30:57 +0800818 CHECK_WPA_CTRL(ap_sta);
819 const char *lynq_wifi_add_network = "ADD_NETWORK";
820
qs.xiong9fbf74e2023-03-28 13:38:22 +0800821 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +0800822 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800823 if (memcmp(cmd_reply, "FAIL", 4) == 0)
824 {
825 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen35020192022-05-06 11:30:57 +0800826 return -1;
827 }
828
qs.xiong9fbf74e2023-03-28 13:38:22 +0800829 for(i=0;i<reply_len;i++)
830 {
831 if(cmd_reply[i] == '\n')
832 {
you.chen35020192022-05-06 11:30:57 +0800833 cmd_reply[i] = '\0';
834 break;
835 }
836 }
837 return atoi(cmd_reply);
838}
you.chena6cd55a2022-05-08 12:20:18 +0800839
you.chen35020192022-05-06 11:30:57 +0800840static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
841{
842 int count, index;
843 int net_no_list[128];
844
qs.xiong9fbf74e2023-03-28 13:38:22 +0800845 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +0800846 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800847 for (index=0; index < count; index++)
848 {
849 if (net_no_list[index] == net_no)
850 {
you.chen35020192022-05-06 11:30:57 +0800851 return 0;
852 }
853 }
854
855 if (count >= 1)
856 index = net_no_list[count - 1];
857 else
858 index = -1;
859
qs.xiong9fbf74e2023-03-28 13:38:22 +0800860 while (index < net_no )
861 {
you.chen35020192022-05-06 11:30:57 +0800862 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800863 if (index >= net_no)
864 { // required network no created
865 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +0800866 return 0;
867 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800868 else if( index < 0)
869 {
870 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +0800871 return -1;
872 }
you.chen35020192022-05-06 11:30:57 +0800873 }
874
875 if (index < 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800876 {
877 RLOGE("[lynq_check_network_number] network index < 0");
878 return -1;
879 }
880 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen35020192022-05-06 11:30:57 +0800881 return 0;
882}
883
884static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +0800885 if (freq > 5000 && freq < 6000)
886 {
you.chen35020192022-05-06 11:30:57 +0800887 return LYNQ_WIFI_5G_band;
888 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800889 else if (freq > 2000 && freq < 3000)
890 {
you.chen35020192022-05-06 11:30:57 +0800891 return LYNQ_WIFI_2G_band;
892 }
893 return LYNQ_WIFI_2_and_5G_band;
894}
895
896static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800897 if (key_mgmt != NULL)
898 {
899 if (memcmp( key_mgmt, "NONE", 4) == 0)
900 {
you.chen35020192022-05-06 11:30:57 +0800901 return LYNQ_WIFI_AUTH_OPEN;
902 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800903 else if (memcmp( key_mgmt, "WEP", 3) == 0)
904 {
you.chen35020192022-05-06 11:30:57 +0800905 return LYNQ_WIFI_AUTH_WEP;
906 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800907 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
908 {
you.chen35020192022-05-06 11:30:57 +0800909 return LYNQ_WIFI_AUTH_WPA_PSK;
910 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800911 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
912 {
you.chen35020192022-05-06 11:30:57 +0800913 return LYNQ_WIFI_AUTH_WPA2_PSK;
914 }
915 }
916
917 return -1;
918}
919
920static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800921 if (flag != NULL)
922 {
qs.xiong3e506812023-04-06 11:08:48 +0800923 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
924 {
925 return LYNQ_WIFI_AUTH_WPA3_PSK;
926 }else if ( strstr( flag,"SAE-CCMP") != NULL )
927 {
928 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
929 }else if (strstr( flag, "WPA2-PSK") != NULL)
930 {
you.chen35020192022-05-06 11:30:57 +0800931 return LYNQ_WIFI_AUTH_WPA2_PSK;
932 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800933 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +0800934 {
you.chen35020192022-05-06 11:30:57 +0800935 return LYNQ_WIFI_AUTH_WPA_PSK;
936 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800937 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +0800938 {
you.chen35020192022-05-06 11:30:57 +0800939 return LYNQ_WIFI_AUTH_WEP;
940 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800941 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +0800942 {
you.chen35020192022-05-06 11:30:57 +0800943 return LYNQ_WIFI_AUTH_OPEN;
944 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800945 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +0800946 {
you.chend2fef3f2023-02-13 10:50:35 +0800947 return LYNQ_WIFI_AUTH_OPEN;
948 }
you.chen35020192022-05-06 11:30:57 +0800949 }
950
951 return -1;
952}
953
954static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
955 switch (bw) {
956 case 10:
957 return LYNQ_WIFI_BANDWIDTH_HT10;
958 break;
959 case 20:
960 return LYNQ_WIFI_BANDWIDTH_HT20;
961 break;
962 case 40:
963 return LYNQ_WIFI_BANDWIDTH_HT40;
964 break;
965 case 80:
966 return LYNQ_WIFI_BANDWIDTH_HT80;
967 break;
968 default:
969 break;
970 }
971
972 return -1;
973}
974
975static int inner_get_status_info(int interface, curr_status_info *curr_state) {
976 int i, count;
977 char *p;
978 const char *lynq_status_cmd = "STATUS";
979 const char * FLAG_SSID = "ssid=";
980 const char * FLAG_SBSID = "bssid=";
981 const char * FLAG_KEY_MGMT = "key_mgmt=";
982 const char * FLAG_FREQ = "freq=";
983 const char * FLAG_STATE = "wpa_state=";
984 const char * FLAG_ID = "id=";
you.chend2fef3f2023-02-13 10:50:35 +0800985 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +0800986 char *split_lines[128] = {0};
987
988 CHECK_WPA_CTRL(interface);
989
qs.xiong9fbf74e2023-03-28 13:38:22 +0800990 if (curr_state == NULL)
991 {
992 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-05-06 11:30:57 +0800993 return -1;
994 }
995
996 DO_REQUEST(lynq_status_cmd);
997
998 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
999
1000 curr_state->net_no = -1;
1001 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001002 for(i=0; i < count; i++)
1003 {
1004 if (curr_state->ap != NULL)
1005 {
you.chen35020192022-05-06 11:30:57 +08001006 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001007 if (p != NULL)
1008 {
you.chend2fef3f2023-02-13 10:50:35 +08001009 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +08001010 ret = 0;
1011 continue;
1012 }
you.chenf58b3c92022-06-21 16:53:48 +08001013 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001014 if (p != NULL)
1015 {
you.chend2fef3f2023-02-13 10:50:35 +08001016 inner_copy_ssid(curr_state->ap->ap_ssid, p + strlen(FLAG_SSID), sizeof (curr_state->ap->ap_ssid));
you.chenf58b3c92022-06-21 16:53:48 +08001017 ret = 0;
1018 continue;
1019 }
you.chen35020192022-05-06 11:30:57 +08001020 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001021 if (p != NULL)
1022 {
you.chen450d0172022-07-15 17:56:48 +08001023 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001024 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +08001025 ret = 0;
1026 continue;
1027 }
1028 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001029 if (p != NULL)
1030 {
you.chen35020192022-05-06 11:30:57 +08001031 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1032 ret = 0;
1033 continue;
1034 }
you.chend2fef3f2023-02-13 10:50:35 +08001035 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001036 if (p != NULL)
1037 {
you.chend2fef3f2023-02-13 10:50:35 +08001038 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1039 ret = 0;
1040 continue;
1041 }
you.chen35020192022-05-06 11:30:57 +08001042 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001043 if (curr_state->state != NULL)
1044 {
you.chen35020192022-05-06 11:30:57 +08001045 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001046 if (p != NULL)
1047 {
you.chen35020192022-05-06 11:30:57 +08001048 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1049 ret = 0;
1050 continue;
1051 }
1052
1053 } //end else if (state != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001054 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
1055 {
you.chen35020192022-05-06 11:30:57 +08001056 ret = 0;
you.chen450d0172022-07-15 17:56:48 +08001057 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001058 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +08001059 }
1060 }
1061
1062 return ret;
1063}
1064
1065
qs.xiongf1b525b2022-03-31 00:58:23 -04001066int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001067{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001068 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +08001069 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -05001070
qs.xiong9fbf74e2023-03-28 13:38:22 +08001071 if (ap_ssid == NULL)
1072 {
1073 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +08001074 return -1;
1075 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001076 else
1077 {
1078 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen35020192022-05-06 11:30:57 +08001079 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001080
qs.xiong9fbf74e2023-03-28 13:38:22 +08001081 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1082 {
1083 RLOGE("Do check ap network_number fail");
you.chen35020192022-05-06 11:30:57 +08001084 return -1;
1085 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001086
you.chen35020192022-05-06 11:30:57 +08001087 CHECK_IDX(idx, CTRL_AP);
1088
1089 CHECK_WPA_CTRL(CTRL_AP);
1090
1091 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1092
1093 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1094 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001095 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1096 return 0;
you.chen35020192022-05-06 11:30:57 +08001097
qs.xiong7a105ce2022-03-02 09:43:11 -05001098}
1099
you.chen35020192022-05-06 11:30:57 +08001100int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001101{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001102 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001103 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001104 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001105}
1106
qs.xiongc9c79f72022-10-17 15:27:18 +08001107/*****
1108 *frequency <------>channel
1109 *
1110 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1111 *
1112 *
1113 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1114 *
1115 *
1116 * */
1117static int lynq_check_set_frequency(int input_frequency){
qs.xiongc00b6032022-11-29 16:28:03 +08001118 int legitimate_frequency[]={2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825};
1119 int i;
1120 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1121
qs.xiong69a332b2022-12-02 09:58:57 +08001122 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001123 {
1124 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001125 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001126 }
qs.xiongc00b6032022-11-29 16:28:03 +08001127
1128 if(i == arr_len)
1129 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001130 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001131 return -1;
1132 }
qs.xiongc00b6032022-11-29 16:28:03 +08001133
qs.xiongc9c79f72022-10-17 15:27:18 +08001134 return 0;
1135}
qs.xiong13673462023-02-21 19:12:54 +08001136
1137static int lynq_check_frequencyby_country_code(int input_frequency)
1138{
1139 char str_cnc[]="CN";
1140 char str_dest[20]="";
1141
1142 if( lynq_get_country_code(1,str_dest) != 0 )
1143 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001144 RLOGE("get country_code error\n");
qs.xiong13673462023-02-21 19:12:54 +08001145 return -1;
1146 }
1147 if( strncmp(str_dest,str_cnc,2) != 0 )
1148 {
1149 return 0;
1150 }else if( 2473 < input_frequency && input_frequency < 5744)
1151 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001152 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001153 return -1;
1154 }
1155 return 0;
1156}
qs.xiongf1b525b2022-03-31 00:58:23 -04001157int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001158{
qs.xiongc00b6032022-11-29 16:28:03 +08001159 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001160 char lynq_wifi_frequency_cmd[128]={0};
1161 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001162 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001163 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001164 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001165 check = lynq_check_set_frequency(lynq_wifi_frequency);
1166 if(check != 0)
1167 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001168 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001169 return -1;
you.chen35020192022-05-06 11:30:57 +08001170 }
qs.xiong13673462023-02-21 19:12:54 +08001171 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1172 if(check != 0)
1173 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001174 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001175 return -1;
1176 }
1177
qs.xiongc00b6032022-11-29 16:28:03 +08001178 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1179 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001180 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001181 return -1;
1182 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001183
you.chen35020192022-05-06 11:30:57 +08001184 CHECK_IDX(idx, CTRL_AP);
1185
1186 CHECK_WPA_CTRL(CTRL_AP);
1187
1188 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1189 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1190 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1191
you.chen6c2dd9c2022-05-16 17:55:28 +08001192 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-05-06 11:30:57 +08001193 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1194 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1195 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001196
qs.xiong9fbf74e2023-03-28 13:38:22 +08001197 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001198}
1199
qs.xiongf1b525b2022-03-31 00:58:23 -04001200int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001201{
you.chen35020192022-05-06 11:30:57 +08001202 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001203 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001204 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001205
qs.xiong9fbf74e2023-03-28 13:38:22 +08001206 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1207 {
1208 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen35020192022-05-06 11:30:57 +08001209 return -1;
1210 }
1211 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001212
qs.xiong9fbf74e2023-03-28 13:38:22 +08001213 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001214}
1215
qs.xiongf1b525b2022-03-31 00:58:23 -04001216int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1217{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001218 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001219 CHECK_IDX(idx, CTRL_AP);
1220 switch(bandwidth){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001221 case LYNQ_WIFI_BANDWIDTH_HT10:
1222 {
1223 RLOGE("bandwith [%d] not support now\n", bandwidth);
1224 return -1;
1225 }
1226 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen35020192022-05-06 11:30:57 +08001227 {
1228 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1229 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001230 if (system(lynq_cmd_bandwith) != 0 )
1231 {
1232 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001233 return -1;
1234 }
1235 system("wl up");
1236 break;
1237 }
1238 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001239 {
qs.xiong10379192023-02-21 13:19:42 +08001240 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001241 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1242 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001243 if (system(lynq_cmd_bandwith) != 0 )
1244 {
1245 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001246 return -1;
1247 }
1248 system("wl up");
1249 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001250 }
you.chen35020192022-05-06 11:30:57 +08001251 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001252 {
qs.xiong10379192023-02-21 13:19:42 +08001253 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001254 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001255 if (system(lynq_cmd_bandwith) != 0 )
1256 {
1257 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001258 return -1;
1259 }
1260 system("wl up");
1261 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001262 }
1263 default:
you.chen35020192022-05-06 11:30:57 +08001264 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001265 RLOGE("auth type [%d] not support now\n", bandwidth);
1266 return -1;
you.chen35020192022-05-06 11:30:57 +08001267 }
1268 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001269
1270
you.chen35020192022-05-06 11:30:57 +08001271 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001272}
you.chen35020192022-05-06 11:30:57 +08001273
qs.xiongf1b525b2022-03-31 00:58:23 -04001274int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1275{
you.chen35020192022-05-06 11:30:57 +08001276 int count = 0;
1277 int index = 0;
1278 char *split_words[128] = {0};
1279 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001280 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001281 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001282
you.chen35020192022-05-06 11:30:57 +08001283 CHECK_WPA_CTRL(CTRL_AP);
1284
1285 DO_REQUEST(lynq_chanspec_cmd);
1286
1287 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1288 for(;index < count; index++) {
1289 if (strncmp(split_words[index], "bw", 2) != 0) {
1290 continue;
1291 }
1292
1293 index++;
1294 if (index >= count) {
1295 return -1;
1296 }
1297
qs.xiong9fbf74e2023-03-28 13:38:22 +08001298 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001299 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1300 return 0;
1301 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001302 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001303 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001304}
qs.xiong0fb469a2022-04-14 03:50:45 -04001305
qs.xiongf1b525b2022-03-31 00:58:23 -04001306int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001307{
you.chen35020192022-05-06 11:30:57 +08001308 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001309 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001310 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001311
you.chen35020192022-05-06 11:30:57 +08001312 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001313
qs.xiong9fbf74e2023-03-28 13:38:22 +08001314 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1315 {
you.chen35020192022-05-06 11:30:57 +08001316 return -1;
1317 }
1318
1319 system("wl down");
1320 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001321 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001322 return -1;
1323 }
1324 system("wl up");
1325 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001326}
qs.xiong0fb469a2022-04-14 03:50:45 -04001327
qs.xiongf1b525b2022-03-31 00:58:23 -04001328int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001329{
you.chen35020192022-05-06 11:30:57 +08001330 int count = 0;
1331 int index = 0;
1332 char *split_words[128] = {0};
1333 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001334 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001335 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001336
you.chen35020192022-05-06 11:30:57 +08001337 CHECK_WPA_CTRL(CTRL_AP);
1338
1339 DO_REQUEST(lynq_chanspec_cmd);
1340
1341 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001342 for(;index < count; index++)
1343 {
1344 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001345 if (strncmp(split_words[index], "channel", 2) != 0) {
1346 continue;
1347 }
1348
1349 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001350 if (index >= count)
1351 {
you.chen35020192022-05-06 11:30:57 +08001352 return -1;
1353 }
1354
1355 *channel = atoi(split_words[index]);
1356 return 0;
1357 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001358 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001359 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001360}
1361
1362
you.chen35020192022-05-06 11:30:57 +08001363int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001364{
you.chen6c2dd9c2022-05-16 17:55:28 +08001365 char ssid[MAX_CMD] = {0};
1366 int freq = 0;
1367 char lynq_auth_cmd[64]={0};
1368 char lynq_auth_alg_cmd[64]={0};
1369 char lynq_psk_cmd[64]={0};
1370 char lynq_pairwise_cmd[64]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001371 char lynq_ieee80211_cmd[64]={0};
1372 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001373 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001374 CHECK_IDX(idx, CTRL_AP);
1375
you.chen6c2dd9c2022-05-16 17:55:28 +08001376 CHECK_WPA_CTRL(CTRL_AP);
1377
qs.xiong9fbf74e2023-03-28 13:38:22 +08001378 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1379 {
1380 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen35020192022-05-06 11:30:57 +08001381 return -1;
1382 }
1383
you.chen92fd5d32022-05-25 10:09:47 +08001384 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001385 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001386 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001387 return 0;
1388 }
1389 else {
1390 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1391 ssid[0] = '\0';
1392 }
1393 lynq_wifi_ap_frequency_get(idx, &freq);
1394
1395 DO_OK_FAIL_REQUEST(cmd_disconnect);
1396 DO_OK_FAIL_REQUEST(cmd_remove_all);
1397 if (ssid[0] != '\0') {
1398 lynq_wifi_ap_ssid_set(idx, ssid);
1399 }
1400 if (freq != 0) {
1401 lynq_wifi_ap_frequency_set(idx, freq);
1402 }
1403 }
1404 }
you.chen35020192022-05-06 11:30:57 +08001405
qs.xiong9fbf74e2023-03-28 13:38:22 +08001406 switch(auth){
1407 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001408 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001409 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001410 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001411 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001412 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001413 break;
1414 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001415 case LYNQ_WIFI_AUTH_WEP:
1416 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001417 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001418 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001419 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-05-16 17:55:28 +08001420 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1421
1422 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1423 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1424 break;
1425 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001426 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-03-29 17:36:14 +08001427 {
1428 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1429 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1430 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1431
1432 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1433 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1434 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1435 break;
1436
1437 }
you.chen35020192022-05-06 11:30:57 +08001438 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001439 {
1440 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1441 {
you.chen35020192022-05-06 11:30:57 +08001442 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1443 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1444 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001445 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1446 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001447 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001448 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001449 }
1450// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1451// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1452 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong7a105ce2022-03-02 09:43:11 -05001453
you.chen35020192022-05-06 11:30:57 +08001454 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1455 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1456 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001457 break;
1458 }
1459 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1460 {
1461 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1462 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1463 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1464 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1465
1466 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1467 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1468 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1469 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1470 break;
1471 }
1472 case LYNQ_WIFI_AUTH_WPA3_PSK:
1473 {
1474 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1475 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xiong3e506812023-04-06 11:08:48 +08001476 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001477 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1478
1479 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1480 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1481 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1482 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1483 break;
1484 }
1485 default:
you.chen35020192022-05-06 11:30:57 +08001486 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001487 RLOGE("auth type [%d] not support now\n", auth);
1488 return -1;
you.chen35020192022-05-06 11:30:57 +08001489 }
1490 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001491 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001492
qs.xiong9fbf74e2023-03-28 13:38:22 +08001493 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001494}
1495
you.chen35020192022-05-06 11:30:57 +08001496int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001497{
you.chen35020192022-05-06 11:30:57 +08001498 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001499 char lynq_auth_alg_str[MAX_RET] = {0};
1500 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001501 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001502 CHECK_IDX(idx, CTRL_AP);
1503
qs.xiong9fbf74e2023-03-28 13:38:22 +08001504 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1505 {
1506 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen35020192022-05-06 11:30:57 +08001507 return -1;
1508 }
1509
qs.xiong9fbf74e2023-03-28 13:38:22 +08001510 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1511 {
1512 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1513 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001514 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001515 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001516 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001517 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001518 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1519 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001520 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001521 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001522 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001523 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001524 else
1525 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001526 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001527 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001528 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001529 }
you.chen35020192022-05-06 11:30:57 +08001530 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001531 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1532 {
1533 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1534 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001535 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001536 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001537 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001538 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1539 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001540 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001541 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001542 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001543 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001544 else
1545 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001546 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001547 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001548 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001549 }
you.chen35020192022-05-06 11:30:57 +08001550 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001551
1552 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1553 {
1554 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1555 return -1;
1556 }
1557
1558 if (memcmp(lynq_auth_str,"1",1) == 0 )
1559 {
1560 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1561 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001562 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001563 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1564 {
1565 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1566 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001567 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001568 }
1569 else
1570 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001571 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001572 *auth = -1;
1573 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001574
you.chen6c2dd9c2022-05-16 17:55:28 +08001575 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001576}
qs.xiong1af5daf2022-03-14 09:12:12 -04001577
qs.xiong1af5daf2022-03-14 09:12:12 -04001578
qs.xiongf1b525b2022-03-31 00:58:23 -04001579int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001580{
you.chen35020192022-05-06 11:30:57 +08001581 char LYNQ_WIFI_CMD[128]={0};
1582 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1583 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001584 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001585 CHECK_IDX(idx, CTRL_AP);
1586
1587 CHECK_WPA_CTRL(CTRL_AP);
1588
1589// system("connmanctl enable wifi");
1590// system("connmanctl tether wifi on cy-test 12345678");
1591// system("ifconfig wlan0 down");
1592// system("ifconfig wlan0 up");
1593// system("ifconfig wlan0 up");
1594
1595 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1596 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1597
1598 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1599 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1600
qs.xiong9fbf74e2023-03-28 13:38:22 +08001601 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001602}
1603
qs.xiongf1b525b2022-03-31 00:58:23 -04001604int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001605{
you.chen35020192022-05-06 11:30:57 +08001606 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001607}
1608
qs.xiongf1b525b2022-03-31 00:58:23 -04001609int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001610{
you.chen35020192022-05-06 11:30:57 +08001611 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04001612
you.chen35020192022-05-06 11:30:57 +08001613 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001614
you.chen35020192022-05-06 11:30:57 +08001615 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001616
you.chen35020192022-05-06 11:30:57 +08001617 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
1618
1619 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1620
you.chenb4b121c2022-05-06 17:50:16 +08001621// system("connmanctl tether wifi off");
you.chen35020192022-05-06 11:30:57 +08001622
qs.xiong9fbf74e2023-03-28 13:38:22 +08001623 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001624}
qs.xiong1af5daf2022-03-14 09:12:12 -04001625
qs.xiongf1b525b2022-03-31 00:58:23 -04001626int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001627{
you.chen35020192022-05-06 11:30:57 +08001628 char lynq_disable_cmd[128] = {0};
1629 char lynq_select_cmd[128] = {0};
1630 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001631 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08001632 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001633
you.chen35020192022-05-06 11:30:57 +08001634 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08001635 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1636 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1637
1638 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1639 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
1640 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04001641
qs.xiong9fbf74e2023-03-28 13:38:22 +08001642 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001643}
1644
qs.xiongf1b525b2022-03-31 00:58:23 -04001645int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001646{
you.chen35020192022-05-06 11:30:57 +08001647 char lynq_disable_cmd[128] = {0};
1648 char lynq_select_cmd[128] = {0};
1649 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001650 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08001651 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001652
you.chen35020192022-05-06 11:30:57 +08001653 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001654
you.chen35020192022-05-06 11:30:57 +08001655 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1656 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1657
1658 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1659 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
1660 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05001661
qs.xiong9fbf74e2023-03-28 13:38:22 +08001662 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001663}
qs.xiongf1b525b2022-03-31 00:58:23 -04001664
you.chen35020192022-05-06 11:30:57 +08001665int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001666{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001667 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08001668 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001669 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001670 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001671 RLOGD("enter lynq_ap_password_set");
1672 if( password == NULL )
1673 {
1674 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08001675 return -1;
1676 }
1677 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08001678 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001679 if(pass_len < 8 || pass_len >= 64)
1680 {
1681 RLOGE("[lynq_ap_password_set]input password len not in rage");
1682 return -1;
you.chen35020192022-05-06 11:30:57 +08001683 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001684
you.chen35020192022-05-06 11:30:57 +08001685 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001686
qs.xiong9fbf74e2023-03-28 13:38:22 +08001687 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
1688 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001689 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001690 return -1;
1691 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001692 else if (auth == LYNQ_WIFI_AUTH_OPEN)
1693 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001694 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
1695 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001696 }
1697
you.chen35020192022-05-06 11:30:57 +08001698 CHECK_WPA_CTRL(CTRL_AP);
1699
qs.xiong9fbf74e2023-03-28 13:38:22 +08001700 if (auth == LYNQ_WIFI_AUTH_WEP)
1701 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001702 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001703 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
1704 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
1705 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1706 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
1707 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001708 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1709 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001710 RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA_PSK LYNQ_WIFI_AUTH_WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001711 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
1712 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1713 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001714 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
1715 {
1716
qs.xiongc8d92a62023-03-29 17:36:14 +08001717 RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA2_WPA3 LYNQ_WIFI_AUTH_WPA3_PSK\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001718 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08001719 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001720 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1721 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
1722
1723 }
1724 else
qs.xiongc8d92a62023-03-29 17:36:14 +08001725 {
1726 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001727 return -1;
1728 }
you.chen35020192022-05-06 11:30:57 +08001729
you.chen35020192022-05-06 11:30:57 +08001730 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04001731
qs.xiong9fbf74e2023-03-28 13:38:22 +08001732 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001733}
1734
you.chen35020192022-05-06 11:30:57 +08001735int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04001736{
you.chen35020192022-05-06 11:30:57 +08001737 FILE * fp;
1738 int len, ret;
1739 int count, index;
1740 char *split_lines[128] = {0};
1741 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001742 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04001743
you.chen35020192022-05-06 11:30:57 +08001744 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001745
you.chen35020192022-05-06 11:30:57 +08001746 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
1747// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001748 if (NULL == fp)
1749 {
1750 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08001751 return -1;
1752 }
qs.xiong97fa59b2022-04-07 05:41:29 -04001753
you.chen35020192022-05-06 11:30:57 +08001754 buff = alloca(MAX_RET);
1755 fseek(fp, 0, SEEK_SET);
1756 len = fread(buff, 1, MAX_RET, fp);
1757 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04001758
qs.xiong9fbf74e2023-03-28 13:38:22 +08001759 for(index=0; index < len; index ++)
1760 {
1761 if (memcmp(buff + index, "network={", 9) != 0)
1762 {
you.chen35020192022-05-06 11:30:57 +08001763 continue;
1764 }
1765 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001766 for (; index < len; index ++ )
1767 {
1768 if (buff[index] != '}')
1769 {
you.chen35020192022-05-06 11:30:57 +08001770 continue;
1771 }
1772 buff[index] = '\0';
1773 break;
1774 }
1775 len = buff + index - p;
1776 }
1777
1778 count = lynq_split(p, len, '\n', split_lines);
1779
1780 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001781 for(index=0; index < count; index++)
1782 {
you.chen35020192022-05-06 11:30:57 +08001783 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001784 if (p != NULL)
1785 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001786 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001787 if (*p == '\"')
1788 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001789 p++;
1790 }
you.chen35020192022-05-06 11:30:57 +08001791 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001792 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
1793 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001794 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001795 if (*p == '\"')
1796 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001797 p++;
1798 }
1799 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001800 else
1801 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001802 continue;
you.chen35020192022-05-06 11:30:57 +08001803 }
1804
1805 strcpy(password, p);
1806
qs.xiong9fbf74e2023-03-28 13:38:22 +08001807 while(*password != '\0')
1808 {
1809 if (*password == '\"')
1810 {
you.chen35020192022-05-06 11:30:57 +08001811 *password = '\0';
1812 break;
1813 }
1814 password++;
1815 }
1816 ret = 0;
1817 break;
1818 } //end for(index=0; index < count; index++)
1819
1820 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001821}
1822
you.chen35020192022-05-06 11:30:57 +08001823static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
1824 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08001825 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04001826
qs.xiong9fbf74e2023-03-28 13:38:22 +08001827 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
1828 {
you.chen35020192022-05-06 11:30:57 +08001829 return -1;
1830 }
1831
1832 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08001833
qs.xiong9fbf74e2023-03-28 13:38:22 +08001834 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
1835 {
1836 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
1837 {
1838 if (strcmp(lynq_proto_str, "RSN") == 0)
1839 {
you.chena6cd55a2022-05-08 12:20:18 +08001840 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001841 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08001842 }
1843 }
1844 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001845 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
1846 {
1847 RLOGE("check ieee80211w error\n");
1848 return -1;
1849 }
1850 if ( strncmp(lynq_auth_str,"1",1) == 0 )
1851 {
1852
1853 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001854 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001855 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
1856 {
1857
1858 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001859 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001860 }else
1861 {
1862 *auth = -1;
1863 return -1;
1864 }
you.chen35020192022-05-06 11:30:57 +08001865 return 0;
1866}
1867
1868int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001869{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001870 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08001871 int pass_len, net_no, count, index;
1872 char lynq_tmp_cmd[300]={0};
1873 int net_no_list[128];
1874 lynq_wifi_auth_s net_auth;
1875 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001876 if(pass_len < 8 || pass_len >= 64)
1877 {
1878 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08001879 return -1;
1880 }
1881
1882 CHECK_IDX(idx, CTRL_STA);
1883
1884 net_no = -1;
1885 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
1886
qs.xiong9fbf74e2023-03-28 13:38:22 +08001887 for (index=0; index < count; index++)
1888 {
you.chen35020192022-05-06 11:30:57 +08001889 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001890 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
1891 {
you.chen35020192022-05-06 11:30:57 +08001892 net_no = net_no_list[index];
1893 break;
1894 }
1895 }
1896
qs.xiong9fbf74e2023-03-28 13:38:22 +08001897 if (net_no < 0)
1898 {
you.chen35020192022-05-06 11:30:57 +08001899 return -1;
1900 }
1901
1902 CHECK_WPA_CTRL(CTRL_STA);
1903
1904 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
1905
1906 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1907 DO_OK_FAIL_REQUEST(cmd_save_config);
1908
1909 return 0;
1910}
1911
1912int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
1913
1914 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08001915 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08001916 int count, index;
1917 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08001918 char *buff, *p, *ssid, *ssid_end_flag;
1919 char tmp_ssid[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001920 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08001921
you.chen755332b2022-08-06 16:59:10 +08001922 network_len = 0;
1923 p = NULL;
1924
you.chen35020192022-05-06 11:30:57 +08001925 CHECK_IDX(idx, CTRL_STA);
1926
qs.xiong9fbf74e2023-03-28 13:38:22 +08001927 if (NULL == password)
1928 {
1929 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08001930 return -1;
1931 }
1932
you.chen35020192022-05-06 11:30:57 +08001933 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001934 if (NULL == fp)
1935 {
1936 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08001937 return -1;
1938 }
1939
1940 buff = alloca(MAX_RET);
1941 fseek(fp, 0, SEEK_SET);
1942 len = fread(buff, 1, MAX_RET, fp);
1943 fclose(fp);
1944
qs.xiong9fbf74e2023-03-28 13:38:22 +08001945 for(index=0; index < len; index ++)
1946 {
1947 for(; index < len; index ++)
1948 {
1949 if (memcmp(buff + index, "network={", 9) != 0)
1950 {
you.chen35020192022-05-06 11:30:57 +08001951 continue;
1952 }
1953 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001954 for (; index < len; index ++ )
1955 {
1956 if (buff[index] != '}')
1957 {
you.chen35020192022-05-06 11:30:57 +08001958 continue;
1959 }
1960 buff[index] = '\0';
1961 break;
1962 }
you.chen755332b2022-08-06 16:59:10 +08001963 network_len = buff + index - p;
1964 break;
you.chen35020192022-05-06 11:30:57 +08001965 }
1966
qs.xiongb3f26af2023-02-17 18:41:07 +08001967 if (p == NULL)
1968 return -1;
1969
you.chend2fef3f2023-02-13 10:50:35 +08001970 ssid = strstr(p, "ssid=");
1971 if (ssid != NULL) {
1972 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001973 if (ssid[0] == '\"')
1974 {
you.chend2fef3f2023-02-13 10:50:35 +08001975 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
1976 break;
1977 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001978 else
1979 {
you.chend2fef3f2023-02-13 10:50:35 +08001980 ssid_end_flag = strstr(ssid, "\n");
1981 if (ssid_end_flag != NULL)
1982 {
1983 ssid_len = (ssid_end_flag - ssid) / 2;
1984 for(i=0; i<ssid_len; i++)
1985 {
1986 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
1987 }
1988 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
1989 break;
1990 }
1991 }
you.chen35020192022-05-06 11:30:57 +08001992 }
you.chend2fef3f2023-02-13 10:50:35 +08001993
you.chen35020192022-05-06 11:30:57 +08001994 }
1995
qs.xiong9fbf74e2023-03-28 13:38:22 +08001996 if (index >= len || NULL == p || network_len <= 0)
1997 {
you.chen35020192022-05-06 11:30:57 +08001998 return -1;
1999 }
2000
you.chen755332b2022-08-06 16:59:10 +08002001 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08002002
2003 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002004 for(index=0; index < count; index++)
2005 {
you.chen35020192022-05-06 11:30:57 +08002006 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002007 if (p != NULL)
2008 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002009 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002010 if (*p == '\"')
2011 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002012 p++;
2013 }
you.chen35020192022-05-06 11:30:57 +08002014 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002015 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2016 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002017 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002018 if (*p == '\"')
2019 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002020 p++;
2021 }
2022 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002023 else
2024 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002025 continue;
you.chen35020192022-05-06 11:30:57 +08002026 }
2027
qs.xiong13673462023-02-21 19:12:54 +08002028 if (*p == '\"')
2029 p++;
2030 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08002031
qs.xiong13673462023-02-21 19:12:54 +08002032 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002033 while(password - p < 64 && *password != '\0')
2034 {
2035 if (*password == '\"')
2036 {
you.chen35020192022-05-06 11:30:57 +08002037 *password = '\0';
2038 break;
2039 }
2040 password++;
2041 }
2042 ret = 0;
2043 break;
2044 } //end for(index=0; index < count; index++)
2045
2046 return ret;
2047}
2048
2049static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2050{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002051 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04002052
qs.xiong9fbf74e2023-03-28 13:38:22 +08002053 if (sta_ssid == NULL)
2054 {
2055 RLOGE("sta_ssid is null\n");
2056 return -1;
you.chen35020192022-05-06 11:30:57 +08002057 }
2058
qs.xiong9fbf74e2023-03-28 13:38:22 +08002059 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002060
2061 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2062
2063 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2064// DO_OK_FAIL_REQUEST(cmd_save_config);
2065
qs.xiong9fbf74e2023-03-28 13:38:22 +08002066 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002067
2068}
2069
you.chen35020192022-05-06 11:30:57 +08002070static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05002071{
you.chen35020192022-05-06 11:30:57 +08002072 char lynq_disable_cmd[128]={0};
2073 char lynq_select_cmd[128]={0};
2074
2075 CHECK_WPA_CTRL(CTRL_STA);
2076
qs.xiong9fbf74e2023-03-28 13:38:22 +08002077 if (save != 0)
2078 {
you.chenc29444e2022-06-07 18:01:16 +08002079 if (start_flag != 0)
2080 {
2081 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2082 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2083 }
2084 else
2085 {
2086 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2087 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2088 }
you.chen35020192022-05-06 11:30:57 +08002089 DO_OK_FAIL_REQUEST(cmd_save_config);
2090 }
2091
qs.xiong9fbf74e2023-03-28 13:38:22 +08002092 if (start_flag == 0)
2093 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002094 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002095 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2096 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002097 else
2098 {
you.chen35020192022-05-06 11:30:57 +08002099 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2100 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2101 }
2102
2103 return 0;
2104}
2105
2106int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2107{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002108 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002109 CHECK_IDX(idx, CTRL_STA);
2110
you.chen6c2dd9c2022-05-16 17:55:28 +08002111 curr_status_info curr_state;
2112 ap_info_s ap_info;
2113 curr_state.ap = &ap_info;
2114 curr_state.state = NULL;
2115
qs.xiong9fbf74e2023-03-28 13:38:22 +08002116 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2117 {
you.chend2fef3f2023-02-13 10:50:35 +08002118 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002119 return 0;
2120 }
2121
2122 return -1;
you.chen35020192022-05-06 11:30:57 +08002123}
2124
2125int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2126{
you.chen9ac66392022-08-06 17:01:16 +08002127 scan_info_s *scan_list = NULL;
2128 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002129 int scan_len=0;
2130 int save_len=0;
2131 int best_index = -1;
2132 int best_scan_index = -1;
2133 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002134 int i, j, ret;
2135
2136 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002137
2138 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002139 if (info == NULL)
2140 {
you.chen35020192022-05-06 11:30:57 +08002141 return -1;
2142 }
2143
2144 curr_status_info curr_state;
2145 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002146 char status[64];
you.chen35020192022-05-06 11:30:57 +08002147
you.chen9ac66392022-08-06 17:01:16 +08002148 memset(&ap_info, 0, sizeof (ap_info));
2149 memset(status, 0, sizeof (status));
2150
2151 curr_state.ap = &ap_info;
2152 curr_state.state = status;
2153
qs.xiong9fbf74e2023-03-28 13:38:22 +08002154 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2155 {
you.chen35020192022-05-06 11:30:57 +08002156 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002157 if (strcmp(status, STATE_COMPLETED) == 0)
2158 {
2159 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2160 }
2161 else
2162 {
2163 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2164 }
you.chen35020192022-05-06 11:30:57 +08002165 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002166 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002167 return 0;
2168 }
2169
you.chen9ac66392022-08-06 17:01:16 +08002170 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002171 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002172 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2173 {
you.chen9ac66392022-08-06 17:01:16 +08002174 if (NULL != scan_list)
2175 {
2176 free(scan_list);
2177 }
you.chen35020192022-05-06 11:30:57 +08002178 return -1;
2179 }
2180
qs.xiong9fbf74e2023-03-28 13:38:22 +08002181 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2182 {
you.chen9ac66392022-08-06 17:01:16 +08002183 if (NULL != scan_list)
2184 {
2185 free(scan_list);
2186 }
2187 if (NULL != save_list)
2188 {
2189 free(save_list);
2190 }
you.chen35020192022-05-06 11:30:57 +08002191 return -1;
2192 }
2193
qs.xiong9fbf74e2023-03-28 13:38:22 +08002194 for (i=0; i < save_len; i++)
2195 {
2196 for (j=0; j < scan_len; j++)
2197 {
you.chen35020192022-05-06 11:30:57 +08002198 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002199 && save_list[i].base_info.auth == scan_list[j].auth)
2200 {
2201 if (best_rssi == 0)
2202 {
you.chen9ac66392022-08-06 17:01:16 +08002203 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002204 best_rssi = scan_list[j].rssi;
2205 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002206 else if (best_rssi > scan_list[j].rssi)
2207 {
you.chen35020192022-05-06 11:30:57 +08002208 best_index = i;
2209 best_scan_index = j;
2210 best_rssi = scan_list[j].rssi;
2211 }
you.chend2fef3f2023-02-13 10:50:35 +08002212 strncpy(save_list[i].base_info.ap_mac, scan_list[j].mac, sizeof (save_list[i].base_info.ap_mac));
you.chen35020192022-05-06 11:30:57 +08002213 break;
2214 }
2215 }
2216 }
2217
qs.xiong9fbf74e2023-03-28 13:38:22 +08002218 if (best_index >= 0)
2219 {
you.chen35020192022-05-06 11:30:57 +08002220 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002221 inner_get_ip_by_mac( info->base_info.ap_mac, info->base_info.ap_ip, sizeof (info->base_info.ap_ip));
you.chen35020192022-05-06 11:30:57 +08002222 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2223 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002224 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002225 }
2226
you.chen9ac66392022-08-06 17:01:16 +08002227 if (NULL != scan_list)
2228 {
2229 free(scan_list);
2230 }
2231 if (NULL != save_list)
2232 {
2233 free(save_list);
2234 }
2235
2236 return ret;
you.chen35020192022-05-06 11:30:57 +08002237}
2238
2239static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2240{
qs.xiongc8d92a62023-03-29 17:36:14 +08002241 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002242 char lynq_ket_mgmt_cmd[64]={0};
2243 char lynq_pairwise_cmd[64]={0};
2244 char lynq_psk_cmd[64]={0};
2245
2246 CHECK_WPA_CTRL(CTRL_STA);
2247
qs.xiong9fbf74e2023-03-28 13:38:22 +08002248 switch(auth)
2249 {
2250 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002251 {
2252 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002253
you.chen35020192022-05-06 11:30:57 +08002254 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002255// DO_OK_FAIL_REQUEST(cmd_save_config);
2256 break;
2257 }
2258 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002259 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002260 {
2261 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2262 {
you.chen35020192022-05-06 11:30:57 +08002263 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2264 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002265 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2266 {
you.chena6cd55a2022-05-08 12:20:18 +08002267 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002268 }
2269 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2270 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002271
you.chen35020192022-05-06 11:30:57 +08002272 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2273 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2274 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002275
qs.xiong9fbf74e2023-03-28 13:38:22 +08002276 if (password != NULL)
2277 {
you.chen35020192022-05-06 11:30:57 +08002278 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2279 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002280 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002281 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002282
you.chen35020192022-05-06 11:30:57 +08002283// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002284 break;
2285 }
2286 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2287 {
qs.xiong3e506812023-04-06 11:08:48 +08002288 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002289 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002290 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2291 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2292
qs.xiong3e506812023-04-06 11:08:48 +08002293 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002294 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2295 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2296 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2297
2298 break;
2299 }
2300 case LYNQ_WIFI_AUTH_WPA3_PSK:
2301 {
qs.xiong3e506812023-04-06 11:08:48 +08002302 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002303 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORk %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002304 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2305 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2306
qs.xiong3e506812023-04-06 11:08:48 +08002307 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong455c30b2023-04-12 11:40:02 +08002308 RLOGD("inner_set_sta_auth_psw before set SAE CMD");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002309 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
qs.xiong455c30b2023-04-12 11:40:02 +08002310 RLOGD("inner_set_sta_auth_psw after set SAE CMD");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002311 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2312 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2313
2314 break;
2315 }
2316 default:
2317 return -1;
you.chen35020192022-05-06 11:30:57 +08002318 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002319
qs.xiong9fbf74e2023-03-28 13:38:22 +08002320 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002321}
qs.xiong7a105ce2022-03-02 09:43:11 -05002322
you.chen35020192022-05-06 11:30:57 +08002323static int inner_get_curr_net_no(int interface) {
2324 curr_status_info curr_state;
2325 curr_state.ap = NULL;
2326 curr_state.state = NULL;
2327
qs.xiong9fbf74e2023-03-28 13:38:22 +08002328 if (0 != inner_get_status_info(interface, &curr_state))
2329 {
you.chen35020192022-05-06 11:30:57 +08002330 return -1;
2331 }
2332
2333 return curr_state.net_no;
2334}
2335
2336int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002337{
you.chen35020192022-05-06 11:30:57 +08002338 int net_no;
2339 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002340
you.chen35020192022-05-06 11:30:57 +08002341 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002342
qs.xiong9fbf74e2023-03-28 13:38:22 +08002343 if (net_no < 0)
2344 {
you.chen35020192022-05-06 11:30:57 +08002345 return -1;
2346 }
2347
2348 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002349}
2350
you.chen35020192022-05-06 11:30:57 +08002351int lynq_wifi_sta_connect(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw)
qs.xiong7a105ce2022-03-02 09:43:11 -05002352{
you.chen35020192022-05-06 11:30:57 +08002353 int count, net_no, index;
2354 int net_no_list[128];
2355 lynq_wifi_auth_s net_auth;
qs.xiongf1b525b2022-03-31 00:58:23 -04002356
qs.xiong9fbf74e2023-03-28 13:38:22 +08002357 if (ssid == NULL || *ssid == '\0')
2358 {
2359 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002360 return -1;
2361 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002362
qs.xiong9fbf74e2023-03-28 13:38:22 +08002363 if (LYNQ_WIFI_AUTH_OPEN != auth)
2364 {
2365 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
2366 {
2367 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002368 return -1;
2369 }
2370 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002371
you.chen35020192022-05-06 11:30:57 +08002372 CHECK_IDX(idx, CTRL_STA);
2373
2374 net_no = -1;
2375 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2376
qs.xiong9fbf74e2023-03-28 13:38:22 +08002377 for (index=0; index < count; index++)
2378 {
you.chen35020192022-05-06 11:30:57 +08002379 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002380 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2381 {
you.chen35020192022-05-06 11:30:57 +08002382 net_no = net_no_list[index];
2383 break;
2384 }
2385 }
2386
qs.xiong9fbf74e2023-03-28 13:38:22 +08002387 if (net_no < 0)
2388 {
you.chen35020192022-05-06 11:30:57 +08002389 net_no = lynq_add_network(CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002390 if (net_no == -1)
2391 {
you.chen35020192022-05-06 11:30:57 +08002392 return -1;
2393 }
2394
qs.xiong9fbf74e2023-03-28 13:38:22 +08002395 RLOGD("net no is %d\n", net_no);
2396 if (0 != inner_set_sta_ssid(net_no, ssid))
2397 {
you.chen35020192022-05-06 11:30:57 +08002398 return -1;
2399 }
2400 }
2401
qs.xiong9fbf74e2023-03-28 13:38:22 +08002402 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2403 {
you.chen35020192022-05-06 11:30:57 +08002404 return -1;
2405 }
2406
2407 return inner_sta_start_stop(net_no, 1, 1);
qs.xiong7a105ce2022-03-02 09:43:11 -05002408}
2409
you.chen35020192022-05-06 11:30:57 +08002410int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002411{
you.chen35020192022-05-06 11:30:57 +08002412 ap_info_s ap;
2413 curr_status_info curr_state;
2414 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002415
qs.xiong9fbf74e2023-03-28 13:38:22 +08002416 if (ssid == NULL || *ssid == '\0')
2417 {
2418 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002419 return -1;
2420 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002421
you.chen35020192022-05-06 11:30:57 +08002422 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002423
you.chen35020192022-05-06 11:30:57 +08002424 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002425 curr_state.state = NULL;
2426
qs.xiong9fbf74e2023-03-28 13:38:22 +08002427 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2428 {
you.chen35020192022-05-06 11:30:57 +08002429 return 0;
2430 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002431
qs.xiong9fbf74e2023-03-28 13:38:22 +08002432 if (strcmp(ap.ap_ssid, ssid) != 0)
2433 {
you.chen35020192022-05-06 11:30:57 +08002434 return 0;
2435 }
2436
2437 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002438}
qs.xiong97fa59b2022-04-07 05:41:29 -04002439
you.chena6cd55a2022-05-08 12:20:18 +08002440int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2441{
qs.xiongad2f89d2023-01-18 13:17:41 +08002442// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2443// const char *lynq_reconnect_cmd = "RECONNECT";
2444 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2445 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2446// const char *lynq_first_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 remove_net all";
qs.xiong7a105ce2022-03-02 09:43:11 -05002447
you.chen35020192022-05-06 11:30:57 +08002448 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08002449 CHECK_WPA_CTRL(CTRL_STA);
2450
2451 system("connmanctl enable wifi");
2452
qs.xiongad2f89d2023-01-18 13:17:41 +08002453 if (system("ifconfig | grep -q wlan0") != 0)
2454 {
you.chen35020192022-05-06 11:30:57 +08002455 return -1;
2456 }
qs.xiong9c99fa92022-03-15 08:03:26 -04002457
qs.xiongad2f89d2023-01-18 13:17:41 +08002458// DO_OK_FAIL_REQUEST(cmd_remove_all);
2459// system(lynq_first_sta_cmd);
2460// system(lynq_reconfigure_cmd);
2461// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
2462 system(lynq_enable_sta_cmd);
2463 system(lynq_reconnect_cmd);
2464// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002465 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002466}
2467
you.chen35020192022-05-06 11:30:57 +08002468int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04002469{
qs.xiongad2f89d2023-01-18 13:17:41 +08002470// char lynq_disable_network_cmd[MAX_CMD];
2471// curr_status_info curr_state;
2472// ap_info_s ap_info;
you.chen35020192022-05-06 11:30:57 +08002473
qs.xiongad2f89d2023-01-18 13:17:41 +08002474 const char * lynq_disable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disable_net all";
you.chena6cd55a2022-05-08 12:20:18 +08002475 CHECK_IDX(idx, CTRL_STA);
2476 CHECK_WPA_CTRL(CTRL_STA);
2477
qs.xiongad2f89d2023-01-18 13:17:41 +08002478// curr_state.ap = &ap_info;
2479// curr_state.state = NULL;
you.chena6cd55a2022-05-08 12:20:18 +08002480
qs.xiongad2f89d2023-01-18 13:17:41 +08002481// if (0 != inner_get_status_info(CTRL_STA, &curr_state) || curr_state.net_no < 0) {
2482// return 0;
2483// }
you.chena6cd55a2022-05-08 12:20:18 +08002484
qs.xiongad2f89d2023-01-18 13:17:41 +08002485// sprintf(lynq_disable_network_cmd, "DISABLE_NETWORK %d", curr_state.net_no);
2486// DO_OK_FAIL_REQUEST(lynq_disable_network_cmd);
2487 system(lynq_disable_sta_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002488 DO_OK_FAIL_REQUEST(cmd_save_config);
2489
2490 return 0;
2491// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04002492}
qs.xiong7a105ce2022-03-02 09:43:11 -05002493
you.chen35020192022-05-06 11:30:57 +08002494//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
2495// int i, count;
2496// char *p;
2497// const char * FLAG_SSID = "ssid=";
2498// const char * FLAG_SBSID = "bssid=";
2499// const char * FLAG_KEY_MGMT = "key_mgmt=";
2500// const char * FLAG_FREQ = "freq=";
2501// char lynq_sta_cmd[MAX_CMD];
2502// char *split_lines[128] = {0};
2503
2504// CHECK_WPA_CTRL(CTRL_AP);
2505
2506// sprintf(lynq_sta_cmd, "STA %s", bssid);
2507
2508// DO_REQUEST(lynq_sta_cmd);
2509
2510// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2511
2512// for(i=0; i < count; i++) {
2513// p = strstr(split_lines[i], FLAG_SSID);
2514// if (p != NULL) {
2515// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
2516// continue;
2517// }
2518// }
2519
2520// lynq_get_interface_ip(idx, ap->ap_ip);
2521// lynq_ap_password_set(idx, ap->psw);
2522
2523// return 0;
2524//}
2525
2526static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
2527 curr_status_info curr_state;
2528 curr_state.ap = ap;
2529 curr_state.state = NULL;
2530 return inner_get_status_info(interface, &curr_state);
2531}
2532
2533int lynq_get_ap_device_list(lynq_wifi_index_e idx, ap_info_s **ap, device_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04002534{
you.chend2fef3f2023-02-13 10:50:35 +08002535 int index, line_count;
2536 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08002537 const char *lynq_first_sta_cmd = "STA-FIRST";
2538 char lynq_next_sta_cmd[MAX_CMD];
2539 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08002540 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002541
you.chen35020192022-05-06 11:30:57 +08002542 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002543
you.chen35020192022-05-06 11:30:57 +08002544 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002545
you.chen35020192022-05-06 11:30:57 +08002546// ap_info_s * tmp_ap;
2547// device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002548 if (ap == NULL || list == NULL || len == NULL)
2549 {
2550 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08002551 return -1;
2552 }
2553
2554// ap = &tmp_ap;
2555// list = &tmp_list;
2556 *ap = malloc(sizeof (ap_info_s));
2557
qs.xiong9fbf74e2023-03-28 13:38:22 +08002558 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0)
2559 {
2560 RLOGE("inner_get_status_info_ap !=0\n");
you.chen35020192022-05-06 11:30:57 +08002561 return -1;
2562 }
2563
2564 lynq_get_interface_ip(idx, (*ap)->ap_ip);
2565 lynq_ap_password_get(idx, (*ap)->psw);
2566
you.chen35020192022-05-06 11:30:57 +08002567 DO_REQUEST(lynq_first_sta_cmd);
2568
2569 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002570 while (reply_len > 0)
2571 {
2572 if (memcmp(cmd_reply, "FAIL", 4) == 0)
2573 {
you.chen35020192022-05-06 11:30:57 +08002574 break;
2575 }
2576 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2577 bssid[index] = malloc(strlen(split_lines[0]) + 1);
2578 strcpy(bssid[index], split_lines[0]);
2579 index++;
2580 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
2581 reply_len = MAX_RET;
2582 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08002583 ret = local_wpa_ctrl_request(lynq_wpa_ctrl, lynq_next_sta_cmd, strlen(lynq_next_sta_cmd), cmd_reply, &reply_len, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002584 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
2585 {
2586 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08002587 break;
2588 }
2589 }
2590
2591 *len = index;
2592
2593 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08002594 for (index=0; index < *len; index++)
2595 {
you.chend2fef3f2023-02-13 10:50:35 +08002596 dev_info = &(*list)[index];
2597 memset(dev_info, 0, sizeof(device_info_s));
2598 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
2599 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
2600 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
2601 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08002602 free(bssid[index]);
2603 }
2604
2605 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002606}
2607
you.chen35020192022-05-06 11:30:57 +08002608int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04002609{
you.chen35020192022-05-06 11:30:57 +08002610 int i, count, index, count_words;
2611 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
2612 char *split_lines[128] = {0};
2613 char *split_words[128] = {0};
2614 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04002615
qs.xiong9fbf74e2023-03-28 13:38:22 +08002616 if (list == NULL || len == NULL)
2617 {
you.chen35020192022-05-06 11:30:57 +08002618 return -1;
2619 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002620
you.chen9ac66392022-08-06 17:01:16 +08002621 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
2622 {
2623 usleep(100 * 1000);
2624 }
2625
you.chen35020192022-05-06 11:30:57 +08002626 CHECK_IDX(idx, CTRL_STA);
2627
2628 CHECK_WPA_CTRL(CTRL_STA);
2629
2630 DO_REQUEST(lynq_scan_result_cmd);
2631
2632 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2633 *len = count - 1;
2634 *list = malloc(sizeof (scan_info_s) * *len);
2635
2636 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08002637 for (index=0; index <count_words; index++)
2638 {
2639 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08002640 }
2641
qs.xiong9fbf74e2023-03-28 13:38:22 +08002642 for(index = 1;index < count; index++)
2643 {
2644 RLOGD("---- %s\n",split_lines[index]);
you.chen35020192022-05-06 11:30:57 +08002645 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
2646 if (count_words < 4)
2647 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002648 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08002649 //bssid / frequency / signal level / flags / ssid
2650 p = (*list) + index - 1;
2651 strcpy(p->mac, split_words[0]);
2652 p->band = convert_band_from_freq(atoi(split_words[1]));
2653 p->rssi = -1 * atoi( split_words[2]);
2654 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chend2fef3f2023-02-13 10:50:35 +08002655 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
you.chen35020192022-05-06 11:30:57 +08002656 }
2657
2658 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002659}
qs.xiong97fa59b2022-04-07 05:41:29 -04002660
you.chen35020192022-05-06 11:30:57 +08002661int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
2662{
2663 int count, net_no, index;
2664 int net_no_list[128];
2665 lynq_wifi_auth_s net_auth;
2666 char lynq_remove_cmd[MAX_CMD];
2667
qs.xiong9fbf74e2023-03-28 13:38:22 +08002668 if (ssid == NULL || *ssid == '\0')
2669 {
2670 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002671 return -1;
2672 }
2673
2674 CHECK_IDX(idx, CTRL_STA);
2675
2676 CHECK_WPA_CTRL(CTRL_STA);
2677
2678 net_no = -1;
2679 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2680
qs.xiong9fbf74e2023-03-28 13:38:22 +08002681 for (index=0; index < count; index++)
2682 {
you.chen35020192022-05-06 11:30:57 +08002683 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002684 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2685 {
you.chen35020192022-05-06 11:30:57 +08002686 net_no = net_no_list[index];
2687 break;
2688 }
2689 }
2690
qs.xiong9fbf74e2023-03-28 13:38:22 +08002691 if (net_no < 0)
2692 {
you.chen35020192022-05-06 11:30:57 +08002693 return 0;
2694 }
2695
2696 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
2697
2698 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
2699 DO_OK_FAIL_REQUEST(cmd_save_config);
2700
2701 return 0;
2702}
2703
2704int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002705{
you.chend2fef3f2023-02-13 10:50:35 +08002706 int count, index;
you.chen35020192022-05-06 11:30:57 +08002707 int net_no_list[128];
2708 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002709 RLOGD("enter lynq_get_sta_saved_ap api\n");
2710 if (list == NULL || len == NULL)
2711 {
2712 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08002713 return -1;
2714 }
2715
2716 CHECK_IDX(idx, CTRL_STA);
2717
2718// CHECK_WPA_CTRL(CTRL_STA);
2719
2720 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002721 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08002722
2723 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08002724 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08002725 *len = count;
2726
qs.xiong9fbf74e2023-03-28 13:38:22 +08002727 for (index=0; index < count; index++)
2728 {
2729 RLOGD("[lynq_get_sta_saved_ap]to get ssid %d", index);
2730 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get ssid");
you.chen35020192022-05-06 11:30:57 +08002731 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002732 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get mac");
you.chen35020192022-05-06 11:30:57 +08002733 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002734 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get auth");
you.chen35020192022-05-06 11:30:57 +08002735 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002736 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get band");
2737 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
2738 {
you.chen35020192022-05-06 11:30:57 +08002739 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
2740 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002741 else
2742 {
you.chen35020192022-05-06 11:30:57 +08002743 (*list)[index].base_info.band = -1;
2744 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002745 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08002746 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002747 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002748 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08002749 return 0;
2750}
2751
2752int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
2753{
qs.xiongc8d92a62023-03-29 17:36:14 +08002754 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08002755 const char *lynq_scan_cmd = "SCAN";
2756
2757 CHECK_IDX(idx, CTRL_STA);
2758
2759 CHECK_WPA_CTRL(CTRL_STA);
2760
qs.xiongc8d92a62023-03-29 17:36:14 +08002761 system(clean_last_re);
you.chen9ac66392022-08-06 17:01:16 +08002762 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08002763 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002764 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
2765 {
qs.xiongb3f26af2023-02-17 18:41:07 +08002766 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002767 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
2768 {
qs.xiongb3f26af2023-02-17 18:41:07 +08002769 g_sta_scan_finish_flag = 1;
2770 return -1;
2771 }
you.chen35020192022-05-06 11:30:57 +08002772
2773 return 0;
2774}
2775
2776int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002777 if (cb == NULL)
2778 {
2779 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08002780 return -1;
2781 }
2782
2783 g_ap_callback_priv = priv;
2784 g_ap_callback_func = cb;
2785
2786 return 0;
2787}
2788
2789int lynq_unreg_ap_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002790 if (g_ap_callback_priv == priv)
2791 {
you.chen35020192022-05-06 11:30:57 +08002792 g_ap_callback_func = NULL;
2793 g_ap_callback_priv = NULL;
2794 return 0;
2795 }
2796 return -1;
2797}
2798
2799int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08002800 if (cb == NULL)
2801 {
2802 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08002803 return -1;
2804 }
2805
2806 g_sta_callback_priv = priv;
2807 g_sta_callback_func = cb;
2808
2809 return 0;
2810}
2811
2812int lynq_unreg_sta_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002813 if (g_sta_callback_priv == priv)
2814 {
you.chen35020192022-05-06 11:30:57 +08002815 g_sta_callback_func = NULL;
2816 g_sta_callback_priv = NULL;
2817 return 0;
2818 }
2819 return -1;
2820}
2821
2822
2823static int inner_get_status_info_state (int interface, char *state) {
2824 curr_status_info curr_state;
2825 curr_state.ap = NULL;
2826 curr_state.state = state;
2827 return inner_get_status_info(interface, &curr_state);
2828}
2829
2830int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
2831{
2832 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002833 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08002834 CHECK_IDX(idx, CTRL_AP);
2835
qs.xiong9fbf74e2023-03-28 13:38:22 +08002836 if (inner_get_status_info_state(CTRL_AP, state) != 0)
2837 {
you.chen35020192022-05-06 11:30:57 +08002838 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
2839 return 0;
2840 }
2841
qs.xiong9fbf74e2023-03-28 13:38:22 +08002842 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
2843 {
you.chen35020192022-05-06 11:30:57 +08002844 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
2845 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002846 else
2847 {
you.chen35020192022-05-06 11:30:57 +08002848 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
2849 }
2850
2851 return 0;
2852}
2853
2854int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
2855 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002856 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08002857 CHECK_IDX(idx, CTRL_STA);
2858
qs.xiong9fbf74e2023-03-28 13:38:22 +08002859 if (inner_get_status_info_state(CTRL_STA, state) != 0)
2860 {
you.chen35020192022-05-06 11:30:57 +08002861 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
2862 return 0;
2863 }
2864
qs.xiong9fbf74e2023-03-28 13:38:22 +08002865 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
2866 {
you.chen35020192022-05-06 11:30:57 +08002867 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
2868 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002869 else
2870 {
you.chen35020192022-05-06 11:30:57 +08002871 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
2872 }
2873
2874 return 0;
2875}
2876
2877int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
2878// CHECK_IDX(idx, CTRL_AP);
2879// int ret = 0;
2880// size_t reply_len = MAX_RET;
2881// char cmd_reply[MAX_RET]={0};
2882// const char * cmd_str = "GET country";
2883// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
2884// do{
2885// if (NULL == s_lynq_wpa_ctrl) {
2886// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
2887// if (NULL == s_lynq_wpa_ctrl ) {
2888// printf("wpa_ctrl_open fail\n");
2889// return -1;
2890// }
2891// }
2892// }while(0);
2893
2894// do {
2895// reply_len = MAX_RET;
2896// cmd_reply[0] = '\0';
2897// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08002898// ret = local_wpa_ctrl_request(s_lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL);
you.chen35020192022-05-06 11:30:57 +08002899// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002900// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08002901// return ret;
2902// }
2903// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08002904// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08002905// }while(0);
2906
2907 FILE *fp;
2908 size_t i = 0;
2909 char lynq_cmd_ret[MAX_RET]={0};
2910
2911// CHECK_IDX(idx, CTRL_AP);
2912
2913 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002914 {
2915 perror("popen error!");
2916 return -1;
2917 }
you.chen35020192022-05-06 11:30:57 +08002918 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
2919 {
2920 perror("fread fail!");
2921 return -1;
2922 }
2923
qs.xiong9fbf74e2023-03-28 13:38:22 +08002924 for(i=0; i < strlen(lynq_cmd_ret); i++)
2925 {
2926 if (lynq_cmd_ret[i] == ' ')
2927 {
you.chen35020192022-05-06 11:30:57 +08002928 lynq_cmd_ret[i] = '\0';
2929 break;
2930 }
2931 }
2932
2933 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002934 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08002935
2936 int ret=pclose(fp);
2937 if(ret==-1)
2938 {
2939 perror("close file faild");
2940 }
2941
2942 return 0;
2943}
2944
2945int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
2946// const char * cmd_str = "GET country";
2947// CHECK_IDX(idx, CTRL_AP);
2948// CHECK_WPA_CTRL(CTRL_STA);
2949
2950// DO_REQUEST(cmd_str);
2951// printf("result %s\n", cmd_reply);
2952
qs.xiong9fbf74e2023-03-28 13:38:22 +08002953 if (country_code == NULL || *country_code == '\0')
2954 {
2955 RLOGD("bad country code\n");
you.chen35020192022-05-06 11:30:57 +08002956 return -1;
2957 }
2958
2959 char lynq_country_cmd[MAX_CMD];
2960 sprintf(lynq_country_cmd, "wl country %s", country_code);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002961 if (system(lynq_country_cmd) == 0)
2962 {
you.chen35020192022-05-06 11:30:57 +08002963 return 0;
2964 }
2965
2966 return -1;
2967}
2968
2969int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
2970{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002971 RLOGD("enter lynq_get_connect_ap_mac\n");
2972 if (mac == NULL)
2973 {
2974 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08002975 return -1;
2976 }
2977
2978 CHECK_IDX(idx, CTRL_STA);
2979 ap_info_s ap;
2980 ap.ap_mac[0] = '\0';
2981
qs.xiong9fbf74e2023-03-28 13:38:22 +08002982 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
2983 {
you.chen35020192022-05-06 11:30:57 +08002984 return -1;
2985 }
2986 strcpy(mac, ap.ap_mac);
2987
2988 return 0;
2989}
2990
2991int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
2992{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002993 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08002994 struct ifaddrs *ifaddr_header, *ifaddr;
2995 struct in_addr * ifa;
2996 const char * ifaName = "wlan0";
2997 if (ip == NULL)
2998 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002999 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08003000 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003001 }
you.chenf58b3c92022-06-21 16:53:48 +08003002
qs.xiong9fbf74e2023-03-28 13:38:22 +08003003 if (idx == 1)
3004 {
you.chen6c2dd9c2022-05-16 17:55:28 +08003005 ifaName = "tether";
you.chen9ac66392022-08-06 17:01:16 +08003006 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003007 else if (idx != 0)
3008 {
you.chen35020192022-05-06 11:30:57 +08003009 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003010 }
you.chen35020192022-05-06 11:30:57 +08003011
you.chen9ac66392022-08-06 17:01:16 +08003012 if (getifaddrs(&ifaddr_header) == -1)
3013 {
you.chen35020192022-05-06 11:30:57 +08003014 perror("getifaddrs");
3015 return -1;
3016 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08003017 }
you.chen35020192022-05-06 11:30:57 +08003018
3019
you.chen9ac66392022-08-06 17:01:16 +08003020 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3021 {
3022 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08003023 continue;
you.chen9ac66392022-08-06 17:01:16 +08003024 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3025 {
3026 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3027 {
3028 // is a valid IP4 Address
3029 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3030 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003031 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08003032 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003033 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08003034 return 0;
3035 }
3036 }
3037 }
qs.xiongc4f007c2023-02-08 18:16:58 +08003038 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003039 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08003040 return -1;
you.chen35020192022-05-06 11:30:57 +08003041}
3042
3043int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3044{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003045 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08003046 int count;
3047 size_t i;
3048 char *split_words[128] = {0};
3049 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3050
3051 CHECK_WPA_CTRL(idx);
3052
3053 DO_REQUEST(lynq_get_mac_cmd);
3054
qs.xiong9fbf74e2023-03-28 13:38:22 +08003055 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3056 {
3057 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08003058 return -1;
3059 }
3060
3061 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3062
qs.xiong9fbf74e2023-03-28 13:38:22 +08003063 if (count < 2)
3064 {
you.chen35020192022-05-06 11:30:57 +08003065 return -1;
3066 }
3067
qs.xiong9fbf74e2023-03-28 13:38:22 +08003068 for (i=0; i < strlen(split_words[1]); i++ )
3069 {
3070 if (split_words[1][i] != ' ')
3071 {
you.chen35020192022-05-06 11:30:57 +08003072 break;
3073 }
3074 }
3075
3076 strcpy(mac, split_words[1] + i);
3077
3078 return 0;
3079}
3080
3081int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3082{
3083// int count;
3084// char *split_words[128] = {0};
3085// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3086
3087// if (rssi == NULL) {
3088// return -1;
3089// }
3090
3091// CHECK_IDX(idx, CTRL_STA);
3092
3093// CHECK_WPA_CTRL(CTRL_STA);
3094
3095// DO_REQUEST(lynq_get_rssi_cmd);
3096
3097// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3098// return -1;
3099// }
3100
3101// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3102
3103// if (count < 2) {
3104// return -1;
3105// }
3106
3107// *rssi = atoi(split_words[1]) * -1;
3108
you.chen35020192022-05-06 11:30:57 +08003109 char lynq_cmd_ret[MAX_RET]={0};
3110
qs.xiongff0ae0f2022-10-11 15:47:14 +08003111/*******change other cmd to get rssi*******
3112 *
3113 *wl rssi ---> wl -i wlan0 rssi
3114 *
3115 ***** change by qs.xiong 20221011*******/
you.chen23c4a5f2023-04-12 16:46:00 +08003116 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiong9fbf74e2023-03-28 13:38:22 +08003117 {
you.chen23c4a5f2023-04-12 16:46:00 +08003118 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen35020192022-05-06 11:30:57 +08003119 return -1;
3120 }
you.chen9f17e4d2022-06-06 17:18:18 +08003121 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003122/****** if got rssi is 0,means sta didn't connected any device****/
3123 if(*rssi == 0)
3124 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003125 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chen23c4a5f2023-04-12 16:46:00 +08003126 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003127 }
you.chen35020192022-05-06 11:30:57 +08003128
3129 return 0;
3130}
3131
3132int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3133{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003134 RLOGD("enter lynq_get_connect_ap_band\n");
3135 if (band == NULL)
3136 {
you.chen35020192022-05-06 11:30:57 +08003137 return -1;
3138 }
3139
3140 CHECK_IDX(idx, CTRL_STA);
3141 ap_info_s ap;
3142 ap.band = -1;
3143
qs.xiong9fbf74e2023-03-28 13:38:22 +08003144 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3145 {
you.chen35020192022-05-06 11:30:57 +08003146 return -1;
3147 }
3148 *band = ap.band;
3149
3150 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003151}
you.chenf58b3c92022-06-21 16:53:48 +08003152
3153int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3154{
qs.xionge4cbf1c2023-02-28 18:22:49 +08003155 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003156
3157 if (ip == NULL)
3158 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003159 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003160 return -1;
3161 }
3162
3163 CHECK_IDX(idx, CTRL_STA);
3164
qs.xionge4cbf1c2023-02-28 18:22:49 +08003165 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003166 {
3167 return -1;
3168 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003169
3170 return inner_get_ip_by_mac(bssid, ip, 32); //better input by user
you.chenf58b3c92022-06-21 16:53:48 +08003171}
3172
qs.xiong026c5c72022-10-17 11:15:45 +08003173int lynq_ap_connect_num(int sta_number)
3174{
3175 char lynq_limit_cmd[32]={0};
3176 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003177 if((sta_number < 1 ) && (sta_number > 15))
3178 {
3179 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003180 return -1;
3181 }
3182 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3183 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003184 if(ret != 0)
3185 {
3186 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003187 }
3188 return 0;
3189}
you.chenf58b3c92022-06-21 16:53:48 +08003190
qs.xiong77905552022-10-17 11:19:57 +08003191int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3192{
3193
3194 char lynq_wifi_acs_cmd[128]={0};
3195 char lynq_cmd_mode[128]={0};
3196 char lynq_cmd_slect[128]={0};
3197
qs.xiong9fbf74e2023-03-28 13:38:22 +08003198 if((acs_mode != 2) && (acs_mode != 5))
3199 {
qs.xiong77905552022-10-17 11:19:57 +08003200 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3201 }
3202
qs.xiong9fbf74e2023-03-28 13:38:22 +08003203 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3204 {
qs.xiong77905552022-10-17 11:19:57 +08003205 return -1;
3206 }
3207
3208 CHECK_IDX(idx, CTRL_AP);
3209
3210 CHECK_WPA_CTRL(CTRL_AP);
3211
3212 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3213 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3214 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3215
3216 DO_OK_FAIL_REQUEST(cmd_disconnect);
3217 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3218 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3219 DO_OK_FAIL_REQUEST(cmd_save_config);
3220 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3221
3222 return 0;
3223}
you.chen0f5c6432022-11-07 18:31:14 +08003224//you.chen add for tv-box start
3225static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3226 FILE *fp;
3227 //printf("to exec cmd:%s\n", str_cmd);
3228 if((fp=popen(str_cmd,"r"))==NULL)
3229 {
3230 perror("popen error!");
3231 return -1;
3232 }
3233 if((fread(str_cmd_ret,max_len,1,fp))<0)
3234 {
3235 perror("fread fail!");
3236 fclose(fp);
3237 return -1;
3238 }
3239 fclose(fp);
3240 return 0;
3241}
3242
3243static int get_netmask_length(const char* mask)
3244{
3245 int masklen=0, i=0;
3246 int netmask=0;
3247
3248 if(mask == NULL)
3249 {
3250 return 0;
3251 }
3252
3253 struct in_addr ip_addr;
3254 if( inet_aton(mask, &ip_addr) )
3255 {
3256 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003257 }else
3258 {
you.chen0f5c6432022-11-07 18:31:14 +08003259 netmask = 0;
3260 return 0;
3261 }
3262
3263 while(0 == (netmask & 0x01) && i<32)
3264 {
3265 i++;
3266 netmask = netmask>>1;
3267 }
3268 masklen = 32-i;
3269 return masklen;
3270}
3271
3272static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3273 int mask_len;
3274 char *p;
3275 char tmp[64] = {0};
3276 if (exec_cmd("ifconfig tether | grep Mask", str_cmd_ret, max_len) != 0)
3277 return -1;
3278 p = strstr(str_cmd_ret, "Mask:");
3279 if (p == NULL)
3280 return -1;
3281 mask_len = get_netmask_length(p + 5);
3282 if (mask_len == 0)
3283 return -1;
3284 p = strstr(str_cmd_ret, "inet addr:");
3285 if (p == NULL)
3286 return -1;
3287 strcpy(tmp, p + 10);
3288 p = strstr(tmp, " ");
3289 if (p != NULL)
3290 *p = '\0';
3291 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
3292 return 0;
3293}
3294
3295static void GBWWatchThreadProc() {
3296 int i,n, nloop, nmax, ncheckcount, nidlecount;
3297 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
3298 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
3299 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
3300 char *results[16] = {0};
3301 char str_cmd[256] = {0};
3302 char str_cmd_ret[128] = {0};
3303 char dest_ip[32] = {0};
3304 lastAP1Bytes = lastAP2Bytes = 0;
3305 lastAP1Drop = lastAP2Drop = 0;
3306 lastAP1Speed = lastAP2Speed = 0;
3307 setAP1Speed = 50;
3308 setAP2Speed = 80;
3309 nloop = 0;
3310 nmax = 6;
3311 ncheckcount = nidlecount = 0;
3312
qs.xiong9fbf74e2023-03-28 13:38:22 +08003313 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08003314 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
3315 while (dest_ip[0] == '\0') {
3316 sleep(1);
3317 str_cmd_ret[0] = '\0';
3318 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
3319 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
3320 if (str_cmd_ret[n] == '\n'){
3321 str_cmd_ret[n] = '\0';
3322 break;
3323 }
3324 }
3325 if (str_cmd_ret[0] != '\0')
3326 {
3327 strcpy(dest_ip, str_cmd_ret);
3328 }
3329 }
3330
3331 system("tc qdisc del dev tether root > /dev/null 2>&1");
3332 system("tc qdisc add dev tether root handle 1: htb r2q 1");
3333 system("tc class add dev tether parent 1: classid 1:1 htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000");
3334 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
3335 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003336 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08003337 return;
3338 }
3339 sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 16 u32 match ip dst %s flowid 1:1", str_cmd_ret);
3340 system(str_cmd);
3341 system("tc class add dev tether parent 1: classid 1:2 htb rate 80Mbit ceil 100Mbit prio 0 quantum 3000000");
3342 sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", dest_ip);
3343 //printf("----cmd:%s\n", str_cmd);
3344 system(str_cmd);
3345
3346 while (1) {
3347 sleep(1);
3348 memset(str_cmd, 0, sizeof(str_cmd));
3349 if (0 != exec_cmd("tc -s class show dev tether classid 1:1 | grep Sent", str_cmd, sizeof (str_cmd)))
3350 continue;
3351 //printf("ap1 --- %s\n", str_cmd);
3352 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3353 if (n > 9) {
3354 if (strcmp(results[1], "Sent") == 0) {
3355 currAP1Bytes = atoll(results[2]);
3356 }
3357 if (strcmp(results[6], "(dropped") == 0) {
3358 currAP1Drop = atoi(results[7]);
3359 }
3360 }
3361
3362 memset(str_cmd, 0, sizeof(str_cmd));
3363 if (0 != exec_cmd("tc -s class show dev tether classid 1:2 | grep Sent", str_cmd, sizeof (str_cmd)))
3364 continue;
3365 //printf("ap2 --- %s\n", str_cmd);
3366 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3367 if (n > 9) {
3368 if (strcmp(results[1], "Sent") == 0) {
3369 currAP2Bytes = atoll(results[2]);
3370 }
3371 if (strcmp(results[6], "(dropped") == 0) {
3372 currAP2Drop = atoi(results[7]);
3373 }
3374 }
3375
3376 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
3377 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
3378 lastAP1Bytes = currAP1Bytes;
3379 lastAP2Bytes = currAP2Bytes;
3380 continue;
3381 }
3382
3383 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
3384 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
3385 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
3386 lastAP1Speed = currAP1Speed;
3387 lastAP2Speed = currAP2Speed;
3388 lastAP1Bytes = currAP1Bytes;
3389 lastAP2Bytes = currAP2Bytes;
3390
3391 currSetAP1Speed = setAP1Speed;
3392 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
3393 ncheckcount++;
3394 if (ncheckcount > 3) {
3395 ncheckcount = 0;
3396 currSetAP1Speed = 5;
3397 }
3398 }
3399 else {
3400 ncheckcount = 0;
3401 if (currAP1Speed < 5)
3402 nidlecount++;
3403 else
3404 nidlecount = 0;
3405
3406 }
3407
3408 if (nidlecount > 60 ){
3409 currSetAP1Speed = 50;
3410 }
3411
3412 if (currSetAP1Speed != setAP1Speed) {
3413 setAP1Speed = currSetAP1Speed;
3414 sprintf(str_cmd, "tc class replace dev tether parent 1: classid 1:1 htb rate %dMbit ceil %dMbit prio 2 quantum 3000", setAP1Speed, (int)(setAP1Speed*1.4));
3415 //printf("------***change speed: %s\n", str_cmd);
3416 system(str_cmd);
3417 }
3418 }
3419}
3420
3421int enableGBW(const char* mac) {
3422 int i,len;
3423 char get_ipaddr_cmd[128]={0};
3424 ap_info_s *ap;
3425 device_info_s * list;
3426
3427 if (mac == NULL || g_gbw_enabled == 1)
3428 return -1;
3429 len = strlen(mac);
3430 g_gbw_mac = malloc(len + 1);
3431 for(i=0;i<len;i++) {
3432 if (mac[i] >= 'A' && mac[i] <= 'Z')
3433 {
3434 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
3435 }
3436 else
3437 g_gbw_mac[i] = mac[i];
3438 }
3439 g_gbw_mac[i] = '\0';
3440 g_gbw_enabled = 1;
3441
3442 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
3443 if (system(get_ipaddr_cmd) == 0) {
3444 //startGBW();
3445 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
3446 for (i=0;i<len;i++) {
3447 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
3448 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
3449 startGBW();
3450 }
3451 free(ap);
3452 free(list);
3453 }
3454 }
3455 return 0;
3456}
3457
3458int disableGBW() {
3459 stopGBW();
3460 free(g_gbw_mac);
3461 g_gbw_mac = NULL;
3462 g_gbw_enabled = 1;
3463 return 0;
3464}
3465
3466static int startGBW() {
3467 if (g_gbw_watcher_pid != 0) {
3468 stopGBW();
3469 }
3470 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
3471}
3472
3473static int stopGBW() {
3474 void* retval;
3475 pthread_cancel(g_gbw_watcher_pid);
3476 pthread_join(g_gbw_watcher_pid, &retval);
3477 g_gbw_watcher_pid = 0;
3478 system("tc qdisc del dev tether root");
3479}
3480//you.chen add for tv-box end