blob: 51b3ea2d85dd7325d54aea4e188b1f957f1da32c [file] [log] [blame]
qs.xiong799dab02022-03-14 09:12:12 -04001/**@File lib_wifi6.c
2* @Brief :about function test
3* @details :
you.chen87ff5172022-05-06 11:30:57 +08004* @Author : you.chen
5* @Date : 2022-4-6
qs.xiong799dab02022-03-14 09:12:12 -04006* @Version : V1.0
7* @copy ritght : Copyright (c) MobileTek
8*/
9#include <log/log.h>
qs.xiong8d42bb92022-03-02 09:43:11 -050010#include <stdio.h>
11#include <sys/types.h>
you.chen87ff5172022-05-06 11:30:57 +080012#include <stdlib.h>
qs.xiong8d42bb92022-03-02 09:43:11 -050013#include <string.h>
qs.xiong8d42bb92022-03-02 09:43:11 -050014#include "libwifi6.h"
you.chen87ff5172022-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.xiongf1e48bb2023-03-28 13:38:22 +080024#include "log/log.h"
you.chenf9d718d2023-04-14 18:17:09 +080025#include <sys/time.h>
26#include <asm/errno.h>
qs.xiong8d42bb92022-03-02 09:43:11 -050027
qs.xiong799dab02022-03-14 09:12:12 -040028#ifdef __cplusplus
29extern "C" {
30#endif
31#ifdef __cplusplus
32}
33#endif
you.chen87ff5172022-05-06 11:30:57 +080034
qs.xiongf1e48bb2023-03-28 13:38:22 +080035#undef LOG_TAG
36#define LOG_TAG "LYNQ_WIFI"
you.chen87ff5172022-05-06 11:30:57 +080037#define MAX_CMD 128
38#define MAX_RET 4096
qs.xiongd189c542022-03-31 00:58:23 -040039#define MODE_LEN 10
you.chen87ff5172022-05-06 11:30:57 +080040#define CTRL_STA 0
41#define CTRL_AP 1
42#define AP_NETWORK_0 0
qs.xionga4ba25a2023-05-03 13:12:07 +080043#define STA_MAX_SAVED_AP_NUM 50
you.chen87ff5172022-05-06 11:30:57 +080044
45pthread_t g_ap_watcher_pid = 0;
46volatile int g_ap_watcher_stop_flag = 0;
you.chen6a9361d2022-05-18 10:28:19 +080047volatile int g_ap_watcher_started_flag = 0;
you.chen87ff5172022-05-06 11:30:57 +080048
49pthread_t g_sta_watcher_pid = 0;
50volatile int g_sta_watcher_stop_flag = 0;
you.chen61c7aee2022-08-06 17:01:16 +080051volatile int g_sta_scan_finish_flag = 1;
you.chen6a9361d2022-05-18 10:28:19 +080052volatile int g_sta_watcher_started_flag = 0;
you.chen87ff5172022-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.chenc7357f22022-05-16 17:55:28 +080064const char * cmd_disconnect = "DISCONNECT";
65const char * cmd_remove_all = "REMOVE_NETWORK all";
you.chen87ff5172022-05-06 11:30:57 +080066const char * state_scan_result = "CTRL-EVENT-SCAN-RESULTS";
you.chen61c7aee2022-08-06 17:01:16 +080067const char * STATE_COMPLETED = "COMPLETED";
you.chen87ff5172022-05-06 11:30:57 +080068
you.chen92668da2023-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.chencd882682023-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.chened802ab2023-02-13 10:50:35 +080082struct local_wpa_ctrl{
83 struct wpa_ctrl *ctrl;
84 pthread_mutex_t mutex;
85};
86
you.chenf9d718d2023-04-14 18:17:09 +080087
you.chened802ab2023-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.chen87ff5172022-05-06 11:30:57 +080091
you.chen2ef1c552022-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.chen87ff5172022-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.xiong99b48d62022-04-07 05:41:29 -0400105
you.chenf9d718d2023-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.chencd882682023-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.chen377987d2023-05-10 15:56:26 +0800173static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
174
175static const char * inner_get_ap_interface_name()
176{
177 char * p;
178 char cmd[128]={0};
179
180 sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
181 if (0 != exec_cmd(cmd, s_ap_iterface_name, sizeof(s_ap_iterface_name)) || s_ap_iterface_name[0] == '\0')
182 {
183 memset(s_ap_iterface_name, 0, sizeof (s_ap_iterface_name));
184 return NULL;
185 }
186 p = strchr(s_ap_iterface_name, ' ');
187 if (NULL != p)
188 {
189 *p = '\0';
190 }
191 p = strchr(s_ap_iterface_name, '\n');
192 if (NULL != p)
193 {
194 *p = '\0';
195 }
196 if (s_ap_iterface_name[0] == '\0')
197 {
198 return NULL;
199 }
200
201 return s_ap_iterface_name;
202}
203
you.chenf9d718d2023-04-14 18:17:09 +0800204static void check_tether_and_notify()
205{
206 RLOGD("check_tether_and_notify called");
you.chen377987d2023-05-10 15:56:26 +0800207 if (inner_get_ap_interface_name() == NULL || 0 == system_call_v("ifconfig | grep %s", s_ap_iterface_name))
you.chenf9d718d2023-04-14 18:17:09 +0800208 {
209 return;
210 }
211 pthread_mutex_lock(&s_global_check_mutex);
212 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
213 pthread_cond_signal(&s_global_check_cond);
214 pthread_mutex_unlock(&s_global_check_mutex);
215}
216
you.chened802ab2023-02-13 10:50:35 +0800217static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
218 char *reply, size_t *reply_len,
219 void (*msg_cb)(char *msg, size_t len))
220{
221 int ret;
222 if (ctrl->ctrl == NULL) {
qs.xiongf1e48bb2023-03-28 13:38:22 +0800223 RLOGE("local_wpa_ctrl_request ctrl is null\n");
you.chened802ab2023-02-13 10:50:35 +0800224 return -1;
225 }
226 pthread_mutex_lock(&ctrl->mutex);
227 ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
228 pthread_mutex_unlock(&ctrl->mutex);
you.chenf9d718d2023-04-14 18:17:09 +0800229 if (ret != 0)
230 {
231 notify_service_invoke_fail(ret);
232 }
you.chened802ab2023-02-13 10:50:35 +0800233 return ret;
234}
235
236static struct local_wpa_ctrl * inner_get_wpa_ctrl(int index) {
237 int repeat_cnt;
238 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
239 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
qs.xiongf1e48bb2023-03-28 13:38:22 +0800240 RLOGD("inner_get_wpa_ctrl\n");
you.chened802ab2023-02-13 10:50:35 +0800241 for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
242 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
243// printf("wait enable finish\n");
244 usleep(500 * 1000);
245 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
246 }
247 if (NULL == g_lynq_wpa_ctrl[index]) {
qs.xiongf1e48bb2023-03-28 13:38:22 +0800248 RLOGE("NULL == g_lynq_wpa_ctrl[index]");
you.chened802ab2023-02-13 10:50:35 +0800249 goto out_addr;
250 }
251 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
252 g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
253 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
qs.xiongf1e48bb2023-03-28 13:38:22 +0800254 RLOGE("wpa_ctrl_open fail\n");
you.chened802ab2023-02-13 10:50:35 +0800255 goto out_addr;
256 }
257 pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
258 }
259 lynq_wpa_ctrl = g_lynq_wpa_ctrl[index];
260out_addr:
261 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
262 return lynq_wpa_ctrl;
263}
264
qs.xiong99b48d62022-04-07 05:41:29 -0400265#define PRINT_AND_RETURN_VALUE(str,value) \
qs.xiong99b48d62022-04-07 05:41:29 -0400266{\
you.chen87ff5172022-05-06 11:30:57 +0800267 perror((str));\
268 return (value);\
qs.xiong99b48d62022-04-07 05:41:29 -0400269}
270
you.chen87ff5172022-05-06 11:30:57 +0800271#define CHECK_IDX(idx, type) do { \
272 if ( (idx == LYNQ_WIFI_INTERFACE_0 && type != CTRL_STA) || (idx == LYNQ_WIFI_INTERFACE_1 && type != CTRL_AP) \
273 || idx < LYNQ_WIFI_INTERFACE_0 || idx > LYNQ_WIFI_INTERFACE_1 ) { \
qs.xiongf1e48bb2023-03-28 13:38:22 +0800274 RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
you.chen87ff5172022-05-06 11:30:57 +0800275 return -1; \
276 } \
277 }while (0)
278
279#define CHECK_WPA_CTRL(index) int ret = 0;\
280 size_t reply_len = MAX_RET; \
281 char cmd_reply[MAX_RET]={0}; \
you.chened802ab2023-02-13 10:50:35 +0800282 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
you.chen87ff5172022-05-06 11:30:57 +0800283 do{ \
you.chened802ab2023-02-13 10:50:35 +0800284 lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
285 if (NULL == lynq_wpa_ctrl) return -1; \
you.chen87ff5172022-05-06 11:30:57 +0800286 }while(0)
287
288#define DO_REQUEST(cmd_str) do { \
289 reply_len = MAX_RET;\
290 cmd_reply[0] = '\0'; \
qs.xiongf1e48bb2023-03-28 13:38:22 +0800291 RLOGD("to call [%s]\n", cmd_str); \
you.chened802ab2023-02-13 10:50:35 +0800292 ret = local_wpa_ctrl_request(lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL); \
you.chen87ff5172022-05-06 11:30:57 +0800293 if (ret != 0) { \
qs.xiongf1e48bb2023-03-28 13:38:22 +0800294 RLOGE("call "#cmd_str" fail %d\n", ret); \
you.chen87ff5172022-05-06 11:30:57 +0800295 return ret; \
296 } \
297 cmd_reply[reply_len+1] = '\0'; \
qs.xiongf1e48bb2023-03-28 13:38:22 +0800298 RLOGD("cmd replay [ %s ]\n", cmd_reply); \
you.chen87ff5172022-05-06 11:30:57 +0800299 }while(0)
300
301#define DO_OK_FAIL_REQUEST(cmd_str) do { \
302 DO_REQUEST(cmd_str); \
303 if (reply_len >=4 && memcmp(cmd_reply, "FAIL", 4) == 0 ) {\
qs.xiongf1e48bb2023-03-28 13:38:22 +0800304 RLOGE("cmd "#cmd_str" return FAIL\n"); \
you.chen87ff5172022-05-06 11:30:57 +0800305 return -1; \
306 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
qs.xiongf1e48bb2023-03-28 13:38:22 +0800307 RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
you.chen87ff5172022-05-06 11:30:57 +0800308 return -1; \
309 } \
310 }while (0)
311
312
you.chen92668da2023-04-13 13:49:45 +0800313static int check_connection(struct wpa_ctrl * wpa_ctrl)
314{
315 size_t reply_len = MAX_RET;
316 char cmd_reply[MAX_RET]={0};
317 int ret;
318
319 RLOGD("check_connection [%p]", wpa_ctrl);
320 ret = wpa_ctrl_request(wpa_ctrl, cmd_ping, strlen(cmd_ping), cmd_reply, &reply_len, NULL);
321
322 if (ret != 0 || reply_len < 4 || memcmp(cmd_reply, rsp_pong, 4) != 0)
323 {
324 RLOGE("check_connection error: ctrl [%p], ret [%d], reply_len [%d], rsp [%s]", wpa_ctrl, ret, reply_len, cmd_reply);
you.chenf9d718d2023-04-14 18:17:09 +0800325 if (ret != 0)
326 {
327 notify_service_invoke_fail(ret);
328 }
you.chen92668da2023-04-13 13:49:45 +0800329 return -1;
330 }
331
332 return 0;
333}
334
335/**
336 * @brief check_pending_msg
337 * @param lynq_wpa_ctrl
338 * @return 1 has msg, 0 no msg, -1 error
339 */
340static int check_pending_msg(struct wpa_ctrl ** pp_lynq_wpa_ctrl, int type, int* idle_count, int *started_flag)
341{
342 int ret;
343
344 if (*pp_lynq_wpa_ctrl == NULL) // need connect
345 {
346 *pp_lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[type]); //@todo temp change
347 if (*pp_lynq_wpa_ctrl == NULL)
348 {
349 usleep(SLEEP_TIME_ON_IDLE);
350 return -1;
351 }
352
353 ret = wpa_ctrl_attach(*pp_lynq_wpa_ctrl);
354 if (ret == 0) // attach success
355 {
356 *started_flag = 1;
357 }
358 else
359 {
you.chenf9d718d2023-04-14 18:17:09 +0800360 RLOGE("[wifi error]sta watch thread wpa_ctrl_attach fail");
you.chen92668da2023-04-13 13:49:45 +0800361 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
362 *pp_lynq_wpa_ctrl = NULL;
363 *idle_count = 0;
you.chenf9d718d2023-04-14 18:17:09 +0800364 notify_service_invoke_fail(-2);
you.chen92668da2023-04-13 13:49:45 +0800365 usleep(SLEEP_TIME_ON_IDLE);
366 return -1;
367 }
368 }
369
370 ret = wpa_ctrl_pending(*pp_lynq_wpa_ctrl);
371 if ( ret == 0) // no pending messages
372 {
373 usleep(SLEEP_TIME_ON_IDLE);
374 *idle_count += 1;
375 if (*idle_count > MAX_IDLE_COUNT)
376 {
377 if (check_connection(*pp_lynq_wpa_ctrl) != 0)
378 {
379 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
380 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
381 *pp_lynq_wpa_ctrl = NULL;
382 *idle_count = 0;
383 return -1;
384 }
385 *idle_count = 0;
386 }
387 return 0;
388 }
389 else if ( ret == -1) // on error
390 {
391 RLOGE("[wifi error]sta wpa_ctrl_pending");
392 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
393 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
394 *pp_lynq_wpa_ctrl = NULL;
395 *idle_count = 0;
you.chenf9d718d2023-04-14 18:17:09 +0800396 notify_service_invoke_fail(ret);
you.chen92668da2023-04-13 13:49:45 +0800397 return -1;
398 }
399
400 *idle_count = 0;
401 return 1;
402}
403
you.chen87ff5172022-05-06 11:30:57 +0800404static void APWatcherThreadProc() {
405 size_t len = MAX_RET;
406 char msg_notify[MAX_RET];
you.chen92668da2023-04-13 13:49:45 +0800407 int idle_count = 0;
you.chen87ff5172022-05-06 11:30:57 +0800408
you.chenc7357f22022-05-16 17:55:28 +0800409 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen01276462022-05-25 10:09:47 +0800410 g_ap_watcher_stop_flag = 0;
you.chen87ff5172022-05-06 11:30:57 +0800411
qs.xiongf1e48bb2023-03-28 13:38:22 +0800412 while (g_ap_watcher_stop_flag == 0)
413 {
you.chen92668da2023-04-13 13:49:45 +0800414 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_AP, &idle_count, &g_ap_watcher_started_flag) != 1)
415 {
you.chenf9d718d2023-04-14 18:17:09 +0800416 if (g_ap_callback_func != NULL && idle_count == MAX_IDLE_COUNT - 100 )
417 {
418 check_tether_and_notify();
419 }
420
you.chen87ff5172022-05-06 11:30:57 +0800421 continue;
422 }
you.chen92668da2023-04-13 13:49:45 +0800423
you.chenc7357f22022-05-16 17:55:28 +0800424 memset(msg_notify, 0, MAX_RET);
425 len = MAX_RET;
qs.xiongf1e48bb2023-03-28 13:38:22 +0800426 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
you.chen92668da2023-04-13 13:49:45 +0800427 {
you.chen87ff5172022-05-06 11:30:57 +0800428 msg_notify[len+1] = '\0';
qs.xiongaf960232023-04-12 11:40:02 +0800429 RLOGD("APWatcherThreadProc ap------> %s\n", msg_notify);
you.chen92668da2023-04-13 13:49:45 +0800430 //you.chen change for tv-box start
qs.xiongf1e48bb2023-03-28 13:38:22 +0800431 if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
you.chen92668da2023-04-13 13:49:45 +0800432 {
you.chen2ef1c552022-11-07 18:31:14 +0800433 if (g_ap_callback_func != NULL)
434 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_DISCONNECT);
qs.xiongf1e48bb2023-03-28 13:38:22 +0800435 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chen92668da2023-04-13 13:49:45 +0800436 {
qs.xiongf1e48bb2023-03-28 13:38:22 +0800437 RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
438 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chen92668da2023-04-13 13:49:45 +0800439 {
you.chen2ef1c552022-11-07 18:31:14 +0800440 stopGBW();
441 }
442 }
you.chen87ff5172022-05-06 11:30:57 +0800443 }
qs.xiongf1e48bb2023-03-28 13:38:22 +0800444 else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
you.chen92668da2023-04-13 13:49:45 +0800445 {
you.chen2ef1c552022-11-07 18:31:14 +0800446 if (g_ap_callback_func != NULL)
447 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_CONNECT);
qs.xiongf1e48bb2023-03-28 13:38:22 +0800448 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chen92668da2023-04-13 13:49:45 +0800449 {
qs.xiongf1e48bb2023-03-28 13:38:22 +0800450 RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
451 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chen92668da2023-04-13 13:49:45 +0800452 {
you.chen2ef1c552022-11-07 18:31:14 +0800453 startGBW();
454 }
455 }
you.chen87ff5172022-05-06 11:30:57 +0800456 }
you.chen92668da2023-04-13 13:49:45 +0800457 //you.chen add for tv-box end
you.chen87ff5172022-05-06 11:30:57 +0800458 } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
459 } // end while (g_ap_watcher_stop_flag == 0)
qs.xiongf1e48bb2023-03-28 13:38:22 +0800460 if (lynq_wpa_ctrl != NULL)
461 {
you.chen01276462022-05-25 10:09:47 +0800462 wpa_ctrl_detach(lynq_wpa_ctrl);
463 wpa_ctrl_close(lynq_wpa_ctrl);
464 }
qs.xiong99b48d62022-04-07 05:41:29 -0400465}
466
you.chenf9d718d2023-04-14 18:17:09 +0800467static void inner_check_connect_error(const char * event_msg, lynq_wifi_sta_status_s state, error_number_s error_num)
468{
469 char * p;
470 const char * try_associat_flag = "Trying to associate";
471 const char * associated_flag = "Associated with ";
472
473 pthread_mutex_lock(&s_global_check_mutex);
474 if (s_sta_status < INNER_STA_STATUS_CONNECTING || s_sta_status >= INNER_STA_STATUS_CONNECTED) //not in connecting stage, egnore
475 {
476 pthread_mutex_unlock(&s_global_check_mutex);
477 return;
478 }
479
480 if (state == LYNQ_WIFI_STATUS_EGNORE)
481 {
482 if (strstr(event_msg, try_associat_flag) != NULL && strstr(event_msg, s_sta_current_connecting_ssid) != NULL) //associating request ssid
483 {
484 s_sta_status = INNER_STA_STATUS_ASSOCIATING;
485 }
486 else if (s_sta_status == INNER_STA_STATUS_ASSOCIATING && (p=strstr(event_msg, associated_flag)) != NULL)
487 {
488 s_sta_status = INNER_STA_STATUS_ASSOCIATED;
489 }
490 }
491 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
492 {
493 s_sta_error_number = error_num;
494 if (s_sta_status >= INNER_STA_STATUS_ASSOCIATING && strstr(event_msg, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL && error_num != LYNQ_WAIT_CONNECT_ACTIVE)
495 {
496 s_sta_status = INNER_STA_STATUS_DISCONNECTED;
497 pthread_cond_signal(&s_global_check_cond);
498 }
499 }
500 else if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
501 {
502 s_sta_status = INNER_STA_STATUS_CONNECTED;
503 pthread_cond_signal(&s_global_check_cond);
504 }
505 pthread_mutex_unlock(&s_global_check_mutex);
506}
507
qs.xiongaf960232023-04-12 11:40:02 +0800508void get_state_error(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error)
509{
510 char *pReason;
511 *error = LYNQ_WAIT_CONNECT_ACTIVE;
512 if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
513 {
514 *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
515 RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d\n",*state,*error);
516 return;
517 }
518
519 if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
520 {
521 *state = LYNQ_WIFI_STA_STATUS_CONNECT;
522 RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
523 return;
524 }
525
526 if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
527 {
528 pReason = strstr(modify, "reason=");
529 if (pReason != NULL)
530 {
531 pReason += strlen("reason=");
532 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
533 {
534 *error = LYNQ_TIME_OUT;
535 }
536 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
537 {
538 *error = LYNQ_PSW_ERROR;
539 }
540 else
541 {
542 *error = LYNQ_UNSPECIFIED_REASON;
543 }
544 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
545 RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d\n",*state,*error);
546 return;
547 }
548 else
549 {
550 *error = LYNQ_UNSPECIFIED_REASON;
551 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
552 return;
553 }
554
555 }
556
557 if (strstr(modify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
558 {
559 *error = LYNQ_NOT_FIND_AP;
560 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
561 RLOGD("CTRL-EVENT-NETWORK-NOT-FOUND state:%d,error:%d\n",*state,*error);
562 return;
563 }
564
565
566 if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
567 {
568 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
569 pReason = strstr(modify, "status_code=");
570 if (pReason != NULL)
571 {
572 pReason += strlen("status_code=");
573 if (memcmp(pReason, "17", 2) == 0)
574 {
575 *error = LYNQ_AP_UNABLE_HANDLE;
576 }
577 else if (memcmp(pReason, "1",1) == 0)
578 {
579 *error = LYNQ_UNSPECIFIED_REASON;
580 }
581 else
582 {
583 *error = LYNQ_UNSPECIFIED_REASON;
584 }
585
586 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
587 RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d\n",*state,*error);
588 return;
589 }
590 else
591 {
592 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
593 *error = LYNQ_UNSPECIFIED_REASON;
594 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
595 RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d\n",*state,*error);
596 return;
597 }
598 }
599
600 if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
601 {
602 RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
603 *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
604 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
605 RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d\n",*state,*error);
606 return;
607 }
608
609 if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
610 {
611 RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
612 *error = LYNQ_WAIT_CONNECT_ACTIVE;
613 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
614 RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
615 return;
616 }
617
you.chen4ca39eb2023-04-13 14:05:45 +0800618 RLOGD("EVENT : %s\n", modify);
qs.xiongaf960232023-04-12 11:40:02 +0800619 *error = LYNQ_UNSPECIFIED_REASON;
you.chen4ca39eb2023-04-13 14:05:45 +0800620 *state = LYNQ_WIFI_STATUS_EGNORE;
qs.xiongaf960232023-04-12 11:40:02 +0800621 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
622 return;
623
624}
625
you.chenf9d718d2023-04-14 18:17:09 +0800626static void notify_connect_status(lynq_wifi_sta_status_s state, error_number_s error)
627{
628 if (g_sta_callback_func != NULL && state != LYNQ_WIFI_STATUS_EGNORE)
629 {
630 RLOGD("STAWatcherThreadProc callback begin ------> %d %d\n", state, error);
631 g_sta_callback_func(g_sta_callback_priv, state, error);
632 RLOGD("STAWatcherThreadProc callback end ------> %d %d\n", state, error);
633 }
634}
635
you.chen87ff5172022-05-06 11:30:57 +0800636static void STAWatcherThreadProc() {
637 size_t len = MAX_RET;
638 char msg_notify[MAX_RET];
you.chen87ff5172022-05-06 11:30:57 +0800639 error_number_s error;
you.chencd882682023-04-24 15:39:37 +0800640 lynq_wifi_sta_status_s state, last_state = -1;
you.chen92668da2023-04-13 13:49:45 +0800641 int idle_count = 0;
qs.xiongd189c542022-03-31 00:58:23 -0400642
you.chenc7357f22022-05-16 17:55:28 +0800643 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen01276462022-05-25 10:09:47 +0800644 g_sta_watcher_stop_flag = 0;
you.chen87ff5172022-05-06 11:30:57 +0800645
you.chenf9d718d2023-04-14 18:17:09 +0800646 RLOGD("STAWatcherThreadProc thread started ------");
qs.xiongf1e48bb2023-03-28 13:38:22 +0800647 while (g_sta_watcher_stop_flag == 0)
648 {
you.chen92668da2023-04-13 13:49:45 +0800649 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
qs.xiongaf960232023-04-12 11:40:02 +0800650 {
you.chen87ff5172022-05-06 11:30:57 +0800651 continue;
652 }
you.chen92668da2023-04-13 13:49:45 +0800653
you.chenc7357f22022-05-16 17:55:28 +0800654 memset(msg_notify, 0, MAX_RET);
655 len = MAX_RET;
qs.xiongf1e48bb2023-03-28 13:38:22 +0800656 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiongaf960232023-04-12 11:40:02 +0800657 {
you.chen87ff5172022-05-06 11:30:57 +0800658 msg_notify[len+1] = '\0';
qs.xiongf1e48bb2023-03-28 13:38:22 +0800659 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
660 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiongaf960232023-04-12 11:40:02 +0800661 {
you.chen87ff5172022-05-06 11:30:57 +0800662 g_sta_scan_finish_flag = 1;
663 }
664
qs.xiongf1e48bb2023-03-28 13:38:22 +0800665 if (g_sta_callback_func == NULL)
qs.xiongaf960232023-04-12 11:40:02 +0800666 {
you.chen87ff5172022-05-06 11:30:57 +0800667 continue;
668 }
qs.xiongaf960232023-04-12 11:40:02 +0800669 get_state_error(msg_notify,&state,&error);
you.chenf9d718d2023-04-14 18:17:09 +0800670 notify_connect_status(state, error);
671
672 if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
you.chen4ca39eb2023-04-13 14:05:45 +0800673 {
you.chenf9d718d2023-04-14 18:17:09 +0800674 inner_check_connect_error(msg_notify, state, error);
you.chencd882682023-04-24 15:39:37 +0800675 if (last_state != state)
676 {
677 if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
678 {
679 system_call_v("%s %s", sta_status_change_script, "connect");
680 }
681 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
682 {
683 system_call_v("%s %s", sta_status_change_script, "disconnect");
684 }
685 }
686
687 last_state = state;
you.chen4ca39eb2023-04-13 14:05:45 +0800688 }
you.chen87ff5172022-05-06 11:30:57 +0800689 }
690 }
qs.xiongf1e48bb2023-03-28 13:38:22 +0800691 if (lynq_wpa_ctrl != NULL)
692 {
you.chen01276462022-05-25 10:09:47 +0800693 wpa_ctrl_detach(lynq_wpa_ctrl);
694 wpa_ctrl_close(lynq_wpa_ctrl);
695 }
qs.xiongd189c542022-03-31 00:58:23 -0400696}
697
you.chenf9d718d2023-04-14 18:17:09 +0800698// this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
699static void GlobalWatcherThreadProc()
700{
701 int ret, connect_timeout, service_abnormal;
702 error_number_s error_num = -1;
703 inner_sta_status_s sta_status;
704 scan_info_s *scan_list = NULL;
705 int i, scan_len=0;
706 char connecting_ssid[64];
707 struct timeval now;
708
709 RLOGD("GlobalWatcherThreadProc start to run");
710
711 while (1)
712 {
713 pthread_mutex_lock(&s_global_check_mutex);
714 pthread_cond_wait(&s_global_check_cond,&s_global_check_mutex);
715 if (s_sta_status == INNER_STA_STATUS_CONNECTED)
716 {
717 pthread_mutex_unlock(&s_global_check_mutex);
718 usleep(50*1000);
719 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
720 continue;
721 }
722
723 connect_timeout = 0;
724 service_abnormal = 0;
725 if (s_sta_status >= INNER_STA_STATUS_CONNECTING && s_sta_status < INNER_STA_STATUS_CONNECTED)
726 {
727 while (1)
728 {
729 ret = pthread_cond_timedwait(&s_global_check_cond, &s_global_check_mutex, &s_sta_connect_timeout);
730 if (ret == ETIME)
731 {
732 connect_timeout = 1;
733 }
734 else if (ret != 0)
735 {
736 gettimeofday(&now,NULL);
737 if (now.tv_sec < s_sta_connect_timeout.tv_sec) //time not arrive
738 {
739 usleep(SLEEP_TIME_ON_IDLE);
740 continue;
741 }
742 connect_timeout = 1;
743 }
744 sta_status = s_sta_status;
745 error_num = s_sta_error_number;
746 s_sta_status = INNER_STA_STATUS_INIT;
747 strcpy(connecting_ssid, s_sta_current_connecting_ssid);
748 memset(&s_sta_connect_timeout, 0, sizeof (s_sta_connect_timeout));
749 memset(&s_sta_current_connecting_ssid, 0, sizeof (s_sta_current_connecting_ssid));
750 break;
751 }
752 }
753 if (s_service_invoke_timeout_cnt > 10)
754 {
755 service_abnormal = 1;
756 s_service_invoke_timeout_cnt = 0;
757 }
758 pthread_mutex_unlock(&s_global_check_mutex);
759
760 if (service_abnormal == 1)
761 {
762 sleep(1);
763 RLOGE("wpa service is abnormal info app to exit");
764 notify_connect_status(LYNQ_WIFI_STA_SERVICE_ABNORMAL, -1);
765 if (g_ap_callback_func != NULL)
766 {
767 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_SERVICE_ABNORMAL);
768 }
769 sleep(FAKE_MAX_INT_VALUE); // wait process to exit
770 }
771
772 if (sta_status == INNER_STA_STATUS_CANCEL)
773 {
774 continue;
775 }
776 else if (sta_status == INNER_STA_STATUS_CONNECTED)
777 {
778 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
779 }
780 else if (connect_timeout == 0 && error_num == LYNQ_NOT_FIND_AP) // not found ap maybe mismatch auth
781 {
782 if (0 == lynq_get_scan_list(0, &scan_list, &scan_len) && NULL != scan_list) // if not found, but scan result exist, maybe auth error
783 {
784 for(i=0; i < scan_len;i++)
785 {
786 if (strcmp(scan_list[i].ssid, connecting_ssid) == 0)
787 {
788 error_num = LYNQ_AUTH_ERROR;
789 break;
790 }
791 }
792 free(scan_list);
793 }
794 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
795 }
796 else if (connect_timeout == 0)
797 {
798 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
799 }
800 else // wait timeout
801 {
802 if (0 != lynq_get_sta_status(LYNQ_WIFI_INTERFACE_0, &sta_status)) // get status fail
803 {
804 ; // wpa service abnormal
805 }
806 else if (sta_status == LYNQ_WIFI_STA_STATUS_ENABLE) // connect ok
807 {
808 RLOGD("GlobalWatcherThreadProc notify connected");
809 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
810 }
811 else
812 {
813 RLOGD("GlobalWatcherThreadProc notify timeout");
814 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, LYNQ_TIME_OUT);
815 }
816 }
817 } // while (1)
818}
819
qs.xiong799dab02022-03-14 09:12:12 -0400820int lynq_wifi_enable(void)
821{
you.chen87ff5172022-05-06 11:30:57 +0800822 int ret = 0;
you.chenc7357f22022-05-16 17:55:28 +0800823 int i;
qs.xiongf1e48bb2023-03-28 13:38:22 +0800824 RLOGD("enter lynq_wifi_enable");
you.chened802ab2023-02-13 10:50:35 +0800825 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
826
qs.xiongf1e48bb2023-03-28 13:38:22 +0800827 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
828 {
you.chened802ab2023-02-13 10:50:35 +0800829 goto out_enable;
830 }
831
you.chencd882682023-04-24 15:39:37 +0800832 ret = system(start_wg870_service_script);
qs.xiongf1e48bb2023-03-28 13:38:22 +0800833 if (ret != 0)
834 {
835 //printf("service state %d\n", ret);
836 RLOGE("[wifi error]service state %d",ret);
you.chened802ab2023-02-13 10:50:35 +0800837 ret = -1;
838 goto out_enable;
you.chen87ff5172022-05-06 11:30:57 +0800839 }
lhb29aec32022-10-11 18:55:36 +0800840
you.chenf9d718d2023-04-14 18:17:09 +0800841 if (g_global_watcher_pid == 0 ) // this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
842 {
843 ret=pthread_create(&g_global_watcher_pid,NULL,GlobalWatcherThreadProc,NULL);
844 if(ret<0)
845 {
846 RLOGE("[wifi error]creat GlobalWatcherThreadProc fail");
847 ret = -1;
848 goto out_enable;
849 }
850 }
851
you.chened802ab2023-02-13 10:50:35 +0800852 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
853 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
854 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
855 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
856out_enable:
857 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen87ff5172022-05-06 11:30:57 +0800858 return ret;
qs.xiong8d42bb92022-03-02 09:43:11 -0500859}
860
qs.xiong799dab02022-03-14 09:12:12 -0400861int lynq_wifi_disable(void)
862{
qs.xiongf1e48bb2023-03-28 13:38:22 +0800863 RLOGD("enter lynq_wifi_disable");
you.chened802ab2023-02-13 10:50:35 +0800864 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen87ff5172022-05-06 11:30:57 +0800865 g_ap_watcher_stop_flag = 1;
866 g_sta_watcher_stop_flag = 1;
867 if (g_ap_watcher_pid != 0)
868 pthread_join(g_ap_watcher_pid, NULL);
869 if (g_sta_watcher_pid != 0)
870 pthread_join(g_sta_watcher_pid, NULL);
871 if (g_lynq_wpa_ctrl[0] != NULL)
872 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
873 if (g_lynq_wpa_ctrl[1] != NULL)
874 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
875 g_ap_watcher_pid = 0;
876 g_sta_watcher_pid = 0;
877 g_lynq_wpa_ctrl[0] = NULL;
878 g_lynq_wpa_ctrl[1] = NULL;
879 system("systemctl stop wg870_drv_insmod.service");
you.chened802ab2023-02-13 10:50:35 +0800880 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
881 return 0;
882}
883
884static inline char inner_convert_char(char in)
885{
886 if (in >= '0' && in <= '9')
887 {
888 return in - '0';
889 }
890 else if (in >= 'a' && in <= 'f')
891 {
892 return in - 'a' + 10;
893 }
894 else if (in >= 'A' && in <= 'F')
895 {
896 return in - 'A' + 10;
897 }
898 else
899 {
900 return '\xff';
901 }
902}
903
904static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
905{
906 char *p;
907 size_t pos = 0;
908 if (NULL == out_ssid)
909 return;
910 //printf("input ssid=[%s]\n", ssid);
911 memset(out_ssid, 0, out_ssid_len);
912 if (NULL == ssid)
913 return;
914 p = strchr(ssid, '\\');
915 if (NULL == p)
916 {
917 strncpy(out_ssid, ssid, out_ssid_len);
918 //printf(" first %s\n", out_ssid);
919 }
920 else
921 {
922 pos = p - ssid;
923 memcpy(out_ssid, ssid, pos);
924 //printf("pos %lu -- %s\n", pos, out_ssid);
925 for(; pos < out_ssid_len; pos ++)
926 {
927 if (p[0] == '\0')
928 {
929 //printf(" out %s\n", out_ssid);
930 return;
931 }
932 else if (p[0] != '\\')
933 {
934 out_ssid[pos] = p[0];
935 p += 1;
936 }
937 else if (p[1] == 'x' || p[1] == 'X')
938 {
939 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
940 p += 4;
941 }
942 else if (p[1] == '\\')
943 {
944 out_ssid[pos] = '\\';
945 p += 2;
946 }
947 else if (p[1] == 't')
948 {
949 out_ssid[pos] = '\t';
950 p += 2;
951 }
952 else if (p[1] == 'r')
953 {
954 out_ssid[pos] = '\r';
955 p += 2;
956 }
957 else if (p[1] == 'n')
958 {
959 out_ssid[pos] = '\n';
960 p += 2;
961 }//todo find a better way to convert?
962 }
963 }
964 //printf(" out %s\n", out_ssid);
qs.xiong8d42bb92022-03-02 09:43:11 -0500965}
qs.xiong799dab02022-03-14 09:12:12 -0400966
you.chen87ff5172022-05-06 11:30:57 +0800967static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chened802ab2023-02-13 10:50:35 +0800968 int i, ssid_len;
you.chen87ff5172022-05-06 11:30:57 +0800969 char lynq_cmd_get[128]={0};
qs.xiongf1e48bb2023-03-28 13:38:22 +0800970 RLOGD("enter inner_get_param");
971 if (out_put == NULL)
972 {
973 RLOGE("output ptr is null");
you.chen87ff5172022-05-06 11:30:57 +0800974 return -1;
975 }
qs.xiongf1e48bb2023-03-28 13:38:22 +0800976 if (param_name == NULL)
977 {
978 RLOGE("param ptr is null");
you.chen87ff5172022-05-06 11:30:57 +0800979 return -1;
980 }
qs.xiongf1e48bb2023-03-28 13:38:22 +0800981 if (param_name[0] == '\0')
982 {
983 RLOGE("param is empty");
you.chen87ff5172022-05-06 11:30:57 +0800984 return -1;
985 }
986
987 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
988
989 CHECK_WPA_CTRL(interface);
990
991 DO_REQUEST(lynq_cmd_get);
992
qs.xiongf1e48bb2023-03-28 13:38:22 +0800993 if (memcmp(cmd_reply, "FAIL", 4) == 0)
994 {
995 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen87ff5172022-05-06 11:30:57 +0800996 return -1;
997 }
998
you.chen6a9361d2022-05-18 10:28:19 +0800999// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chened802ab2023-02-13 10:50:35 +08001000 if (strcmp(param_name, "ssid") == 0)
1001 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001002 if (cmd_reply[0] == '\"')
1003 {
you.chened802ab2023-02-13 10:50:35 +08001004 ssid_len = reply_len - 1;
1005 memcpy(out_put, cmd_reply + 1, ssid_len);
1006 if (out_put[ssid_len-1] == '\"')
1007 {
1008 out_put[ssid_len-1] = '\0';
1009 }
1010 else
1011 {
1012 out_put[ssid_len] = '\0';
1013 }
1014 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001015 else
1016 {
you.chened802ab2023-02-13 10:50:35 +08001017 ssid_len = reply_len / 2;
1018 for(i=0; i<ssid_len; i++)
1019 {
1020 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
1021 }
1022 out_put[ssid_len] = '\0';
1023 }
1024 }
1025 else
1026 {
1027 memcpy(out_put, cmd_reply, reply_len + 1);
1028 }
you.chen87ff5172022-05-06 11:30:57 +08001029 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05001030}
qs.xiong799dab02022-03-14 09:12:12 -04001031
you.chen87ff5172022-05-06 11:30:57 +08001032static int lynq_split(char * str, int len, char delimiter, char * results[]) {
1033 int ret = 0;
1034 char * end = str + len - 1;
1035 results[ret++] = str;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001036 while(str < end)
1037 {
1038 if (*str == delimiter)
1039 {
you.chen87ff5172022-05-06 11:30:57 +08001040 *str++ = '\0';
1041 results[ret++] = str;
1042 continue;
1043 }
1044 str++;
1045 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001046 if (*str == delimiter)
1047 {
you.chen87ff5172022-05-06 11:30:57 +08001048 *str = '\0';
1049 }
qs.xiong799dab02022-03-14 09:12:12 -04001050
you.chen7bf12432023-04-27 17:51:56 +08001051 results[ret] = NULL;
1052
you.chen87ff5172022-05-06 11:30:57 +08001053 return ret;
qs.xiong8d42bb92022-03-02 09:43:11 -05001054}
1055
you.chened802ab2023-02-13 10:50:35 +08001056static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
1057{
1058 char * p;
1059 int ret = 0;
1060 char cmd[256]={0};
1061 if (NULL == mac || NULL == ip)
you.chen87ff5172022-05-06 11:30:57 +08001062 return -1;
you.chened802ab2023-02-13 10:50:35 +08001063 memset(ip, 0, ip_len);
qs.xiong9c1020c2023-02-21 19:12:54 +08001064 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chened802ab2023-02-13 10:50:35 +08001065 ret = exec_cmd(cmd, ip, ip_len);
1066 p = strchr(ip, '\n');
1067 if (NULL != p)
1068 {
1069 *p = '\0';
you.chen87ff5172022-05-06 11:30:57 +08001070 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001071 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen87ff5172022-05-06 11:30:57 +08001072 return ret;
1073}
1074
you.chened802ab2023-02-13 10:50:35 +08001075static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen87ff5172022-05-06 11:30:57 +08001076 struct in_addr addr ={0};
1077 struct hostent *ht;
you.chen57eb5842023-05-18 14:19:46 +08001078 char cmd[64] = {0};
1079 char * p;
1080 int ret;
you.chen87ff5172022-05-06 11:30:57 +08001081
qs.xiongf1e48bb2023-03-28 13:38:22 +08001082 if (ip == NULL || *ip == '\0' || hostname == NULL)
1083 {
1084 RLOGE("ip == NULL or hostname == NULL");
1085 return -1;
you.chen87ff5172022-05-06 11:30:57 +08001086 }
1087
you.chened802ab2023-02-13 10:50:35 +08001088 *hostname = '\0';
qs.xiongf1e48bb2023-03-28 13:38:22 +08001089 if (inet_aton(ip, &addr) == 0)
1090 {
you.chen87ff5172022-05-06 11:30:57 +08001091 printf("---inet_aton fail\n");
1092 return -1;
1093 }
1094
1095 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
1096
qs.xiongf1e48bb2023-03-28 13:38:22 +08001097 if (ht == NULL)
1098 {
you.chen57eb5842023-05-18 14:19:46 +08001099 hostname[0] = '\0';
1100 sprintf(cmd, "grep -F '%s' /run/wg870/ap0.lease | awk '{print $4}' | tail -1", ip);
1101 ret = exec_cmd(cmd, hostname, 32);
1102 if (ret == 0)
1103 {
1104 p = strchr(hostname, '\n');
1105 if (p != NULL)
1106 {
1107 *p = '\0';
1108 }
1109 return 0;
1110 }
1111 hostname[0] = '\0';
qs.xiongf1e48bb2023-03-28 13:38:22 +08001112 RLOGE("---gethostbyaddr fail\n");
you.chen87ff5172022-05-06 11:30:57 +08001113 herror(NULL);
1114 return -1;
1115 }
1116
1117 strcpy(hostname, ht->h_name);
1118
1119 return 0;
1120}
1121
1122static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
1123{
1124 int count, index, words_count;
1125 char * split_lines[128]= {0};
1126 char * split_words[128] = {0};
you.chened802ab2023-02-13 10:50:35 +08001127 char local_ssid[128] = {0};
you.chen87ff5172022-05-06 11:30:57 +08001128 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiongf1e48bb2023-03-28 13:38:22 +08001129 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen87ff5172022-05-06 11:30:57 +08001130
1131 CHECK_WPA_CTRL(ap_sta);
1132
1133 DO_REQUEST(lynq_wifi_list_networks);
1134
1135 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1136
1137 //@todo check ssid field to compatible
1138
1139 ret = 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001140 for(index=1; index < count; index++)
1141 {
you.chen87ff5172022-05-06 11:30:57 +08001142 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001143 if (words_count > 2)
1144 {
you.chened802ab2023-02-13 10:50:35 +08001145 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiongf1e48bb2023-03-28 13:38:22 +08001146 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
1147 {
you.chen87ff5172022-05-06 11:30:57 +08001148 net_no_list[ret++] = atoi(split_words[0]);
1149 }
1150 }
1151 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001152 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen87ff5172022-05-06 11:30:57 +08001153 return ret;
1154}
1155
1156static int lynq_add_network(int ap_sta) {
you.chenc7357f22022-05-16 17:55:28 +08001157 size_t i=0;
you.chen87ff5172022-05-06 11:30:57 +08001158 CHECK_WPA_CTRL(ap_sta);
1159 const char *lynq_wifi_add_network = "ADD_NETWORK";
1160
qs.xiongf1e48bb2023-03-28 13:38:22 +08001161 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen87ff5172022-05-06 11:30:57 +08001162 DO_REQUEST(lynq_wifi_add_network);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001163 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1164 {
1165 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen87ff5172022-05-06 11:30:57 +08001166 return -1;
1167 }
1168
qs.xiongf1e48bb2023-03-28 13:38:22 +08001169 for(i=0;i<reply_len;i++)
1170 {
1171 if(cmd_reply[i] == '\n')
1172 {
you.chen87ff5172022-05-06 11:30:57 +08001173 cmd_reply[i] = '\0';
1174 break;
1175 }
1176 }
1177 return atoi(cmd_reply);
1178}
you.chen5e363602022-05-08 12:20:18 +08001179
you.chen87ff5172022-05-06 11:30:57 +08001180static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
1181{
1182 int count, index;
1183 int net_no_list[128];
1184
qs.xiongf1e48bb2023-03-28 13:38:22 +08001185 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen87ff5172022-05-06 11:30:57 +08001186 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001187 for (index=0; index < count; index++)
1188 {
1189 if (net_no_list[index] == net_no)
1190 {
you.chen87ff5172022-05-06 11:30:57 +08001191 return 0;
1192 }
1193 }
1194
1195 if (count >= 1)
1196 index = net_no_list[count - 1];
1197 else
1198 index = -1;
1199
qs.xiongf1e48bb2023-03-28 13:38:22 +08001200 while (index < net_no )
1201 {
you.chen87ff5172022-05-06 11:30:57 +08001202 index = lynq_add_network(ap_sta);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001203 if (index >= net_no)
1204 { // required network no created
1205 RLOGD("required network no created\n");;
you.chen87ff5172022-05-06 11:30:57 +08001206 return 0;
1207 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001208 else if( index < 0)
1209 {
1210 RLOGE("[lynq_check_network_number] add network fail");
you.chen5e363602022-05-08 12:20:18 +08001211 return -1;
1212 }
you.chen87ff5172022-05-06 11:30:57 +08001213 }
1214
1215 if (index < 0)
qs.xiongf1e48bb2023-03-28 13:38:22 +08001216 {
1217 RLOGE("[lynq_check_network_number] network index < 0");
1218 return -1;
1219 }
1220 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen87ff5172022-05-06 11:30:57 +08001221 return 0;
1222}
1223
1224static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiongf1e48bb2023-03-28 13:38:22 +08001225 if (freq > 5000 && freq < 6000)
1226 {
you.chen87ff5172022-05-06 11:30:57 +08001227 return LYNQ_WIFI_5G_band;
1228 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001229 else if (freq > 2000 && freq < 3000)
1230 {
you.chen87ff5172022-05-06 11:30:57 +08001231 return LYNQ_WIFI_2G_band;
1232 }
1233 return LYNQ_WIFI_2_and_5G_band;
1234}
1235
1236static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001237 if (key_mgmt != NULL)
1238 {
1239 if (memcmp( key_mgmt, "NONE", 4) == 0)
1240 {
you.chen87ff5172022-05-06 11:30:57 +08001241 return LYNQ_WIFI_AUTH_OPEN;
1242 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001243 else if (memcmp( key_mgmt, "WEP", 3) == 0)
1244 {
you.chen87ff5172022-05-06 11:30:57 +08001245 return LYNQ_WIFI_AUTH_WEP;
1246 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001247 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
1248 {
you.chen87ff5172022-05-06 11:30:57 +08001249 return LYNQ_WIFI_AUTH_WPA_PSK;
1250 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001251 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
1252 {
you.chen87ff5172022-05-06 11:30:57 +08001253 return LYNQ_WIFI_AUTH_WPA2_PSK;
1254 }
1255 }
1256
1257 return -1;
1258}
1259
1260static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001261 if (flag != NULL)
1262 {
qs.xionge2dc2e02023-04-06 11:08:48 +08001263 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
1264 {
1265 return LYNQ_WIFI_AUTH_WPA3_PSK;
1266 }else if ( strstr( flag,"SAE-CCMP") != NULL )
1267 {
1268 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
1269 }else if (strstr( flag, "WPA2-PSK") != NULL)
1270 {
you.chen87ff5172022-05-06 11:30:57 +08001271 return LYNQ_WIFI_AUTH_WPA2_PSK;
1272 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001273 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xionge2dc2e02023-04-06 11:08:48 +08001274 {
you.chen87ff5172022-05-06 11:30:57 +08001275 return LYNQ_WIFI_AUTH_WPA_PSK;
1276 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001277 else if (strstr( flag, "WEP") != NULL)
qs.xionge2dc2e02023-04-06 11:08:48 +08001278 {
you.chen87ff5172022-05-06 11:30:57 +08001279 return LYNQ_WIFI_AUTH_WEP;
1280 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001281 else if (strstr( flag, "NONE") != NULL)
qs.xionge2dc2e02023-04-06 11:08:48 +08001282 {
you.chen87ff5172022-05-06 11:30:57 +08001283 return LYNQ_WIFI_AUTH_OPEN;
1284 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001285 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xionge2dc2e02023-04-06 11:08:48 +08001286 {
you.chened802ab2023-02-13 10:50:35 +08001287 return LYNQ_WIFI_AUTH_OPEN;
1288 }
you.chen87ff5172022-05-06 11:30:57 +08001289 }
1290
1291 return -1;
1292}
1293
1294static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
1295 switch (bw) {
1296 case 10:
1297 return LYNQ_WIFI_BANDWIDTH_HT10;
1298 break;
1299 case 20:
1300 return LYNQ_WIFI_BANDWIDTH_HT20;
1301 break;
1302 case 40:
1303 return LYNQ_WIFI_BANDWIDTH_HT40;
1304 break;
1305 case 80:
1306 return LYNQ_WIFI_BANDWIDTH_HT80;
1307 break;
1308 default:
1309 break;
1310 }
1311
1312 return -1;
1313}
1314
you.chenf9d718d2023-04-14 18:17:09 +08001315static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth);
you.chen87ff5172022-05-06 11:30:57 +08001316static int inner_get_status_info(int interface, curr_status_info *curr_state) {
1317 int i, count;
1318 char *p;
1319 const char *lynq_status_cmd = "STATUS";
1320 const char * FLAG_SSID = "ssid=";
1321 const char * FLAG_SBSID = "bssid=";
1322 const char * FLAG_KEY_MGMT = "key_mgmt=";
1323 const char * FLAG_FREQ = "freq=";
1324 const char * FLAG_STATE = "wpa_state=";
1325 const char * FLAG_ID = "id=";
you.chened802ab2023-02-13 10:50:35 +08001326 const char * FLAG_IPADDR = "ip_address=";
you.chen87ff5172022-05-06 11:30:57 +08001327 char *split_lines[128] = {0};
1328
1329 CHECK_WPA_CTRL(interface);
1330
qs.xiongf1e48bb2023-03-28 13:38:22 +08001331 if (curr_state == NULL)
1332 {
1333 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen87ff5172022-05-06 11:30:57 +08001334 return -1;
1335 }
1336
1337 DO_REQUEST(lynq_status_cmd);
1338
1339 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1340
1341 curr_state->net_no = -1;
1342 ret = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001343 for(i=0; i < count; i++)
1344 {
1345 if (curr_state->ap != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001346 {
you.chen87ff5172022-05-06 11:30:57 +08001347 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001348 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001349 {
you.chened802ab2023-02-13 10:50:35 +08001350 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen87ff5172022-05-06 11:30:57 +08001351 ret = 0;
1352 continue;
1353 }
you.chendad3f9f2022-06-21 16:53:48 +08001354 p = strstr(split_lines[i], FLAG_SSID);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001355 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001356 {
you.chened802ab2023-02-13 10:50:35 +08001357 inner_copy_ssid(curr_state->ap->ap_ssid, p + strlen(FLAG_SSID), sizeof (curr_state->ap->ap_ssid));
you.chendad3f9f2022-06-21 16:53:48 +08001358 ret = 0;
1359 continue;
1360 }
you.chen87ff5172022-05-06 11:30:57 +08001361 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001362 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001363 {
you.chenb98d1cf2022-07-15 17:56:48 +08001364 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiongf1e48bb2023-03-28 13:38:22 +08001365 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen87ff5172022-05-06 11:30:57 +08001366 ret = 0;
1367 continue;
1368 }
1369 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001370 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001371 {
you.chen87ff5172022-05-06 11:30:57 +08001372 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1373 ret = 0;
1374 continue;
1375 }
you.chened802ab2023-02-13 10:50:35 +08001376 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001377 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001378 {
you.chened802ab2023-02-13 10:50:35 +08001379 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1380 ret = 0;
1381 continue;
1382 }
you.chen87ff5172022-05-06 11:30:57 +08001383 } // end if (ap != NULL)
qs.xiongf1e48bb2023-03-28 13:38:22 +08001384 if (curr_state->state != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001385 {
you.chen87ff5172022-05-06 11:30:57 +08001386 p = strstr(split_lines[i], FLAG_STATE);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001387 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001388 {
you.chen87ff5172022-05-06 11:30:57 +08001389 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1390 ret = 0;
1391 continue;
1392 }
1393
1394 } //end else if (state != NULL)
qs.xiongf1e48bb2023-03-28 13:38:22 +08001395 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
you.chenf9d718d2023-04-14 18:17:09 +08001396 {
you.chen87ff5172022-05-06 11:30:57 +08001397 ret = 0;
you.chenb98d1cf2022-07-15 17:56:48 +08001398 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiongf1e48bb2023-03-28 13:38:22 +08001399 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen87ff5172022-05-06 11:30:57 +08001400 }
1401 }
1402
you.chenf9d718d2023-04-14 18:17:09 +08001403 if (ret == 0 && curr_state->ap != NULL && curr_state->net_no >= 0) // auth may not right when add wpa3
1404 {
1405 inner_get_network_auth(interface, curr_state->net_no, &curr_state->ap->auth);
1406 }
1407
you.chen87ff5172022-05-06 11:30:57 +08001408 return ret;
1409}
1410
qs.xiongd189c542022-03-31 00:58:23 -04001411int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong8d42bb92022-03-02 09:43:11 -05001412{
qs.xiongf1e48bb2023-03-28 13:38:22 +08001413 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen87ff5172022-05-06 11:30:57 +08001414 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong8d42bb92022-03-02 09:43:11 -05001415
qs.xiongf1e48bb2023-03-28 13:38:22 +08001416 if (ap_ssid == NULL)
1417 {
1418 RLOGE("Input ap_ssid is NULL");
you.chen87ff5172022-05-06 11:30:57 +08001419 return -1;
1420 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001421 else
1422 {
1423 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen87ff5172022-05-06 11:30:57 +08001424 }
qs.xiong799dab02022-03-14 09:12:12 -04001425
qs.xiongf1e48bb2023-03-28 13:38:22 +08001426 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1427 {
1428 RLOGE("Do check ap network_number fail");
you.chen87ff5172022-05-06 11:30:57 +08001429 return -1;
1430 }
qs.xiong799dab02022-03-14 09:12:12 -04001431
you.chen87ff5172022-05-06 11:30:57 +08001432 CHECK_IDX(idx, CTRL_AP);
1433
1434 CHECK_WPA_CTRL(CTRL_AP);
1435
1436 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1437
1438 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1439 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001440 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1441 return 0;
you.chen87ff5172022-05-06 11:30:57 +08001442
qs.xiong8d42bb92022-03-02 09:43:11 -05001443}
1444
you.chen87ff5172022-05-06 11:30:57 +08001445int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong8d42bb92022-03-02 09:43:11 -05001446{
qs.xiongf1e48bb2023-03-28 13:38:22 +08001447 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen87ff5172022-05-06 11:30:57 +08001448 CHECK_IDX(idx, CTRL_AP);
you.chened802ab2023-02-13 10:50:35 +08001449 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong8d42bb92022-03-02 09:43:11 -05001450}
1451
qs.xiongaed02ac2022-10-17 15:27:18 +08001452/*****
1453 *frequency <------>channel
1454 *
1455 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1456 *
1457 *
1458 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1459 *
1460 *
1461 * */
1462static int lynq_check_set_frequency(int input_frequency){
qs.xiongf962eef2022-11-29 16:28:03 +08001463 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};
1464 int i;
1465 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1466
qs.xiong3163d0f2022-12-02 09:58:57 +08001467 for(i = 0; i < arr_len; i++)
qs.xiongf962eef2022-11-29 16:28:03 +08001468 {
1469 if(input_frequency == legitimate_frequency[i])
qs.xiongaed02ac2022-10-17 15:27:18 +08001470 break;
qs.xiongaed02ac2022-10-17 15:27:18 +08001471 }
qs.xiongf962eef2022-11-29 16:28:03 +08001472
1473 if(i == arr_len)
1474 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001475 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongaed02ac2022-10-17 15:27:18 +08001476 return -1;
1477 }
qs.xiongf962eef2022-11-29 16:28:03 +08001478
qs.xiongaed02ac2022-10-17 15:27:18 +08001479 return 0;
1480}
qs.xiong9c1020c2023-02-21 19:12:54 +08001481
1482static int lynq_check_frequencyby_country_code(int input_frequency)
1483{
1484 char str_cnc[]="CN";
1485 char str_dest[20]="";
1486
1487 if( lynq_get_country_code(1,str_dest) != 0 )
1488 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001489 RLOGE("get country_code error\n");
qs.xiong9c1020c2023-02-21 19:12:54 +08001490 return -1;
1491 }
1492 if( strncmp(str_dest,str_cnc,2) != 0 )
1493 {
1494 return 0;
1495 }else if( 2473 < input_frequency && input_frequency < 5744)
1496 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001497 RLOGE("input frequency is bad\n");
qs.xiong9c1020c2023-02-21 19:12:54 +08001498 return -1;
1499 }
1500 return 0;
1501}
qs.xiongd189c542022-03-31 00:58:23 -04001502int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong8d42bb92022-03-02 09:43:11 -05001503{
qs.xiongf962eef2022-11-29 16:28:03 +08001504 int check;
qs.xiongaed02ac2022-10-17 15:27:18 +08001505 char lynq_wifi_frequency_cmd[128]={0};
1506 char lynq_cmd_mode[128]={0};
you.chen87ff5172022-05-06 11:30:57 +08001507 char lynq_cmd_slect[128]={0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08001508 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongaed02ac2022-10-17 15:27:18 +08001509 //@do check input frequency
qs.xiongf962eef2022-11-29 16:28:03 +08001510 check = lynq_check_set_frequency(lynq_wifi_frequency);
1511 if(check != 0)
1512 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001513 RLOGE("do check frequency error");
qs.xiongaed02ac2022-10-17 15:27:18 +08001514 return -1;
you.chen87ff5172022-05-06 11:30:57 +08001515 }
qs.xiong9c1020c2023-02-21 19:12:54 +08001516 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1517 if(check != 0)
1518 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001519 RLOGE("do check frequency error");
qs.xiong9c1020c2023-02-21 19:12:54 +08001520 return -1;
1521 }
1522
qs.xiongf962eef2022-11-29 16:28:03 +08001523 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1524 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001525 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen87ff5172022-05-06 11:30:57 +08001526 return -1;
1527 }
qs.xiong799dab02022-03-14 09:12:12 -04001528
you.chen87ff5172022-05-06 11:30:57 +08001529 CHECK_IDX(idx, CTRL_AP);
1530
1531 CHECK_WPA_CTRL(CTRL_AP);
1532
1533 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1534 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1535 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1536
you.chenc7357f22022-05-16 17:55:28 +08001537 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen87ff5172022-05-06 11:30:57 +08001538 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1539 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1540 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong8d42bb92022-03-02 09:43:11 -05001541
qs.xiongf1e48bb2023-03-28 13:38:22 +08001542 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05001543}
1544
qs.xiongd189c542022-03-31 00:58:23 -04001545int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong8d42bb92022-03-02 09:43:11 -05001546{
you.chen87ff5172022-05-06 11:30:57 +08001547 char lynq_frequency_str[MAX_RET] = {0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08001548 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen87ff5172022-05-06 11:30:57 +08001549 CHECK_IDX(idx, CTRL_AP);
qs.xiongd189c542022-03-31 00:58:23 -04001550
qs.xiongf1e48bb2023-03-28 13:38:22 +08001551 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1552 {
1553 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen87ff5172022-05-06 11:30:57 +08001554 return -1;
1555 }
1556 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongd189c542022-03-31 00:58:23 -04001557
qs.xiongf1e48bb2023-03-28 13:38:22 +08001558 return 0;
qs.xiongd189c542022-03-31 00:58:23 -04001559}
1560
qs.xiongd189c542022-03-31 00:58:23 -04001561int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1562{
qs.xiongf1e48bb2023-03-28 13:38:22 +08001563 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen87ff5172022-05-06 11:30:57 +08001564 CHECK_IDX(idx, CTRL_AP);
1565 switch(bandwidth){
qs.xiongf1e48bb2023-03-28 13:38:22 +08001566 case LYNQ_WIFI_BANDWIDTH_HT10:
1567 {
1568 RLOGE("bandwith [%d] not support now\n", bandwidth);
1569 return -1;
1570 }
1571 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen87ff5172022-05-06 11:30:57 +08001572 {
1573 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1574 system("wl down");
qs.xiongf1e48bb2023-03-28 13:38:22 +08001575 if (system(lynq_cmd_bandwith) != 0 )
1576 {
1577 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen87ff5172022-05-06 11:30:57 +08001578 return -1;
1579 }
1580 system("wl up");
1581 break;
1582 }
1583 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiongf1e48bb2023-03-28 13:38:22 +08001584 {
qs.xiongdb04cdb2023-02-21 13:19:42 +08001585 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen87ff5172022-05-06 11:30:57 +08001586 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1587 system("wl down");
qs.xiongf1e48bb2023-03-28 13:38:22 +08001588 if (system(lynq_cmd_bandwith) != 0 )
1589 {
1590 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen87ff5172022-05-06 11:30:57 +08001591 return -1;
1592 }
1593 system("wl up");
1594 break;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001595 }
you.chen87ff5172022-05-06 11:30:57 +08001596 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiongf1e48bb2023-03-28 13:38:22 +08001597 {
qs.xiongdb04cdb2023-02-21 13:19:42 +08001598 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen87ff5172022-05-06 11:30:57 +08001599 system("wl down");
qs.xiongf1e48bb2023-03-28 13:38:22 +08001600 if (system(lynq_cmd_bandwith) != 0 )
1601 {
1602 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen87ff5172022-05-06 11:30:57 +08001603 return -1;
1604 }
1605 system("wl up");
1606 break;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001607 }
1608 default:
you.chen87ff5172022-05-06 11:30:57 +08001609 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001610 RLOGE("auth type [%d] not support now\n", bandwidth);
1611 return -1;
you.chen87ff5172022-05-06 11:30:57 +08001612 }
1613 }
qs.xiongd189c542022-03-31 00:58:23 -04001614
1615
you.chen87ff5172022-05-06 11:30:57 +08001616 return 0;
qs.xiongd189c542022-03-31 00:58:23 -04001617}
you.chen87ff5172022-05-06 11:30:57 +08001618
qs.xiongd189c542022-03-31 00:58:23 -04001619int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1620{
you.chen87ff5172022-05-06 11:30:57 +08001621 int count = 0;
1622 int index = 0;
1623 char *split_words[128] = {0};
1624 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiongf1e48bb2023-03-28 13:38:22 +08001625 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen87ff5172022-05-06 11:30:57 +08001626 CHECK_IDX(idx, CTRL_AP);
qs.xiong8d42bb92022-03-02 09:43:11 -05001627
you.chen87ff5172022-05-06 11:30:57 +08001628 CHECK_WPA_CTRL(CTRL_AP);
1629
1630 DO_REQUEST(lynq_chanspec_cmd);
1631
1632 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1633 for(;index < count; index++) {
1634 if (strncmp(split_words[index], "bw", 2) != 0) {
1635 continue;
1636 }
1637
1638 index++;
1639 if (index >= count) {
1640 return -1;
1641 }
1642
qs.xiongf1e48bb2023-03-28 13:38:22 +08001643 RLOGD("bw %s\n", split_words[index]);
you.chen87ff5172022-05-06 11:30:57 +08001644 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1645 return 0;
1646 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001647 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen87ff5172022-05-06 11:30:57 +08001648 return -1;
qs.xiong8d42bb92022-03-02 09:43:11 -05001649}
qs.xiong7cc23cb2022-04-14 03:50:45 -04001650
qs.xiongd189c542022-03-31 00:58:23 -04001651int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong8d42bb92022-03-02 09:43:11 -05001652{
you.chen87ff5172022-05-06 11:30:57 +08001653 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08001654 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen87ff5172022-05-06 11:30:57 +08001655 CHECK_IDX(idx, CTRL_AP);
qs.xiong6a886062022-04-14 06:17:01 -04001656
you.chen87ff5172022-05-06 11:30:57 +08001657 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong799dab02022-03-14 09:12:12 -04001658
qs.xiongf1e48bb2023-03-28 13:38:22 +08001659 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1660 {
you.chen87ff5172022-05-06 11:30:57 +08001661 return -1;
1662 }
1663
1664 system("wl down");
1665 if (system(lynq_cmd_channel) != 0 ){
qs.xiongf1e48bb2023-03-28 13:38:22 +08001666 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen87ff5172022-05-06 11:30:57 +08001667 return -1;
1668 }
1669 system("wl up");
1670 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05001671}
qs.xiong7cc23cb2022-04-14 03:50:45 -04001672
qs.xiongd189c542022-03-31 00:58:23 -04001673int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong8d42bb92022-03-02 09:43:11 -05001674{
you.chen87ff5172022-05-06 11:30:57 +08001675 int count = 0;
1676 int index = 0;
1677 char *split_words[128] = {0};
1678 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiongf1e48bb2023-03-28 13:38:22 +08001679 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen87ff5172022-05-06 11:30:57 +08001680 CHECK_IDX(idx, CTRL_AP);
qs.xiong799dab02022-03-14 09:12:12 -04001681
you.chen87ff5172022-05-06 11:30:57 +08001682 CHECK_WPA_CTRL(CTRL_AP);
1683
1684 DO_REQUEST(lynq_chanspec_cmd);
1685
1686 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001687 for(;index < count; index++)
1688 {
1689 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen87ff5172022-05-06 11:30:57 +08001690 if (strncmp(split_words[index], "channel", 2) != 0) {
1691 continue;
1692 }
1693
1694 index++;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001695 if (index >= count)
1696 {
you.chen87ff5172022-05-06 11:30:57 +08001697 return -1;
1698 }
1699
1700 *channel = atoi(split_words[index]);
1701 return 0;
1702 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001703 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen87ff5172022-05-06 11:30:57 +08001704 return -1;
qs.xiong8d42bb92022-03-02 09:43:11 -05001705}
1706
1707
you.chen87ff5172022-05-06 11:30:57 +08001708int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong8d42bb92022-03-02 09:43:11 -05001709{
you.chenc7357f22022-05-16 17:55:28 +08001710 char ssid[MAX_CMD] = {0};
1711 int freq = 0;
1712 char lynq_auth_cmd[64]={0};
1713 char lynq_auth_alg_cmd[64]={0};
1714 char lynq_psk_cmd[64]={0};
1715 char lynq_pairwise_cmd[64]={0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08001716 char lynq_ieee80211_cmd[64]={0};
1717 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chenc7357f22022-05-16 17:55:28 +08001718 lynq_wifi_auth_s org_auth;
you.chen87ff5172022-05-06 11:30:57 +08001719 CHECK_IDX(idx, CTRL_AP);
1720
you.chenc7357f22022-05-16 17:55:28 +08001721 CHECK_WPA_CTRL(CTRL_AP);
1722
qs.xiongf1e48bb2023-03-28 13:38:22 +08001723 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1724 {
1725 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen87ff5172022-05-06 11:30:57 +08001726 return -1;
1727 }
1728
you.chen01276462022-05-25 10:09:47 +08001729 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chenc7357f22022-05-16 17:55:28 +08001730 if (org_auth == auth) {
qs.xiong045f60b2023-03-29 17:36:14 +08001731 RLOGD("org_auth --- is %d\n",org_auth);
you.chenc7357f22022-05-16 17:55:28 +08001732 return 0;
1733 }
1734 else {
1735 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1736 ssid[0] = '\0';
1737 }
1738 lynq_wifi_ap_frequency_get(idx, &freq);
1739
1740 DO_OK_FAIL_REQUEST(cmd_disconnect);
1741 DO_OK_FAIL_REQUEST(cmd_remove_all);
1742 if (ssid[0] != '\0') {
1743 lynq_wifi_ap_ssid_set(idx, ssid);
1744 }
1745 if (freq != 0) {
1746 lynq_wifi_ap_frequency_set(idx, freq);
1747 }
1748 }
1749 }
you.chen87ff5172022-05-06 11:30:57 +08001750
qs.xiongf1e48bb2023-03-28 13:38:22 +08001751 switch(auth){
1752 case LYNQ_WIFI_AUTH_OPEN:
you.chenc7357f22022-05-16 17:55:28 +08001753 {
qs.xiong045f60b2023-03-29 17:36:14 +08001754 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen87ff5172022-05-06 11:30:57 +08001755 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen01276462022-05-25 10:09:47 +08001756 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen87ff5172022-05-06 11:30:57 +08001757 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001758 break;
1759 }
you.chenc7357f22022-05-16 17:55:28 +08001760 case LYNQ_WIFI_AUTH_WEP:
1761 {
qs.xiong045f60b2023-03-29 17:36:14 +08001762 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chenc7357f22022-05-16 17:55:28 +08001763 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen01276462022-05-25 10:09:47 +08001764 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chenc7357f22022-05-16 17:55:28 +08001765 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1766
1767 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1768 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1769 break;
1770 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001771 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiong045f60b2023-03-29 17:36:14 +08001772 {
1773 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1774 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1775 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1776
1777 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1778 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1779 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1780 break;
1781
1782 }
you.chen87ff5172022-05-06 11:30:57 +08001783 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiongf1e48bb2023-03-28 13:38:22 +08001784 {
1785 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1786 {
you.chen87ff5172022-05-06 11:30:57 +08001787 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1788 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1789 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001790 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1791 {
you.chenc7357f22022-05-16 17:55:28 +08001792 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chen5e363602022-05-08 12:20:18 +08001793 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen87ff5172022-05-06 11:30:57 +08001794 }
1795// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1796// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1797 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong8d42bb92022-03-02 09:43:11 -05001798
you.chen87ff5172022-05-06 11:30:57 +08001799 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1800 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1801 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001802 break;
1803 }
1804 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1805 {
1806 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1807 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1808 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1809 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1810
1811 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1812 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1813 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1814 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1815 break;
1816 }
1817 case LYNQ_WIFI_AUTH_WPA3_PSK:
1818 {
1819 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1820 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xionge2dc2e02023-04-06 11:08:48 +08001821 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001822 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1823
1824 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1825 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1826 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1827 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1828 break;
1829 }
1830 default:
you.chen87ff5172022-05-06 11:30:57 +08001831 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001832 RLOGE("auth type [%d] not support now\n", auth);
1833 return -1;
you.chen87ff5172022-05-06 11:30:57 +08001834 }
1835 }
you.chenc7357f22022-05-16 17:55:28 +08001836 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong8d42bb92022-03-02 09:43:11 -05001837
qs.xiongf1e48bb2023-03-28 13:38:22 +08001838 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05001839}
1840
you.chen87ff5172022-05-06 11:30:57 +08001841int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong8d42bb92022-03-02 09:43:11 -05001842{
you.chen87ff5172022-05-06 11:30:57 +08001843 char lynq_auth_str[MAX_RET] = {0};
you.chenc7357f22022-05-16 17:55:28 +08001844 char lynq_auth_alg_str[MAX_RET] = {0};
1845 char lynq_proto_str[MAX_RET] = {0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08001846 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen87ff5172022-05-06 11:30:57 +08001847 CHECK_IDX(idx, CTRL_AP);
1848
qs.xiongf1e48bb2023-03-28 13:38:22 +08001849 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1850 {
1851 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen87ff5172022-05-06 11:30:57 +08001852 return -1;
1853 }
1854
qs.xiongf1e48bb2023-03-28 13:38:22 +08001855 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1856 {
1857 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1858 {
qs.xiong045f60b2023-03-29 17:36:14 +08001859 RLOGD("---auth is OPEN\n");
you.chenc7357f22022-05-16 17:55:28 +08001860 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiong045f60b2023-03-29 17:36:14 +08001861 return 0;
you.chenc7357f22022-05-16 17:55:28 +08001862 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001863 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1864 {
qs.xiong045f60b2023-03-29 17:36:14 +08001865 RLOGD("---auth is WEP\n");
you.chenc7357f22022-05-16 17:55:28 +08001866 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiong045f60b2023-03-29 17:36:14 +08001867 return 0;
you.chenc7357f22022-05-16 17:55:28 +08001868 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001869 else
1870 {
qs.xiong045f60b2023-03-29 17:36:14 +08001871 RLOGD("---auth is OPEN\n");
you.chenc7357f22022-05-16 17:55:28 +08001872 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiong045f60b2023-03-29 17:36:14 +08001873 return 0;
you.chenc7357f22022-05-16 17:55:28 +08001874 }
you.chen87ff5172022-05-06 11:30:57 +08001875 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001876 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1877 {
1878 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1879 {
qs.xiong045f60b2023-03-29 17:36:14 +08001880 RLOGE("---auth is -1\n");
you.chen01276462022-05-25 10:09:47 +08001881 *auth = -1;
you.chenc7357f22022-05-16 17:55:28 +08001882 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001883 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1884 {
qs.xiong045f60b2023-03-29 17:36:14 +08001885 RLOGD("---auth WPA2_PSK\n");
you.chenc7357f22022-05-16 17:55:28 +08001886 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08001887 return 0;
you.chenc7357f22022-05-16 17:55:28 +08001888 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001889 else
1890 {
qs.xiong045f60b2023-03-29 17:36:14 +08001891 RLOGD("---auth WPA_PSK\n");
you.chenc7357f22022-05-16 17:55:28 +08001892 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08001893 return 0;
you.chenc7357f22022-05-16 17:55:28 +08001894 }
you.chen87ff5172022-05-06 11:30:57 +08001895 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001896
1897 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1898 {
1899 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1900 return -1;
1901 }
1902
1903 if (memcmp(lynq_auth_str,"1",1) == 0 )
1904 {
1905 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1906 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08001907 return 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001908 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1909 {
1910 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1911 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08001912 return 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001913 }
1914 else
1915 {
qs.xiong045f60b2023-03-29 17:36:14 +08001916 RLOGE("---auth -- -1\n");
you.chen01276462022-05-25 10:09:47 +08001917 *auth = -1;
1918 }
qs.xiong8d42bb92022-03-02 09:43:11 -05001919
you.chenc7357f22022-05-16 17:55:28 +08001920 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05001921}
qs.xiong799dab02022-03-14 09:12:12 -04001922
you.chen083a2952023-05-12 19:39:06 +08001923static int inner_check_ap_connected(lynq_wifi_index_e idx, int retry_count)
1924{
1925 char status[64];
1926 curr_status_info curr_state;
1927
1928 CHECK_WPA_CTRL(CTRL_AP);
1929
1930 memset(status, 0, sizeof (status));
1931
1932 curr_state.ap = NULL;
1933 curr_state.state = status;
1934
1935 printf("inner_check_ap_connected %d\n", retry_count);
1936 usleep(500*1000);
1937 if (0 == inner_get_status_info(idx, &curr_state))
1938 {
1939 if (strcmp(status, STATE_COMPLETED) == 0)
1940 {
1941 return 0;
1942 }
1943 else if (retry_count == 4) //not ok in 2s, do reconnect
1944 {
1945 DO_REQUEST("RECONNECT");
1946 return inner_check_ap_connected(idx, retry_count+1);
1947 }
1948 else if (retry_count > 10)
1949 {
1950 printf("retry 10 time\n");
1951 return -1;
1952 }
1953 else
1954 {
1955 return inner_check_ap_connected(idx, retry_count+1);
1956 }
1957 }
1958 return -1;
1959}
qs.xiong799dab02022-03-14 09:12:12 -04001960
qs.xiongd189c542022-03-31 00:58:23 -04001961int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong8d42bb92022-03-02 09:43:11 -05001962{
you.chen87ff5172022-05-06 11:30:57 +08001963 char LYNQ_WIFI_CMD[128]={0};
1964 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1965 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiongf1e48bb2023-03-28 13:38:22 +08001966 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen87ff5172022-05-06 11:30:57 +08001967 CHECK_IDX(idx, CTRL_AP);
1968
1969 CHECK_WPA_CTRL(CTRL_AP);
1970
you.chen377987d2023-05-10 15:56:26 +08001971 if (inner_get_ap_interface_name() == NULL)
you.chencd882682023-04-24 15:39:37 +08001972 {
you.chen377987d2023-05-10 15:56:26 +08001973 RLOGE("lynq_wifi_ap_start get ap name fail");
you.chencd882682023-04-24 15:39:37 +08001974 return -1;
1975 }
you.chen87ff5172022-05-06 11:30:57 +08001976
1977 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1978 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1979
1980 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1981 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1982
you.chencd882682023-04-24 15:39:37 +08001983 ret = system_call_v("%s %s", start_stop_ap_script, "start");
1984 if (ret != 0)
1985 {
1986 RLOGE("lynq_wifi_ap_start excute script fail");
1987 return -1;
1988 }
1989
you.chen083a2952023-05-12 19:39:06 +08001990 if (inner_check_ap_connected(idx, 0) != 0)
1991 {
1992 return -1;
1993 }
1994
you.chen377987d2023-05-10 15:56:26 +08001995 check_tether_and_notify();
1996
qs.xiongf1e48bb2023-03-28 13:38:22 +08001997 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05001998}
1999
qs.xiongd189c542022-03-31 00:58:23 -04002000int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong8d42bb92022-03-02 09:43:11 -05002001{
you.chen87ff5172022-05-06 11:30:57 +08002002 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong8d42bb92022-03-02 09:43:11 -05002003}
2004
qs.xiongd189c542022-03-31 00:58:23 -04002005int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong8d42bb92022-03-02 09:43:11 -05002006{
you.chen87ff5172022-05-06 11:30:57 +08002007 char LYNQ_WIFI_CMD[128]={0};
qs.xiong799dab02022-03-14 09:12:12 -04002008
you.chen87ff5172022-05-06 11:30:57 +08002009 CHECK_IDX(idx, CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04002010
you.chen87ff5172022-05-06 11:30:57 +08002011 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04002012
you.chen87ff5172022-05-06 11:30:57 +08002013 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
2014
2015 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
2016
you.chenefc7f3f2022-05-06 17:50:16 +08002017// system("connmanctl tether wifi off");
you.chencd882682023-04-24 15:39:37 +08002018
2019 ret = system_call_v("%s %s", start_stop_ap_script, "stop");
2020 if (ret != 0)
2021 {
2022 RLOGE("lynq_wifi_ap_start excute script fail");
2023 return -1;
2024 }
2025
qs.xiongf1e48bb2023-03-28 13:38:22 +08002026 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002027}
qs.xiong799dab02022-03-14 09:12:12 -04002028
qs.xiongd189c542022-03-31 00:58:23 -04002029int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong8d42bb92022-03-02 09:43:11 -05002030{
you.chen87ff5172022-05-06 11:30:57 +08002031 char lynq_disable_cmd[128] = {0};
2032 char lynq_select_cmd[128] = {0};
2033 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiongf1e48bb2023-03-28 13:38:22 +08002034 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen87ff5172022-05-06 11:30:57 +08002035 CHECK_IDX(idx, CTRL_AP);
qs.xiong8d42bb92022-03-02 09:43:11 -05002036
you.chen87ff5172022-05-06 11:30:57 +08002037 CHECK_WPA_CTRL(CTRL_AP);
you.chen87ff5172022-05-06 11:30:57 +08002038 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2039 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2040
2041 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2042 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
2043 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong799dab02022-03-14 09:12:12 -04002044
qs.xiongf1e48bb2023-03-28 13:38:22 +08002045 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002046}
2047
qs.xiongd189c542022-03-31 00:58:23 -04002048int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong8d42bb92022-03-02 09:43:11 -05002049{
you.chen87ff5172022-05-06 11:30:57 +08002050 char lynq_disable_cmd[128] = {0};
2051 char lynq_select_cmd[128] = {0};
2052 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiongf1e48bb2023-03-28 13:38:22 +08002053 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen87ff5172022-05-06 11:30:57 +08002054 CHECK_IDX(idx, CTRL_AP);
qs.xiong8d42bb92022-03-02 09:43:11 -05002055
you.chen87ff5172022-05-06 11:30:57 +08002056 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04002057
you.chen87ff5172022-05-06 11:30:57 +08002058 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2059 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2060
2061 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2062 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
2063 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong8d42bb92022-03-02 09:43:11 -05002064
qs.xiongf1e48bb2023-03-28 13:38:22 +08002065 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002066}
qs.xiongd189c542022-03-31 00:58:23 -04002067
you.chen87ff5172022-05-06 11:30:57 +08002068int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong8d42bb92022-03-02 09:43:11 -05002069{
qs.xiongf1e48bb2023-03-28 13:38:22 +08002070 int pass_len;
you.chenc7357f22022-05-16 17:55:28 +08002071 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08002072 char lynq_wpa2_wpa3[64] = {0};
you.chenc7357f22022-05-16 17:55:28 +08002073 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08002074 RLOGD("enter lynq_ap_password_set");
2075 if( password == NULL )
2076 {
2077 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xiong6ad4d7d2022-06-27 11:34:53 +08002078 return -1;
2079 }
2080 pass_len=strlen(password);
you.chenc7357f22022-05-16 17:55:28 +08002081 lynq_wifi_auth_s auth = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002082 if(pass_len < 8 || pass_len >= 64)
2083 {
2084 RLOGE("[lynq_ap_password_set]input password len not in rage");
2085 return -1;
you.chen87ff5172022-05-06 11:30:57 +08002086 }
qs.xiongd189c542022-03-31 00:58:23 -04002087
you.chen87ff5172022-05-06 11:30:57 +08002088 CHECK_IDX(idx, CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04002089
qs.xiongf1e48bb2023-03-28 13:38:22 +08002090 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
2091 {
qs.xiong045f60b2023-03-29 17:36:14 +08002092 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chenc7357f22022-05-16 17:55:28 +08002093 return -1;
2094 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002095 else if (auth == LYNQ_WIFI_AUTH_OPEN)
2096 {
qs.xiong045f60b2023-03-29 17:36:14 +08002097 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
2098 return 0;
you.chenc7357f22022-05-16 17:55:28 +08002099 }
2100
you.chen87ff5172022-05-06 11:30:57 +08002101 CHECK_WPA_CTRL(CTRL_AP);
2102
qs.xiongf1e48bb2023-03-28 13:38:22 +08002103 if (auth == LYNQ_WIFI_AUTH_WEP)
2104 {
qs.xiong045f60b2023-03-29 17:36:14 +08002105 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chenc7357f22022-05-16 17:55:28 +08002106 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
2107 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
2108 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2109 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
2110 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002111 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2112 {
qs.xiong045f60b2023-03-29 17:36:14 +08002113 RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA_PSK LYNQ_WIFI_AUTH_WPA2_PSK\n");
you.chenc7357f22022-05-16 17:55:28 +08002114 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
2115 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2116 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002117 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
2118 {
2119
qs.xiong045f60b2023-03-29 17:36:14 +08002120 RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA2_WPA3 LYNQ_WIFI_AUTH_WPA3_PSK\n");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002121 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiong083d8072023-03-28 14:06:12 +08002122 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002123 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2124 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
2125
2126 }
2127 else
qs.xiong045f60b2023-03-29 17:36:14 +08002128 {
2129 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chenc7357f22022-05-16 17:55:28 +08002130 return -1;
2131 }
you.chen87ff5172022-05-06 11:30:57 +08002132
you.chen87ff5172022-05-06 11:30:57 +08002133 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong99b48d62022-04-07 05:41:29 -04002134
qs.xiongf1e48bb2023-03-28 13:38:22 +08002135 return 0;
qs.xiongd189c542022-03-31 00:58:23 -04002136}
2137
you.chen87ff5172022-05-06 11:30:57 +08002138int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongd189c542022-03-31 00:58:23 -04002139{
you.chen87ff5172022-05-06 11:30:57 +08002140 FILE * fp;
2141 int len, ret;
2142 int count, index;
2143 char *split_lines[128] = {0};
2144 char *buff, *p;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002145 RLOGD("enter lynq_ap_password_get");
qs.xiong99b48d62022-04-07 05:41:29 -04002146
you.chen87ff5172022-05-06 11:30:57 +08002147 CHECK_IDX(idx, CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04002148
you.chen87ff5172022-05-06 11:30:57 +08002149 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
2150// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002151 if (NULL == fp)
2152 {
2153 RLOGE("open file fail\n");
you.chen87ff5172022-05-06 11:30:57 +08002154 return -1;
2155 }
qs.xiong99b48d62022-04-07 05:41:29 -04002156
you.chen87ff5172022-05-06 11:30:57 +08002157 buff = alloca(MAX_RET);
2158 fseek(fp, 0, SEEK_SET);
2159 len = fread(buff, 1, MAX_RET, fp);
2160 fclose(fp);
qs.xiong99b48d62022-04-07 05:41:29 -04002161
qs.xiongf1e48bb2023-03-28 13:38:22 +08002162 for(index=0; index < len; index ++)
2163 {
2164 if (memcmp(buff + index, "network={", 9) != 0)
2165 {
you.chen87ff5172022-05-06 11:30:57 +08002166 continue;
2167 }
2168 p = buff + index + 9;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002169 for (; index < len; index ++ )
2170 {
2171 if (buff[index] != '}')
2172 {
you.chen87ff5172022-05-06 11:30:57 +08002173 continue;
2174 }
2175 buff[index] = '\0';
2176 break;
2177 }
2178 len = buff + index - p;
2179 }
2180
2181 count = lynq_split(p, len, '\n', split_lines);
2182
2183 ret = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002184 for(index=0; index < count; index++)
2185 {
you.chen87ff5172022-05-06 11:30:57 +08002186 p = strstr(split_lines[index], "psk=");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002187 if (p != NULL)
2188 {
you.chenc7357f22022-05-16 17:55:28 +08002189 p += 4;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002190 if (*p == '\"')
2191 {
you.chenc7357f22022-05-16 17:55:28 +08002192 p++;
2193 }
you.chen87ff5172022-05-06 11:30:57 +08002194 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002195 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2196 {
you.chenc7357f22022-05-16 17:55:28 +08002197 p += 9;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002198 if (*p == '\"')
2199 {
you.chenc7357f22022-05-16 17:55:28 +08002200 p++;
2201 }
2202 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002203 else
2204 {
you.chenc7357f22022-05-16 17:55:28 +08002205 continue;
you.chen87ff5172022-05-06 11:30:57 +08002206 }
2207
2208 strcpy(password, p);
2209
qs.xiongf1e48bb2023-03-28 13:38:22 +08002210 while(*password != '\0')
2211 {
2212 if (*password == '\"')
2213 {
you.chen87ff5172022-05-06 11:30:57 +08002214 *password = '\0';
2215 break;
2216 }
2217 password++;
2218 }
2219 ret = 0;
2220 break;
2221 } //end for(index=0; index < count; index++)
2222
2223 return ret;
qs.xiong8d42bb92022-03-02 09:43:11 -05002224}
2225
you.chen87ff5172022-05-06 11:30:57 +08002226static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
2227 char lynq_auth_str[MAX_RET] = {0};
you.chen5e363602022-05-08 12:20:18 +08002228 char lynq_proto_str[MAX_RET] = {0};
qs.xiong99b48d62022-04-07 05:41:29 -04002229
qs.xiongf1e48bb2023-03-28 13:38:22 +08002230 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
2231 {
you.chen87ff5172022-05-06 11:30:57 +08002232 return -1;
2233 }
2234
2235 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chen5e363602022-05-08 12:20:18 +08002236
qs.xiongf1e48bb2023-03-28 13:38:22 +08002237 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
2238 {
2239 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
you.chenf9d718d2023-04-14 18:17:09 +08002240 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08002241 if (strcmp(lynq_proto_str, "RSN") == 0)
you.chenf9d718d2023-04-14 18:17:09 +08002242 {
you.chen5e363602022-05-08 12:20:18 +08002243 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08002244 return 0;
you.chen5e363602022-05-08 12:20:18 +08002245 }
you.chenf9d718d2023-04-14 18:17:09 +08002246 else if (strcmp(lynq_proto_str, "WPA") == 0) // need compare when wpa3 supported
2247 {
2248 return 0;
2249 }
you.chen5e363602022-05-08 12:20:18 +08002250 }
2251 }
you.chenf9d718d2023-04-14 18:17:09 +08002252 else if (*auth == LYNQ_WIFI_AUTH_OPEN || *auth == LYNQ_WIFI_AUTH_WEP)
2253 {
2254 return 0;
2255 }
2256
qs.xiongf1e48bb2023-03-28 13:38:22 +08002257 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
2258 {
you.chenf9d718d2023-04-14 18:17:09 +08002259 RLOGE("check ieee80211w error\n");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002260 return -1;
2261 }
2262 if ( strncmp(lynq_auth_str,"1",1) == 0 )
2263 {
2264
you.chenf9d718d2023-04-14 18:17:09 +08002265 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
2266 return 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002267 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
2268 {
2269
2270 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08002271 return 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002272 }else
2273 {
you.chenf9d718d2023-04-14 18:17:09 +08002274 RLOGE("check ieee80211w error, not 1 or 2\n");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002275 *auth = -1;
2276 return -1;
2277 }
you.chen87ff5172022-05-06 11:30:57 +08002278 return 0;
2279}
2280
2281int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong8d42bb92022-03-02 09:43:11 -05002282{
qs.xiongf1e48bb2023-03-28 13:38:22 +08002283 RLOGD("enter lynq_sta_ssid_password_set");
you.chen87ff5172022-05-06 11:30:57 +08002284 int pass_len, net_no, count, index;
2285 char lynq_tmp_cmd[300]={0};
2286 int net_no_list[128];
2287 lynq_wifi_auth_s net_auth;
2288 pass_len=strlen(password);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002289 if(pass_len < 8 || pass_len >= 64)
2290 {
2291 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen87ff5172022-05-06 11:30:57 +08002292 return -1;
2293 }
2294
2295 CHECK_IDX(idx, CTRL_STA);
2296
2297 net_no = -1;
2298 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
2299
qs.xiongf1e48bb2023-03-28 13:38:22 +08002300 for (index=0; index < count; index++)
2301 {
you.chen87ff5172022-05-06 11:30:57 +08002302 net_auth = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002303 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
2304 {
you.chen87ff5172022-05-06 11:30:57 +08002305 net_no = net_no_list[index];
2306 break;
2307 }
2308 }
2309
qs.xiongf1e48bb2023-03-28 13:38:22 +08002310 if (net_no < 0)
2311 {
you.chen87ff5172022-05-06 11:30:57 +08002312 return -1;
2313 }
2314
2315 CHECK_WPA_CTRL(CTRL_STA);
2316
2317 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
2318
2319 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2320 DO_OK_FAIL_REQUEST(cmd_save_config);
2321
2322 return 0;
2323}
2324
2325int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
2326
2327 FILE * fp;
you.chened802ab2023-02-13 10:50:35 +08002328 int len, ret, network_len, i, ssid_len;
you.chen87ff5172022-05-06 11:30:57 +08002329 int count, index;
2330 char *split_lines[128] = {0};
you.chened802ab2023-02-13 10:50:35 +08002331 char *buff, *p, *ssid, *ssid_end_flag;
2332 char tmp_ssid[128]={0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08002333 RLOGD("enter lynq_sta_ssid_password_get");
you.chen87ff5172022-05-06 11:30:57 +08002334
you.chen0c938042022-08-06 16:59:10 +08002335 network_len = 0;
2336 p = NULL;
2337
you.chen87ff5172022-05-06 11:30:57 +08002338 CHECK_IDX(idx, CTRL_STA);
2339
qs.xiongf1e48bb2023-03-28 13:38:22 +08002340 if (NULL == password)
2341 {
2342 RLOGE("bad param\n");
you.chen0c938042022-08-06 16:59:10 +08002343 return -1;
2344 }
2345
you.chen87ff5172022-05-06 11:30:57 +08002346 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002347 if (NULL == fp)
2348 {
2349 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen87ff5172022-05-06 11:30:57 +08002350 return -1;
2351 }
2352
2353 buff = alloca(MAX_RET);
2354 fseek(fp, 0, SEEK_SET);
2355 len = fread(buff, 1, MAX_RET, fp);
2356 fclose(fp);
2357
qs.xiongf1e48bb2023-03-28 13:38:22 +08002358 for(index=0; index < len; index ++)
2359 {
2360 for(; index < len; index ++)
2361 {
2362 if (memcmp(buff + index, "network={", 9) != 0)
2363 {
you.chen87ff5172022-05-06 11:30:57 +08002364 continue;
2365 }
2366 p = buff + index + 9;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002367 for (; index < len; index ++ )
2368 {
2369 if (buff[index] != '}')
2370 {
you.chen87ff5172022-05-06 11:30:57 +08002371 continue;
2372 }
2373 buff[index] = '\0';
2374 break;
2375 }
you.chen0c938042022-08-06 16:59:10 +08002376 network_len = buff + index - p;
2377 break;
you.chen87ff5172022-05-06 11:30:57 +08002378 }
2379
qs.xiongc6cab7c2023-02-17 18:41:07 +08002380 if (p == NULL)
2381 return -1;
2382
you.chened802ab2023-02-13 10:50:35 +08002383 ssid = strstr(p, "ssid=");
2384 if (ssid != NULL) {
2385 ssid += strlen("ssid=");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002386 if (ssid[0] == '\"')
2387 {
you.chened802ab2023-02-13 10:50:35 +08002388 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2389 break;
2390 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002391 else
2392 {
you.chened802ab2023-02-13 10:50:35 +08002393 ssid_end_flag = strstr(ssid, "\n");
2394 if (ssid_end_flag != NULL)
2395 {
2396 ssid_len = (ssid_end_flag - ssid) / 2;
2397 for(i=0; i<ssid_len; i++)
2398 {
2399 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2400 }
2401 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2402 break;
2403 }
2404 }
you.chen87ff5172022-05-06 11:30:57 +08002405 }
you.chened802ab2023-02-13 10:50:35 +08002406
you.chen87ff5172022-05-06 11:30:57 +08002407 }
2408
qs.xiongf1e48bb2023-03-28 13:38:22 +08002409 if (index >= len || NULL == p || network_len <= 0)
2410 {
you.chen87ff5172022-05-06 11:30:57 +08002411 return -1;
2412 }
2413
you.chen0c938042022-08-06 16:59:10 +08002414 count = lynq_split(p, network_len, '\n', split_lines);
you.chen87ff5172022-05-06 11:30:57 +08002415
2416 ret = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002417 for(index=0; index < count; index++)
2418 {
you.chen87ff5172022-05-06 11:30:57 +08002419 p = strstr(split_lines[index], "psk=");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002420 if (p != NULL)
2421 {
you.chenc7357f22022-05-16 17:55:28 +08002422 p += 4;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002423 if (*p == '\"')
2424 {
you.chenc7357f22022-05-16 17:55:28 +08002425 p++;
2426 }
you.chen87ff5172022-05-06 11:30:57 +08002427 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002428 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2429 {
you.chenc7357f22022-05-16 17:55:28 +08002430 p += 9;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002431 if (*p == '\"')
2432 {
you.chenc7357f22022-05-16 17:55:28 +08002433 p++;
2434 }
2435 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002436 else
2437 {
you.chenc7357f22022-05-16 17:55:28 +08002438 continue;
you.chen87ff5172022-05-06 11:30:57 +08002439 }
2440
qs.xiong9c1020c2023-02-21 19:12:54 +08002441 if (*p == '\"')
2442 p++;
2443 strncpy(password, p, 64);
you.chen87ff5172022-05-06 11:30:57 +08002444
qs.xiong9c1020c2023-02-21 19:12:54 +08002445 p = password;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002446 while(password - p < 64 && *password != '\0')
2447 {
2448 if (*password == '\"')
2449 {
you.chen87ff5172022-05-06 11:30:57 +08002450 *password = '\0';
2451 break;
2452 }
2453 password++;
2454 }
2455 ret = 0;
2456 break;
2457 } //end for(index=0; index < count; index++)
2458
2459 return ret;
2460}
2461
2462static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2463{
qs.xiongf1e48bb2023-03-28 13:38:22 +08002464 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongd189c542022-03-31 00:58:23 -04002465
qs.xiongf1e48bb2023-03-28 13:38:22 +08002466 if (sta_ssid == NULL)
2467 {
2468 RLOGE("sta_ssid is null\n");
2469 return -1;
you.chen87ff5172022-05-06 11:30:57 +08002470 }
2471
qs.xiongf1e48bb2023-03-28 13:38:22 +08002472 CHECK_WPA_CTRL(CTRL_STA);
you.chen87ff5172022-05-06 11:30:57 +08002473
2474 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2475
2476 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2477// DO_OK_FAIL_REQUEST(cmd_save_config);
2478
qs.xiongf1e48bb2023-03-28 13:38:22 +08002479 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002480
2481}
2482
you.chen87ff5172022-05-06 11:30:57 +08002483static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong8d42bb92022-03-02 09:43:11 -05002484{
you.chen87ff5172022-05-06 11:30:57 +08002485 char lynq_disable_cmd[128]={0};
2486 char lynq_select_cmd[128]={0};
2487
2488 CHECK_WPA_CTRL(CTRL_STA);
2489
qs.xiongf1e48bb2023-03-28 13:38:22 +08002490 if (save != 0)
2491 {
you.chen948e0032022-06-07 18:01:16 +08002492 if (start_flag != 0)
2493 {
2494 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2495 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2496 }
2497 else
2498 {
2499 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2500 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2501 }
you.chen87ff5172022-05-06 11:30:57 +08002502 DO_OK_FAIL_REQUEST(cmd_save_config);
2503 }
2504
qs.xiongf1e48bb2023-03-28 13:38:22 +08002505 if (start_flag == 0)
2506 {
you.chenc7357f22022-05-16 17:55:28 +08002507 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen87ff5172022-05-06 11:30:57 +08002508 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2509 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002510 else
2511 {
you.chen87ff5172022-05-06 11:30:57 +08002512 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2513 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2514 }
2515
2516 return 0;
2517}
2518
2519int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2520{
qs.xiongf1e48bb2023-03-28 13:38:22 +08002521 RLOGD("enter lynq_sta_ssid_password_set");
you.chen87ff5172022-05-06 11:30:57 +08002522 CHECK_IDX(idx, CTRL_STA);
2523
you.chenc7357f22022-05-16 17:55:28 +08002524 curr_status_info curr_state;
2525 ap_info_s ap_info;
2526 curr_state.ap = &ap_info;
2527 curr_state.state = NULL;
2528
qs.xiongf1e48bb2023-03-28 13:38:22 +08002529 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2530 {
you.chened802ab2023-02-13 10:50:35 +08002531 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chenc7357f22022-05-16 17:55:28 +08002532 return 0;
2533 }
2534
2535 return -1;
you.chen87ff5172022-05-06 11:30:57 +08002536}
2537
2538int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2539{
you.chen61c7aee2022-08-06 17:01:16 +08002540 scan_info_s *scan_list = NULL;
2541 saved_ap_info_s *save_list = NULL;
you.chen87ff5172022-05-06 11:30:57 +08002542 int scan_len=0;
2543 int save_len=0;
2544 int best_index = -1;
2545 int best_scan_index = -1;
2546 int best_rssi = 0;
you.chen61c7aee2022-08-06 17:01:16 +08002547 int i, j, ret;
2548
2549 ret = -1;
you.chen87ff5172022-05-06 11:30:57 +08002550
2551 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002552 if (info == NULL)
2553 {
you.chen87ff5172022-05-06 11:30:57 +08002554 return -1;
2555 }
2556
2557 curr_status_info curr_state;
2558 ap_info_s ap_info;
you.chen61c7aee2022-08-06 17:01:16 +08002559 char status[64];
you.chen87ff5172022-05-06 11:30:57 +08002560
you.chen61c7aee2022-08-06 17:01:16 +08002561 memset(&ap_info, 0, sizeof (ap_info));
2562 memset(status, 0, sizeof (status));
2563
2564 curr_state.ap = &ap_info;
2565 curr_state.state = status;
2566
qs.xiongf1e48bb2023-03-28 13:38:22 +08002567 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2568 {
you.chen87ff5172022-05-06 11:30:57 +08002569 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen61c7aee2022-08-06 17:01:16 +08002570 if (strcmp(status, STATE_COMPLETED) == 0)
2571 {
2572 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2573 }
2574 else
2575 {
2576 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2577 }
you.chenc32dc912023-04-27 17:52:44 +08002578 lynq_get_connect_ap_ip(idx, info->base_info.ap_ip);
you.chen87ff5172022-05-06 11:30:57 +08002579 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen61c7aee2022-08-06 17:01:16 +08002580 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen87ff5172022-05-06 11:30:57 +08002581 return 0;
2582 }
2583
you.chen61c7aee2022-08-06 17:01:16 +08002584 lynq_wifi_sta_start_scan(idx);
qs.xionge2dc2e02023-04-06 11:08:48 +08002585 sleep(2);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002586 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2587 {
you.chen61c7aee2022-08-06 17:01:16 +08002588 if (NULL != scan_list)
2589 {
2590 free(scan_list);
2591 }
you.chen87ff5172022-05-06 11:30:57 +08002592 return -1;
2593 }
2594
qs.xiongf1e48bb2023-03-28 13:38:22 +08002595 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2596 {
you.chen61c7aee2022-08-06 17:01:16 +08002597 if (NULL != scan_list)
2598 {
2599 free(scan_list);
2600 }
2601 if (NULL != save_list)
2602 {
2603 free(save_list);
2604 }
you.chen87ff5172022-05-06 11:30:57 +08002605 return -1;
2606 }
2607
qs.xiongf1e48bb2023-03-28 13:38:22 +08002608 for (i=0; i < save_len; i++)
2609 {
2610 for (j=0; j < scan_len; j++)
2611 {
you.chen87ff5172022-05-06 11:30:57 +08002612 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiongf1e48bb2023-03-28 13:38:22 +08002613 && save_list[i].base_info.auth == scan_list[j].auth)
2614 {
2615 if (best_rssi == 0)
2616 {
you.chen61c7aee2022-08-06 17:01:16 +08002617 best_index = i;
you.chen87ff5172022-05-06 11:30:57 +08002618 best_rssi = scan_list[j].rssi;
2619 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002620 else if (best_rssi > scan_list[j].rssi)
2621 {
you.chen87ff5172022-05-06 11:30:57 +08002622 best_index = i;
2623 best_scan_index = j;
2624 best_rssi = scan_list[j].rssi;
2625 }
you.chened802ab2023-02-13 10:50:35 +08002626 strncpy(save_list[i].base_info.ap_mac, scan_list[j].mac, sizeof (save_list[i].base_info.ap_mac));
you.chen87ff5172022-05-06 11:30:57 +08002627 break;
2628 }
2629 }
2630 }
2631
qs.xiongf1e48bb2023-03-28 13:38:22 +08002632 if (best_index >= 0)
2633 {
you.chen87ff5172022-05-06 11:30:57 +08002634 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chened802ab2023-02-13 10:50:35 +08002635 inner_get_ip_by_mac( info->base_info.ap_mac, info->base_info.ap_ip, sizeof (info->base_info.ap_ip));
you.chen87ff5172022-05-06 11:30:57 +08002636 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2637 info->rssi = best_rssi;
you.chen61c7aee2022-08-06 17:01:16 +08002638 ret = 0;
you.chen87ff5172022-05-06 11:30:57 +08002639 }
2640
you.chen61c7aee2022-08-06 17:01:16 +08002641 if (NULL != scan_list)
2642 {
2643 free(scan_list);
2644 }
2645 if (NULL != save_list)
2646 {
2647 free(save_list);
2648 }
2649
2650 return ret;
you.chen87ff5172022-05-06 11:30:57 +08002651}
2652
2653static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2654{
qs.xiong045f60b2023-03-29 17:36:14 +08002655 char lynq_auth_cmd[128]={0};
you.chen87ff5172022-05-06 11:30:57 +08002656 char lynq_ket_mgmt_cmd[64]={0};
2657 char lynq_pairwise_cmd[64]={0};
2658 char lynq_psk_cmd[64]={0};
2659
2660 CHECK_WPA_CTRL(CTRL_STA);
2661
qs.xiongf1e48bb2023-03-28 13:38:22 +08002662 switch(auth)
2663 {
2664 case LYNQ_WIFI_AUTH_OPEN:
you.chen87ff5172022-05-06 11:30:57 +08002665 {
2666 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong99b48d62022-04-07 05:41:29 -04002667
you.chen87ff5172022-05-06 11:30:57 +08002668 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002669// DO_OK_FAIL_REQUEST(cmd_save_config);
2670 break;
2671 }
2672 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen87ff5172022-05-06 11:30:57 +08002673 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiongf1e48bb2023-03-28 13:38:22 +08002674 {
2675 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2676 {
you.chen87ff5172022-05-06 11:30:57 +08002677 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2678 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002679 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2680 {
you.chen5e363602022-05-08 12:20:18 +08002681 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen87ff5172022-05-06 11:30:57 +08002682 }
2683 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2684 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong99b48d62022-04-07 05:41:29 -04002685
you.chen87ff5172022-05-06 11:30:57 +08002686 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2687 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2688 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong99b48d62022-04-07 05:41:29 -04002689
qs.xiongf1e48bb2023-03-28 13:38:22 +08002690 if (password != NULL)
2691 {
you.chen87ff5172022-05-06 11:30:57 +08002692 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2693 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002694 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen87ff5172022-05-06 11:30:57 +08002695 }
qs.xiong99b48d62022-04-07 05:41:29 -04002696
you.chen87ff5172022-05-06 11:30:57 +08002697// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002698 break;
2699 }
2700 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2701 {
qs.xionge2dc2e02023-04-06 11:08:48 +08002702 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiong045f60b2023-03-29 17:36:14 +08002703 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002704 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2705 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2706
qs.xionge2dc2e02023-04-06 11:08:48 +08002707 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002708 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2709 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2710 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2711
2712 break;
2713 }
2714 case LYNQ_WIFI_AUTH_WPA3_PSK:
2715 {
qs.xionge2dc2e02023-04-06 11:08:48 +08002716 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiong2e4b05a2023-04-17 09:45:19 +08002717 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE",net_no);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002718 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2719 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2720
qs.xionge2dc2e02023-04-06 11:08:48 +08002721 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002722 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2723 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2724 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2725
2726 break;
2727 }
2728 default:
2729 return -1;
you.chen87ff5172022-05-06 11:30:57 +08002730 }
qs.xiong99b48d62022-04-07 05:41:29 -04002731
qs.xiongf1e48bb2023-03-28 13:38:22 +08002732 return 0;
qs.xiong799dab02022-03-14 09:12:12 -04002733}
qs.xiong8d42bb92022-03-02 09:43:11 -05002734
you.chen87ff5172022-05-06 11:30:57 +08002735static int inner_get_curr_net_no(int interface) {
2736 curr_status_info curr_state;
2737 curr_state.ap = NULL;
2738 curr_state.state = NULL;
2739
qs.xiongf1e48bb2023-03-28 13:38:22 +08002740 if (0 != inner_get_status_info(interface, &curr_state))
2741 {
you.chen87ff5172022-05-06 11:30:57 +08002742 return -1;
2743 }
2744
2745 return curr_state.net_no;
2746}
2747
2748int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong8d42bb92022-03-02 09:43:11 -05002749{
you.chen87ff5172022-05-06 11:30:57 +08002750 int net_no;
2751 CHECK_IDX(idx, CTRL_STA);
qs.xiongd189c542022-03-31 00:58:23 -04002752
you.chen87ff5172022-05-06 11:30:57 +08002753 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong8d42bb92022-03-02 09:43:11 -05002754
qs.xiongf1e48bb2023-03-28 13:38:22 +08002755 if (net_no < 0)
2756 {
you.chen87ff5172022-05-06 11:30:57 +08002757 return -1;
2758 }
2759
2760 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong8d42bb92022-03-02 09:43:11 -05002761}
2762
you.chen083a2952023-05-12 19:39:06 +08002763int lynq_wifi_sta_connect_timeout(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw, int timeout)
qs.xiong8d42bb92022-03-02 09:43:11 -05002764{
you.chen87ff5172022-05-06 11:30:57 +08002765 int count, net_no, index;
2766 int net_no_list[128];
qs.xionga4ba25a2023-05-03 13:12:07 +08002767 char rm_net_cmd[128];
you.chen87ff5172022-05-06 11:30:57 +08002768 lynq_wifi_auth_s net_auth;
you.chenf9d718d2023-04-14 18:17:09 +08002769 curr_status_info curr_state;
2770 ap_info_s ap_info;
2771 char status[64];
qs.xiongd189c542022-03-31 00:58:23 -04002772
qs.xiongf1e48bb2023-03-28 13:38:22 +08002773 if (ssid == NULL || *ssid == '\0')
2774 {
2775 RLOGE("bad ssid\n");
you.chen87ff5172022-05-06 11:30:57 +08002776 return -1;
2777 }
qs.xiong8d42bb92022-03-02 09:43:11 -05002778
qs.xiongf1e48bb2023-03-28 13:38:22 +08002779 if (LYNQ_WIFI_AUTH_OPEN != auth)
2780 {
2781 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
you.chenf9d718d2023-04-14 18:17:09 +08002782 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08002783 RLOGE("bad password\n");
you.chen87ff5172022-05-06 11:30:57 +08002784 return -1;
2785 }
2786 }
qs.xiong8d42bb92022-03-02 09:43:11 -05002787
you.chenf9d718d2023-04-14 18:17:09 +08002788
2789 pthread_mutex_lock(&s_global_check_mutex);
2790 if (s_sta_status != INNER_STA_STATUS_INIT)
2791 {
2792 s_sta_status = INNER_STA_STATUS_CANCEL;
2793 pthread_cond_signal(&s_global_check_cond);
2794 }
2795 pthread_mutex_unlock(&s_global_check_mutex);
2796
you.chen87ff5172022-05-06 11:30:57 +08002797 CHECK_IDX(idx, CTRL_STA);
you.chenf9d718d2023-04-14 18:17:09 +08002798 CHECK_WPA_CTRL(CTRL_STA);
you.chen87ff5172022-05-06 11:30:57 +08002799
2800 net_no = -1;
you.chenf9d718d2023-04-14 18:17:09 +08002801 memset(&ap_info, 0, sizeof (ap_info));
2802 memset(status, 0, sizeof (status));
you.chen87ff5172022-05-06 11:30:57 +08002803
you.chenf9d718d2023-04-14 18:17:09 +08002804 curr_state.ap = &ap_info;
2805 curr_state.state = status;
2806
2807 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
qs.xiongf1e48bb2023-03-28 13:38:22 +08002808 {
you.chenf9d718d2023-04-14 18:17:09 +08002809 if (strcmp(status, STATE_COMPLETED) == 0 && strcmp(ap_info.ap_ssid, ssid) ==0 && ap_info.auth == auth)
2810 {
2811 net_no = curr_state.net_no;
2812 if (0 == lynq_sta_ssid_password_get(idx, &ap_info, ap_info.psw)
2813 && strcmp(ap_info.psw, psw) == 0)
2814 {
2815 RLOGD("already connected\n");
2816
2817 pthread_mutex_lock(&s_global_check_mutex);
2818 s_sta_status = INNER_STA_STATUS_CONNECTED;
2819 pthread_cond_signal(&s_global_check_cond);
2820 pthread_mutex_unlock(&s_global_check_mutex);
2821 return 0;
2822 }
you.chen87ff5172022-05-06 11:30:57 +08002823 }
2824 }
2825
you.chenf9d718d2023-04-14 18:17:09 +08002826 if (net_no == -1)
qs.xiongf1e48bb2023-03-28 13:38:22 +08002827 {
you.chenf9d718d2023-04-14 18:17:09 +08002828 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2829
2830 for (index=0; index < count; index++)
2831 {
2832 net_auth = -1;
2833 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2834 {
2835 net_no = net_no_list[index];
2836 break;
2837 }
you.chen87ff5172022-05-06 11:30:57 +08002838 }
2839
you.chenf9d718d2023-04-14 18:17:09 +08002840 if (net_no < 0)
2841 {
qs.xionga4ba25a2023-05-03 13:12:07 +08002842 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
2843 for ( index = 0; index < (count - STA_MAX_SAVED_AP_NUM + 1 ) ;index++) //+1 is for add new network
2844 {
2845 sprintf(rm_net_cmd,"REMOVE_NETWORK %d",net_no_list[index]);
2846 RLOGD("call cmd rm_net_cmd: %s;index is %d\n",rm_net_cmd,index);
2847 DO_OK_FAIL_REQUEST(rm_net_cmd);
2848 }
you.chenf9d718d2023-04-14 18:17:09 +08002849 net_no = lynq_add_network(CTRL_STA);
2850 if (net_no == -1)
2851 {
2852 return -1;
2853 }
2854
2855 RLOGD("net no is %d\n", net_no);
2856 if (0 != inner_set_sta_ssid(net_no, ssid))
2857 {
2858 return -1;
2859 }
you.chen87ff5172022-05-06 11:30:57 +08002860 }
2861 }
2862
qs.xiongf1e48bb2023-03-28 13:38:22 +08002863 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2864 {
you.chen87ff5172022-05-06 11:30:57 +08002865 return -1;
2866 }
2867
you.chenf9d718d2023-04-14 18:17:09 +08002868
2869 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen57eb5842023-05-18 14:19:46 +08002870 system("echo \"\" > /tmp/wlan0_dhcpcd_router");
you.chenf9d718d2023-04-14 18:17:09 +08002871 usleep(200*1000);
2872
2873 ret = inner_sta_start_stop(net_no, 1, 1);
2874
2875 pthread_mutex_lock(&s_global_check_mutex);
2876 s_sta_status = INNER_STA_STATUS_CONNECTING;
2877 strcpy(s_sta_current_connecting_ssid, ssid);
2878 struct timeval now;
2879 gettimeofday(&now,NULL);
you.chen083a2952023-05-12 19:39:06 +08002880 s_sta_connect_timeout.tv_sec = now.tv_sec + timeout;
you.chenf9d718d2023-04-14 18:17:09 +08002881 s_sta_connect_timeout.tv_nsec = now.tv_usec*1000;
2882 pthread_cond_signal(&s_global_check_cond);
2883 pthread_mutex_unlock(&s_global_check_mutex);
2884 return ret;
qs.xiong8d42bb92022-03-02 09:43:11 -05002885}
2886
you.chen083a2952023-05-12 19:39:06 +08002887int lynq_wifi_sta_connect(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw)
2888{
2889 return lynq_wifi_sta_connect_timeout(idx, ssid, auth, psw, MAX_CONNNECT_TIME);
2890}
2891
you.chen87ff5172022-05-06 11:30:57 +08002892int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong8d42bb92022-03-02 09:43:11 -05002893{
you.chen87ff5172022-05-06 11:30:57 +08002894 ap_info_s ap;
2895 curr_status_info curr_state;
2896 ap.ap_ssid[0] = '\0';
qs.xiong99b48d62022-04-07 05:41:29 -04002897
qs.xiongf1e48bb2023-03-28 13:38:22 +08002898 if (ssid == NULL || *ssid == '\0')
2899 {
2900 RLOGE("input ssid is NULL\n");
you.chen87ff5172022-05-06 11:30:57 +08002901 return -1;
2902 }
qs.xiong8d42bb92022-03-02 09:43:11 -05002903
you.chen87ff5172022-05-06 11:30:57 +08002904 CHECK_IDX(idx, CTRL_STA);
qs.xiong99b48d62022-04-07 05:41:29 -04002905
you.chen87ff5172022-05-06 11:30:57 +08002906 curr_state.ap = &ap;
you.chenefc7f3f2022-05-06 17:50:16 +08002907 curr_state.state = NULL;
2908
qs.xiongf1e48bb2023-03-28 13:38:22 +08002909 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2910 {
you.chen87ff5172022-05-06 11:30:57 +08002911 return 0;
2912 }
qs.xiong799dab02022-03-14 09:12:12 -04002913
qs.xiongf1e48bb2023-03-28 13:38:22 +08002914 if (strcmp(ap.ap_ssid, ssid) != 0)
2915 {
you.chen87ff5172022-05-06 11:30:57 +08002916 return 0;
2917 }
2918
you.chenf9d718d2023-04-14 18:17:09 +08002919 pthread_mutex_lock(&s_global_check_mutex);
2920 s_sta_status = INNER_STA_STATUS_DISCONNECTING;
2921 pthread_mutex_unlock(&s_global_check_mutex);
you.chen87ff5172022-05-06 11:30:57 +08002922 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong8d42bb92022-03-02 09:43:11 -05002923}
qs.xiong99b48d62022-04-07 05:41:29 -04002924
you.chen5e363602022-05-08 12:20:18 +08002925int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2926{
qs.xiongfa7be312023-01-18 13:17:41 +08002927// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2928// const char *lynq_reconnect_cmd = "RECONNECT";
2929 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2930 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2931// const char *lynq_first_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 remove_net all";
qs.xiong8d42bb92022-03-02 09:43:11 -05002932
you.chen87ff5172022-05-06 11:30:57 +08002933 CHECK_IDX(idx, CTRL_STA);
you.chen5e363602022-05-08 12:20:18 +08002934 CHECK_WPA_CTRL(CTRL_STA);
2935
you.chencd882682023-04-24 15:39:37 +08002936 ret = system_call_v("%s %s", start_stop_sta_script, "start");
2937 if (ret != 0)
qs.xiongfa7be312023-01-18 13:17:41 +08002938 {
you.chencd882682023-04-24 15:39:37 +08002939 RLOGE("lynq_wifi_ap_start excute script fail");
you.chen87ff5172022-05-06 11:30:57 +08002940 return -1;
2941 }
qs.xionge5164a82022-03-15 08:03:26 -04002942
qs.xiongfa7be312023-01-18 13:17:41 +08002943 system(lynq_enable_sta_cmd);
2944 system(lynq_reconnect_cmd);
2945// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chen5e363602022-05-08 12:20:18 +08002946 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002947}
2948
you.chen87ff5172022-05-06 11:30:57 +08002949int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong99b48d62022-04-07 05:41:29 -04002950{
qs.xiongfa7be312023-01-18 13:17:41 +08002951// char lynq_disable_network_cmd[MAX_CMD];
2952// curr_status_info curr_state;
2953// ap_info_s ap_info;
you.chen87ff5172022-05-06 11:30:57 +08002954
qs.xiongfa7be312023-01-18 13:17:41 +08002955 const char * lynq_disable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disable_net all";
you.chen5e363602022-05-08 12:20:18 +08002956 CHECK_IDX(idx, CTRL_STA);
2957 CHECK_WPA_CTRL(CTRL_STA);
2958
qs.xiongfa7be312023-01-18 13:17:41 +08002959 system(lynq_disable_sta_cmd);
you.chen5e363602022-05-08 12:20:18 +08002960 DO_OK_FAIL_REQUEST(cmd_save_config);
you.chencd882682023-04-24 15:39:37 +08002961
2962 ret = system_call_v("%s %s", start_stop_sta_script, "stop");
2963 if (ret != 0)
2964 {
2965 RLOGE("lynq_wifi_ap_start excute script fail");
2966 return -1;
2967 }
2968
you.chen5e363602022-05-08 12:20:18 +08002969 return 0;
2970// return system("connmanctl disable wifi");
qs.xiongd189c542022-03-31 00:58:23 -04002971}
qs.xiong8d42bb92022-03-02 09:43:11 -05002972
you.chen87ff5172022-05-06 11:30:57 +08002973//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
2974// int i, count;
2975// char *p;
2976// const char * FLAG_SSID = "ssid=";
2977// const char * FLAG_SBSID = "bssid=";
2978// const char * FLAG_KEY_MGMT = "key_mgmt=";
2979// const char * FLAG_FREQ = "freq=";
2980// char lynq_sta_cmd[MAX_CMD];
2981// char *split_lines[128] = {0};
2982
2983// CHECK_WPA_CTRL(CTRL_AP);
2984
2985// sprintf(lynq_sta_cmd, "STA %s", bssid);
2986
2987// DO_REQUEST(lynq_sta_cmd);
2988
2989// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2990
2991// for(i=0; i < count; i++) {
2992// p = strstr(split_lines[i], FLAG_SSID);
2993// if (p != NULL) {
2994// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
2995// continue;
2996// }
2997// }
2998
2999// lynq_get_interface_ip(idx, ap->ap_ip);
3000// lynq_ap_password_set(idx, ap->psw);
3001
3002// return 0;
3003//}
3004
3005static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
3006 curr_status_info curr_state;
3007 curr_state.ap = ap;
3008 curr_state.state = NULL;
3009 return inner_get_status_info(interface, &curr_state);
3010}
3011
3012int lynq_get_ap_device_list(lynq_wifi_index_e idx, ap_info_s **ap, device_info_s ** list,int * len)
qs.xiong99b48d62022-04-07 05:41:29 -04003013{
you.chened802ab2023-02-13 10:50:35 +08003014 int index, line_count;
3015 device_info_s *dev_info;
you.chen87ff5172022-05-06 11:30:57 +08003016 const char *lynq_first_sta_cmd = "STA-FIRST";
3017 char lynq_next_sta_cmd[MAX_CMD];
3018 char *bssid[1024] = {0};
you.chen87ff5172022-05-06 11:30:57 +08003019 char *split_lines[128] = {0};
qs.xiong99b48d62022-04-07 05:41:29 -04003020
you.chen87ff5172022-05-06 11:30:57 +08003021 CHECK_IDX(idx, CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04003022
you.chen87ff5172022-05-06 11:30:57 +08003023 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04003024
you.chen083a2952023-05-12 19:39:06 +08003025 // ap_info_s * tmp_ap;
3026 // device_info_s * tmp_list;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003027 if (ap == NULL || list == NULL || len == NULL)
3028 {
3029 RLOGE("bad input param");
you.chen87ff5172022-05-06 11:30:57 +08003030 return -1;
3031 }
3032
you.chen083a2952023-05-12 19:39:06 +08003033 // ap = &tmp_ap;
3034 // list = &tmp_list;
you.chen87ff5172022-05-06 11:30:57 +08003035 *ap = malloc(sizeof (ap_info_s));
you.chen083a2952023-05-12 19:39:06 +08003036 memset(*ap, 0, sizeof (ap_info_s));
you.chen87ff5172022-05-06 11:30:57 +08003037
you.chen083a2952023-05-12 19:39:06 +08003038 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0 || (*ap)->ap_ssid[0] == '\0')
qs.xiongf1e48bb2023-03-28 13:38:22 +08003039 {
you.chen083a2952023-05-12 19:39:06 +08003040 RLOGE("inner_get_status_info_ap !=0 or ap_ssid is empty\n");
you.chen87ff5172022-05-06 11:30:57 +08003041 return -1;
3042 }
3043
3044 lynq_get_interface_ip(idx, (*ap)->ap_ip);
3045 lynq_ap_password_get(idx, (*ap)->psw);
3046
you.chen87ff5172022-05-06 11:30:57 +08003047 DO_REQUEST(lynq_first_sta_cmd);
3048
3049 index = 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003050 while (reply_len > 0)
3051 {
3052 if (memcmp(cmd_reply, "FAIL", 4) == 0)
you.chen083a2952023-05-12 19:39:06 +08003053 {
you.chen87ff5172022-05-06 11:30:57 +08003054 break;
3055 }
3056 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3057 bssid[index] = malloc(strlen(split_lines[0]) + 1);
3058 strcpy(bssid[index], split_lines[0]);
3059 index++;
3060 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
3061 reply_len = MAX_RET;
3062 cmd_reply[0] = '\0';
you.chened802ab2023-02-13 10:50:35 +08003063 ret = local_wpa_ctrl_request(lynq_wpa_ctrl, lynq_next_sta_cmd, strlen(lynq_next_sta_cmd), cmd_reply, &reply_len, NULL);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003064 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
you.chen083a2952023-05-12 19:39:06 +08003065 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003066 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen87ff5172022-05-06 11:30:57 +08003067 break;
3068 }
3069 }
3070
3071 *len = index;
3072
3073 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiongf1e48bb2023-03-28 13:38:22 +08003074 for (index=0; index < *len; index++)
3075 {
you.chened802ab2023-02-13 10:50:35 +08003076 dev_info = &(*list)[index];
3077 memset(dev_info, 0, sizeof(device_info_s));
3078 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
3079 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
3080 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
3081 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen87ff5172022-05-06 11:30:57 +08003082 free(bssid[index]);
3083 }
3084
3085 return 0;
qs.xiong99b48d62022-04-07 05:41:29 -04003086}
3087
you.chen87ff5172022-05-06 11:30:57 +08003088int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong99b48d62022-04-07 05:41:29 -04003089{
you.chen87ff5172022-05-06 11:30:57 +08003090 int i, count, index, count_words;
3091 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
3092 char *split_lines[128] = {0};
3093 char *split_words[128] = {0};
3094 scan_info_s * p;
qs.xiong99b48d62022-04-07 05:41:29 -04003095
qs.xiongf1e48bb2023-03-28 13:38:22 +08003096 if (list == NULL || len == NULL)
3097 {
you.chen87ff5172022-05-06 11:30:57 +08003098 return -1;
3099 }
qs.xiong99b48d62022-04-07 05:41:29 -04003100
you.chen61c7aee2022-08-06 17:01:16 +08003101 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
3102 {
3103 usleep(100 * 1000);
3104 }
3105
you.chen87ff5172022-05-06 11:30:57 +08003106 CHECK_IDX(idx, CTRL_STA);
3107
3108 CHECK_WPA_CTRL(CTRL_STA);
3109
3110 DO_REQUEST(lynq_scan_result_cmd);
3111
3112 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3113 *len = count - 1;
3114 *list = malloc(sizeof (scan_info_s) * *len);
3115
3116 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiongf1e48bb2023-03-28 13:38:22 +08003117 for (index=0; index <count_words; index++)
3118 {
3119 RLOGD("----header: %s\n", split_words[index]);
you.chen87ff5172022-05-06 11:30:57 +08003120 }
3121
qs.xiongf1e48bb2023-03-28 13:38:22 +08003122 for(index = 1;index < count; index++)
3123 {
3124 RLOGD("---- %s\n",split_lines[index]);
you.chen7bf12432023-04-27 17:51:56 +08003125 memset(split_words, 0 , sizeof (split_words));
you.chen87ff5172022-05-06 11:30:57 +08003126 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
3127 if (count_words < 4)
3128 continue;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003129 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen87ff5172022-05-06 11:30:57 +08003130 //bssid / frequency / signal level / flags / ssid
3131 p = (*list) + index - 1;
3132 strcpy(p->mac, split_words[0]);
3133 p->band = convert_band_from_freq(atoi(split_words[1]));
3134 p->rssi = -1 * atoi( split_words[2]);
3135 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chen7bf12432023-04-27 17:51:56 +08003136 if (count_words == 4) // ssid hided
3137 {
3138 p->ssid[0] = '\0';
3139 }
3140 else
3141 {
3142 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
3143 }
you.chen87ff5172022-05-06 11:30:57 +08003144 }
3145
3146 return 0;
qs.xiong99b48d62022-04-07 05:41:29 -04003147}
qs.xiong99b48d62022-04-07 05:41:29 -04003148
you.chen87ff5172022-05-06 11:30:57 +08003149int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
3150{
3151 int count, net_no, index;
3152 int net_no_list[128];
3153 lynq_wifi_auth_s net_auth;
3154 char lynq_remove_cmd[MAX_CMD];
3155
qs.xiongf1e48bb2023-03-28 13:38:22 +08003156 if (ssid == NULL || *ssid == '\0')
3157 {
3158 RLOGD("bad ssid\n");
you.chen87ff5172022-05-06 11:30:57 +08003159 return -1;
3160 }
3161
3162 CHECK_IDX(idx, CTRL_STA);
3163
3164 CHECK_WPA_CTRL(CTRL_STA);
3165
3166 net_no = -1;
3167 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
3168
qs.xiongf1e48bb2023-03-28 13:38:22 +08003169 for (index=0; index < count; index++)
3170 {
you.chen87ff5172022-05-06 11:30:57 +08003171 net_auth = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003172 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
3173 {
you.chen87ff5172022-05-06 11:30:57 +08003174 net_no = net_no_list[index];
3175 break;
3176 }
3177 }
3178
qs.xiongf1e48bb2023-03-28 13:38:22 +08003179 if (net_no < 0)
3180 {
you.chen87ff5172022-05-06 11:30:57 +08003181 return 0;
3182 }
3183
3184 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
3185
3186 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
3187 DO_OK_FAIL_REQUEST(cmd_save_config);
3188
3189 return 0;
3190}
3191
3192int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiongf1e48bb2023-03-28 13:38:22 +08003193{
you.chened802ab2023-02-13 10:50:35 +08003194 int count, index;
you.chen87ff5172022-05-06 11:30:57 +08003195 int net_no_list[128];
3196 char freq[16];
qs.xiongf1e48bb2023-03-28 13:38:22 +08003197 RLOGD("enter lynq_get_sta_saved_ap api\n");
3198 if (list == NULL || len == NULL)
3199 {
3200 RLOGE("bad param,please check!");
you.chen87ff5172022-05-06 11:30:57 +08003201 return -1;
3202 }
3203
3204 CHECK_IDX(idx, CTRL_STA);
3205
3206// CHECK_WPA_CTRL(CTRL_STA);
3207
3208 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003209 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen87ff5172022-05-06 11:30:57 +08003210
you.chen8418a4e2023-04-13 14:06:58 +08003211 if (count < 0)
3212 {
3213 RLOGE("list network fail");
3214 return count;
3215 }
3216 else if (count == 0)
3217 {
3218 *list = NULL;
3219 *len = 0;
3220 return 0;
3221 }
3222
you.chen87ff5172022-05-06 11:30:57 +08003223 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen0c938042022-08-06 16:59:10 +08003224 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen87ff5172022-05-06 11:30:57 +08003225 *len = count;
3226
qs.xiongf1e48bb2023-03-28 13:38:22 +08003227 for (index=0; index < count; index++)
3228 {
you.chen87ff5172022-05-06 11:30:57 +08003229 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
you.chen87ff5172022-05-06 11:30:57 +08003230 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
you.chen87ff5172022-05-06 11:30:57 +08003231 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003232 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
you.chen8418a4e2023-04-13 14:06:58 +08003233 {
you.chen87ff5172022-05-06 11:30:57 +08003234 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
3235 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08003236 else
you.chen8418a4e2023-04-13 14:06:58 +08003237 {
you.chen87ff5172022-05-06 11:30:57 +08003238 (*list)[index].base_info.band = -1;
3239 }
you.chen8418a4e2023-04-13 14:06:58 +08003240 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen0c938042022-08-06 16:59:10 +08003241 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen87ff5172022-05-06 11:30:57 +08003242 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08003243 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen87ff5172022-05-06 11:30:57 +08003244 return 0;
3245}
3246
3247int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
3248{
qs.xiong045f60b2023-03-29 17:36:14 +08003249 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen87ff5172022-05-06 11:30:57 +08003250 const char *lynq_scan_cmd = "SCAN";
3251
3252 CHECK_IDX(idx, CTRL_STA);
3253
3254 CHECK_WPA_CTRL(CTRL_STA);
3255
you.chen377987d2023-05-10 15:56:26 +08003256 if (g_sta_scan_finish_flag == 1 && s_sta_status == INNER_STA_STATUS_INIT) // temp add
3257 {
3258 RLOGD("tmp clear scanlist");
3259 system(clean_last_re);
3260 }
you.chen61c7aee2022-08-06 17:01:16 +08003261 g_sta_scan_finish_flag = 0;
qs.xiongc6cab7c2023-02-17 18:41:07 +08003262 DO_REQUEST(lynq_scan_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003263 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
3264 {
qs.xiongc6cab7c2023-02-17 18:41:07 +08003265 return 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003266 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
3267 {
qs.xiongc6cab7c2023-02-17 18:41:07 +08003268 g_sta_scan_finish_flag = 1;
3269 return -1;
3270 }
you.chen87ff5172022-05-06 11:30:57 +08003271
3272 return 0;
3273}
3274
3275int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003276 if (cb == NULL)
3277 {
3278 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen87ff5172022-05-06 11:30:57 +08003279 return -1;
3280 }
3281
you.chen603c58a2023-04-24 13:55:29 +08003282 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003283 g_ap_callback_priv = priv;
3284 g_ap_callback_func = cb;
3285
you.chen603c58a2023-04-24 13:55:29 +08003286 if (g_ap_watcher_pid == 0 )
3287 {
3288 if(pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL) < 0)
3289 {
3290 g_ap_watcher_pid = 0;
3291 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3292 RLOGE("[wifi error]creat APWatcherThreadProc fail");
3293 return -1;
3294 }
3295 }
3296
3297 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3298 RLOGD("creat APWatcherTheradProc susccs");
3299
you.chen87ff5172022-05-06 11:30:57 +08003300 return 0;
3301}
3302
3303int lynq_unreg_ap_event_callback(void * priv) {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003304 if (g_ap_callback_priv == priv)
3305 {
you.chen87ff5172022-05-06 11:30:57 +08003306 g_ap_callback_func = NULL;
3307 g_ap_callback_priv = NULL;
3308 return 0;
3309 }
3310 return -1;
3311}
3312
3313int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiongf1e48bb2023-03-28 13:38:22 +08003314 if (cb == NULL)
3315 {
3316 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen87ff5172022-05-06 11:30:57 +08003317 return -1;
3318 }
3319
you.chen603c58a2023-04-24 13:55:29 +08003320 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003321 g_sta_callback_priv = priv;
3322 g_sta_callback_func = cb;
3323
you.chen603c58a2023-04-24 13:55:29 +08003324 if (g_sta_watcher_pid == 0 ) {
3325 if(pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL) < 0)
3326 {
3327 g_sta_watcher_pid = 0;
3328 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3329 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
3330 return -1;
3331 }
3332 }
3333
3334 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3335 RLOGD("creat STAWatcherTheradProc susccs");
you.chen87ff5172022-05-06 11:30:57 +08003336 return 0;
3337}
3338
3339int lynq_unreg_sta_event_callback(void * priv) {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003340 if (g_sta_callback_priv == priv)
3341 {
you.chen87ff5172022-05-06 11:30:57 +08003342 g_sta_callback_func = NULL;
3343 g_sta_callback_priv = NULL;
3344 return 0;
3345 }
3346 return -1;
3347}
3348
3349
3350static int inner_get_status_info_state (int interface, char *state) {
3351 curr_status_info curr_state;
3352 curr_state.ap = NULL;
3353 curr_state.state = state;
3354 return inner_get_status_info(interface, &curr_state);
3355}
3356
3357int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
3358{
3359 char state[MAX_CMD];
qs.xiongf1e48bb2023-03-28 13:38:22 +08003360 RLOGD("enter lynq_get_ap_status\n");
you.chen87ff5172022-05-06 11:30:57 +08003361 CHECK_IDX(idx, CTRL_AP);
3362
qs.xiongf1e48bb2023-03-28 13:38:22 +08003363 if (inner_get_status_info_state(CTRL_AP, state) != 0)
3364 {
you.chen87ff5172022-05-06 11:30:57 +08003365 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3366 return 0;
3367 }
3368
qs.xiongf1e48bb2023-03-28 13:38:22 +08003369 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3370 {
you.chen87ff5172022-05-06 11:30:57 +08003371 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
3372 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08003373 else
3374 {
you.chen87ff5172022-05-06 11:30:57 +08003375 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3376 }
3377
3378 return 0;
3379}
3380
3381int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
3382 char state[MAX_CMD];
qs.xiongf1e48bb2023-03-28 13:38:22 +08003383 RLOGD("enter lynq_get_sta_status\n");
you.chen87ff5172022-05-06 11:30:57 +08003384 CHECK_IDX(idx, CTRL_STA);
3385
qs.xiongf1e48bb2023-03-28 13:38:22 +08003386 if (inner_get_status_info_state(CTRL_STA, state) != 0)
3387 {
you.chen87ff5172022-05-06 11:30:57 +08003388 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3389 return 0;
3390 }
3391
qs.xiongf1e48bb2023-03-28 13:38:22 +08003392 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3393 {
you.chen87ff5172022-05-06 11:30:57 +08003394 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
3395 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08003396 else
3397 {
you.chen87ff5172022-05-06 11:30:57 +08003398 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3399 }
3400
3401 return 0;
3402}
3403
3404int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
3405// CHECK_IDX(idx, CTRL_AP);
3406// int ret = 0;
3407// size_t reply_len = MAX_RET;
3408// char cmd_reply[MAX_RET]={0};
3409// const char * cmd_str = "GET country";
3410// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
3411// do{
3412// if (NULL == s_lynq_wpa_ctrl) {
3413// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
3414// if (NULL == s_lynq_wpa_ctrl ) {
3415// printf("wpa_ctrl_open fail\n");
3416// return -1;
3417// }
3418// }
3419// }while(0);
3420
3421// do {
3422// reply_len = MAX_RET;
3423// cmd_reply[0] = '\0';
3424// printf("to call [%s]\n", cmd_str);
you.chened802ab2023-02-13 10:50:35 +08003425// ret = local_wpa_ctrl_request(s_lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL);
you.chen87ff5172022-05-06 11:30:57 +08003426// if (ret != 0) {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003427// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen87ff5172022-05-06 11:30:57 +08003428// return ret;
3429// }
3430// cmd_reply[reply_len+1] = '\0';
qs.xiongf1e48bb2023-03-28 13:38:22 +08003431// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen87ff5172022-05-06 11:30:57 +08003432// }while(0);
3433
3434 FILE *fp;
3435 size_t i = 0;
3436 char lynq_cmd_ret[MAX_RET]={0};
3437
3438// CHECK_IDX(idx, CTRL_AP);
3439
3440 if((fp=popen("wl country","r"))==NULL)
qs.xiongf1e48bb2023-03-28 13:38:22 +08003441 {
3442 perror("popen error!");
3443 return -1;
3444 }
you.chen87ff5172022-05-06 11:30:57 +08003445 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
3446 {
3447 perror("fread fail!");
3448 return -1;
3449 }
3450
qs.xiongf1e48bb2023-03-28 13:38:22 +08003451 for(i=0; i < strlen(lynq_cmd_ret); i++)
3452 {
3453 if (lynq_cmd_ret[i] == ' ')
3454 {
you.chen87ff5172022-05-06 11:30:57 +08003455 lynq_cmd_ret[i] = '\0';
3456 break;
3457 }
3458 }
3459
3460 strcpy(country_code,lynq_cmd_ret);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003461 RLOGD("---country code %s\n", country_code);
you.chen87ff5172022-05-06 11:30:57 +08003462
3463 int ret=pclose(fp);
3464 if(ret==-1)
3465 {
3466 perror("close file faild");
3467 }
3468
3469 return 0;
3470}
3471
3472int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
3473// const char * cmd_str = "GET country";
3474// CHECK_IDX(idx, CTRL_AP);
3475// CHECK_WPA_CTRL(CTRL_STA);
3476
3477// DO_REQUEST(cmd_str);
3478// printf("result %s\n", cmd_reply);
3479
qs.xiongf1e48bb2023-03-28 13:38:22 +08003480 if (country_code == NULL || *country_code == '\0')
3481 {
3482 RLOGD("bad country code\n");
you.chen87ff5172022-05-06 11:30:57 +08003483 return -1;
3484 }
3485
3486 char lynq_country_cmd[MAX_CMD];
3487 sprintf(lynq_country_cmd, "wl country %s", country_code);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003488 if (system(lynq_country_cmd) == 0)
3489 {
you.chen87ff5172022-05-06 11:30:57 +08003490 return 0;
3491 }
3492
3493 return -1;
3494}
3495
3496int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
3497{
qs.xiongf1e48bb2023-03-28 13:38:22 +08003498 RLOGD("enter lynq_get_connect_ap_mac\n");
3499 if (mac == NULL)
3500 {
3501 RLOGE("input ptr is NULL,please check\n");
you.chen87ff5172022-05-06 11:30:57 +08003502 return -1;
3503 }
3504
3505 CHECK_IDX(idx, CTRL_STA);
3506 ap_info_s ap;
3507 ap.ap_mac[0] = '\0';
3508
qs.xiongf1e48bb2023-03-28 13:38:22 +08003509 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3510 {
you.chen87ff5172022-05-06 11:30:57 +08003511 return -1;
3512 }
3513 strcpy(mac, ap.ap_mac);
3514
3515 return 0;
3516}
3517
3518int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
3519{
qs.xiongf1e48bb2023-03-28 13:38:22 +08003520 RLOGD("enter lynq_get_interface_ip\n");
you.chen61c7aee2022-08-06 17:01:16 +08003521 struct ifaddrs *ifaddr_header, *ifaddr;
3522 struct in_addr * ifa;
3523 const char * ifaName = "wlan0";
3524 if (ip == NULL)
3525 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003526 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chendad3f9f2022-06-21 16:53:48 +08003527 return -1;
you.chen61c7aee2022-08-06 17:01:16 +08003528 }
you.chendad3f9f2022-06-21 16:53:48 +08003529
qs.xiongf1e48bb2023-03-28 13:38:22 +08003530 if (idx == 1)
3531 {
you.chen377987d2023-05-10 15:56:26 +08003532 ifaName = inner_get_ap_interface_name();
3533 if (ifaName == NULL)
3534 {
3535 RLOGE("[lynq_get_interface_ip] ap name get fail");
3536 return -1;
3537 }
you.chen61c7aee2022-08-06 17:01:16 +08003538 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08003539 else if (idx != 0)
3540 {
you.chen87ff5172022-05-06 11:30:57 +08003541 return -1;
you.chen61c7aee2022-08-06 17:01:16 +08003542 }
you.chen87ff5172022-05-06 11:30:57 +08003543
you.chen61c7aee2022-08-06 17:01:16 +08003544 if (getifaddrs(&ifaddr_header) == -1)
3545 {
you.chen87ff5172022-05-06 11:30:57 +08003546 perror("getifaddrs");
3547 return -1;
3548 //exit(EXIT_FAILURE);
you.chen61c7aee2022-08-06 17:01:16 +08003549 }
you.chen87ff5172022-05-06 11:30:57 +08003550
3551
you.chen61c7aee2022-08-06 17:01:16 +08003552 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3553 {
3554 if (ifaddr->ifa_addr == NULL)
you.chen87ff5172022-05-06 11:30:57 +08003555 continue;
you.chen61c7aee2022-08-06 17:01:16 +08003556 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3557 {
3558 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3559 {
3560 // is a valid IP4 Address
3561 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3562 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003563 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen61c7aee2022-08-06 17:01:16 +08003564 freeifaddrs(ifaddr_header);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003565 RLOGD("ip %s\n", ip);
you.chen61c7aee2022-08-06 17:01:16 +08003566 return 0;
3567 }
3568 }
3569 }
qs.xiong84d87a42023-02-08 18:16:58 +08003570 freeifaddrs(ifaddr_header);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003571 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen61c7aee2022-08-06 17:01:16 +08003572 return -1;
you.chen87ff5172022-05-06 11:30:57 +08003573}
3574
3575int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3576{
qs.xiongf1e48bb2023-03-28 13:38:22 +08003577 RLOGD("enter lynq_get_interface_mac\n");
you.chen87ff5172022-05-06 11:30:57 +08003578 int count;
3579 size_t i;
3580 char *split_words[128] = {0};
3581 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3582
3583 CHECK_WPA_CTRL(idx);
3584
3585 DO_REQUEST(lynq_get_mac_cmd);
3586
qs.xiongf1e48bb2023-03-28 13:38:22 +08003587 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3588 {
3589 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen87ff5172022-05-06 11:30:57 +08003590 return -1;
3591 }
3592
3593 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3594
qs.xiongf1e48bb2023-03-28 13:38:22 +08003595 if (count < 2)
3596 {
you.chen87ff5172022-05-06 11:30:57 +08003597 return -1;
3598 }
3599
qs.xiongf1e48bb2023-03-28 13:38:22 +08003600 for (i=0; i < strlen(split_words[1]); i++ )
3601 {
3602 if (split_words[1][i] != ' ')
3603 {
you.chen87ff5172022-05-06 11:30:57 +08003604 break;
3605 }
3606 }
3607
3608 strcpy(mac, split_words[1] + i);
3609
3610 return 0;
3611}
3612
3613int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3614{
3615// int count;
3616// char *split_words[128] = {0};
3617// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3618
3619// if (rssi == NULL) {
3620// return -1;
3621// }
3622
3623// CHECK_IDX(idx, CTRL_STA);
3624
3625// CHECK_WPA_CTRL(CTRL_STA);
3626
3627// DO_REQUEST(lynq_get_rssi_cmd);
3628
3629// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3630// return -1;
3631// }
3632
3633// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3634
3635// if (count < 2) {
3636// return -1;
3637// }
3638
3639// *rssi = atoi(split_words[1]) * -1;
3640
you.chen87ff5172022-05-06 11:30:57 +08003641 char lynq_cmd_ret[MAX_RET]={0};
3642
qs.xiongc28ae382022-10-11 15:47:14 +08003643/*******change other cmd to get rssi*******
3644 *
3645 *wl rssi ---> wl -i wlan0 rssi
3646 *
3647 ***** change by qs.xiong 20221011*******/
you.chenbf5d0ee2023-04-12 16:46:00 +08003648 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiongf1e48bb2023-03-28 13:38:22 +08003649 {
you.chenbf5d0ee2023-04-12 16:46:00 +08003650 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen87ff5172022-05-06 11:30:57 +08003651 return -1;
3652 }
you.chenfcea58c2022-06-06 17:18:18 +08003653 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongc28ae382022-10-11 15:47:14 +08003654/****** if got rssi is 0,means sta didn't connected any device****/
3655 if(*rssi == 0)
3656 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003657 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chenbf5d0ee2023-04-12 16:46:00 +08003658 return -1;
qs.xiongc28ae382022-10-11 15:47:14 +08003659 }
you.chen87ff5172022-05-06 11:30:57 +08003660
3661 return 0;
3662}
3663
3664int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3665{
qs.xiongf1e48bb2023-03-28 13:38:22 +08003666 RLOGD("enter lynq_get_connect_ap_band\n");
3667 if (band == NULL)
3668 {
you.chen87ff5172022-05-06 11:30:57 +08003669 return -1;
3670 }
3671
3672 CHECK_IDX(idx, CTRL_STA);
3673 ap_info_s ap;
3674 ap.band = -1;
3675
qs.xiongf1e48bb2023-03-28 13:38:22 +08003676 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3677 {
you.chen87ff5172022-05-06 11:30:57 +08003678 return -1;
3679 }
3680 *band = ap.band;
3681
3682 return 0;
qs.xiong99b48d62022-04-07 05:41:29 -04003683}
you.chendad3f9f2022-06-21 16:53:48 +08003684
3685int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3686{
you.chen083a2952023-05-12 19:39:06 +08003687 int ret;
3688 char *p;
qs.xiongc719c3f2023-02-28 18:22:49 +08003689 char bssid[1024] = {0};
you.chendad3f9f2022-06-21 16:53:48 +08003690
3691 if (ip == NULL)
3692 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003693 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chendad3f9f2022-06-21 16:53:48 +08003694 return -1;
3695 }
3696
3697 CHECK_IDX(idx, CTRL_STA);
3698
qs.xiongc719c3f2023-02-28 18:22:49 +08003699 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chendad3f9f2022-06-21 16:53:48 +08003700 {
3701 return -1;
3702 }
qs.xiongc719c3f2023-02-28 18:22:49 +08003703
you.chen083a2952023-05-12 19:39:06 +08003704 ip[0] = '\0';
3705 ret = inner_get_ip_by_mac(bssid, ip, 32); //better input by user
3706 if (ret != 0)
3707 {
3708 RLOGE("[lynq_get_connect_ap_ip] inner_get_ip_by_mac return fail");
3709 return -1;
3710 }
3711
3712 if (ip[0] == '\0' || strchr(ip, ':') != NULL) //temp change, not ok
3713 {
3714 ip[0] = '\0';
you.chen57eb5842023-05-18 14:19:46 +08003715 ret = exec_cmd("grep \"new_router\" /tmp/wlan0_dhcpcd_router | awk '{print $2}'| tail -1", ip, 32);
you.chen083a2952023-05-12 19:39:06 +08003716 if (ret != 0)
3717 {
3718 ip[0] = '\0';
3719 return 0;
3720 }
3721 else
3722 {
3723 p = strchr(ip, '\n');
3724 if (p != NULL)
3725 {
3726 *p = '\0';
3727 }
3728 }
3729 }
3730 return 0;
you.chendad3f9f2022-06-21 16:53:48 +08003731}
3732
qs.xiongd5c6fd32022-10-17 11:15:45 +08003733int lynq_ap_connect_num(int sta_number)
3734{
3735 char lynq_limit_cmd[32]={0};
3736 int ret;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003737 if((sta_number < 1 ) && (sta_number > 15))
3738 {
3739 RLOGE("sta_number: not in range\n",sta_number);
qs.xiongd5c6fd32022-10-17 11:15:45 +08003740 return -1;
3741 }
3742 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3743 ret = system(lynq_limit_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003744 if(ret != 0)
3745 {
3746 RLOGE("cmd of limit ap devices number error\n");
qs.xiongd5c6fd32022-10-17 11:15:45 +08003747 }
3748 return 0;
3749}
you.chendad3f9f2022-06-21 16:53:48 +08003750
qs.xiong330f5a12022-10-17 11:19:57 +08003751int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3752{
3753
3754 char lynq_wifi_acs_cmd[128]={0};
3755 char lynq_cmd_mode[128]={0};
3756 char lynq_cmd_slect[128]={0};
3757
qs.xiongf1e48bb2023-03-28 13:38:22 +08003758 if((acs_mode != 2) && (acs_mode != 5))
3759 {
qs.xiong330f5a12022-10-17 11:19:57 +08003760 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3761 }
3762
qs.xiongf1e48bb2023-03-28 13:38:22 +08003763 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3764 {
qs.xiong330f5a12022-10-17 11:19:57 +08003765 return -1;
3766 }
3767
3768 CHECK_IDX(idx, CTRL_AP);
3769
3770 CHECK_WPA_CTRL(CTRL_AP);
3771
3772 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3773 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3774 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3775
3776 DO_OK_FAIL_REQUEST(cmd_disconnect);
3777 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3778 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3779 DO_OK_FAIL_REQUEST(cmd_save_config);
3780 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3781
3782 return 0;
3783}
you.chen2ef1c552022-11-07 18:31:14 +08003784//you.chen add for tv-box start
3785static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3786 FILE *fp;
3787 //printf("to exec cmd:%s\n", str_cmd);
3788 if((fp=popen(str_cmd,"r"))==NULL)
3789 {
3790 perror("popen error!");
3791 return -1;
3792 }
3793 if((fread(str_cmd_ret,max_len,1,fp))<0)
3794 {
3795 perror("fread fail!");
3796 fclose(fp);
3797 return -1;
3798 }
3799 fclose(fp);
3800 return 0;
3801}
3802
3803static int get_netmask_length(const char* mask)
3804{
3805 int masklen=0, i=0;
3806 int netmask=0;
3807
3808 if(mask == NULL)
3809 {
3810 return 0;
3811 }
3812
3813 struct in_addr ip_addr;
3814 if( inet_aton(mask, &ip_addr) )
3815 {
3816 netmask = ntohl(ip_addr.s_addr);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003817 }else
3818 {
you.chen2ef1c552022-11-07 18:31:14 +08003819 netmask = 0;
3820 return 0;
3821 }
3822
3823 while(0 == (netmask & 0x01) && i<32)
3824 {
3825 i++;
3826 netmask = netmask>>1;
3827 }
3828 masklen = 32-i;
3829 return masklen;
3830}
3831
3832static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3833 int mask_len;
3834 char *p;
3835 char tmp[64] = {0};
you.chencd882682023-04-24 15:39:37 +08003836 sprintf(tmp, "ifconfig %s | grep Mask", s_ap_iterface_name);
3837 if (exec_cmd(tmp, str_cmd_ret, max_len) != 0)
you.chen2ef1c552022-11-07 18:31:14 +08003838 return -1;
3839 p = strstr(str_cmd_ret, "Mask:");
3840 if (p == NULL)
3841 return -1;
3842 mask_len = get_netmask_length(p + 5);
3843 if (mask_len == 0)
3844 return -1;
3845 p = strstr(str_cmd_ret, "inet addr:");
3846 if (p == NULL)
3847 return -1;
3848 strcpy(tmp, p + 10);
3849 p = strstr(tmp, " ");
3850 if (p != NULL)
3851 *p = '\0';
3852 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
3853 return 0;
3854}
3855
3856static void GBWWatchThreadProc() {
3857 int i,n, nloop, nmax, ncheckcount, nidlecount;
3858 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
3859 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
3860 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
3861 char *results[16] = {0};
3862 char str_cmd[256] = {0};
3863 char str_cmd_ret[128] = {0};
3864 char dest_ip[32] = {0};
3865 lastAP1Bytes = lastAP2Bytes = 0;
3866 lastAP1Drop = lastAP2Drop = 0;
3867 lastAP1Speed = lastAP2Speed = 0;
3868 setAP1Speed = 50;
3869 setAP2Speed = 80;
3870 nloop = 0;
3871 nmax = 6;
3872 ncheckcount = nidlecount = 0;
3873
you.chen377987d2023-05-10 15:56:26 +08003874 if (inner_get_ap_interface_name() == NULL)
you.chencd882682023-04-24 15:39:37 +08003875 {
3876 RLOGE("------gbw thread run\n");
3877 return;
3878 }
3879
qs.xiongf1e48bb2023-03-28 13:38:22 +08003880 RLOGD("------gbw thread run\n");
you.chen2ef1c552022-11-07 18:31:14 +08003881 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
3882 while (dest_ip[0] == '\0') {
3883 sleep(1);
3884 str_cmd_ret[0] = '\0';
3885 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
3886 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
3887 if (str_cmd_ret[n] == '\n'){
3888 str_cmd_ret[n] = '\0';
3889 break;
3890 }
3891 }
3892 if (str_cmd_ret[0] != '\0')
3893 {
3894 strcpy(dest_ip, str_cmd_ret);
3895 }
3896 }
3897
you.chencd882682023-04-24 15:39:37 +08003898 system_call_v("tc qdisc del dev %s root > /dev/null 2>&1", s_ap_iterface_name);
3899 system_call_v("tc qdisc add dev %s root handle 1: htb r2q 1", s_ap_iterface_name);
3900 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.chen2ef1c552022-11-07 18:31:14 +08003901 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
3902 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003903 RLOGD("not get tether info\n");
you.chen2ef1c552022-11-07 18:31:14 +08003904 return;
3905 }
you.chencd882682023-04-24 15:39:37 +08003906 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);
3907 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);
3908 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.chen2ef1c552022-11-07 18:31:14 +08003909
3910 while (1) {
3911 sleep(1);
3912 memset(str_cmd, 0, sizeof(str_cmd));
you.chencd882682023-04-24 15:39:37 +08003913 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
3914 sprintf(str_cmd, "tc -s class show dev %s classid 1:1 | grep Sent", s_ap_iterface_name);
3915 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen2ef1c552022-11-07 18:31:14 +08003916 continue;
3917 //printf("ap1 --- %s\n", str_cmd);
you.chencd882682023-04-24 15:39:37 +08003918 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen2ef1c552022-11-07 18:31:14 +08003919 if (n > 9) {
3920 if (strcmp(results[1], "Sent") == 0) {
3921 currAP1Bytes = atoll(results[2]);
3922 }
3923 if (strcmp(results[6], "(dropped") == 0) {
3924 currAP1Drop = atoi(results[7]);
3925 }
3926 }
3927
3928 memset(str_cmd, 0, sizeof(str_cmd));
you.chencd882682023-04-24 15:39:37 +08003929 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
3930 sprintf(str_cmd, "tc -s class show dev %s classid 1:2 | grep Sent", s_ap_iterface_name);
3931 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen2ef1c552022-11-07 18:31:14 +08003932 continue;
3933 //printf("ap2 --- %s\n", str_cmd);
you.chencd882682023-04-24 15:39:37 +08003934 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen2ef1c552022-11-07 18:31:14 +08003935 if (n > 9) {
3936 if (strcmp(results[1], "Sent") == 0) {
3937 currAP2Bytes = atoll(results[2]);
3938 }
3939 if (strcmp(results[6], "(dropped") == 0) {
3940 currAP2Drop = atoi(results[7]);
3941 }
3942 }
3943
3944 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
3945 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
3946 lastAP1Bytes = currAP1Bytes;
3947 lastAP2Bytes = currAP2Bytes;
3948 continue;
3949 }
3950
3951 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
3952 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
3953 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
3954 lastAP1Speed = currAP1Speed;
3955 lastAP2Speed = currAP2Speed;
3956 lastAP1Bytes = currAP1Bytes;
3957 lastAP2Bytes = currAP2Bytes;
3958
3959 currSetAP1Speed = setAP1Speed;
3960 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
3961 ncheckcount++;
3962 if (ncheckcount > 3) {
3963 ncheckcount = 0;
3964 currSetAP1Speed = 5;
3965 }
3966 }
3967 else {
3968 ncheckcount = 0;
3969 if (currAP1Speed < 5)
3970 nidlecount++;
3971 else
3972 nidlecount = 0;
3973
3974 }
3975
3976 if (nidlecount > 60 ){
3977 currSetAP1Speed = 50;
3978 }
3979
3980 if (currSetAP1Speed != setAP1Speed) {
3981 setAP1Speed = currSetAP1Speed;
you.chencd882682023-04-24 15:39:37 +08003982 system_call_v(str_cmd, "tc class replace dev %s parent 1: classid 1:1 htb rate %dMbit ceil %dMbit prio 2 quantum 3000",
3983 s_ap_iterface_name, setAP1Speed, (int)(setAP1Speed*1.4));
you.chen2ef1c552022-11-07 18:31:14 +08003984 }
3985 }
3986}
3987
3988int enableGBW(const char* mac) {
3989 int i,len;
3990 char get_ipaddr_cmd[128]={0};
3991 ap_info_s *ap;
3992 device_info_s * list;
3993
3994 if (mac == NULL || g_gbw_enabled == 1)
3995 return -1;
3996 len = strlen(mac);
3997 g_gbw_mac = malloc(len + 1);
3998 for(i=0;i<len;i++) {
3999 if (mac[i] >= 'A' && mac[i] <= 'Z')
4000 {
4001 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
4002 }
4003 else
4004 g_gbw_mac[i] = mac[i];
4005 }
4006 g_gbw_mac[i] = '\0';
4007 g_gbw_enabled = 1;
4008
4009 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
4010 if (system(get_ipaddr_cmd) == 0) {
4011 //startGBW();
4012 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
4013 for (i=0;i<len;i++) {
4014 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
4015 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
4016 startGBW();
4017 }
4018 free(ap);
4019 free(list);
4020 }
4021 }
4022 return 0;
4023}
4024
4025int disableGBW() {
4026 stopGBW();
4027 free(g_gbw_mac);
4028 g_gbw_mac = NULL;
4029 g_gbw_enabled = 1;
4030 return 0;
4031}
4032
4033static int startGBW() {
4034 if (g_gbw_watcher_pid != 0) {
4035 stopGBW();
4036 }
4037 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
4038}
4039
4040static int stopGBW() {
4041 void* retval;
you.chencd882682023-04-24 15:39:37 +08004042 char cmd[64] = {0};
you.chen2ef1c552022-11-07 18:31:14 +08004043 pthread_cancel(g_gbw_watcher_pid);
4044 pthread_join(g_gbw_watcher_pid, &retval);
4045 g_gbw_watcher_pid = 0;
you.chencd882682023-04-24 15:39:37 +08004046 sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
4047 if (s_ap_iterface_name[0] != '\0')
4048 {
4049 sprintf(cmd, "tc qdisc del dev %s root", s_ap_iterface_name);
4050 system(cmd);
4051 }
you.chen2ef1c552022-11-07 18:31:14 +08004052}
4053//you.chen add for tv-box end