blob: 4a3c6c9a97c9ae5a9b3ccf944033f3515e2c89ca [file] [log] [blame]
qs.xiong1af5daf2022-03-14 09:12:12 -04001/**@File lib_wifi6.c
2* @Brief :about function test
3* @details :
you.chen35020192022-05-06 11:30:57 +08004* @Author : you.chen
5* @Date : 2022-4-6
qs.xiong1af5daf2022-03-14 09:12:12 -04006* @Version : V1.0
7* @copy ritght : Copyright (c) MobileTek
8*/
9#include <log/log.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050010#include <stdio.h>
11#include <sys/types.h>
you.chen35020192022-05-06 11:30:57 +080012#include <stdlib.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050013#include <string.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050014#include "libwifi6.h"
you.chen35020192022-05-06 11:30:57 +080015#include <wpa_ctrl.h>
16#include <string.h>
17#include <time.h>
18#include <pthread.h>
19#include <sys/socket.h>
20#include <netinet/in.h>
21#include <arpa/inet.h>
22#include <netdb.h>
23#include <ifaddrs.h>
qs.xiong9fbf74e2023-03-28 13:38:22 +080024#include "log/log.h"
you.chen70f377f2023-04-14 18:17:09 +080025#include <sys/time.h>
26#include <asm/errno.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050027
qs.xiong1af5daf2022-03-14 09:12:12 -040028#ifdef __cplusplus
29extern "C" {
30#endif
31#ifdef __cplusplus
32}
33#endif
you.chen35020192022-05-06 11:30:57 +080034
qs.xiong9fbf74e2023-03-28 13:38:22 +080035#undef LOG_TAG
36#define LOG_TAG "LYNQ_WIFI"
you.chen35020192022-05-06 11:30:57 +080037#define MAX_CMD 128
38#define MAX_RET 4096
qs.xiongf1b525b2022-03-31 00:58:23 -040039#define MODE_LEN 10
you.chen35020192022-05-06 11:30:57 +080040#define CTRL_STA 0
41#define CTRL_AP 1
42#define AP_NETWORK_0 0
qs.xiongf71b53b2023-05-03 13:12:07 +080043#define STA_MAX_SAVED_AP_NUM 50
you.chen35020192022-05-06 11:30:57 +080044
45pthread_t g_ap_watcher_pid = 0;
46volatile int g_ap_watcher_stop_flag = 0;
you.chena6fa5b22022-05-18 10:28:19 +080047volatile int g_ap_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080048
49pthread_t g_sta_watcher_pid = 0;
50volatile int g_sta_watcher_stop_flag = 0;
you.chen9ac66392022-08-06 17:01:16 +080051volatile int g_sta_scan_finish_flag = 1;
you.chena6fa5b22022-05-18 10:28:19 +080052volatile int g_sta_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080053
54void * g_ap_callback_priv = NULL;
55AP_CALLBACK_FUNC_PTR g_ap_callback_func = NULL;
56void * g_sta_callback_priv = NULL;
57STA_CALLBACK_FUNC_PTR g_sta_callback_func = NULL;
58
59//const char * CTRL_PATH="/var/run/wpa_supplicant";
60const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/ap0"};
61//const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/wlan0"};
62const char * cmd_list_networks = "LIST_NETWORKS";
63const char * cmd_save_config = "SAVE_CONFIG";
you.chen6c2dd9c2022-05-16 17:55:28 +080064const char * cmd_disconnect = "DISCONNECT";
65const char * cmd_remove_all = "REMOVE_NETWORK all";
you.chen35020192022-05-06 11:30:57 +080066const char * state_scan_result = "CTRL-EVENT-SCAN-RESULTS";
you.chen9ac66392022-08-06 17:01:16 +080067const char * STATE_COMPLETED = "COMPLETED";
you.chen35020192022-05-06 11:30:57 +080068
you.chenf711c8a2023-04-13 13:49:45 +080069const char * cmd_ping = "PING";
70const char * rsp_pong = "PONG";
71const int SLEEP_TIME_ON_IDLE = 100 * 1000; // usecond
72const int MAX_IDLE_COUNT = 600; // 60s
73
you.chenc9928582023-04-24 15:39:37 +080074const char * start_wg870_service_script = "/etc/wg870/scripts/start_wg870_service.sh";
75const char * get_interface_name_script = "/etc/wg870/scripts/get_interface_name.sh";
76const char * start_stop_sta_script = "/etc/wg870/scripts/start_stop_sta.sh";
77const char * start_stop_ap_script = "/etc/wg870/scripts/start_stop_ap.sh";
78const char * sta_status_change_script = "/etc/wg870/scripts/sta_status_change.sh";
79
80static char s_ap_iterface_name[64] = {0};
81
you.chend2fef3f2023-02-13 10:50:35 +080082struct local_wpa_ctrl{
83 struct wpa_ctrl *ctrl;
84 pthread_mutex_t mutex;
85};
86
you.chen70f377f2023-04-14 18:17:09 +080087
you.chend2fef3f2023-02-13 10:50:35 +080088static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
89
90static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
you.chen35020192022-05-06 11:30:57 +080091
you.chen0f5c6432022-11-07 18:31:14 +080092//you.chen add for tv-box start
93volatile int g_gbw_enabled = 0;
94char * g_gbw_mac = NULL;
95pthread_t g_gbw_watcher_pid = 0;
96static int startGBW();
97static int stopGBW();
98//you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +080099
100typedef struct __curr_status_info {
101 ap_info_s *ap;
102 char * state;
103 int net_no;
104}curr_status_info;
qs.xiong97fa59b2022-04-07 05:41:29 -0400105
you.chen70f377f2023-04-14 18:17:09 +0800106typedef enum {
107 INNER_STA_STATUS_INIT = 0,
108 INNER_STA_STATUS_CONNECTING,
109 INNER_STA_STATUS_ASSOCIATING,
110 INNER_STA_STATUS_ASSOCIATED,
111 INNER_STA_STATUS_CONNECTED,
112 INNER_STA_STATUS_DISCONNECTING,
113 INNER_STA_STATUS_DISCONNECTED,
114 INNER_STA_STATUS_CANCEL,
115}inner_sta_status_s;
116
117static pthread_cond_t s_global_check_cond = PTHREAD_COND_INITIALIZER;
118static pthread_mutex_t s_global_check_mutex = PTHREAD_MUTEX_INITIALIZER;
119static inner_sta_status_s s_sta_status = INNER_STA_STATUS_INIT;
120static error_number_s s_sta_error_number = -1;
121static char s_sta_current_connecting_ssid[64] = {0};
122static struct timespec s_sta_connect_timeout;
123const int MAX_CONNNECT_TIME = 15; // second
124pthread_t g_global_watcher_pid = 0;
125static int s_service_invoke_timeout_cnt=0;
126const int FAKE_MAX_INT_VALUE = 99999;
127
128static void notify_service_invoke_fail(int error)
129{
130 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
131 pthread_mutex_lock(&s_global_check_mutex);
132 if (error == -2) //timeout
133 {
134 s_service_invoke_timeout_cnt++;
135 if (s_service_invoke_timeout_cnt > 10)
136 {
137 pthread_cond_signal(&s_global_check_cond);
138 }
139 }
140 else if (error == -1)
141 {
142 // check if can connect wpa service
143 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[0]);
144 if (lynq_wpa_ctrl == NULL)
145 {
146 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
147 pthread_cond_signal(&s_global_check_cond);
148 }
149 wpa_ctrl_close(lynq_wpa_ctrl);
150 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[1]);
151 if (lynq_wpa_ctrl == NULL)
152 {
153 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
154 pthread_cond_signal(&s_global_check_cond);
155 }
156 wpa_ctrl_close(lynq_wpa_ctrl);
157 }
158
159 pthread_mutex_unlock(&s_global_check_mutex);
160}
161
you.chenc9928582023-04-24 15:39:37 +0800162static int system_call_v(const char * fmt, ...)
163{
164 char str_cmd[256] = {0};
165 va_list args;
166 va_start(args, fmt);
167 vsprintf(str_cmd, fmt, args);
168 va_end(args);
169 printf("system call----------%s\n", str_cmd);
170 return system(str_cmd);
171}
172
you.chen0df3e7e2023-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.chen70f377f2023-04-14 18:17:09 +0800204static void check_tether_and_notify()
205{
206 RLOGD("check_tether_and_notify called");
you.chen0df3e7e2023-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.chen70f377f2023-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.chend2fef3f2023-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.xiong9fbf74e2023-03-28 13:38:22 +0800223 RLOGE("local_wpa_ctrl_request ctrl is null\n");
you.chend2fef3f2023-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.chen70f377f2023-04-14 18:17:09 +0800229 if (ret != 0)
230 {
231 notify_service_invoke_fail(ret);
232 }
you.chend2fef3f2023-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.xiong9fbf74e2023-03-28 13:38:22 +0800240 RLOGD("inner_get_wpa_ctrl\n");
you.chend2fef3f2023-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.xiong9fbf74e2023-03-28 13:38:22 +0800248 RLOGE("NULL == g_lynq_wpa_ctrl[index]");
you.chend2fef3f2023-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.xiong9fbf74e2023-03-28 13:38:22 +0800254 RLOGE("wpa_ctrl_open fail\n");
you.chend2fef3f2023-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.xiong97fa59b2022-04-07 05:41:29 -0400265#define PRINT_AND_RETURN_VALUE(str,value) \
qs.xiong97fa59b2022-04-07 05:41:29 -0400266{\
you.chen35020192022-05-06 11:30:57 +0800267 perror((str));\
268 return (value);\
qs.xiong97fa59b2022-04-07 05:41:29 -0400269}
270
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +0800274 RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
you.chen35020192022-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.chend2fef3f2023-02-13 10:50:35 +0800282 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
you.chen35020192022-05-06 11:30:57 +0800283 do{ \
you.chend2fef3f2023-02-13 10:50:35 +0800284 lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
285 if (NULL == lynq_wpa_ctrl) return -1; \
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +0800291 RLOGD("to call [%s]\n", cmd_str); \
you.chend2fef3f2023-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.chen35020192022-05-06 11:30:57 +0800293 if (ret != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800294 RLOGE("call "#cmd_str" fail %d\n", ret); \
you.chen35020192022-05-06 11:30:57 +0800295 return ret; \
296 } \
297 cmd_reply[reply_len+1] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800298 RLOGD("cmd replay [ %s ]\n", cmd_reply); \
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +0800304 RLOGE("cmd "#cmd_str" return FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800305 return -1; \
306 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800307 RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800308 return -1; \
309 } \
310 }while (0)
311
312
you.chenf711c8a2023-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.chen70f377f2023-04-14 18:17:09 +0800325 if (ret != 0)
326 {
327 notify_service_invoke_fail(ret);
328 }
you.chenf711c8a2023-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.chen70f377f2023-04-14 18:17:09 +0800360 RLOGE("[wifi error]sta watch thread wpa_ctrl_attach fail");
you.chenf711c8a2023-04-13 13:49:45 +0800361 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
362 *pp_lynq_wpa_ctrl = NULL;
363 *idle_count = 0;
you.chen70f377f2023-04-14 18:17:09 +0800364 notify_service_invoke_fail(-2);
you.chenf711c8a2023-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.chen70f377f2023-04-14 18:17:09 +0800396 notify_service_invoke_fail(ret);
you.chenf711c8a2023-04-13 13:49:45 +0800397 return -1;
398 }
399
400 *idle_count = 0;
401 return 1;
402}
403
you.chen35020192022-05-06 11:30:57 +0800404static void APWatcherThreadProc() {
405 size_t len = MAX_RET;
406 char msg_notify[MAX_RET];
you.chenf711c8a2023-04-13 13:49:45 +0800407 int idle_count = 0;
you.chen35020192022-05-06 11:30:57 +0800408
you.chen6c2dd9c2022-05-16 17:55:28 +0800409 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800410 g_ap_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800411
qs.xiong9fbf74e2023-03-28 13:38:22 +0800412 while (g_ap_watcher_stop_flag == 0)
413 {
you.chenf711c8a2023-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.chen70f377f2023-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.chen35020192022-05-06 11:30:57 +0800421 continue;
422 }
you.chenf711c8a2023-04-13 13:49:45 +0800423
you.chen6c2dd9c2022-05-16 17:55:28 +0800424 memset(msg_notify, 0, MAX_RET);
425 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800426 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
you.chenf711c8a2023-04-13 13:49:45 +0800427 {
you.chen35020192022-05-06 11:30:57 +0800428 msg_notify[len+1] = '\0';
qs.xiong455c30b2023-04-12 11:40:02 +0800429 RLOGD("APWatcherThreadProc ap------> %s\n", msg_notify);
you.chenf711c8a2023-04-13 13:49:45 +0800430 //you.chen change for tv-box start
qs.xiong9fbf74e2023-03-28 13:38:22 +0800431 if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800432 {
you.chen0f5c6432022-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.xiong9fbf74e2023-03-28 13:38:22 +0800435 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800436 {
qs.xiong9fbf74e2023-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.chenf711c8a2023-04-13 13:49:45 +0800439 {
you.chen0f5c6432022-11-07 18:31:14 +0800440 stopGBW();
441 }
442 }
you.chen35020192022-05-06 11:30:57 +0800443 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800444 else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800445 {
you.chen0f5c6432022-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.xiong9fbf74e2023-03-28 13:38:22 +0800448 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800449 {
qs.xiong9fbf74e2023-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.chenf711c8a2023-04-13 13:49:45 +0800452 {
you.chen0f5c6432022-11-07 18:31:14 +0800453 startGBW();
454 }
455 }
you.chen35020192022-05-06 11:30:57 +0800456 }
you.chenf711c8a2023-04-13 13:49:45 +0800457 //you.chen add for tv-box end
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +0800460 if (lynq_wpa_ctrl != NULL)
461 {
you.chen92fd5d32022-05-25 10:09:47 +0800462 wpa_ctrl_detach(lynq_wpa_ctrl);
463 wpa_ctrl_close(lynq_wpa_ctrl);
464 }
qs.xiong97fa59b2022-04-07 05:41:29 -0400465}
466
you.chen70f377f2023-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.xiong455c30b2023-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.chen32cb31e2023-04-13 14:05:45 +0800618 RLOGD("EVENT : %s\n", modify);
qs.xiong455c30b2023-04-12 11:40:02 +0800619 *error = LYNQ_UNSPECIFIED_REASON;
you.chen32cb31e2023-04-13 14:05:45 +0800620 *state = LYNQ_WIFI_STATUS_EGNORE;
qs.xiong455c30b2023-04-12 11:40:02 +0800621 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
622 return;
623
624}
625
you.chen70f377f2023-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.chen35020192022-05-06 11:30:57 +0800636static void STAWatcherThreadProc() {
637 size_t len = MAX_RET;
638 char msg_notify[MAX_RET];
you.chen35020192022-05-06 11:30:57 +0800639 error_number_s error;
you.chenc9928582023-04-24 15:39:37 +0800640 lynq_wifi_sta_status_s state, last_state = -1;
you.chenf711c8a2023-04-13 13:49:45 +0800641 int idle_count = 0;
qs.xiongf1b525b2022-03-31 00:58:23 -0400642
you.chen6c2dd9c2022-05-16 17:55:28 +0800643 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800644 g_sta_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800645
you.chen70f377f2023-04-14 18:17:09 +0800646 RLOGD("STAWatcherThreadProc thread started ------");
qs.xiong9fbf74e2023-03-28 13:38:22 +0800647 while (g_sta_watcher_stop_flag == 0)
648 {
you.chenf711c8a2023-04-13 13:49:45 +0800649 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
qs.xiong455c30b2023-04-12 11:40:02 +0800650 {
you.chen35020192022-05-06 11:30:57 +0800651 continue;
652 }
you.chenf711c8a2023-04-13 13:49:45 +0800653
you.chen6c2dd9c2022-05-16 17:55:28 +0800654 memset(msg_notify, 0, MAX_RET);
655 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800656 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiong455c30b2023-04-12 11:40:02 +0800657 {
you.chen35020192022-05-06 11:30:57 +0800658 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800659 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
660 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800661 {
you.chen35020192022-05-06 11:30:57 +0800662 g_sta_scan_finish_flag = 1;
663 }
664
qs.xiong9fbf74e2023-03-28 13:38:22 +0800665 if (g_sta_callback_func == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800666 {
you.chen35020192022-05-06 11:30:57 +0800667 continue;
668 }
qs.xiong455c30b2023-04-12 11:40:02 +0800669 get_state_error(msg_notify,&state,&error);
you.chen70f377f2023-04-14 18:17:09 +0800670 notify_connect_status(state, error);
671
672 if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
you.chen32cb31e2023-04-13 14:05:45 +0800673 {
you.chen70f377f2023-04-14 18:17:09 +0800674 inner_check_connect_error(msg_notify, state, error);
you.chenc9928582023-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.chen32cb31e2023-04-13 14:05:45 +0800688 }
you.chen35020192022-05-06 11:30:57 +0800689 }
690 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800691 if (lynq_wpa_ctrl != NULL)
692 {
you.chen92fd5d32022-05-25 10:09:47 +0800693 wpa_ctrl_detach(lynq_wpa_ctrl);
694 wpa_ctrl_close(lynq_wpa_ctrl);
695 }
qs.xiongf1b525b2022-03-31 00:58:23 -0400696}
697
you.chen70f377f2023-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.xiong1af5daf2022-03-14 09:12:12 -0400820int lynq_wifi_enable(void)
821{
you.chen35020192022-05-06 11:30:57 +0800822 int ret = 0;
you.chen6c2dd9c2022-05-16 17:55:28 +0800823 int i;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800824 RLOGD("enter lynq_wifi_enable");
you.chend2fef3f2023-02-13 10:50:35 +0800825 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
826
qs.xiong9fbf74e2023-03-28 13:38:22 +0800827 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
828 {
you.chend2fef3f2023-02-13 10:50:35 +0800829 goto out_enable;
830 }
831
you.chenc9928582023-04-24 15:39:37 +0800832 ret = system(start_wg870_service_script);
qs.xiong9fbf74e2023-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.chend2fef3f2023-02-13 10:50:35 +0800837 ret = -1;
838 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800839 }
lhfe8da902022-10-11 18:55:36 +0800840
you.chen70f377f2023-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.chend2fef3f2023-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.chen35020192022-05-06 11:30:57 +0800858 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500859}
860
qs.xiong1af5daf2022-03-14 09:12:12 -0400861int lynq_wifi_disable(void)
862{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800863 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800864 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-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.chend2fef3f2023-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.xiong7a105ce2022-03-02 09:43:11 -0500965}
qs.xiong1af5daf2022-03-14 09:12:12 -0400966
you.chen35020192022-05-06 11:30:57 +0800967static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +0800968 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +0800969 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +0800970 RLOGD("enter inner_get_param");
971 if (out_put == NULL)
972 {
973 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +0800974 return -1;
975 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800976 if (param_name == NULL)
977 {
978 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +0800979 return -1;
980 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800981 if (param_name[0] == '\0')
982 {
983 RLOGE("param is empty");
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +0800993 if (memcmp(cmd_reply, "FAIL", 4) == 0)
994 {
995 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +0800996 return -1;
997 }
998
you.chena6fa5b22022-05-18 10:28:19 +0800999// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +08001000 if (strcmp(param_name, "ssid") == 0)
1001 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001002 if (cmd_reply[0] == '\"')
1003 {
you.chend2fef3f2023-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.xiong9fbf74e2023-03-28 13:38:22 +08001015 else
1016 {
you.chend2fef3f2023-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.chen35020192022-05-06 11:30:57 +08001029 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001030}
qs.xiong1af5daf2022-03-14 09:12:12 -04001031
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001036 while(str < end)
1037 {
1038 if (*str == delimiter)
1039 {
you.chen35020192022-05-06 11:30:57 +08001040 *str++ = '\0';
1041 results[ret++] = str;
1042 continue;
1043 }
1044 str++;
1045 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001046 if (*str == delimiter)
1047 {
you.chen35020192022-05-06 11:30:57 +08001048 *str = '\0';
1049 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001050
you.chen6ed36a62023-04-27 17:51:56 +08001051 results[ret] = NULL;
1052
you.chen35020192022-05-06 11:30:57 +08001053 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001054}
1055
you.chend2fef3f2023-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.chen35020192022-05-06 11:30:57 +08001062 return -1;
you.chend2fef3f2023-02-13 10:50:35 +08001063 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +08001064 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-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.chen35020192022-05-06 11:30:57 +08001070 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001071 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +08001072 return ret;
1073}
1074
you.chend2fef3f2023-02-13 10:50:35 +08001075static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +08001076 struct in_addr addr ={0};
1077 struct hostent *ht;
you.chen186d3c32023-05-18 14:19:46 +08001078 char cmd[64] = {0};
1079 char * p;
1080 int ret;
you.chen35020192022-05-06 11:30:57 +08001081
qs.xiong9fbf74e2023-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.chen35020192022-05-06 11:30:57 +08001086 }
1087
you.chend2fef3f2023-02-13 10:50:35 +08001088 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08001089 if (inet_aton(ip, &addr) == 0)
1090 {
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001097 if (ht == NULL)
1098 {
you.chen186d3c32023-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.xiong9fbf74e2023-03-28 13:38:22 +08001112 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-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.chend2fef3f2023-02-13 10:50:35 +08001127 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +08001128 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001129 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001140 for(index=1; index < count; index++)
1141 {
you.chen35020192022-05-06 11:30:57 +08001142 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001143 if (words_count > 2)
1144 {
you.chend2fef3f2023-02-13 10:50:35 +08001145 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001146 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
1147 {
you.chen35020192022-05-06 11:30:57 +08001148 net_no_list[ret++] = atoi(split_words[0]);
1149 }
1150 }
1151 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001152 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +08001153 return ret;
1154}
1155
1156static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001157 size_t i=0;
you.chen35020192022-05-06 11:30:57 +08001158 CHECK_WPA_CTRL(ap_sta);
1159 const char *lynq_wifi_add_network = "ADD_NETWORK";
1160
qs.xiong9fbf74e2023-03-28 13:38:22 +08001161 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +08001162 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-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.chen35020192022-05-06 11:30:57 +08001166 return -1;
1167 }
1168
qs.xiong9fbf74e2023-03-28 13:38:22 +08001169 for(i=0;i<reply_len;i++)
1170 {
1171 if(cmd_reply[i] == '\n')
1172 {
you.chen35020192022-05-06 11:30:57 +08001173 cmd_reply[i] = '\0';
1174 break;
1175 }
1176 }
1177 return atoi(cmd_reply);
1178}
you.chena6cd55a2022-05-08 12:20:18 +08001179
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001185 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +08001186 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001187 for (index=0; index < count; index++)
1188 {
1189 if (net_no_list[index] == net_no)
1190 {
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001200 while (index < net_no )
1201 {
you.chen35020192022-05-06 11:30:57 +08001202 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001203 if (index >= net_no)
1204 { // required network no created
1205 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +08001206 return 0;
1207 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001208 else if( index < 0)
1209 {
1210 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +08001211 return -1;
1212 }
you.chen35020192022-05-06 11:30:57 +08001213 }
1214
1215 if (index < 0)
qs.xiong9fbf74e2023-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.chen35020192022-05-06 11:30:57 +08001221 return 0;
1222}
1223
1224static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +08001225 if (freq > 5000 && freq < 6000)
1226 {
you.chen35020192022-05-06 11:30:57 +08001227 return LYNQ_WIFI_5G_band;
1228 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001229 else if (freq > 2000 && freq < 3000)
1230 {
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001237 if (key_mgmt != NULL)
1238 {
1239 if (memcmp( key_mgmt, "NONE", 4) == 0)
1240 {
you.chen35020192022-05-06 11:30:57 +08001241 return LYNQ_WIFI_AUTH_OPEN;
1242 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001243 else if (memcmp( key_mgmt, "WEP", 3) == 0)
1244 {
you.chen35020192022-05-06 11:30:57 +08001245 return LYNQ_WIFI_AUTH_WEP;
1246 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001247 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
1248 {
you.chen35020192022-05-06 11:30:57 +08001249 return LYNQ_WIFI_AUTH_WPA_PSK;
1250 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001251 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
1252 {
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001261 if (flag != NULL)
1262 {
qs.xiong3e506812023-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.chen35020192022-05-06 11:30:57 +08001271 return LYNQ_WIFI_AUTH_WPA2_PSK;
1272 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001273 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001274 {
you.chen35020192022-05-06 11:30:57 +08001275 return LYNQ_WIFI_AUTH_WPA_PSK;
1276 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001277 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001278 {
you.chen35020192022-05-06 11:30:57 +08001279 return LYNQ_WIFI_AUTH_WEP;
1280 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001281 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001282 {
you.chen35020192022-05-06 11:30:57 +08001283 return LYNQ_WIFI_AUTH_OPEN;
1284 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001285 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +08001286 {
you.chend2fef3f2023-02-13 10:50:35 +08001287 return LYNQ_WIFI_AUTH_OPEN;
1288 }
you.chen35020192022-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.chen70f377f2023-04-14 18:17:09 +08001315static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth);
you.chen35020192022-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.chend2fef3f2023-02-13 10:50:35 +08001326 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +08001327 char *split_lines[128] = {0};
1328
1329 CHECK_WPA_CTRL(interface);
1330
qs.xiong9fbf74e2023-03-28 13:38:22 +08001331 if (curr_state == NULL)
1332 {
1333 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001343 for(i=0; i < count; i++)
1344 {
1345 if (curr_state->ap != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001346 {
you.chen35020192022-05-06 11:30:57 +08001347 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001348 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001349 {
you.chend2fef3f2023-02-13 10:50:35 +08001350 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +08001351 ret = 0;
1352 continue;
1353 }
you.chenf58b3c92022-06-21 16:53:48 +08001354 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001355 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001356 {
you.chend2fef3f2023-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.chenf58b3c92022-06-21 16:53:48 +08001358 ret = 0;
1359 continue;
1360 }
you.chen35020192022-05-06 11:30:57 +08001361 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001362 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001363 {
you.chen450d0172022-07-15 17:56:48 +08001364 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001365 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +08001366 ret = 0;
1367 continue;
1368 }
1369 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001370 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001371 {
you.chen35020192022-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.chend2fef3f2023-02-13 10:50:35 +08001376 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001377 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001378 {
you.chend2fef3f2023-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.chen35020192022-05-06 11:30:57 +08001383 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001384 if (curr_state->state != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001385 {
you.chen35020192022-05-06 11:30:57 +08001386 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001387 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001388 {
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001395 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
you.chen70f377f2023-04-14 18:17:09 +08001396 {
you.chen35020192022-05-06 11:30:57 +08001397 ret = 0;
you.chen450d0172022-07-15 17:56:48 +08001398 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001399 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +08001400 }
1401 }
1402
you.chen70f377f2023-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.chen35020192022-05-06 11:30:57 +08001408 return ret;
1409}
1410
qs.xiongf1b525b2022-03-31 00:58:23 -04001411int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001412{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001413 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +08001414 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -05001415
qs.xiong9fbf74e2023-03-28 13:38:22 +08001416 if (ap_ssid == NULL)
1417 {
1418 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +08001419 return -1;
1420 }
qs.xiong9fbf74e2023-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.chen35020192022-05-06 11:30:57 +08001424 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001425
qs.xiong9fbf74e2023-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.chen35020192022-05-06 11:30:57 +08001429 return -1;
1430 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001431
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001440 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1441 return 0;
you.chen35020192022-05-06 11:30:57 +08001442
qs.xiong7a105ce2022-03-02 09:43:11 -05001443}
1444
you.chen35020192022-05-06 11:30:57 +08001445int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001446{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001447 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001448 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001449 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001450}
1451
qs.xiongc9c79f72022-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.xiongc00b6032022-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.xiong69a332b2022-12-02 09:58:57 +08001467 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001468 {
1469 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001470 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001471 }
qs.xiongc00b6032022-11-29 16:28:03 +08001472
1473 if(i == arr_len)
1474 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001475 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001476 return -1;
1477 }
qs.xiongc00b6032022-11-29 16:28:03 +08001478
qs.xiongc9c79f72022-10-17 15:27:18 +08001479 return 0;
1480}
qs.xiong13673462023-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.xiong9fbf74e2023-03-28 13:38:22 +08001489 RLOGE("get country_code error\n");
qs.xiong13673462023-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.xiong9fbf74e2023-03-28 13:38:22 +08001497 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001498 return -1;
1499 }
1500 return 0;
1501}
qs.xiongf1b525b2022-03-31 00:58:23 -04001502int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001503{
qs.xiongc00b6032022-11-29 16:28:03 +08001504 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001505 char lynq_wifi_frequency_cmd[128]={0};
1506 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001507 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001508 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001509 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001510 check = lynq_check_set_frequency(lynq_wifi_frequency);
1511 if(check != 0)
1512 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001513 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001514 return -1;
you.chen35020192022-05-06 11:30:57 +08001515 }
qs.xiong13673462023-02-21 19:12:54 +08001516 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1517 if(check != 0)
1518 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001519 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001520 return -1;
1521 }
1522
qs.xiongc00b6032022-11-29 16:28:03 +08001523 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1524 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001525 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001526 return -1;
1527 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001528
you.chen35020192022-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.chen6c2dd9c2022-05-16 17:55:28 +08001537 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-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.xiong7a105ce2022-03-02 09:43:11 -05001541
qs.xiong9fbf74e2023-03-28 13:38:22 +08001542 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001543}
1544
qs.xiongf1b525b2022-03-31 00:58:23 -04001545int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001546{
you.chen35020192022-05-06 11:30:57 +08001547 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001548 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001549 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001550
qs.xiong9fbf74e2023-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.chen35020192022-05-06 11:30:57 +08001554 return -1;
1555 }
1556 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001557
qs.xiong9fbf74e2023-03-28 13:38:22 +08001558 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001559}
1560
qs.xiongf1b525b2022-03-31 00:58:23 -04001561int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1562{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001563 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001564 CHECK_IDX(idx, CTRL_AP);
1565 switch(bandwidth){
qs.xiong9fbf74e2023-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.chen35020192022-05-06 11:30:57 +08001572 {
1573 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1574 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001575 if (system(lynq_cmd_bandwith) != 0 )
1576 {
1577 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001578 return -1;
1579 }
1580 system("wl up");
1581 break;
1582 }
1583 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001584 {
qs.xiong10379192023-02-21 13:19:42 +08001585 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001586 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1587 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001588 if (system(lynq_cmd_bandwith) != 0 )
1589 {
1590 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001591 return -1;
1592 }
1593 system("wl up");
1594 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001595 }
you.chen35020192022-05-06 11:30:57 +08001596 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001597 {
qs.xiong10379192023-02-21 13:19:42 +08001598 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001599 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001600 if (system(lynq_cmd_bandwith) != 0 )
1601 {
1602 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001603 return -1;
1604 }
1605 system("wl up");
1606 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001607 }
1608 default:
you.chen35020192022-05-06 11:30:57 +08001609 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001610 RLOGE("auth type [%d] not support now\n", bandwidth);
1611 return -1;
you.chen35020192022-05-06 11:30:57 +08001612 }
1613 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001614
1615
you.chen35020192022-05-06 11:30:57 +08001616 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001617}
you.chen35020192022-05-06 11:30:57 +08001618
qs.xiongf1b525b2022-03-31 00:58:23 -04001619int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1620{
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001625 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001626 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001627
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001643 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001644 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1645 return 0;
1646 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001647 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001648 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001649}
qs.xiong0fb469a2022-04-14 03:50:45 -04001650
qs.xiongf1b525b2022-03-31 00:58:23 -04001651int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001652{
you.chen35020192022-05-06 11:30:57 +08001653 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001654 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001655 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001656
you.chen35020192022-05-06 11:30:57 +08001657 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001658
qs.xiong9fbf74e2023-03-28 13:38:22 +08001659 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1660 {
you.chen35020192022-05-06 11:30:57 +08001661 return -1;
1662 }
1663
1664 system("wl down");
1665 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001666 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001667 return -1;
1668 }
1669 system("wl up");
1670 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001671}
qs.xiong0fb469a2022-04-14 03:50:45 -04001672
qs.xiongf1b525b2022-03-31 00:58:23 -04001673int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001674{
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001679 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001680 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001681
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001687 for(;index < count; index++)
1688 {
1689 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001690 if (strncmp(split_words[index], "channel", 2) != 0) {
1691 continue;
1692 }
1693
1694 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001695 if (index >= count)
1696 {
you.chen35020192022-05-06 11:30:57 +08001697 return -1;
1698 }
1699
1700 *channel = atoi(split_words[index]);
1701 return 0;
1702 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001703 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001704 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001705}
1706
1707
you.chen35020192022-05-06 11:30:57 +08001708int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001709{
you.chen6c2dd9c2022-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.xiong9fbf74e2023-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.chen6c2dd9c2022-05-16 17:55:28 +08001718 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001719 CHECK_IDX(idx, CTRL_AP);
1720
you.chen6c2dd9c2022-05-16 17:55:28 +08001721 CHECK_WPA_CTRL(CTRL_AP);
1722
qs.xiong9fbf74e2023-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.chen35020192022-05-06 11:30:57 +08001726 return -1;
1727 }
1728
you.chen92fd5d32022-05-25 10:09:47 +08001729 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001730 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001731 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-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.chen35020192022-05-06 11:30:57 +08001750
qs.xiong9fbf74e2023-03-28 13:38:22 +08001751 switch(auth){
1752 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001753 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001754 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001755 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001756 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001757 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001758 break;
1759 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001760 case LYNQ_WIFI_AUTH_WEP:
1761 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001762 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001763 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001764 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-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.xiong9fbf74e2023-03-28 13:38:22 +08001771 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-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.chen35020192022-05-06 11:30:57 +08001783 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001784 {
1785 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1786 {
you.chen35020192022-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.xiong9fbf74e2023-03-28 13:38:22 +08001790 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1791 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001792 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001793 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-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.xiong7a105ce2022-03-02 09:43:11 -05001798
you.chen35020192022-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.xiong9fbf74e2023-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.xiong3e506812023-04-06 11:08:48 +08001821 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-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.chen35020192022-05-06 11:30:57 +08001831 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001832 RLOGE("auth type [%d] not support now\n", auth);
1833 return -1;
you.chen35020192022-05-06 11:30:57 +08001834 }
1835 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001836 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001837
qs.xiong9fbf74e2023-03-28 13:38:22 +08001838 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001839}
1840
you.chen35020192022-05-06 11:30:57 +08001841int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001842{
you.chen35020192022-05-06 11:30:57 +08001843 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001844 char lynq_auth_alg_str[MAX_RET] = {0};
1845 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001846 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001847 CHECK_IDX(idx, CTRL_AP);
1848
qs.xiong9fbf74e2023-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.chen35020192022-05-06 11:30:57 +08001852 return -1;
1853 }
1854
qs.xiong9fbf74e2023-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.xiongc8d92a62023-03-29 17:36:14 +08001859 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001860 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001861 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001862 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001863 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1864 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001865 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001866 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001867 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001868 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001869 else
1870 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001871 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001872 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001873 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001874 }
you.chen35020192022-05-06 11:30:57 +08001875 }
qs.xiong9fbf74e2023-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.xiongc8d92a62023-03-29 17:36:14 +08001880 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001881 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001882 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001883 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1884 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001885 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001886 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001887 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001888 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001889 else
1890 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001891 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001892 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001893 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001894 }
you.chen35020192022-05-06 11:30:57 +08001895 }
qs.xiong9fbf74e2023-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.xiongc8d92a62023-03-29 17:36:14 +08001907 return 0;
qs.xiong9fbf74e2023-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.xiongc8d92a62023-03-29 17:36:14 +08001912 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001913 }
1914 else
1915 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001916 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001917 *auth = -1;
1918 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001919
you.chen6c2dd9c2022-05-16 17:55:28 +08001920 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001921}
qs.xiong1af5daf2022-03-14 09:12:12 -04001922
you.chenb95401e2023-05-12 19:39:06 +08001923static int inner_check_ap_connected(lynq_wifi_index_e idx, int retry_count)
1924{
1925 char status[64];
you.chencba13492023-05-19 13:53:43 +08001926 char LYNQ_WIFI_CMD[32]={0};
you.chenb95401e2023-05-12 19:39:06 +08001927 curr_status_info curr_state;
1928
1929 CHECK_WPA_CTRL(CTRL_AP);
1930
1931 memset(status, 0, sizeof (status));
1932
1933 curr_state.ap = NULL;
1934 curr_state.state = status;
1935
1936 printf("inner_check_ap_connected %d\n", retry_count);
1937 usleep(500*1000);
1938 if (0 == inner_get_status_info(idx, &curr_state))
1939 {
1940 if (strcmp(status, STATE_COMPLETED) == 0)
1941 {
1942 return 0;
1943 }
1944 else if (retry_count == 4) //not ok in 2s, do reconnect
1945 {
1946 DO_REQUEST("RECONNECT");
1947 return inner_check_ap_connected(idx, retry_count+1);
1948 }
you.chencba13492023-05-19 13:53:43 +08001949 else if (retry_count > 20)
you.chenb95401e2023-05-12 19:39:06 +08001950 {
1951 printf("retry 10 time\n");
1952 return -1;
1953 }
1954 else
1955 {
you.chencba13492023-05-19 13:53:43 +08001956 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1957 DO_REQUEST(LYNQ_WIFI_CMD);
you.chenb95401e2023-05-12 19:39:06 +08001958 return inner_check_ap_connected(idx, retry_count+1);
1959 }
1960 }
1961 return -1;
1962}
qs.xiong1af5daf2022-03-14 09:12:12 -04001963
qs.xiongf1b525b2022-03-31 00:58:23 -04001964int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001965{
you.chen35020192022-05-06 11:30:57 +08001966 char LYNQ_WIFI_CMD[128]={0};
1967 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1968 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001969 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001970 CHECK_IDX(idx, CTRL_AP);
1971
1972 CHECK_WPA_CTRL(CTRL_AP);
1973
you.chen0df3e7e2023-05-10 15:56:26 +08001974 if (inner_get_ap_interface_name() == NULL)
you.chenc9928582023-04-24 15:39:37 +08001975 {
you.chen0df3e7e2023-05-10 15:56:26 +08001976 RLOGE("lynq_wifi_ap_start get ap name fail");
you.chenc9928582023-04-24 15:39:37 +08001977 return -1;
1978 }
you.chen35020192022-05-06 11:30:57 +08001979
1980 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1981 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1982
1983 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1984 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1985
you.chenc9928582023-04-24 15:39:37 +08001986 ret = system_call_v("%s %s", start_stop_ap_script, "start");
1987 if (ret != 0)
1988 {
1989 RLOGE("lynq_wifi_ap_start excute script fail");
1990 return -1;
1991 }
1992
you.chenb95401e2023-05-12 19:39:06 +08001993 if (inner_check_ap_connected(idx, 0) != 0)
1994 {
1995 return -1;
1996 }
1997
you.chen0df3e7e2023-05-10 15:56:26 +08001998 check_tether_and_notify();
1999
qs.xiong9fbf74e2023-03-28 13:38:22 +08002000 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002001}
2002
qs.xiongf1b525b2022-03-31 00:58:23 -04002003int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002004{
you.chen35020192022-05-06 11:30:57 +08002005 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05002006}
2007
qs.xiongf1b525b2022-03-31 00:58:23 -04002008int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002009{
you.chen35020192022-05-06 11:30:57 +08002010 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04002011
you.chen35020192022-05-06 11:30:57 +08002012 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002013
you.chen35020192022-05-06 11:30:57 +08002014 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002015
you.chen35020192022-05-06 11:30:57 +08002016 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
2017
2018 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
2019
you.chenb4b121c2022-05-06 17:50:16 +08002020// system("connmanctl tether wifi off");
you.chenc9928582023-04-24 15:39:37 +08002021
2022 ret = system_call_v("%s %s", start_stop_ap_script, "stop");
2023 if (ret != 0)
2024 {
2025 RLOGE("lynq_wifi_ap_start excute script fail");
2026 return -1;
2027 }
2028
qs.xiong9fbf74e2023-03-28 13:38:22 +08002029 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002030}
qs.xiong1af5daf2022-03-14 09:12:12 -04002031
qs.xiongf1b525b2022-03-31 00:58:23 -04002032int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002033{
you.chen35020192022-05-06 11:30:57 +08002034 char lynq_disable_cmd[128] = {0};
2035 char lynq_select_cmd[128] = {0};
2036 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08002037 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08002038 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05002039
you.chen35020192022-05-06 11:30:57 +08002040 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08002041 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2042 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2043
2044 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2045 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
2046 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04002047
qs.xiong9fbf74e2023-03-28 13:38:22 +08002048 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002049}
2050
qs.xiongf1b525b2022-03-31 00:58:23 -04002051int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002052{
you.chen35020192022-05-06 11:30:57 +08002053 char lynq_disable_cmd[128] = {0};
2054 char lynq_select_cmd[128] = {0};
2055 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08002056 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08002057 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05002058
you.chen35020192022-05-06 11:30:57 +08002059 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002060
you.chen35020192022-05-06 11:30:57 +08002061 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2062 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2063
2064 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2065 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
2066 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05002067
qs.xiong9fbf74e2023-03-28 13:38:22 +08002068 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002069}
qs.xiongf1b525b2022-03-31 00:58:23 -04002070
you.chen35020192022-05-06 11:30:57 +08002071int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002072{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002073 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08002074 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002075 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08002076 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002077 RLOGD("enter lynq_ap_password_set");
2078 if( password == NULL )
2079 {
2080 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08002081 return -1;
2082 }
2083 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08002084 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002085 if(pass_len < 8 || pass_len >= 64)
2086 {
2087 RLOGE("[lynq_ap_password_set]input password len not in rage");
2088 return -1;
you.chen35020192022-05-06 11:30:57 +08002089 }
qs.xiongf1b525b2022-03-31 00:58:23 -04002090
you.chen35020192022-05-06 11:30:57 +08002091 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002092
qs.xiong9fbf74e2023-03-28 13:38:22 +08002093 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
2094 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002095 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002096 return -1;
2097 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002098 else if (auth == LYNQ_WIFI_AUTH_OPEN)
2099 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002100 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
2101 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08002102 }
2103
you.chen35020192022-05-06 11:30:57 +08002104 CHECK_WPA_CTRL(CTRL_AP);
2105
qs.xiong9fbf74e2023-03-28 13:38:22 +08002106 if (auth == LYNQ_WIFI_AUTH_WEP)
2107 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002108 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002109 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
2110 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
2111 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2112 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
2113 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002114 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2115 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002116 RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA_PSK LYNQ_WIFI_AUTH_WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002117 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
2118 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2119 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002120 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
2121 {
2122
qs.xiongc8d92a62023-03-29 17:36:14 +08002123 RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA2_WPA3 LYNQ_WIFI_AUTH_WPA3_PSK\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002124 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08002125 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002126 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2127 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
2128
2129 }
2130 else
qs.xiongc8d92a62023-03-29 17:36:14 +08002131 {
2132 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002133 return -1;
2134 }
you.chen35020192022-05-06 11:30:57 +08002135
you.chen35020192022-05-06 11:30:57 +08002136 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04002137
qs.xiong9fbf74e2023-03-28 13:38:22 +08002138 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04002139}
2140
you.chen35020192022-05-06 11:30:57 +08002141int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04002142{
you.chen35020192022-05-06 11:30:57 +08002143 FILE * fp;
2144 int len, ret;
2145 int count, index;
2146 char *split_lines[128] = {0};
2147 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002148 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04002149
you.chen35020192022-05-06 11:30:57 +08002150 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002151
you.chen35020192022-05-06 11:30:57 +08002152 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
2153// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002154 if (NULL == fp)
2155 {
2156 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002157 return -1;
2158 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002159
you.chen35020192022-05-06 11:30:57 +08002160 buff = alloca(MAX_RET);
2161 fseek(fp, 0, SEEK_SET);
2162 len = fread(buff, 1, MAX_RET, fp);
2163 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04002164
qs.xiong9fbf74e2023-03-28 13:38:22 +08002165 for(index=0; index < len; index ++)
2166 {
2167 if (memcmp(buff + index, "network={", 9) != 0)
2168 {
you.chen35020192022-05-06 11:30:57 +08002169 continue;
2170 }
2171 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002172 for (; index < len; index ++ )
2173 {
2174 if (buff[index] != '}')
2175 {
you.chen35020192022-05-06 11:30:57 +08002176 continue;
2177 }
2178 buff[index] = '\0';
2179 break;
2180 }
2181 len = buff + index - p;
2182 }
2183
2184 count = lynq_split(p, len, '\n', split_lines);
2185
2186 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002187 for(index=0; index < count; index++)
2188 {
you.chen35020192022-05-06 11:30:57 +08002189 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002190 if (p != NULL)
2191 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002192 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002193 if (*p == '\"')
2194 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002195 p++;
2196 }
you.chen35020192022-05-06 11:30:57 +08002197 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002198 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2199 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002200 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002201 if (*p == '\"')
2202 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002203 p++;
2204 }
2205 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002206 else
2207 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002208 continue;
you.chen35020192022-05-06 11:30:57 +08002209 }
2210
2211 strcpy(password, p);
2212
qs.xiong9fbf74e2023-03-28 13:38:22 +08002213 while(*password != '\0')
2214 {
2215 if (*password == '\"')
2216 {
you.chen35020192022-05-06 11:30:57 +08002217 *password = '\0';
2218 break;
2219 }
2220 password++;
2221 }
2222 ret = 0;
2223 break;
2224 } //end for(index=0; index < count; index++)
2225
2226 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002227}
2228
you.chen35020192022-05-06 11:30:57 +08002229static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
2230 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08002231 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002232
qs.xiong9fbf74e2023-03-28 13:38:22 +08002233 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
2234 {
you.chen35020192022-05-06 11:30:57 +08002235 return -1;
2236 }
2237
2238 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08002239
qs.xiong9fbf74e2023-03-28 13:38:22 +08002240 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
2241 {
2242 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
you.chen70f377f2023-04-14 18:17:09 +08002243 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002244 if (strcmp(lynq_proto_str, "RSN") == 0)
you.chen70f377f2023-04-14 18:17:09 +08002245 {
you.chena6cd55a2022-05-08 12:20:18 +08002246 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002247 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08002248 }
you.chen70f377f2023-04-14 18:17:09 +08002249 else if (strcmp(lynq_proto_str, "WPA") == 0) // need compare when wpa3 supported
2250 {
2251 return 0;
2252 }
you.chena6cd55a2022-05-08 12:20:18 +08002253 }
2254 }
you.chen70f377f2023-04-14 18:17:09 +08002255 else if (*auth == LYNQ_WIFI_AUTH_OPEN || *auth == LYNQ_WIFI_AUTH_WEP)
2256 {
2257 return 0;
2258 }
2259
qs.xiong9fbf74e2023-03-28 13:38:22 +08002260 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
2261 {
you.chen70f377f2023-04-14 18:17:09 +08002262 RLOGE("check ieee80211w error\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002263 return -1;
2264 }
2265 if ( strncmp(lynq_auth_str,"1",1) == 0 )
2266 {
2267
you.chen70f377f2023-04-14 18:17:09 +08002268 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
2269 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002270 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
2271 {
2272
2273 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002274 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002275 }else
2276 {
you.chen70f377f2023-04-14 18:17:09 +08002277 RLOGE("check ieee80211w error, not 1 or 2\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002278 *auth = -1;
2279 return -1;
2280 }
you.chen35020192022-05-06 11:30:57 +08002281 return 0;
2282}
2283
2284int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002285{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002286 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002287 int pass_len, net_no, count, index;
2288 char lynq_tmp_cmd[300]={0};
2289 int net_no_list[128];
2290 lynq_wifi_auth_s net_auth;
2291 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002292 if(pass_len < 8 || pass_len >= 64)
2293 {
2294 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08002295 return -1;
2296 }
2297
2298 CHECK_IDX(idx, CTRL_STA);
2299
2300 net_no = -1;
2301 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
2302
qs.xiong9fbf74e2023-03-28 13:38:22 +08002303 for (index=0; index < count; index++)
2304 {
you.chen35020192022-05-06 11:30:57 +08002305 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002306 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
2307 {
you.chen35020192022-05-06 11:30:57 +08002308 net_no = net_no_list[index];
2309 break;
2310 }
2311 }
2312
qs.xiong9fbf74e2023-03-28 13:38:22 +08002313 if (net_no < 0)
2314 {
you.chen35020192022-05-06 11:30:57 +08002315 return -1;
2316 }
2317
2318 CHECK_WPA_CTRL(CTRL_STA);
2319
2320 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
2321
2322 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2323 DO_OK_FAIL_REQUEST(cmd_save_config);
2324
2325 return 0;
2326}
2327
2328int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
2329
2330 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08002331 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08002332 int count, index;
2333 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08002334 char *buff, *p, *ssid, *ssid_end_flag;
2335 char tmp_ssid[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002336 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08002337
you.chen755332b2022-08-06 16:59:10 +08002338 network_len = 0;
2339 p = NULL;
2340
you.chen35020192022-05-06 11:30:57 +08002341 CHECK_IDX(idx, CTRL_STA);
2342
qs.xiong9fbf74e2023-03-28 13:38:22 +08002343 if (NULL == password)
2344 {
2345 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08002346 return -1;
2347 }
2348
you.chen35020192022-05-06 11:30:57 +08002349 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002350 if (NULL == fp)
2351 {
2352 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002353 return -1;
2354 }
2355
2356 buff = alloca(MAX_RET);
2357 fseek(fp, 0, SEEK_SET);
2358 len = fread(buff, 1, MAX_RET, fp);
2359 fclose(fp);
2360
qs.xiong9fbf74e2023-03-28 13:38:22 +08002361 for(index=0; index < len; index ++)
2362 {
2363 for(; index < len; index ++)
2364 {
2365 if (memcmp(buff + index, "network={", 9) != 0)
2366 {
you.chen35020192022-05-06 11:30:57 +08002367 continue;
2368 }
2369 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002370 for (; index < len; index ++ )
2371 {
2372 if (buff[index] != '}')
2373 {
you.chen35020192022-05-06 11:30:57 +08002374 continue;
2375 }
2376 buff[index] = '\0';
2377 break;
2378 }
you.chen755332b2022-08-06 16:59:10 +08002379 network_len = buff + index - p;
2380 break;
you.chen35020192022-05-06 11:30:57 +08002381 }
2382
qs.xiongb3f26af2023-02-17 18:41:07 +08002383 if (p == NULL)
2384 return -1;
2385
you.chend2fef3f2023-02-13 10:50:35 +08002386 ssid = strstr(p, "ssid=");
2387 if (ssid != NULL) {
2388 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002389 if (ssid[0] == '\"')
2390 {
you.chend2fef3f2023-02-13 10:50:35 +08002391 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2392 break;
2393 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002394 else
2395 {
you.chend2fef3f2023-02-13 10:50:35 +08002396 ssid_end_flag = strstr(ssid, "\n");
2397 if (ssid_end_flag != NULL)
2398 {
2399 ssid_len = (ssid_end_flag - ssid) / 2;
2400 for(i=0; i<ssid_len; i++)
2401 {
2402 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2403 }
2404 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2405 break;
2406 }
2407 }
you.chen35020192022-05-06 11:30:57 +08002408 }
you.chend2fef3f2023-02-13 10:50:35 +08002409
you.chen35020192022-05-06 11:30:57 +08002410 }
2411
qs.xiong9fbf74e2023-03-28 13:38:22 +08002412 if (index >= len || NULL == p || network_len <= 0)
2413 {
you.chen35020192022-05-06 11:30:57 +08002414 return -1;
2415 }
2416
you.chen755332b2022-08-06 16:59:10 +08002417 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08002418
2419 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002420 for(index=0; index < count; index++)
2421 {
you.chen35020192022-05-06 11:30:57 +08002422 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002423 if (p != NULL)
2424 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002425 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002426 if (*p == '\"')
2427 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002428 p++;
2429 }
you.chen35020192022-05-06 11:30:57 +08002430 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002431 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2432 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002433 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002434 if (*p == '\"')
2435 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002436 p++;
2437 }
2438 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002439 else
2440 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002441 continue;
you.chen35020192022-05-06 11:30:57 +08002442 }
2443
qs.xiong13673462023-02-21 19:12:54 +08002444 if (*p == '\"')
2445 p++;
2446 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08002447
qs.xiong13673462023-02-21 19:12:54 +08002448 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002449 while(password - p < 64 && *password != '\0')
2450 {
2451 if (*password == '\"')
2452 {
you.chen35020192022-05-06 11:30:57 +08002453 *password = '\0';
2454 break;
2455 }
2456 password++;
2457 }
2458 ret = 0;
2459 break;
2460 } //end for(index=0; index < count; index++)
2461
2462 return ret;
2463}
2464
2465static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2466{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002467 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04002468
qs.xiong9fbf74e2023-03-28 13:38:22 +08002469 if (sta_ssid == NULL)
2470 {
2471 RLOGE("sta_ssid is null\n");
2472 return -1;
you.chen35020192022-05-06 11:30:57 +08002473 }
2474
qs.xiong9fbf74e2023-03-28 13:38:22 +08002475 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002476
2477 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2478
2479 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2480// DO_OK_FAIL_REQUEST(cmd_save_config);
2481
qs.xiong9fbf74e2023-03-28 13:38:22 +08002482 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002483
2484}
2485
you.chen35020192022-05-06 11:30:57 +08002486static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05002487{
you.chen35020192022-05-06 11:30:57 +08002488 char lynq_disable_cmd[128]={0};
2489 char lynq_select_cmd[128]={0};
2490
2491 CHECK_WPA_CTRL(CTRL_STA);
2492
qs.xiong9fbf74e2023-03-28 13:38:22 +08002493 if (save != 0)
2494 {
you.chenc29444e2022-06-07 18:01:16 +08002495 if (start_flag != 0)
2496 {
2497 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2498 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2499 }
2500 else
2501 {
2502 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2503 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2504 }
you.chen35020192022-05-06 11:30:57 +08002505 DO_OK_FAIL_REQUEST(cmd_save_config);
2506 }
2507
qs.xiong9fbf74e2023-03-28 13:38:22 +08002508 if (start_flag == 0)
2509 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002510 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002511 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2512 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002513 else
2514 {
you.chen35020192022-05-06 11:30:57 +08002515 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2516 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2517 }
2518
2519 return 0;
2520}
2521
2522int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2523{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002524 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002525 CHECK_IDX(idx, CTRL_STA);
2526
you.chen6c2dd9c2022-05-16 17:55:28 +08002527 curr_status_info curr_state;
2528 ap_info_s ap_info;
2529 curr_state.ap = &ap_info;
2530 curr_state.state = NULL;
2531
qs.xiong9fbf74e2023-03-28 13:38:22 +08002532 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2533 {
you.chend2fef3f2023-02-13 10:50:35 +08002534 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002535 return 0;
2536 }
2537
2538 return -1;
you.chen35020192022-05-06 11:30:57 +08002539}
2540
2541int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2542{
you.chen9ac66392022-08-06 17:01:16 +08002543 scan_info_s *scan_list = NULL;
2544 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002545 int scan_len=0;
2546 int save_len=0;
2547 int best_index = -1;
2548 int best_scan_index = -1;
2549 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002550 int i, j, ret;
2551
2552 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002553
2554 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002555 if (info == NULL)
2556 {
you.chen35020192022-05-06 11:30:57 +08002557 return -1;
2558 }
2559
2560 curr_status_info curr_state;
2561 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002562 char status[64];
you.chen35020192022-05-06 11:30:57 +08002563
you.chen9ac66392022-08-06 17:01:16 +08002564 memset(&ap_info, 0, sizeof (ap_info));
2565 memset(status, 0, sizeof (status));
2566
2567 curr_state.ap = &ap_info;
2568 curr_state.state = status;
2569
qs.xiong9fbf74e2023-03-28 13:38:22 +08002570 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2571 {
you.chen35020192022-05-06 11:30:57 +08002572 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002573 if (strcmp(status, STATE_COMPLETED) == 0)
2574 {
2575 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2576 }
2577 else
2578 {
2579 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2580 }
you.chen593621d2023-04-27 17:52:44 +08002581 lynq_get_connect_ap_ip(idx, info->base_info.ap_ip);
you.chen35020192022-05-06 11:30:57 +08002582 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002583 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002584 return 0;
2585 }
2586
you.chen9ac66392022-08-06 17:01:16 +08002587 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002588 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002589 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2590 {
you.chen9ac66392022-08-06 17:01:16 +08002591 if (NULL != scan_list)
2592 {
2593 free(scan_list);
2594 }
you.chen35020192022-05-06 11:30:57 +08002595 return -1;
2596 }
2597
qs.xiong9fbf74e2023-03-28 13:38:22 +08002598 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2599 {
you.chen9ac66392022-08-06 17:01:16 +08002600 if (NULL != scan_list)
2601 {
2602 free(scan_list);
2603 }
2604 if (NULL != save_list)
2605 {
2606 free(save_list);
2607 }
you.chen35020192022-05-06 11:30:57 +08002608 return -1;
2609 }
2610
qs.xiong9fbf74e2023-03-28 13:38:22 +08002611 for (i=0; i < save_len; i++)
2612 {
2613 for (j=0; j < scan_len; j++)
2614 {
you.chen35020192022-05-06 11:30:57 +08002615 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002616 && save_list[i].base_info.auth == scan_list[j].auth)
2617 {
2618 if (best_rssi == 0)
2619 {
you.chen9ac66392022-08-06 17:01:16 +08002620 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002621 best_rssi = scan_list[j].rssi;
2622 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002623 else if (best_rssi > scan_list[j].rssi)
2624 {
you.chen35020192022-05-06 11:30:57 +08002625 best_index = i;
2626 best_scan_index = j;
2627 best_rssi = scan_list[j].rssi;
2628 }
you.chend2fef3f2023-02-13 10:50:35 +08002629 strncpy(save_list[i].base_info.ap_mac, scan_list[j].mac, sizeof (save_list[i].base_info.ap_mac));
you.chen35020192022-05-06 11:30:57 +08002630 break;
2631 }
2632 }
2633 }
2634
qs.xiong9fbf74e2023-03-28 13:38:22 +08002635 if (best_index >= 0)
2636 {
you.chen35020192022-05-06 11:30:57 +08002637 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002638 inner_get_ip_by_mac( info->base_info.ap_mac, info->base_info.ap_ip, sizeof (info->base_info.ap_ip));
you.chen35020192022-05-06 11:30:57 +08002639 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2640 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002641 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002642 }
2643
you.chen9ac66392022-08-06 17:01:16 +08002644 if (NULL != scan_list)
2645 {
2646 free(scan_list);
2647 }
2648 if (NULL != save_list)
2649 {
2650 free(save_list);
2651 }
2652
2653 return ret;
you.chen35020192022-05-06 11:30:57 +08002654}
2655
2656static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2657{
qs.xiongc8d92a62023-03-29 17:36:14 +08002658 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002659 char lynq_ket_mgmt_cmd[64]={0};
2660 char lynq_pairwise_cmd[64]={0};
2661 char lynq_psk_cmd[64]={0};
2662
2663 CHECK_WPA_CTRL(CTRL_STA);
2664
qs.xiong9fbf74e2023-03-28 13:38:22 +08002665 switch(auth)
2666 {
2667 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002668 {
2669 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002670
you.chen35020192022-05-06 11:30:57 +08002671 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002672// DO_OK_FAIL_REQUEST(cmd_save_config);
2673 break;
2674 }
2675 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002676 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002677 {
2678 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2679 {
you.chen35020192022-05-06 11:30:57 +08002680 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2681 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002682 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2683 {
you.chena6cd55a2022-05-08 12:20:18 +08002684 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002685 }
2686 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2687 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002688
you.chen35020192022-05-06 11:30:57 +08002689 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2690 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2691 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002692
qs.xiong9fbf74e2023-03-28 13:38:22 +08002693 if (password != NULL)
2694 {
you.chen35020192022-05-06 11:30:57 +08002695 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2696 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002697 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002698 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002699
you.chen35020192022-05-06 11:30:57 +08002700// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002701 break;
2702 }
2703 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2704 {
qs.xiong3e506812023-04-06 11:08:48 +08002705 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002706 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002707 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2708 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2709
qs.xiong3e506812023-04-06 11:08:48 +08002710 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002711 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2712 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2713 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2714
2715 break;
2716 }
2717 case LYNQ_WIFI_AUTH_WPA3_PSK:
2718 {
qs.xiong3e506812023-04-06 11:08:48 +08002719 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiong03556d52023-04-17 09:45:19 +08002720 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002721 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2722 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2723
qs.xiong3e506812023-04-06 11:08:48 +08002724 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002725 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2726 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2727 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2728
2729 break;
2730 }
2731 default:
2732 return -1;
you.chen35020192022-05-06 11:30:57 +08002733 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002734
qs.xiong9fbf74e2023-03-28 13:38:22 +08002735 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002736}
qs.xiong7a105ce2022-03-02 09:43:11 -05002737
you.chen35020192022-05-06 11:30:57 +08002738static int inner_get_curr_net_no(int interface) {
2739 curr_status_info curr_state;
2740 curr_state.ap = NULL;
2741 curr_state.state = NULL;
2742
qs.xiong9fbf74e2023-03-28 13:38:22 +08002743 if (0 != inner_get_status_info(interface, &curr_state))
2744 {
you.chen35020192022-05-06 11:30:57 +08002745 return -1;
2746 }
2747
2748 return curr_state.net_no;
2749}
2750
2751int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002752{
you.chen35020192022-05-06 11:30:57 +08002753 int net_no;
2754 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002755
you.chen35020192022-05-06 11:30:57 +08002756 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002757
qs.xiong9fbf74e2023-03-28 13:38:22 +08002758 if (net_no < 0)
2759 {
you.chen35020192022-05-06 11:30:57 +08002760 return -1;
2761 }
2762
2763 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002764}
2765
you.chenb95401e2023-05-12 19:39:06 +08002766int lynq_wifi_sta_connect_timeout(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw, int timeout)
qs.xiong7a105ce2022-03-02 09:43:11 -05002767{
you.chen35020192022-05-06 11:30:57 +08002768 int count, net_no, index;
2769 int net_no_list[128];
qs.xiongf71b53b2023-05-03 13:12:07 +08002770 char rm_net_cmd[128];
you.chen35020192022-05-06 11:30:57 +08002771 lynq_wifi_auth_s net_auth;
you.chen70f377f2023-04-14 18:17:09 +08002772 curr_status_info curr_state;
2773 ap_info_s ap_info;
2774 char status[64];
qs.xiongf1b525b2022-03-31 00:58:23 -04002775
qs.xiong9fbf74e2023-03-28 13:38:22 +08002776 if (ssid == NULL || *ssid == '\0')
2777 {
2778 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002779 return -1;
2780 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002781
qs.xiong9fbf74e2023-03-28 13:38:22 +08002782 if (LYNQ_WIFI_AUTH_OPEN != auth)
2783 {
2784 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
you.chen70f377f2023-04-14 18:17:09 +08002785 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002786 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002787 return -1;
2788 }
2789 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002790
you.chen70f377f2023-04-14 18:17:09 +08002791
2792 pthread_mutex_lock(&s_global_check_mutex);
2793 if (s_sta_status != INNER_STA_STATUS_INIT)
2794 {
2795 s_sta_status = INNER_STA_STATUS_CANCEL;
2796 pthread_cond_signal(&s_global_check_cond);
2797 }
2798 pthread_mutex_unlock(&s_global_check_mutex);
2799
you.chen35020192022-05-06 11:30:57 +08002800 CHECK_IDX(idx, CTRL_STA);
you.chen70f377f2023-04-14 18:17:09 +08002801 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002802
2803 net_no = -1;
you.chen70f377f2023-04-14 18:17:09 +08002804 memset(&ap_info, 0, sizeof (ap_info));
2805 memset(status, 0, sizeof (status));
you.chen35020192022-05-06 11:30:57 +08002806
you.chen70f377f2023-04-14 18:17:09 +08002807 curr_state.ap = &ap_info;
2808 curr_state.state = status;
2809
2810 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002811 {
you.chen70f377f2023-04-14 18:17:09 +08002812 if (strcmp(status, STATE_COMPLETED) == 0 && strcmp(ap_info.ap_ssid, ssid) ==0 && ap_info.auth == auth)
2813 {
2814 net_no = curr_state.net_no;
2815 if (0 == lynq_sta_ssid_password_get(idx, &ap_info, ap_info.psw)
2816 && strcmp(ap_info.psw, psw) == 0)
2817 {
2818 RLOGD("already connected\n");
2819
2820 pthread_mutex_lock(&s_global_check_mutex);
2821 s_sta_status = INNER_STA_STATUS_CONNECTED;
2822 pthread_cond_signal(&s_global_check_cond);
2823 pthread_mutex_unlock(&s_global_check_mutex);
2824 return 0;
2825 }
you.chen35020192022-05-06 11:30:57 +08002826 }
2827 }
2828
you.chen70f377f2023-04-14 18:17:09 +08002829 if (net_no == -1)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002830 {
you.chen70f377f2023-04-14 18:17:09 +08002831 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2832
2833 for (index=0; index < count; index++)
2834 {
2835 net_auth = -1;
2836 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2837 {
2838 net_no = net_no_list[index];
2839 break;
2840 }
you.chen35020192022-05-06 11:30:57 +08002841 }
2842
you.chen70f377f2023-04-14 18:17:09 +08002843 if (net_no < 0)
2844 {
qs.xiongf71b53b2023-05-03 13:12:07 +08002845 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
2846 for ( index = 0; index < (count - STA_MAX_SAVED_AP_NUM + 1 ) ;index++) //+1 is for add new network
2847 {
2848 sprintf(rm_net_cmd,"REMOVE_NETWORK %d",net_no_list[index]);
2849 RLOGD("call cmd rm_net_cmd: %s;index is %d\n",rm_net_cmd,index);
2850 DO_OK_FAIL_REQUEST(rm_net_cmd);
2851 }
you.chen70f377f2023-04-14 18:17:09 +08002852 net_no = lynq_add_network(CTRL_STA);
2853 if (net_no == -1)
2854 {
2855 return -1;
2856 }
2857
2858 RLOGD("net no is %d\n", net_no);
2859 if (0 != inner_set_sta_ssid(net_no, ssid))
2860 {
2861 return -1;
2862 }
you.chen35020192022-05-06 11:30:57 +08002863 }
2864 }
2865
qs.xiong9fbf74e2023-03-28 13:38:22 +08002866 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2867 {
you.chen35020192022-05-06 11:30:57 +08002868 return -1;
2869 }
2870
you.chen70f377f2023-04-14 18:17:09 +08002871
2872 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen186d3c32023-05-18 14:19:46 +08002873 system("echo \"\" > /tmp/wlan0_dhcpcd_router");
you.chen70f377f2023-04-14 18:17:09 +08002874 usleep(200*1000);
2875
2876 ret = inner_sta_start_stop(net_no, 1, 1);
2877
2878 pthread_mutex_lock(&s_global_check_mutex);
2879 s_sta_status = INNER_STA_STATUS_CONNECTING;
2880 strcpy(s_sta_current_connecting_ssid, ssid);
2881 struct timeval now;
2882 gettimeofday(&now,NULL);
you.chenb95401e2023-05-12 19:39:06 +08002883 s_sta_connect_timeout.tv_sec = now.tv_sec + timeout;
you.chen70f377f2023-04-14 18:17:09 +08002884 s_sta_connect_timeout.tv_nsec = now.tv_usec*1000;
2885 pthread_cond_signal(&s_global_check_cond);
2886 pthread_mutex_unlock(&s_global_check_mutex);
2887 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002888}
2889
you.chenb95401e2023-05-12 19:39:06 +08002890int lynq_wifi_sta_connect(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw)
2891{
2892 return lynq_wifi_sta_connect_timeout(idx, ssid, auth, psw, MAX_CONNNECT_TIME);
2893}
2894
you.chen35020192022-05-06 11:30:57 +08002895int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002896{
you.chen35020192022-05-06 11:30:57 +08002897 ap_info_s ap;
2898 curr_status_info curr_state;
2899 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002900
qs.xiong9fbf74e2023-03-28 13:38:22 +08002901 if (ssid == NULL || *ssid == '\0')
2902 {
2903 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002904 return -1;
2905 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002906
you.chen35020192022-05-06 11:30:57 +08002907 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002908
you.chen35020192022-05-06 11:30:57 +08002909 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002910 curr_state.state = NULL;
2911
qs.xiong9fbf74e2023-03-28 13:38:22 +08002912 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2913 {
you.chen35020192022-05-06 11:30:57 +08002914 return 0;
2915 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002916
qs.xiong9fbf74e2023-03-28 13:38:22 +08002917 if (strcmp(ap.ap_ssid, ssid) != 0)
2918 {
you.chen35020192022-05-06 11:30:57 +08002919 return 0;
2920 }
2921
you.chen70f377f2023-04-14 18:17:09 +08002922 pthread_mutex_lock(&s_global_check_mutex);
2923 s_sta_status = INNER_STA_STATUS_DISCONNECTING;
2924 pthread_mutex_unlock(&s_global_check_mutex);
you.chen35020192022-05-06 11:30:57 +08002925 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002926}
qs.xiong97fa59b2022-04-07 05:41:29 -04002927
you.chena6cd55a2022-05-08 12:20:18 +08002928int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2929{
qs.xiongad2f89d2023-01-18 13:17:41 +08002930// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2931// const char *lynq_reconnect_cmd = "RECONNECT";
2932 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2933 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2934// const char *lynq_first_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 remove_net all";
qs.xiong7a105ce2022-03-02 09:43:11 -05002935
you.chen35020192022-05-06 11:30:57 +08002936 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08002937 CHECK_WPA_CTRL(CTRL_STA);
2938
you.chenc9928582023-04-24 15:39:37 +08002939 ret = system_call_v("%s %s", start_stop_sta_script, "start");
2940 if (ret != 0)
qs.xiongad2f89d2023-01-18 13:17:41 +08002941 {
you.chenc9928582023-04-24 15:39:37 +08002942 RLOGE("lynq_wifi_ap_start excute script fail");
you.chen35020192022-05-06 11:30:57 +08002943 return -1;
2944 }
qs.xiong9c99fa92022-03-15 08:03:26 -04002945
qs.xiongad2f89d2023-01-18 13:17:41 +08002946 system(lynq_enable_sta_cmd);
2947 system(lynq_reconnect_cmd);
2948// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002949 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002950}
2951
you.chen35020192022-05-06 11:30:57 +08002952int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04002953{
qs.xiongad2f89d2023-01-18 13:17:41 +08002954// char lynq_disable_network_cmd[MAX_CMD];
2955// curr_status_info curr_state;
2956// ap_info_s ap_info;
you.chen35020192022-05-06 11:30:57 +08002957
qs.xiongad2f89d2023-01-18 13:17:41 +08002958 const char * lynq_disable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disable_net all";
you.chena6cd55a2022-05-08 12:20:18 +08002959 CHECK_IDX(idx, CTRL_STA);
2960 CHECK_WPA_CTRL(CTRL_STA);
2961
qs.xiongad2f89d2023-01-18 13:17:41 +08002962 system(lynq_disable_sta_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002963 DO_OK_FAIL_REQUEST(cmd_save_config);
you.chenc9928582023-04-24 15:39:37 +08002964
2965 ret = system_call_v("%s %s", start_stop_sta_script, "stop");
2966 if (ret != 0)
2967 {
2968 RLOGE("lynq_wifi_ap_start excute script fail");
2969 return -1;
2970 }
2971
you.chena6cd55a2022-05-08 12:20:18 +08002972 return 0;
2973// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04002974}
qs.xiong7a105ce2022-03-02 09:43:11 -05002975
you.chen35020192022-05-06 11:30:57 +08002976//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
2977// int i, count;
2978// char *p;
2979// const char * FLAG_SSID = "ssid=";
2980// const char * FLAG_SBSID = "bssid=";
2981// const char * FLAG_KEY_MGMT = "key_mgmt=";
2982// const char * FLAG_FREQ = "freq=";
2983// char lynq_sta_cmd[MAX_CMD];
2984// char *split_lines[128] = {0};
2985
2986// CHECK_WPA_CTRL(CTRL_AP);
2987
2988// sprintf(lynq_sta_cmd, "STA %s", bssid);
2989
2990// DO_REQUEST(lynq_sta_cmd);
2991
2992// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2993
2994// for(i=0; i < count; i++) {
2995// p = strstr(split_lines[i], FLAG_SSID);
2996// if (p != NULL) {
2997// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
2998// continue;
2999// }
3000// }
3001
3002// lynq_get_interface_ip(idx, ap->ap_ip);
3003// lynq_ap_password_set(idx, ap->psw);
3004
3005// return 0;
3006//}
3007
3008static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
3009 curr_status_info curr_state;
3010 curr_state.ap = ap;
3011 curr_state.state = NULL;
3012 return inner_get_status_info(interface, &curr_state);
3013}
3014
3015int lynq_get_ap_device_list(lynq_wifi_index_e idx, ap_info_s **ap, device_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04003016{
you.chend2fef3f2023-02-13 10:50:35 +08003017 int index, line_count;
3018 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08003019 const char *lynq_first_sta_cmd = "STA-FIRST";
3020 char lynq_next_sta_cmd[MAX_CMD];
3021 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08003022 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04003023
you.chen35020192022-05-06 11:30:57 +08003024 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04003025
you.chen35020192022-05-06 11:30:57 +08003026 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04003027
you.chenb95401e2023-05-12 19:39:06 +08003028 // ap_info_s * tmp_ap;
3029 // device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003030 if (ap == NULL || list == NULL || len == NULL)
3031 {
3032 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08003033 return -1;
3034 }
3035
you.chenb95401e2023-05-12 19:39:06 +08003036 // ap = &tmp_ap;
3037 // list = &tmp_list;
you.chen35020192022-05-06 11:30:57 +08003038 *ap = malloc(sizeof (ap_info_s));
you.chenb95401e2023-05-12 19:39:06 +08003039 memset(*ap, 0, sizeof (ap_info_s));
you.chen35020192022-05-06 11:30:57 +08003040
you.chenb95401e2023-05-12 19:39:06 +08003041 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0 || (*ap)->ap_ssid[0] == '\0')
qs.xiong9fbf74e2023-03-28 13:38:22 +08003042 {
you.chenb95401e2023-05-12 19:39:06 +08003043 RLOGE("inner_get_status_info_ap !=0 or ap_ssid is empty\n");
you.chen35020192022-05-06 11:30:57 +08003044 return -1;
3045 }
3046
3047 lynq_get_interface_ip(idx, (*ap)->ap_ip);
3048 lynq_ap_password_get(idx, (*ap)->psw);
3049
you.chen35020192022-05-06 11:30:57 +08003050 DO_REQUEST(lynq_first_sta_cmd);
3051
3052 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003053 while (reply_len > 0)
3054 {
3055 if (memcmp(cmd_reply, "FAIL", 4) == 0)
you.chenb95401e2023-05-12 19:39:06 +08003056 {
you.chen35020192022-05-06 11:30:57 +08003057 break;
3058 }
3059 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3060 bssid[index] = malloc(strlen(split_lines[0]) + 1);
3061 strcpy(bssid[index], split_lines[0]);
3062 index++;
3063 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
3064 reply_len = MAX_RET;
3065 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08003066 ret = local_wpa_ctrl_request(lynq_wpa_ctrl, lynq_next_sta_cmd, strlen(lynq_next_sta_cmd), cmd_reply, &reply_len, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003067 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
you.chenb95401e2023-05-12 19:39:06 +08003068 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003069 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08003070 break;
3071 }
3072 }
3073
3074 *len = index;
3075
3076 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08003077 for (index=0; index < *len; index++)
3078 {
you.chend2fef3f2023-02-13 10:50:35 +08003079 dev_info = &(*list)[index];
3080 memset(dev_info, 0, sizeof(device_info_s));
3081 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
3082 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
3083 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
3084 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08003085 free(bssid[index]);
3086 }
3087
3088 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003089}
3090
you.chen35020192022-05-06 11:30:57 +08003091int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04003092{
you.chen35020192022-05-06 11:30:57 +08003093 int i, count, index, count_words;
3094 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
3095 char *split_lines[128] = {0};
3096 char *split_words[128] = {0};
3097 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04003098
qs.xiong9fbf74e2023-03-28 13:38:22 +08003099 if (list == NULL || len == NULL)
3100 {
you.chen35020192022-05-06 11:30:57 +08003101 return -1;
3102 }
qs.xiong97fa59b2022-04-07 05:41:29 -04003103
you.chen9ac66392022-08-06 17:01:16 +08003104 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
3105 {
3106 usleep(100 * 1000);
3107 }
3108
you.chen35020192022-05-06 11:30:57 +08003109 CHECK_IDX(idx, CTRL_STA);
3110
3111 CHECK_WPA_CTRL(CTRL_STA);
3112
3113 DO_REQUEST(lynq_scan_result_cmd);
3114
3115 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3116 *len = count - 1;
3117 *list = malloc(sizeof (scan_info_s) * *len);
3118
3119 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08003120 for (index=0; index <count_words; index++)
3121 {
3122 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08003123 }
3124
qs.xiong9fbf74e2023-03-28 13:38:22 +08003125 for(index = 1;index < count; index++)
3126 {
3127 RLOGD("---- %s\n",split_lines[index]);
you.chen6ed36a62023-04-27 17:51:56 +08003128 memset(split_words, 0 , sizeof (split_words));
you.chen35020192022-05-06 11:30:57 +08003129 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
3130 if (count_words < 4)
3131 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003132 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08003133 //bssid / frequency / signal level / flags / ssid
3134 p = (*list) + index - 1;
3135 strcpy(p->mac, split_words[0]);
3136 p->band = convert_band_from_freq(atoi(split_words[1]));
3137 p->rssi = -1 * atoi( split_words[2]);
3138 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chen6ed36a62023-04-27 17:51:56 +08003139 if (count_words == 4) // ssid hided
3140 {
3141 p->ssid[0] = '\0';
3142 }
3143 else
3144 {
3145 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
3146 }
you.chen35020192022-05-06 11:30:57 +08003147 }
3148
3149 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003150}
qs.xiong97fa59b2022-04-07 05:41:29 -04003151
you.chen35020192022-05-06 11:30:57 +08003152int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
3153{
3154 int count, net_no, index;
3155 int net_no_list[128];
3156 lynq_wifi_auth_s net_auth;
3157 char lynq_remove_cmd[MAX_CMD];
3158
qs.xiong9fbf74e2023-03-28 13:38:22 +08003159 if (ssid == NULL || *ssid == '\0')
3160 {
3161 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08003162 return -1;
3163 }
3164
3165 CHECK_IDX(idx, CTRL_STA);
3166
3167 CHECK_WPA_CTRL(CTRL_STA);
3168
3169 net_no = -1;
3170 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
3171
qs.xiong9fbf74e2023-03-28 13:38:22 +08003172 for (index=0; index < count; index++)
3173 {
you.chen35020192022-05-06 11:30:57 +08003174 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003175 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
3176 {
you.chen35020192022-05-06 11:30:57 +08003177 net_no = net_no_list[index];
3178 break;
3179 }
3180 }
3181
qs.xiong9fbf74e2023-03-28 13:38:22 +08003182 if (net_no < 0)
3183 {
you.chen35020192022-05-06 11:30:57 +08003184 return 0;
3185 }
3186
3187 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
3188
3189 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
3190 DO_OK_FAIL_REQUEST(cmd_save_config);
3191
3192 return 0;
3193}
3194
3195int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003196{
you.chend2fef3f2023-02-13 10:50:35 +08003197 int count, index;
you.chen35020192022-05-06 11:30:57 +08003198 int net_no_list[128];
3199 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003200 RLOGD("enter lynq_get_sta_saved_ap api\n");
3201 if (list == NULL || len == NULL)
3202 {
3203 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08003204 return -1;
3205 }
3206
3207 CHECK_IDX(idx, CTRL_STA);
3208
3209// CHECK_WPA_CTRL(CTRL_STA);
3210
3211 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003212 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08003213
you.chen057aac42023-04-13 14:06:58 +08003214 if (count < 0)
3215 {
3216 RLOGE("list network fail");
3217 return count;
3218 }
3219 else if (count == 0)
3220 {
3221 *list = NULL;
3222 *len = 0;
3223 return 0;
3224 }
3225
you.chen35020192022-05-06 11:30:57 +08003226 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08003227 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08003228 *len = count;
3229
qs.xiong9fbf74e2023-03-28 13:38:22 +08003230 for (index=0; index < count; index++)
3231 {
you.chen35020192022-05-06 11:30:57 +08003232 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
you.chen35020192022-05-06 11:30:57 +08003233 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
you.chen35020192022-05-06 11:30:57 +08003234 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003235 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
you.chen057aac42023-04-13 14:06:58 +08003236 {
you.chen35020192022-05-06 11:30:57 +08003237 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
3238 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003239 else
you.chen057aac42023-04-13 14:06:58 +08003240 {
you.chen35020192022-05-06 11:30:57 +08003241 (*list)[index].base_info.band = -1;
3242 }
you.chen057aac42023-04-13 14:06:58 +08003243 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08003244 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08003245 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003246 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08003247 return 0;
3248}
3249
3250int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
3251{
qs.xiongc8d92a62023-03-29 17:36:14 +08003252 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08003253 const char *lynq_scan_cmd = "SCAN";
3254
3255 CHECK_IDX(idx, CTRL_STA);
3256
3257 CHECK_WPA_CTRL(CTRL_STA);
3258
you.chen0df3e7e2023-05-10 15:56:26 +08003259 if (g_sta_scan_finish_flag == 1 && s_sta_status == INNER_STA_STATUS_INIT) // temp add
3260 {
3261 RLOGD("tmp clear scanlist");
3262 system(clean_last_re);
3263 }
you.chen9ac66392022-08-06 17:01:16 +08003264 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08003265 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003266 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
3267 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003268 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003269 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
3270 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003271 g_sta_scan_finish_flag = 1;
3272 return -1;
3273 }
you.chen35020192022-05-06 11:30:57 +08003274
3275 return 0;
3276}
3277
3278int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003279 if (cb == NULL)
3280 {
3281 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003282 return -1;
3283 }
3284
you.chene9d00032023-04-24 13:55:29 +08003285 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +08003286 g_ap_callback_priv = priv;
3287 g_ap_callback_func = cb;
3288
you.chene9d00032023-04-24 13:55:29 +08003289 if (g_ap_watcher_pid == 0 )
3290 {
3291 if(pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL) < 0)
3292 {
3293 g_ap_watcher_pid = 0;
3294 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3295 RLOGE("[wifi error]creat APWatcherThreadProc fail");
3296 return -1;
3297 }
3298 }
3299
3300 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3301 RLOGD("creat APWatcherTheradProc susccs");
3302
you.chen35020192022-05-06 11:30:57 +08003303 return 0;
3304}
3305
3306int lynq_unreg_ap_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003307 if (g_ap_callback_priv == priv)
3308 {
you.chen35020192022-05-06 11:30:57 +08003309 g_ap_callback_func = NULL;
3310 g_ap_callback_priv = NULL;
3311 return 0;
3312 }
3313 return -1;
3314}
3315
3316int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08003317 if (cb == NULL)
3318 {
3319 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003320 return -1;
3321 }
3322
you.chene9d00032023-04-24 13:55:29 +08003323 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +08003324 g_sta_callback_priv = priv;
3325 g_sta_callback_func = cb;
3326
you.chene9d00032023-04-24 13:55:29 +08003327 if (g_sta_watcher_pid == 0 ) {
3328 if(pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL) < 0)
3329 {
3330 g_sta_watcher_pid = 0;
3331 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3332 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
3333 return -1;
3334 }
3335 }
3336
3337 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3338 RLOGD("creat STAWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +08003339 return 0;
3340}
3341
3342int lynq_unreg_sta_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003343 if (g_sta_callback_priv == priv)
3344 {
you.chen35020192022-05-06 11:30:57 +08003345 g_sta_callback_func = NULL;
3346 g_sta_callback_priv = NULL;
3347 return 0;
3348 }
3349 return -1;
3350}
3351
3352
3353static int inner_get_status_info_state (int interface, char *state) {
3354 curr_status_info curr_state;
3355 curr_state.ap = NULL;
3356 curr_state.state = state;
3357 return inner_get_status_info(interface, &curr_state);
3358}
3359
3360int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
3361{
3362 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003363 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08003364 CHECK_IDX(idx, CTRL_AP);
3365
qs.xiong9fbf74e2023-03-28 13:38:22 +08003366 if (inner_get_status_info_state(CTRL_AP, state) != 0)
3367 {
you.chen35020192022-05-06 11:30:57 +08003368 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3369 return 0;
3370 }
3371
qs.xiong9fbf74e2023-03-28 13:38:22 +08003372 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3373 {
you.chen35020192022-05-06 11:30:57 +08003374 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
3375 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003376 else
3377 {
you.chen35020192022-05-06 11:30:57 +08003378 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3379 }
3380
3381 return 0;
3382}
3383
3384int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
3385 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003386 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08003387 CHECK_IDX(idx, CTRL_STA);
3388
qs.xiong9fbf74e2023-03-28 13:38:22 +08003389 if (inner_get_status_info_state(CTRL_STA, state) != 0)
3390 {
you.chen35020192022-05-06 11:30:57 +08003391 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3392 return 0;
3393 }
3394
qs.xiong9fbf74e2023-03-28 13:38:22 +08003395 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3396 {
you.chen35020192022-05-06 11:30:57 +08003397 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
3398 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003399 else
3400 {
you.chen35020192022-05-06 11:30:57 +08003401 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3402 }
3403
3404 return 0;
3405}
3406
3407int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
3408// CHECK_IDX(idx, CTRL_AP);
3409// int ret = 0;
3410// size_t reply_len = MAX_RET;
3411// char cmd_reply[MAX_RET]={0};
3412// const char * cmd_str = "GET country";
3413// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
3414// do{
3415// if (NULL == s_lynq_wpa_ctrl) {
3416// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
3417// if (NULL == s_lynq_wpa_ctrl ) {
3418// printf("wpa_ctrl_open fail\n");
3419// return -1;
3420// }
3421// }
3422// }while(0);
3423
3424// do {
3425// reply_len = MAX_RET;
3426// cmd_reply[0] = '\0';
3427// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08003428// ret = local_wpa_ctrl_request(s_lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL);
you.chen35020192022-05-06 11:30:57 +08003429// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003430// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08003431// return ret;
3432// }
3433// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08003434// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08003435// }while(0);
3436
3437 FILE *fp;
3438 size_t i = 0;
3439 char lynq_cmd_ret[MAX_RET]={0};
3440
3441// CHECK_IDX(idx, CTRL_AP);
3442
3443 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003444 {
3445 perror("popen error!");
3446 return -1;
3447 }
you.chen35020192022-05-06 11:30:57 +08003448 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
3449 {
3450 perror("fread fail!");
3451 return -1;
3452 }
3453
qs.xiong9fbf74e2023-03-28 13:38:22 +08003454 for(i=0; i < strlen(lynq_cmd_ret); i++)
3455 {
3456 if (lynq_cmd_ret[i] == ' ')
3457 {
you.chen35020192022-05-06 11:30:57 +08003458 lynq_cmd_ret[i] = '\0';
3459 break;
3460 }
3461 }
3462
3463 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003464 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08003465
3466 int ret=pclose(fp);
3467 if(ret==-1)
3468 {
3469 perror("close file faild");
3470 }
3471
3472 return 0;
3473}
3474
qs.xiong62034bf2023-06-01 19:23:13 +08003475int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
xj3df9fd82023-06-01 20:50:02 +08003476// const char * cmd_str = "GET country";
3477// CHECK_IDX(idx, CTRL_AP);
3478// CHECK_WPA_CTRL(CTRL_STA);
3479
3480// DO_REQUEST(cmd_str);
3481// printf("result %s\n", cmd_reply);
qs.xiong62034bf2023-06-01 19:23:13 +08003482
3483 if (country_code == NULL || *country_code == '\0')
3484 {
xj3df9fd82023-06-01 20:50:02 +08003485 RLOGD("bad country code\n");
qs.xiong62034bf2023-06-01 19:23:13 +08003486 return -1;
3487 }
3488
xj3df9fd82023-06-01 20:50:02 +08003489 char lynq_country_cmd[MAX_CMD];
3490 sprintf(lynq_country_cmd, "wl country %s", country_code);
3491 if (system(lynq_country_cmd) == 0)
qs.xiong62034bf2023-06-01 19:23:13 +08003492 {
xj3df9fd82023-06-01 20:50:02 +08003493 return 0;
qs.xiong62034bf2023-06-01 19:23:13 +08003494 }
3495
xj3df9fd82023-06-01 20:50:02 +08003496 return -1;
you.chen35020192022-05-06 11:30:57 +08003497}
3498
3499int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
3500{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003501 RLOGD("enter lynq_get_connect_ap_mac\n");
3502 if (mac == NULL)
3503 {
3504 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08003505 return -1;
3506 }
3507
3508 CHECK_IDX(idx, CTRL_STA);
3509 ap_info_s ap;
3510 ap.ap_mac[0] = '\0';
3511
qs.xiong9fbf74e2023-03-28 13:38:22 +08003512 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3513 {
you.chen35020192022-05-06 11:30:57 +08003514 return -1;
3515 }
3516 strcpy(mac, ap.ap_mac);
3517
3518 return 0;
3519}
3520
3521int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
3522{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003523 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08003524 struct ifaddrs *ifaddr_header, *ifaddr;
3525 struct in_addr * ifa;
3526 const char * ifaName = "wlan0";
3527 if (ip == NULL)
3528 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003529 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08003530 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003531 }
you.chenf58b3c92022-06-21 16:53:48 +08003532
qs.xiong9fbf74e2023-03-28 13:38:22 +08003533 if (idx == 1)
3534 {
you.chen0df3e7e2023-05-10 15:56:26 +08003535 ifaName = inner_get_ap_interface_name();
3536 if (ifaName == NULL)
3537 {
3538 RLOGE("[lynq_get_interface_ip] ap name get fail");
3539 return -1;
3540 }
you.chen9ac66392022-08-06 17:01:16 +08003541 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003542 else if (idx != 0)
3543 {
you.chen35020192022-05-06 11:30:57 +08003544 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003545 }
you.chen35020192022-05-06 11:30:57 +08003546
you.chen9ac66392022-08-06 17:01:16 +08003547 if (getifaddrs(&ifaddr_header) == -1)
3548 {
you.chen35020192022-05-06 11:30:57 +08003549 perror("getifaddrs");
3550 return -1;
3551 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08003552 }
you.chen35020192022-05-06 11:30:57 +08003553
3554
you.chen9ac66392022-08-06 17:01:16 +08003555 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3556 {
3557 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08003558 continue;
you.chen9ac66392022-08-06 17:01:16 +08003559 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3560 {
3561 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3562 {
3563 // is a valid IP4 Address
3564 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3565 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003566 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08003567 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003568 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08003569 return 0;
3570 }
3571 }
3572 }
qs.xiongc4f007c2023-02-08 18:16:58 +08003573 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003574 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08003575 return -1;
you.chen35020192022-05-06 11:30:57 +08003576}
3577
3578int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3579{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003580 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08003581 int count;
3582 size_t i;
3583 char *split_words[128] = {0};
3584 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3585
3586 CHECK_WPA_CTRL(idx);
3587
3588 DO_REQUEST(lynq_get_mac_cmd);
3589
qs.xiong9fbf74e2023-03-28 13:38:22 +08003590 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3591 {
3592 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08003593 return -1;
3594 }
3595
3596 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3597
qs.xiong9fbf74e2023-03-28 13:38:22 +08003598 if (count < 2)
3599 {
you.chen35020192022-05-06 11:30:57 +08003600 return -1;
3601 }
3602
qs.xiong9fbf74e2023-03-28 13:38:22 +08003603 for (i=0; i < strlen(split_words[1]); i++ )
3604 {
3605 if (split_words[1][i] != ' ')
3606 {
you.chen35020192022-05-06 11:30:57 +08003607 break;
3608 }
3609 }
3610
3611 strcpy(mac, split_words[1] + i);
3612
3613 return 0;
3614}
3615
3616int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3617{
3618// int count;
3619// char *split_words[128] = {0};
3620// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3621
3622// if (rssi == NULL) {
3623// return -1;
3624// }
3625
3626// CHECK_IDX(idx, CTRL_STA);
3627
3628// CHECK_WPA_CTRL(CTRL_STA);
3629
3630// DO_REQUEST(lynq_get_rssi_cmd);
3631
3632// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3633// return -1;
3634// }
3635
3636// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3637
3638// if (count < 2) {
3639// return -1;
3640// }
3641
3642// *rssi = atoi(split_words[1]) * -1;
3643
you.chen35020192022-05-06 11:30:57 +08003644 char lynq_cmd_ret[MAX_RET]={0};
3645
qs.xiongff0ae0f2022-10-11 15:47:14 +08003646/*******change other cmd to get rssi*******
3647 *
3648 *wl rssi ---> wl -i wlan0 rssi
3649 *
3650 ***** change by qs.xiong 20221011*******/
you.chen23c4a5f2023-04-12 16:46:00 +08003651 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiong9fbf74e2023-03-28 13:38:22 +08003652 {
you.chen23c4a5f2023-04-12 16:46:00 +08003653 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen35020192022-05-06 11:30:57 +08003654 return -1;
3655 }
you.chen9f17e4d2022-06-06 17:18:18 +08003656 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003657/****** if got rssi is 0,means sta didn't connected any device****/
3658 if(*rssi == 0)
3659 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003660 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chen23c4a5f2023-04-12 16:46:00 +08003661 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003662 }
you.chen35020192022-05-06 11:30:57 +08003663
3664 return 0;
3665}
3666
3667int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3668{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003669 RLOGD("enter lynq_get_connect_ap_band\n");
3670 if (band == NULL)
3671 {
you.chen35020192022-05-06 11:30:57 +08003672 return -1;
3673 }
3674
3675 CHECK_IDX(idx, CTRL_STA);
3676 ap_info_s ap;
3677 ap.band = -1;
3678
qs.xiong9fbf74e2023-03-28 13:38:22 +08003679 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3680 {
you.chen35020192022-05-06 11:30:57 +08003681 return -1;
3682 }
3683 *band = ap.band;
3684
3685 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003686}
you.chenf58b3c92022-06-21 16:53:48 +08003687
3688int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3689{
you.chenb95401e2023-05-12 19:39:06 +08003690 int ret;
3691 char *p;
qs.xionge4cbf1c2023-02-28 18:22:49 +08003692 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003693
3694 if (ip == NULL)
3695 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003696 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003697 return -1;
3698 }
3699
3700 CHECK_IDX(idx, CTRL_STA);
3701
qs.xionge4cbf1c2023-02-28 18:22:49 +08003702 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003703 {
3704 return -1;
3705 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003706
you.chenb95401e2023-05-12 19:39:06 +08003707 ip[0] = '\0';
3708 ret = inner_get_ip_by_mac(bssid, ip, 32); //better input by user
3709 if (ret != 0)
3710 {
3711 RLOGE("[lynq_get_connect_ap_ip] inner_get_ip_by_mac return fail");
3712 return -1;
3713 }
3714
3715 if (ip[0] == '\0' || strchr(ip, ':') != NULL) //temp change, not ok
3716 {
3717 ip[0] = '\0';
you.chen186d3c32023-05-18 14:19:46 +08003718 ret = exec_cmd("grep \"new_router\" /tmp/wlan0_dhcpcd_router | awk '{print $2}'| tail -1", ip, 32);
you.chenb95401e2023-05-12 19:39:06 +08003719 if (ret != 0)
3720 {
3721 ip[0] = '\0';
3722 return 0;
3723 }
3724 else
3725 {
3726 p = strchr(ip, '\n');
3727 if (p != NULL)
3728 {
3729 *p = '\0';
3730 }
3731 }
3732 }
3733 return 0;
you.chenf58b3c92022-06-21 16:53:48 +08003734}
3735
qs.xiong026c5c72022-10-17 11:15:45 +08003736int lynq_ap_connect_num(int sta_number)
3737{
3738 char lynq_limit_cmd[32]={0};
3739 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003740 if((sta_number < 1 ) && (sta_number > 15))
3741 {
3742 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003743 return -1;
3744 }
3745 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3746 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003747 if(ret != 0)
3748 {
3749 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003750 }
3751 return 0;
3752}
you.chenf58b3c92022-06-21 16:53:48 +08003753
qs.xiong77905552022-10-17 11:19:57 +08003754int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3755{
3756
3757 char lynq_wifi_acs_cmd[128]={0};
3758 char lynq_cmd_mode[128]={0};
3759 char lynq_cmd_slect[128]={0};
3760
qs.xiong9fbf74e2023-03-28 13:38:22 +08003761 if((acs_mode != 2) && (acs_mode != 5))
3762 {
qs.xiong77905552022-10-17 11:19:57 +08003763 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3764 }
3765
qs.xiong9fbf74e2023-03-28 13:38:22 +08003766 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3767 {
qs.xiong77905552022-10-17 11:19:57 +08003768 return -1;
3769 }
3770
3771 CHECK_IDX(idx, CTRL_AP);
3772
3773 CHECK_WPA_CTRL(CTRL_AP);
3774
3775 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3776 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3777 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3778
3779 DO_OK_FAIL_REQUEST(cmd_disconnect);
3780 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3781 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3782 DO_OK_FAIL_REQUEST(cmd_save_config);
3783 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3784
3785 return 0;
3786}
you.chen0f5c6432022-11-07 18:31:14 +08003787//you.chen add for tv-box start
3788static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3789 FILE *fp;
3790 //printf("to exec cmd:%s\n", str_cmd);
3791 if((fp=popen(str_cmd,"r"))==NULL)
3792 {
3793 perror("popen error!");
3794 return -1;
3795 }
3796 if((fread(str_cmd_ret,max_len,1,fp))<0)
3797 {
3798 perror("fread fail!");
3799 fclose(fp);
3800 return -1;
3801 }
3802 fclose(fp);
3803 return 0;
3804}
3805
3806static int get_netmask_length(const char* mask)
3807{
3808 int masklen=0, i=0;
3809 int netmask=0;
3810
3811 if(mask == NULL)
3812 {
3813 return 0;
3814 }
3815
3816 struct in_addr ip_addr;
3817 if( inet_aton(mask, &ip_addr) )
3818 {
3819 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003820 }else
3821 {
you.chen0f5c6432022-11-07 18:31:14 +08003822 netmask = 0;
3823 return 0;
3824 }
3825
3826 while(0 == (netmask & 0x01) && i<32)
3827 {
3828 i++;
3829 netmask = netmask>>1;
3830 }
3831 masklen = 32-i;
3832 return masklen;
3833}
3834
3835static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3836 int mask_len;
3837 char *p;
3838 char tmp[64] = {0};
you.chenc9928582023-04-24 15:39:37 +08003839 sprintf(tmp, "ifconfig %s | grep Mask", s_ap_iterface_name);
3840 if (exec_cmd(tmp, str_cmd_ret, max_len) != 0)
you.chen0f5c6432022-11-07 18:31:14 +08003841 return -1;
3842 p = strstr(str_cmd_ret, "Mask:");
3843 if (p == NULL)
3844 return -1;
3845 mask_len = get_netmask_length(p + 5);
3846 if (mask_len == 0)
3847 return -1;
3848 p = strstr(str_cmd_ret, "inet addr:");
3849 if (p == NULL)
3850 return -1;
3851 strcpy(tmp, p + 10);
3852 p = strstr(tmp, " ");
3853 if (p != NULL)
3854 *p = '\0';
3855 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
3856 return 0;
3857}
3858
3859static void GBWWatchThreadProc() {
3860 int i,n, nloop, nmax, ncheckcount, nidlecount;
3861 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
3862 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
3863 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
3864 char *results[16] = {0};
3865 char str_cmd[256] = {0};
3866 char str_cmd_ret[128] = {0};
3867 char dest_ip[32] = {0};
3868 lastAP1Bytes = lastAP2Bytes = 0;
3869 lastAP1Drop = lastAP2Drop = 0;
3870 lastAP1Speed = lastAP2Speed = 0;
3871 setAP1Speed = 50;
3872 setAP2Speed = 80;
3873 nloop = 0;
3874 nmax = 6;
3875 ncheckcount = nidlecount = 0;
3876
you.chen0df3e7e2023-05-10 15:56:26 +08003877 if (inner_get_ap_interface_name() == NULL)
you.chenc9928582023-04-24 15:39:37 +08003878 {
3879 RLOGE("------gbw thread run\n");
3880 return;
3881 }
3882
qs.xiong9fbf74e2023-03-28 13:38:22 +08003883 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08003884 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
3885 while (dest_ip[0] == '\0') {
3886 sleep(1);
3887 str_cmd_ret[0] = '\0';
3888 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
3889 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
3890 if (str_cmd_ret[n] == '\n'){
3891 str_cmd_ret[n] = '\0';
3892 break;
3893 }
3894 }
3895 if (str_cmd_ret[0] != '\0')
3896 {
3897 strcpy(dest_ip, str_cmd_ret);
3898 }
3899 }
3900
you.chenc9928582023-04-24 15:39:37 +08003901 system_call_v("tc qdisc del dev %s root > /dev/null 2>&1", s_ap_iterface_name);
3902 system_call_v("tc qdisc add dev %s root handle 1: htb r2q 1", s_ap_iterface_name);
3903 system_call_v("tc class add dev %s parent 1: classid 1:1 htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000", s_ap_iterface_name);
you.chen0f5c6432022-11-07 18:31:14 +08003904 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
3905 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003906 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08003907 return;
3908 }
you.chenc9928582023-04-24 15:39:37 +08003909 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);
3910 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);
3911 system_call_v("tc filter add dev %s parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", s_ap_iterface_name, dest_ip);
you.chen0f5c6432022-11-07 18:31:14 +08003912
3913 while (1) {
3914 sleep(1);
3915 memset(str_cmd, 0, sizeof(str_cmd));
you.chenc9928582023-04-24 15:39:37 +08003916 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
3917 sprintf(str_cmd, "tc -s class show dev %s classid 1:1 | grep Sent", s_ap_iterface_name);
3918 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen0f5c6432022-11-07 18:31:14 +08003919 continue;
3920 //printf("ap1 --- %s\n", str_cmd);
you.chenc9928582023-04-24 15:39:37 +08003921 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen0f5c6432022-11-07 18:31:14 +08003922 if (n > 9) {
3923 if (strcmp(results[1], "Sent") == 0) {
3924 currAP1Bytes = atoll(results[2]);
3925 }
3926 if (strcmp(results[6], "(dropped") == 0) {
3927 currAP1Drop = atoi(results[7]);
3928 }
3929 }
3930
3931 memset(str_cmd, 0, sizeof(str_cmd));
you.chenc9928582023-04-24 15:39:37 +08003932 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
3933 sprintf(str_cmd, "tc -s class show dev %s classid 1:2 | grep Sent", s_ap_iterface_name);
3934 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen0f5c6432022-11-07 18:31:14 +08003935 continue;
3936 //printf("ap2 --- %s\n", str_cmd);
you.chenc9928582023-04-24 15:39:37 +08003937 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen0f5c6432022-11-07 18:31:14 +08003938 if (n > 9) {
3939 if (strcmp(results[1], "Sent") == 0) {
3940 currAP2Bytes = atoll(results[2]);
3941 }
3942 if (strcmp(results[6], "(dropped") == 0) {
3943 currAP2Drop = atoi(results[7]);
3944 }
3945 }
3946
3947 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
3948 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
3949 lastAP1Bytes = currAP1Bytes;
3950 lastAP2Bytes = currAP2Bytes;
3951 continue;
3952 }
3953
3954 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
3955 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
3956 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
3957 lastAP1Speed = currAP1Speed;
3958 lastAP2Speed = currAP2Speed;
3959 lastAP1Bytes = currAP1Bytes;
3960 lastAP2Bytes = currAP2Bytes;
3961
3962 currSetAP1Speed = setAP1Speed;
3963 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
3964 ncheckcount++;
3965 if (ncheckcount > 3) {
3966 ncheckcount = 0;
3967 currSetAP1Speed = 5;
3968 }
3969 }
3970 else {
3971 ncheckcount = 0;
3972 if (currAP1Speed < 5)
3973 nidlecount++;
3974 else
3975 nidlecount = 0;
3976
3977 }
3978
3979 if (nidlecount > 60 ){
3980 currSetAP1Speed = 50;
3981 }
3982
3983 if (currSetAP1Speed != setAP1Speed) {
3984 setAP1Speed = currSetAP1Speed;
you.chenc9928582023-04-24 15:39:37 +08003985 system_call_v(str_cmd, "tc class replace dev %s parent 1: classid 1:1 htb rate %dMbit ceil %dMbit prio 2 quantum 3000",
3986 s_ap_iterface_name, setAP1Speed, (int)(setAP1Speed*1.4));
you.chen0f5c6432022-11-07 18:31:14 +08003987 }
3988 }
3989}
3990
3991int enableGBW(const char* mac) {
3992 int i,len;
3993 char get_ipaddr_cmd[128]={0};
3994 ap_info_s *ap;
3995 device_info_s * list;
3996
3997 if (mac == NULL || g_gbw_enabled == 1)
3998 return -1;
3999 len = strlen(mac);
4000 g_gbw_mac = malloc(len + 1);
4001 for(i=0;i<len;i++) {
4002 if (mac[i] >= 'A' && mac[i] <= 'Z')
4003 {
4004 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
4005 }
4006 else
4007 g_gbw_mac[i] = mac[i];
4008 }
4009 g_gbw_mac[i] = '\0';
4010 g_gbw_enabled = 1;
4011
4012 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
4013 if (system(get_ipaddr_cmd) == 0) {
4014 //startGBW();
4015 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
4016 for (i=0;i<len;i++) {
4017 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
4018 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
4019 startGBW();
4020 }
4021 free(ap);
4022 free(list);
4023 }
4024 }
4025 return 0;
4026}
4027
4028int disableGBW() {
4029 stopGBW();
4030 free(g_gbw_mac);
4031 g_gbw_mac = NULL;
4032 g_gbw_enabled = 1;
4033 return 0;
4034}
4035
4036static int startGBW() {
4037 if (g_gbw_watcher_pid != 0) {
4038 stopGBW();
4039 }
4040 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
4041}
4042
4043static int stopGBW() {
4044 void* retval;
you.chenc9928582023-04-24 15:39:37 +08004045 char cmd[64] = {0};
you.chen0f5c6432022-11-07 18:31:14 +08004046 pthread_cancel(g_gbw_watcher_pid);
4047 pthread_join(g_gbw_watcher_pid, &retval);
4048 g_gbw_watcher_pid = 0;
you.chenc9928582023-04-24 15:39:37 +08004049 sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
4050 if (s_ap_iterface_name[0] != '\0')
4051 {
4052 sprintf(cmd, "tc qdisc del dev %s root", s_ap_iterface_name);
4053 system(cmd);
4054 }
you.chen0f5c6432022-11-07 18:31:14 +08004055}
4056//you.chen add for tv-box end