blob: 2bfbd1eb398be92e0fe0003f0ecbf3c65e8e4507 [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"
you.chen70f377f2023-04-14 18:17:09 +080025#include <sys/time.h>
26#include <asm/errno.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050027
qs.xiong1af5daf2022-03-14 09:12:12 -040028#ifdef __cplusplus
29extern "C" {
30#endif
31#ifdef __cplusplus
32}
33#endif
you.chen35020192022-05-06 11:30:57 +080034
qs.xiong9fbf74e2023-03-28 13:38:22 +080035#undef LOG_TAG
36#define LOG_TAG "LYNQ_WIFI"
you.chen35020192022-05-06 11:30:57 +080037#define MAX_CMD 128
38#define MAX_RET 4096
qs.xiongf1b525b2022-03-31 00:58:23 -040039#define MODE_LEN 10
you.chen35020192022-05-06 11:30:57 +080040#define CTRL_STA 0
41#define CTRL_AP 1
42#define AP_NETWORK_0 0
qs.xiongf71b53b2023-05-03 13:12:07 +080043#define STA_MAX_SAVED_AP_NUM 50
you.chen35020192022-05-06 11:30:57 +080044
45pthread_t g_ap_watcher_pid = 0;
46volatile int g_ap_watcher_stop_flag = 0;
you.chena6fa5b22022-05-18 10:28:19 +080047volatile int g_ap_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080048
49pthread_t g_sta_watcher_pid = 0;
50volatile int g_sta_watcher_stop_flag = 0;
you.chen9ac66392022-08-06 17:01:16 +080051volatile int g_sta_scan_finish_flag = 1;
you.chena6fa5b22022-05-18 10:28:19 +080052volatile int g_sta_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080053
54void * g_ap_callback_priv = NULL;
55AP_CALLBACK_FUNC_PTR g_ap_callback_func = NULL;
56void * g_sta_callback_priv = NULL;
57STA_CALLBACK_FUNC_PTR g_sta_callback_func = NULL;
58
59//const char * CTRL_PATH="/var/run/wpa_supplicant";
60const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/ap0"};
61//const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/wlan0"};
62const char * cmd_list_networks = "LIST_NETWORKS";
63const char * cmd_save_config = "SAVE_CONFIG";
you.chen6c2dd9c2022-05-16 17:55:28 +080064const char * cmd_disconnect = "DISCONNECT";
65const char * cmd_remove_all = "REMOVE_NETWORK all";
you.chen35020192022-05-06 11:30:57 +080066const char * state_scan_result = "CTRL-EVENT-SCAN-RESULTS";
you.chen9ac66392022-08-06 17:01:16 +080067const char * STATE_COMPLETED = "COMPLETED";
you.chen35020192022-05-06 11:30:57 +080068
you.chenf711c8a2023-04-13 13:49:45 +080069const char * cmd_ping = "PING";
70const char * rsp_pong = "PONG";
71const int SLEEP_TIME_ON_IDLE = 100 * 1000; // usecond
72const int MAX_IDLE_COUNT = 600; // 60s
73
you.chenc9928582023-04-24 15:39:37 +080074const char * start_wg870_service_script = "/etc/wg870/scripts/start_wg870_service.sh";
75const char * get_interface_name_script = "/etc/wg870/scripts/get_interface_name.sh";
76const char * start_stop_sta_script = "/etc/wg870/scripts/start_stop_sta.sh";
77const char * start_stop_ap_script = "/etc/wg870/scripts/start_stop_ap.sh";
78const char * sta_status_change_script = "/etc/wg870/scripts/sta_status_change.sh";
79
80static char s_ap_iterface_name[64] = {0};
81
you.chend2fef3f2023-02-13 10:50:35 +080082struct local_wpa_ctrl{
83 struct wpa_ctrl *ctrl;
84 pthread_mutex_t mutex;
85};
86
you.chen70f377f2023-04-14 18:17:09 +080087
you.chend2fef3f2023-02-13 10:50:35 +080088static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
89
90static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
you.chen35020192022-05-06 11:30:57 +080091
you.chen0f5c6432022-11-07 18:31:14 +080092//you.chen add for tv-box start
93volatile int g_gbw_enabled = 0;
94char * g_gbw_mac = NULL;
95pthread_t g_gbw_watcher_pid = 0;
96static int startGBW();
97static int stopGBW();
98//you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +080099
100typedef struct __curr_status_info {
101 ap_info_s *ap;
102 char * state;
103 int net_no;
104}curr_status_info;
qs.xiong97fa59b2022-04-07 05:41:29 -0400105
you.chen70f377f2023-04-14 18:17:09 +0800106typedef enum {
107 INNER_STA_STATUS_INIT = 0,
108 INNER_STA_STATUS_CONNECTING,
109 INNER_STA_STATUS_ASSOCIATING,
110 INNER_STA_STATUS_ASSOCIATED,
111 INNER_STA_STATUS_CONNECTED,
112 INNER_STA_STATUS_DISCONNECTING,
113 INNER_STA_STATUS_DISCONNECTED,
114 INNER_STA_STATUS_CANCEL,
115}inner_sta_status_s;
116
117static pthread_cond_t s_global_check_cond = PTHREAD_COND_INITIALIZER;
118static pthread_mutex_t s_global_check_mutex = PTHREAD_MUTEX_INITIALIZER;
119static inner_sta_status_s s_sta_status = INNER_STA_STATUS_INIT;
120static error_number_s s_sta_error_number = -1;
121static char s_sta_current_connecting_ssid[64] = {0};
122static struct timespec s_sta_connect_timeout;
123const int MAX_CONNNECT_TIME = 15; // second
124pthread_t g_global_watcher_pid = 0;
125static int s_service_invoke_timeout_cnt=0;
126const int FAKE_MAX_INT_VALUE = 99999;
127
128static void notify_service_invoke_fail(int error)
129{
130 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
131 pthread_mutex_lock(&s_global_check_mutex);
132 if (error == -2) //timeout
133 {
134 s_service_invoke_timeout_cnt++;
135 if (s_service_invoke_timeout_cnt > 10)
136 {
137 pthread_cond_signal(&s_global_check_cond);
138 }
139 }
140 else if (error == -1)
141 {
142 // check if can connect wpa service
143 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[0]);
144 if (lynq_wpa_ctrl == NULL)
145 {
146 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
147 pthread_cond_signal(&s_global_check_cond);
148 }
149 wpa_ctrl_close(lynq_wpa_ctrl);
150 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[1]);
151 if (lynq_wpa_ctrl == NULL)
152 {
153 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
154 pthread_cond_signal(&s_global_check_cond);
155 }
156 wpa_ctrl_close(lynq_wpa_ctrl);
157 }
158
159 pthread_mutex_unlock(&s_global_check_mutex);
160}
161
you.chenc9928582023-04-24 15:39:37 +0800162static int system_call_v(const char * fmt, ...)
163{
164 char str_cmd[256] = {0};
165 va_list args;
166 va_start(args, fmt);
167 vsprintf(str_cmd, fmt, args);
168 va_end(args);
169 printf("system call----------%s\n", str_cmd);
170 return system(str_cmd);
171}
172
you.chen70f377f2023-04-14 18:17:09 +0800173static void check_tether_and_notify()
174{
175 RLOGD("check_tether_and_notify called");
you.chenc9928582023-04-24 15:39:37 +0800176 if (s_ap_iterface_name[0] != '\0' && 0 == system_call_v("ifconfig | grep %s", s_ap_iterface_name))
you.chen70f377f2023-04-14 18:17:09 +0800177 {
178 return;
179 }
180 pthread_mutex_lock(&s_global_check_mutex);
181 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
182 pthread_cond_signal(&s_global_check_cond);
183 pthread_mutex_unlock(&s_global_check_mutex);
184}
185
you.chend2fef3f2023-02-13 10:50:35 +0800186static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
187 char *reply, size_t *reply_len,
188 void (*msg_cb)(char *msg, size_t len))
189{
190 int ret;
191 if (ctrl->ctrl == NULL) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800192 RLOGE("local_wpa_ctrl_request ctrl is null\n");
you.chend2fef3f2023-02-13 10:50:35 +0800193 return -1;
194 }
195 pthread_mutex_lock(&ctrl->mutex);
196 ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
197 pthread_mutex_unlock(&ctrl->mutex);
you.chen70f377f2023-04-14 18:17:09 +0800198 if (ret != 0)
199 {
200 notify_service_invoke_fail(ret);
201 }
you.chend2fef3f2023-02-13 10:50:35 +0800202 return ret;
203}
204
205static struct local_wpa_ctrl * inner_get_wpa_ctrl(int index) {
206 int repeat_cnt;
207 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
208 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800209 RLOGD("inner_get_wpa_ctrl\n");
you.chend2fef3f2023-02-13 10:50:35 +0800210 for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
211 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
212// printf("wait enable finish\n");
213 usleep(500 * 1000);
214 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
215 }
216 if (NULL == g_lynq_wpa_ctrl[index]) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800217 RLOGE("NULL == g_lynq_wpa_ctrl[index]");
you.chend2fef3f2023-02-13 10:50:35 +0800218 goto out_addr;
219 }
220 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
221 g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
222 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800223 RLOGE("wpa_ctrl_open fail\n");
you.chend2fef3f2023-02-13 10:50:35 +0800224 goto out_addr;
225 }
226 pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
227 }
228 lynq_wpa_ctrl = g_lynq_wpa_ctrl[index];
229out_addr:
230 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
231 return lynq_wpa_ctrl;
232}
233
qs.xiong97fa59b2022-04-07 05:41:29 -0400234#define PRINT_AND_RETURN_VALUE(str,value) \
qs.xiong97fa59b2022-04-07 05:41:29 -0400235{\
you.chen35020192022-05-06 11:30:57 +0800236 perror((str));\
237 return (value);\
qs.xiong97fa59b2022-04-07 05:41:29 -0400238}
239
you.chen35020192022-05-06 11:30:57 +0800240#define CHECK_IDX(idx, type) do { \
241 if ( (idx == LYNQ_WIFI_INTERFACE_0 && type != CTRL_STA) || (idx == LYNQ_WIFI_INTERFACE_1 && type != CTRL_AP) \
242 || idx < LYNQ_WIFI_INTERFACE_0 || idx > LYNQ_WIFI_INTERFACE_1 ) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800243 RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
you.chen35020192022-05-06 11:30:57 +0800244 return -1; \
245 } \
246 }while (0)
247
248#define CHECK_WPA_CTRL(index) int ret = 0;\
249 size_t reply_len = MAX_RET; \
250 char cmd_reply[MAX_RET]={0}; \
you.chend2fef3f2023-02-13 10:50:35 +0800251 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
you.chen35020192022-05-06 11:30:57 +0800252 do{ \
you.chend2fef3f2023-02-13 10:50:35 +0800253 lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
254 if (NULL == lynq_wpa_ctrl) return -1; \
you.chen35020192022-05-06 11:30:57 +0800255 }while(0)
256
257#define DO_REQUEST(cmd_str) do { \
258 reply_len = MAX_RET;\
259 cmd_reply[0] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800260 RLOGD("to call [%s]\n", cmd_str); \
you.chend2fef3f2023-02-13 10:50:35 +0800261 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 +0800262 if (ret != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800263 RLOGE("call "#cmd_str" fail %d\n", ret); \
you.chen35020192022-05-06 11:30:57 +0800264 return ret; \
265 } \
266 cmd_reply[reply_len+1] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800267 RLOGD("cmd replay [ %s ]\n", cmd_reply); \
you.chen35020192022-05-06 11:30:57 +0800268 }while(0)
269
270#define DO_OK_FAIL_REQUEST(cmd_str) do { \
271 DO_REQUEST(cmd_str); \
272 if (reply_len >=4 && memcmp(cmd_reply, "FAIL", 4) == 0 ) {\
qs.xiong9fbf74e2023-03-28 13:38:22 +0800273 RLOGE("cmd "#cmd_str" return FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800274 return -1; \
275 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800276 RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800277 return -1; \
278 } \
279 }while (0)
280
281
you.chend2fef3f2023-02-13 10:50:35 +0800282static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
you.chen35020192022-05-06 11:30:57 +0800283
you.chenf711c8a2023-04-13 13:49:45 +0800284static int check_connection(struct wpa_ctrl * wpa_ctrl)
285{
286 size_t reply_len = MAX_RET;
287 char cmd_reply[MAX_RET]={0};
288 int ret;
289
290 RLOGD("check_connection [%p]", wpa_ctrl);
291 ret = wpa_ctrl_request(wpa_ctrl, cmd_ping, strlen(cmd_ping), cmd_reply, &reply_len, NULL);
292
293 if (ret != 0 || reply_len < 4 || memcmp(cmd_reply, rsp_pong, 4) != 0)
294 {
295 RLOGE("check_connection error: ctrl [%p], ret [%d], reply_len [%d], rsp [%s]", wpa_ctrl, ret, reply_len, cmd_reply);
you.chen70f377f2023-04-14 18:17:09 +0800296 if (ret != 0)
297 {
298 notify_service_invoke_fail(ret);
299 }
you.chenf711c8a2023-04-13 13:49:45 +0800300 return -1;
301 }
302
303 return 0;
304}
305
306/**
307 * @brief check_pending_msg
308 * @param lynq_wpa_ctrl
309 * @return 1 has msg, 0 no msg, -1 error
310 */
311static int check_pending_msg(struct wpa_ctrl ** pp_lynq_wpa_ctrl, int type, int* idle_count, int *started_flag)
312{
313 int ret;
314
315 if (*pp_lynq_wpa_ctrl == NULL) // need connect
316 {
317 *pp_lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[type]); //@todo temp change
318 if (*pp_lynq_wpa_ctrl == NULL)
319 {
320 usleep(SLEEP_TIME_ON_IDLE);
321 return -1;
322 }
323
324 ret = wpa_ctrl_attach(*pp_lynq_wpa_ctrl);
325 if (ret == 0) // attach success
326 {
327 *started_flag = 1;
328 }
329 else
330 {
you.chen70f377f2023-04-14 18:17:09 +0800331 RLOGE("[wifi error]sta watch thread wpa_ctrl_attach fail");
you.chenf711c8a2023-04-13 13:49:45 +0800332 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
333 *pp_lynq_wpa_ctrl = NULL;
334 *idle_count = 0;
you.chen70f377f2023-04-14 18:17:09 +0800335 notify_service_invoke_fail(-2);
you.chenf711c8a2023-04-13 13:49:45 +0800336 usleep(SLEEP_TIME_ON_IDLE);
337 return -1;
338 }
339 }
340
341 ret = wpa_ctrl_pending(*pp_lynq_wpa_ctrl);
342 if ( ret == 0) // no pending messages
343 {
344 usleep(SLEEP_TIME_ON_IDLE);
345 *idle_count += 1;
346 if (*idle_count > MAX_IDLE_COUNT)
347 {
348 if (check_connection(*pp_lynq_wpa_ctrl) != 0)
349 {
350 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
351 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
352 *pp_lynq_wpa_ctrl = NULL;
353 *idle_count = 0;
354 return -1;
355 }
356 *idle_count = 0;
357 }
358 return 0;
359 }
360 else if ( ret == -1) // on error
361 {
362 RLOGE("[wifi error]sta wpa_ctrl_pending");
363 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
364 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
365 *pp_lynq_wpa_ctrl = NULL;
366 *idle_count = 0;
you.chen70f377f2023-04-14 18:17:09 +0800367 notify_service_invoke_fail(ret);
you.chenf711c8a2023-04-13 13:49:45 +0800368 return -1;
369 }
370
371 *idle_count = 0;
372 return 1;
373}
374
you.chen35020192022-05-06 11:30:57 +0800375static void APWatcherThreadProc() {
376 size_t len = MAX_RET;
377 char msg_notify[MAX_RET];
you.chenf711c8a2023-04-13 13:49:45 +0800378 int idle_count = 0;
you.chen35020192022-05-06 11:30:57 +0800379
you.chen6c2dd9c2022-05-16 17:55:28 +0800380 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800381 g_ap_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800382
qs.xiong9fbf74e2023-03-28 13:38:22 +0800383 while (g_ap_watcher_stop_flag == 0)
384 {
you.chenf711c8a2023-04-13 13:49:45 +0800385 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_AP, &idle_count, &g_ap_watcher_started_flag) != 1)
386 {
you.chen70f377f2023-04-14 18:17:09 +0800387 if (g_ap_callback_func != NULL && idle_count == MAX_IDLE_COUNT - 100 )
388 {
389 check_tether_and_notify();
390 }
391
you.chen35020192022-05-06 11:30:57 +0800392 continue;
393 }
you.chenf711c8a2023-04-13 13:49:45 +0800394
you.chen6c2dd9c2022-05-16 17:55:28 +0800395 memset(msg_notify, 0, MAX_RET);
396 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800397 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
you.chenf711c8a2023-04-13 13:49:45 +0800398 {
you.chen35020192022-05-06 11:30:57 +0800399 msg_notify[len+1] = '\0';
qs.xiong455c30b2023-04-12 11:40:02 +0800400 RLOGD("APWatcherThreadProc ap------> %s\n", msg_notify);
you.chenf711c8a2023-04-13 13:49:45 +0800401 //you.chen change for tv-box start
qs.xiong9fbf74e2023-03-28 13:38:22 +0800402 if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800403 {
you.chen0f5c6432022-11-07 18:31:14 +0800404 if (g_ap_callback_func != NULL)
405 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_DISCONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800406 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800407 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800408 RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
409 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800410 {
you.chen0f5c6432022-11-07 18:31:14 +0800411 stopGBW();
412 }
413 }
you.chen35020192022-05-06 11:30:57 +0800414 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800415 else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800416 {
you.chen0f5c6432022-11-07 18:31:14 +0800417 if (g_ap_callback_func != NULL)
418 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_CONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800419 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800420 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800421 RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
422 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800423 {
you.chen0f5c6432022-11-07 18:31:14 +0800424 startGBW();
425 }
426 }
you.chen35020192022-05-06 11:30:57 +0800427 }
you.chenf711c8a2023-04-13 13:49:45 +0800428 //you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +0800429 } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
430 } // end while (g_ap_watcher_stop_flag == 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800431 if (lynq_wpa_ctrl != NULL)
432 {
you.chen92fd5d32022-05-25 10:09:47 +0800433 wpa_ctrl_detach(lynq_wpa_ctrl);
434 wpa_ctrl_close(lynq_wpa_ctrl);
435 }
qs.xiong97fa59b2022-04-07 05:41:29 -0400436}
437
you.chen70f377f2023-04-14 18:17:09 +0800438static void inner_check_connect_error(const char * event_msg, lynq_wifi_sta_status_s state, error_number_s error_num)
439{
440 char * p;
441 const char * try_associat_flag = "Trying to associate";
442 const char * associated_flag = "Associated with ";
443
444 pthread_mutex_lock(&s_global_check_mutex);
445 if (s_sta_status < INNER_STA_STATUS_CONNECTING || s_sta_status >= INNER_STA_STATUS_CONNECTED) //not in connecting stage, egnore
446 {
447 pthread_mutex_unlock(&s_global_check_mutex);
448 return;
449 }
450
451 if (state == LYNQ_WIFI_STATUS_EGNORE)
452 {
453 if (strstr(event_msg, try_associat_flag) != NULL && strstr(event_msg, s_sta_current_connecting_ssid) != NULL) //associating request ssid
454 {
455 s_sta_status = INNER_STA_STATUS_ASSOCIATING;
456 }
457 else if (s_sta_status == INNER_STA_STATUS_ASSOCIATING && (p=strstr(event_msg, associated_flag)) != NULL)
458 {
459 s_sta_status = INNER_STA_STATUS_ASSOCIATED;
460 }
461 }
462 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
463 {
464 s_sta_error_number = error_num;
465 if (s_sta_status >= INNER_STA_STATUS_ASSOCIATING && strstr(event_msg, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL && error_num != LYNQ_WAIT_CONNECT_ACTIVE)
466 {
467 s_sta_status = INNER_STA_STATUS_DISCONNECTED;
468 pthread_cond_signal(&s_global_check_cond);
469 }
470 }
471 else if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
472 {
473 s_sta_status = INNER_STA_STATUS_CONNECTED;
474 pthread_cond_signal(&s_global_check_cond);
475 }
476 pthread_mutex_unlock(&s_global_check_mutex);
477}
478
qs.xiong455c30b2023-04-12 11:40:02 +0800479void get_state_error(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error)
480{
481 char *pReason;
482 *error = LYNQ_WAIT_CONNECT_ACTIVE;
483 if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
484 {
485 *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
486 RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d\n",*state,*error);
487 return;
488 }
489
490 if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
491 {
492 *state = LYNQ_WIFI_STA_STATUS_CONNECT;
493 RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
494 return;
495 }
496
497 if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
498 {
499 pReason = strstr(modify, "reason=");
500 if (pReason != NULL)
501 {
502 pReason += strlen("reason=");
503 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
504 {
505 *error = LYNQ_TIME_OUT;
506 }
507 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
508 {
509 *error = LYNQ_PSW_ERROR;
510 }
511 else
512 {
513 *error = LYNQ_UNSPECIFIED_REASON;
514 }
515 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
516 RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d\n",*state,*error);
517 return;
518 }
519 else
520 {
521 *error = LYNQ_UNSPECIFIED_REASON;
522 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
523 return;
524 }
525
526 }
527
528 if (strstr(modify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
529 {
530 *error = LYNQ_NOT_FIND_AP;
531 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
532 RLOGD("CTRL-EVENT-NETWORK-NOT-FOUND state:%d,error:%d\n",*state,*error);
533 return;
534 }
535
536
537 if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
538 {
539 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
540 pReason = strstr(modify, "status_code=");
541 if (pReason != NULL)
542 {
543 pReason += strlen("status_code=");
544 if (memcmp(pReason, "17", 2) == 0)
545 {
546 *error = LYNQ_AP_UNABLE_HANDLE;
547 }
548 else if (memcmp(pReason, "1",1) == 0)
549 {
550 *error = LYNQ_UNSPECIFIED_REASON;
551 }
552 else
553 {
554 *error = LYNQ_UNSPECIFIED_REASON;
555 }
556
557 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
558 RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d\n",*state,*error);
559 return;
560 }
561 else
562 {
563 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
564 *error = LYNQ_UNSPECIFIED_REASON;
565 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
566 RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d\n",*state,*error);
567 return;
568 }
569 }
570
571 if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
572 {
573 RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
574 *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
575 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
576 RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d\n",*state,*error);
577 return;
578 }
579
580 if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
581 {
582 RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
583 *error = LYNQ_WAIT_CONNECT_ACTIVE;
584 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
585 RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
586 return;
587 }
588
you.chen32cb31e2023-04-13 14:05:45 +0800589 RLOGD("EVENT : %s\n", modify);
qs.xiong455c30b2023-04-12 11:40:02 +0800590 *error = LYNQ_UNSPECIFIED_REASON;
you.chen32cb31e2023-04-13 14:05:45 +0800591 *state = LYNQ_WIFI_STATUS_EGNORE;
qs.xiong455c30b2023-04-12 11:40:02 +0800592 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
593 return;
594
595}
596
you.chen70f377f2023-04-14 18:17:09 +0800597static void notify_connect_status(lynq_wifi_sta_status_s state, error_number_s error)
598{
599 if (g_sta_callback_func != NULL && state != LYNQ_WIFI_STATUS_EGNORE)
600 {
601 RLOGD("STAWatcherThreadProc callback begin ------> %d %d\n", state, error);
602 g_sta_callback_func(g_sta_callback_priv, state, error);
603 RLOGD("STAWatcherThreadProc callback end ------> %d %d\n", state, error);
604 }
605}
606
you.chen35020192022-05-06 11:30:57 +0800607static void STAWatcherThreadProc() {
608 size_t len = MAX_RET;
609 char msg_notify[MAX_RET];
you.chen35020192022-05-06 11:30:57 +0800610 error_number_s error;
you.chenc9928582023-04-24 15:39:37 +0800611 lynq_wifi_sta_status_s state, last_state = -1;
you.chenf711c8a2023-04-13 13:49:45 +0800612 int idle_count = 0;
qs.xiongf1b525b2022-03-31 00:58:23 -0400613
you.chen6c2dd9c2022-05-16 17:55:28 +0800614 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800615 g_sta_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800616
you.chen70f377f2023-04-14 18:17:09 +0800617 RLOGD("STAWatcherThreadProc thread started ------");
qs.xiong9fbf74e2023-03-28 13:38:22 +0800618 while (g_sta_watcher_stop_flag == 0)
619 {
you.chenf711c8a2023-04-13 13:49:45 +0800620 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
qs.xiong455c30b2023-04-12 11:40:02 +0800621 {
you.chen35020192022-05-06 11:30:57 +0800622 continue;
623 }
you.chenf711c8a2023-04-13 13:49:45 +0800624
you.chen6c2dd9c2022-05-16 17:55:28 +0800625 memset(msg_notify, 0, MAX_RET);
626 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800627 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiong455c30b2023-04-12 11:40:02 +0800628 {
you.chen35020192022-05-06 11:30:57 +0800629 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800630 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
631 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800632 {
you.chen35020192022-05-06 11:30:57 +0800633 g_sta_scan_finish_flag = 1;
634 }
635
qs.xiong9fbf74e2023-03-28 13:38:22 +0800636 if (g_sta_callback_func == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800637 {
you.chen35020192022-05-06 11:30:57 +0800638 continue;
639 }
qs.xiong455c30b2023-04-12 11:40:02 +0800640 get_state_error(msg_notify,&state,&error);
you.chen70f377f2023-04-14 18:17:09 +0800641 notify_connect_status(state, error);
642
643 if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
you.chen32cb31e2023-04-13 14:05:45 +0800644 {
you.chen70f377f2023-04-14 18:17:09 +0800645 inner_check_connect_error(msg_notify, state, error);
you.chenc9928582023-04-24 15:39:37 +0800646 if (last_state != state)
647 {
648 if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
649 {
650 system_call_v("%s %s", sta_status_change_script, "connect");
651 }
652 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
653 {
654 system_call_v("%s %s", sta_status_change_script, "disconnect");
655 }
656 }
657
658 last_state = state;
you.chen32cb31e2023-04-13 14:05:45 +0800659 }
you.chen35020192022-05-06 11:30:57 +0800660 }
661 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800662 if (lynq_wpa_ctrl != NULL)
663 {
you.chen92fd5d32022-05-25 10:09:47 +0800664 wpa_ctrl_detach(lynq_wpa_ctrl);
665 wpa_ctrl_close(lynq_wpa_ctrl);
666 }
qs.xiongf1b525b2022-03-31 00:58:23 -0400667}
668
you.chen70f377f2023-04-14 18:17:09 +0800669// this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
670static void GlobalWatcherThreadProc()
671{
672 int ret, connect_timeout, service_abnormal;
673 error_number_s error_num = -1;
674 inner_sta_status_s sta_status;
675 scan_info_s *scan_list = NULL;
676 int i, scan_len=0;
677 char connecting_ssid[64];
678 struct timeval now;
679
680 RLOGD("GlobalWatcherThreadProc start to run");
681
682 while (1)
683 {
684 pthread_mutex_lock(&s_global_check_mutex);
685 pthread_cond_wait(&s_global_check_cond,&s_global_check_mutex);
686 if (s_sta_status == INNER_STA_STATUS_CONNECTED)
687 {
688 pthread_mutex_unlock(&s_global_check_mutex);
689 usleep(50*1000);
690 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
691 continue;
692 }
693
694 connect_timeout = 0;
695 service_abnormal = 0;
696 if (s_sta_status >= INNER_STA_STATUS_CONNECTING && s_sta_status < INNER_STA_STATUS_CONNECTED)
697 {
698 while (1)
699 {
700 ret = pthread_cond_timedwait(&s_global_check_cond, &s_global_check_mutex, &s_sta_connect_timeout);
701 if (ret == ETIME)
702 {
703 connect_timeout = 1;
704 }
705 else if (ret != 0)
706 {
707 gettimeofday(&now,NULL);
708 if (now.tv_sec < s_sta_connect_timeout.tv_sec) //time not arrive
709 {
710 usleep(SLEEP_TIME_ON_IDLE);
711 continue;
712 }
713 connect_timeout = 1;
714 }
715 sta_status = s_sta_status;
716 error_num = s_sta_error_number;
717 s_sta_status = INNER_STA_STATUS_INIT;
718 strcpy(connecting_ssid, s_sta_current_connecting_ssid);
719 memset(&s_sta_connect_timeout, 0, sizeof (s_sta_connect_timeout));
720 memset(&s_sta_current_connecting_ssid, 0, sizeof (s_sta_current_connecting_ssid));
721 break;
722 }
723 }
724 if (s_service_invoke_timeout_cnt > 10)
725 {
726 service_abnormal = 1;
727 s_service_invoke_timeout_cnt = 0;
728 }
729 pthread_mutex_unlock(&s_global_check_mutex);
730
731 if (service_abnormal == 1)
732 {
733 sleep(1);
734 RLOGE("wpa service is abnormal info app to exit");
735 notify_connect_status(LYNQ_WIFI_STA_SERVICE_ABNORMAL, -1);
736 if (g_ap_callback_func != NULL)
737 {
738 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_SERVICE_ABNORMAL);
739 }
740 sleep(FAKE_MAX_INT_VALUE); // wait process to exit
741 }
742
743 if (sta_status == INNER_STA_STATUS_CANCEL)
744 {
745 continue;
746 }
747 else if (sta_status == INNER_STA_STATUS_CONNECTED)
748 {
749 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
750 }
751 else if (connect_timeout == 0 && error_num == LYNQ_NOT_FIND_AP) // not found ap maybe mismatch auth
752 {
753 if (0 == lynq_get_scan_list(0, &scan_list, &scan_len) && NULL != scan_list) // if not found, but scan result exist, maybe auth error
754 {
755 for(i=0; i < scan_len;i++)
756 {
757 if (strcmp(scan_list[i].ssid, connecting_ssid) == 0)
758 {
759 error_num = LYNQ_AUTH_ERROR;
760 break;
761 }
762 }
763 free(scan_list);
764 }
765 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
766 }
767 else if (connect_timeout == 0)
768 {
769 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
770 }
771 else // wait timeout
772 {
773 if (0 != lynq_get_sta_status(LYNQ_WIFI_INTERFACE_0, &sta_status)) // get status fail
774 {
775 ; // wpa service abnormal
776 }
777 else if (sta_status == LYNQ_WIFI_STA_STATUS_ENABLE) // connect ok
778 {
779 RLOGD("GlobalWatcherThreadProc notify connected");
780 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
781 }
782 else
783 {
784 RLOGD("GlobalWatcherThreadProc notify timeout");
785 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, LYNQ_TIME_OUT);
786 }
787 }
788 } // while (1)
789}
790
qs.xiong1af5daf2022-03-14 09:12:12 -0400791int lynq_wifi_enable(void)
792{
you.chen35020192022-05-06 11:30:57 +0800793 int ret = 0;
you.chen6c2dd9c2022-05-16 17:55:28 +0800794 int i;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800795 RLOGD("enter lynq_wifi_enable");
you.chend2fef3f2023-02-13 10:50:35 +0800796 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
797
qs.xiong9fbf74e2023-03-28 13:38:22 +0800798 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
799 {
you.chend2fef3f2023-02-13 10:50:35 +0800800 goto out_enable;
801 }
802
you.chenc9928582023-04-24 15:39:37 +0800803 ret = system(start_wg870_service_script);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800804 if (ret != 0)
805 {
806 //printf("service state %d\n", ret);
807 RLOGE("[wifi error]service state %d",ret);
you.chend2fef3f2023-02-13 10:50:35 +0800808 ret = -1;
809 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800810 }
lhfe8da902022-10-11 18:55:36 +0800811
you.chen70f377f2023-04-14 18:17:09 +0800812 if (g_global_watcher_pid == 0 ) // this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
813 {
814 ret=pthread_create(&g_global_watcher_pid,NULL,GlobalWatcherThreadProc,NULL);
815 if(ret<0)
816 {
817 RLOGE("[wifi error]creat GlobalWatcherThreadProc fail");
818 ret = -1;
819 goto out_enable;
820 }
821 }
822
you.chend2fef3f2023-02-13 10:50:35 +0800823 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
824 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
825 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
826 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
827out_enable:
828 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800829 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500830}
831
qs.xiong1af5daf2022-03-14 09:12:12 -0400832int lynq_wifi_disable(void)
833{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800834 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800835 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800836 g_ap_watcher_stop_flag = 1;
837 g_sta_watcher_stop_flag = 1;
838 if (g_ap_watcher_pid != 0)
839 pthread_join(g_ap_watcher_pid, NULL);
840 if (g_sta_watcher_pid != 0)
841 pthread_join(g_sta_watcher_pid, NULL);
842 if (g_lynq_wpa_ctrl[0] != NULL)
843 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
844 if (g_lynq_wpa_ctrl[1] != NULL)
845 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
846 g_ap_watcher_pid = 0;
847 g_sta_watcher_pid = 0;
848 g_lynq_wpa_ctrl[0] = NULL;
849 g_lynq_wpa_ctrl[1] = NULL;
850 system("systemctl stop wg870_drv_insmod.service");
you.chend2fef3f2023-02-13 10:50:35 +0800851 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
852 return 0;
853}
854
855static inline char inner_convert_char(char in)
856{
857 if (in >= '0' && in <= '9')
858 {
859 return in - '0';
860 }
861 else if (in >= 'a' && in <= 'f')
862 {
863 return in - 'a' + 10;
864 }
865 else if (in >= 'A' && in <= 'F')
866 {
867 return in - 'A' + 10;
868 }
869 else
870 {
871 return '\xff';
872 }
873}
874
875static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
876{
877 char *p;
878 size_t pos = 0;
879 if (NULL == out_ssid)
880 return;
881 //printf("input ssid=[%s]\n", ssid);
882 memset(out_ssid, 0, out_ssid_len);
883 if (NULL == ssid)
884 return;
885 p = strchr(ssid, '\\');
886 if (NULL == p)
887 {
888 strncpy(out_ssid, ssid, out_ssid_len);
889 //printf(" first %s\n", out_ssid);
890 }
891 else
892 {
893 pos = p - ssid;
894 memcpy(out_ssid, ssid, pos);
895 //printf("pos %lu -- %s\n", pos, out_ssid);
896 for(; pos < out_ssid_len; pos ++)
897 {
898 if (p[0] == '\0')
899 {
900 //printf(" out %s\n", out_ssid);
901 return;
902 }
903 else if (p[0] != '\\')
904 {
905 out_ssid[pos] = p[0];
906 p += 1;
907 }
908 else if (p[1] == 'x' || p[1] == 'X')
909 {
910 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
911 p += 4;
912 }
913 else if (p[1] == '\\')
914 {
915 out_ssid[pos] = '\\';
916 p += 2;
917 }
918 else if (p[1] == 't')
919 {
920 out_ssid[pos] = '\t';
921 p += 2;
922 }
923 else if (p[1] == 'r')
924 {
925 out_ssid[pos] = '\r';
926 p += 2;
927 }
928 else if (p[1] == 'n')
929 {
930 out_ssid[pos] = '\n';
931 p += 2;
932 }//todo find a better way to convert?
933 }
934 }
935 //printf(" out %s\n", out_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -0500936}
qs.xiong1af5daf2022-03-14 09:12:12 -0400937
you.chen35020192022-05-06 11:30:57 +0800938static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +0800939 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +0800940 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +0800941 RLOGD("enter inner_get_param");
942 if (out_put == NULL)
943 {
944 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +0800945 return -1;
946 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800947 if (param_name == NULL)
948 {
949 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +0800950 return -1;
951 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800952 if (param_name[0] == '\0')
953 {
954 RLOGE("param is empty");
you.chen35020192022-05-06 11:30:57 +0800955 return -1;
956 }
957
958 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
959
960 CHECK_WPA_CTRL(interface);
961
962 DO_REQUEST(lynq_cmd_get);
963
qs.xiong9fbf74e2023-03-28 13:38:22 +0800964 if (memcmp(cmd_reply, "FAIL", 4) == 0)
965 {
966 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +0800967 return -1;
968 }
969
you.chena6fa5b22022-05-18 10:28:19 +0800970// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +0800971 if (strcmp(param_name, "ssid") == 0)
972 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800973 if (cmd_reply[0] == '\"')
974 {
you.chend2fef3f2023-02-13 10:50:35 +0800975 ssid_len = reply_len - 1;
976 memcpy(out_put, cmd_reply + 1, ssid_len);
977 if (out_put[ssid_len-1] == '\"')
978 {
979 out_put[ssid_len-1] = '\0';
980 }
981 else
982 {
983 out_put[ssid_len] = '\0';
984 }
985 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800986 else
987 {
you.chend2fef3f2023-02-13 10:50:35 +0800988 ssid_len = reply_len / 2;
989 for(i=0; i<ssid_len; i++)
990 {
991 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
992 }
993 out_put[ssid_len] = '\0';
994 }
995 }
996 else
997 {
998 memcpy(out_put, cmd_reply, reply_len + 1);
999 }
you.chen35020192022-05-06 11:30:57 +08001000 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001001}
qs.xiong1af5daf2022-03-14 09:12:12 -04001002
you.chen35020192022-05-06 11:30:57 +08001003static int lynq_split(char * str, int len, char delimiter, char * results[]) {
1004 int ret = 0;
1005 char * end = str + len - 1;
1006 results[ret++] = str;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001007 while(str < end)
1008 {
1009 if (*str == delimiter)
1010 {
you.chen35020192022-05-06 11:30:57 +08001011 *str++ = '\0';
1012 results[ret++] = str;
1013 continue;
1014 }
1015 str++;
1016 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001017 if (*str == delimiter)
1018 {
you.chen35020192022-05-06 11:30:57 +08001019 *str = '\0';
1020 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001021
you.chen6ed36a62023-04-27 17:51:56 +08001022 results[ret] = NULL;
1023
you.chen35020192022-05-06 11:30:57 +08001024 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001025}
1026
you.chend2fef3f2023-02-13 10:50:35 +08001027static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
1028{
1029 char * p;
1030 int ret = 0;
1031 char cmd[256]={0};
1032 if (NULL == mac || NULL == ip)
you.chen35020192022-05-06 11:30:57 +08001033 return -1;
you.chend2fef3f2023-02-13 10:50:35 +08001034 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +08001035 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-02-13 10:50:35 +08001036 ret = exec_cmd(cmd, ip, ip_len);
1037 p = strchr(ip, '\n');
1038 if (NULL != p)
1039 {
1040 *p = '\0';
you.chen35020192022-05-06 11:30:57 +08001041 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001042 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +08001043 return ret;
1044}
1045
you.chend2fef3f2023-02-13 10:50:35 +08001046static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +08001047 struct in_addr addr ={0};
1048 struct hostent *ht;
1049
qs.xiong9fbf74e2023-03-28 13:38:22 +08001050 if (ip == NULL || *ip == '\0' || hostname == NULL)
1051 {
1052 RLOGE("ip == NULL or hostname == NULL");
1053 return -1;
you.chen35020192022-05-06 11:30:57 +08001054 }
1055
you.chend2fef3f2023-02-13 10:50:35 +08001056 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08001057 if (inet_aton(ip, &addr) == 0)
1058 {
you.chen35020192022-05-06 11:30:57 +08001059 printf("---inet_aton fail\n");
1060 return -1;
1061 }
1062
1063 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
1064
qs.xiong9fbf74e2023-03-28 13:38:22 +08001065 if (ht == NULL)
1066 {
1067 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-05-06 11:30:57 +08001068 herror(NULL);
1069 return -1;
1070 }
1071
1072 strcpy(hostname, ht->h_name);
1073
1074 return 0;
1075}
1076
1077static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
1078{
1079 int count, index, words_count;
1080 char * split_lines[128]= {0};
1081 char * split_words[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08001082 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +08001083 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001084 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-05-06 11:30:57 +08001085
1086 CHECK_WPA_CTRL(ap_sta);
1087
1088 DO_REQUEST(lynq_wifi_list_networks);
1089
1090 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1091
1092 //@todo check ssid field to compatible
1093
1094 ret = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001095 for(index=1; index < count; index++)
1096 {
you.chen35020192022-05-06 11:30:57 +08001097 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001098 if (words_count > 2)
1099 {
you.chend2fef3f2023-02-13 10:50:35 +08001100 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001101 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
1102 {
you.chen35020192022-05-06 11:30:57 +08001103 net_no_list[ret++] = atoi(split_words[0]);
1104 }
1105 }
1106 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001107 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +08001108 return ret;
1109}
1110
1111static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001112 size_t i=0;
you.chen35020192022-05-06 11:30:57 +08001113 CHECK_WPA_CTRL(ap_sta);
1114 const char *lynq_wifi_add_network = "ADD_NETWORK";
1115
qs.xiong9fbf74e2023-03-28 13:38:22 +08001116 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +08001117 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001118 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1119 {
1120 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen35020192022-05-06 11:30:57 +08001121 return -1;
1122 }
1123
qs.xiong9fbf74e2023-03-28 13:38:22 +08001124 for(i=0;i<reply_len;i++)
1125 {
1126 if(cmd_reply[i] == '\n')
1127 {
you.chen35020192022-05-06 11:30:57 +08001128 cmd_reply[i] = '\0';
1129 break;
1130 }
1131 }
1132 return atoi(cmd_reply);
1133}
you.chena6cd55a2022-05-08 12:20:18 +08001134
you.chen35020192022-05-06 11:30:57 +08001135static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
1136{
1137 int count, index;
1138 int net_no_list[128];
1139
qs.xiong9fbf74e2023-03-28 13:38:22 +08001140 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +08001141 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001142 for (index=0; index < count; index++)
1143 {
1144 if (net_no_list[index] == net_no)
1145 {
you.chen35020192022-05-06 11:30:57 +08001146 return 0;
1147 }
1148 }
1149
1150 if (count >= 1)
1151 index = net_no_list[count - 1];
1152 else
1153 index = -1;
1154
qs.xiong9fbf74e2023-03-28 13:38:22 +08001155 while (index < net_no )
1156 {
you.chen35020192022-05-06 11:30:57 +08001157 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001158 if (index >= net_no)
1159 { // required network no created
1160 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +08001161 return 0;
1162 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001163 else if( index < 0)
1164 {
1165 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +08001166 return -1;
1167 }
you.chen35020192022-05-06 11:30:57 +08001168 }
1169
1170 if (index < 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001171 {
1172 RLOGE("[lynq_check_network_number] network index < 0");
1173 return -1;
1174 }
1175 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen35020192022-05-06 11:30:57 +08001176 return 0;
1177}
1178
1179static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +08001180 if (freq > 5000 && freq < 6000)
1181 {
you.chen35020192022-05-06 11:30:57 +08001182 return LYNQ_WIFI_5G_band;
1183 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001184 else if (freq > 2000 && freq < 3000)
1185 {
you.chen35020192022-05-06 11:30:57 +08001186 return LYNQ_WIFI_2G_band;
1187 }
1188 return LYNQ_WIFI_2_and_5G_band;
1189}
1190
1191static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001192 if (key_mgmt != NULL)
1193 {
1194 if (memcmp( key_mgmt, "NONE", 4) == 0)
1195 {
you.chen35020192022-05-06 11:30:57 +08001196 return LYNQ_WIFI_AUTH_OPEN;
1197 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001198 else if (memcmp( key_mgmt, "WEP", 3) == 0)
1199 {
you.chen35020192022-05-06 11:30:57 +08001200 return LYNQ_WIFI_AUTH_WEP;
1201 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001202 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
1203 {
you.chen35020192022-05-06 11:30:57 +08001204 return LYNQ_WIFI_AUTH_WPA_PSK;
1205 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001206 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
1207 {
you.chen35020192022-05-06 11:30:57 +08001208 return LYNQ_WIFI_AUTH_WPA2_PSK;
1209 }
1210 }
1211
1212 return -1;
1213}
1214
1215static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001216 if (flag != NULL)
1217 {
qs.xiong3e506812023-04-06 11:08:48 +08001218 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
1219 {
1220 return LYNQ_WIFI_AUTH_WPA3_PSK;
1221 }else if ( strstr( flag,"SAE-CCMP") != NULL )
1222 {
1223 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
1224 }else if (strstr( flag, "WPA2-PSK") != NULL)
1225 {
you.chen35020192022-05-06 11:30:57 +08001226 return LYNQ_WIFI_AUTH_WPA2_PSK;
1227 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001228 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001229 {
you.chen35020192022-05-06 11:30:57 +08001230 return LYNQ_WIFI_AUTH_WPA_PSK;
1231 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001232 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001233 {
you.chen35020192022-05-06 11:30:57 +08001234 return LYNQ_WIFI_AUTH_WEP;
1235 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001236 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001237 {
you.chen35020192022-05-06 11:30:57 +08001238 return LYNQ_WIFI_AUTH_OPEN;
1239 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001240 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +08001241 {
you.chend2fef3f2023-02-13 10:50:35 +08001242 return LYNQ_WIFI_AUTH_OPEN;
1243 }
you.chen35020192022-05-06 11:30:57 +08001244 }
1245
1246 return -1;
1247}
1248
1249static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
1250 switch (bw) {
1251 case 10:
1252 return LYNQ_WIFI_BANDWIDTH_HT10;
1253 break;
1254 case 20:
1255 return LYNQ_WIFI_BANDWIDTH_HT20;
1256 break;
1257 case 40:
1258 return LYNQ_WIFI_BANDWIDTH_HT40;
1259 break;
1260 case 80:
1261 return LYNQ_WIFI_BANDWIDTH_HT80;
1262 break;
1263 default:
1264 break;
1265 }
1266
1267 return -1;
1268}
1269
you.chen70f377f2023-04-14 18:17:09 +08001270static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth);
you.chen35020192022-05-06 11:30:57 +08001271static int inner_get_status_info(int interface, curr_status_info *curr_state) {
1272 int i, count;
1273 char *p;
1274 const char *lynq_status_cmd = "STATUS";
1275 const char * FLAG_SSID = "ssid=";
1276 const char * FLAG_SBSID = "bssid=";
1277 const char * FLAG_KEY_MGMT = "key_mgmt=";
1278 const char * FLAG_FREQ = "freq=";
1279 const char * FLAG_STATE = "wpa_state=";
1280 const char * FLAG_ID = "id=";
you.chend2fef3f2023-02-13 10:50:35 +08001281 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +08001282 char *split_lines[128] = {0};
1283
1284 CHECK_WPA_CTRL(interface);
1285
qs.xiong9fbf74e2023-03-28 13:38:22 +08001286 if (curr_state == NULL)
1287 {
1288 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-05-06 11:30:57 +08001289 return -1;
1290 }
1291
1292 DO_REQUEST(lynq_status_cmd);
1293
1294 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1295
1296 curr_state->net_no = -1;
1297 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001298 for(i=0; i < count; i++)
1299 {
1300 if (curr_state->ap != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001301 {
you.chen35020192022-05-06 11:30:57 +08001302 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001303 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001304 {
you.chend2fef3f2023-02-13 10:50:35 +08001305 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +08001306 ret = 0;
1307 continue;
1308 }
you.chenf58b3c92022-06-21 16:53:48 +08001309 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001310 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001311 {
you.chend2fef3f2023-02-13 10:50:35 +08001312 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 +08001313 ret = 0;
1314 continue;
1315 }
you.chen35020192022-05-06 11:30:57 +08001316 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001317 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001318 {
you.chen450d0172022-07-15 17:56:48 +08001319 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001320 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +08001321 ret = 0;
1322 continue;
1323 }
1324 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001325 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001326 {
you.chen35020192022-05-06 11:30:57 +08001327 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1328 ret = 0;
1329 continue;
1330 }
you.chend2fef3f2023-02-13 10:50:35 +08001331 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001332 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001333 {
you.chend2fef3f2023-02-13 10:50:35 +08001334 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1335 ret = 0;
1336 continue;
1337 }
you.chen35020192022-05-06 11:30:57 +08001338 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001339 if (curr_state->state != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001340 {
you.chen35020192022-05-06 11:30:57 +08001341 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001342 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001343 {
you.chen35020192022-05-06 11:30:57 +08001344 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1345 ret = 0;
1346 continue;
1347 }
1348
1349 } //end else if (state != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001350 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
you.chen70f377f2023-04-14 18:17:09 +08001351 {
you.chen35020192022-05-06 11:30:57 +08001352 ret = 0;
you.chen450d0172022-07-15 17:56:48 +08001353 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001354 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +08001355 }
1356 }
1357
you.chen70f377f2023-04-14 18:17:09 +08001358 if (ret == 0 && curr_state->ap != NULL && curr_state->net_no >= 0) // auth may not right when add wpa3
1359 {
1360 inner_get_network_auth(interface, curr_state->net_no, &curr_state->ap->auth);
1361 }
1362
you.chen35020192022-05-06 11:30:57 +08001363 return ret;
1364}
1365
qs.xiongf1b525b2022-03-31 00:58:23 -04001366int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001367{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001368 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +08001369 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -05001370
qs.xiong9fbf74e2023-03-28 13:38:22 +08001371 if (ap_ssid == NULL)
1372 {
1373 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +08001374 return -1;
1375 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001376 else
1377 {
1378 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen35020192022-05-06 11:30:57 +08001379 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001380
qs.xiong9fbf74e2023-03-28 13:38:22 +08001381 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1382 {
1383 RLOGE("Do check ap network_number fail");
you.chen35020192022-05-06 11:30:57 +08001384 return -1;
1385 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001386
you.chen35020192022-05-06 11:30:57 +08001387 CHECK_IDX(idx, CTRL_AP);
1388
1389 CHECK_WPA_CTRL(CTRL_AP);
1390
1391 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1392
1393 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1394 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001395 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1396 return 0;
you.chen35020192022-05-06 11:30:57 +08001397
qs.xiong7a105ce2022-03-02 09:43:11 -05001398}
1399
you.chen35020192022-05-06 11:30:57 +08001400int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001401{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001402 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001403 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001404 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001405}
1406
qs.xiongc9c79f72022-10-17 15:27:18 +08001407/*****
1408 *frequency <------>channel
1409 *
1410 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1411 *
1412 *
1413 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1414 *
1415 *
1416 * */
1417static int lynq_check_set_frequency(int input_frequency){
qs.xiongc00b6032022-11-29 16:28:03 +08001418 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};
1419 int i;
1420 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1421
qs.xiong69a332b2022-12-02 09:58:57 +08001422 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001423 {
1424 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001425 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001426 }
qs.xiongc00b6032022-11-29 16:28:03 +08001427
1428 if(i == arr_len)
1429 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001430 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001431 return -1;
1432 }
qs.xiongc00b6032022-11-29 16:28:03 +08001433
qs.xiongc9c79f72022-10-17 15:27:18 +08001434 return 0;
1435}
qs.xiong13673462023-02-21 19:12:54 +08001436
1437static int lynq_check_frequencyby_country_code(int input_frequency)
1438{
1439 char str_cnc[]="CN";
1440 char str_dest[20]="";
1441
1442 if( lynq_get_country_code(1,str_dest) != 0 )
1443 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001444 RLOGE("get country_code error\n");
qs.xiong13673462023-02-21 19:12:54 +08001445 return -1;
1446 }
1447 if( strncmp(str_dest,str_cnc,2) != 0 )
1448 {
1449 return 0;
1450 }else if( 2473 < input_frequency && input_frequency < 5744)
1451 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001452 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001453 return -1;
1454 }
1455 return 0;
1456}
qs.xiongf1b525b2022-03-31 00:58:23 -04001457int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001458{
qs.xiongc00b6032022-11-29 16:28:03 +08001459 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001460 char lynq_wifi_frequency_cmd[128]={0};
1461 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001462 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001463 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001464 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001465 check = lynq_check_set_frequency(lynq_wifi_frequency);
1466 if(check != 0)
1467 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001468 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001469 return -1;
you.chen35020192022-05-06 11:30:57 +08001470 }
qs.xiong13673462023-02-21 19:12:54 +08001471 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1472 if(check != 0)
1473 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001474 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001475 return -1;
1476 }
1477
qs.xiongc00b6032022-11-29 16:28:03 +08001478 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1479 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001480 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001481 return -1;
1482 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001483
you.chen35020192022-05-06 11:30:57 +08001484 CHECK_IDX(idx, CTRL_AP);
1485
1486 CHECK_WPA_CTRL(CTRL_AP);
1487
1488 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1489 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1490 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1491
you.chen6c2dd9c2022-05-16 17:55:28 +08001492 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-05-06 11:30:57 +08001493 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1494 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1495 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001496
qs.xiong9fbf74e2023-03-28 13:38:22 +08001497 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001498}
1499
qs.xiongf1b525b2022-03-31 00:58:23 -04001500int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001501{
you.chen35020192022-05-06 11:30:57 +08001502 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001503 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001504 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001505
qs.xiong9fbf74e2023-03-28 13:38:22 +08001506 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1507 {
1508 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen35020192022-05-06 11:30:57 +08001509 return -1;
1510 }
1511 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001512
qs.xiong9fbf74e2023-03-28 13:38:22 +08001513 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001514}
1515
qs.xiongf1b525b2022-03-31 00:58:23 -04001516int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1517{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001518 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001519 CHECK_IDX(idx, CTRL_AP);
1520 switch(bandwidth){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001521 case LYNQ_WIFI_BANDWIDTH_HT10:
1522 {
1523 RLOGE("bandwith [%d] not support now\n", bandwidth);
1524 return -1;
1525 }
1526 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen35020192022-05-06 11:30:57 +08001527 {
1528 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1529 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001530 if (system(lynq_cmd_bandwith) != 0 )
1531 {
1532 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001533 return -1;
1534 }
1535 system("wl up");
1536 break;
1537 }
1538 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001539 {
qs.xiong10379192023-02-21 13:19:42 +08001540 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001541 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1542 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001543 if (system(lynq_cmd_bandwith) != 0 )
1544 {
1545 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001546 return -1;
1547 }
1548 system("wl up");
1549 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001550 }
you.chen35020192022-05-06 11:30:57 +08001551 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001552 {
qs.xiong10379192023-02-21 13:19:42 +08001553 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001554 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001555 if (system(lynq_cmd_bandwith) != 0 )
1556 {
1557 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001558 return -1;
1559 }
1560 system("wl up");
1561 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001562 }
1563 default:
you.chen35020192022-05-06 11:30:57 +08001564 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001565 RLOGE("auth type [%d] not support now\n", bandwidth);
1566 return -1;
you.chen35020192022-05-06 11:30:57 +08001567 }
1568 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001569
1570
you.chen35020192022-05-06 11:30:57 +08001571 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001572}
you.chen35020192022-05-06 11:30:57 +08001573
qs.xiongf1b525b2022-03-31 00:58:23 -04001574int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1575{
you.chen35020192022-05-06 11:30:57 +08001576 int count = 0;
1577 int index = 0;
1578 char *split_words[128] = {0};
1579 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001580 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001581 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001582
you.chen35020192022-05-06 11:30:57 +08001583 CHECK_WPA_CTRL(CTRL_AP);
1584
1585 DO_REQUEST(lynq_chanspec_cmd);
1586
1587 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1588 for(;index < count; index++) {
1589 if (strncmp(split_words[index], "bw", 2) != 0) {
1590 continue;
1591 }
1592
1593 index++;
1594 if (index >= count) {
1595 return -1;
1596 }
1597
qs.xiong9fbf74e2023-03-28 13:38:22 +08001598 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001599 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1600 return 0;
1601 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001602 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001603 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001604}
qs.xiong0fb469a2022-04-14 03:50:45 -04001605
qs.xiongf1b525b2022-03-31 00:58:23 -04001606int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001607{
you.chen35020192022-05-06 11:30:57 +08001608 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001609 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001610 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001611
you.chen35020192022-05-06 11:30:57 +08001612 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001613
qs.xiong9fbf74e2023-03-28 13:38:22 +08001614 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1615 {
you.chen35020192022-05-06 11:30:57 +08001616 return -1;
1617 }
1618
1619 system("wl down");
1620 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001621 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001622 return -1;
1623 }
1624 system("wl up");
1625 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001626}
qs.xiong0fb469a2022-04-14 03:50:45 -04001627
qs.xiongf1b525b2022-03-31 00:58:23 -04001628int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001629{
you.chen35020192022-05-06 11:30:57 +08001630 int count = 0;
1631 int index = 0;
1632 char *split_words[128] = {0};
1633 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001634 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001635 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001636
you.chen35020192022-05-06 11:30:57 +08001637 CHECK_WPA_CTRL(CTRL_AP);
1638
1639 DO_REQUEST(lynq_chanspec_cmd);
1640
1641 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001642 for(;index < count; index++)
1643 {
1644 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001645 if (strncmp(split_words[index], "channel", 2) != 0) {
1646 continue;
1647 }
1648
1649 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001650 if (index >= count)
1651 {
you.chen35020192022-05-06 11:30:57 +08001652 return -1;
1653 }
1654
1655 *channel = atoi(split_words[index]);
1656 return 0;
1657 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001658 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001659 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001660}
1661
1662
you.chen35020192022-05-06 11:30:57 +08001663int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001664{
you.chen6c2dd9c2022-05-16 17:55:28 +08001665 char ssid[MAX_CMD] = {0};
1666 int freq = 0;
1667 char lynq_auth_cmd[64]={0};
1668 char lynq_auth_alg_cmd[64]={0};
1669 char lynq_psk_cmd[64]={0};
1670 char lynq_pairwise_cmd[64]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001671 char lynq_ieee80211_cmd[64]={0};
1672 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001673 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001674 CHECK_IDX(idx, CTRL_AP);
1675
you.chen6c2dd9c2022-05-16 17:55:28 +08001676 CHECK_WPA_CTRL(CTRL_AP);
1677
qs.xiong9fbf74e2023-03-28 13:38:22 +08001678 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1679 {
1680 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen35020192022-05-06 11:30:57 +08001681 return -1;
1682 }
1683
you.chen92fd5d32022-05-25 10:09:47 +08001684 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001685 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001686 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001687 return 0;
1688 }
1689 else {
1690 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1691 ssid[0] = '\0';
1692 }
1693 lynq_wifi_ap_frequency_get(idx, &freq);
1694
1695 DO_OK_FAIL_REQUEST(cmd_disconnect);
1696 DO_OK_FAIL_REQUEST(cmd_remove_all);
1697 if (ssid[0] != '\0') {
1698 lynq_wifi_ap_ssid_set(idx, ssid);
1699 }
1700 if (freq != 0) {
1701 lynq_wifi_ap_frequency_set(idx, freq);
1702 }
1703 }
1704 }
you.chen35020192022-05-06 11:30:57 +08001705
qs.xiong9fbf74e2023-03-28 13:38:22 +08001706 switch(auth){
1707 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001708 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001709 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001710 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001711 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001712 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001713 break;
1714 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001715 case LYNQ_WIFI_AUTH_WEP:
1716 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001717 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001718 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001719 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-05-16 17:55:28 +08001720 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1721
1722 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1723 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1724 break;
1725 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001726 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-03-29 17:36:14 +08001727 {
1728 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1729 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1730 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1731
1732 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1733 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1734 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1735 break;
1736
1737 }
you.chen35020192022-05-06 11:30:57 +08001738 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001739 {
1740 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1741 {
you.chen35020192022-05-06 11:30:57 +08001742 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1743 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1744 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001745 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1746 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001747 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001748 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001749 }
1750// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1751// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1752 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong7a105ce2022-03-02 09:43:11 -05001753
you.chen35020192022-05-06 11:30:57 +08001754 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1755 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1756 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001757 break;
1758 }
1759 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1760 {
1761 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1762 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1763 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1764 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1765
1766 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1767 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1768 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1769 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1770 break;
1771 }
1772 case LYNQ_WIFI_AUTH_WPA3_PSK:
1773 {
1774 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1775 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xiong3e506812023-04-06 11:08:48 +08001776 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001777 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1778
1779 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1780 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1781 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1782 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1783 break;
1784 }
1785 default:
you.chen35020192022-05-06 11:30:57 +08001786 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001787 RLOGE("auth type [%d] not support now\n", auth);
1788 return -1;
you.chen35020192022-05-06 11:30:57 +08001789 }
1790 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001791 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001792
qs.xiong9fbf74e2023-03-28 13:38:22 +08001793 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001794}
1795
you.chen35020192022-05-06 11:30:57 +08001796int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001797{
you.chen35020192022-05-06 11:30:57 +08001798 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001799 char lynq_auth_alg_str[MAX_RET] = {0};
1800 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001801 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001802 CHECK_IDX(idx, CTRL_AP);
1803
qs.xiong9fbf74e2023-03-28 13:38:22 +08001804 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1805 {
1806 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen35020192022-05-06 11:30:57 +08001807 return -1;
1808 }
1809
qs.xiong9fbf74e2023-03-28 13:38:22 +08001810 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1811 {
1812 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1813 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001814 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001815 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001816 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001817 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001818 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1819 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001820 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001821 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001822 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001823 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001824 else
1825 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001826 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001827 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001828 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001829 }
you.chen35020192022-05-06 11:30:57 +08001830 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001831 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1832 {
1833 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1834 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001835 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001836 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001837 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001838 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1839 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001840 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001841 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001842 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001843 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001844 else
1845 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001846 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001847 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001848 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001849 }
you.chen35020192022-05-06 11:30:57 +08001850 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001851
1852 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1853 {
1854 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1855 return -1;
1856 }
1857
1858 if (memcmp(lynq_auth_str,"1",1) == 0 )
1859 {
1860 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1861 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001862 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001863 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1864 {
1865 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1866 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001867 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001868 }
1869 else
1870 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001871 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001872 *auth = -1;
1873 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001874
you.chen6c2dd9c2022-05-16 17:55:28 +08001875 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001876}
qs.xiong1af5daf2022-03-14 09:12:12 -04001877
qs.xiong1af5daf2022-03-14 09:12:12 -04001878
qs.xiongf1b525b2022-03-31 00:58:23 -04001879int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001880{
you.chen35020192022-05-06 11:30:57 +08001881 char LYNQ_WIFI_CMD[128]={0};
1882 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1883 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001884 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001885 CHECK_IDX(idx, CTRL_AP);
1886
1887 CHECK_WPA_CTRL(CTRL_AP);
1888
you.chenc9928582023-04-24 15:39:37 +08001889 sprintf(LYNQ_WIFI_CMD, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
1890 if (0 != exec_cmd(LYNQ_WIFI_CMD, s_ap_iterface_name, sizeof(s_ap_iterface_name)) || s_ap_iterface_name[0] == '\0')
1891 {
1892 return -1;
1893 }
you.chen35020192022-05-06 11:30:57 +08001894
1895 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1896 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1897
1898 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1899 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1900
you.chen70f377f2023-04-14 18:17:09 +08001901 check_tether_and_notify();
1902
you.chenc9928582023-04-24 15:39:37 +08001903 ret = system_call_v("%s %s", start_stop_ap_script, "start");
1904 if (ret != 0)
1905 {
1906 RLOGE("lynq_wifi_ap_start excute script fail");
1907 return -1;
1908 }
1909
qs.xiong9fbf74e2023-03-28 13:38:22 +08001910 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001911}
1912
qs.xiongf1b525b2022-03-31 00:58:23 -04001913int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001914{
you.chen35020192022-05-06 11:30:57 +08001915 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001916}
1917
qs.xiongf1b525b2022-03-31 00:58:23 -04001918int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001919{
you.chen35020192022-05-06 11:30:57 +08001920 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04001921
you.chen35020192022-05-06 11:30:57 +08001922 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001923
you.chen35020192022-05-06 11:30:57 +08001924 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001925
you.chen35020192022-05-06 11:30:57 +08001926 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
1927
1928 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1929
you.chenb4b121c2022-05-06 17:50:16 +08001930// system("connmanctl tether wifi off");
you.chenc9928582023-04-24 15:39:37 +08001931
1932 ret = system_call_v("%s %s", start_stop_ap_script, "stop");
1933 if (ret != 0)
1934 {
1935 RLOGE("lynq_wifi_ap_start excute script fail");
1936 return -1;
1937 }
1938
qs.xiong9fbf74e2023-03-28 13:38:22 +08001939 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001940}
qs.xiong1af5daf2022-03-14 09:12:12 -04001941
qs.xiongf1b525b2022-03-31 00:58:23 -04001942int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001943{
you.chen35020192022-05-06 11:30:57 +08001944 char lynq_disable_cmd[128] = {0};
1945 char lynq_select_cmd[128] = {0};
1946 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001947 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08001948 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001949
you.chen35020192022-05-06 11:30:57 +08001950 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08001951 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1952 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1953
1954 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1955 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
1956 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04001957
qs.xiong9fbf74e2023-03-28 13:38:22 +08001958 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001959}
1960
qs.xiongf1b525b2022-03-31 00:58:23 -04001961int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001962{
you.chen35020192022-05-06 11:30:57 +08001963 char lynq_disable_cmd[128] = {0};
1964 char lynq_select_cmd[128] = {0};
1965 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001966 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08001967 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001968
you.chen35020192022-05-06 11:30:57 +08001969 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001970
you.chen35020192022-05-06 11:30:57 +08001971 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1972 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1973
1974 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1975 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
1976 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05001977
qs.xiong9fbf74e2023-03-28 13:38:22 +08001978 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001979}
qs.xiongf1b525b2022-03-31 00:58:23 -04001980
you.chen35020192022-05-06 11:30:57 +08001981int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001982{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001983 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08001984 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001985 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001986 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001987 RLOGD("enter lynq_ap_password_set");
1988 if( password == NULL )
1989 {
1990 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08001991 return -1;
1992 }
1993 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08001994 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001995 if(pass_len < 8 || pass_len >= 64)
1996 {
1997 RLOGE("[lynq_ap_password_set]input password len not in rage");
1998 return -1;
you.chen35020192022-05-06 11:30:57 +08001999 }
qs.xiongf1b525b2022-03-31 00:58:23 -04002000
you.chen35020192022-05-06 11:30:57 +08002001 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002002
qs.xiong9fbf74e2023-03-28 13:38:22 +08002003 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
2004 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002005 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002006 return -1;
2007 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002008 else if (auth == LYNQ_WIFI_AUTH_OPEN)
2009 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002010 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
2011 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08002012 }
2013
you.chen35020192022-05-06 11:30:57 +08002014 CHECK_WPA_CTRL(CTRL_AP);
2015
qs.xiong9fbf74e2023-03-28 13:38:22 +08002016 if (auth == LYNQ_WIFI_AUTH_WEP)
2017 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002018 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002019 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
2020 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
2021 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2022 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
2023 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002024 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2025 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002026 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 +08002027 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
2028 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2029 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002030 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
2031 {
2032
qs.xiongc8d92a62023-03-29 17:36:14 +08002033 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 +08002034 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08002035 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002036 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2037 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
2038
2039 }
2040 else
qs.xiongc8d92a62023-03-29 17:36:14 +08002041 {
2042 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002043 return -1;
2044 }
you.chen35020192022-05-06 11:30:57 +08002045
you.chen35020192022-05-06 11:30:57 +08002046 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04002047
qs.xiong9fbf74e2023-03-28 13:38:22 +08002048 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04002049}
2050
you.chen35020192022-05-06 11:30:57 +08002051int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04002052{
you.chen35020192022-05-06 11:30:57 +08002053 FILE * fp;
2054 int len, ret;
2055 int count, index;
2056 char *split_lines[128] = {0};
2057 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002058 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04002059
you.chen35020192022-05-06 11:30:57 +08002060 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002061
you.chen35020192022-05-06 11:30:57 +08002062 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
2063// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002064 if (NULL == fp)
2065 {
2066 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002067 return -1;
2068 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002069
you.chen35020192022-05-06 11:30:57 +08002070 buff = alloca(MAX_RET);
2071 fseek(fp, 0, SEEK_SET);
2072 len = fread(buff, 1, MAX_RET, fp);
2073 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04002074
qs.xiong9fbf74e2023-03-28 13:38:22 +08002075 for(index=0; index < len; index ++)
2076 {
2077 if (memcmp(buff + index, "network={", 9) != 0)
2078 {
you.chen35020192022-05-06 11:30:57 +08002079 continue;
2080 }
2081 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002082 for (; index < len; index ++ )
2083 {
2084 if (buff[index] != '}')
2085 {
you.chen35020192022-05-06 11:30:57 +08002086 continue;
2087 }
2088 buff[index] = '\0';
2089 break;
2090 }
2091 len = buff + index - p;
2092 }
2093
2094 count = lynq_split(p, len, '\n', split_lines);
2095
2096 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002097 for(index=0; index < count; index++)
2098 {
you.chen35020192022-05-06 11:30:57 +08002099 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002100 if (p != NULL)
2101 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002102 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002103 if (*p == '\"')
2104 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002105 p++;
2106 }
you.chen35020192022-05-06 11:30:57 +08002107 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002108 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2109 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002110 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002111 if (*p == '\"')
2112 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002113 p++;
2114 }
2115 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002116 else
2117 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002118 continue;
you.chen35020192022-05-06 11:30:57 +08002119 }
2120
2121 strcpy(password, p);
2122
qs.xiong9fbf74e2023-03-28 13:38:22 +08002123 while(*password != '\0')
2124 {
2125 if (*password == '\"')
2126 {
you.chen35020192022-05-06 11:30:57 +08002127 *password = '\0';
2128 break;
2129 }
2130 password++;
2131 }
2132 ret = 0;
2133 break;
2134 } //end for(index=0; index < count; index++)
2135
2136 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002137}
2138
you.chen35020192022-05-06 11:30:57 +08002139static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
2140 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08002141 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002142
qs.xiong9fbf74e2023-03-28 13:38:22 +08002143 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
2144 {
you.chen35020192022-05-06 11:30:57 +08002145 return -1;
2146 }
2147
2148 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08002149
qs.xiong9fbf74e2023-03-28 13:38:22 +08002150 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
2151 {
2152 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
you.chen70f377f2023-04-14 18:17:09 +08002153 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002154 if (strcmp(lynq_proto_str, "RSN") == 0)
you.chen70f377f2023-04-14 18:17:09 +08002155 {
you.chena6cd55a2022-05-08 12:20:18 +08002156 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002157 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08002158 }
you.chen70f377f2023-04-14 18:17:09 +08002159 else if (strcmp(lynq_proto_str, "WPA") == 0) // need compare when wpa3 supported
2160 {
2161 return 0;
2162 }
you.chena6cd55a2022-05-08 12:20:18 +08002163 }
2164 }
you.chen70f377f2023-04-14 18:17:09 +08002165 else if (*auth == LYNQ_WIFI_AUTH_OPEN || *auth == LYNQ_WIFI_AUTH_WEP)
2166 {
2167 return 0;
2168 }
2169
qs.xiong9fbf74e2023-03-28 13:38:22 +08002170 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
2171 {
you.chen70f377f2023-04-14 18:17:09 +08002172 RLOGE("check ieee80211w error\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002173 return -1;
2174 }
2175 if ( strncmp(lynq_auth_str,"1",1) == 0 )
2176 {
2177
you.chen70f377f2023-04-14 18:17:09 +08002178 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
2179 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002180 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
2181 {
2182
2183 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002184 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002185 }else
2186 {
you.chen70f377f2023-04-14 18:17:09 +08002187 RLOGE("check ieee80211w error, not 1 or 2\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002188 *auth = -1;
2189 return -1;
2190 }
you.chen35020192022-05-06 11:30:57 +08002191 return 0;
2192}
2193
2194int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002195{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002196 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002197 int pass_len, net_no, count, index;
2198 char lynq_tmp_cmd[300]={0};
2199 int net_no_list[128];
2200 lynq_wifi_auth_s net_auth;
2201 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002202 if(pass_len < 8 || pass_len >= 64)
2203 {
2204 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08002205 return -1;
2206 }
2207
2208 CHECK_IDX(idx, CTRL_STA);
2209
2210 net_no = -1;
2211 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
2212
qs.xiong9fbf74e2023-03-28 13:38:22 +08002213 for (index=0; index < count; index++)
2214 {
you.chen35020192022-05-06 11:30:57 +08002215 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002216 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
2217 {
you.chen35020192022-05-06 11:30:57 +08002218 net_no = net_no_list[index];
2219 break;
2220 }
2221 }
2222
qs.xiong9fbf74e2023-03-28 13:38:22 +08002223 if (net_no < 0)
2224 {
you.chen35020192022-05-06 11:30:57 +08002225 return -1;
2226 }
2227
2228 CHECK_WPA_CTRL(CTRL_STA);
2229
2230 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
2231
2232 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2233 DO_OK_FAIL_REQUEST(cmd_save_config);
2234
2235 return 0;
2236}
2237
2238int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
2239
2240 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08002241 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08002242 int count, index;
2243 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08002244 char *buff, *p, *ssid, *ssid_end_flag;
2245 char tmp_ssid[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002246 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08002247
you.chen755332b2022-08-06 16:59:10 +08002248 network_len = 0;
2249 p = NULL;
2250
you.chen35020192022-05-06 11:30:57 +08002251 CHECK_IDX(idx, CTRL_STA);
2252
qs.xiong9fbf74e2023-03-28 13:38:22 +08002253 if (NULL == password)
2254 {
2255 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08002256 return -1;
2257 }
2258
you.chen35020192022-05-06 11:30:57 +08002259 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002260 if (NULL == fp)
2261 {
2262 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002263 return -1;
2264 }
2265
2266 buff = alloca(MAX_RET);
2267 fseek(fp, 0, SEEK_SET);
2268 len = fread(buff, 1, MAX_RET, fp);
2269 fclose(fp);
2270
qs.xiong9fbf74e2023-03-28 13:38:22 +08002271 for(index=0; index < len; index ++)
2272 {
2273 for(; index < len; index ++)
2274 {
2275 if (memcmp(buff + index, "network={", 9) != 0)
2276 {
you.chen35020192022-05-06 11:30:57 +08002277 continue;
2278 }
2279 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002280 for (; index < len; index ++ )
2281 {
2282 if (buff[index] != '}')
2283 {
you.chen35020192022-05-06 11:30:57 +08002284 continue;
2285 }
2286 buff[index] = '\0';
2287 break;
2288 }
you.chen755332b2022-08-06 16:59:10 +08002289 network_len = buff + index - p;
2290 break;
you.chen35020192022-05-06 11:30:57 +08002291 }
2292
qs.xiongb3f26af2023-02-17 18:41:07 +08002293 if (p == NULL)
2294 return -1;
2295
you.chend2fef3f2023-02-13 10:50:35 +08002296 ssid = strstr(p, "ssid=");
2297 if (ssid != NULL) {
2298 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002299 if (ssid[0] == '\"')
2300 {
you.chend2fef3f2023-02-13 10:50:35 +08002301 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2302 break;
2303 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002304 else
2305 {
you.chend2fef3f2023-02-13 10:50:35 +08002306 ssid_end_flag = strstr(ssid, "\n");
2307 if (ssid_end_flag != NULL)
2308 {
2309 ssid_len = (ssid_end_flag - ssid) / 2;
2310 for(i=0; i<ssid_len; i++)
2311 {
2312 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2313 }
2314 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2315 break;
2316 }
2317 }
you.chen35020192022-05-06 11:30:57 +08002318 }
you.chend2fef3f2023-02-13 10:50:35 +08002319
you.chen35020192022-05-06 11:30:57 +08002320 }
2321
qs.xiong9fbf74e2023-03-28 13:38:22 +08002322 if (index >= len || NULL == p || network_len <= 0)
2323 {
you.chen35020192022-05-06 11:30:57 +08002324 return -1;
2325 }
2326
you.chen755332b2022-08-06 16:59:10 +08002327 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08002328
2329 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002330 for(index=0; index < count; index++)
2331 {
you.chen35020192022-05-06 11:30:57 +08002332 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002333 if (p != NULL)
2334 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002335 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002336 if (*p == '\"')
2337 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002338 p++;
2339 }
you.chen35020192022-05-06 11:30:57 +08002340 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002341 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2342 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002343 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002344 if (*p == '\"')
2345 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002346 p++;
2347 }
2348 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002349 else
2350 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002351 continue;
you.chen35020192022-05-06 11:30:57 +08002352 }
2353
qs.xiong13673462023-02-21 19:12:54 +08002354 if (*p == '\"')
2355 p++;
2356 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08002357
qs.xiong13673462023-02-21 19:12:54 +08002358 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002359 while(password - p < 64 && *password != '\0')
2360 {
2361 if (*password == '\"')
2362 {
you.chen35020192022-05-06 11:30:57 +08002363 *password = '\0';
2364 break;
2365 }
2366 password++;
2367 }
2368 ret = 0;
2369 break;
2370 } //end for(index=0; index < count; index++)
2371
2372 return ret;
2373}
2374
2375static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2376{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002377 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04002378
qs.xiong9fbf74e2023-03-28 13:38:22 +08002379 if (sta_ssid == NULL)
2380 {
2381 RLOGE("sta_ssid is null\n");
2382 return -1;
you.chen35020192022-05-06 11:30:57 +08002383 }
2384
qs.xiong9fbf74e2023-03-28 13:38:22 +08002385 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002386
2387 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2388
2389 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2390// DO_OK_FAIL_REQUEST(cmd_save_config);
2391
qs.xiong9fbf74e2023-03-28 13:38:22 +08002392 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002393
2394}
2395
you.chen35020192022-05-06 11:30:57 +08002396static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05002397{
you.chen35020192022-05-06 11:30:57 +08002398 char lynq_disable_cmd[128]={0};
2399 char lynq_select_cmd[128]={0};
2400
2401 CHECK_WPA_CTRL(CTRL_STA);
2402
qs.xiong9fbf74e2023-03-28 13:38:22 +08002403 if (save != 0)
2404 {
you.chenc29444e2022-06-07 18:01:16 +08002405 if (start_flag != 0)
2406 {
2407 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2408 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2409 }
2410 else
2411 {
2412 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2413 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2414 }
you.chen35020192022-05-06 11:30:57 +08002415 DO_OK_FAIL_REQUEST(cmd_save_config);
2416 }
2417
qs.xiong9fbf74e2023-03-28 13:38:22 +08002418 if (start_flag == 0)
2419 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002420 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002421 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2422 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002423 else
2424 {
you.chen35020192022-05-06 11:30:57 +08002425 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2426 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2427 }
2428
2429 return 0;
2430}
2431
2432int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2433{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002434 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002435 CHECK_IDX(idx, CTRL_STA);
2436
you.chen6c2dd9c2022-05-16 17:55:28 +08002437 curr_status_info curr_state;
2438 ap_info_s ap_info;
2439 curr_state.ap = &ap_info;
2440 curr_state.state = NULL;
2441
qs.xiong9fbf74e2023-03-28 13:38:22 +08002442 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2443 {
you.chend2fef3f2023-02-13 10:50:35 +08002444 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002445 return 0;
2446 }
2447
2448 return -1;
you.chen35020192022-05-06 11:30:57 +08002449}
2450
2451int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2452{
you.chen9ac66392022-08-06 17:01:16 +08002453 scan_info_s *scan_list = NULL;
2454 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002455 int scan_len=0;
2456 int save_len=0;
2457 int best_index = -1;
2458 int best_scan_index = -1;
2459 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002460 int i, j, ret;
2461
2462 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002463
2464 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002465 if (info == NULL)
2466 {
you.chen35020192022-05-06 11:30:57 +08002467 return -1;
2468 }
2469
2470 curr_status_info curr_state;
2471 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002472 char status[64];
you.chen35020192022-05-06 11:30:57 +08002473
you.chen9ac66392022-08-06 17:01:16 +08002474 memset(&ap_info, 0, sizeof (ap_info));
2475 memset(status, 0, sizeof (status));
2476
2477 curr_state.ap = &ap_info;
2478 curr_state.state = status;
2479
qs.xiong9fbf74e2023-03-28 13:38:22 +08002480 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2481 {
you.chen35020192022-05-06 11:30:57 +08002482 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002483 if (strcmp(status, STATE_COMPLETED) == 0)
2484 {
2485 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2486 }
2487 else
2488 {
2489 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2490 }
you.chen593621d2023-04-27 17:52:44 +08002491 lynq_get_connect_ap_ip(idx, info->base_info.ap_ip);
you.chen35020192022-05-06 11:30:57 +08002492 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002493 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002494 return 0;
2495 }
2496
you.chen9ac66392022-08-06 17:01:16 +08002497 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002498 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002499 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2500 {
you.chen9ac66392022-08-06 17:01:16 +08002501 if (NULL != scan_list)
2502 {
2503 free(scan_list);
2504 }
you.chen35020192022-05-06 11:30:57 +08002505 return -1;
2506 }
2507
qs.xiong9fbf74e2023-03-28 13:38:22 +08002508 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2509 {
you.chen9ac66392022-08-06 17:01:16 +08002510 if (NULL != scan_list)
2511 {
2512 free(scan_list);
2513 }
2514 if (NULL != save_list)
2515 {
2516 free(save_list);
2517 }
you.chen35020192022-05-06 11:30:57 +08002518 return -1;
2519 }
2520
qs.xiong9fbf74e2023-03-28 13:38:22 +08002521 for (i=0; i < save_len; i++)
2522 {
2523 for (j=0; j < scan_len; j++)
2524 {
you.chen35020192022-05-06 11:30:57 +08002525 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002526 && save_list[i].base_info.auth == scan_list[j].auth)
2527 {
2528 if (best_rssi == 0)
2529 {
you.chen9ac66392022-08-06 17:01:16 +08002530 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002531 best_rssi = scan_list[j].rssi;
2532 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002533 else if (best_rssi > scan_list[j].rssi)
2534 {
you.chen35020192022-05-06 11:30:57 +08002535 best_index = i;
2536 best_scan_index = j;
2537 best_rssi = scan_list[j].rssi;
2538 }
you.chend2fef3f2023-02-13 10:50:35 +08002539 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 +08002540 break;
2541 }
2542 }
2543 }
2544
qs.xiong9fbf74e2023-03-28 13:38:22 +08002545 if (best_index >= 0)
2546 {
you.chen35020192022-05-06 11:30:57 +08002547 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002548 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 +08002549 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2550 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002551 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002552 }
2553
you.chen9ac66392022-08-06 17:01:16 +08002554 if (NULL != scan_list)
2555 {
2556 free(scan_list);
2557 }
2558 if (NULL != save_list)
2559 {
2560 free(save_list);
2561 }
2562
2563 return ret;
you.chen35020192022-05-06 11:30:57 +08002564}
2565
2566static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2567{
qs.xiongc8d92a62023-03-29 17:36:14 +08002568 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002569 char lynq_ket_mgmt_cmd[64]={0};
2570 char lynq_pairwise_cmd[64]={0};
2571 char lynq_psk_cmd[64]={0};
2572
2573 CHECK_WPA_CTRL(CTRL_STA);
2574
qs.xiong9fbf74e2023-03-28 13:38:22 +08002575 switch(auth)
2576 {
2577 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002578 {
2579 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002580
you.chen35020192022-05-06 11:30:57 +08002581 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002582// DO_OK_FAIL_REQUEST(cmd_save_config);
2583 break;
2584 }
2585 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002586 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002587 {
2588 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2589 {
you.chen35020192022-05-06 11:30:57 +08002590 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2591 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002592 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2593 {
you.chena6cd55a2022-05-08 12:20:18 +08002594 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002595 }
2596 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2597 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002598
you.chen35020192022-05-06 11:30:57 +08002599 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2600 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2601 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002602
qs.xiong9fbf74e2023-03-28 13:38:22 +08002603 if (password != NULL)
2604 {
you.chen35020192022-05-06 11:30:57 +08002605 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2606 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002607 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002608 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002609
you.chen35020192022-05-06 11:30:57 +08002610// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002611 break;
2612 }
2613 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2614 {
qs.xiong3e506812023-04-06 11:08:48 +08002615 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002616 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002617 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2618 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2619
qs.xiong3e506812023-04-06 11:08:48 +08002620 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002621 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2622 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2623 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2624
2625 break;
2626 }
2627 case LYNQ_WIFI_AUTH_WPA3_PSK:
2628 {
qs.xiong3e506812023-04-06 11:08:48 +08002629 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiong03556d52023-04-17 09:45:19 +08002630 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002631 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2632 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2633
qs.xiong3e506812023-04-06 11:08:48 +08002634 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002635 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2636 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2637 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2638
2639 break;
2640 }
2641 default:
2642 return -1;
you.chen35020192022-05-06 11:30:57 +08002643 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002644
qs.xiong9fbf74e2023-03-28 13:38:22 +08002645 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002646}
qs.xiong7a105ce2022-03-02 09:43:11 -05002647
you.chen35020192022-05-06 11:30:57 +08002648static int inner_get_curr_net_no(int interface) {
2649 curr_status_info curr_state;
2650 curr_state.ap = NULL;
2651 curr_state.state = NULL;
2652
qs.xiong9fbf74e2023-03-28 13:38:22 +08002653 if (0 != inner_get_status_info(interface, &curr_state))
2654 {
you.chen35020192022-05-06 11:30:57 +08002655 return -1;
2656 }
2657
2658 return curr_state.net_no;
2659}
2660
2661int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002662{
you.chen35020192022-05-06 11:30:57 +08002663 int net_no;
2664 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002665
you.chen35020192022-05-06 11:30:57 +08002666 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002667
qs.xiong9fbf74e2023-03-28 13:38:22 +08002668 if (net_no < 0)
2669 {
you.chen35020192022-05-06 11:30:57 +08002670 return -1;
2671 }
2672
2673 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002674}
2675
you.chen35020192022-05-06 11:30:57 +08002676int 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 -05002677{
you.chen35020192022-05-06 11:30:57 +08002678 int count, net_no, index;
2679 int net_no_list[128];
qs.xiongf71b53b2023-05-03 13:12:07 +08002680 char rm_net_cmd[128];
you.chen35020192022-05-06 11:30:57 +08002681 lynq_wifi_auth_s net_auth;
you.chen70f377f2023-04-14 18:17:09 +08002682 curr_status_info curr_state;
2683 ap_info_s ap_info;
2684 char status[64];
qs.xiongf1b525b2022-03-31 00:58:23 -04002685
qs.xiong9fbf74e2023-03-28 13:38:22 +08002686 if (ssid == NULL || *ssid == '\0')
2687 {
2688 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002689 return -1;
2690 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002691
qs.xiong9fbf74e2023-03-28 13:38:22 +08002692 if (LYNQ_WIFI_AUTH_OPEN != auth)
2693 {
2694 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
you.chen70f377f2023-04-14 18:17:09 +08002695 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002696 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002697 return -1;
2698 }
2699 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002700
you.chen70f377f2023-04-14 18:17:09 +08002701
2702 pthread_mutex_lock(&s_global_check_mutex);
2703 if (s_sta_status != INNER_STA_STATUS_INIT)
2704 {
2705 s_sta_status = INNER_STA_STATUS_CANCEL;
2706 pthread_cond_signal(&s_global_check_cond);
2707 }
2708 pthread_mutex_unlock(&s_global_check_mutex);
2709
you.chen35020192022-05-06 11:30:57 +08002710 CHECK_IDX(idx, CTRL_STA);
you.chen70f377f2023-04-14 18:17:09 +08002711 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002712
2713 net_no = -1;
you.chen70f377f2023-04-14 18:17:09 +08002714 memset(&ap_info, 0, sizeof (ap_info));
2715 memset(status, 0, sizeof (status));
you.chen35020192022-05-06 11:30:57 +08002716
you.chen70f377f2023-04-14 18:17:09 +08002717 curr_state.ap = &ap_info;
2718 curr_state.state = status;
2719
2720 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002721 {
you.chen70f377f2023-04-14 18:17:09 +08002722 if (strcmp(status, STATE_COMPLETED) == 0 && strcmp(ap_info.ap_ssid, ssid) ==0 && ap_info.auth == auth)
2723 {
2724 net_no = curr_state.net_no;
2725 if (0 == lynq_sta_ssid_password_get(idx, &ap_info, ap_info.psw)
2726 && strcmp(ap_info.psw, psw) == 0)
2727 {
2728 RLOGD("already connected\n");
2729
2730 pthread_mutex_lock(&s_global_check_mutex);
2731 s_sta_status = INNER_STA_STATUS_CONNECTED;
2732 pthread_cond_signal(&s_global_check_cond);
2733 pthread_mutex_unlock(&s_global_check_mutex);
2734 return 0;
2735 }
you.chen35020192022-05-06 11:30:57 +08002736 }
2737 }
2738
you.chen70f377f2023-04-14 18:17:09 +08002739 if (net_no == -1)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002740 {
you.chen70f377f2023-04-14 18:17:09 +08002741 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2742
2743 for (index=0; index < count; index++)
2744 {
2745 net_auth = -1;
2746 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2747 {
2748 net_no = net_no_list[index];
2749 break;
2750 }
you.chen35020192022-05-06 11:30:57 +08002751 }
2752
you.chen70f377f2023-04-14 18:17:09 +08002753 if (net_no < 0)
2754 {
qs.xiongf71b53b2023-05-03 13:12:07 +08002755 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
2756 for ( index = 0; index < (count - STA_MAX_SAVED_AP_NUM + 1 ) ;index++) //+1 is for add new network
2757 {
2758 sprintf(rm_net_cmd,"REMOVE_NETWORK %d",net_no_list[index]);
2759 RLOGD("call cmd rm_net_cmd: %s;index is %d\n",rm_net_cmd,index);
2760 DO_OK_FAIL_REQUEST(rm_net_cmd);
2761 }
you.chen70f377f2023-04-14 18:17:09 +08002762 net_no = lynq_add_network(CTRL_STA);
2763 if (net_no == -1)
2764 {
2765 return -1;
2766 }
2767
2768 RLOGD("net no is %d\n", net_no);
2769 if (0 != inner_set_sta_ssid(net_no, ssid))
2770 {
2771 return -1;
2772 }
you.chen35020192022-05-06 11:30:57 +08002773 }
2774 }
2775
qs.xiong9fbf74e2023-03-28 13:38:22 +08002776 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2777 {
you.chen35020192022-05-06 11:30:57 +08002778 return -1;
2779 }
2780
you.chen70f377f2023-04-14 18:17:09 +08002781
2782 DO_OK_FAIL_REQUEST(cmd_disconnect);
2783 usleep(200*1000);
2784
2785 ret = inner_sta_start_stop(net_no, 1, 1);
2786
2787 pthread_mutex_lock(&s_global_check_mutex);
2788 s_sta_status = INNER_STA_STATUS_CONNECTING;
2789 strcpy(s_sta_current_connecting_ssid, ssid);
2790 struct timeval now;
2791 gettimeofday(&now,NULL);
2792 s_sta_connect_timeout.tv_sec = now.tv_sec + MAX_CONNNECT_TIME;
2793 s_sta_connect_timeout.tv_nsec = now.tv_usec*1000;
2794 pthread_cond_signal(&s_global_check_cond);
2795 pthread_mutex_unlock(&s_global_check_mutex);
2796 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002797}
2798
you.chen35020192022-05-06 11:30:57 +08002799int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002800{
you.chen35020192022-05-06 11:30:57 +08002801 ap_info_s ap;
2802 curr_status_info curr_state;
2803 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002804
qs.xiong9fbf74e2023-03-28 13:38:22 +08002805 if (ssid == NULL || *ssid == '\0')
2806 {
2807 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002808 return -1;
2809 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002810
you.chen35020192022-05-06 11:30:57 +08002811 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002812
you.chen35020192022-05-06 11:30:57 +08002813 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002814 curr_state.state = NULL;
2815
qs.xiong9fbf74e2023-03-28 13:38:22 +08002816 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2817 {
you.chen35020192022-05-06 11:30:57 +08002818 return 0;
2819 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002820
qs.xiong9fbf74e2023-03-28 13:38:22 +08002821 if (strcmp(ap.ap_ssid, ssid) != 0)
2822 {
you.chen35020192022-05-06 11:30:57 +08002823 return 0;
2824 }
2825
you.chen70f377f2023-04-14 18:17:09 +08002826 pthread_mutex_lock(&s_global_check_mutex);
2827 s_sta_status = INNER_STA_STATUS_DISCONNECTING;
2828 pthread_mutex_unlock(&s_global_check_mutex);
you.chen35020192022-05-06 11:30:57 +08002829 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002830}
qs.xiong97fa59b2022-04-07 05:41:29 -04002831
you.chena6cd55a2022-05-08 12:20:18 +08002832int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2833{
qs.xiongad2f89d2023-01-18 13:17:41 +08002834// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2835// const char *lynq_reconnect_cmd = "RECONNECT";
2836 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2837 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2838// 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 -05002839
you.chen35020192022-05-06 11:30:57 +08002840 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08002841 CHECK_WPA_CTRL(CTRL_STA);
2842
you.chenc9928582023-04-24 15:39:37 +08002843 ret = system_call_v("%s %s", start_stop_sta_script, "start");
2844 if (ret != 0)
qs.xiongad2f89d2023-01-18 13:17:41 +08002845 {
you.chenc9928582023-04-24 15:39:37 +08002846 RLOGE("lynq_wifi_ap_start excute script fail");
you.chen35020192022-05-06 11:30:57 +08002847 return -1;
2848 }
qs.xiong9c99fa92022-03-15 08:03:26 -04002849
qs.xiongad2f89d2023-01-18 13:17:41 +08002850 system(lynq_enable_sta_cmd);
2851 system(lynq_reconnect_cmd);
2852// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002853 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002854}
2855
you.chen35020192022-05-06 11:30:57 +08002856int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04002857{
qs.xiongad2f89d2023-01-18 13:17:41 +08002858// char lynq_disable_network_cmd[MAX_CMD];
2859// curr_status_info curr_state;
2860// ap_info_s ap_info;
you.chen35020192022-05-06 11:30:57 +08002861
qs.xiongad2f89d2023-01-18 13:17:41 +08002862 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 +08002863 CHECK_IDX(idx, CTRL_STA);
2864 CHECK_WPA_CTRL(CTRL_STA);
2865
qs.xiongad2f89d2023-01-18 13:17:41 +08002866 system(lynq_disable_sta_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002867 DO_OK_FAIL_REQUEST(cmd_save_config);
you.chenc9928582023-04-24 15:39:37 +08002868
2869 ret = system_call_v("%s %s", start_stop_sta_script, "stop");
2870 if (ret != 0)
2871 {
2872 RLOGE("lynq_wifi_ap_start excute script fail");
2873 return -1;
2874 }
2875
you.chena6cd55a2022-05-08 12:20:18 +08002876 return 0;
2877// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04002878}
qs.xiong7a105ce2022-03-02 09:43:11 -05002879
you.chen35020192022-05-06 11:30:57 +08002880//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
2881// int i, count;
2882// char *p;
2883// const char * FLAG_SSID = "ssid=";
2884// const char * FLAG_SBSID = "bssid=";
2885// const char * FLAG_KEY_MGMT = "key_mgmt=";
2886// const char * FLAG_FREQ = "freq=";
2887// char lynq_sta_cmd[MAX_CMD];
2888// char *split_lines[128] = {0};
2889
2890// CHECK_WPA_CTRL(CTRL_AP);
2891
2892// sprintf(lynq_sta_cmd, "STA %s", bssid);
2893
2894// DO_REQUEST(lynq_sta_cmd);
2895
2896// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2897
2898// for(i=0; i < count; i++) {
2899// p = strstr(split_lines[i], FLAG_SSID);
2900// if (p != NULL) {
2901// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
2902// continue;
2903// }
2904// }
2905
2906// lynq_get_interface_ip(idx, ap->ap_ip);
2907// lynq_ap_password_set(idx, ap->psw);
2908
2909// return 0;
2910//}
2911
2912static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
2913 curr_status_info curr_state;
2914 curr_state.ap = ap;
2915 curr_state.state = NULL;
2916 return inner_get_status_info(interface, &curr_state);
2917}
2918
2919int 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 -04002920{
you.chend2fef3f2023-02-13 10:50:35 +08002921 int index, line_count;
2922 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08002923 const char *lynq_first_sta_cmd = "STA-FIRST";
2924 char lynq_next_sta_cmd[MAX_CMD];
2925 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08002926 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002927
you.chen35020192022-05-06 11:30:57 +08002928 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002929
you.chen35020192022-05-06 11:30:57 +08002930 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002931
you.chen35020192022-05-06 11:30:57 +08002932// ap_info_s * tmp_ap;
2933// device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002934 if (ap == NULL || list == NULL || len == NULL)
2935 {
2936 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08002937 return -1;
2938 }
2939
2940// ap = &tmp_ap;
2941// list = &tmp_list;
2942 *ap = malloc(sizeof (ap_info_s));
2943
qs.xiong9fbf74e2023-03-28 13:38:22 +08002944 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0)
2945 {
2946 RLOGE("inner_get_status_info_ap !=0\n");
you.chen35020192022-05-06 11:30:57 +08002947 return -1;
2948 }
2949
2950 lynq_get_interface_ip(idx, (*ap)->ap_ip);
2951 lynq_ap_password_get(idx, (*ap)->psw);
2952
you.chen35020192022-05-06 11:30:57 +08002953 DO_REQUEST(lynq_first_sta_cmd);
2954
2955 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002956 while (reply_len > 0)
2957 {
2958 if (memcmp(cmd_reply, "FAIL", 4) == 0)
2959 {
you.chen35020192022-05-06 11:30:57 +08002960 break;
2961 }
2962 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2963 bssid[index] = malloc(strlen(split_lines[0]) + 1);
2964 strcpy(bssid[index], split_lines[0]);
2965 index++;
2966 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
2967 reply_len = MAX_RET;
2968 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08002969 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 +08002970 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
2971 {
2972 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08002973 break;
2974 }
2975 }
2976
2977 *len = index;
2978
2979 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08002980 for (index=0; index < *len; index++)
2981 {
you.chend2fef3f2023-02-13 10:50:35 +08002982 dev_info = &(*list)[index];
2983 memset(dev_info, 0, sizeof(device_info_s));
2984 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
2985 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
2986 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
2987 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08002988 free(bssid[index]);
2989 }
2990
2991 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002992}
2993
you.chen35020192022-05-06 11:30:57 +08002994int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04002995{
you.chen35020192022-05-06 11:30:57 +08002996 int i, count, index, count_words;
2997 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
2998 char *split_lines[128] = {0};
2999 char *split_words[128] = {0};
3000 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04003001
qs.xiong9fbf74e2023-03-28 13:38:22 +08003002 if (list == NULL || len == NULL)
3003 {
you.chen35020192022-05-06 11:30:57 +08003004 return -1;
3005 }
qs.xiong97fa59b2022-04-07 05:41:29 -04003006
you.chen9ac66392022-08-06 17:01:16 +08003007 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
3008 {
3009 usleep(100 * 1000);
3010 }
3011
you.chen35020192022-05-06 11:30:57 +08003012 CHECK_IDX(idx, CTRL_STA);
3013
3014 CHECK_WPA_CTRL(CTRL_STA);
3015
3016 DO_REQUEST(lynq_scan_result_cmd);
3017
3018 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3019 *len = count - 1;
3020 *list = malloc(sizeof (scan_info_s) * *len);
3021
3022 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08003023 for (index=0; index <count_words; index++)
3024 {
3025 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08003026 }
3027
qs.xiong9fbf74e2023-03-28 13:38:22 +08003028 for(index = 1;index < count; index++)
3029 {
3030 RLOGD("---- %s\n",split_lines[index]);
you.chen6ed36a62023-04-27 17:51:56 +08003031 memset(split_words, 0 , sizeof (split_words));
you.chen35020192022-05-06 11:30:57 +08003032 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
3033 if (count_words < 4)
3034 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003035 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08003036 //bssid / frequency / signal level / flags / ssid
3037 p = (*list) + index - 1;
3038 strcpy(p->mac, split_words[0]);
3039 p->band = convert_band_from_freq(atoi(split_words[1]));
3040 p->rssi = -1 * atoi( split_words[2]);
3041 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chen6ed36a62023-04-27 17:51:56 +08003042 if (count_words == 4) // ssid hided
3043 {
3044 p->ssid[0] = '\0';
3045 }
3046 else
3047 {
3048 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
3049 }
you.chen35020192022-05-06 11:30:57 +08003050 }
3051
3052 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003053}
qs.xiong97fa59b2022-04-07 05:41:29 -04003054
you.chen35020192022-05-06 11:30:57 +08003055int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
3056{
3057 int count, net_no, index;
3058 int net_no_list[128];
3059 lynq_wifi_auth_s net_auth;
3060 char lynq_remove_cmd[MAX_CMD];
3061
qs.xiong9fbf74e2023-03-28 13:38:22 +08003062 if (ssid == NULL || *ssid == '\0')
3063 {
3064 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08003065 return -1;
3066 }
3067
3068 CHECK_IDX(idx, CTRL_STA);
3069
3070 CHECK_WPA_CTRL(CTRL_STA);
3071
3072 net_no = -1;
3073 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
3074
qs.xiong9fbf74e2023-03-28 13:38:22 +08003075 for (index=0; index < count; index++)
3076 {
you.chen35020192022-05-06 11:30:57 +08003077 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003078 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
3079 {
you.chen35020192022-05-06 11:30:57 +08003080 net_no = net_no_list[index];
3081 break;
3082 }
3083 }
3084
qs.xiong9fbf74e2023-03-28 13:38:22 +08003085 if (net_no < 0)
3086 {
you.chen35020192022-05-06 11:30:57 +08003087 return 0;
3088 }
3089
3090 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
3091
3092 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
3093 DO_OK_FAIL_REQUEST(cmd_save_config);
3094
3095 return 0;
3096}
3097
3098int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003099{
you.chend2fef3f2023-02-13 10:50:35 +08003100 int count, index;
you.chen35020192022-05-06 11:30:57 +08003101 int net_no_list[128];
3102 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003103 RLOGD("enter lynq_get_sta_saved_ap api\n");
3104 if (list == NULL || len == NULL)
3105 {
3106 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08003107 return -1;
3108 }
3109
3110 CHECK_IDX(idx, CTRL_STA);
3111
3112// CHECK_WPA_CTRL(CTRL_STA);
3113
3114 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003115 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08003116
you.chen057aac42023-04-13 14:06:58 +08003117 if (count < 0)
3118 {
3119 RLOGE("list network fail");
3120 return count;
3121 }
3122 else if (count == 0)
3123 {
3124 *list = NULL;
3125 *len = 0;
3126 return 0;
3127 }
3128
you.chen35020192022-05-06 11:30:57 +08003129 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08003130 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08003131 *len = count;
3132
qs.xiong9fbf74e2023-03-28 13:38:22 +08003133 for (index=0; index < count; index++)
3134 {
you.chen35020192022-05-06 11:30:57 +08003135 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
you.chen35020192022-05-06 11:30:57 +08003136 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
you.chen35020192022-05-06 11:30:57 +08003137 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003138 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
you.chen057aac42023-04-13 14:06:58 +08003139 {
you.chen35020192022-05-06 11:30:57 +08003140 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
3141 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003142 else
you.chen057aac42023-04-13 14:06:58 +08003143 {
you.chen35020192022-05-06 11:30:57 +08003144 (*list)[index].base_info.band = -1;
3145 }
you.chen057aac42023-04-13 14:06:58 +08003146 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08003147 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08003148 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003149 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08003150 return 0;
3151}
3152
3153int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
3154{
qs.xiongc8d92a62023-03-29 17:36:14 +08003155 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08003156 const char *lynq_scan_cmd = "SCAN";
3157
3158 CHECK_IDX(idx, CTRL_STA);
3159
3160 CHECK_WPA_CTRL(CTRL_STA);
3161
you.chen70f377f2023-04-14 18:17:09 +08003162// system(clean_last_re); // youchen @ 2023-04-14 temp delete ,next time to fix the orginal bug
you.chen9ac66392022-08-06 17:01:16 +08003163 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08003164 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003165 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
3166 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003167 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003168 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
3169 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003170 g_sta_scan_finish_flag = 1;
3171 return -1;
3172 }
you.chen35020192022-05-06 11:30:57 +08003173
3174 return 0;
3175}
3176
3177int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003178 if (cb == NULL)
3179 {
3180 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003181 return -1;
3182 }
3183
you.chene9d00032023-04-24 13:55:29 +08003184 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +08003185 g_ap_callback_priv = priv;
3186 g_ap_callback_func = cb;
3187
you.chene9d00032023-04-24 13:55:29 +08003188 if (g_ap_watcher_pid == 0 )
3189 {
3190 if(pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL) < 0)
3191 {
3192 g_ap_watcher_pid = 0;
3193 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3194 RLOGE("[wifi error]creat APWatcherThreadProc fail");
3195 return -1;
3196 }
3197 }
3198
3199 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3200 RLOGD("creat APWatcherTheradProc susccs");
3201
you.chen35020192022-05-06 11:30:57 +08003202 return 0;
3203}
3204
3205int lynq_unreg_ap_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003206 if (g_ap_callback_priv == priv)
3207 {
you.chen35020192022-05-06 11:30:57 +08003208 g_ap_callback_func = NULL;
3209 g_ap_callback_priv = NULL;
3210 return 0;
3211 }
3212 return -1;
3213}
3214
3215int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08003216 if (cb == NULL)
3217 {
3218 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003219 return -1;
3220 }
3221
you.chene9d00032023-04-24 13:55:29 +08003222 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +08003223 g_sta_callback_priv = priv;
3224 g_sta_callback_func = cb;
3225
you.chene9d00032023-04-24 13:55:29 +08003226 if (g_sta_watcher_pid == 0 ) {
3227 if(pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL) < 0)
3228 {
3229 g_sta_watcher_pid = 0;
3230 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3231 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
3232 return -1;
3233 }
3234 }
3235
3236 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3237 RLOGD("creat STAWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +08003238 return 0;
3239}
3240
3241int lynq_unreg_sta_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003242 if (g_sta_callback_priv == priv)
3243 {
you.chen35020192022-05-06 11:30:57 +08003244 g_sta_callback_func = NULL;
3245 g_sta_callback_priv = NULL;
3246 return 0;
3247 }
3248 return -1;
3249}
3250
3251
3252static int inner_get_status_info_state (int interface, char *state) {
3253 curr_status_info curr_state;
3254 curr_state.ap = NULL;
3255 curr_state.state = state;
3256 return inner_get_status_info(interface, &curr_state);
3257}
3258
3259int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
3260{
3261 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003262 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08003263 CHECK_IDX(idx, CTRL_AP);
3264
qs.xiong9fbf74e2023-03-28 13:38:22 +08003265 if (inner_get_status_info_state(CTRL_AP, state) != 0)
3266 {
you.chen35020192022-05-06 11:30:57 +08003267 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3268 return 0;
3269 }
3270
qs.xiong9fbf74e2023-03-28 13:38:22 +08003271 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3272 {
you.chen35020192022-05-06 11:30:57 +08003273 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
3274 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003275 else
3276 {
you.chen35020192022-05-06 11:30:57 +08003277 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3278 }
3279
3280 return 0;
3281}
3282
3283int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
3284 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003285 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08003286 CHECK_IDX(idx, CTRL_STA);
3287
qs.xiong9fbf74e2023-03-28 13:38:22 +08003288 if (inner_get_status_info_state(CTRL_STA, state) != 0)
3289 {
you.chen35020192022-05-06 11:30:57 +08003290 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3291 return 0;
3292 }
3293
qs.xiong9fbf74e2023-03-28 13:38:22 +08003294 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3295 {
you.chen35020192022-05-06 11:30:57 +08003296 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
3297 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003298 else
3299 {
you.chen35020192022-05-06 11:30:57 +08003300 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3301 }
3302
3303 return 0;
3304}
3305
3306int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
3307// CHECK_IDX(idx, CTRL_AP);
3308// int ret = 0;
3309// size_t reply_len = MAX_RET;
3310// char cmd_reply[MAX_RET]={0};
3311// const char * cmd_str = "GET country";
3312// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
3313// do{
3314// if (NULL == s_lynq_wpa_ctrl) {
3315// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
3316// if (NULL == s_lynq_wpa_ctrl ) {
3317// printf("wpa_ctrl_open fail\n");
3318// return -1;
3319// }
3320// }
3321// }while(0);
3322
3323// do {
3324// reply_len = MAX_RET;
3325// cmd_reply[0] = '\0';
3326// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08003327// 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 +08003328// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003329// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08003330// return ret;
3331// }
3332// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08003333// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08003334// }while(0);
3335
3336 FILE *fp;
3337 size_t i = 0;
3338 char lynq_cmd_ret[MAX_RET]={0};
3339
3340// CHECK_IDX(idx, CTRL_AP);
3341
3342 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003343 {
3344 perror("popen error!");
3345 return -1;
3346 }
you.chen35020192022-05-06 11:30:57 +08003347 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
3348 {
3349 perror("fread fail!");
3350 return -1;
3351 }
3352
qs.xiong9fbf74e2023-03-28 13:38:22 +08003353 for(i=0; i < strlen(lynq_cmd_ret); i++)
3354 {
3355 if (lynq_cmd_ret[i] == ' ')
3356 {
you.chen35020192022-05-06 11:30:57 +08003357 lynq_cmd_ret[i] = '\0';
3358 break;
3359 }
3360 }
3361
3362 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003363 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08003364
3365 int ret=pclose(fp);
3366 if(ret==-1)
3367 {
3368 perror("close file faild");
3369 }
3370
3371 return 0;
3372}
3373
3374int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
3375// const char * cmd_str = "GET country";
3376// CHECK_IDX(idx, CTRL_AP);
3377// CHECK_WPA_CTRL(CTRL_STA);
3378
3379// DO_REQUEST(cmd_str);
3380// printf("result %s\n", cmd_reply);
3381
qs.xiong9fbf74e2023-03-28 13:38:22 +08003382 if (country_code == NULL || *country_code == '\0')
3383 {
3384 RLOGD("bad country code\n");
you.chen35020192022-05-06 11:30:57 +08003385 return -1;
3386 }
3387
3388 char lynq_country_cmd[MAX_CMD];
3389 sprintf(lynq_country_cmd, "wl country %s", country_code);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003390 if (system(lynq_country_cmd) == 0)
3391 {
you.chen35020192022-05-06 11:30:57 +08003392 return 0;
3393 }
3394
3395 return -1;
3396}
3397
3398int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
3399{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003400 RLOGD("enter lynq_get_connect_ap_mac\n");
3401 if (mac == NULL)
3402 {
3403 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08003404 return -1;
3405 }
3406
3407 CHECK_IDX(idx, CTRL_STA);
3408 ap_info_s ap;
3409 ap.ap_mac[0] = '\0';
3410
qs.xiong9fbf74e2023-03-28 13:38:22 +08003411 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3412 {
you.chen35020192022-05-06 11:30:57 +08003413 return -1;
3414 }
3415 strcpy(mac, ap.ap_mac);
3416
3417 return 0;
3418}
3419
3420int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
3421{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003422 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08003423 struct ifaddrs *ifaddr_header, *ifaddr;
3424 struct in_addr * ifa;
3425 const char * ifaName = "wlan0";
3426 if (ip == NULL)
3427 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003428 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08003429 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003430 }
you.chenf58b3c92022-06-21 16:53:48 +08003431
qs.xiong9fbf74e2023-03-28 13:38:22 +08003432 if (idx == 1)
3433 {
you.chenc9928582023-04-24 15:39:37 +08003434 ifaName = s_ap_iterface_name;
you.chen9ac66392022-08-06 17:01:16 +08003435 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003436 else if (idx != 0)
3437 {
you.chen35020192022-05-06 11:30:57 +08003438 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003439 }
you.chen35020192022-05-06 11:30:57 +08003440
you.chen9ac66392022-08-06 17:01:16 +08003441 if (getifaddrs(&ifaddr_header) == -1)
3442 {
you.chen35020192022-05-06 11:30:57 +08003443 perror("getifaddrs");
3444 return -1;
3445 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08003446 }
you.chen35020192022-05-06 11:30:57 +08003447
3448
you.chen9ac66392022-08-06 17:01:16 +08003449 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3450 {
3451 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08003452 continue;
you.chen9ac66392022-08-06 17:01:16 +08003453 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3454 {
3455 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3456 {
3457 // is a valid IP4 Address
3458 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3459 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003460 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08003461 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003462 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08003463 return 0;
3464 }
3465 }
3466 }
qs.xiongc4f007c2023-02-08 18:16:58 +08003467 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003468 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08003469 return -1;
you.chen35020192022-05-06 11:30:57 +08003470}
3471
3472int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3473{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003474 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08003475 int count;
3476 size_t i;
3477 char *split_words[128] = {0};
3478 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3479
3480 CHECK_WPA_CTRL(idx);
3481
3482 DO_REQUEST(lynq_get_mac_cmd);
3483
qs.xiong9fbf74e2023-03-28 13:38:22 +08003484 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3485 {
3486 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08003487 return -1;
3488 }
3489
3490 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3491
qs.xiong9fbf74e2023-03-28 13:38:22 +08003492 if (count < 2)
3493 {
you.chen35020192022-05-06 11:30:57 +08003494 return -1;
3495 }
3496
qs.xiong9fbf74e2023-03-28 13:38:22 +08003497 for (i=0; i < strlen(split_words[1]); i++ )
3498 {
3499 if (split_words[1][i] != ' ')
3500 {
you.chen35020192022-05-06 11:30:57 +08003501 break;
3502 }
3503 }
3504
3505 strcpy(mac, split_words[1] + i);
3506
3507 return 0;
3508}
3509
3510int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3511{
3512// int count;
3513// char *split_words[128] = {0};
3514// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3515
3516// if (rssi == NULL) {
3517// return -1;
3518// }
3519
3520// CHECK_IDX(idx, CTRL_STA);
3521
3522// CHECK_WPA_CTRL(CTRL_STA);
3523
3524// DO_REQUEST(lynq_get_rssi_cmd);
3525
3526// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3527// return -1;
3528// }
3529
3530// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3531
3532// if (count < 2) {
3533// return -1;
3534// }
3535
3536// *rssi = atoi(split_words[1]) * -1;
3537
you.chen35020192022-05-06 11:30:57 +08003538 char lynq_cmd_ret[MAX_RET]={0};
3539
qs.xiongff0ae0f2022-10-11 15:47:14 +08003540/*******change other cmd to get rssi*******
3541 *
3542 *wl rssi ---> wl -i wlan0 rssi
3543 *
3544 ***** change by qs.xiong 20221011*******/
you.chen23c4a5f2023-04-12 16:46:00 +08003545 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiong9fbf74e2023-03-28 13:38:22 +08003546 {
you.chen23c4a5f2023-04-12 16:46:00 +08003547 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen35020192022-05-06 11:30:57 +08003548 return -1;
3549 }
you.chen9f17e4d2022-06-06 17:18:18 +08003550 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003551/****** if got rssi is 0,means sta didn't connected any device****/
3552 if(*rssi == 0)
3553 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003554 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chen23c4a5f2023-04-12 16:46:00 +08003555 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003556 }
you.chen35020192022-05-06 11:30:57 +08003557
3558 return 0;
3559}
3560
3561int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3562{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003563 RLOGD("enter lynq_get_connect_ap_band\n");
3564 if (band == NULL)
3565 {
you.chen35020192022-05-06 11:30:57 +08003566 return -1;
3567 }
3568
3569 CHECK_IDX(idx, CTRL_STA);
3570 ap_info_s ap;
3571 ap.band = -1;
3572
qs.xiong9fbf74e2023-03-28 13:38:22 +08003573 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3574 {
you.chen35020192022-05-06 11:30:57 +08003575 return -1;
3576 }
3577 *band = ap.band;
3578
3579 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003580}
you.chenf58b3c92022-06-21 16:53:48 +08003581
3582int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3583{
qs.xionge4cbf1c2023-02-28 18:22:49 +08003584 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003585
3586 if (ip == NULL)
3587 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003588 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003589 return -1;
3590 }
3591
3592 CHECK_IDX(idx, CTRL_STA);
3593
qs.xionge4cbf1c2023-02-28 18:22:49 +08003594 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003595 {
3596 return -1;
3597 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003598
3599 return inner_get_ip_by_mac(bssid, ip, 32); //better input by user
you.chenf58b3c92022-06-21 16:53:48 +08003600}
3601
qs.xiong026c5c72022-10-17 11:15:45 +08003602int lynq_ap_connect_num(int sta_number)
3603{
3604 char lynq_limit_cmd[32]={0};
3605 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003606 if((sta_number < 1 ) && (sta_number > 15))
3607 {
3608 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003609 return -1;
3610 }
3611 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3612 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003613 if(ret != 0)
3614 {
3615 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003616 }
3617 return 0;
3618}
you.chenf58b3c92022-06-21 16:53:48 +08003619
qs.xiong77905552022-10-17 11:19:57 +08003620int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3621{
3622
3623 char lynq_wifi_acs_cmd[128]={0};
3624 char lynq_cmd_mode[128]={0};
3625 char lynq_cmd_slect[128]={0};
3626
qs.xiong9fbf74e2023-03-28 13:38:22 +08003627 if((acs_mode != 2) && (acs_mode != 5))
3628 {
qs.xiong77905552022-10-17 11:19:57 +08003629 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3630 }
3631
qs.xiong9fbf74e2023-03-28 13:38:22 +08003632 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3633 {
qs.xiong77905552022-10-17 11:19:57 +08003634 return -1;
3635 }
3636
3637 CHECK_IDX(idx, CTRL_AP);
3638
3639 CHECK_WPA_CTRL(CTRL_AP);
3640
3641 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3642 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3643 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3644
3645 DO_OK_FAIL_REQUEST(cmd_disconnect);
3646 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3647 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3648 DO_OK_FAIL_REQUEST(cmd_save_config);
3649 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3650
3651 return 0;
3652}
you.chen0f5c6432022-11-07 18:31:14 +08003653//you.chen add for tv-box start
3654static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3655 FILE *fp;
3656 //printf("to exec cmd:%s\n", str_cmd);
3657 if((fp=popen(str_cmd,"r"))==NULL)
3658 {
3659 perror("popen error!");
3660 return -1;
3661 }
3662 if((fread(str_cmd_ret,max_len,1,fp))<0)
3663 {
3664 perror("fread fail!");
3665 fclose(fp);
3666 return -1;
3667 }
3668 fclose(fp);
3669 return 0;
3670}
3671
3672static int get_netmask_length(const char* mask)
3673{
3674 int masklen=0, i=0;
3675 int netmask=0;
3676
3677 if(mask == NULL)
3678 {
3679 return 0;
3680 }
3681
3682 struct in_addr ip_addr;
3683 if( inet_aton(mask, &ip_addr) )
3684 {
3685 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003686 }else
3687 {
you.chen0f5c6432022-11-07 18:31:14 +08003688 netmask = 0;
3689 return 0;
3690 }
3691
3692 while(0 == (netmask & 0x01) && i<32)
3693 {
3694 i++;
3695 netmask = netmask>>1;
3696 }
3697 masklen = 32-i;
3698 return masklen;
3699}
3700
3701static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3702 int mask_len;
3703 char *p;
3704 char tmp[64] = {0};
you.chenc9928582023-04-24 15:39:37 +08003705 sprintf(tmp, "ifconfig %s | grep Mask", s_ap_iterface_name);
3706 if (exec_cmd(tmp, str_cmd_ret, max_len) != 0)
you.chen0f5c6432022-11-07 18:31:14 +08003707 return -1;
3708 p = strstr(str_cmd_ret, "Mask:");
3709 if (p == NULL)
3710 return -1;
3711 mask_len = get_netmask_length(p + 5);
3712 if (mask_len == 0)
3713 return -1;
3714 p = strstr(str_cmd_ret, "inet addr:");
3715 if (p == NULL)
3716 return -1;
3717 strcpy(tmp, p + 10);
3718 p = strstr(tmp, " ");
3719 if (p != NULL)
3720 *p = '\0';
3721 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
3722 return 0;
3723}
3724
3725static void GBWWatchThreadProc() {
3726 int i,n, nloop, nmax, ncheckcount, nidlecount;
3727 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
3728 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
3729 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
3730 char *results[16] = {0};
3731 char str_cmd[256] = {0};
3732 char str_cmd_ret[128] = {0};
3733 char dest_ip[32] = {0};
3734 lastAP1Bytes = lastAP2Bytes = 0;
3735 lastAP1Drop = lastAP2Drop = 0;
3736 lastAP1Speed = lastAP2Speed = 0;
3737 setAP1Speed = 50;
3738 setAP2Speed = 80;
3739 nloop = 0;
3740 nmax = 6;
3741 ncheckcount = nidlecount = 0;
3742
you.chenc9928582023-04-24 15:39:37 +08003743 if (s_ap_iterface_name[0] == '\0')
3744 {
3745 RLOGE("------gbw thread run\n");
3746 return;
3747 }
3748
qs.xiong9fbf74e2023-03-28 13:38:22 +08003749 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08003750 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
3751 while (dest_ip[0] == '\0') {
3752 sleep(1);
3753 str_cmd_ret[0] = '\0';
3754 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
3755 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
3756 if (str_cmd_ret[n] == '\n'){
3757 str_cmd_ret[n] = '\0';
3758 break;
3759 }
3760 }
3761 if (str_cmd_ret[0] != '\0')
3762 {
3763 strcpy(dest_ip, str_cmd_ret);
3764 }
3765 }
3766
you.chenc9928582023-04-24 15:39:37 +08003767 system_call_v("tc qdisc del dev %s root > /dev/null 2>&1", s_ap_iterface_name);
3768 system_call_v("tc qdisc add dev %s root handle 1: htb r2q 1", s_ap_iterface_name);
3769 system_call_v("tc class add dev %s parent 1: classid 1:1 htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000", s_ap_iterface_name);
you.chen0f5c6432022-11-07 18:31:14 +08003770 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
3771 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003772 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08003773 return;
3774 }
you.chenc9928582023-04-24 15:39:37 +08003775 system_call_v("tc filter add dev %s parent 1: protocol ip prio 16 u32 match ip dst %s flowid 1:1", s_ap_iterface_name, str_cmd_ret);
3776 system_call_v("tc class add dev %s parent 1: classid 1:2 htb rate 80Mbit ceil 100Mbit prio 0 quantum 3000000", s_ap_iterface_name);
3777 system_call_v("tc filter add dev %s parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", s_ap_iterface_name, dest_ip);
you.chen0f5c6432022-11-07 18:31:14 +08003778
3779 while (1) {
3780 sleep(1);
3781 memset(str_cmd, 0, sizeof(str_cmd));
you.chenc9928582023-04-24 15:39:37 +08003782 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
3783 sprintf(str_cmd, "tc -s class show dev %s classid 1:1 | grep Sent", s_ap_iterface_name);
3784 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen0f5c6432022-11-07 18:31:14 +08003785 continue;
3786 //printf("ap1 --- %s\n", str_cmd);
you.chenc9928582023-04-24 15:39:37 +08003787 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen0f5c6432022-11-07 18:31:14 +08003788 if (n > 9) {
3789 if (strcmp(results[1], "Sent") == 0) {
3790 currAP1Bytes = atoll(results[2]);
3791 }
3792 if (strcmp(results[6], "(dropped") == 0) {
3793 currAP1Drop = atoi(results[7]);
3794 }
3795 }
3796
3797 memset(str_cmd, 0, sizeof(str_cmd));
you.chenc9928582023-04-24 15:39:37 +08003798 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
3799 sprintf(str_cmd, "tc -s class show dev %s classid 1:2 | grep Sent", s_ap_iterface_name);
3800 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen0f5c6432022-11-07 18:31:14 +08003801 continue;
3802 //printf("ap2 --- %s\n", str_cmd);
you.chenc9928582023-04-24 15:39:37 +08003803 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen0f5c6432022-11-07 18:31:14 +08003804 if (n > 9) {
3805 if (strcmp(results[1], "Sent") == 0) {
3806 currAP2Bytes = atoll(results[2]);
3807 }
3808 if (strcmp(results[6], "(dropped") == 0) {
3809 currAP2Drop = atoi(results[7]);
3810 }
3811 }
3812
3813 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
3814 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
3815 lastAP1Bytes = currAP1Bytes;
3816 lastAP2Bytes = currAP2Bytes;
3817 continue;
3818 }
3819
3820 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
3821 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
3822 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
3823 lastAP1Speed = currAP1Speed;
3824 lastAP2Speed = currAP2Speed;
3825 lastAP1Bytes = currAP1Bytes;
3826 lastAP2Bytes = currAP2Bytes;
3827
3828 currSetAP1Speed = setAP1Speed;
3829 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
3830 ncheckcount++;
3831 if (ncheckcount > 3) {
3832 ncheckcount = 0;
3833 currSetAP1Speed = 5;
3834 }
3835 }
3836 else {
3837 ncheckcount = 0;
3838 if (currAP1Speed < 5)
3839 nidlecount++;
3840 else
3841 nidlecount = 0;
3842
3843 }
3844
3845 if (nidlecount > 60 ){
3846 currSetAP1Speed = 50;
3847 }
3848
3849 if (currSetAP1Speed != setAP1Speed) {
3850 setAP1Speed = currSetAP1Speed;
you.chenc9928582023-04-24 15:39:37 +08003851 system_call_v(str_cmd, "tc class replace dev %s parent 1: classid 1:1 htb rate %dMbit ceil %dMbit prio 2 quantum 3000",
3852 s_ap_iterface_name, setAP1Speed, (int)(setAP1Speed*1.4));
you.chen0f5c6432022-11-07 18:31:14 +08003853 }
3854 }
3855}
3856
3857int enableGBW(const char* mac) {
3858 int i,len;
3859 char get_ipaddr_cmd[128]={0};
3860 ap_info_s *ap;
3861 device_info_s * list;
3862
3863 if (mac == NULL || g_gbw_enabled == 1)
3864 return -1;
3865 len = strlen(mac);
3866 g_gbw_mac = malloc(len + 1);
3867 for(i=0;i<len;i++) {
3868 if (mac[i] >= 'A' && mac[i] <= 'Z')
3869 {
3870 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
3871 }
3872 else
3873 g_gbw_mac[i] = mac[i];
3874 }
3875 g_gbw_mac[i] = '\0';
3876 g_gbw_enabled = 1;
3877
3878 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
3879 if (system(get_ipaddr_cmd) == 0) {
3880 //startGBW();
3881 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
3882 for (i=0;i<len;i++) {
3883 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
3884 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
3885 startGBW();
3886 }
3887 free(ap);
3888 free(list);
3889 }
3890 }
3891 return 0;
3892}
3893
3894int disableGBW() {
3895 stopGBW();
3896 free(g_gbw_mac);
3897 g_gbw_mac = NULL;
3898 g_gbw_enabled = 1;
3899 return 0;
3900}
3901
3902static int startGBW() {
3903 if (g_gbw_watcher_pid != 0) {
3904 stopGBW();
3905 }
3906 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
3907}
3908
3909static int stopGBW() {
3910 void* retval;
you.chenc9928582023-04-24 15:39:37 +08003911 char cmd[64] = {0};
you.chen0f5c6432022-11-07 18:31:14 +08003912 pthread_cancel(g_gbw_watcher_pid);
3913 pthread_join(g_gbw_watcher_pid, &retval);
3914 g_gbw_watcher_pid = 0;
you.chenc9928582023-04-24 15:39:37 +08003915 sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
3916 if (s_ap_iterface_name[0] != '\0')
3917 {
3918 sprintf(cmd, "tc qdisc del dev %s root", s_ap_iterface_name);
3919 system(cmd);
3920 }
you.chen0f5c6432022-11-07 18:31:14 +08003921}
3922//you.chen add for tv-box end