blob: 2772668ee28a7eb3501bfe7cba7735ed2d2c2760 [file] [log] [blame]
qs.xiong799dab02022-03-14 09:12:12 -04001/**@File lib_wifi6.c
2* @Brief :about function test
3* @details :
you.chen87ff5172022-05-06 11:30:57 +08004* @Author : you.chen
5* @Date : 2022-4-6
qs.xiong799dab02022-03-14 09:12:12 -04006* @Version : V1.0
7* @copy ritght : Copyright (c) MobileTek
8*/
9#include <log/log.h>
qs.xiong8d42bb92022-03-02 09:43:11 -050010#include <stdio.h>
11#include <sys/types.h>
you.chen87ff5172022-05-06 11:30:57 +080012#include <stdlib.h>
qs.xiong8d42bb92022-03-02 09:43:11 -050013#include <string.h>
qs.xiong8d42bb92022-03-02 09:43:11 -050014#include "libwifi6.h"
you.chen87ff5172022-05-06 11:30:57 +080015#include <wpa_ctrl.h>
16#include <string.h>
17#include <time.h>
18#include <pthread.h>
19#include <sys/socket.h>
20#include <netinet/in.h>
21#include <arpa/inet.h>
22#include <netdb.h>
23#include <ifaddrs.h>
qs.xiongf1e48bb2023-03-28 13:38:22 +080024#include "log/log.h"
you.chenf9d718d2023-04-14 18:17:09 +080025#include <sys/time.h>
26#include <asm/errno.h>
qs.xiong8d42bb92022-03-02 09:43:11 -050027
qs.xiong799dab02022-03-14 09:12:12 -040028#ifdef __cplusplus
29extern "C" {
30#endif
31#ifdef __cplusplus
32}
33#endif
you.chen87ff5172022-05-06 11:30:57 +080034
qs.xiongf1e48bb2023-03-28 13:38:22 +080035#undef LOG_TAG
36#define LOG_TAG "LYNQ_WIFI"
you.chen87ff5172022-05-06 11:30:57 +080037#define MAX_CMD 128
38#define MAX_RET 4096
qs.xiongd189c542022-03-31 00:58:23 -040039#define MODE_LEN 10
you.chen87ff5172022-05-06 11:30:57 +080040#define CTRL_STA 0
41#define CTRL_AP 1
42#define AP_NETWORK_0 0
qs.xionga4ba25a2023-05-03 13:12:07 +080043#define STA_MAX_SAVED_AP_NUM 50
you.chen87ff5172022-05-06 11:30:57 +080044
45pthread_t g_ap_watcher_pid = 0;
46volatile int g_ap_watcher_stop_flag = 0;
you.chen6a9361d2022-05-18 10:28:19 +080047volatile int g_ap_watcher_started_flag = 0;
you.chen87ff5172022-05-06 11:30:57 +080048
qs.xiongbab8a1c2023-08-12 18:01:32 +080049pthread_t g_ap_tmp_watcher_pid = 0;
50volatile int g_ap_tmp_watcher_stop_flag = 0;
51
52
53
you.chen87ff5172022-05-06 11:30:57 +080054pthread_t g_sta_watcher_pid = 0;
55volatile int g_sta_watcher_stop_flag = 0;
you.chen61c7aee2022-08-06 17:01:16 +080056volatile int g_sta_scan_finish_flag = 1;
you.chen6a9361d2022-05-18 10:28:19 +080057volatile int g_sta_watcher_started_flag = 0;
you.chen87ff5172022-05-06 11:30:57 +080058
qs.xiong336424d2023-07-06 21:16:20 +080059pthread_t g_sta_auto_watcher_pid = 0;
60volatile int g_sta_auto_watcher_stop_flag = 0;
61volatile int g_sta_auto_scan_finish_flag = 1;
62volatile int g_sta_auto_watcher_started_flag = 0;
you.chen87ff5172022-05-06 11:30:57 +080063void * g_ap_callback_priv = NULL;
64AP_CALLBACK_FUNC_PTR g_ap_callback_func = NULL;
65void * g_sta_callback_priv = NULL;
66STA_CALLBACK_FUNC_PTR g_sta_callback_func = NULL;
qs.xiong336424d2023-07-06 21:16:20 +080067void * g_sta_auto_callback_priv = NULL;
68STA_AUTO_CALLBACK_FUNC_PTR g_sta_auto_callback_func = NULL;
you.chen87ff5172022-05-06 11:30:57 +080069
70//const char * CTRL_PATH="/var/run/wpa_supplicant";
71const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/ap0"};
72//const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/wlan0"};
73const char * cmd_list_networks = "LIST_NETWORKS";
74const char * cmd_save_config = "SAVE_CONFIG";
you.chenc7357f22022-05-16 17:55:28 +080075const char * cmd_disconnect = "DISCONNECT";
76const char * cmd_remove_all = "REMOVE_NETWORK all";
you.chen87ff5172022-05-06 11:30:57 +080077const char * state_scan_result = "CTRL-EVENT-SCAN-RESULTS";
you.chen61c7aee2022-08-06 17:01:16 +080078const char * STATE_COMPLETED = "COMPLETED";
you.chen68e889d2023-06-01 16:39:54 +080079const char * STATE_DISCONNECTED = "DISCONNECTED";
you.chen87ff5172022-05-06 11:30:57 +080080
you.chen92668da2023-04-13 13:49:45 +080081const char * cmd_ping = "PING";
82const char * rsp_pong = "PONG";
83const int SLEEP_TIME_ON_IDLE = 100 * 1000; // usecond
84const int MAX_IDLE_COUNT = 600; // 60s
85
you.chencd882682023-04-24 15:39:37 +080086const char * start_wg870_service_script = "/etc/wg870/scripts/start_wg870_service.sh";
87const char * get_interface_name_script = "/etc/wg870/scripts/get_interface_name.sh";
88const char * start_stop_sta_script = "/etc/wg870/scripts/start_stop_sta.sh";
89const char * start_stop_ap_script = "/etc/wg870/scripts/start_stop_ap.sh";
90const char * sta_status_change_script = "/etc/wg870/scripts/sta_status_change.sh";
91
92static char s_ap_iterface_name[64] = {0};
93
you.chened802ab2023-02-13 10:50:35 +080094struct local_wpa_ctrl{
95 struct wpa_ctrl *ctrl;
96 pthread_mutex_t mutex;
97};
98
you.chenf9d718d2023-04-14 18:17:09 +080099
you.chened802ab2023-02-13 10:50:35 +0800100static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
you.chen68e889d2023-06-01 16:39:54 +0800101static pthread_mutex_t s_sta_callback_mutex = PTHREAD_MUTEX_INITIALIZER;
102static pthread_mutex_t s_ap_callback_mutex = PTHREAD_MUTEX_INITIALIZER;
qs.xiong336424d2023-07-06 21:16:20 +0800103// add for auto connect
104static pthread_mutex_t s_sta_auto_callback_mutex = PTHREAD_MUTEX_INITIALIZER;
you.chened802ab2023-02-13 10:50:35 +0800105
106static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
you.chen87ff5172022-05-06 11:30:57 +0800107
you.chen2ef1c552022-11-07 18:31:14 +0800108//you.chen add for tv-box start
109volatile int g_gbw_enabled = 0;
110char * g_gbw_mac = NULL;
111pthread_t g_gbw_watcher_pid = 0;
112static int startGBW();
113static int stopGBW();
114//you.chen add for tv-box end
you.chen87ff5172022-05-06 11:30:57 +0800115
116typedef struct __curr_status_info {
117 ap_info_s *ap;
118 char * state;
119 int net_no;
120}curr_status_info;
qs.xiong99b48d62022-04-07 05:41:29 -0400121
you.chenf9d718d2023-04-14 18:17:09 +0800122typedef enum {
123 INNER_STA_STATUS_INIT = 0,
124 INNER_STA_STATUS_CONNECTING,
125 INNER_STA_STATUS_ASSOCIATING,
126 INNER_STA_STATUS_ASSOCIATED,
127 INNER_STA_STATUS_CONNECTED,
128 INNER_STA_STATUS_DISCONNECTING,
129 INNER_STA_STATUS_DISCONNECTED,
130 INNER_STA_STATUS_CANCEL,
131}inner_sta_status_s;
132
133static pthread_cond_t s_global_check_cond = PTHREAD_COND_INITIALIZER;
134static pthread_mutex_t s_global_check_mutex = PTHREAD_MUTEX_INITIALIZER;
135static inner_sta_status_s s_sta_status = INNER_STA_STATUS_INIT;
136static error_number_s s_sta_error_number = -1;
137static char s_sta_current_connecting_ssid[64] = {0};
138static struct timespec s_sta_connect_timeout;
139const int MAX_CONNNECT_TIME = 15; // second
140pthread_t g_global_watcher_pid = 0;
141static int s_service_invoke_timeout_cnt=0;
142const int FAKE_MAX_INT_VALUE = 99999;
143
144static void notify_service_invoke_fail(int error)
145{
146 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
147 pthread_mutex_lock(&s_global_check_mutex);
148 if (error == -2) //timeout
149 {
150 s_service_invoke_timeout_cnt++;
151 if (s_service_invoke_timeout_cnt > 10)
152 {
153 pthread_cond_signal(&s_global_check_cond);
154 }
155 }
156 else if (error == -1)
157 {
158 // check if can connect wpa service
159 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[0]);
160 if (lynq_wpa_ctrl == NULL)
161 {
162 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
163 pthread_cond_signal(&s_global_check_cond);
164 }
165 wpa_ctrl_close(lynq_wpa_ctrl);
166 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[1]);
167 if (lynq_wpa_ctrl == NULL)
168 {
169 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
170 pthread_cond_signal(&s_global_check_cond);
171 }
172 wpa_ctrl_close(lynq_wpa_ctrl);
173 }
174
175 pthread_mutex_unlock(&s_global_check_mutex);
176}
177
you.chencd882682023-04-24 15:39:37 +0800178static int system_call_v(const char * fmt, ...)
179{
180 char str_cmd[256] = {0};
181 va_list args;
182 va_start(args, fmt);
183 vsprintf(str_cmd, fmt, args);
184 va_end(args);
185 printf("system call----------%s\n", str_cmd);
186 return system(str_cmd);
187}
188
you.chen377987d2023-05-10 15:56:26 +0800189static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
190
191static const char * inner_get_ap_interface_name()
192{
193 char * p;
194 char cmd[128]={0};
195
196 sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
197 if (0 != exec_cmd(cmd, s_ap_iterface_name, sizeof(s_ap_iterface_name)) || s_ap_iterface_name[0] == '\0')
198 {
199 memset(s_ap_iterface_name, 0, sizeof (s_ap_iterface_name));
200 return NULL;
201 }
202 p = strchr(s_ap_iterface_name, ' ');
203 if (NULL != p)
204 {
205 *p = '\0';
206 }
207 p = strchr(s_ap_iterface_name, '\n');
208 if (NULL != p)
209 {
210 *p = '\0';
211 }
212 if (s_ap_iterface_name[0] == '\0')
213 {
214 return NULL;
215 }
216
217 return s_ap_iterface_name;
218}
219
you.chenf9d718d2023-04-14 18:17:09 +0800220static void check_tether_and_notify()
221{
222 RLOGD("check_tether_and_notify called");
you.chen377987d2023-05-10 15:56:26 +0800223 if (inner_get_ap_interface_name() == NULL || 0 == system_call_v("ifconfig | grep %s", s_ap_iterface_name))
you.chenf9d718d2023-04-14 18:17:09 +0800224 {
225 return;
226 }
227 pthread_mutex_lock(&s_global_check_mutex);
228 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
229 pthread_cond_signal(&s_global_check_cond);
230 pthread_mutex_unlock(&s_global_check_mutex);
231}
232
you.chened802ab2023-02-13 10:50:35 +0800233static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
234 char *reply, size_t *reply_len,
235 void (*msg_cb)(char *msg, size_t len))
236{
237 int ret;
238 if (ctrl->ctrl == NULL) {
qs.xiongf1e48bb2023-03-28 13:38:22 +0800239 RLOGE("local_wpa_ctrl_request ctrl is null\n");
you.chened802ab2023-02-13 10:50:35 +0800240 return -1;
241 }
242 pthread_mutex_lock(&ctrl->mutex);
243 ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
244 pthread_mutex_unlock(&ctrl->mutex);
you.chenf9d718d2023-04-14 18:17:09 +0800245 if (ret != 0)
246 {
247 notify_service_invoke_fail(ret);
248 }
you.chened802ab2023-02-13 10:50:35 +0800249 return ret;
250}
251
252static struct local_wpa_ctrl * inner_get_wpa_ctrl(int index) {
253 int repeat_cnt;
254 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
255 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
qs.xiongf1e48bb2023-03-28 13:38:22 +0800256 RLOGD("inner_get_wpa_ctrl\n");
you.chened802ab2023-02-13 10:50:35 +0800257 for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
258 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
259// printf("wait enable finish\n");
260 usleep(500 * 1000);
261 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
262 }
263 if (NULL == g_lynq_wpa_ctrl[index]) {
qs.xiongf1e48bb2023-03-28 13:38:22 +0800264 RLOGE("NULL == g_lynq_wpa_ctrl[index]");
you.chened802ab2023-02-13 10:50:35 +0800265 goto out_addr;
266 }
267 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
268 g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
269 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
qs.xiongf1e48bb2023-03-28 13:38:22 +0800270 RLOGE("wpa_ctrl_open fail\n");
you.chened802ab2023-02-13 10:50:35 +0800271 goto out_addr;
272 }
273 pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
274 }
275 lynq_wpa_ctrl = g_lynq_wpa_ctrl[index];
276out_addr:
277 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
278 return lynq_wpa_ctrl;
279}
280
qs.xiong99b48d62022-04-07 05:41:29 -0400281#define PRINT_AND_RETURN_VALUE(str,value) \
qs.xiong99b48d62022-04-07 05:41:29 -0400282{\
you.chen87ff5172022-05-06 11:30:57 +0800283 perror((str));\
284 return (value);\
qs.xiong99b48d62022-04-07 05:41:29 -0400285}
286
you.chen87ff5172022-05-06 11:30:57 +0800287#define CHECK_IDX(idx, type) do { \
288 if ( (idx == LYNQ_WIFI_INTERFACE_0 && type != CTRL_STA) || (idx == LYNQ_WIFI_INTERFACE_1 && type != CTRL_AP) \
289 || idx < LYNQ_WIFI_INTERFACE_0 || idx > LYNQ_WIFI_INTERFACE_1 ) { \
qs.xiongf1e48bb2023-03-28 13:38:22 +0800290 RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
you.chen87ff5172022-05-06 11:30:57 +0800291 return -1; \
292 } \
293 }while (0)
294
295#define CHECK_WPA_CTRL(index) int ret = 0;\
296 size_t reply_len = MAX_RET; \
297 char cmd_reply[MAX_RET]={0}; \
you.chened802ab2023-02-13 10:50:35 +0800298 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
you.chen87ff5172022-05-06 11:30:57 +0800299 do{ \
you.chened802ab2023-02-13 10:50:35 +0800300 lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
301 if (NULL == lynq_wpa_ctrl) return -1; \
you.chen87ff5172022-05-06 11:30:57 +0800302 }while(0)
303
304#define DO_REQUEST(cmd_str) do { \
305 reply_len = MAX_RET;\
306 cmd_reply[0] = '\0'; \
qs.xiongf1e48bb2023-03-28 13:38:22 +0800307 RLOGD("to call [%s]\n", cmd_str); \
you.chened802ab2023-02-13 10:50:35 +0800308 ret = local_wpa_ctrl_request(lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL); \
you.chen87ff5172022-05-06 11:30:57 +0800309 if (ret != 0) { \
qs.xiongf1e48bb2023-03-28 13:38:22 +0800310 RLOGE("call "#cmd_str" fail %d\n", ret); \
you.chen87ff5172022-05-06 11:30:57 +0800311 return ret; \
312 } \
313 cmd_reply[reply_len+1] = '\0'; \
qs.xiongf1e48bb2023-03-28 13:38:22 +0800314 RLOGD("cmd replay [ %s ]\n", cmd_reply); \
you.chen87ff5172022-05-06 11:30:57 +0800315 }while(0)
316
317#define DO_OK_FAIL_REQUEST(cmd_str) do { \
318 DO_REQUEST(cmd_str); \
319 if (reply_len >=4 && memcmp(cmd_reply, "FAIL", 4) == 0 ) {\
qs.xiongf1e48bb2023-03-28 13:38:22 +0800320 RLOGE("cmd "#cmd_str" return FAIL\n"); \
you.chen87ff5172022-05-06 11:30:57 +0800321 return -1; \
322 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
qs.xiongf1e48bb2023-03-28 13:38:22 +0800323 RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
you.chen87ff5172022-05-06 11:30:57 +0800324 return -1; \
325 } \
326 }while (0)
327
328
you.chen92668da2023-04-13 13:49:45 +0800329static int check_connection(struct wpa_ctrl * wpa_ctrl)
330{
331 size_t reply_len = MAX_RET;
332 char cmd_reply[MAX_RET]={0};
333 int ret;
334
335 RLOGD("check_connection [%p]", wpa_ctrl);
336 ret = wpa_ctrl_request(wpa_ctrl, cmd_ping, strlen(cmd_ping), cmd_reply, &reply_len, NULL);
337
338 if (ret != 0 || reply_len < 4 || memcmp(cmd_reply, rsp_pong, 4) != 0)
339 {
340 RLOGE("check_connection error: ctrl [%p], ret [%d], reply_len [%d], rsp [%s]", wpa_ctrl, ret, reply_len, cmd_reply);
you.chenf9d718d2023-04-14 18:17:09 +0800341 if (ret != 0)
342 {
343 notify_service_invoke_fail(ret);
344 }
you.chen92668da2023-04-13 13:49:45 +0800345 return -1;
346 }
347
348 return 0;
349}
350
351/**
352 * @brief check_pending_msg
353 * @param lynq_wpa_ctrl
354 * @return 1 has msg, 0 no msg, -1 error
355 */
356static int check_pending_msg(struct wpa_ctrl ** pp_lynq_wpa_ctrl, int type, int* idle_count, int *started_flag)
357{
358 int ret;
359
360 if (*pp_lynq_wpa_ctrl == NULL) // need connect
361 {
362 *pp_lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[type]); //@todo temp change
363 if (*pp_lynq_wpa_ctrl == NULL)
364 {
365 usleep(SLEEP_TIME_ON_IDLE);
366 return -1;
367 }
368
369 ret = wpa_ctrl_attach(*pp_lynq_wpa_ctrl);
370 if (ret == 0) // attach success
371 {
372 *started_flag = 1;
373 }
374 else
375 {
you.chenf9d718d2023-04-14 18:17:09 +0800376 RLOGE("[wifi error]sta watch thread wpa_ctrl_attach fail");
you.chen92668da2023-04-13 13:49:45 +0800377 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
378 *pp_lynq_wpa_ctrl = NULL;
379 *idle_count = 0;
you.chenf9d718d2023-04-14 18:17:09 +0800380 notify_service_invoke_fail(-2);
you.chen92668da2023-04-13 13:49:45 +0800381 usleep(SLEEP_TIME_ON_IDLE);
382 return -1;
383 }
384 }
385
386 ret = wpa_ctrl_pending(*pp_lynq_wpa_ctrl);
387 if ( ret == 0) // no pending messages
388 {
389 usleep(SLEEP_TIME_ON_IDLE);
390 *idle_count += 1;
391 if (*idle_count > MAX_IDLE_COUNT)
392 {
393 if (check_connection(*pp_lynq_wpa_ctrl) != 0)
394 {
395 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
396 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
397 *pp_lynq_wpa_ctrl = NULL;
398 *idle_count = 0;
399 return -1;
400 }
401 *idle_count = 0;
402 }
403 return 0;
404 }
405 else if ( ret == -1) // on error
406 {
407 RLOGE("[wifi error]sta wpa_ctrl_pending");
408 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
409 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
410 *pp_lynq_wpa_ctrl = NULL;
411 *idle_count = 0;
you.chenf9d718d2023-04-14 18:17:09 +0800412 notify_service_invoke_fail(ret);
you.chen92668da2023-04-13 13:49:45 +0800413 return -1;
414 }
415
416 *idle_count = 0;
417 return 1;
418}
419
you.chen68e889d2023-06-01 16:39:54 +0800420static inline void inner_notify_ap_msg(lynq_wifi_ap_status_s status)
421{
422 pthread_mutex_lock(&s_ap_callback_mutex);
423 if (g_ap_callback_func != NULL)
424 g_ap_callback_func(g_ap_callback_priv, status);
425 pthread_mutex_unlock(&s_ap_callback_mutex);
426}
427
you.chen87ff5172022-05-06 11:30:57 +0800428static void APWatcherThreadProc() {
429 size_t len = MAX_RET;
430 char msg_notify[MAX_RET];
you.chen92668da2023-04-13 13:49:45 +0800431 int idle_count = 0;
you.chen87ff5172022-05-06 11:30:57 +0800432
you.chenc7357f22022-05-16 17:55:28 +0800433 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen01276462022-05-25 10:09:47 +0800434 g_ap_watcher_stop_flag = 0;
you.chen87ff5172022-05-06 11:30:57 +0800435
qs.xiongf1e48bb2023-03-28 13:38:22 +0800436 while (g_ap_watcher_stop_flag == 0)
437 {
you.chen92668da2023-04-13 13:49:45 +0800438 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_AP, &idle_count, &g_ap_watcher_started_flag) != 1)
439 {
you.chenf9d718d2023-04-14 18:17:09 +0800440 if (g_ap_callback_func != NULL && idle_count == MAX_IDLE_COUNT - 100 )
441 {
442 check_tether_and_notify();
443 }
444
you.chen87ff5172022-05-06 11:30:57 +0800445 continue;
446 }
you.chen92668da2023-04-13 13:49:45 +0800447
you.chenc7357f22022-05-16 17:55:28 +0800448 memset(msg_notify, 0, MAX_RET);
449 len = MAX_RET;
qs.xiongf1e48bb2023-03-28 13:38:22 +0800450 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
you.chen92668da2023-04-13 13:49:45 +0800451 {
you.chen87ff5172022-05-06 11:30:57 +0800452 msg_notify[len+1] = '\0';
qs.xiongaf960232023-04-12 11:40:02 +0800453 RLOGD("APWatcherThreadProc ap------> %s\n", msg_notify);
you.chen92668da2023-04-13 13:49:45 +0800454 //you.chen change for tv-box start
qs.xiongf1e48bb2023-03-28 13:38:22 +0800455 if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
you.chen92668da2023-04-13 13:49:45 +0800456 {
you.chen68e889d2023-06-01 16:39:54 +0800457 inner_notify_ap_msg(LYNQ_WIFI_STATUS_DISCONNECT);
qs.xiongf1e48bb2023-03-28 13:38:22 +0800458 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chen92668da2023-04-13 13:49:45 +0800459 {
qs.xiongf1e48bb2023-03-28 13:38:22 +0800460 RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
461 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chen92668da2023-04-13 13:49:45 +0800462 {
you.chen2ef1c552022-11-07 18:31:14 +0800463 stopGBW();
464 }
465 }
you.chen87ff5172022-05-06 11:30:57 +0800466 }
qs.xiongf1e48bb2023-03-28 13:38:22 +0800467 else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
you.chen92668da2023-04-13 13:49:45 +0800468 {
you.chen68e889d2023-06-01 16:39:54 +0800469 inner_notify_ap_msg(LYNQ_WIFI_STATUS_CONNECT);
qs.xiongf1e48bb2023-03-28 13:38:22 +0800470 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chen92668da2023-04-13 13:49:45 +0800471 {
qs.xiongf1e48bb2023-03-28 13:38:22 +0800472 RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
473 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chen92668da2023-04-13 13:49:45 +0800474 {
you.chen2ef1c552022-11-07 18:31:14 +0800475 startGBW();
476 }
477 }
you.chen87ff5172022-05-06 11:30:57 +0800478 }
qs.xiongb8d5d062023-07-11 18:54:40 +0800479 else if (strstr(msg_notify, "WoWLAN is enabled") != NULL || strstr(msg_notify, "Failed to start AP functionality") != NULL || strstr(msg_notify, "Could not connect to kernel driver") != NULL )
480 {
481 RLOGD("APWatcherThreadProc ap------> service error");
482 inner_notify_ap_msg(LYNQ_WIFI_SERVICE_ABNORMAL);
483 }
484 else
485 {
486 RLOGD("APWatcherThreadProc ap------> going on check next msg");
487 }
you.chen92668da2023-04-13 13:49:45 +0800488 //you.chen add for tv-box end
you.chen87ff5172022-05-06 11:30:57 +0800489 } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
490 } // end while (g_ap_watcher_stop_flag == 0)
qs.xiongf1e48bb2023-03-28 13:38:22 +0800491 if (lynq_wpa_ctrl != NULL)
492 {
you.chen01276462022-05-25 10:09:47 +0800493 wpa_ctrl_detach(lynq_wpa_ctrl);
494 wpa_ctrl_close(lynq_wpa_ctrl);
495 }
qs.xiong99b48d62022-04-07 05:41:29 -0400496}
497
qs.xiongbab8a1c2023-08-12 18:01:32 +0800498
499static void APTmpWatcherThreadProc() {
500
501 int i = 0;
502 g_ap_tmp_watcher_stop_flag = 0;
503 int delytimes = 1800;
504
505 RLOGD("APTmpWatcherThreadProc ----> ThreadProc start");
506 while(1)
507 {
508 sleep(1);
509 i++;
510 if( i == delytimes )
511 {
512 i = 0;
513 system("wl reinit");
514 RLOGD("APTmpWatcherThreadProc ----- > do cmd reinit");
515 }
qs.xiong998a93a2023-08-17 16:24:29 +0800516 if( g_ap_tmp_watcher_stop_flag == 1 )
qs.xiongbab8a1c2023-08-12 18:01:32 +0800517 {
518 RLOGD("APTmpWatcherThreadProc ----- > ap closed or wifi disabled");
519 return;
520 }
521 }
522
523}
524
525
you.chenf9d718d2023-04-14 18:17:09 +0800526static void inner_check_connect_error(const char * event_msg, lynq_wifi_sta_status_s state, error_number_s error_num)
527{
528 char * p;
529 const char * try_associat_flag = "Trying to associate";
530 const char * associated_flag = "Associated with ";
531
532 pthread_mutex_lock(&s_global_check_mutex);
533 if (s_sta_status < INNER_STA_STATUS_CONNECTING || s_sta_status >= INNER_STA_STATUS_CONNECTED) //not in connecting stage, egnore
534 {
535 pthread_mutex_unlock(&s_global_check_mutex);
536 return;
537 }
538
539 if (state == LYNQ_WIFI_STATUS_EGNORE)
540 {
541 if (strstr(event_msg, try_associat_flag) != NULL && strstr(event_msg, s_sta_current_connecting_ssid) != NULL) //associating request ssid
542 {
543 s_sta_status = INNER_STA_STATUS_ASSOCIATING;
544 }
545 else if (s_sta_status == INNER_STA_STATUS_ASSOCIATING && (p=strstr(event_msg, associated_flag)) != NULL)
546 {
547 s_sta_status = INNER_STA_STATUS_ASSOCIATED;
548 }
549 }
550 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
551 {
552 s_sta_error_number = error_num;
553 if (s_sta_status >= INNER_STA_STATUS_ASSOCIATING && strstr(event_msg, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL && error_num != LYNQ_WAIT_CONNECT_ACTIVE)
554 {
555 s_sta_status = INNER_STA_STATUS_DISCONNECTED;
556 pthread_cond_signal(&s_global_check_cond);
557 }
558 }
559 else if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
560 {
561 s_sta_status = INNER_STA_STATUS_CONNECTED;
562 pthread_cond_signal(&s_global_check_cond);
563 }
564 pthread_mutex_unlock(&s_global_check_mutex);
565}
566
qs.xiong7d712732023-06-29 17:29:39 +0800567static int lynq_wifi_sta_stop_network(lynq_wifi_index_e idx,int networkid)
568{
569 char LYNQ_DISABLE_CMD[128]={0};
570
571 CHECK_IDX(idx, CTRL_STA);
572 CHECK_WPA_CTRL(CTRL_STA);
573
574 sprintf(LYNQ_DISABLE_CMD,"DISABLE_NETWORK %d",networkid);
575 RLOGD("LYNQ_DISABLE_CMD is:%d\n",LYNQ_DISABLE_CMD);
576 DO_OK_FAIL_REQUEST(LYNQ_DISABLE_CMD);
577
578 return 0;
579
580}
581
582
qs.xiongaf960232023-04-12 11:40:02 +0800583void get_state_error(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error)
584{
585 char *pReason;
qs.xiong7d712732023-06-29 17:29:39 +0800586 char *wpanetid;
587 char destid[3] = {0};
588 int tmpdisid = -1;
qs.xiongaf960232023-04-12 11:40:02 +0800589 *error = LYNQ_WAIT_CONNECT_ACTIVE;
590 if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
591 {
592 *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
593 RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d\n",*state,*error);
594 return;
595 }
596
597 if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
598 {
599 *state = LYNQ_WIFI_STA_STATUS_CONNECT;
600 RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
601 return;
602 }
603
604 if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
605 {
qs.xiong7d712732023-06-29 17:29:39 +0800606 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
607 wpanetid = strstr(modify,"id=");
608 if ( wpanetid != NULL )
609 {
610 wpanetid +=strlen("id=");
611 memcpy(destid,wpanetid,2);
612 tmpdisid = atoi(destid);
613
614 }
qs.xiongaf960232023-04-12 11:40:02 +0800615 pReason = strstr(modify, "reason=");
616 if (pReason != NULL)
617 {
618 pReason += strlen("reason=");
619 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
620 {
621 *error = LYNQ_TIME_OUT;
622 }
623 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
624 {
625 *error = LYNQ_PSW_ERROR;
qs.xiong7d712732023-06-29 17:29:39 +0800626 // tmp fix sta autoconnect connect and disconnect
627 if(tmpdisid != -1 && lynq_wifi_sta_stop_network(0,tmpdisid) != 0)
628 {
629 RLOGE("stop wlan0 network %d fail",tmpdisid);
630 }
qs.xiongaf960232023-04-12 11:40:02 +0800631 }
632 else
633 {
634 *error = LYNQ_UNSPECIFIED_REASON;
635 }
qs.xiongaf960232023-04-12 11:40:02 +0800636 }
637 else
638 {
639 *error = LYNQ_UNSPECIFIED_REASON;
qs.xiongaf960232023-04-12 11:40:02 +0800640 }
qs.xiong7d712732023-06-29 17:29:39 +0800641 RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d,tmpnetid:%d",*state,*error,tmpdisid);
642 return;
qs.xiongaf960232023-04-12 11:40:02 +0800643
644 }
645
646 if (strstr(modify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
647 {
648 *error = LYNQ_NOT_FIND_AP;
649 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
650 RLOGD("CTRL-EVENT-NETWORK-NOT-FOUND state:%d,error:%d\n",*state,*error);
651 return;
652 }
653
654
655 if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
656 {
657 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
658 pReason = strstr(modify, "status_code=");
659 if (pReason != NULL)
660 {
661 pReason += strlen("status_code=");
662 if (memcmp(pReason, "17", 2) == 0)
663 {
664 *error = LYNQ_AP_UNABLE_HANDLE;
665 }
666 else if (memcmp(pReason, "1",1) == 0)
667 {
668 *error = LYNQ_UNSPECIFIED_REASON;
669 }
670 else
671 {
672 *error = LYNQ_UNSPECIFIED_REASON;
673 }
674
675 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
676 RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d\n",*state,*error);
677 return;
678 }
679 else
680 {
681 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
682 *error = LYNQ_UNSPECIFIED_REASON;
683 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
684 RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d\n",*state,*error);
685 return;
686 }
687 }
688
689 if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
690 {
691 RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
692 *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
693 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
694 RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d\n",*state,*error);
695 return;
696 }
697
698 if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
699 {
700 RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
701 *error = LYNQ_WAIT_CONNECT_ACTIVE;
702 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
703 RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
704 return;
705 }
706
you.chen4ca39eb2023-04-13 14:05:45 +0800707 RLOGD("EVENT : %s\n", modify);
qs.xiongaf960232023-04-12 11:40:02 +0800708 *error = LYNQ_UNSPECIFIED_REASON;
you.chen4ca39eb2023-04-13 14:05:45 +0800709 *state = LYNQ_WIFI_STATUS_EGNORE;
qs.xiongaf960232023-04-12 11:40:02 +0800710 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
711 return;
712
713}
714
qs.xiong336424d2023-07-06 21:16:20 +0800715void get_state_error_networkid(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error,int *networkid)
716{
717 char *pReason;
718 char *wpanetid;
719 char destid[3];
720 *error = LYNQ_WAIT_CONNECT_ACTIVE;
721 *networkid = -1;
722 if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
723 {
724 *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
725 RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d,,networkid:%d\n",*state,*error,*networkid);
726 return;
727 }
728 if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
729 {
730 RLOGD("[xiong]:wpanetid = strstrmodify;\n");
731 wpanetid = strstr(modify,"id=");
732 if ( wpanetid != NULL )
733 {
734 wpanetid +=strlen("id=");
735 RLOGD("[xiong]:memcpy(destid,wpanetid,0\n");
736 if (memcpy(destid,wpanetid,2) != NULL)
737 {
738 RLOGD("[xiong]:memcpy(destid,wpanetid,1\n");
739 *networkid = atoi(destid);
740 RLOGD("get networkid is %d\n",*networkid);
741 }
742 RLOGD("[xiong]:memcpy(destid,wpanetid,2\n");
743 }
744 *state = LYNQ_WIFI_STA_STATUS_CONNECT;
745 RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d,networkid:%d\n",*state,*error,*networkid);
746 return;
747 }
748 if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
749 {
750 wpanetid = strstr(modify,"id=");
751 if ( wpanetid != NULL )
752 {
753 wpanetid +=strlen("id=");
754 if (memcpy(destid,wpanetid,2) != NULL)
755 {
756 *networkid = atoi(destid);
757 RLOGD("get networkid is %d\n",*networkid);
758 }
759 }
760 pReason = strstr(modify, "reason=");
761 if (pReason != NULL)
762 {
763 pReason += strlen("reason=");
764 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
765 {
766 *error = LYNQ_TIME_OUT;
767 }
768 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
769 {
770 *error = LYNQ_PSW_ERROR;
771 }
772 else
773 {
774 *error = LYNQ_UNSPECIFIED_REASON;
775 }
776 *state = LYNQ_WIFI_STA_STATUS_CONNECT_FAIL;
777 RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d,networkid:%d\n",*state,*error,*networkid);
778 return;
779 }
780 else
781 {
782 *error = LYNQ_UNSPECIFIED_REASON;
783 *state = LYNQ_WIFI_STA_STATUS_CONNECT_FAIL;
784 return;
785 }
786 }
787 if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
788 {
789 wpanetid = strstr(modify,"id=");
790 if ( wpanetid != NULL )
791 {
792 wpanetid +=strlen("id=");
793 if (memcpy(destid,wpanetid,2) != NULL)
794 {
795 *networkid = atoi(destid);
796 RLOGD("get networkid is %d\n",*networkid);
797 }
798 }
799 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
800 pReason = strstr(modify, "status_code=");
801 if (pReason != NULL)
802 {
803 pReason += strlen("status_code=");
804 if (memcmp(pReason, "17", 2) == 0)
805 {
806 *error = LYNQ_AP_UNABLE_HANDLE;
807 }
808 else if (memcmp(pReason, "1",1) == 0)
809 {
810 *error = LYNQ_UNSPECIFIED_REASON;
811 }
812 else
813 {
814 *error = LYNQ_UNSPECIFIED_REASON;
815 }
816 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
817 RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d,networkid:%d\n",*state,*error,*networkid);
818 return;
819 }
820 else
821 {
822 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
823 *error = LYNQ_UNSPECIFIED_REASON;
824 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
825 RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d£¬networkid:%d\n",*state,*error,*networkid);
826 return;
827 }
828 }
829 if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
830 {
831 RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
832 *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
833 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
834 RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d,networkid:%d\n",*state,*error,*networkid);
835 return;
836 }
837 if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
838 {
839 RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
840 *error = LYNQ_WAIT_CONNECT_ACTIVE;
841 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
842 RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d,networkid:%d\n",*state,*error,*networkid);
843 return;
844 }
845 RLOGD("EVENT : %s\n", modify);
846 *error = LYNQ_UNSPECIFIED_REASON;
847 *state = LYNQ_WIFI_STATUS_EGNORE;
848 RLOGD("LAST : STA state:%d,error:%d,network:%d\n",*state,*error,*networkid);
849 return;
850}
you.chenf9d718d2023-04-14 18:17:09 +0800851static void notify_connect_status(lynq_wifi_sta_status_s state, error_number_s error)
852{
you.chen68e889d2023-06-01 16:39:54 +0800853 pthread_mutex_lock(&s_sta_callback_mutex);
you.chenf9d718d2023-04-14 18:17:09 +0800854 if (g_sta_callback_func != NULL && state != LYNQ_WIFI_STATUS_EGNORE)
855 {
856 RLOGD("STAWatcherThreadProc callback begin ------> %d %d\n", state, error);
857 g_sta_callback_func(g_sta_callback_priv, state, error);
858 RLOGD("STAWatcherThreadProc callback end ------> %d %d\n", state, error);
859 }
you.chen68e889d2023-06-01 16:39:54 +0800860 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chenf9d718d2023-04-14 18:17:09 +0800861}
qs.xiong336424d2023-07-06 21:16:20 +0800862static void notify_auto_connect_status(lynq_wifi_sta_status_s state, error_number_s error,int networkid)
863{
864 pthread_mutex_lock(&s_sta_callback_mutex);
865 if (g_sta_callback_func != NULL && state != LYNQ_WIFI_STATUS_EGNORE)
866 {
867 RLOGD("STAWatcherThreadProc callback begin ------> %d %d %d\n", state, error,networkid);
868 g_sta_auto_callback_func(g_sta_auto_callback_priv, state, error,networkid);
869 RLOGD("STAAutoWatcherThreadProc callback end ------> %d %d %d\n", state, error,networkid);
870 }
871 pthread_mutex_unlock(&s_sta_callback_mutex);
872}
you.chenf9d718d2023-04-14 18:17:09 +0800873
you.chen87ff5172022-05-06 11:30:57 +0800874static void STAWatcherThreadProc() {
875 size_t len = MAX_RET;
876 char msg_notify[MAX_RET];
you.chen87ff5172022-05-06 11:30:57 +0800877 error_number_s error;
you.chencd882682023-04-24 15:39:37 +0800878 lynq_wifi_sta_status_s state, last_state = -1;
you.chen92668da2023-04-13 13:49:45 +0800879 int idle_count = 0;
qs.xiongd189c542022-03-31 00:58:23 -0400880
you.chenc7357f22022-05-16 17:55:28 +0800881 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen01276462022-05-25 10:09:47 +0800882 g_sta_watcher_stop_flag = 0;
you.chen87ff5172022-05-06 11:30:57 +0800883
you.chenf9d718d2023-04-14 18:17:09 +0800884 RLOGD("STAWatcherThreadProc thread started ------");
qs.xiongf1e48bb2023-03-28 13:38:22 +0800885 while (g_sta_watcher_stop_flag == 0)
886 {
you.chen92668da2023-04-13 13:49:45 +0800887 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
qs.xiongaf960232023-04-12 11:40:02 +0800888 {
you.chen87ff5172022-05-06 11:30:57 +0800889 continue;
890 }
you.chen92668da2023-04-13 13:49:45 +0800891
you.chenc7357f22022-05-16 17:55:28 +0800892 memset(msg_notify, 0, MAX_RET);
893 len = MAX_RET;
qs.xiongf1e48bb2023-03-28 13:38:22 +0800894 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiongaf960232023-04-12 11:40:02 +0800895 {
you.chen87ff5172022-05-06 11:30:57 +0800896 msg_notify[len+1] = '\0';
qs.xiongf1e48bb2023-03-28 13:38:22 +0800897 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
898 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiongaf960232023-04-12 11:40:02 +0800899 {
you.chen87ff5172022-05-06 11:30:57 +0800900 g_sta_scan_finish_flag = 1;
901 }
902
qs.xiongf1e48bb2023-03-28 13:38:22 +0800903 if (g_sta_callback_func == NULL)
qs.xiongaf960232023-04-12 11:40:02 +0800904 {
you.chen87ff5172022-05-06 11:30:57 +0800905 continue;
906 }
qs.xiongaf960232023-04-12 11:40:02 +0800907 get_state_error(msg_notify,&state,&error);
you.chenf9d718d2023-04-14 18:17:09 +0800908 notify_connect_status(state, error);
909
910 if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
you.chen4ca39eb2023-04-13 14:05:45 +0800911 {
you.chenf9d718d2023-04-14 18:17:09 +0800912 inner_check_connect_error(msg_notify, state, error);
you.chencd882682023-04-24 15:39:37 +0800913 if (last_state != state)
914 {
915 if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
916 {
917 system_call_v("%s %s", sta_status_change_script, "connect");
918 }
919 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
920 {
921 system_call_v("%s %s", sta_status_change_script, "disconnect");
922 }
923 }
924
925 last_state = state;
you.chen4ca39eb2023-04-13 14:05:45 +0800926 }
you.chen87ff5172022-05-06 11:30:57 +0800927 }
928 }
qs.xiongf1e48bb2023-03-28 13:38:22 +0800929 if (lynq_wpa_ctrl != NULL)
930 {
you.chen01276462022-05-25 10:09:47 +0800931 wpa_ctrl_detach(lynq_wpa_ctrl);
932 wpa_ctrl_close(lynq_wpa_ctrl);
933 }
qs.xiongd189c542022-03-31 00:58:23 -0400934}
qs.xiong336424d2023-07-06 21:16:20 +0800935static void STAAutoWatcherThreadProc() {
936 size_t len = MAX_RET;
937 char msg_notify[MAX_RET];
938 error_number_s error;
939 lynq_wifi_sta_status_s state, last_state = -1;
940 int idle_count = 0;
941 int networkid;
942 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
943 g_sta_auto_watcher_stop_flag = 0;
944 RLOGD("STAAutoWatcherThreadProc thread started ------");
945 while (g_sta_auto_watcher_stop_flag == 0)
946 {
947 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_auto_watcher_started_flag) != 1)
948 {
949 continue;
950 }
951 memset(msg_notify, 0, MAX_RET);
952 len = MAX_RET;
953 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
954 {
955 msg_notify[len+1] = '\0';
956 RLOGD("STAAutoWatcherThreadProc sta ------> %s\n", msg_notify);
957 if (strstr(msg_notify, state_scan_result) != NULL)
958 {
959 g_sta_auto_scan_finish_flag = 1;
960 }
961 if (g_sta_auto_callback_func == NULL)
962 {
963 continue;
964 }
965 get_state_error_networkid(msg_notify,&state,&error,&networkid); // add net state error network function
966 notify_auto_connect_status(state, error,networkid);
967 if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
968 {
969 inner_check_connect_error(msg_notify, state, error);
970 if (last_state != state)
971 {
972 if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
973 {
974 system_call_v("%s %s", sta_status_change_script, "connect");
975 }
976 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
977 {
978 system_call_v("%s %s", sta_status_change_script, "disconnect");
979 }
980 }
981 last_state = state;
982 }
983 }
984 }
985 if (lynq_wpa_ctrl != NULL)
986 {
987 wpa_ctrl_detach(lynq_wpa_ctrl);
988 wpa_ctrl_close(lynq_wpa_ctrl);
989 }
990}
qs.xiongd189c542022-03-31 00:58:23 -0400991
you.chenf9d718d2023-04-14 18:17:09 +0800992// this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
993static void GlobalWatcherThreadProc()
994{
995 int ret, connect_timeout, service_abnormal;
996 error_number_s error_num = -1;
997 inner_sta_status_s sta_status;
998 scan_info_s *scan_list = NULL;
999 int i, scan_len=0;
1000 char connecting_ssid[64];
1001 struct timeval now;
1002
1003 RLOGD("GlobalWatcherThreadProc start to run");
1004
1005 while (1)
1006 {
1007 pthread_mutex_lock(&s_global_check_mutex);
1008 pthread_cond_wait(&s_global_check_cond,&s_global_check_mutex);
1009 if (s_sta_status == INNER_STA_STATUS_CONNECTED)
1010 {
1011 pthread_mutex_unlock(&s_global_check_mutex);
1012 usleep(50*1000);
1013 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
1014 continue;
1015 }
1016
1017 connect_timeout = 0;
1018 service_abnormal = 0;
1019 if (s_sta_status >= INNER_STA_STATUS_CONNECTING && s_sta_status < INNER_STA_STATUS_CONNECTED)
1020 {
1021 while (1)
1022 {
1023 ret = pthread_cond_timedwait(&s_global_check_cond, &s_global_check_mutex, &s_sta_connect_timeout);
1024 if (ret == ETIME)
1025 {
1026 connect_timeout = 1;
1027 }
1028 else if (ret != 0)
1029 {
1030 gettimeofday(&now,NULL);
1031 if (now.tv_sec < s_sta_connect_timeout.tv_sec) //time not arrive
1032 {
1033 usleep(SLEEP_TIME_ON_IDLE);
1034 continue;
1035 }
1036 connect_timeout = 1;
1037 }
1038 sta_status = s_sta_status;
1039 error_num = s_sta_error_number;
1040 s_sta_status = INNER_STA_STATUS_INIT;
1041 strcpy(connecting_ssid, s_sta_current_connecting_ssid);
1042 memset(&s_sta_connect_timeout, 0, sizeof (s_sta_connect_timeout));
1043 memset(&s_sta_current_connecting_ssid, 0, sizeof (s_sta_current_connecting_ssid));
1044 break;
1045 }
1046 }
1047 if (s_service_invoke_timeout_cnt > 10)
1048 {
1049 service_abnormal = 1;
1050 s_service_invoke_timeout_cnt = 0;
1051 }
1052 pthread_mutex_unlock(&s_global_check_mutex);
1053
1054 if (service_abnormal == 1)
1055 {
1056 sleep(1);
1057 RLOGE("wpa service is abnormal info app to exit");
1058 notify_connect_status(LYNQ_WIFI_STA_SERVICE_ABNORMAL, -1);
you.chen68e889d2023-06-01 16:39:54 +08001059
1060 inner_notify_ap_msg(LYNQ_WIFI_SERVICE_ABNORMAL);
1061
you.chenf9d718d2023-04-14 18:17:09 +08001062 sleep(FAKE_MAX_INT_VALUE); // wait process to exit
1063 }
1064
1065 if (sta_status == INNER_STA_STATUS_CANCEL)
1066 {
1067 continue;
1068 }
1069 else if (sta_status == INNER_STA_STATUS_CONNECTED)
1070 {
1071 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
1072 }
1073 else if (connect_timeout == 0 && error_num == LYNQ_NOT_FIND_AP) // not found ap maybe mismatch auth
1074 {
1075 if (0 == lynq_get_scan_list(0, &scan_list, &scan_len) && NULL != scan_list) // if not found, but scan result exist, maybe auth error
1076 {
1077 for(i=0; i < scan_len;i++)
1078 {
1079 if (strcmp(scan_list[i].ssid, connecting_ssid) == 0)
1080 {
1081 error_num = LYNQ_AUTH_ERROR;
1082 break;
1083 }
1084 }
1085 free(scan_list);
1086 }
1087 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
1088 }
1089 else if (connect_timeout == 0)
1090 {
1091 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
1092 }
1093 else // wait timeout
1094 {
1095 if (0 != lynq_get_sta_status(LYNQ_WIFI_INTERFACE_0, &sta_status)) // get status fail
1096 {
1097 ; // wpa service abnormal
1098 }
1099 else if (sta_status == LYNQ_WIFI_STA_STATUS_ENABLE) // connect ok
1100 {
1101 RLOGD("GlobalWatcherThreadProc notify connected");
1102 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
1103 }
1104 else
1105 {
1106 RLOGD("GlobalWatcherThreadProc notify timeout");
1107 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, LYNQ_TIME_OUT);
1108 }
1109 }
1110 } // while (1)
1111}
1112
qs.xiong799dab02022-03-14 09:12:12 -04001113int lynq_wifi_enable(void)
1114{
you.chen87ff5172022-05-06 11:30:57 +08001115 int ret = 0;
you.chenc7357f22022-05-16 17:55:28 +08001116 int i;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001117 RLOGD("enter lynq_wifi_enable");
you.chened802ab2023-02-13 10:50:35 +08001118 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
1119
qs.xiongf1e48bb2023-03-28 13:38:22 +08001120 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
1121 {
you.chened802ab2023-02-13 10:50:35 +08001122 goto out_enable;
1123 }
1124
you.chencd882682023-04-24 15:39:37 +08001125 ret = system(start_wg870_service_script);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001126 if (ret != 0)
1127 {
1128 //printf("service state %d\n", ret);
1129 RLOGE("[wifi error]service state %d",ret);
you.chened802ab2023-02-13 10:50:35 +08001130 ret = -1;
1131 goto out_enable;
you.chen87ff5172022-05-06 11:30:57 +08001132 }
lhb29aec32022-10-11 18:55:36 +08001133
you.chenf9d718d2023-04-14 18:17:09 +08001134 if (g_global_watcher_pid == 0 ) // this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
1135 {
1136 ret=pthread_create(&g_global_watcher_pid,NULL,GlobalWatcherThreadProc,NULL);
1137 if(ret<0)
1138 {
1139 RLOGE("[wifi error]creat GlobalWatcherThreadProc fail");
1140 ret = -1;
1141 goto out_enable;
1142 }
1143 }
1144
you.chened802ab2023-02-13 10:50:35 +08001145 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
1146 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
1147 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
1148 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
1149out_enable:
1150 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen87ff5172022-05-06 11:30:57 +08001151 return ret;
qs.xiong8d42bb92022-03-02 09:43:11 -05001152}
1153
qs.xiong799dab02022-03-14 09:12:12 -04001154int lynq_wifi_disable(void)
1155{
qs.xiongf1e48bb2023-03-28 13:38:22 +08001156 RLOGD("enter lynq_wifi_disable");
you.chened802ab2023-02-13 10:50:35 +08001157 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen87ff5172022-05-06 11:30:57 +08001158 g_ap_watcher_stop_flag = 1;
1159 g_sta_watcher_stop_flag = 1;
qs.xiong336424d2023-07-06 21:16:20 +08001160 g_sta_auto_watcher_stop_flag = 1;
qs.xiongbab8a1c2023-08-12 18:01:32 +08001161 g_ap_tmp_watcher_stop_flag = 1;
you.chen87ff5172022-05-06 11:30:57 +08001162 if (g_ap_watcher_pid != 0)
1163 pthread_join(g_ap_watcher_pid, NULL);
1164 if (g_sta_watcher_pid != 0)
1165 pthread_join(g_sta_watcher_pid, NULL);
qs.xiong336424d2023-07-06 21:16:20 +08001166 if (g_sta_auto_watcher_pid != 0)
1167 pthread_join(g_sta_auto_watcher_pid, NULL);
qs.xiongbab8a1c2023-08-12 18:01:32 +08001168 if (g_ap_tmp_watcher_pid != 0)
1169 pthread_join(g_ap_tmp_watcher_pid, NULL);
you.chen87ff5172022-05-06 11:30:57 +08001170 if (g_lynq_wpa_ctrl[0] != NULL)
1171 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
1172 if (g_lynq_wpa_ctrl[1] != NULL)
1173 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
1174 g_ap_watcher_pid = 0;
1175 g_sta_watcher_pid = 0;
qs.xiong336424d2023-07-06 21:16:20 +08001176 g_sta_auto_watcher_pid = 0;
qs.xiongbab8a1c2023-08-12 18:01:32 +08001177 g_ap_tmp_watcher_pid = 0;
you.chen87ff5172022-05-06 11:30:57 +08001178 g_lynq_wpa_ctrl[0] = NULL;
1179 g_lynq_wpa_ctrl[1] = NULL;
1180 system("systemctl stop wg870_drv_insmod.service");
you.chened802ab2023-02-13 10:50:35 +08001181 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
1182 return 0;
1183}
1184
1185static inline char inner_convert_char(char in)
1186{
1187 if (in >= '0' && in <= '9')
1188 {
1189 return in - '0';
1190 }
1191 else if (in >= 'a' && in <= 'f')
1192 {
1193 return in - 'a' + 10;
1194 }
1195 else if (in >= 'A' && in <= 'F')
1196 {
1197 return in - 'A' + 10;
1198 }
1199 else
1200 {
1201 return '\xff';
1202 }
1203}
1204
1205static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
1206{
1207 char *p;
1208 size_t pos = 0;
1209 if (NULL == out_ssid)
1210 return;
1211 //printf("input ssid=[%s]\n", ssid);
1212 memset(out_ssid, 0, out_ssid_len);
1213 if (NULL == ssid)
1214 return;
1215 p = strchr(ssid, '\\');
1216 if (NULL == p)
1217 {
1218 strncpy(out_ssid, ssid, out_ssid_len);
1219 //printf(" first %s\n", out_ssid);
1220 }
1221 else
1222 {
1223 pos = p - ssid;
1224 memcpy(out_ssid, ssid, pos);
1225 //printf("pos %lu -- %s\n", pos, out_ssid);
1226 for(; pos < out_ssid_len; pos ++)
1227 {
1228 if (p[0] == '\0')
1229 {
1230 //printf(" out %s\n", out_ssid);
1231 return;
1232 }
1233 else if (p[0] != '\\')
1234 {
1235 out_ssid[pos] = p[0];
1236 p += 1;
1237 }
1238 else if (p[1] == 'x' || p[1] == 'X')
1239 {
1240 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
1241 p += 4;
1242 }
1243 else if (p[1] == '\\')
1244 {
1245 out_ssid[pos] = '\\';
1246 p += 2;
1247 }
1248 else if (p[1] == 't')
1249 {
1250 out_ssid[pos] = '\t';
1251 p += 2;
1252 }
1253 else if (p[1] == 'r')
1254 {
1255 out_ssid[pos] = '\r';
1256 p += 2;
1257 }
1258 else if (p[1] == 'n')
1259 {
1260 out_ssid[pos] = '\n';
1261 p += 2;
1262 }//todo find a better way to convert?
1263 }
1264 }
1265 //printf(" out %s\n", out_ssid);
qs.xiong8d42bb92022-03-02 09:43:11 -05001266}
qs.xiong799dab02022-03-14 09:12:12 -04001267
you.chen87ff5172022-05-06 11:30:57 +08001268static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chened802ab2023-02-13 10:50:35 +08001269 int i, ssid_len;
you.chen87ff5172022-05-06 11:30:57 +08001270 char lynq_cmd_get[128]={0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08001271 RLOGD("enter inner_get_param");
1272 if (out_put == NULL)
1273 {
1274 RLOGE("output ptr is null");
you.chen87ff5172022-05-06 11:30:57 +08001275 return -1;
1276 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001277 if (param_name == NULL)
1278 {
1279 RLOGE("param ptr is null");
you.chen87ff5172022-05-06 11:30:57 +08001280 return -1;
1281 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001282 if (param_name[0] == '\0')
1283 {
1284 RLOGE("param is empty");
you.chen87ff5172022-05-06 11:30:57 +08001285 return -1;
1286 }
1287
1288 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
1289
1290 CHECK_WPA_CTRL(interface);
1291
1292 DO_REQUEST(lynq_cmd_get);
1293
qs.xiongf1e48bb2023-03-28 13:38:22 +08001294 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1295 {
1296 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen87ff5172022-05-06 11:30:57 +08001297 return -1;
1298 }
1299
you.chen6a9361d2022-05-18 10:28:19 +08001300// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chened802ab2023-02-13 10:50:35 +08001301 if (strcmp(param_name, "ssid") == 0)
1302 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001303 if (cmd_reply[0] == '\"')
1304 {
you.chened802ab2023-02-13 10:50:35 +08001305 ssid_len = reply_len - 1;
1306 memcpy(out_put, cmd_reply + 1, ssid_len);
1307 if (out_put[ssid_len-1] == '\"')
1308 {
1309 out_put[ssid_len-1] = '\0';
1310 }
1311 else
1312 {
1313 out_put[ssid_len] = '\0';
1314 }
1315 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001316 else
1317 {
you.chened802ab2023-02-13 10:50:35 +08001318 ssid_len = reply_len / 2;
1319 for(i=0; i<ssid_len; i++)
1320 {
1321 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
1322 }
1323 out_put[ssid_len] = '\0';
1324 }
1325 }
1326 else
1327 {
1328 memcpy(out_put, cmd_reply, reply_len + 1);
1329 }
you.chen87ff5172022-05-06 11:30:57 +08001330 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05001331}
qs.xiong799dab02022-03-14 09:12:12 -04001332
you.chen87ff5172022-05-06 11:30:57 +08001333static int lynq_split(char * str, int len, char delimiter, char * results[]) {
1334 int ret = 0;
1335 char * end = str + len - 1;
1336 results[ret++] = str;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001337 while(str < end)
1338 {
1339 if (*str == delimiter)
1340 {
you.chen87ff5172022-05-06 11:30:57 +08001341 *str++ = '\0';
1342 results[ret++] = str;
1343 continue;
1344 }
1345 str++;
1346 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001347 if (*str == delimiter)
1348 {
you.chen87ff5172022-05-06 11:30:57 +08001349 *str = '\0';
1350 }
qs.xiong799dab02022-03-14 09:12:12 -04001351
you.chen7bf12432023-04-27 17:51:56 +08001352 results[ret] = NULL;
1353
you.chen87ff5172022-05-06 11:30:57 +08001354 return ret;
qs.xiong8d42bb92022-03-02 09:43:11 -05001355}
1356
you.chened802ab2023-02-13 10:50:35 +08001357static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
1358{
1359 char * p;
1360 int ret = 0;
1361 char cmd[256]={0};
1362 if (NULL == mac || NULL == ip)
you.chen87ff5172022-05-06 11:30:57 +08001363 return -1;
you.chened802ab2023-02-13 10:50:35 +08001364 memset(ip, 0, ip_len);
qs.xiong32659e62023-07-05 19:17:34 +08001365 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | awk '{print $1}' | grep -v \":\" | head -1", mac);
you.chened802ab2023-02-13 10:50:35 +08001366 ret = exec_cmd(cmd, ip, ip_len);
1367 p = strchr(ip, '\n');
1368 if (NULL != p)
1369 {
1370 *p = '\0';
you.chen87ff5172022-05-06 11:30:57 +08001371 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001372 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen87ff5172022-05-06 11:30:57 +08001373 return ret;
1374}
1375
you.chened802ab2023-02-13 10:50:35 +08001376static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen87ff5172022-05-06 11:30:57 +08001377 struct in_addr addr ={0};
1378 struct hostent *ht;
you.chen57eb5842023-05-18 14:19:46 +08001379 char cmd[64] = {0};
1380 char * p;
1381 int ret;
you.chen87ff5172022-05-06 11:30:57 +08001382
qs.xiongf1e48bb2023-03-28 13:38:22 +08001383 if (ip == NULL || *ip == '\0' || hostname == NULL)
1384 {
1385 RLOGE("ip == NULL or hostname == NULL");
1386 return -1;
you.chen87ff5172022-05-06 11:30:57 +08001387 }
1388
you.chened802ab2023-02-13 10:50:35 +08001389 *hostname = '\0';
qs.xiongf1e48bb2023-03-28 13:38:22 +08001390 if (inet_aton(ip, &addr) == 0)
1391 {
you.chen87ff5172022-05-06 11:30:57 +08001392 printf("---inet_aton fail\n");
1393 return -1;
1394 }
1395
1396 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
1397
qs.xiongf1e48bb2023-03-28 13:38:22 +08001398 if (ht == NULL)
1399 {
you.chen57eb5842023-05-18 14:19:46 +08001400 hostname[0] = '\0';
1401 sprintf(cmd, "grep -F '%s' /run/wg870/ap0.lease | awk '{print $4}' | tail -1", ip);
1402 ret = exec_cmd(cmd, hostname, 32);
1403 if (ret == 0)
1404 {
1405 p = strchr(hostname, '\n');
1406 if (p != NULL)
1407 {
1408 *p = '\0';
1409 }
1410 return 0;
qs.xiong3ec6b1b2023-07-26 17:09:22 +08001411 }else{
1412 usleep( 10 * 1000);
1413 ret = exec_cmd(cmd, hostname, 32);
1414 if( ret == 0)
1415 {
1416 p= strchr(hostname, '\n');
1417 if(p != NULL )
1418 {
1419 *p = '\0';
1420 }
1421 return 0;
1422 }
you.chen57eb5842023-05-18 14:19:46 +08001423 }
1424 hostname[0] = '\0';
qs.xiongf1e48bb2023-03-28 13:38:22 +08001425 RLOGE("---gethostbyaddr fail\n");
you.chen87ff5172022-05-06 11:30:57 +08001426 herror(NULL);
1427 return -1;
1428 }
1429
1430 strcpy(hostname, ht->h_name);
1431
1432 return 0;
1433}
1434
1435static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
1436{
1437 int count, index, words_count;
1438 char * split_lines[128]= {0};
1439 char * split_words[128] = {0};
you.chened802ab2023-02-13 10:50:35 +08001440 char local_ssid[128] = {0};
you.chen87ff5172022-05-06 11:30:57 +08001441 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiongf1e48bb2023-03-28 13:38:22 +08001442 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen87ff5172022-05-06 11:30:57 +08001443
1444 CHECK_WPA_CTRL(ap_sta);
1445
1446 DO_REQUEST(lynq_wifi_list_networks);
1447
1448 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1449
1450 //@todo check ssid field to compatible
1451
1452 ret = 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001453 for(index=1; index < count; index++)
1454 {
you.chen87ff5172022-05-06 11:30:57 +08001455 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001456 if (words_count > 2)
1457 {
you.chened802ab2023-02-13 10:50:35 +08001458 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiongf1e48bb2023-03-28 13:38:22 +08001459 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
1460 {
you.chen87ff5172022-05-06 11:30:57 +08001461 net_no_list[ret++] = atoi(split_words[0]);
1462 }
1463 }
1464 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001465 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen87ff5172022-05-06 11:30:57 +08001466 return ret;
1467}
1468
1469static int lynq_add_network(int ap_sta) {
you.chenc7357f22022-05-16 17:55:28 +08001470 size_t i=0;
you.chen87ff5172022-05-06 11:30:57 +08001471 CHECK_WPA_CTRL(ap_sta);
1472 const char *lynq_wifi_add_network = "ADD_NETWORK";
1473
qs.xiongf1e48bb2023-03-28 13:38:22 +08001474 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen87ff5172022-05-06 11:30:57 +08001475 DO_REQUEST(lynq_wifi_add_network);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001476 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1477 {
1478 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen87ff5172022-05-06 11:30:57 +08001479 return -1;
1480 }
1481
qs.xiongf1e48bb2023-03-28 13:38:22 +08001482 for(i=0;i<reply_len;i++)
1483 {
1484 if(cmd_reply[i] == '\n')
1485 {
you.chen87ff5172022-05-06 11:30:57 +08001486 cmd_reply[i] = '\0';
1487 break;
1488 }
1489 }
1490 return atoi(cmd_reply);
1491}
you.chen5e363602022-05-08 12:20:18 +08001492
you.chen87ff5172022-05-06 11:30:57 +08001493static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
1494{
1495 int count, index;
1496 int net_no_list[128];
1497
qs.xiongf1e48bb2023-03-28 13:38:22 +08001498 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen87ff5172022-05-06 11:30:57 +08001499 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001500 for (index=0; index < count; index++)
1501 {
1502 if (net_no_list[index] == net_no)
1503 {
you.chen87ff5172022-05-06 11:30:57 +08001504 return 0;
1505 }
1506 }
1507
1508 if (count >= 1)
1509 index = net_no_list[count - 1];
1510 else
1511 index = -1;
1512
qs.xiongf1e48bb2023-03-28 13:38:22 +08001513 while (index < net_no )
1514 {
you.chen87ff5172022-05-06 11:30:57 +08001515 index = lynq_add_network(ap_sta);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001516 if (index >= net_no)
1517 { // required network no created
1518 RLOGD("required network no created\n");;
you.chen87ff5172022-05-06 11:30:57 +08001519 return 0;
1520 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001521 else if( index < 0)
1522 {
1523 RLOGE("[lynq_check_network_number] add network fail");
you.chen5e363602022-05-08 12:20:18 +08001524 return -1;
1525 }
you.chen87ff5172022-05-06 11:30:57 +08001526 }
1527
1528 if (index < 0)
qs.xiongf1e48bb2023-03-28 13:38:22 +08001529 {
1530 RLOGE("[lynq_check_network_number] network index < 0");
1531 return -1;
1532 }
1533 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen87ff5172022-05-06 11:30:57 +08001534 return 0;
1535}
1536
1537static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiongf1e48bb2023-03-28 13:38:22 +08001538 if (freq > 5000 && freq < 6000)
1539 {
you.chen87ff5172022-05-06 11:30:57 +08001540 return LYNQ_WIFI_5G_band;
1541 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001542 else if (freq > 2000 && freq < 3000)
1543 {
you.chen87ff5172022-05-06 11:30:57 +08001544 return LYNQ_WIFI_2G_band;
1545 }
1546 return LYNQ_WIFI_2_and_5G_band;
1547}
1548
1549static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001550 if (key_mgmt != NULL)
1551 {
1552 if (memcmp( key_mgmt, "NONE", 4) == 0)
1553 {
you.chen87ff5172022-05-06 11:30:57 +08001554 return LYNQ_WIFI_AUTH_OPEN;
1555 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001556 else if (memcmp( key_mgmt, "WEP", 3) == 0)
1557 {
you.chen87ff5172022-05-06 11:30:57 +08001558 return LYNQ_WIFI_AUTH_WEP;
1559 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001560 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
1561 {
you.chen87ff5172022-05-06 11:30:57 +08001562 return LYNQ_WIFI_AUTH_WPA_PSK;
1563 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001564 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
1565 {
you.chen87ff5172022-05-06 11:30:57 +08001566 return LYNQ_WIFI_AUTH_WPA2_PSK;
1567 }
1568 }
1569
1570 return -1;
1571}
1572
1573static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001574 if (flag != NULL)
1575 {
qs.xiong7ce84ec2023-07-11 21:06:47 +08001576 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || ( strstr(flag,"SAE-H2E") != NULL && strstr(flag,"WPS") == NULL ) )
qs.xionge2dc2e02023-04-06 11:08:48 +08001577 {
1578 return LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiong7ce84ec2023-07-11 21:06:47 +08001579 }else if ( strstr( flag,"SAE-CCMP") != NULL || strstr(flag,"SAE-H2E") != NULL )
qs.xionge2dc2e02023-04-06 11:08:48 +08001580 {
1581 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
1582 }else if (strstr( flag, "WPA2-PSK") != NULL)
1583 {
you.chen87ff5172022-05-06 11:30:57 +08001584 return LYNQ_WIFI_AUTH_WPA2_PSK;
1585 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001586 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xionge2dc2e02023-04-06 11:08:48 +08001587 {
you.chen87ff5172022-05-06 11:30:57 +08001588 return LYNQ_WIFI_AUTH_WPA_PSK;
1589 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001590 else if (strstr( flag, "WEP") != NULL)
qs.xionge2dc2e02023-04-06 11:08:48 +08001591 {
you.chen87ff5172022-05-06 11:30:57 +08001592 return LYNQ_WIFI_AUTH_WEP;
1593 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001594 else if (strstr( flag, "NONE") != NULL)
qs.xionge2dc2e02023-04-06 11:08:48 +08001595 {
you.chen87ff5172022-05-06 11:30:57 +08001596 return LYNQ_WIFI_AUTH_OPEN;
1597 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001598 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xionge2dc2e02023-04-06 11:08:48 +08001599 {
you.chened802ab2023-02-13 10:50:35 +08001600 return LYNQ_WIFI_AUTH_OPEN;
1601 }
qs.xiong7ce84ec2023-07-11 21:06:47 +08001602 else
1603 {
1604 RLOGD("convert_max_auth_from_flag not-found auth mode");
1605 }
you.chen87ff5172022-05-06 11:30:57 +08001606 }
1607
1608 return -1;
1609}
1610
1611static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
1612 switch (bw) {
1613 case 10:
1614 return LYNQ_WIFI_BANDWIDTH_HT10;
1615 break;
1616 case 20:
1617 return LYNQ_WIFI_BANDWIDTH_HT20;
1618 break;
1619 case 40:
1620 return LYNQ_WIFI_BANDWIDTH_HT40;
1621 break;
1622 case 80:
1623 return LYNQ_WIFI_BANDWIDTH_HT80;
1624 break;
1625 default:
1626 break;
1627 }
1628
1629 return -1;
1630}
1631
you.chenf9d718d2023-04-14 18:17:09 +08001632static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth);
you.chen87ff5172022-05-06 11:30:57 +08001633static int inner_get_status_info(int interface, curr_status_info *curr_state) {
1634 int i, count;
1635 char *p;
1636 const char *lynq_status_cmd = "STATUS";
1637 const char * FLAG_SSID = "ssid=";
1638 const char * FLAG_SBSID = "bssid=";
1639 const char * FLAG_KEY_MGMT = "key_mgmt=";
1640 const char * FLAG_FREQ = "freq=";
1641 const char * FLAG_STATE = "wpa_state=";
1642 const char * FLAG_ID = "id=";
you.chened802ab2023-02-13 10:50:35 +08001643 const char * FLAG_IPADDR = "ip_address=";
you.chen87ff5172022-05-06 11:30:57 +08001644 char *split_lines[128] = {0};
1645
1646 CHECK_WPA_CTRL(interface);
1647
qs.xiongf1e48bb2023-03-28 13:38:22 +08001648 if (curr_state == NULL)
1649 {
1650 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen87ff5172022-05-06 11:30:57 +08001651 return -1;
1652 }
1653
1654 DO_REQUEST(lynq_status_cmd);
1655
1656 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1657
1658 curr_state->net_no = -1;
1659 ret = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001660 for(i=0; i < count; i++)
1661 {
1662 if (curr_state->ap != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001663 {
you.chen87ff5172022-05-06 11:30:57 +08001664 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001665 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001666 {
you.chened802ab2023-02-13 10:50:35 +08001667 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen87ff5172022-05-06 11:30:57 +08001668 ret = 0;
1669 continue;
1670 }
you.chendad3f9f2022-06-21 16:53:48 +08001671 p = strstr(split_lines[i], FLAG_SSID);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001672 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001673 {
you.chened802ab2023-02-13 10:50:35 +08001674 inner_copy_ssid(curr_state->ap->ap_ssid, p + strlen(FLAG_SSID), sizeof (curr_state->ap->ap_ssid));
you.chendad3f9f2022-06-21 16:53:48 +08001675 ret = 0;
1676 continue;
1677 }
you.chen87ff5172022-05-06 11:30:57 +08001678 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001679 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001680 {
you.chenb98d1cf2022-07-15 17:56:48 +08001681 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiongf1e48bb2023-03-28 13:38:22 +08001682 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen87ff5172022-05-06 11:30:57 +08001683 ret = 0;
1684 continue;
1685 }
1686 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001687 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001688 {
you.chen87ff5172022-05-06 11:30:57 +08001689 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1690 ret = 0;
1691 continue;
1692 }
you.chened802ab2023-02-13 10:50:35 +08001693 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001694 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001695 {
you.chened802ab2023-02-13 10:50:35 +08001696 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1697 ret = 0;
1698 continue;
1699 }
you.chen87ff5172022-05-06 11:30:57 +08001700 } // end if (ap != NULL)
qs.xiongf1e48bb2023-03-28 13:38:22 +08001701 if (curr_state->state != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001702 {
you.chen87ff5172022-05-06 11:30:57 +08001703 p = strstr(split_lines[i], FLAG_STATE);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001704 if (p != NULL)
you.chenf9d718d2023-04-14 18:17:09 +08001705 {
you.chen87ff5172022-05-06 11:30:57 +08001706 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1707 ret = 0;
1708 continue;
1709 }
1710
1711 } //end else if (state != NULL)
qs.xiongf1e48bb2023-03-28 13:38:22 +08001712 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
you.chenf9d718d2023-04-14 18:17:09 +08001713 {
you.chen87ff5172022-05-06 11:30:57 +08001714 ret = 0;
you.chenb98d1cf2022-07-15 17:56:48 +08001715 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiongf1e48bb2023-03-28 13:38:22 +08001716 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen87ff5172022-05-06 11:30:57 +08001717 }
1718 }
1719
you.chenf9d718d2023-04-14 18:17:09 +08001720 if (ret == 0 && curr_state->ap != NULL && curr_state->net_no >= 0) // auth may not right when add wpa3
1721 {
1722 inner_get_network_auth(interface, curr_state->net_no, &curr_state->ap->auth);
1723 }
1724
you.chen87ff5172022-05-06 11:30:57 +08001725 return ret;
1726}
1727
qs.xiongd189c542022-03-31 00:58:23 -04001728int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong8d42bb92022-03-02 09:43:11 -05001729{
qs.xiongf1e48bb2023-03-28 13:38:22 +08001730 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen87ff5172022-05-06 11:30:57 +08001731 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong8d42bb92022-03-02 09:43:11 -05001732
qs.xiongf1e48bb2023-03-28 13:38:22 +08001733 if (ap_ssid == NULL)
1734 {
1735 RLOGE("Input ap_ssid is NULL");
you.chen87ff5172022-05-06 11:30:57 +08001736 return -1;
1737 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001738 else
1739 {
1740 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen87ff5172022-05-06 11:30:57 +08001741 }
qs.xiong799dab02022-03-14 09:12:12 -04001742
qs.xiongf1e48bb2023-03-28 13:38:22 +08001743 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1744 {
1745 RLOGE("Do check ap network_number fail");
you.chen87ff5172022-05-06 11:30:57 +08001746 return -1;
1747 }
qs.xiong799dab02022-03-14 09:12:12 -04001748
you.chen87ff5172022-05-06 11:30:57 +08001749 CHECK_IDX(idx, CTRL_AP);
1750
1751 CHECK_WPA_CTRL(CTRL_AP);
1752
1753 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1754
1755 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1756 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiongf1e48bb2023-03-28 13:38:22 +08001757 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1758 return 0;
you.chen87ff5172022-05-06 11:30:57 +08001759
qs.xiong8d42bb92022-03-02 09:43:11 -05001760}
1761
you.chen87ff5172022-05-06 11:30:57 +08001762int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong8d42bb92022-03-02 09:43:11 -05001763{
qs.xiongf1e48bb2023-03-28 13:38:22 +08001764 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen87ff5172022-05-06 11:30:57 +08001765 CHECK_IDX(idx, CTRL_AP);
you.chened802ab2023-02-13 10:50:35 +08001766 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong8d42bb92022-03-02 09:43:11 -05001767}
1768
qs.xiongaed02ac2022-10-17 15:27:18 +08001769/*****
1770 *frequency <------>channel
1771 *
1772 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1773 *
1774 *
1775 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1776 *
1777 *
1778 * */
1779static int lynq_check_set_frequency(int input_frequency){
qs.xiongf962eef2022-11-29 16:28:03 +08001780 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};
1781 int i;
1782 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1783
qs.xiong3163d0f2022-12-02 09:58:57 +08001784 for(i = 0; i < arr_len; i++)
qs.xiongf962eef2022-11-29 16:28:03 +08001785 {
1786 if(input_frequency == legitimate_frequency[i])
qs.xiongaed02ac2022-10-17 15:27:18 +08001787 break;
qs.xiongaed02ac2022-10-17 15:27:18 +08001788 }
qs.xiongf962eef2022-11-29 16:28:03 +08001789
1790 if(i == arr_len)
1791 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001792 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongaed02ac2022-10-17 15:27:18 +08001793 return -1;
1794 }
qs.xiongf962eef2022-11-29 16:28:03 +08001795
qs.xiongaed02ac2022-10-17 15:27:18 +08001796 return 0;
1797}
qs.xiong9c1020c2023-02-21 19:12:54 +08001798
1799static int lynq_check_frequencyby_country_code(int input_frequency)
1800{
1801 char str_cnc[]="CN";
1802 char str_dest[20]="";
1803
1804 if( lynq_get_country_code(1,str_dest) != 0 )
1805 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001806 RLOGE("get country_code error\n");
qs.xiong9c1020c2023-02-21 19:12:54 +08001807 return -1;
1808 }
1809 if( strncmp(str_dest,str_cnc,2) != 0 )
1810 {
1811 return 0;
1812 }else if( 2473 < input_frequency && input_frequency < 5744)
1813 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001814 RLOGE("input frequency is bad\n");
qs.xiong9c1020c2023-02-21 19:12:54 +08001815 return -1;
1816 }
1817 return 0;
1818}
qs.xiongd189c542022-03-31 00:58:23 -04001819int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong8d42bb92022-03-02 09:43:11 -05001820{
qs.xiongf962eef2022-11-29 16:28:03 +08001821 int check;
qs.xiongaed02ac2022-10-17 15:27:18 +08001822 char lynq_wifi_frequency_cmd[128]={0};
1823 char lynq_cmd_mode[128]={0};
you.chen87ff5172022-05-06 11:30:57 +08001824 char lynq_cmd_slect[128]={0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08001825 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongaed02ac2022-10-17 15:27:18 +08001826 //@do check input frequency
qs.xiongf962eef2022-11-29 16:28:03 +08001827 check = lynq_check_set_frequency(lynq_wifi_frequency);
1828 if(check != 0)
1829 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001830 RLOGE("do check frequency error");
qs.xiongaed02ac2022-10-17 15:27:18 +08001831 return -1;
you.chen87ff5172022-05-06 11:30:57 +08001832 }
qs.xiong9c1020c2023-02-21 19:12:54 +08001833 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1834 if(check != 0)
1835 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001836 RLOGE("do check frequency error");
qs.xiong9c1020c2023-02-21 19:12:54 +08001837 return -1;
1838 }
1839
qs.xiongf962eef2022-11-29 16:28:03 +08001840 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1841 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001842 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen87ff5172022-05-06 11:30:57 +08001843 return -1;
1844 }
qs.xiong799dab02022-03-14 09:12:12 -04001845
you.chen87ff5172022-05-06 11:30:57 +08001846 CHECK_IDX(idx, CTRL_AP);
1847
1848 CHECK_WPA_CTRL(CTRL_AP);
1849
1850 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1851 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1852 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1853
you.chenc7357f22022-05-16 17:55:28 +08001854 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen87ff5172022-05-06 11:30:57 +08001855 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1856 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1857 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong8d42bb92022-03-02 09:43:11 -05001858
qs.xiongf1e48bb2023-03-28 13:38:22 +08001859 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05001860}
1861
qs.xiongd189c542022-03-31 00:58:23 -04001862int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong8d42bb92022-03-02 09:43:11 -05001863{
you.chen87ff5172022-05-06 11:30:57 +08001864 char lynq_frequency_str[MAX_RET] = {0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08001865 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen87ff5172022-05-06 11:30:57 +08001866 CHECK_IDX(idx, CTRL_AP);
qs.xiongd189c542022-03-31 00:58:23 -04001867
qs.xiongf1e48bb2023-03-28 13:38:22 +08001868 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1869 {
1870 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen87ff5172022-05-06 11:30:57 +08001871 return -1;
1872 }
1873 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongd189c542022-03-31 00:58:23 -04001874
qs.xiongf1e48bb2023-03-28 13:38:22 +08001875 return 0;
qs.xiongd189c542022-03-31 00:58:23 -04001876}
1877
qs.xiongd189c542022-03-31 00:58:23 -04001878int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1879{
qs.xiongf1e48bb2023-03-28 13:38:22 +08001880 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen87ff5172022-05-06 11:30:57 +08001881 CHECK_IDX(idx, CTRL_AP);
1882 switch(bandwidth){
qs.xiongf1e48bb2023-03-28 13:38:22 +08001883 case LYNQ_WIFI_BANDWIDTH_HT10:
1884 {
1885 RLOGE("bandwith [%d] not support now\n", bandwidth);
1886 return -1;
1887 }
1888 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen87ff5172022-05-06 11:30:57 +08001889 {
1890 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1891 system("wl down");
qs.xiongf1e48bb2023-03-28 13:38:22 +08001892 if (system(lynq_cmd_bandwith) != 0 )
1893 {
1894 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen87ff5172022-05-06 11:30:57 +08001895 return -1;
1896 }
1897 system("wl up");
1898 break;
1899 }
1900 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiongf1e48bb2023-03-28 13:38:22 +08001901 {
qs.xiongdb04cdb2023-02-21 13:19:42 +08001902 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen87ff5172022-05-06 11:30:57 +08001903 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1904 system("wl down");
qs.xiongf1e48bb2023-03-28 13:38:22 +08001905 if (system(lynq_cmd_bandwith) != 0 )
1906 {
1907 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen87ff5172022-05-06 11:30:57 +08001908 return -1;
1909 }
1910 system("wl up");
1911 break;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001912 }
you.chen87ff5172022-05-06 11:30:57 +08001913 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiongf1e48bb2023-03-28 13:38:22 +08001914 {
qs.xiongdb04cdb2023-02-21 13:19:42 +08001915 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen87ff5172022-05-06 11:30:57 +08001916 system("wl down");
qs.xiongf1e48bb2023-03-28 13:38:22 +08001917 if (system(lynq_cmd_bandwith) != 0 )
1918 {
1919 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen87ff5172022-05-06 11:30:57 +08001920 return -1;
1921 }
1922 system("wl up");
1923 break;
qs.xiongf1e48bb2023-03-28 13:38:22 +08001924 }
1925 default:
you.chen87ff5172022-05-06 11:30:57 +08001926 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08001927 RLOGE("auth type [%d] not support now\n", bandwidth);
1928 return -1;
you.chen87ff5172022-05-06 11:30:57 +08001929 }
1930 }
qs.xiongd189c542022-03-31 00:58:23 -04001931
1932
you.chen87ff5172022-05-06 11:30:57 +08001933 return 0;
qs.xiongd189c542022-03-31 00:58:23 -04001934}
you.chen87ff5172022-05-06 11:30:57 +08001935
qs.xiongd189c542022-03-31 00:58:23 -04001936int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1937{
you.chen87ff5172022-05-06 11:30:57 +08001938 int count = 0;
1939 int index = 0;
1940 char *split_words[128] = {0};
1941 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiongf1e48bb2023-03-28 13:38:22 +08001942 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen87ff5172022-05-06 11:30:57 +08001943 CHECK_IDX(idx, CTRL_AP);
qs.xiong8d42bb92022-03-02 09:43:11 -05001944
you.chen87ff5172022-05-06 11:30:57 +08001945 CHECK_WPA_CTRL(CTRL_AP);
1946
1947 DO_REQUEST(lynq_chanspec_cmd);
1948
1949 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1950 for(;index < count; index++) {
1951 if (strncmp(split_words[index], "bw", 2) != 0) {
1952 continue;
1953 }
1954
1955 index++;
1956 if (index >= count) {
1957 return -1;
1958 }
1959
qs.xiongf1e48bb2023-03-28 13:38:22 +08001960 RLOGD("bw %s\n", split_words[index]);
you.chen87ff5172022-05-06 11:30:57 +08001961 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1962 return 0;
1963 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08001964 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen87ff5172022-05-06 11:30:57 +08001965 return -1;
qs.xiong8d42bb92022-03-02 09:43:11 -05001966}
qs.xiong7cc23cb2022-04-14 03:50:45 -04001967
qs.xiongd189c542022-03-31 00:58:23 -04001968int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong8d42bb92022-03-02 09:43:11 -05001969{
you.chen87ff5172022-05-06 11:30:57 +08001970 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08001971 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen87ff5172022-05-06 11:30:57 +08001972 CHECK_IDX(idx, CTRL_AP);
qs.xiong6a886062022-04-14 06:17:01 -04001973
you.chen87ff5172022-05-06 11:30:57 +08001974 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong799dab02022-03-14 09:12:12 -04001975
qs.xiongf1e48bb2023-03-28 13:38:22 +08001976 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1977 {
you.chen87ff5172022-05-06 11:30:57 +08001978 return -1;
1979 }
1980
1981 system("wl down");
1982 if (system(lynq_cmd_channel) != 0 ){
qs.xiongf1e48bb2023-03-28 13:38:22 +08001983 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen87ff5172022-05-06 11:30:57 +08001984 return -1;
1985 }
1986 system("wl up");
1987 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05001988}
qs.xiong7cc23cb2022-04-14 03:50:45 -04001989
qs.xiongd189c542022-03-31 00:58:23 -04001990int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong8d42bb92022-03-02 09:43:11 -05001991{
you.chen87ff5172022-05-06 11:30:57 +08001992 int count = 0;
1993 int index = 0;
1994 char *split_words[128] = {0};
1995 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiongf1e48bb2023-03-28 13:38:22 +08001996 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen87ff5172022-05-06 11:30:57 +08001997 CHECK_IDX(idx, CTRL_AP);
qs.xiong799dab02022-03-14 09:12:12 -04001998
you.chen87ff5172022-05-06 11:30:57 +08001999 CHECK_WPA_CTRL(CTRL_AP);
2000
2001 DO_REQUEST(lynq_chanspec_cmd);
2002
2003 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002004 for(;index < count; index++)
2005 {
2006 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen87ff5172022-05-06 11:30:57 +08002007 if (strncmp(split_words[index], "channel", 2) != 0) {
2008 continue;
2009 }
2010
2011 index++;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002012 if (index >= count)
2013 {
you.chen87ff5172022-05-06 11:30:57 +08002014 return -1;
2015 }
2016
2017 *channel = atoi(split_words[index]);
2018 return 0;
2019 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002020 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen87ff5172022-05-06 11:30:57 +08002021 return -1;
qs.xiong8d42bb92022-03-02 09:43:11 -05002022}
2023
2024
you.chen87ff5172022-05-06 11:30:57 +08002025int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong8d42bb92022-03-02 09:43:11 -05002026{
you.chenc7357f22022-05-16 17:55:28 +08002027 char ssid[MAX_CMD] = {0};
2028 int freq = 0;
2029 char lynq_auth_cmd[64]={0};
2030 char lynq_auth_alg_cmd[64]={0};
2031 char lynq_psk_cmd[64]={0};
2032 char lynq_pairwise_cmd[64]={0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08002033 char lynq_ieee80211_cmd[64]={0};
2034 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chenc7357f22022-05-16 17:55:28 +08002035 lynq_wifi_auth_s org_auth;
you.chen87ff5172022-05-06 11:30:57 +08002036 CHECK_IDX(idx, CTRL_AP);
2037
you.chenc7357f22022-05-16 17:55:28 +08002038 CHECK_WPA_CTRL(CTRL_AP);
2039
qs.xiongf1e48bb2023-03-28 13:38:22 +08002040 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
2041 {
2042 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen87ff5172022-05-06 11:30:57 +08002043 return -1;
2044 }
2045
you.chen01276462022-05-25 10:09:47 +08002046 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chenc7357f22022-05-16 17:55:28 +08002047 if (org_auth == auth) {
qs.xiong045f60b2023-03-29 17:36:14 +08002048 RLOGD("org_auth --- is %d\n",org_auth);
you.chenc7357f22022-05-16 17:55:28 +08002049 return 0;
2050 }
2051 else {
2052 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
2053 ssid[0] = '\0';
2054 }
2055 lynq_wifi_ap_frequency_get(idx, &freq);
2056
2057 DO_OK_FAIL_REQUEST(cmd_disconnect);
2058 DO_OK_FAIL_REQUEST(cmd_remove_all);
2059 if (ssid[0] != '\0') {
2060 lynq_wifi_ap_ssid_set(idx, ssid);
2061 }
2062 if (freq != 0) {
2063 lynq_wifi_ap_frequency_set(idx, freq);
2064 }
2065 }
2066 }
you.chen87ff5172022-05-06 11:30:57 +08002067
qs.xiongf1e48bb2023-03-28 13:38:22 +08002068 switch(auth){
2069 case LYNQ_WIFI_AUTH_OPEN:
you.chenc7357f22022-05-16 17:55:28 +08002070 {
qs.xiong045f60b2023-03-29 17:36:14 +08002071 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen87ff5172022-05-06 11:30:57 +08002072 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen01276462022-05-25 10:09:47 +08002073 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen87ff5172022-05-06 11:30:57 +08002074 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002075 break;
2076 }
you.chenc7357f22022-05-16 17:55:28 +08002077 case LYNQ_WIFI_AUTH_WEP:
2078 {
qs.xiong045f60b2023-03-29 17:36:14 +08002079 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chenc7357f22022-05-16 17:55:28 +08002080 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen01276462022-05-25 10:09:47 +08002081 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chenc7357f22022-05-16 17:55:28 +08002082 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
2083
2084 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2085 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
2086 break;
2087 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002088 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiong045f60b2023-03-29 17:36:14 +08002089 {
2090 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
2091 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
2092 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
2093
2094 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2095 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2096 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2097 break;
2098
2099 }
you.chen87ff5172022-05-06 11:30:57 +08002100 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiongf1e48bb2023-03-28 13:38:22 +08002101 {
2102 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2103 {
you.chen87ff5172022-05-06 11:30:57 +08002104 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
2105 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
2106 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002107 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2108 {
you.chenc7357f22022-05-16 17:55:28 +08002109 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chen5e363602022-05-08 12:20:18 +08002110 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen87ff5172022-05-06 11:30:57 +08002111 }
2112// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
2113// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
2114 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong8d42bb92022-03-02 09:43:11 -05002115
you.chen87ff5172022-05-06 11:30:57 +08002116 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2117 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2118 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002119 break;
2120 }
2121 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2122 {
2123 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
2124 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
2125 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
2126 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
2127
2128 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2129 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
2130 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2131 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2132 break;
2133 }
2134 case LYNQ_WIFI_AUTH_WPA3_PSK:
2135 {
2136 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
2137 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xionge2dc2e02023-04-06 11:08:48 +08002138 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002139 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
2140
2141 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2142 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
2143 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2144 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2145 break;
2146 }
2147 default:
you.chen87ff5172022-05-06 11:30:57 +08002148 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08002149 RLOGE("auth type [%d] not support now\n", auth);
2150 return -1;
you.chen87ff5172022-05-06 11:30:57 +08002151 }
2152 }
you.chenc7357f22022-05-16 17:55:28 +08002153 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong8d42bb92022-03-02 09:43:11 -05002154
qs.xiongf1e48bb2023-03-28 13:38:22 +08002155 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002156}
2157
you.chen87ff5172022-05-06 11:30:57 +08002158int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong8d42bb92022-03-02 09:43:11 -05002159{
you.chen87ff5172022-05-06 11:30:57 +08002160 char lynq_auth_str[MAX_RET] = {0};
you.chenc7357f22022-05-16 17:55:28 +08002161 char lynq_auth_alg_str[MAX_RET] = {0};
2162 char lynq_proto_str[MAX_RET] = {0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08002163 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen87ff5172022-05-06 11:30:57 +08002164 CHECK_IDX(idx, CTRL_AP);
2165
qs.xiongf1e48bb2023-03-28 13:38:22 +08002166 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
2167 {
2168 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen87ff5172022-05-06 11:30:57 +08002169 return -1;
2170 }
2171
qs.xiongf1e48bb2023-03-28 13:38:22 +08002172 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
2173 {
2174 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
2175 {
qs.xiong045f60b2023-03-29 17:36:14 +08002176 RLOGD("---auth is OPEN\n");
you.chenc7357f22022-05-16 17:55:28 +08002177 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiong045f60b2023-03-29 17:36:14 +08002178 return 0;
you.chenc7357f22022-05-16 17:55:28 +08002179 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002180 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
2181 {
qs.xiong045f60b2023-03-29 17:36:14 +08002182 RLOGD("---auth is WEP\n");
you.chenc7357f22022-05-16 17:55:28 +08002183 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiong045f60b2023-03-29 17:36:14 +08002184 return 0;
you.chenc7357f22022-05-16 17:55:28 +08002185 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002186 else
2187 {
qs.xiong045f60b2023-03-29 17:36:14 +08002188 RLOGD("---auth is OPEN\n");
you.chenc7357f22022-05-16 17:55:28 +08002189 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiong045f60b2023-03-29 17:36:14 +08002190 return 0;
you.chenc7357f22022-05-16 17:55:28 +08002191 }
you.chen87ff5172022-05-06 11:30:57 +08002192 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002193 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
2194 {
2195 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
2196 {
qs.xiong045f60b2023-03-29 17:36:14 +08002197 RLOGE("---auth is -1\n");
you.chen01276462022-05-25 10:09:47 +08002198 *auth = -1;
you.chenc7357f22022-05-16 17:55:28 +08002199 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002200 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
2201 {
qs.xiong045f60b2023-03-29 17:36:14 +08002202 RLOGD("---auth WPA2_PSK\n");
you.chenc7357f22022-05-16 17:55:28 +08002203 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08002204 return 0;
you.chenc7357f22022-05-16 17:55:28 +08002205 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002206 else
2207 {
qs.xiong045f60b2023-03-29 17:36:14 +08002208 RLOGD("---auth WPA_PSK\n");
you.chenc7357f22022-05-16 17:55:28 +08002209 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08002210 return 0;
you.chenc7357f22022-05-16 17:55:28 +08002211 }
you.chen87ff5172022-05-06 11:30:57 +08002212 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002213
2214 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
2215 {
2216 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
2217 return -1;
2218 }
2219
2220 if (memcmp(lynq_auth_str,"1",1) == 0 )
2221 {
2222 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
2223 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08002224 return 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002225 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
2226 {
2227 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
2228 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08002229 return 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002230 }
2231 else
2232 {
qs.xiong045f60b2023-03-29 17:36:14 +08002233 RLOGE("---auth -- -1\n");
you.chen01276462022-05-25 10:09:47 +08002234 *auth = -1;
2235 }
qs.xiong8d42bb92022-03-02 09:43:11 -05002236
you.chenc7357f22022-05-16 17:55:28 +08002237 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002238}
qs.xiong799dab02022-03-14 09:12:12 -04002239
you.chen083a2952023-05-12 19:39:06 +08002240static int inner_check_ap_connected(lynq_wifi_index_e idx, int retry_count)
2241{
2242 char status[64];
you.chen0090be42023-05-19 13:53:43 +08002243 char LYNQ_WIFI_CMD[32]={0};
you.chen083a2952023-05-12 19:39:06 +08002244 curr_status_info curr_state;
2245
2246 CHECK_WPA_CTRL(CTRL_AP);
2247
2248 memset(status, 0, sizeof (status));
2249
2250 curr_state.ap = NULL;
2251 curr_state.state = status;
2252
2253 printf("inner_check_ap_connected %d\n", retry_count);
2254 usleep(500*1000);
2255 if (0 == inner_get_status_info(idx, &curr_state))
2256 {
2257 if (strcmp(status, STATE_COMPLETED) == 0)
2258 {
2259 return 0;
2260 }
2261 else if (retry_count == 4) //not ok in 2s, do reconnect
2262 {
2263 DO_REQUEST("RECONNECT");
2264 return inner_check_ap_connected(idx, retry_count+1);
2265 }
you.chen0090be42023-05-19 13:53:43 +08002266 else if (retry_count > 20)
you.chen083a2952023-05-12 19:39:06 +08002267 {
2268 printf("retry 10 time\n");
2269 return -1;
2270 }
2271 else
2272 {
you.chen68e889d2023-06-01 16:39:54 +08002273 if (strcmp(status, STATE_DISCONNECTED) == 0)
2274 {
2275 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
2276 DO_REQUEST(LYNQ_WIFI_CMD);
2277 }
you.chen083a2952023-05-12 19:39:06 +08002278 return inner_check_ap_connected(idx, retry_count+1);
2279 }
2280 }
2281 return -1;
2282}
qs.xiong799dab02022-03-14 09:12:12 -04002283
qs.xiongd189c542022-03-31 00:58:23 -04002284int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong8d42bb92022-03-02 09:43:11 -05002285{
you.chen87ff5172022-05-06 11:30:57 +08002286 char LYNQ_WIFI_CMD[128]={0};
2287 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
2288 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiongf1e48bb2023-03-28 13:38:22 +08002289 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen87ff5172022-05-06 11:30:57 +08002290 CHECK_IDX(idx, CTRL_AP);
2291
2292 CHECK_WPA_CTRL(CTRL_AP);
2293
you.chen377987d2023-05-10 15:56:26 +08002294 if (inner_get_ap_interface_name() == NULL)
you.chencd882682023-04-24 15:39:37 +08002295 {
you.chen377987d2023-05-10 15:56:26 +08002296 RLOGE("lynq_wifi_ap_start get ap name fail");
you.chencd882682023-04-24 15:39:37 +08002297 return -1;
2298 }
you.chen87ff5172022-05-06 11:30:57 +08002299
2300 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
2301 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
2302
2303 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
2304 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
2305
you.chencd882682023-04-24 15:39:37 +08002306 ret = system_call_v("%s %s", start_stop_ap_script, "start");
2307 if (ret != 0)
2308 {
2309 RLOGE("lynq_wifi_ap_start excute script fail");
2310 return -1;
2311 }
2312
you.chen083a2952023-05-12 19:39:06 +08002313 if (inner_check_ap_connected(idx, 0) != 0)
2314 {
2315 return -1;
2316 }
2317
you.chen377987d2023-05-10 15:56:26 +08002318 check_tether_and_notify();
2319
qs.xiongbab8a1c2023-08-12 18:01:32 +08002320 if (g_ap_tmp_watcher_pid == 0)
2321 {
2322 if(pthread_create(&g_ap_tmp_watcher_pid,NULL,APTmpWatcherThreadProc,NULL) < 0)
2323 {
2324 g_ap_tmp_watcher_pid = 0;
2325 RLOGE("[wifi error]create APTmpWatcherThreadProc fail");
2326 return -1;
2327 }
2328 RLOGD("[lynq_wifi_ap_start] creat APTmpWatcherThreadProc ok");
2329 }
2330
qs.xiongf1e48bb2023-03-28 13:38:22 +08002331 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002332}
2333
qs.xiongd189c542022-03-31 00:58:23 -04002334int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong8d42bb92022-03-02 09:43:11 -05002335{
you.chen87ff5172022-05-06 11:30:57 +08002336 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong8d42bb92022-03-02 09:43:11 -05002337}
2338
qs.xiongd189c542022-03-31 00:58:23 -04002339int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong8d42bb92022-03-02 09:43:11 -05002340{
you.chen87ff5172022-05-06 11:30:57 +08002341 char LYNQ_WIFI_CMD[128]={0};
qs.xiong799dab02022-03-14 09:12:12 -04002342
you.chen87ff5172022-05-06 11:30:57 +08002343 CHECK_IDX(idx, CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04002344
you.chen87ff5172022-05-06 11:30:57 +08002345 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04002346
you.chen87ff5172022-05-06 11:30:57 +08002347 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
2348
2349 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
2350
you.chenefc7f3f2022-05-06 17:50:16 +08002351// system("connmanctl tether wifi off");
you.chencd882682023-04-24 15:39:37 +08002352
2353 ret = system_call_v("%s %s", start_stop_ap_script, "stop");
2354 if (ret != 0)
2355 {
2356 RLOGE("lynq_wifi_ap_start excute script fail");
2357 return -1;
2358 }
qs.xiongbab8a1c2023-08-12 18:01:32 +08002359 g_ap_tmp_watcher_stop_flag = 1;
2360 if (g_ap_tmp_watcher_pid != 0)
2361 pthread_join(g_ap_tmp_watcher_pid, NULL);
2362 g_ap_tmp_watcher_pid = 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002363 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002364}
qs.xiong799dab02022-03-14 09:12:12 -04002365
qs.xiongd189c542022-03-31 00:58:23 -04002366int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong8d42bb92022-03-02 09:43:11 -05002367{
you.chen87ff5172022-05-06 11:30:57 +08002368 char lynq_disable_cmd[128] = {0};
2369 char lynq_select_cmd[128] = {0};
2370 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiongf1e48bb2023-03-28 13:38:22 +08002371 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen87ff5172022-05-06 11:30:57 +08002372 CHECK_IDX(idx, CTRL_AP);
qs.xiong8d42bb92022-03-02 09:43:11 -05002373
you.chen87ff5172022-05-06 11:30:57 +08002374 CHECK_WPA_CTRL(CTRL_AP);
you.chen87ff5172022-05-06 11:30:57 +08002375 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2376 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2377
2378 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2379 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
2380 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong799dab02022-03-14 09:12:12 -04002381
qs.xiongf1e48bb2023-03-28 13:38:22 +08002382 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002383}
2384
qs.xiongd189c542022-03-31 00:58:23 -04002385int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong8d42bb92022-03-02 09:43:11 -05002386{
you.chen87ff5172022-05-06 11:30:57 +08002387 char lynq_disable_cmd[128] = {0};
2388 char lynq_select_cmd[128] = {0};
2389 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiongf1e48bb2023-03-28 13:38:22 +08002390 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen87ff5172022-05-06 11:30:57 +08002391 CHECK_IDX(idx, CTRL_AP);
qs.xiong8d42bb92022-03-02 09:43:11 -05002392
you.chen87ff5172022-05-06 11:30:57 +08002393 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04002394
you.chen87ff5172022-05-06 11:30:57 +08002395 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2396 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2397
2398 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2399 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
2400 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong8d42bb92022-03-02 09:43:11 -05002401
qs.xiongf1e48bb2023-03-28 13:38:22 +08002402 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002403}
qs.xiongd189c542022-03-31 00:58:23 -04002404
you.chen87ff5172022-05-06 11:30:57 +08002405int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong8d42bb92022-03-02 09:43:11 -05002406{
qs.xiongf1e48bb2023-03-28 13:38:22 +08002407 int pass_len;
you.chenc7357f22022-05-16 17:55:28 +08002408 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08002409 char lynq_wpa2_wpa3[64] = {0};
you.chenc7357f22022-05-16 17:55:28 +08002410 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiongf1e48bb2023-03-28 13:38:22 +08002411 RLOGD("enter lynq_ap_password_set");
2412 if( password == NULL )
2413 {
2414 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xiong6ad4d7d2022-06-27 11:34:53 +08002415 return -1;
2416 }
2417 pass_len=strlen(password);
you.chenc7357f22022-05-16 17:55:28 +08002418 lynq_wifi_auth_s auth = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002419 if(pass_len < 8 || pass_len >= 64)
2420 {
2421 RLOGE("[lynq_ap_password_set]input password len not in rage");
2422 return -1;
you.chen87ff5172022-05-06 11:30:57 +08002423 }
qs.xiongd189c542022-03-31 00:58:23 -04002424
you.chen87ff5172022-05-06 11:30:57 +08002425 CHECK_IDX(idx, CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04002426
qs.xiongf1e48bb2023-03-28 13:38:22 +08002427 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
2428 {
qs.xiong045f60b2023-03-29 17:36:14 +08002429 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chenc7357f22022-05-16 17:55:28 +08002430 return -1;
2431 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002432 else if (auth == LYNQ_WIFI_AUTH_OPEN)
2433 {
qs.xiong045f60b2023-03-29 17:36:14 +08002434 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
2435 return 0;
you.chenc7357f22022-05-16 17:55:28 +08002436 }
2437
you.chen87ff5172022-05-06 11:30:57 +08002438 CHECK_WPA_CTRL(CTRL_AP);
2439
qs.xiongf1e48bb2023-03-28 13:38:22 +08002440 if (auth == LYNQ_WIFI_AUTH_WEP)
2441 {
qs.xiong045f60b2023-03-29 17:36:14 +08002442 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chenc7357f22022-05-16 17:55:28 +08002443 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
2444 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
2445 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2446 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
2447 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002448 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2449 {
qs.xiong045f60b2023-03-29 17:36:14 +08002450 RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA_PSK LYNQ_WIFI_AUTH_WPA2_PSK\n");
you.chenc7357f22022-05-16 17:55:28 +08002451 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
2452 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2453 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002454 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
2455 {
2456
qs.xiong045f60b2023-03-29 17:36:14 +08002457 RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA2_WPA3 LYNQ_WIFI_AUTH_WPA3_PSK\n");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002458 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiong083d8072023-03-28 14:06:12 +08002459 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002460 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2461 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
2462
2463 }
2464 else
qs.xiong045f60b2023-03-29 17:36:14 +08002465 {
2466 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chenc7357f22022-05-16 17:55:28 +08002467 return -1;
2468 }
you.chen87ff5172022-05-06 11:30:57 +08002469
you.chen87ff5172022-05-06 11:30:57 +08002470 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong99b48d62022-04-07 05:41:29 -04002471
qs.xiongf1e48bb2023-03-28 13:38:22 +08002472 return 0;
qs.xiongd189c542022-03-31 00:58:23 -04002473}
2474
you.chen87ff5172022-05-06 11:30:57 +08002475int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongd189c542022-03-31 00:58:23 -04002476{
you.chen87ff5172022-05-06 11:30:57 +08002477 FILE * fp;
2478 int len, ret;
2479 int count, index;
2480 char *split_lines[128] = {0};
2481 char *buff, *p;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002482 RLOGD("enter lynq_ap_password_get");
qs.xiong99b48d62022-04-07 05:41:29 -04002483
you.chen87ff5172022-05-06 11:30:57 +08002484 CHECK_IDX(idx, CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04002485
you.chen87ff5172022-05-06 11:30:57 +08002486 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
2487// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002488 if (NULL == fp)
2489 {
2490 RLOGE("open file fail\n");
you.chen87ff5172022-05-06 11:30:57 +08002491 return -1;
2492 }
qs.xiong99b48d62022-04-07 05:41:29 -04002493
you.chen87ff5172022-05-06 11:30:57 +08002494 buff = alloca(MAX_RET);
2495 fseek(fp, 0, SEEK_SET);
2496 len = fread(buff, 1, MAX_RET, fp);
2497 fclose(fp);
qs.xiong99b48d62022-04-07 05:41:29 -04002498
qs.xiongf1e48bb2023-03-28 13:38:22 +08002499 for(index=0; index < len; index ++)
2500 {
2501 if (memcmp(buff + index, "network={", 9) != 0)
2502 {
you.chen87ff5172022-05-06 11:30:57 +08002503 continue;
2504 }
2505 p = buff + index + 9;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002506 for (; index < len; index ++ )
2507 {
2508 if (buff[index] != '}')
2509 {
you.chen87ff5172022-05-06 11:30:57 +08002510 continue;
2511 }
2512 buff[index] = '\0';
2513 break;
2514 }
2515 len = buff + index - p;
2516 }
2517
2518 count = lynq_split(p, len, '\n', split_lines);
2519
2520 ret = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002521 for(index=0; index < count; index++)
2522 {
you.chen87ff5172022-05-06 11:30:57 +08002523 p = strstr(split_lines[index], "psk=");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002524 if (p != NULL)
2525 {
you.chenc7357f22022-05-16 17:55:28 +08002526 p += 4;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002527 if (*p == '\"')
2528 {
you.chenc7357f22022-05-16 17:55:28 +08002529 p++;
2530 }
you.chen87ff5172022-05-06 11:30:57 +08002531 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002532 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2533 {
you.chenc7357f22022-05-16 17:55:28 +08002534 p += 9;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002535 if (*p == '\"')
2536 {
you.chenc7357f22022-05-16 17:55:28 +08002537 p++;
2538 }
2539 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002540 else
2541 {
you.chenc7357f22022-05-16 17:55:28 +08002542 continue;
you.chen87ff5172022-05-06 11:30:57 +08002543 }
2544
2545 strcpy(password, p);
2546
qs.xiongf1e48bb2023-03-28 13:38:22 +08002547 while(*password != '\0')
2548 {
2549 if (*password == '\"')
2550 {
you.chen87ff5172022-05-06 11:30:57 +08002551 *password = '\0';
2552 break;
2553 }
2554 password++;
2555 }
2556 ret = 0;
2557 break;
2558 } //end for(index=0; index < count; index++)
2559
2560 return ret;
qs.xiong8d42bb92022-03-02 09:43:11 -05002561}
2562
you.chen87ff5172022-05-06 11:30:57 +08002563static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
2564 char lynq_auth_str[MAX_RET] = {0};
you.chen5e363602022-05-08 12:20:18 +08002565 char lynq_proto_str[MAX_RET] = {0};
qs.xiong99b48d62022-04-07 05:41:29 -04002566
qs.xiongf1e48bb2023-03-28 13:38:22 +08002567 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
2568 {
you.chen87ff5172022-05-06 11:30:57 +08002569 return -1;
2570 }
2571
2572 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chen5e363602022-05-08 12:20:18 +08002573
qs.xiongf1e48bb2023-03-28 13:38:22 +08002574 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
2575 {
2576 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
you.chenf9d718d2023-04-14 18:17:09 +08002577 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08002578 if (strcmp(lynq_proto_str, "RSN") == 0)
you.chenf9d718d2023-04-14 18:17:09 +08002579 {
you.chen5e363602022-05-08 12:20:18 +08002580 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08002581 return 0;
you.chen5e363602022-05-08 12:20:18 +08002582 }
you.chenf9d718d2023-04-14 18:17:09 +08002583 else if (strcmp(lynq_proto_str, "WPA") == 0) // need compare when wpa3 supported
2584 {
2585 return 0;
2586 }
you.chen5e363602022-05-08 12:20:18 +08002587 }
2588 }
you.chenf9d718d2023-04-14 18:17:09 +08002589 else if (*auth == LYNQ_WIFI_AUTH_OPEN || *auth == LYNQ_WIFI_AUTH_WEP)
2590 {
2591 return 0;
2592 }
2593
qs.xiongf1e48bb2023-03-28 13:38:22 +08002594 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
2595 {
you.chenf9d718d2023-04-14 18:17:09 +08002596 RLOGE("check ieee80211w error\n");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002597 return -1;
2598 }
2599 if ( strncmp(lynq_auth_str,"1",1) == 0 )
2600 {
2601
you.chenf9d718d2023-04-14 18:17:09 +08002602 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
2603 return 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002604 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
2605 {
2606
2607 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiong045f60b2023-03-29 17:36:14 +08002608 return 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002609 }else
2610 {
you.chenf9d718d2023-04-14 18:17:09 +08002611 RLOGE("check ieee80211w error, not 1 or 2\n");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002612 *auth = -1;
2613 return -1;
2614 }
you.chen87ff5172022-05-06 11:30:57 +08002615 return 0;
2616}
2617
2618int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong8d42bb92022-03-02 09:43:11 -05002619{
qs.xiongf1e48bb2023-03-28 13:38:22 +08002620 RLOGD("enter lynq_sta_ssid_password_set");
you.chen87ff5172022-05-06 11:30:57 +08002621 int pass_len, net_no, count, index;
2622 char lynq_tmp_cmd[300]={0};
2623 int net_no_list[128];
2624 lynq_wifi_auth_s net_auth;
2625 pass_len=strlen(password);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002626 if(pass_len < 8 || pass_len >= 64)
2627 {
2628 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen87ff5172022-05-06 11:30:57 +08002629 return -1;
2630 }
2631
2632 CHECK_IDX(idx, CTRL_STA);
2633
2634 net_no = -1;
2635 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
2636
qs.xiongf1e48bb2023-03-28 13:38:22 +08002637 for (index=0; index < count; index++)
2638 {
you.chen87ff5172022-05-06 11:30:57 +08002639 net_auth = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002640 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
2641 {
you.chen87ff5172022-05-06 11:30:57 +08002642 net_no = net_no_list[index];
2643 break;
2644 }
2645 }
2646
qs.xiongf1e48bb2023-03-28 13:38:22 +08002647 if (net_no < 0)
2648 {
you.chen87ff5172022-05-06 11:30:57 +08002649 return -1;
2650 }
2651
2652 CHECK_WPA_CTRL(CTRL_STA);
2653
2654 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
2655
2656 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2657 DO_OK_FAIL_REQUEST(cmd_save_config);
2658
2659 return 0;
2660}
2661
2662int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
2663
2664 FILE * fp;
you.chened802ab2023-02-13 10:50:35 +08002665 int len, ret, network_len, i, ssid_len;
you.chen87ff5172022-05-06 11:30:57 +08002666 int count, index;
2667 char *split_lines[128] = {0};
you.chened802ab2023-02-13 10:50:35 +08002668 char *buff, *p, *ssid, *ssid_end_flag;
2669 char tmp_ssid[128]={0};
you.chen68e889d2023-06-01 16:39:54 +08002670 RLOGD("enter lynq_sta_ssid_password_get");
you.chen87ff5172022-05-06 11:30:57 +08002671
you.chen0c938042022-08-06 16:59:10 +08002672 network_len = 0;
2673 p = NULL;
you.chen68e889d2023-06-01 16:39:54 +08002674 buff = NULL;
you.chen0c938042022-08-06 16:59:10 +08002675
you.chen87ff5172022-05-06 11:30:57 +08002676 CHECK_IDX(idx, CTRL_STA);
2677
qs.xiongf1e48bb2023-03-28 13:38:22 +08002678 if (NULL == password)
2679 {
2680 RLOGE("bad param\n");
you.chen0c938042022-08-06 16:59:10 +08002681 return -1;
2682 }
2683
you.chen87ff5172022-05-06 11:30:57 +08002684 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002685 if (NULL == fp)
2686 {
2687 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen87ff5172022-05-06 11:30:57 +08002688 return -1;
2689 }
2690
you.chen68e889d2023-06-01 16:39:54 +08002691 fseek(fp, 0, SEEK_END);
2692 len = ftell(fp);
2693 buff = malloc(len + 1);
2694
2695 if (buff == NULL)
2696 {
2697 RLOGE("[lynq_sta_ssid_password_get] malloc memory [%d] fail\n", len);
2698 return -1;
2699 }
2700
you.chen87ff5172022-05-06 11:30:57 +08002701 fseek(fp, 0, SEEK_SET);
you.chen68e889d2023-06-01 16:39:54 +08002702 len = fread(buff, 1, len, fp);
you.chen87ff5172022-05-06 11:30:57 +08002703 fclose(fp);
2704
qs.xiongf1e48bb2023-03-28 13:38:22 +08002705 for(index=0; index < len; index ++)
2706 {
2707 for(; index < len; index ++)
you.chen68e889d2023-06-01 16:39:54 +08002708 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08002709 if (memcmp(buff + index, "network={", 9) != 0)
you.chen68e889d2023-06-01 16:39:54 +08002710 {
you.chen87ff5172022-05-06 11:30:57 +08002711 continue;
2712 }
you.chen68e889d2023-06-01 16:39:54 +08002713 p = buff + index + 9;
2714 for (; index < len; index ++ )
2715 {
2716 if (buff[index] != '}')
2717 {
2718 continue;
2719 }
2720 buff[index] = '\0';
2721 break;
2722 }
2723 network_len = buff + index - p;
2724 break;
you.chen87ff5172022-05-06 11:30:57 +08002725 }
2726
qs.xiongc6cab7c2023-02-17 18:41:07 +08002727 if (p == NULL)
you.chen68e889d2023-06-01 16:39:54 +08002728 {
2729 if (buff != NULL)
2730 {
2731 free(buff);
2732 }
2733
qs.xiongc6cab7c2023-02-17 18:41:07 +08002734 return -1;
you.chen68e889d2023-06-01 16:39:54 +08002735 }
qs.xiongc6cab7c2023-02-17 18:41:07 +08002736
you.chened802ab2023-02-13 10:50:35 +08002737 ssid = strstr(p, "ssid=");
2738 if (ssid != NULL) {
2739 ssid += strlen("ssid=");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002740 if (ssid[0] == '\"')
you.chen68e889d2023-06-01 16:39:54 +08002741 {
you.chened802ab2023-02-13 10:50:35 +08002742 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2743 break;
2744 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002745 else
you.chen68e889d2023-06-01 16:39:54 +08002746 {
you.chened802ab2023-02-13 10:50:35 +08002747 ssid_end_flag = strstr(ssid, "\n");
2748 if (ssid_end_flag != NULL)
2749 {
2750 ssid_len = (ssid_end_flag - ssid) / 2;
2751 for(i=0; i<ssid_len; i++)
2752 {
2753 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2754 }
2755 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2756 break;
2757 }
2758 }
you.chen87ff5172022-05-06 11:30:57 +08002759 }
you.chened802ab2023-02-13 10:50:35 +08002760
you.chen87ff5172022-05-06 11:30:57 +08002761 }
2762
qs.xiongf1e48bb2023-03-28 13:38:22 +08002763 if (index >= len || NULL == p || network_len <= 0)
2764 {
you.chen68e889d2023-06-01 16:39:54 +08002765 if (buff != NULL)
2766 {
2767 free(buff);
2768 }
you.chen87ff5172022-05-06 11:30:57 +08002769 return -1;
2770 }
2771
you.chen0c938042022-08-06 16:59:10 +08002772 count = lynq_split(p, network_len, '\n', split_lines);
you.chen87ff5172022-05-06 11:30:57 +08002773
2774 ret = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002775 for(index=0; index < count; index++)
2776 {
you.chen87ff5172022-05-06 11:30:57 +08002777 p = strstr(split_lines[index], "psk=");
qs.xiongf1e48bb2023-03-28 13:38:22 +08002778 if (p != NULL)
you.chen68e889d2023-06-01 16:39:54 +08002779 {
you.chenc7357f22022-05-16 17:55:28 +08002780 p += 4;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002781 if (*p == '\"')
you.chen68e889d2023-06-01 16:39:54 +08002782 {
you.chenc7357f22022-05-16 17:55:28 +08002783 p++;
2784 }
you.chen87ff5172022-05-06 11:30:57 +08002785 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002786 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
you.chen68e889d2023-06-01 16:39:54 +08002787 {
you.chenc7357f22022-05-16 17:55:28 +08002788 p += 9;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002789 if (*p == '\"')
you.chen68e889d2023-06-01 16:39:54 +08002790 {
you.chenc7357f22022-05-16 17:55:28 +08002791 p++;
2792 }
2793 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002794 else
you.chen68e889d2023-06-01 16:39:54 +08002795 {
you.chenc7357f22022-05-16 17:55:28 +08002796 continue;
you.chen87ff5172022-05-06 11:30:57 +08002797 }
2798
qs.xiong9c1020c2023-02-21 19:12:54 +08002799 if (*p == '\"')
2800 p++;
2801 strncpy(password, p, 64);
you.chen87ff5172022-05-06 11:30:57 +08002802
qs.xiong9c1020c2023-02-21 19:12:54 +08002803 p = password;
qs.xiongf1e48bb2023-03-28 13:38:22 +08002804 while(password - p < 64 && *password != '\0')
you.chen68e889d2023-06-01 16:39:54 +08002805 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08002806 if (*password == '\"')
you.chen68e889d2023-06-01 16:39:54 +08002807 {
you.chen87ff5172022-05-06 11:30:57 +08002808 *password = '\0';
2809 break;
2810 }
2811 password++;
2812 }
2813 ret = 0;
2814 break;
2815 } //end for(index=0; index < count; index++)
2816
you.chen68e889d2023-06-01 16:39:54 +08002817 if (buff != NULL)
2818 {
2819 free(buff);
2820 }
2821
you.chen87ff5172022-05-06 11:30:57 +08002822 return ret;
2823}
2824
2825static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2826{
qs.xiongf1e48bb2023-03-28 13:38:22 +08002827 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongd189c542022-03-31 00:58:23 -04002828
qs.xiongf1e48bb2023-03-28 13:38:22 +08002829 if (sta_ssid == NULL)
2830 {
2831 RLOGE("sta_ssid is null\n");
2832 return -1;
you.chen87ff5172022-05-06 11:30:57 +08002833 }
2834
qs.xiongf1e48bb2023-03-28 13:38:22 +08002835 CHECK_WPA_CTRL(CTRL_STA);
you.chen87ff5172022-05-06 11:30:57 +08002836
2837 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2838
2839 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2840// DO_OK_FAIL_REQUEST(cmd_save_config);
2841
qs.xiongf1e48bb2023-03-28 13:38:22 +08002842 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05002843
2844}
2845
you.chen87ff5172022-05-06 11:30:57 +08002846static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong8d42bb92022-03-02 09:43:11 -05002847{
you.chen87ff5172022-05-06 11:30:57 +08002848 char lynq_disable_cmd[128]={0};
2849 char lynq_select_cmd[128]={0};
2850
2851 CHECK_WPA_CTRL(CTRL_STA);
2852
qs.xiongf1e48bb2023-03-28 13:38:22 +08002853 if (save != 0)
2854 {
you.chen948e0032022-06-07 18:01:16 +08002855 if (start_flag != 0)
2856 {
2857 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2858 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2859 }
2860 else
2861 {
2862 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2863 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2864 }
you.chen87ff5172022-05-06 11:30:57 +08002865 DO_OK_FAIL_REQUEST(cmd_save_config);
2866 }
2867
qs.xiongf1e48bb2023-03-28 13:38:22 +08002868 if (start_flag == 0)
2869 {
you.chenc7357f22022-05-16 17:55:28 +08002870 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen87ff5172022-05-06 11:30:57 +08002871 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2872 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002873 else
2874 {
you.chen87ff5172022-05-06 11:30:57 +08002875 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2876 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2877 }
2878
2879 return 0;
2880}
2881
2882int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2883{
qs.xiongf1e48bb2023-03-28 13:38:22 +08002884 RLOGD("enter lynq_sta_ssid_password_set");
you.chen87ff5172022-05-06 11:30:57 +08002885 CHECK_IDX(idx, CTRL_STA);
2886
you.chenc7357f22022-05-16 17:55:28 +08002887 curr_status_info curr_state;
2888 ap_info_s ap_info;
2889 curr_state.ap = &ap_info;
2890 curr_state.state = NULL;
2891
qs.xiongf1e48bb2023-03-28 13:38:22 +08002892 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2893 {
you.chened802ab2023-02-13 10:50:35 +08002894 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chenc7357f22022-05-16 17:55:28 +08002895 return 0;
2896 }
2897
2898 return -1;
you.chen87ff5172022-05-06 11:30:57 +08002899}
2900
2901int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2902{
you.chen61c7aee2022-08-06 17:01:16 +08002903 scan_info_s *scan_list = NULL;
2904 saved_ap_info_s *save_list = NULL;
you.chen87ff5172022-05-06 11:30:57 +08002905 int scan_len=0;
2906 int save_len=0;
2907 int best_index = -1;
2908 int best_scan_index = -1;
2909 int best_rssi = 0;
you.chen61c7aee2022-08-06 17:01:16 +08002910 int i, j, ret;
2911
2912 ret = -1;
you.chen87ff5172022-05-06 11:30:57 +08002913
2914 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002915 if (info == NULL)
2916 {
you.chen87ff5172022-05-06 11:30:57 +08002917 return -1;
2918 }
2919
2920 curr_status_info curr_state;
2921 ap_info_s ap_info;
you.chen61c7aee2022-08-06 17:01:16 +08002922 char status[64];
you.chen87ff5172022-05-06 11:30:57 +08002923
you.chen61c7aee2022-08-06 17:01:16 +08002924 memset(&ap_info, 0, sizeof (ap_info));
2925 memset(status, 0, sizeof (status));
2926
2927 curr_state.ap = &ap_info;
2928 curr_state.state = status;
2929
qs.xiongf1e48bb2023-03-28 13:38:22 +08002930 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2931 {
you.chen87ff5172022-05-06 11:30:57 +08002932 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen61c7aee2022-08-06 17:01:16 +08002933 if (strcmp(status, STATE_COMPLETED) == 0)
2934 {
2935 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2936 }
2937 else
2938 {
2939 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2940 }
you.chenc32dc912023-04-27 17:52:44 +08002941 lynq_get_connect_ap_ip(idx, info->base_info.ap_ip);
you.chen87ff5172022-05-06 11:30:57 +08002942 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen61c7aee2022-08-06 17:01:16 +08002943 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen87ff5172022-05-06 11:30:57 +08002944 return 0;
2945 }
2946
you.chen61c7aee2022-08-06 17:01:16 +08002947 lynq_wifi_sta_start_scan(idx);
qs.xionge2dc2e02023-04-06 11:08:48 +08002948 sleep(2);
qs.xiongf1e48bb2023-03-28 13:38:22 +08002949 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2950 {
you.chen61c7aee2022-08-06 17:01:16 +08002951 if (NULL != scan_list)
2952 {
2953 free(scan_list);
2954 }
you.chen87ff5172022-05-06 11:30:57 +08002955 return -1;
2956 }
2957
qs.xiongf1e48bb2023-03-28 13:38:22 +08002958 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2959 {
you.chen61c7aee2022-08-06 17:01:16 +08002960 if (NULL != scan_list)
2961 {
2962 free(scan_list);
2963 }
2964 if (NULL != save_list)
2965 {
2966 free(save_list);
2967 }
you.chen87ff5172022-05-06 11:30:57 +08002968 return -1;
2969 }
2970
qs.xiongf1e48bb2023-03-28 13:38:22 +08002971 for (i=0; i < save_len; i++)
2972 {
2973 for (j=0; j < scan_len; j++)
2974 {
you.chen87ff5172022-05-06 11:30:57 +08002975 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiongf1e48bb2023-03-28 13:38:22 +08002976 && save_list[i].base_info.auth == scan_list[j].auth)
2977 {
2978 if (best_rssi == 0)
2979 {
you.chen61c7aee2022-08-06 17:01:16 +08002980 best_index = i;
you.chen87ff5172022-05-06 11:30:57 +08002981 best_rssi = scan_list[j].rssi;
2982 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08002983 else if (best_rssi > scan_list[j].rssi)
2984 {
you.chen87ff5172022-05-06 11:30:57 +08002985 best_index = i;
2986 best_scan_index = j;
2987 best_rssi = scan_list[j].rssi;
2988 }
you.chened802ab2023-02-13 10:50:35 +08002989 strncpy(save_list[i].base_info.ap_mac, scan_list[j].mac, sizeof (save_list[i].base_info.ap_mac));
you.chen87ff5172022-05-06 11:30:57 +08002990 break;
2991 }
2992 }
2993 }
2994
qs.xiongf1e48bb2023-03-28 13:38:22 +08002995 if (best_index >= 0)
2996 {
you.chen87ff5172022-05-06 11:30:57 +08002997 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chened802ab2023-02-13 10:50:35 +08002998 inner_get_ip_by_mac( info->base_info.ap_mac, info->base_info.ap_ip, sizeof (info->base_info.ap_ip));
you.chen87ff5172022-05-06 11:30:57 +08002999 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
3000 info->rssi = best_rssi;
you.chen61c7aee2022-08-06 17:01:16 +08003001 ret = 0;
you.chen87ff5172022-05-06 11:30:57 +08003002 }
3003
you.chen61c7aee2022-08-06 17:01:16 +08003004 if (NULL != scan_list)
3005 {
3006 free(scan_list);
3007 }
3008 if (NULL != save_list)
3009 {
3010 free(save_list);
3011 }
3012
3013 return ret;
you.chen87ff5172022-05-06 11:30:57 +08003014}
3015
3016static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
3017{
qs.xiong045f60b2023-03-29 17:36:14 +08003018 char lynq_auth_cmd[128]={0};
you.chen87ff5172022-05-06 11:30:57 +08003019 char lynq_ket_mgmt_cmd[64]={0};
3020 char lynq_pairwise_cmd[64]={0};
3021 char lynq_psk_cmd[64]={0};
3022
3023 CHECK_WPA_CTRL(CTRL_STA);
3024
qs.xiongf1e48bb2023-03-28 13:38:22 +08003025 switch(auth)
3026 {
3027 case LYNQ_WIFI_AUTH_OPEN:
you.chen87ff5172022-05-06 11:30:57 +08003028 {
3029 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong99b48d62022-04-07 05:41:29 -04003030
you.chen87ff5172022-05-06 11:30:57 +08003031 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003032// DO_OK_FAIL_REQUEST(cmd_save_config);
3033 break;
3034 }
3035 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen87ff5172022-05-06 11:30:57 +08003036 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiongf1e48bb2023-03-28 13:38:22 +08003037 {
3038 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
3039 {
you.chen87ff5172022-05-06 11:30:57 +08003040 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
3041 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08003042 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
3043 {
you.chen5e363602022-05-08 12:20:18 +08003044 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen87ff5172022-05-06 11:30:57 +08003045 }
3046 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
3047 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong99b48d62022-04-07 05:41:29 -04003048
you.chen87ff5172022-05-06 11:30:57 +08003049 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
3050 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
3051 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong99b48d62022-04-07 05:41:29 -04003052
qs.xiongf1e48bb2023-03-28 13:38:22 +08003053 if (password != NULL)
3054 {
you.chen87ff5172022-05-06 11:30:57 +08003055 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
3056 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003057 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen87ff5172022-05-06 11:30:57 +08003058 }
qs.xiong99b48d62022-04-07 05:41:29 -04003059
you.chen87ff5172022-05-06 11:30:57 +08003060// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003061 break;
3062 }
3063 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
3064 {
qs.xionge2dc2e02023-04-06 11:08:48 +08003065 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiong045f60b2023-03-29 17:36:14 +08003066 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003067 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
3068 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
3069
qs.xionge2dc2e02023-04-06 11:08:48 +08003070 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003071 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
3072 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
3073 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
3074
3075 break;
3076 }
3077 case LYNQ_WIFI_AUTH_WPA3_PSK:
3078 {
qs.xionge2dc2e02023-04-06 11:08:48 +08003079 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiong2e4b05a2023-04-17 09:45:19 +08003080 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE",net_no);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003081 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
3082 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
3083
qs.xionge2dc2e02023-04-06 11:08:48 +08003084 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003085 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
3086 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
3087 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
3088
3089 break;
3090 }
3091 default:
3092 return -1;
you.chen87ff5172022-05-06 11:30:57 +08003093 }
qs.xiong99b48d62022-04-07 05:41:29 -04003094
qs.xiongf1e48bb2023-03-28 13:38:22 +08003095 return 0;
qs.xiong799dab02022-03-14 09:12:12 -04003096}
qs.xiong8d42bb92022-03-02 09:43:11 -05003097
you.chen87ff5172022-05-06 11:30:57 +08003098static int inner_get_curr_net_no(int interface) {
3099 curr_status_info curr_state;
3100 curr_state.ap = NULL;
3101 curr_state.state = NULL;
3102
qs.xiongf1e48bb2023-03-28 13:38:22 +08003103 if (0 != inner_get_status_info(interface, &curr_state))
3104 {
you.chen87ff5172022-05-06 11:30:57 +08003105 return -1;
3106 }
3107
3108 return curr_state.net_no;
3109}
3110
3111int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong8d42bb92022-03-02 09:43:11 -05003112{
you.chen87ff5172022-05-06 11:30:57 +08003113 int net_no;
3114 CHECK_IDX(idx, CTRL_STA);
qs.xiongd189c542022-03-31 00:58:23 -04003115
you.chen87ff5172022-05-06 11:30:57 +08003116 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong8d42bb92022-03-02 09:43:11 -05003117
qs.xiongf1e48bb2023-03-28 13:38:22 +08003118 if (net_no < 0)
3119 {
you.chen87ff5172022-05-06 11:30:57 +08003120 return -1;
3121 }
3122
3123 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong8d42bb92022-03-02 09:43:11 -05003124}
3125
you.chen083a2952023-05-12 19:39:06 +08003126int lynq_wifi_sta_connect_timeout(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw, int timeout)
qs.xiong8d42bb92022-03-02 09:43:11 -05003127{
you.chen87ff5172022-05-06 11:30:57 +08003128 int count, net_no, index;
3129 int net_no_list[128];
qs.xionga4ba25a2023-05-03 13:12:07 +08003130 char rm_net_cmd[128];
you.chen87ff5172022-05-06 11:30:57 +08003131 lynq_wifi_auth_s net_auth;
you.chenf9d718d2023-04-14 18:17:09 +08003132 curr_status_info curr_state;
3133 ap_info_s ap_info;
3134 char status[64];
qs.xiongd189c542022-03-31 00:58:23 -04003135
qs.xiongf1e48bb2023-03-28 13:38:22 +08003136 if (ssid == NULL || *ssid == '\0')
3137 {
3138 RLOGE("bad ssid\n");
you.chen87ff5172022-05-06 11:30:57 +08003139 return -1;
3140 }
qs.xiong8d42bb92022-03-02 09:43:11 -05003141
qs.xiongf1e48bb2023-03-28 13:38:22 +08003142 if (LYNQ_WIFI_AUTH_OPEN != auth)
3143 {
3144 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
you.chenf9d718d2023-04-14 18:17:09 +08003145 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003146 RLOGE("bad password\n");
you.chen87ff5172022-05-06 11:30:57 +08003147 return -1;
3148 }
3149 }
qs.xiong8d42bb92022-03-02 09:43:11 -05003150
you.chenf9d718d2023-04-14 18:17:09 +08003151
3152 pthread_mutex_lock(&s_global_check_mutex);
3153 if (s_sta_status != INNER_STA_STATUS_INIT)
3154 {
3155 s_sta_status = INNER_STA_STATUS_CANCEL;
3156 pthread_cond_signal(&s_global_check_cond);
3157 }
3158 pthread_mutex_unlock(&s_global_check_mutex);
3159
you.chen87ff5172022-05-06 11:30:57 +08003160 CHECK_IDX(idx, CTRL_STA);
you.chenf9d718d2023-04-14 18:17:09 +08003161 CHECK_WPA_CTRL(CTRL_STA);
you.chen87ff5172022-05-06 11:30:57 +08003162
3163 net_no = -1;
you.chenf9d718d2023-04-14 18:17:09 +08003164 memset(&ap_info, 0, sizeof (ap_info));
3165 memset(status, 0, sizeof (status));
you.chen87ff5172022-05-06 11:30:57 +08003166
you.chenf9d718d2023-04-14 18:17:09 +08003167 curr_state.ap = &ap_info;
3168 curr_state.state = status;
3169
3170 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
qs.xiongf1e48bb2023-03-28 13:38:22 +08003171 {
you.chenf9d718d2023-04-14 18:17:09 +08003172 if (strcmp(status, STATE_COMPLETED) == 0 && strcmp(ap_info.ap_ssid, ssid) ==0 && ap_info.auth == auth)
3173 {
3174 net_no = curr_state.net_no;
3175 if (0 == lynq_sta_ssid_password_get(idx, &ap_info, ap_info.psw)
3176 && strcmp(ap_info.psw, psw) == 0)
3177 {
3178 RLOGD("already connected\n");
3179
3180 pthread_mutex_lock(&s_global_check_mutex);
3181 s_sta_status = INNER_STA_STATUS_CONNECTED;
3182 pthread_cond_signal(&s_global_check_cond);
3183 pthread_mutex_unlock(&s_global_check_mutex);
3184 return 0;
3185 }
you.chen87ff5172022-05-06 11:30:57 +08003186 }
3187 }
3188
you.chenf9d718d2023-04-14 18:17:09 +08003189 if (net_no == -1)
qs.xiongf1e48bb2023-03-28 13:38:22 +08003190 {
you.chenf9d718d2023-04-14 18:17:09 +08003191 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
3192
3193 for (index=0; index < count; index++)
3194 {
3195 net_auth = -1;
3196 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
3197 {
3198 net_no = net_no_list[index];
3199 break;
3200 }
you.chen87ff5172022-05-06 11:30:57 +08003201 }
3202
you.chenf9d718d2023-04-14 18:17:09 +08003203 if (net_no < 0)
3204 {
qs.xionga4ba25a2023-05-03 13:12:07 +08003205 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
3206 for ( index = 0; index < (count - STA_MAX_SAVED_AP_NUM + 1 ) ;index++) //+1 is for add new network
3207 {
3208 sprintf(rm_net_cmd,"REMOVE_NETWORK %d",net_no_list[index]);
3209 RLOGD("call cmd rm_net_cmd: %s;index is %d\n",rm_net_cmd,index);
3210 DO_OK_FAIL_REQUEST(rm_net_cmd);
3211 }
you.chenf9d718d2023-04-14 18:17:09 +08003212 net_no = lynq_add_network(CTRL_STA);
3213 if (net_no == -1)
3214 {
3215 return -1;
3216 }
3217
3218 RLOGD("net no is %d\n", net_no);
3219 if (0 != inner_set_sta_ssid(net_no, ssid))
3220 {
3221 return -1;
3222 }
you.chen87ff5172022-05-06 11:30:57 +08003223 }
3224 }
3225
qs.xiongf1e48bb2023-03-28 13:38:22 +08003226 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
3227 {
you.chen87ff5172022-05-06 11:30:57 +08003228 return -1;
3229 }
3230
you.chenf9d718d2023-04-14 18:17:09 +08003231
3232 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen57eb5842023-05-18 14:19:46 +08003233 system("echo \"\" > /tmp/wlan0_dhcpcd_router");
you.chenf9d718d2023-04-14 18:17:09 +08003234 usleep(200*1000);
3235
3236 ret = inner_sta_start_stop(net_no, 1, 1);
3237
3238 pthread_mutex_lock(&s_global_check_mutex);
3239 s_sta_status = INNER_STA_STATUS_CONNECTING;
3240 strcpy(s_sta_current_connecting_ssid, ssid);
3241 struct timeval now;
3242 gettimeofday(&now,NULL);
you.chen083a2952023-05-12 19:39:06 +08003243 s_sta_connect_timeout.tv_sec = now.tv_sec + timeout;
you.chenf9d718d2023-04-14 18:17:09 +08003244 s_sta_connect_timeout.tv_nsec = now.tv_usec*1000;
3245 pthread_cond_signal(&s_global_check_cond);
3246 pthread_mutex_unlock(&s_global_check_mutex);
3247 return ret;
qs.xiong8d42bb92022-03-02 09:43:11 -05003248}
3249
you.chen083a2952023-05-12 19:39:06 +08003250int lynq_wifi_sta_connect(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw)
3251{
3252 return lynq_wifi_sta_connect_timeout(idx, ssid, auth, psw, MAX_CONNNECT_TIME);
3253}
3254
you.chen87ff5172022-05-06 11:30:57 +08003255int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong8d42bb92022-03-02 09:43:11 -05003256{
you.chen87ff5172022-05-06 11:30:57 +08003257 ap_info_s ap;
3258 curr_status_info curr_state;
3259 ap.ap_ssid[0] = '\0';
qs.xiong99b48d62022-04-07 05:41:29 -04003260
qs.xiongf1e48bb2023-03-28 13:38:22 +08003261 if (ssid == NULL || *ssid == '\0')
3262 {
3263 RLOGE("input ssid is NULL\n");
you.chen87ff5172022-05-06 11:30:57 +08003264 return -1;
3265 }
qs.xiong8d42bb92022-03-02 09:43:11 -05003266
you.chen87ff5172022-05-06 11:30:57 +08003267 CHECK_IDX(idx, CTRL_STA);
qs.xiong99b48d62022-04-07 05:41:29 -04003268
you.chen87ff5172022-05-06 11:30:57 +08003269 curr_state.ap = &ap;
you.chenefc7f3f2022-05-06 17:50:16 +08003270 curr_state.state = NULL;
3271
qs.xiongf1e48bb2023-03-28 13:38:22 +08003272 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
3273 {
you.chen87ff5172022-05-06 11:30:57 +08003274 return 0;
3275 }
qs.xiong799dab02022-03-14 09:12:12 -04003276
qs.xiongf1e48bb2023-03-28 13:38:22 +08003277 if (strcmp(ap.ap_ssid, ssid) != 0)
3278 {
you.chen87ff5172022-05-06 11:30:57 +08003279 return 0;
3280 }
3281
you.chenf9d718d2023-04-14 18:17:09 +08003282 pthread_mutex_lock(&s_global_check_mutex);
3283 s_sta_status = INNER_STA_STATUS_DISCONNECTING;
3284 pthread_mutex_unlock(&s_global_check_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003285 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong8d42bb92022-03-02 09:43:11 -05003286}
qs.xiong99b48d62022-04-07 05:41:29 -04003287
you.chen5e363602022-05-08 12:20:18 +08003288int lynq_wifi_sta_start(lynq_wifi_index_e idx)
3289{
qs.xiongfa7be312023-01-18 13:17:41 +08003290// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
3291// const char *lynq_reconnect_cmd = "RECONNECT";
3292 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
3293 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
3294// const char *lynq_first_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 remove_net all";
qs.xiong8d42bb92022-03-02 09:43:11 -05003295
you.chen87ff5172022-05-06 11:30:57 +08003296 CHECK_IDX(idx, CTRL_STA);
you.chen5e363602022-05-08 12:20:18 +08003297 CHECK_WPA_CTRL(CTRL_STA);
3298
you.chencd882682023-04-24 15:39:37 +08003299 ret = system_call_v("%s %s", start_stop_sta_script, "start");
3300 if (ret != 0)
qs.xiongfa7be312023-01-18 13:17:41 +08003301 {
you.chencd882682023-04-24 15:39:37 +08003302 RLOGE("lynq_wifi_ap_start excute script fail");
you.chen87ff5172022-05-06 11:30:57 +08003303 return -1;
3304 }
qs.xionge5164a82022-03-15 08:03:26 -04003305
qs.xiongfa7be312023-01-18 13:17:41 +08003306 system(lynq_enable_sta_cmd);
3307 system(lynq_reconnect_cmd);
3308// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chen5e363602022-05-08 12:20:18 +08003309 return 0;
qs.xiong8d42bb92022-03-02 09:43:11 -05003310}
3311
you.chen68e889d2023-06-01 16:39:54 +08003312static int inner_get_status_info_state (int interface, char *state) {
3313 curr_status_info curr_state;
3314 curr_state.ap = NULL;
3315 curr_state.state = state;
3316 return inner_get_status_info(interface, &curr_state);
3317}
you.chen87ff5172022-05-06 11:30:57 +08003318int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong99b48d62022-04-07 05:41:29 -04003319{
qs.xiongfa7be312023-01-18 13:17:41 +08003320// char lynq_disable_network_cmd[MAX_CMD];
3321// curr_status_info curr_state;
3322// ap_info_s ap_info;
you.chen68e889d2023-06-01 16:39:54 +08003323 int i=0;
3324 char state[MAX_CMD];
you.chen87ff5172022-05-06 11:30:57 +08003325
you.chen68e889d2023-06-01 16:39:54 +08003326// const char * lynq_disable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disable_net all";
you.chen5e363602022-05-08 12:20:18 +08003327 CHECK_IDX(idx, CTRL_STA);
3328 CHECK_WPA_CTRL(CTRL_STA);
3329
you.chen68e889d2023-06-01 16:39:54 +08003330// system(lynq_disable_sta_cmd);
3331 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen5e363602022-05-08 12:20:18 +08003332 DO_OK_FAIL_REQUEST(cmd_save_config);
you.chencd882682023-04-24 15:39:37 +08003333
3334 ret = system_call_v("%s %s", start_stop_sta_script, "stop");
3335 if (ret != 0)
3336 {
3337 RLOGE("lynq_wifi_ap_start excute script fail");
3338 return -1;
3339 }
3340
you.chen68e889d2023-06-01 16:39:54 +08003341 for (i=0; i < 30; i++) // to check if sta is realy stoped
3342 {
3343 if (inner_get_status_info_state(idx, state) != 0)
3344 {
3345 break;
3346 }
3347
3348 if (memcmp(state, STATE_DISCONNECTED, strlen (STATE_DISCONNECTED)) == 0)
3349 {
3350 break;
3351 }
3352 RLOGD("lynq_wifi_ap_start curr state %s", state);
3353 usleep(SLEEP_TIME_ON_IDLE);
3354 }
3355
you.chen5e363602022-05-08 12:20:18 +08003356 return 0;
3357// return system("connmanctl disable wifi");
qs.xiongd189c542022-03-31 00:58:23 -04003358}
qs.xiong336424d2023-07-06 21:16:20 +08003359int lynq_wifi_sta_stop_net(lynq_wifi_index_e idx,int networkid)
3360{
3361 char LYNQ_DISABLE_CMD[128]={0};
3362 CHECK_IDX(idx, CTRL_STA);
3363 CHECK_WPA_CTRL(CTRL_STA);
3364 sprintf(LYNQ_DISABLE_CMD,"DISABLE_NETWORK %d",networkid);
3365 RLOGD("LYNQ_DISABLE_CMD is:%d\n",LYNQ_DISABLE_CMD);
3366 DO_OK_FAIL_REQUEST(LYNQ_DISABLE_CMD);
3367 return 0;
3368}
qs.xiong8d42bb92022-03-02 09:43:11 -05003369
you.chen87ff5172022-05-06 11:30:57 +08003370//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
3371// int i, count;
3372// char *p;
3373// const char * FLAG_SSID = "ssid=";
3374// const char * FLAG_SBSID = "bssid=";
3375// const char * FLAG_KEY_MGMT = "key_mgmt=";
3376// const char * FLAG_FREQ = "freq=";
3377// char lynq_sta_cmd[MAX_CMD];
3378// char *split_lines[128] = {0};
3379
3380// CHECK_WPA_CTRL(CTRL_AP);
3381
3382// sprintf(lynq_sta_cmd, "STA %s", bssid);
3383
3384// DO_REQUEST(lynq_sta_cmd);
3385
3386// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3387
3388// for(i=0; i < count; i++) {
3389// p = strstr(split_lines[i], FLAG_SSID);
3390// if (p != NULL) {
3391// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
3392// continue;
3393// }
3394// }
3395
3396// lynq_get_interface_ip(idx, ap->ap_ip);
3397// lynq_ap_password_set(idx, ap->psw);
3398
3399// return 0;
3400//}
3401
3402static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
3403 curr_status_info curr_state;
3404 curr_state.ap = ap;
3405 curr_state.state = NULL;
3406 return inner_get_status_info(interface, &curr_state);
3407}
3408
3409int lynq_get_ap_device_list(lynq_wifi_index_e idx, ap_info_s **ap, device_info_s ** list,int * len)
qs.xiong99b48d62022-04-07 05:41:29 -04003410{
you.chened802ab2023-02-13 10:50:35 +08003411 int index, line_count;
3412 device_info_s *dev_info;
you.chen87ff5172022-05-06 11:30:57 +08003413 const char *lynq_first_sta_cmd = "STA-FIRST";
3414 char lynq_next_sta_cmd[MAX_CMD];
3415 char *bssid[1024] = {0};
you.chen87ff5172022-05-06 11:30:57 +08003416 char *split_lines[128] = {0};
qs.xiong99b48d62022-04-07 05:41:29 -04003417
you.chen87ff5172022-05-06 11:30:57 +08003418 CHECK_IDX(idx, CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04003419
you.chen87ff5172022-05-06 11:30:57 +08003420 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong99b48d62022-04-07 05:41:29 -04003421
you.chen083a2952023-05-12 19:39:06 +08003422 // ap_info_s * tmp_ap;
3423 // device_info_s * tmp_list;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003424 if (ap == NULL || list == NULL || len == NULL)
3425 {
3426 RLOGE("bad input param");
you.chen87ff5172022-05-06 11:30:57 +08003427 return -1;
3428 }
3429
you.chen083a2952023-05-12 19:39:06 +08003430 // ap = &tmp_ap;
3431 // list = &tmp_list;
you.chen87ff5172022-05-06 11:30:57 +08003432 *ap = malloc(sizeof (ap_info_s));
you.chen083a2952023-05-12 19:39:06 +08003433 memset(*ap, 0, sizeof (ap_info_s));
you.chen87ff5172022-05-06 11:30:57 +08003434
you.chen083a2952023-05-12 19:39:06 +08003435 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0 || (*ap)->ap_ssid[0] == '\0')
qs.xiongf1e48bb2023-03-28 13:38:22 +08003436 {
you.chen083a2952023-05-12 19:39:06 +08003437 RLOGE("inner_get_status_info_ap !=0 or ap_ssid is empty\n");
you.chen87ff5172022-05-06 11:30:57 +08003438 return -1;
3439 }
3440
3441 lynq_get_interface_ip(idx, (*ap)->ap_ip);
3442 lynq_ap_password_get(idx, (*ap)->psw);
3443
you.chen87ff5172022-05-06 11:30:57 +08003444 DO_REQUEST(lynq_first_sta_cmd);
3445
3446 index = 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003447 while (reply_len > 0)
3448 {
3449 if (memcmp(cmd_reply, "FAIL", 4) == 0)
you.chen083a2952023-05-12 19:39:06 +08003450 {
you.chen87ff5172022-05-06 11:30:57 +08003451 break;
3452 }
3453 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3454 bssid[index] = malloc(strlen(split_lines[0]) + 1);
3455 strcpy(bssid[index], split_lines[0]);
3456 index++;
3457 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
3458 reply_len = MAX_RET;
3459 cmd_reply[0] = '\0';
you.chened802ab2023-02-13 10:50:35 +08003460 ret = local_wpa_ctrl_request(lynq_wpa_ctrl, lynq_next_sta_cmd, strlen(lynq_next_sta_cmd), cmd_reply, &reply_len, NULL);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003461 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
you.chen083a2952023-05-12 19:39:06 +08003462 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003463 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen87ff5172022-05-06 11:30:57 +08003464 break;
3465 }
3466 }
3467
3468 *len = index;
3469
3470 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiongf1e48bb2023-03-28 13:38:22 +08003471 for (index=0; index < *len; index++)
3472 {
you.chened802ab2023-02-13 10:50:35 +08003473 dev_info = &(*list)[index];
3474 memset(dev_info, 0, sizeof(device_info_s));
3475 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
3476 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
3477 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
3478 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen87ff5172022-05-06 11:30:57 +08003479 free(bssid[index]);
3480 }
3481
3482 return 0;
qs.xiong99b48d62022-04-07 05:41:29 -04003483}
3484
you.chen87ff5172022-05-06 11:30:57 +08003485int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong99b48d62022-04-07 05:41:29 -04003486{
you.chen87ff5172022-05-06 11:30:57 +08003487 int i, count, index, count_words;
3488 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
3489 char *split_lines[128] = {0};
3490 char *split_words[128] = {0};
3491 scan_info_s * p;
qs.xiong99b48d62022-04-07 05:41:29 -04003492
qs.xiongf1e48bb2023-03-28 13:38:22 +08003493 if (list == NULL || len == NULL)
3494 {
you.chen87ff5172022-05-06 11:30:57 +08003495 return -1;
3496 }
qs.xiong99b48d62022-04-07 05:41:29 -04003497
you.chen61c7aee2022-08-06 17:01:16 +08003498 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
3499 {
3500 usleep(100 * 1000);
3501 }
3502
you.chen87ff5172022-05-06 11:30:57 +08003503 CHECK_IDX(idx, CTRL_STA);
3504
3505 CHECK_WPA_CTRL(CTRL_STA);
3506
3507 DO_REQUEST(lynq_scan_result_cmd);
3508
3509 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3510 *len = count - 1;
3511 *list = malloc(sizeof (scan_info_s) * *len);
3512
3513 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiongf1e48bb2023-03-28 13:38:22 +08003514 for (index=0; index <count_words; index++)
3515 {
3516 RLOGD("----header: %s\n", split_words[index]);
you.chen87ff5172022-05-06 11:30:57 +08003517 }
3518
qs.xiongf1e48bb2023-03-28 13:38:22 +08003519 for(index = 1;index < count; index++)
3520 {
3521 RLOGD("---- %s\n",split_lines[index]);
you.chen7bf12432023-04-27 17:51:56 +08003522 memset(split_words, 0 , sizeof (split_words));
you.chen87ff5172022-05-06 11:30:57 +08003523 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
3524 if (count_words < 4)
3525 continue;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003526 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen87ff5172022-05-06 11:30:57 +08003527 //bssid / frequency / signal level / flags / ssid
3528 p = (*list) + index - 1;
3529 strcpy(p->mac, split_words[0]);
3530 p->band = convert_band_from_freq(atoi(split_words[1]));
3531 p->rssi = -1 * atoi( split_words[2]);
3532 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chen7bf12432023-04-27 17:51:56 +08003533 if (count_words == 4) // ssid hided
3534 {
3535 p->ssid[0] = '\0';
3536 }
3537 else
3538 {
3539 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
3540 }
you.chen87ff5172022-05-06 11:30:57 +08003541 }
3542
3543 return 0;
qs.xiong99b48d62022-04-07 05:41:29 -04003544}
qs.xiong99b48d62022-04-07 05:41:29 -04003545
you.chen87ff5172022-05-06 11:30:57 +08003546int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
3547{
3548 int count, net_no, index;
3549 int net_no_list[128];
3550 lynq_wifi_auth_s net_auth;
3551 char lynq_remove_cmd[MAX_CMD];
3552
qs.xiongf1e48bb2023-03-28 13:38:22 +08003553 if (ssid == NULL || *ssid == '\0')
3554 {
3555 RLOGD("bad ssid\n");
you.chen87ff5172022-05-06 11:30:57 +08003556 return -1;
3557 }
3558
3559 CHECK_IDX(idx, CTRL_STA);
3560
3561 CHECK_WPA_CTRL(CTRL_STA);
3562
3563 net_no = -1;
3564 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
3565
qs.xiongf1e48bb2023-03-28 13:38:22 +08003566 for (index=0; index < count; index++)
3567 {
you.chen87ff5172022-05-06 11:30:57 +08003568 net_auth = -1;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003569 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
3570 {
you.chen87ff5172022-05-06 11:30:57 +08003571 net_no = net_no_list[index];
3572 break;
3573 }
3574 }
3575
qs.xiongf1e48bb2023-03-28 13:38:22 +08003576 if (net_no < 0)
3577 {
you.chen87ff5172022-05-06 11:30:57 +08003578 return 0;
3579 }
3580
3581 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
3582
3583 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
3584 DO_OK_FAIL_REQUEST(cmd_save_config);
3585
3586 return 0;
3587}
3588
3589int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiongf1e48bb2023-03-28 13:38:22 +08003590{
you.chened802ab2023-02-13 10:50:35 +08003591 int count, index;
you.chen87ff5172022-05-06 11:30:57 +08003592 int net_no_list[128];
3593 char freq[16];
qs.xiongf1e48bb2023-03-28 13:38:22 +08003594 RLOGD("enter lynq_get_sta_saved_ap api\n");
3595 if (list == NULL || len == NULL)
3596 {
3597 RLOGE("bad param,please check!");
you.chen87ff5172022-05-06 11:30:57 +08003598 return -1;
3599 }
3600
3601 CHECK_IDX(idx, CTRL_STA);
3602
3603// CHECK_WPA_CTRL(CTRL_STA);
3604
3605 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003606 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen87ff5172022-05-06 11:30:57 +08003607
you.chen8418a4e2023-04-13 14:06:58 +08003608 if (count < 0)
3609 {
3610 RLOGE("list network fail");
3611 return count;
3612 }
3613 else if (count == 0)
3614 {
3615 *list = NULL;
3616 *len = 0;
3617 return 0;
3618 }
3619
you.chen87ff5172022-05-06 11:30:57 +08003620 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen0c938042022-08-06 16:59:10 +08003621 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen87ff5172022-05-06 11:30:57 +08003622 *len = count;
3623
qs.xiongf1e48bb2023-03-28 13:38:22 +08003624 for (index=0; index < count; index++)
3625 {
you.chen87ff5172022-05-06 11:30:57 +08003626 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
you.chen87ff5172022-05-06 11:30:57 +08003627 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
you.chen87ff5172022-05-06 11:30:57 +08003628 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003629 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
you.chen8418a4e2023-04-13 14:06:58 +08003630 {
you.chen87ff5172022-05-06 11:30:57 +08003631 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
3632 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08003633 else
you.chen8418a4e2023-04-13 14:06:58 +08003634 {
you.chen87ff5172022-05-06 11:30:57 +08003635 (*list)[index].base_info.band = -1;
3636 }
you.chen8418a4e2023-04-13 14:06:58 +08003637 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen0c938042022-08-06 16:59:10 +08003638 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen87ff5172022-05-06 11:30:57 +08003639 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08003640 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen87ff5172022-05-06 11:30:57 +08003641 return 0;
3642}
3643
3644int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
3645{
qs.xiong045f60b2023-03-29 17:36:14 +08003646 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen87ff5172022-05-06 11:30:57 +08003647 const char *lynq_scan_cmd = "SCAN";
3648
3649 CHECK_IDX(idx, CTRL_STA);
3650
3651 CHECK_WPA_CTRL(CTRL_STA);
3652
you.chen377987d2023-05-10 15:56:26 +08003653 if (g_sta_scan_finish_flag == 1 && s_sta_status == INNER_STA_STATUS_INIT) // temp add
3654 {
3655 RLOGD("tmp clear scanlist");
3656 system(clean_last_re);
3657 }
you.chen61c7aee2022-08-06 17:01:16 +08003658 g_sta_scan_finish_flag = 0;
qs.xiongc6cab7c2023-02-17 18:41:07 +08003659 DO_REQUEST(lynq_scan_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003660 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
3661 {
qs.xiongc6cab7c2023-02-17 18:41:07 +08003662 return 0;
qs.xiongf1e48bb2023-03-28 13:38:22 +08003663 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
3664 {
qs.xiongc6cab7c2023-02-17 18:41:07 +08003665 g_sta_scan_finish_flag = 1;
3666 return -1;
3667 }
you.chen87ff5172022-05-06 11:30:57 +08003668
3669 return 0;
3670}
3671
3672int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003673 if (cb == NULL)
3674 {
3675 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen87ff5172022-05-06 11:30:57 +08003676 return -1;
3677 }
3678
you.chen68e889d2023-06-01 16:39:54 +08003679 pthread_mutex_lock(&s_ap_callback_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003680 g_ap_callback_priv = priv;
3681 g_ap_callback_func = cb;
you.chen68e889d2023-06-01 16:39:54 +08003682 pthread_mutex_unlock(&s_ap_callback_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003683
you.chen68e889d2023-06-01 16:39:54 +08003684 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen603c58a2023-04-24 13:55:29 +08003685 if (g_ap_watcher_pid == 0 )
3686 {
3687 if(pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL) < 0)
3688 {
3689 g_ap_watcher_pid = 0;
3690 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3691 RLOGE("[wifi error]creat APWatcherThreadProc fail");
3692 return -1;
3693 }
3694 }
3695
3696 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3697 RLOGD("creat APWatcherTheradProc susccs");
3698
you.chen87ff5172022-05-06 11:30:57 +08003699 return 0;
3700}
3701
3702int lynq_unreg_ap_event_callback(void * priv) {
you.chen68e889d2023-06-01 16:39:54 +08003703 pthread_mutex_lock(&s_ap_callback_mutex);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003704 if (g_ap_callback_priv == priv)
3705 {
you.chen87ff5172022-05-06 11:30:57 +08003706 g_ap_callback_func = NULL;
3707 g_ap_callback_priv = NULL;
you.chen68e889d2023-06-01 16:39:54 +08003708 pthread_mutex_unlock(&s_ap_callback_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003709 return 0;
3710 }
you.chen68e889d2023-06-01 16:39:54 +08003711 pthread_mutex_unlock(&s_ap_callback_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003712 return -1;
3713}
3714
3715int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiongf1e48bb2023-03-28 13:38:22 +08003716 if (cb == NULL)
3717 {
3718 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen87ff5172022-05-06 11:30:57 +08003719 return -1;
3720 }
3721
you.chen68e889d2023-06-01 16:39:54 +08003722 pthread_mutex_lock(&s_sta_callback_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003723 g_sta_callback_priv = priv;
3724 g_sta_callback_func = cb;
you.chen68e889d2023-06-01 16:39:54 +08003725 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003726
you.chen68e889d2023-06-01 16:39:54 +08003727 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen603c58a2023-04-24 13:55:29 +08003728 if (g_sta_watcher_pid == 0 ) {
3729 if(pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL) < 0)
3730 {
3731 g_sta_watcher_pid = 0;
3732 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3733 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
3734 return -1;
3735 }
3736 }
3737
3738 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3739 RLOGD("creat STAWatcherTheradProc susccs");
you.chen87ff5172022-05-06 11:30:57 +08003740 return 0;
3741}
3742
3743int lynq_unreg_sta_event_callback(void * priv) {
you.chen68e889d2023-06-01 16:39:54 +08003744 pthread_mutex_lock(&s_sta_callback_mutex);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003745 if (g_sta_callback_priv == priv)
3746 {
you.chen87ff5172022-05-06 11:30:57 +08003747 g_sta_callback_func = NULL;
3748 g_sta_callback_priv = NULL;
you.chen68e889d2023-06-01 16:39:54 +08003749 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003750 return 0;
3751 }
you.chen68e889d2023-06-01 16:39:54 +08003752 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen87ff5172022-05-06 11:30:57 +08003753 return -1;
3754}
3755
qs.xiong336424d2023-07-06 21:16:20 +08003756int lynq_reg_sta_auto_event_callback(void * priv, STA_AUTO_CALLBACK_FUNC_PTR cb){
3757 if (cb == NULL)
3758 {
3759 RLOGE("lynq_reg_sta_auto_event_callback ptr is NULL,plese check!\n");
3760 return -1;
3761 }
3762 pthread_mutex_lock(&s_sta_auto_callback_mutex);
3763 g_sta_auto_callback_priv = priv;
3764 g_sta_auto_callback_func = cb;
3765 pthread_mutex_unlock(&s_sta_auto_callback_mutex);
3766 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
3767 if (g_sta_auto_watcher_pid == 0 ) {
3768 if(pthread_create(&g_sta_auto_watcher_pid,NULL,STAAutoWatcherThreadProc,NULL) < 0) //create STAAutoWatcherThreadProc
3769 {
3770 g_sta_auto_watcher_pid = 0;
3771 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3772 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
3773 return -1;
3774 }
3775 }
3776 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3777 RLOGD("creat STAWatcherTheradProc susccs");
3778 return 0;
3779}
3780int lynq_unreg_sta_auto_event_callback(void * priv) {
3781 pthread_mutex_lock(&s_sta_auto_callback_mutex);
3782 if (g_sta_auto_callback_priv == priv)
3783 {
3784 g_sta_auto_watcher_stop_flag = 1;
3785 if (g_sta_auto_watcher_pid != 0)
3786 {
3787 pthread_join(g_sta_auto_watcher_pid, NULL);
3788 }
3789 g_sta_auto_watcher_pid = 0;
3790 g_sta_auto_callback_func = NULL;
3791 g_sta_auto_callback_priv = NULL;
3792 pthread_mutex_unlock(&s_sta_auto_callback_mutex);
3793 return 0;
3794 }
3795 pthread_mutex_unlock(&s_sta_auto_callback_mutex);
3796 return -1;
3797}
you.chen87ff5172022-05-06 11:30:57 +08003798int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
3799{
3800 char state[MAX_CMD];
qs.xiongf1e48bb2023-03-28 13:38:22 +08003801 RLOGD("enter lynq_get_ap_status\n");
you.chen87ff5172022-05-06 11:30:57 +08003802 CHECK_IDX(idx, CTRL_AP);
3803
qs.xiongf1e48bb2023-03-28 13:38:22 +08003804 if (inner_get_status_info_state(CTRL_AP, state) != 0)
3805 {
you.chen87ff5172022-05-06 11:30:57 +08003806 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3807 return 0;
3808 }
3809
qs.xiongf1e48bb2023-03-28 13:38:22 +08003810 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3811 {
you.chen87ff5172022-05-06 11:30:57 +08003812 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
3813 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08003814 else
3815 {
you.chen87ff5172022-05-06 11:30:57 +08003816 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3817 }
3818
3819 return 0;
3820}
3821
3822int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
3823 char state[MAX_CMD];
qs.xiongf1e48bb2023-03-28 13:38:22 +08003824 RLOGD("enter lynq_get_sta_status\n");
you.chen87ff5172022-05-06 11:30:57 +08003825 CHECK_IDX(idx, CTRL_STA);
3826
qs.xiongf1e48bb2023-03-28 13:38:22 +08003827 if (inner_get_status_info_state(CTRL_STA, state) != 0)
3828 {
you.chen87ff5172022-05-06 11:30:57 +08003829 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3830 return 0;
3831 }
3832
qs.xiongf1e48bb2023-03-28 13:38:22 +08003833 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3834 {
you.chen87ff5172022-05-06 11:30:57 +08003835 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
3836 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08003837 else
3838 {
you.chen87ff5172022-05-06 11:30:57 +08003839 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3840 }
3841
3842 return 0;
3843}
3844
3845int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
3846// CHECK_IDX(idx, CTRL_AP);
3847// int ret = 0;
3848// size_t reply_len = MAX_RET;
3849// char cmd_reply[MAX_RET]={0};
3850// const char * cmd_str = "GET country";
3851// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
3852// do{
3853// if (NULL == s_lynq_wpa_ctrl) {
3854// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
3855// if (NULL == s_lynq_wpa_ctrl ) {
3856// printf("wpa_ctrl_open fail\n");
3857// return -1;
3858// }
3859// }
3860// }while(0);
3861
3862// do {
3863// reply_len = MAX_RET;
3864// cmd_reply[0] = '\0';
3865// printf("to call [%s]\n", cmd_str);
you.chened802ab2023-02-13 10:50:35 +08003866// ret = local_wpa_ctrl_request(s_lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL);
you.chen87ff5172022-05-06 11:30:57 +08003867// if (ret != 0) {
qs.xiongf1e48bb2023-03-28 13:38:22 +08003868// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen87ff5172022-05-06 11:30:57 +08003869// return ret;
3870// }
3871// cmd_reply[reply_len+1] = '\0';
qs.xiongf1e48bb2023-03-28 13:38:22 +08003872// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen87ff5172022-05-06 11:30:57 +08003873// }while(0);
3874
3875 FILE *fp;
3876 size_t i = 0;
3877 char lynq_cmd_ret[MAX_RET]={0};
3878
3879// CHECK_IDX(idx, CTRL_AP);
3880
3881 if((fp=popen("wl country","r"))==NULL)
qs.xiongf1e48bb2023-03-28 13:38:22 +08003882 {
3883 perror("popen error!");
3884 return -1;
3885 }
you.chen87ff5172022-05-06 11:30:57 +08003886 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
3887 {
3888 perror("fread fail!");
3889 return -1;
3890 }
3891
qs.xiongf1e48bb2023-03-28 13:38:22 +08003892 for(i=0; i < strlen(lynq_cmd_ret); i++)
3893 {
3894 if (lynq_cmd_ret[i] == ' ')
3895 {
you.chen87ff5172022-05-06 11:30:57 +08003896 lynq_cmd_ret[i] = '\0';
3897 break;
3898 }
3899 }
3900
3901 strcpy(country_code,lynq_cmd_ret);
qs.xiongf1e48bb2023-03-28 13:38:22 +08003902 RLOGD("---country code %s\n", country_code);
you.chen87ff5172022-05-06 11:30:57 +08003903
3904 int ret=pclose(fp);
3905 if(ret==-1)
3906 {
3907 perror("close file faild");
3908 }
3909
3910 return 0;
3911}
3912
you.chen336070d2023-06-01 22:06:45 +08003913static int check_and_init_uci_config(char * country_code)
3914{
3915 FILE * fp;
3916 int is_different = 0;
3917 const char * check_uci_cmd ="uci show | grep lynq_wifi_country_code";
3918 const char * create_uci_cmd ="uci set lynq_uci.lynq_wifi_country_code='lynq_wifi_country_code'";
3919 const char * commit_uci_cmd ="uci commit";
3920 char set_country_cmd[MAX_CMD];
3921 char lynq_cmd_ret[MAX_CMD]={0};
xj6ed11302023-06-01 20:50:02 +08003922
you.chen336070d2023-06-01 22:06:45 +08003923 sprintf(set_country_cmd, "uci set lynq_uci.lynq_wifi_country_code.code='%s'",country_code);
qs.xiong11e16d82023-06-01 19:23:13 +08003924
you.chen336070d2023-06-01 22:06:45 +08003925 if (0 != system(check_uci_cmd))
qs.xiong11e16d82023-06-01 19:23:13 +08003926 {
you.chen336070d2023-06-01 22:06:45 +08003927 if (0 != system(create_uci_cmd))
3928 {
3929 RLOGE("creat_uci_cmd fail");
3930 return -1;
3931 }
3932 is_different = 1;
3933 }
3934
3935 if((fp=popen("uci get lynq_uci.lynq_wifi_country_code.code","r"))==NULL)
3936 {
3937 RLOGE("popen error!");
qs.xiong11e16d82023-06-01 19:23:13 +08003938 return -1;
3939 }
3940
you.chen336070d2023-06-01 22:06:45 +08003941 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0 )
qs.xiong11e16d82023-06-01 19:23:13 +08003942 {
you.chen336070d2023-06-01 22:06:45 +08003943 RLOGE("fread fail!");
3944 fclose(fp);
3945 return -1;
qs.xiong11e16d82023-06-01 19:23:13 +08003946 }
3947
you.chen336070d2023-06-01 22:06:45 +08003948 if ( strncmp(lynq_cmd_ret,country_code,2) != 0 )
3949 {
3950 RLOGE("get country code for uci %s,input cpuntry code is:%s\n",lynq_cmd_ret,country_code);
3951 is_different = 1;
3952 }
3953
3954 fclose(fp);
3955
3956 if (is_different)
3957 {
3958 if ( 0 != system(set_country_cmd))
3959 {
3960 RLOGE("set_country_cmd fail");
3961 return -1;
3962 }
3963 if (0 != system(commit_uci_cmd))
3964 {
3965 RLOGE("commmit fail");
3966 }
3967 }
3968
3969 return is_different;
3970}
3971
3972int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
3973 char check_current_code[10];
3974 const char * support_country[] = {"CN", "EU"};
3975
3976 int ret,is_different, i, cc_count;
3977
3978 if (country_code == NULL || country_code[0] == '\0')
3979 {
3980 RLOGE("bad country code\n");
3981 return -1;
3982 }
3983
3984 cc_count = sizeof (support_country) / sizeof (char*);
3985 for(i=0; i < cc_count; i++)
3986 {
3987 if (strcmp(support_country[i], country_code) == 0)
3988 {
3989 break;
3990 }
3991 }
3992
3993 if (i >= cc_count)
3994 {
3995 RLOGE("unspported country code %s\n", country_code);
3996 return -1;
3997 }
3998
3999 is_different = check_and_init_uci_config(country_code);
4000 if( is_different < 0 )
4001 {
4002 RLOGE("init set uci fail\n");
4003 return -1;
4004 }
4005
4006 ret = lynq_get_country_code(idx,check_current_code);
4007 if( ret == 0 && (is_different == 1 || strcmp(check_current_code, country_code) != 0))
4008 {
4009 ret = lynq_wifi_disable();
4010 if(ret != 0 )
4011 {
4012 RLOGE("berfore set country,find bcmdhd insmod,remod fail\n");
4013 return -1;
4014 }
4015 }
4016
4017 return 0;
you.chen87ff5172022-05-06 11:30:57 +08004018}
4019
4020int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
4021{
qs.xiongf1e48bb2023-03-28 13:38:22 +08004022 RLOGD("enter lynq_get_connect_ap_mac\n");
4023 if (mac == NULL)
4024 {
4025 RLOGE("input ptr is NULL,please check\n");
you.chen87ff5172022-05-06 11:30:57 +08004026 return -1;
4027 }
4028
4029 CHECK_IDX(idx, CTRL_STA);
4030 ap_info_s ap;
4031 ap.ap_mac[0] = '\0';
4032
qs.xiongf1e48bb2023-03-28 13:38:22 +08004033 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
4034 {
you.chen87ff5172022-05-06 11:30:57 +08004035 return -1;
4036 }
4037 strcpy(mac, ap.ap_mac);
4038
4039 return 0;
4040}
4041
4042int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
4043{
qs.xiongf1e48bb2023-03-28 13:38:22 +08004044 RLOGD("enter lynq_get_interface_ip\n");
you.chen61c7aee2022-08-06 17:01:16 +08004045 struct ifaddrs *ifaddr_header, *ifaddr;
4046 struct in_addr * ifa;
4047 const char * ifaName = "wlan0";
4048 if (ip == NULL)
4049 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08004050 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chendad3f9f2022-06-21 16:53:48 +08004051 return -1;
you.chen61c7aee2022-08-06 17:01:16 +08004052 }
you.chendad3f9f2022-06-21 16:53:48 +08004053
qs.xiongf1e48bb2023-03-28 13:38:22 +08004054 if (idx == 1)
4055 {
you.chen377987d2023-05-10 15:56:26 +08004056 ifaName = inner_get_ap_interface_name();
4057 if (ifaName == NULL)
4058 {
4059 RLOGE("[lynq_get_interface_ip] ap name get fail");
4060 return -1;
4061 }
you.chen61c7aee2022-08-06 17:01:16 +08004062 }
qs.xiongf1e48bb2023-03-28 13:38:22 +08004063 else if (idx != 0)
4064 {
you.chen87ff5172022-05-06 11:30:57 +08004065 return -1;
you.chen61c7aee2022-08-06 17:01:16 +08004066 }
you.chen87ff5172022-05-06 11:30:57 +08004067
you.chen61c7aee2022-08-06 17:01:16 +08004068 if (getifaddrs(&ifaddr_header) == -1)
4069 {
you.chen87ff5172022-05-06 11:30:57 +08004070 perror("getifaddrs");
4071 return -1;
4072 //exit(EXIT_FAILURE);
you.chen61c7aee2022-08-06 17:01:16 +08004073 }
you.chen87ff5172022-05-06 11:30:57 +08004074
4075
you.chen61c7aee2022-08-06 17:01:16 +08004076 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
4077 {
4078 if (ifaddr->ifa_addr == NULL)
you.chen87ff5172022-05-06 11:30:57 +08004079 continue;
you.chen61c7aee2022-08-06 17:01:16 +08004080 if((strcmp(ifaddr->ifa_name,ifaName)==0))
4081 {
4082 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
4083 {
4084 // is a valid IP4 Address
4085 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
4086 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiongf1e48bb2023-03-28 13:38:22 +08004087 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen61c7aee2022-08-06 17:01:16 +08004088 freeifaddrs(ifaddr_header);
qs.xiongf1e48bb2023-03-28 13:38:22 +08004089 RLOGD("ip %s\n", ip);
you.chen61c7aee2022-08-06 17:01:16 +08004090 return 0;
4091 }
4092 }
4093 }
qs.xiong84d87a42023-02-08 18:16:58 +08004094 freeifaddrs(ifaddr_header);
qs.xiongf1e48bb2023-03-28 13:38:22 +08004095 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen61c7aee2022-08-06 17:01:16 +08004096 return -1;
you.chen87ff5172022-05-06 11:30:57 +08004097}
4098
4099int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
4100{
qs.xiongf1e48bb2023-03-28 13:38:22 +08004101 RLOGD("enter lynq_get_interface_mac\n");
you.chen87ff5172022-05-06 11:30:57 +08004102 int count;
4103 size_t i;
qs.xiongd80fae42023-08-08 15:02:53 +08004104 int WIFI_INTERFACE_MAC_LEN = 17;
you.chen87ff5172022-05-06 11:30:57 +08004105 char *split_words[128] = {0};
4106 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
4107
4108 CHECK_WPA_CTRL(idx);
4109
4110 DO_REQUEST(lynq_get_mac_cmd);
4111
qs.xiongf1e48bb2023-03-28 13:38:22 +08004112 if (memcmp(cmd_reply, "FAIL", 4) == 0)
4113 {
4114 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen87ff5172022-05-06 11:30:57 +08004115 return -1;
4116 }
4117
4118 count = lynq_split(cmd_reply, reply_len, '=', split_words);
4119
qs.xiongf1e48bb2023-03-28 13:38:22 +08004120 if (count < 2)
4121 {
you.chen87ff5172022-05-06 11:30:57 +08004122 return -1;
4123 }
4124
qs.xiongf1e48bb2023-03-28 13:38:22 +08004125 for (i=0; i < strlen(split_words[1]); i++ )
4126 {
4127 if (split_words[1][i] != ' ')
4128 {
you.chen87ff5172022-05-06 11:30:57 +08004129 break;
4130 }
4131 }
4132
qs.xiongd80fae42023-08-08 15:02:53 +08004133 strncpy(mac, split_words[1] + i, WIFI_INTERFACE_MAC_LEN);
you.chen87ff5172022-05-06 11:30:57 +08004134
4135 return 0;
4136}
4137
4138int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
4139{
4140// int count;
4141// char *split_words[128] = {0};
4142// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
4143
4144// if (rssi == NULL) {
4145// return -1;
4146// }
4147
4148// CHECK_IDX(idx, CTRL_STA);
4149
4150// CHECK_WPA_CTRL(CTRL_STA);
4151
4152// DO_REQUEST(lynq_get_rssi_cmd);
4153
4154// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
4155// return -1;
4156// }
4157
4158// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
4159
4160// if (count < 2) {
4161// return -1;
4162// }
4163
4164// *rssi = atoi(split_words[1]) * -1;
4165
you.chen87ff5172022-05-06 11:30:57 +08004166 char lynq_cmd_ret[MAX_RET]={0};
4167
qs.xiongc28ae382022-10-11 15:47:14 +08004168/*******change other cmd to get rssi*******
4169 *
4170 *wl rssi ---> wl -i wlan0 rssi
4171 *
4172 ***** change by qs.xiong 20221011*******/
you.chenbf5d0ee2023-04-12 16:46:00 +08004173 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiongf1e48bb2023-03-28 13:38:22 +08004174 {
you.chenbf5d0ee2023-04-12 16:46:00 +08004175 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen87ff5172022-05-06 11:30:57 +08004176 return -1;
4177 }
you.chenfcea58c2022-06-06 17:18:18 +08004178 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongc28ae382022-10-11 15:47:14 +08004179/****** if got rssi is 0,means sta didn't connected any device****/
4180 if(*rssi == 0)
4181 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08004182 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chenbf5d0ee2023-04-12 16:46:00 +08004183 return -1;
qs.xiongc28ae382022-10-11 15:47:14 +08004184 }
you.chen87ff5172022-05-06 11:30:57 +08004185
4186 return 0;
4187}
4188
4189int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
4190{
qs.xiongf1e48bb2023-03-28 13:38:22 +08004191 RLOGD("enter lynq_get_connect_ap_band\n");
4192 if (band == NULL)
4193 {
you.chen87ff5172022-05-06 11:30:57 +08004194 return -1;
4195 }
4196
4197 CHECK_IDX(idx, CTRL_STA);
4198 ap_info_s ap;
4199 ap.band = -1;
4200
qs.xiongf1e48bb2023-03-28 13:38:22 +08004201 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
4202 {
you.chen87ff5172022-05-06 11:30:57 +08004203 return -1;
4204 }
4205 *band = ap.band;
4206
4207 return 0;
qs.xiong99b48d62022-04-07 05:41:29 -04004208}
you.chendad3f9f2022-06-21 16:53:48 +08004209
4210int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
4211{
you.chen083a2952023-05-12 19:39:06 +08004212 int ret;
4213 char *p;
qs.xiongc719c3f2023-02-28 18:22:49 +08004214 char bssid[1024] = {0};
you.chendad3f9f2022-06-21 16:53:48 +08004215
4216 if (ip == NULL)
4217 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08004218 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chendad3f9f2022-06-21 16:53:48 +08004219 return -1;
4220 }
4221
4222 CHECK_IDX(idx, CTRL_STA);
4223
qs.xiongc719c3f2023-02-28 18:22:49 +08004224 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chendad3f9f2022-06-21 16:53:48 +08004225 {
4226 return -1;
4227 }
qs.xiongc719c3f2023-02-28 18:22:49 +08004228
you.chen083a2952023-05-12 19:39:06 +08004229 ip[0] = '\0';
4230 ret = inner_get_ip_by_mac(bssid, ip, 32); //better input by user
4231 if (ret != 0)
4232 {
4233 RLOGE("[lynq_get_connect_ap_ip] inner_get_ip_by_mac return fail");
4234 return -1;
4235 }
4236
4237 if (ip[0] == '\0' || strchr(ip, ':') != NULL) //temp change, not ok
4238 {
4239 ip[0] = '\0';
you.chen57eb5842023-05-18 14:19:46 +08004240 ret = exec_cmd("grep \"new_router\" /tmp/wlan0_dhcpcd_router | awk '{print $2}'| tail -1", ip, 32);
you.chen083a2952023-05-12 19:39:06 +08004241 if (ret != 0)
4242 {
4243 ip[0] = '\0';
4244 return 0;
4245 }
4246 else
4247 {
4248 p = strchr(ip, '\n');
4249 if (p != NULL)
4250 {
4251 *p = '\0';
4252 }
4253 }
4254 }
4255 return 0;
you.chendad3f9f2022-06-21 16:53:48 +08004256}
4257
qs.xiongd5c6fd32022-10-17 11:15:45 +08004258int lynq_ap_connect_num(int sta_number)
4259{
4260 char lynq_limit_cmd[32]={0};
4261 int ret;
qs.xiongf1e48bb2023-03-28 13:38:22 +08004262 if((sta_number < 1 ) && (sta_number > 15))
4263 {
4264 RLOGE("sta_number: not in range\n",sta_number);
qs.xiongd5c6fd32022-10-17 11:15:45 +08004265 return -1;
4266 }
4267 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
4268 ret = system(lynq_limit_cmd);
qs.xiongf1e48bb2023-03-28 13:38:22 +08004269 if(ret != 0)
4270 {
4271 RLOGE("cmd of limit ap devices number error\n");
qs.xiongd5c6fd32022-10-17 11:15:45 +08004272 }
4273 return 0;
4274}
you.chendad3f9f2022-06-21 16:53:48 +08004275
qs.xiong330f5a12022-10-17 11:19:57 +08004276int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
4277{
4278
4279 char lynq_wifi_acs_cmd[128]={0};
4280 char lynq_cmd_mode[128]={0};
4281 char lynq_cmd_slect[128]={0};
4282
qs.xiongf1e48bb2023-03-28 13:38:22 +08004283 if((acs_mode != 2) && (acs_mode != 5))
4284 {
qs.xiong330f5a12022-10-17 11:19:57 +08004285 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
4286 }
4287
qs.xiongf1e48bb2023-03-28 13:38:22 +08004288 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
4289 {
qs.xiong330f5a12022-10-17 11:19:57 +08004290 return -1;
4291 }
4292
4293 CHECK_IDX(idx, CTRL_AP);
4294
4295 CHECK_WPA_CTRL(CTRL_AP);
4296
4297 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
4298 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
4299 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
4300
4301 DO_OK_FAIL_REQUEST(cmd_disconnect);
4302 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
4303 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
4304 DO_OK_FAIL_REQUEST(cmd_save_config);
4305 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
4306
4307 return 0;
4308}
you.chen2ef1c552022-11-07 18:31:14 +08004309//you.chen add for tv-box start
4310static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
4311 FILE *fp;
4312 //printf("to exec cmd:%s\n", str_cmd);
4313 if((fp=popen(str_cmd,"r"))==NULL)
4314 {
4315 perror("popen error!");
4316 return -1;
4317 }
4318 if((fread(str_cmd_ret,max_len,1,fp))<0)
4319 {
4320 perror("fread fail!");
4321 fclose(fp);
4322 return -1;
4323 }
4324 fclose(fp);
4325 return 0;
4326}
4327
4328static int get_netmask_length(const char* mask)
4329{
4330 int masklen=0, i=0;
4331 int netmask=0;
4332
4333 if(mask == NULL)
4334 {
4335 return 0;
4336 }
4337
4338 struct in_addr ip_addr;
4339 if( inet_aton(mask, &ip_addr) )
4340 {
4341 netmask = ntohl(ip_addr.s_addr);
qs.xiongf1e48bb2023-03-28 13:38:22 +08004342 }else
4343 {
you.chen2ef1c552022-11-07 18:31:14 +08004344 netmask = 0;
4345 return 0;
4346 }
4347
4348 while(0 == (netmask & 0x01) && i<32)
4349 {
4350 i++;
4351 netmask = netmask>>1;
4352 }
4353 masklen = 32-i;
4354 return masklen;
4355}
4356
4357static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
4358 int mask_len;
4359 char *p;
4360 char tmp[64] = {0};
you.chencd882682023-04-24 15:39:37 +08004361 sprintf(tmp, "ifconfig %s | grep Mask", s_ap_iterface_name);
4362 if (exec_cmd(tmp, str_cmd_ret, max_len) != 0)
you.chen2ef1c552022-11-07 18:31:14 +08004363 return -1;
4364 p = strstr(str_cmd_ret, "Mask:");
4365 if (p == NULL)
4366 return -1;
4367 mask_len = get_netmask_length(p + 5);
4368 if (mask_len == 0)
4369 return -1;
4370 p = strstr(str_cmd_ret, "inet addr:");
4371 if (p == NULL)
4372 return -1;
4373 strcpy(tmp, p + 10);
4374 p = strstr(tmp, " ");
4375 if (p != NULL)
4376 *p = '\0';
4377 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
4378 return 0;
4379}
4380
4381static void GBWWatchThreadProc() {
4382 int i,n, nloop, nmax, ncheckcount, nidlecount;
4383 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
4384 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
4385 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
4386 char *results[16] = {0};
4387 char str_cmd[256] = {0};
4388 char str_cmd_ret[128] = {0};
4389 char dest_ip[32] = {0};
4390 lastAP1Bytes = lastAP2Bytes = 0;
4391 lastAP1Drop = lastAP2Drop = 0;
4392 lastAP1Speed = lastAP2Speed = 0;
4393 setAP1Speed = 50;
4394 setAP2Speed = 80;
4395 nloop = 0;
4396 nmax = 6;
4397 ncheckcount = nidlecount = 0;
4398
you.chen377987d2023-05-10 15:56:26 +08004399 if (inner_get_ap_interface_name() == NULL)
you.chencd882682023-04-24 15:39:37 +08004400 {
4401 RLOGE("------gbw thread run\n");
4402 return;
4403 }
4404
qs.xiongf1e48bb2023-03-28 13:38:22 +08004405 RLOGD("------gbw thread run\n");
you.chen2ef1c552022-11-07 18:31:14 +08004406 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
4407 while (dest_ip[0] == '\0') {
4408 sleep(1);
4409 str_cmd_ret[0] = '\0';
4410 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
4411 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
4412 if (str_cmd_ret[n] == '\n'){
4413 str_cmd_ret[n] = '\0';
4414 break;
4415 }
4416 }
4417 if (str_cmd_ret[0] != '\0')
4418 {
4419 strcpy(dest_ip, str_cmd_ret);
4420 }
4421 }
4422
you.chencd882682023-04-24 15:39:37 +08004423 system_call_v("tc qdisc del dev %s root > /dev/null 2>&1", s_ap_iterface_name);
4424 system_call_v("tc qdisc add dev %s root handle 1: htb r2q 1", s_ap_iterface_name);
4425 system_call_v("tc class add dev %s parent 1: classid 1:1 htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000", s_ap_iterface_name);
you.chen2ef1c552022-11-07 18:31:14 +08004426 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
4427 {
qs.xiongf1e48bb2023-03-28 13:38:22 +08004428 RLOGD("not get tether info\n");
you.chen2ef1c552022-11-07 18:31:14 +08004429 return;
4430 }
you.chencd882682023-04-24 15:39:37 +08004431 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);
4432 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);
4433 system_call_v("tc filter add dev %s parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", s_ap_iterface_name, dest_ip);
you.chen2ef1c552022-11-07 18:31:14 +08004434
4435 while (1) {
4436 sleep(1);
4437 memset(str_cmd, 0, sizeof(str_cmd));
you.chencd882682023-04-24 15:39:37 +08004438 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
4439 sprintf(str_cmd, "tc -s class show dev %s classid 1:1 | grep Sent", s_ap_iterface_name);
4440 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen2ef1c552022-11-07 18:31:14 +08004441 continue;
4442 //printf("ap1 --- %s\n", str_cmd);
you.chencd882682023-04-24 15:39:37 +08004443 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen2ef1c552022-11-07 18:31:14 +08004444 if (n > 9) {
4445 if (strcmp(results[1], "Sent") == 0) {
4446 currAP1Bytes = atoll(results[2]);
4447 }
4448 if (strcmp(results[6], "(dropped") == 0) {
4449 currAP1Drop = atoi(results[7]);
4450 }
4451 }
4452
4453 memset(str_cmd, 0, sizeof(str_cmd));
you.chencd882682023-04-24 15:39:37 +08004454 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
4455 sprintf(str_cmd, "tc -s class show dev %s classid 1:2 | grep Sent", s_ap_iterface_name);
4456 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen2ef1c552022-11-07 18:31:14 +08004457 continue;
4458 //printf("ap2 --- %s\n", str_cmd);
you.chencd882682023-04-24 15:39:37 +08004459 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen2ef1c552022-11-07 18:31:14 +08004460 if (n > 9) {
4461 if (strcmp(results[1], "Sent") == 0) {
4462 currAP2Bytes = atoll(results[2]);
4463 }
4464 if (strcmp(results[6], "(dropped") == 0) {
4465 currAP2Drop = atoi(results[7]);
4466 }
4467 }
4468
4469 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
4470 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
4471 lastAP1Bytes = currAP1Bytes;
4472 lastAP2Bytes = currAP2Bytes;
4473 continue;
4474 }
4475
4476 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
4477 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
4478 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
4479 lastAP1Speed = currAP1Speed;
4480 lastAP2Speed = currAP2Speed;
4481 lastAP1Bytes = currAP1Bytes;
4482 lastAP2Bytes = currAP2Bytes;
4483
4484 currSetAP1Speed = setAP1Speed;
4485 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
4486 ncheckcount++;
4487 if (ncheckcount > 3) {
4488 ncheckcount = 0;
4489 currSetAP1Speed = 5;
4490 }
4491 }
4492 else {
4493 ncheckcount = 0;
4494 if (currAP1Speed < 5)
4495 nidlecount++;
4496 else
4497 nidlecount = 0;
4498
4499 }
4500
4501 if (nidlecount > 60 ){
4502 currSetAP1Speed = 50;
4503 }
4504
4505 if (currSetAP1Speed != setAP1Speed) {
4506 setAP1Speed = currSetAP1Speed;
you.chencd882682023-04-24 15:39:37 +08004507 system_call_v(str_cmd, "tc class replace dev %s parent 1: classid 1:1 htb rate %dMbit ceil %dMbit prio 2 quantum 3000",
4508 s_ap_iterface_name, setAP1Speed, (int)(setAP1Speed*1.4));
you.chen2ef1c552022-11-07 18:31:14 +08004509 }
4510 }
4511}
4512
4513int enableGBW(const char* mac) {
4514 int i,len;
4515 char get_ipaddr_cmd[128]={0};
4516 ap_info_s *ap;
4517 device_info_s * list;
4518
4519 if (mac == NULL || g_gbw_enabled == 1)
4520 return -1;
4521 len = strlen(mac);
4522 g_gbw_mac = malloc(len + 1);
4523 for(i=0;i<len;i++) {
4524 if (mac[i] >= 'A' && mac[i] <= 'Z')
4525 {
4526 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
4527 }
4528 else
4529 g_gbw_mac[i] = mac[i];
4530 }
4531 g_gbw_mac[i] = '\0';
4532 g_gbw_enabled = 1;
4533
4534 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
4535 if (system(get_ipaddr_cmd) == 0) {
4536 //startGBW();
4537 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
4538 for (i=0;i<len;i++) {
4539 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
4540 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
4541 startGBW();
4542 }
4543 free(ap);
4544 free(list);
4545 }
4546 }
4547 return 0;
4548}
4549
4550int disableGBW() {
4551 stopGBW();
4552 free(g_gbw_mac);
4553 g_gbw_mac = NULL;
4554 g_gbw_enabled = 1;
4555 return 0;
4556}
4557
4558static int startGBW() {
4559 if (g_gbw_watcher_pid != 0) {
4560 stopGBW();
4561 }
4562 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
4563}
4564
4565static int stopGBW() {
4566 void* retval;
you.chencd882682023-04-24 15:39:37 +08004567 char cmd[64] = {0};
you.chen2ef1c552022-11-07 18:31:14 +08004568 pthread_cancel(g_gbw_watcher_pid);
4569 pthread_join(g_gbw_watcher_pid, &retval);
4570 g_gbw_watcher_pid = 0;
you.chencd882682023-04-24 15:39:37 +08004571 sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
4572 if (s_ap_iterface_name[0] != '\0')
4573 {
4574 sprintf(cmd, "tc qdisc del dev %s root", s_ap_iterface_name);
4575 system(cmd);
4576 }
you.chen2ef1c552022-11-07 18:31:14 +08004577}
4578//you.chen add for tv-box end