blob: ed4024c3d208a0bfb3290ebef33e1909c6211ff0 [file] [log] [blame]
qs.xiong1af5daf2022-03-14 09:12:12 -04001/**@File lib_wifi6.c
2* @Brief :about function test
3* @details :
you.chen35020192022-05-06 11:30:57 +08004* @Author : you.chen
5* @Date : 2022-4-6
qs.xiong1af5daf2022-03-14 09:12:12 -04006* @Version : V1.0
7* @copy ritght : Copyright (c) MobileTek
8*/
9#include <log/log.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050010#include <stdio.h>
11#include <sys/types.h>
you.chen35020192022-05-06 11:30:57 +080012#include <stdlib.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050013#include <string.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050014#include "libwifi6.h"
you.chen35020192022-05-06 11:30:57 +080015#include <wpa_ctrl.h>
16#include <string.h>
17#include <time.h>
18#include <pthread.h>
19#include <sys/socket.h>
20#include <netinet/in.h>
21#include <arpa/inet.h>
22#include <netdb.h>
23#include <ifaddrs.h>
qs.xiong9fbf74e2023-03-28 13:38:22 +080024#include "log/log.h"
you.chen70f377f2023-04-14 18:17:09 +080025#include <sys/time.h>
26#include <asm/errno.h>
qs.xiong7a105ce2022-03-02 09:43:11 -050027
qs.xiong1af5daf2022-03-14 09:12:12 -040028#ifdef __cplusplus
29extern "C" {
30#endif
31#ifdef __cplusplus
32}
33#endif
you.chen35020192022-05-06 11:30:57 +080034
qs.xiong9fbf74e2023-03-28 13:38:22 +080035#undef LOG_TAG
36#define LOG_TAG "LYNQ_WIFI"
you.chen35020192022-05-06 11:30:57 +080037#define MAX_CMD 128
38#define MAX_RET 4096
qs.xiongf1b525b2022-03-31 00:58:23 -040039#define MODE_LEN 10
you.chen35020192022-05-06 11:30:57 +080040#define CTRL_STA 0
41#define CTRL_AP 1
42#define AP_NETWORK_0 0
qs.xiongf71b53b2023-05-03 13:12:07 +080043#define STA_MAX_SAVED_AP_NUM 50
you.chen35020192022-05-06 11:30:57 +080044
45pthread_t g_ap_watcher_pid = 0;
46volatile int g_ap_watcher_stop_flag = 0;
you.chena6fa5b22022-05-18 10:28:19 +080047volatile int g_ap_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080048
49pthread_t g_sta_watcher_pid = 0;
50volatile int g_sta_watcher_stop_flag = 0;
you.chen9ac66392022-08-06 17:01:16 +080051volatile int g_sta_scan_finish_flag = 1;
you.chena6fa5b22022-05-18 10:28:19 +080052volatile int g_sta_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080053
54void * g_ap_callback_priv = NULL;
55AP_CALLBACK_FUNC_PTR g_ap_callback_func = NULL;
56void * g_sta_callback_priv = NULL;
57STA_CALLBACK_FUNC_PTR g_sta_callback_func = NULL;
58
59//const char * CTRL_PATH="/var/run/wpa_supplicant";
60const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/ap0"};
61//const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/wlan0"};
62const char * cmd_list_networks = "LIST_NETWORKS";
63const char * cmd_save_config = "SAVE_CONFIG";
you.chen6c2dd9c2022-05-16 17:55:28 +080064const char * cmd_disconnect = "DISCONNECT";
65const char * cmd_remove_all = "REMOVE_NETWORK all";
you.chen35020192022-05-06 11:30:57 +080066const char * state_scan_result = "CTRL-EVENT-SCAN-RESULTS";
you.chen9ac66392022-08-06 17:01:16 +080067const char * STATE_COMPLETED = "COMPLETED";
you.chen6d247052023-06-01 16:39:54 +080068const char * STATE_DISCONNECTED = "DISCONNECTED";
you.chen35020192022-05-06 11:30:57 +080069
you.chenf711c8a2023-04-13 13:49:45 +080070const char * cmd_ping = "PING";
71const char * rsp_pong = "PONG";
72const int SLEEP_TIME_ON_IDLE = 100 * 1000; // usecond
73const int MAX_IDLE_COUNT = 600; // 60s
74
you.chenc9928582023-04-24 15:39:37 +080075const char * start_wg870_service_script = "/etc/wg870/scripts/start_wg870_service.sh";
76const char * get_interface_name_script = "/etc/wg870/scripts/get_interface_name.sh";
77const char * start_stop_sta_script = "/etc/wg870/scripts/start_stop_sta.sh";
78const char * start_stop_ap_script = "/etc/wg870/scripts/start_stop_ap.sh";
79const char * sta_status_change_script = "/etc/wg870/scripts/sta_status_change.sh";
80
81static char s_ap_iterface_name[64] = {0};
82
you.chend2fef3f2023-02-13 10:50:35 +080083struct local_wpa_ctrl{
84 struct wpa_ctrl *ctrl;
85 pthread_mutex_t mutex;
86};
87
you.chen70f377f2023-04-14 18:17:09 +080088
you.chend2fef3f2023-02-13 10:50:35 +080089static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
you.chen6d247052023-06-01 16:39:54 +080090static pthread_mutex_t s_sta_callback_mutex = PTHREAD_MUTEX_INITIALIZER;
91static pthread_mutex_t s_ap_callback_mutex = PTHREAD_MUTEX_INITIALIZER;
you.chend2fef3f2023-02-13 10:50:35 +080092
93static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
you.chen35020192022-05-06 11:30:57 +080094
you.chen0f5c6432022-11-07 18:31:14 +080095//you.chen add for tv-box start
96volatile int g_gbw_enabled = 0;
97char * g_gbw_mac = NULL;
98pthread_t g_gbw_watcher_pid = 0;
99static int startGBW();
100static int stopGBW();
101//you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +0800102
103typedef struct __curr_status_info {
104 ap_info_s *ap;
105 char * state;
106 int net_no;
107}curr_status_info;
qs.xiong97fa59b2022-04-07 05:41:29 -0400108
you.chen70f377f2023-04-14 18:17:09 +0800109typedef enum {
110 INNER_STA_STATUS_INIT = 0,
111 INNER_STA_STATUS_CONNECTING,
112 INNER_STA_STATUS_ASSOCIATING,
113 INNER_STA_STATUS_ASSOCIATED,
114 INNER_STA_STATUS_CONNECTED,
115 INNER_STA_STATUS_DISCONNECTING,
116 INNER_STA_STATUS_DISCONNECTED,
117 INNER_STA_STATUS_CANCEL,
118}inner_sta_status_s;
119
120static pthread_cond_t s_global_check_cond = PTHREAD_COND_INITIALIZER;
121static pthread_mutex_t s_global_check_mutex = PTHREAD_MUTEX_INITIALIZER;
122static inner_sta_status_s s_sta_status = INNER_STA_STATUS_INIT;
123static error_number_s s_sta_error_number = -1;
124static char s_sta_current_connecting_ssid[64] = {0};
125static struct timespec s_sta_connect_timeout;
126const int MAX_CONNNECT_TIME = 15; // second
127pthread_t g_global_watcher_pid = 0;
128static int s_service_invoke_timeout_cnt=0;
129const int FAKE_MAX_INT_VALUE = 99999;
130
131static void notify_service_invoke_fail(int error)
132{
133 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
134 pthread_mutex_lock(&s_global_check_mutex);
135 if (error == -2) //timeout
136 {
137 s_service_invoke_timeout_cnt++;
138 if (s_service_invoke_timeout_cnt > 10)
139 {
140 pthread_cond_signal(&s_global_check_cond);
141 }
142 }
143 else if (error == -1)
144 {
145 // check if can connect wpa service
146 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[0]);
147 if (lynq_wpa_ctrl == NULL)
148 {
149 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
150 pthread_cond_signal(&s_global_check_cond);
151 }
152 wpa_ctrl_close(lynq_wpa_ctrl);
153 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[1]);
154 if (lynq_wpa_ctrl == NULL)
155 {
156 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
157 pthread_cond_signal(&s_global_check_cond);
158 }
159 wpa_ctrl_close(lynq_wpa_ctrl);
160 }
161
162 pthread_mutex_unlock(&s_global_check_mutex);
163}
164
you.chenc9928582023-04-24 15:39:37 +0800165static int system_call_v(const char * fmt, ...)
166{
167 char str_cmd[256] = {0};
168 va_list args;
169 va_start(args, fmt);
170 vsprintf(str_cmd, fmt, args);
171 va_end(args);
172 printf("system call----------%s\n", str_cmd);
173 return system(str_cmd);
174}
175
you.chen0df3e7e2023-05-10 15:56:26 +0800176static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
177
178static const char * inner_get_ap_interface_name()
179{
180 char * p;
181 char cmd[128]={0};
182
183 sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
184 if (0 != exec_cmd(cmd, s_ap_iterface_name, sizeof(s_ap_iterface_name)) || s_ap_iterface_name[0] == '\0')
185 {
186 memset(s_ap_iterface_name, 0, sizeof (s_ap_iterface_name));
187 return NULL;
188 }
189 p = strchr(s_ap_iterface_name, ' ');
190 if (NULL != p)
191 {
192 *p = '\0';
193 }
194 p = strchr(s_ap_iterface_name, '\n');
195 if (NULL != p)
196 {
197 *p = '\0';
198 }
199 if (s_ap_iterface_name[0] == '\0')
200 {
201 return NULL;
202 }
203
204 return s_ap_iterface_name;
205}
206
you.chen70f377f2023-04-14 18:17:09 +0800207static void check_tether_and_notify()
208{
209 RLOGD("check_tether_and_notify called");
you.chen0df3e7e2023-05-10 15:56:26 +0800210 if (inner_get_ap_interface_name() == NULL || 0 == system_call_v("ifconfig | grep %s", s_ap_iterface_name))
you.chen70f377f2023-04-14 18:17:09 +0800211 {
212 return;
213 }
214 pthread_mutex_lock(&s_global_check_mutex);
215 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
216 pthread_cond_signal(&s_global_check_cond);
217 pthread_mutex_unlock(&s_global_check_mutex);
218}
219
you.chend2fef3f2023-02-13 10:50:35 +0800220static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
221 char *reply, size_t *reply_len,
222 void (*msg_cb)(char *msg, size_t len))
223{
224 int ret;
225 if (ctrl->ctrl == NULL) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800226 RLOGE("local_wpa_ctrl_request ctrl is null\n");
you.chend2fef3f2023-02-13 10:50:35 +0800227 return -1;
228 }
229 pthread_mutex_lock(&ctrl->mutex);
230 ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
231 pthread_mutex_unlock(&ctrl->mutex);
you.chen70f377f2023-04-14 18:17:09 +0800232 if (ret != 0)
233 {
234 notify_service_invoke_fail(ret);
235 }
you.chend2fef3f2023-02-13 10:50:35 +0800236 return ret;
237}
238
239static struct local_wpa_ctrl * inner_get_wpa_ctrl(int index) {
240 int repeat_cnt;
241 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
242 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800243 RLOGD("inner_get_wpa_ctrl\n");
you.chend2fef3f2023-02-13 10:50:35 +0800244 for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
245 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
246// printf("wait enable finish\n");
247 usleep(500 * 1000);
248 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
249 }
250 if (NULL == g_lynq_wpa_ctrl[index]) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800251 RLOGE("NULL == g_lynq_wpa_ctrl[index]");
you.chend2fef3f2023-02-13 10:50:35 +0800252 goto out_addr;
253 }
254 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
255 g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
256 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800257 RLOGE("wpa_ctrl_open fail\n");
you.chend2fef3f2023-02-13 10:50:35 +0800258 goto out_addr;
259 }
260 pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
261 }
262 lynq_wpa_ctrl = g_lynq_wpa_ctrl[index];
263out_addr:
264 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
265 return lynq_wpa_ctrl;
266}
267
qs.xiong97fa59b2022-04-07 05:41:29 -0400268#define PRINT_AND_RETURN_VALUE(str,value) \
qs.xiong97fa59b2022-04-07 05:41:29 -0400269{\
you.chen35020192022-05-06 11:30:57 +0800270 perror((str));\
271 return (value);\
qs.xiong97fa59b2022-04-07 05:41:29 -0400272}
273
you.chen35020192022-05-06 11:30:57 +0800274#define CHECK_IDX(idx, type) do { \
275 if ( (idx == LYNQ_WIFI_INTERFACE_0 && type != CTRL_STA) || (idx == LYNQ_WIFI_INTERFACE_1 && type != CTRL_AP) \
276 || idx < LYNQ_WIFI_INTERFACE_0 || idx > LYNQ_WIFI_INTERFACE_1 ) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800277 RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
you.chen35020192022-05-06 11:30:57 +0800278 return -1; \
279 } \
280 }while (0)
281
282#define CHECK_WPA_CTRL(index) int ret = 0;\
283 size_t reply_len = MAX_RET; \
284 char cmd_reply[MAX_RET]={0}; \
you.chend2fef3f2023-02-13 10:50:35 +0800285 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
you.chen35020192022-05-06 11:30:57 +0800286 do{ \
you.chend2fef3f2023-02-13 10:50:35 +0800287 lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
288 if (NULL == lynq_wpa_ctrl) return -1; \
you.chen35020192022-05-06 11:30:57 +0800289 }while(0)
290
291#define DO_REQUEST(cmd_str) do { \
292 reply_len = MAX_RET;\
293 cmd_reply[0] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800294 RLOGD("to call [%s]\n", cmd_str); \
you.chend2fef3f2023-02-13 10:50:35 +0800295 ret = local_wpa_ctrl_request(lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL); \
you.chen35020192022-05-06 11:30:57 +0800296 if (ret != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800297 RLOGE("call "#cmd_str" fail %d\n", ret); \
you.chen35020192022-05-06 11:30:57 +0800298 return ret; \
299 } \
300 cmd_reply[reply_len+1] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800301 RLOGD("cmd replay [ %s ]\n", cmd_reply); \
you.chen35020192022-05-06 11:30:57 +0800302 }while(0)
303
304#define DO_OK_FAIL_REQUEST(cmd_str) do { \
305 DO_REQUEST(cmd_str); \
306 if (reply_len >=4 && memcmp(cmd_reply, "FAIL", 4) == 0 ) {\
qs.xiong9fbf74e2023-03-28 13:38:22 +0800307 RLOGE("cmd "#cmd_str" return FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800308 return -1; \
309 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800310 RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800311 return -1; \
312 } \
313 }while (0)
314
315
you.chenf711c8a2023-04-13 13:49:45 +0800316static int check_connection(struct wpa_ctrl * wpa_ctrl)
317{
318 size_t reply_len = MAX_RET;
319 char cmd_reply[MAX_RET]={0};
320 int ret;
321
322 RLOGD("check_connection [%p]", wpa_ctrl);
323 ret = wpa_ctrl_request(wpa_ctrl, cmd_ping, strlen(cmd_ping), cmd_reply, &reply_len, NULL);
324
325 if (ret != 0 || reply_len < 4 || memcmp(cmd_reply, rsp_pong, 4) != 0)
326 {
327 RLOGE("check_connection error: ctrl [%p], ret [%d], reply_len [%d], rsp [%s]", wpa_ctrl, ret, reply_len, cmd_reply);
you.chen70f377f2023-04-14 18:17:09 +0800328 if (ret != 0)
329 {
330 notify_service_invoke_fail(ret);
331 }
you.chenf711c8a2023-04-13 13:49:45 +0800332 return -1;
333 }
334
335 return 0;
336}
337
338/**
339 * @brief check_pending_msg
340 * @param lynq_wpa_ctrl
341 * @return 1 has msg, 0 no msg, -1 error
342 */
343static int check_pending_msg(struct wpa_ctrl ** pp_lynq_wpa_ctrl, int type, int* idle_count, int *started_flag)
344{
345 int ret;
346
347 if (*pp_lynq_wpa_ctrl == NULL) // need connect
348 {
349 *pp_lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[type]); //@todo temp change
350 if (*pp_lynq_wpa_ctrl == NULL)
351 {
352 usleep(SLEEP_TIME_ON_IDLE);
353 return -1;
354 }
355
356 ret = wpa_ctrl_attach(*pp_lynq_wpa_ctrl);
357 if (ret == 0) // attach success
358 {
359 *started_flag = 1;
360 }
361 else
362 {
you.chen70f377f2023-04-14 18:17:09 +0800363 RLOGE("[wifi error]sta watch thread wpa_ctrl_attach fail");
you.chenf711c8a2023-04-13 13:49:45 +0800364 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
365 *pp_lynq_wpa_ctrl = NULL;
366 *idle_count = 0;
you.chen70f377f2023-04-14 18:17:09 +0800367 notify_service_invoke_fail(-2);
you.chenf711c8a2023-04-13 13:49:45 +0800368 usleep(SLEEP_TIME_ON_IDLE);
369 return -1;
370 }
371 }
372
373 ret = wpa_ctrl_pending(*pp_lynq_wpa_ctrl);
374 if ( ret == 0) // no pending messages
375 {
376 usleep(SLEEP_TIME_ON_IDLE);
377 *idle_count += 1;
378 if (*idle_count > MAX_IDLE_COUNT)
379 {
380 if (check_connection(*pp_lynq_wpa_ctrl) != 0)
381 {
382 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
383 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
384 *pp_lynq_wpa_ctrl = NULL;
385 *idle_count = 0;
386 return -1;
387 }
388 *idle_count = 0;
389 }
390 return 0;
391 }
392 else if ( ret == -1) // on error
393 {
394 RLOGE("[wifi error]sta wpa_ctrl_pending");
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;
you.chen70f377f2023-04-14 18:17:09 +0800399 notify_service_invoke_fail(ret);
you.chenf711c8a2023-04-13 13:49:45 +0800400 return -1;
401 }
402
403 *idle_count = 0;
404 return 1;
405}
406
you.chen6d247052023-06-01 16:39:54 +0800407static inline void inner_notify_ap_msg(lynq_wifi_ap_status_s status)
408{
409 pthread_mutex_lock(&s_ap_callback_mutex);
410 if (g_ap_callback_func != NULL)
411 g_ap_callback_func(g_ap_callback_priv, status);
412 pthread_mutex_unlock(&s_ap_callback_mutex);
413}
414
you.chen35020192022-05-06 11:30:57 +0800415static void APWatcherThreadProc() {
416 size_t len = MAX_RET;
417 char msg_notify[MAX_RET];
you.chenf711c8a2023-04-13 13:49:45 +0800418 int idle_count = 0;
you.chen35020192022-05-06 11:30:57 +0800419
you.chen6c2dd9c2022-05-16 17:55:28 +0800420 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800421 g_ap_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800422
qs.xiong9fbf74e2023-03-28 13:38:22 +0800423 while (g_ap_watcher_stop_flag == 0)
424 {
you.chenf711c8a2023-04-13 13:49:45 +0800425 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_AP, &idle_count, &g_ap_watcher_started_flag) != 1)
426 {
you.chen70f377f2023-04-14 18:17:09 +0800427 if (g_ap_callback_func != NULL && idle_count == MAX_IDLE_COUNT - 100 )
428 {
429 check_tether_and_notify();
430 }
431
you.chen35020192022-05-06 11:30:57 +0800432 continue;
433 }
you.chenf711c8a2023-04-13 13:49:45 +0800434
you.chen6c2dd9c2022-05-16 17:55:28 +0800435 memset(msg_notify, 0, MAX_RET);
436 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800437 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
you.chenf711c8a2023-04-13 13:49:45 +0800438 {
you.chen35020192022-05-06 11:30:57 +0800439 msg_notify[len+1] = '\0';
qs.xiong455c30b2023-04-12 11:40:02 +0800440 RLOGD("APWatcherThreadProc ap------> %s\n", msg_notify);
you.chenf711c8a2023-04-13 13:49:45 +0800441 //you.chen change for tv-box start
qs.xiong9fbf74e2023-03-28 13:38:22 +0800442 if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800443 {
you.chen6d247052023-06-01 16:39:54 +0800444 inner_notify_ap_msg(LYNQ_WIFI_STATUS_DISCONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800445 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800446 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800447 RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
448 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800449 {
you.chen0f5c6432022-11-07 18:31:14 +0800450 stopGBW();
451 }
452 }
you.chen35020192022-05-06 11:30:57 +0800453 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800454 else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800455 {
you.chen6d247052023-06-01 16:39:54 +0800456 inner_notify_ap_msg(LYNQ_WIFI_STATUS_CONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800457 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800458 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800459 RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
460 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800461 {
you.chen0f5c6432022-11-07 18:31:14 +0800462 startGBW();
463 }
464 }
you.chen35020192022-05-06 11:30:57 +0800465 }
you.chenf711c8a2023-04-13 13:49:45 +0800466 //you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +0800467 } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
468 } // end while (g_ap_watcher_stop_flag == 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800469 if (lynq_wpa_ctrl != NULL)
470 {
you.chen92fd5d32022-05-25 10:09:47 +0800471 wpa_ctrl_detach(lynq_wpa_ctrl);
472 wpa_ctrl_close(lynq_wpa_ctrl);
473 }
qs.xiong97fa59b2022-04-07 05:41:29 -0400474}
475
you.chen70f377f2023-04-14 18:17:09 +0800476static void inner_check_connect_error(const char * event_msg, lynq_wifi_sta_status_s state, error_number_s error_num)
477{
478 char * p;
479 const char * try_associat_flag = "Trying to associate";
480 const char * associated_flag = "Associated with ";
481
482 pthread_mutex_lock(&s_global_check_mutex);
483 if (s_sta_status < INNER_STA_STATUS_CONNECTING || s_sta_status >= INNER_STA_STATUS_CONNECTED) //not in connecting stage, egnore
484 {
485 pthread_mutex_unlock(&s_global_check_mutex);
486 return;
487 }
488
489 if (state == LYNQ_WIFI_STATUS_EGNORE)
490 {
491 if (strstr(event_msg, try_associat_flag) != NULL && strstr(event_msg, s_sta_current_connecting_ssid) != NULL) //associating request ssid
492 {
493 s_sta_status = INNER_STA_STATUS_ASSOCIATING;
494 }
495 else if (s_sta_status == INNER_STA_STATUS_ASSOCIATING && (p=strstr(event_msg, associated_flag)) != NULL)
496 {
497 s_sta_status = INNER_STA_STATUS_ASSOCIATED;
498 }
499 }
500 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
501 {
502 s_sta_error_number = error_num;
503 if (s_sta_status >= INNER_STA_STATUS_ASSOCIATING && strstr(event_msg, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL && error_num != LYNQ_WAIT_CONNECT_ACTIVE)
504 {
505 s_sta_status = INNER_STA_STATUS_DISCONNECTED;
506 pthread_cond_signal(&s_global_check_cond);
507 }
508 }
509 else if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
510 {
511 s_sta_status = INNER_STA_STATUS_CONNECTED;
512 pthread_cond_signal(&s_global_check_cond);
513 }
514 pthread_mutex_unlock(&s_global_check_mutex);
515}
516
qs.xiongf0128b12023-06-29 17:29:39 +0800517static int lynq_wifi_sta_stop_network(lynq_wifi_index_e idx,int networkid)
518{
519 char LYNQ_DISABLE_CMD[128]={0};
520
521 CHECK_IDX(idx, CTRL_STA);
522 CHECK_WPA_CTRL(CTRL_STA);
523
524 sprintf(LYNQ_DISABLE_CMD,"DISABLE_NETWORK %d",networkid);
525 RLOGD("LYNQ_DISABLE_CMD is:%d\n",LYNQ_DISABLE_CMD);
526 DO_OK_FAIL_REQUEST(LYNQ_DISABLE_CMD);
527
528 return 0;
529
530}
531
532
qs.xiong455c30b2023-04-12 11:40:02 +0800533void get_state_error(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error)
534{
535 char *pReason;
qs.xiongf0128b12023-06-29 17:29:39 +0800536 char *wpanetid;
537 char destid[3] = {0};
538 int tmpdisid = -1;
qs.xiong455c30b2023-04-12 11:40:02 +0800539 *error = LYNQ_WAIT_CONNECT_ACTIVE;
540 if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
541 {
542 *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
543 RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d\n",*state,*error);
544 return;
545 }
546
547 if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
548 {
549 *state = LYNQ_WIFI_STA_STATUS_CONNECT;
550 RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
551 return;
552 }
553
554 if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
555 {
qs.xiongf0128b12023-06-29 17:29:39 +0800556 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
557 wpanetid = strstr(modify,"id=");
558 if ( wpanetid != NULL )
559 {
560 wpanetid +=strlen("id=");
561 memcpy(destid,wpanetid,2);
562 tmpdisid = atoi(destid);
563
564 }
qs.xiong455c30b2023-04-12 11:40:02 +0800565 pReason = strstr(modify, "reason=");
566 if (pReason != NULL)
567 {
568 pReason += strlen("reason=");
569 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
570 {
571 *error = LYNQ_TIME_OUT;
572 }
573 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
574 {
575 *error = LYNQ_PSW_ERROR;
qs.xiongf0128b12023-06-29 17:29:39 +0800576 // tmp fix sta autoconnect connect and disconnect
577 if(tmpdisid != -1 && lynq_wifi_sta_stop_network(0,tmpdisid) != 0)
578 {
579 RLOGE("stop wlan0 network %d fail",tmpdisid);
580 }
qs.xiong455c30b2023-04-12 11:40:02 +0800581 }
582 else
583 {
584 *error = LYNQ_UNSPECIFIED_REASON;
585 }
qs.xiong455c30b2023-04-12 11:40:02 +0800586 }
587 else
588 {
589 *error = LYNQ_UNSPECIFIED_REASON;
qs.xiong455c30b2023-04-12 11:40:02 +0800590 }
qs.xiongf0128b12023-06-29 17:29:39 +0800591 RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d,tmpnetid:%d",*state,*error,tmpdisid);
592 return;
qs.xiong455c30b2023-04-12 11:40:02 +0800593
594 }
595
596 if (strstr(modify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
597 {
598 *error = LYNQ_NOT_FIND_AP;
599 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
600 RLOGD("CTRL-EVENT-NETWORK-NOT-FOUND state:%d,error:%d\n",*state,*error);
601 return;
602 }
603
604
605 if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
606 {
607 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
608 pReason = strstr(modify, "status_code=");
609 if (pReason != NULL)
610 {
611 pReason += strlen("status_code=");
612 if (memcmp(pReason, "17", 2) == 0)
613 {
614 *error = LYNQ_AP_UNABLE_HANDLE;
615 }
616 else if (memcmp(pReason, "1",1) == 0)
617 {
618 *error = LYNQ_UNSPECIFIED_REASON;
619 }
620 else
621 {
622 *error = LYNQ_UNSPECIFIED_REASON;
623 }
624
625 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
626 RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d\n",*state,*error);
627 return;
628 }
629 else
630 {
631 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
632 *error = LYNQ_UNSPECIFIED_REASON;
633 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
634 RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d\n",*state,*error);
635 return;
636 }
637 }
638
639 if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
640 {
641 RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
642 *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
643 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
644 RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d\n",*state,*error);
645 return;
646 }
647
648 if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
649 {
650 RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
651 *error = LYNQ_WAIT_CONNECT_ACTIVE;
652 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
653 RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
654 return;
655 }
656
you.chen32cb31e2023-04-13 14:05:45 +0800657 RLOGD("EVENT : %s\n", modify);
qs.xiong455c30b2023-04-12 11:40:02 +0800658 *error = LYNQ_UNSPECIFIED_REASON;
you.chen32cb31e2023-04-13 14:05:45 +0800659 *state = LYNQ_WIFI_STATUS_EGNORE;
qs.xiong455c30b2023-04-12 11:40:02 +0800660 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
661 return;
662
663}
664
you.chen70f377f2023-04-14 18:17:09 +0800665static void notify_connect_status(lynq_wifi_sta_status_s state, error_number_s error)
666{
you.chen6d247052023-06-01 16:39:54 +0800667 pthread_mutex_lock(&s_sta_callback_mutex);
you.chen70f377f2023-04-14 18:17:09 +0800668 if (g_sta_callback_func != NULL && state != LYNQ_WIFI_STATUS_EGNORE)
669 {
670 RLOGD("STAWatcherThreadProc callback begin ------> %d %d\n", state, error);
671 g_sta_callback_func(g_sta_callback_priv, state, error);
672 RLOGD("STAWatcherThreadProc callback end ------> %d %d\n", state, error);
673 }
you.chen6d247052023-06-01 16:39:54 +0800674 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen70f377f2023-04-14 18:17:09 +0800675}
676
you.chen35020192022-05-06 11:30:57 +0800677static void STAWatcherThreadProc() {
678 size_t len = MAX_RET;
679 char msg_notify[MAX_RET];
you.chen35020192022-05-06 11:30:57 +0800680 error_number_s error;
you.chenc9928582023-04-24 15:39:37 +0800681 lynq_wifi_sta_status_s state, last_state = -1;
you.chenf711c8a2023-04-13 13:49:45 +0800682 int idle_count = 0;
qs.xiongf1b525b2022-03-31 00:58:23 -0400683
you.chen6c2dd9c2022-05-16 17:55:28 +0800684 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800685 g_sta_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800686
you.chen70f377f2023-04-14 18:17:09 +0800687 RLOGD("STAWatcherThreadProc thread started ------");
qs.xiong9fbf74e2023-03-28 13:38:22 +0800688 while (g_sta_watcher_stop_flag == 0)
689 {
you.chenf711c8a2023-04-13 13:49:45 +0800690 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
qs.xiong455c30b2023-04-12 11:40:02 +0800691 {
you.chen35020192022-05-06 11:30:57 +0800692 continue;
693 }
you.chenf711c8a2023-04-13 13:49:45 +0800694
you.chen6c2dd9c2022-05-16 17:55:28 +0800695 memset(msg_notify, 0, MAX_RET);
696 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800697 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiong455c30b2023-04-12 11:40:02 +0800698 {
you.chen35020192022-05-06 11:30:57 +0800699 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800700 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
701 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800702 {
you.chen35020192022-05-06 11:30:57 +0800703 g_sta_scan_finish_flag = 1;
704 }
705
qs.xiong9fbf74e2023-03-28 13:38:22 +0800706 if (g_sta_callback_func == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800707 {
you.chen35020192022-05-06 11:30:57 +0800708 continue;
709 }
qs.xiong455c30b2023-04-12 11:40:02 +0800710 get_state_error(msg_notify,&state,&error);
you.chen70f377f2023-04-14 18:17:09 +0800711 notify_connect_status(state, error);
712
713 if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
you.chen32cb31e2023-04-13 14:05:45 +0800714 {
you.chen70f377f2023-04-14 18:17:09 +0800715 inner_check_connect_error(msg_notify, state, error);
you.chenc9928582023-04-24 15:39:37 +0800716 if (last_state != state)
717 {
718 if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
719 {
720 system_call_v("%s %s", sta_status_change_script, "connect");
721 }
722 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
723 {
724 system_call_v("%s %s", sta_status_change_script, "disconnect");
725 }
726 }
727
728 last_state = state;
you.chen32cb31e2023-04-13 14:05:45 +0800729 }
you.chen35020192022-05-06 11:30:57 +0800730 }
731 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800732 if (lynq_wpa_ctrl != NULL)
733 {
you.chen92fd5d32022-05-25 10:09:47 +0800734 wpa_ctrl_detach(lynq_wpa_ctrl);
735 wpa_ctrl_close(lynq_wpa_ctrl);
736 }
qs.xiongf1b525b2022-03-31 00:58:23 -0400737}
738
you.chen70f377f2023-04-14 18:17:09 +0800739// this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
740static void GlobalWatcherThreadProc()
741{
742 int ret, connect_timeout, service_abnormal;
743 error_number_s error_num = -1;
744 inner_sta_status_s sta_status;
745 scan_info_s *scan_list = NULL;
746 int i, scan_len=0;
747 char connecting_ssid[64];
748 struct timeval now;
749
750 RLOGD("GlobalWatcherThreadProc start to run");
751
752 while (1)
753 {
754 pthread_mutex_lock(&s_global_check_mutex);
755 pthread_cond_wait(&s_global_check_cond,&s_global_check_mutex);
756 if (s_sta_status == INNER_STA_STATUS_CONNECTED)
757 {
758 pthread_mutex_unlock(&s_global_check_mutex);
759 usleep(50*1000);
760 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
761 continue;
762 }
763
764 connect_timeout = 0;
765 service_abnormal = 0;
766 if (s_sta_status >= INNER_STA_STATUS_CONNECTING && s_sta_status < INNER_STA_STATUS_CONNECTED)
767 {
768 while (1)
769 {
770 ret = pthread_cond_timedwait(&s_global_check_cond, &s_global_check_mutex, &s_sta_connect_timeout);
771 if (ret == ETIME)
772 {
773 connect_timeout = 1;
774 }
775 else if (ret != 0)
776 {
777 gettimeofday(&now,NULL);
778 if (now.tv_sec < s_sta_connect_timeout.tv_sec) //time not arrive
779 {
780 usleep(SLEEP_TIME_ON_IDLE);
781 continue;
782 }
783 connect_timeout = 1;
784 }
785 sta_status = s_sta_status;
786 error_num = s_sta_error_number;
787 s_sta_status = INNER_STA_STATUS_INIT;
788 strcpy(connecting_ssid, s_sta_current_connecting_ssid);
789 memset(&s_sta_connect_timeout, 0, sizeof (s_sta_connect_timeout));
790 memset(&s_sta_current_connecting_ssid, 0, sizeof (s_sta_current_connecting_ssid));
791 break;
792 }
793 }
794 if (s_service_invoke_timeout_cnt > 10)
795 {
796 service_abnormal = 1;
797 s_service_invoke_timeout_cnt = 0;
798 }
799 pthread_mutex_unlock(&s_global_check_mutex);
800
801 if (service_abnormal == 1)
802 {
803 sleep(1);
804 RLOGE("wpa service is abnormal info app to exit");
805 notify_connect_status(LYNQ_WIFI_STA_SERVICE_ABNORMAL, -1);
you.chen6d247052023-06-01 16:39:54 +0800806
807 inner_notify_ap_msg(LYNQ_WIFI_SERVICE_ABNORMAL);
808
you.chen70f377f2023-04-14 18:17:09 +0800809 sleep(FAKE_MAX_INT_VALUE); // wait process to exit
810 }
811
812 if (sta_status == INNER_STA_STATUS_CANCEL)
813 {
814 continue;
815 }
816 else if (sta_status == INNER_STA_STATUS_CONNECTED)
817 {
818 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
819 }
820 else if (connect_timeout == 0 && error_num == LYNQ_NOT_FIND_AP) // not found ap maybe mismatch auth
821 {
822 if (0 == lynq_get_scan_list(0, &scan_list, &scan_len) && NULL != scan_list) // if not found, but scan result exist, maybe auth error
823 {
824 for(i=0; i < scan_len;i++)
825 {
826 if (strcmp(scan_list[i].ssid, connecting_ssid) == 0)
827 {
828 error_num = LYNQ_AUTH_ERROR;
829 break;
830 }
831 }
832 free(scan_list);
833 }
834 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
835 }
836 else if (connect_timeout == 0)
837 {
838 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
839 }
840 else // wait timeout
841 {
842 if (0 != lynq_get_sta_status(LYNQ_WIFI_INTERFACE_0, &sta_status)) // get status fail
843 {
844 ; // wpa service abnormal
845 }
846 else if (sta_status == LYNQ_WIFI_STA_STATUS_ENABLE) // connect ok
847 {
848 RLOGD("GlobalWatcherThreadProc notify connected");
849 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
850 }
851 else
852 {
853 RLOGD("GlobalWatcherThreadProc notify timeout");
854 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, LYNQ_TIME_OUT);
855 }
856 }
857 } // while (1)
858}
859
qs.xiong1af5daf2022-03-14 09:12:12 -0400860int lynq_wifi_enable(void)
861{
you.chen35020192022-05-06 11:30:57 +0800862 int ret = 0;
you.chen6c2dd9c2022-05-16 17:55:28 +0800863 int i;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800864 RLOGD("enter lynq_wifi_enable");
you.chend2fef3f2023-02-13 10:50:35 +0800865 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
866
qs.xiong9fbf74e2023-03-28 13:38:22 +0800867 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
868 {
you.chend2fef3f2023-02-13 10:50:35 +0800869 goto out_enable;
870 }
871
you.chenc9928582023-04-24 15:39:37 +0800872 ret = system(start_wg870_service_script);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800873 if (ret != 0)
874 {
875 //printf("service state %d\n", ret);
876 RLOGE("[wifi error]service state %d",ret);
you.chend2fef3f2023-02-13 10:50:35 +0800877 ret = -1;
878 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800879 }
lhfe8da902022-10-11 18:55:36 +0800880
you.chen70f377f2023-04-14 18:17:09 +0800881 if (g_global_watcher_pid == 0 ) // this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
882 {
883 ret=pthread_create(&g_global_watcher_pid,NULL,GlobalWatcherThreadProc,NULL);
884 if(ret<0)
885 {
886 RLOGE("[wifi error]creat GlobalWatcherThreadProc fail");
887 ret = -1;
888 goto out_enable;
889 }
890 }
891
you.chend2fef3f2023-02-13 10:50:35 +0800892 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
893 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
894 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
895 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
896out_enable:
897 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800898 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500899}
900
qs.xiong1af5daf2022-03-14 09:12:12 -0400901int lynq_wifi_disable(void)
902{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800903 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800904 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800905 g_ap_watcher_stop_flag = 1;
906 g_sta_watcher_stop_flag = 1;
907 if (g_ap_watcher_pid != 0)
908 pthread_join(g_ap_watcher_pid, NULL);
909 if (g_sta_watcher_pid != 0)
910 pthread_join(g_sta_watcher_pid, NULL);
911 if (g_lynq_wpa_ctrl[0] != NULL)
912 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
913 if (g_lynq_wpa_ctrl[1] != NULL)
914 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
915 g_ap_watcher_pid = 0;
916 g_sta_watcher_pid = 0;
917 g_lynq_wpa_ctrl[0] = NULL;
918 g_lynq_wpa_ctrl[1] = NULL;
919 system("systemctl stop wg870_drv_insmod.service");
you.chend2fef3f2023-02-13 10:50:35 +0800920 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
921 return 0;
922}
923
924static inline char inner_convert_char(char in)
925{
926 if (in >= '0' && in <= '9')
927 {
928 return in - '0';
929 }
930 else if (in >= 'a' && in <= 'f')
931 {
932 return in - 'a' + 10;
933 }
934 else if (in >= 'A' && in <= 'F')
935 {
936 return in - 'A' + 10;
937 }
938 else
939 {
940 return '\xff';
941 }
942}
943
944static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
945{
946 char *p;
947 size_t pos = 0;
948 if (NULL == out_ssid)
949 return;
950 //printf("input ssid=[%s]\n", ssid);
951 memset(out_ssid, 0, out_ssid_len);
952 if (NULL == ssid)
953 return;
954 p = strchr(ssid, '\\');
955 if (NULL == p)
956 {
957 strncpy(out_ssid, ssid, out_ssid_len);
958 //printf(" first %s\n", out_ssid);
959 }
960 else
961 {
962 pos = p - ssid;
963 memcpy(out_ssid, ssid, pos);
964 //printf("pos %lu -- %s\n", pos, out_ssid);
965 for(; pos < out_ssid_len; pos ++)
966 {
967 if (p[0] == '\0')
968 {
969 //printf(" out %s\n", out_ssid);
970 return;
971 }
972 else if (p[0] != '\\')
973 {
974 out_ssid[pos] = p[0];
975 p += 1;
976 }
977 else if (p[1] == 'x' || p[1] == 'X')
978 {
979 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
980 p += 4;
981 }
982 else if (p[1] == '\\')
983 {
984 out_ssid[pos] = '\\';
985 p += 2;
986 }
987 else if (p[1] == 't')
988 {
989 out_ssid[pos] = '\t';
990 p += 2;
991 }
992 else if (p[1] == 'r')
993 {
994 out_ssid[pos] = '\r';
995 p += 2;
996 }
997 else if (p[1] == 'n')
998 {
999 out_ssid[pos] = '\n';
1000 p += 2;
1001 }//todo find a better way to convert?
1002 }
1003 }
1004 //printf(" out %s\n", out_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001005}
qs.xiong1af5daf2022-03-14 09:12:12 -04001006
you.chen35020192022-05-06 11:30:57 +08001007static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +08001008 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08001009 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001010 RLOGD("enter inner_get_param");
1011 if (out_put == NULL)
1012 {
1013 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +08001014 return -1;
1015 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001016 if (param_name == NULL)
1017 {
1018 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +08001019 return -1;
1020 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001021 if (param_name[0] == '\0')
1022 {
1023 RLOGE("param is empty");
you.chen35020192022-05-06 11:30:57 +08001024 return -1;
1025 }
1026
1027 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
1028
1029 CHECK_WPA_CTRL(interface);
1030
1031 DO_REQUEST(lynq_cmd_get);
1032
qs.xiong9fbf74e2023-03-28 13:38:22 +08001033 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1034 {
1035 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +08001036 return -1;
1037 }
1038
you.chena6fa5b22022-05-18 10:28:19 +08001039// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +08001040 if (strcmp(param_name, "ssid") == 0)
1041 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001042 if (cmd_reply[0] == '\"')
1043 {
you.chend2fef3f2023-02-13 10:50:35 +08001044 ssid_len = reply_len - 1;
1045 memcpy(out_put, cmd_reply + 1, ssid_len);
1046 if (out_put[ssid_len-1] == '\"')
1047 {
1048 out_put[ssid_len-1] = '\0';
1049 }
1050 else
1051 {
1052 out_put[ssid_len] = '\0';
1053 }
1054 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001055 else
1056 {
you.chend2fef3f2023-02-13 10:50:35 +08001057 ssid_len = reply_len / 2;
1058 for(i=0; i<ssid_len; i++)
1059 {
1060 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
1061 }
1062 out_put[ssid_len] = '\0';
1063 }
1064 }
1065 else
1066 {
1067 memcpy(out_put, cmd_reply, reply_len + 1);
1068 }
you.chen35020192022-05-06 11:30:57 +08001069 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001070}
qs.xiong1af5daf2022-03-14 09:12:12 -04001071
you.chen35020192022-05-06 11:30:57 +08001072static int lynq_split(char * str, int len, char delimiter, char * results[]) {
1073 int ret = 0;
1074 char * end = str + len - 1;
1075 results[ret++] = str;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001076 while(str < end)
1077 {
1078 if (*str == delimiter)
1079 {
you.chen35020192022-05-06 11:30:57 +08001080 *str++ = '\0';
1081 results[ret++] = str;
1082 continue;
1083 }
1084 str++;
1085 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001086 if (*str == delimiter)
1087 {
you.chen35020192022-05-06 11:30:57 +08001088 *str = '\0';
1089 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001090
you.chen6ed36a62023-04-27 17:51:56 +08001091 results[ret] = NULL;
1092
you.chen35020192022-05-06 11:30:57 +08001093 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001094}
1095
you.chend2fef3f2023-02-13 10:50:35 +08001096static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
1097{
1098 char * p;
1099 int ret = 0;
1100 char cmd[256]={0};
1101 if (NULL == mac || NULL == ip)
you.chen35020192022-05-06 11:30:57 +08001102 return -1;
you.chend2fef3f2023-02-13 10:50:35 +08001103 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +08001104 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-02-13 10:50:35 +08001105 ret = exec_cmd(cmd, ip, ip_len);
1106 p = strchr(ip, '\n');
1107 if (NULL != p)
1108 {
1109 *p = '\0';
you.chen35020192022-05-06 11:30:57 +08001110 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001111 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +08001112 return ret;
1113}
1114
you.chend2fef3f2023-02-13 10:50:35 +08001115static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +08001116 struct in_addr addr ={0};
1117 struct hostent *ht;
you.chen186d3c32023-05-18 14:19:46 +08001118 char cmd[64] = {0};
1119 char * p;
1120 int ret;
you.chen35020192022-05-06 11:30:57 +08001121
qs.xiong9fbf74e2023-03-28 13:38:22 +08001122 if (ip == NULL || *ip == '\0' || hostname == NULL)
1123 {
1124 RLOGE("ip == NULL or hostname == NULL");
1125 return -1;
you.chen35020192022-05-06 11:30:57 +08001126 }
1127
you.chend2fef3f2023-02-13 10:50:35 +08001128 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08001129 if (inet_aton(ip, &addr) == 0)
1130 {
you.chen35020192022-05-06 11:30:57 +08001131 printf("---inet_aton fail\n");
1132 return -1;
1133 }
1134
1135 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
1136
qs.xiong9fbf74e2023-03-28 13:38:22 +08001137 if (ht == NULL)
1138 {
you.chen186d3c32023-05-18 14:19:46 +08001139 hostname[0] = '\0';
1140 sprintf(cmd, "grep -F '%s' /run/wg870/ap0.lease | awk '{print $4}' | tail -1", ip);
1141 ret = exec_cmd(cmd, hostname, 32);
1142 if (ret == 0)
1143 {
1144 p = strchr(hostname, '\n');
1145 if (p != NULL)
1146 {
1147 *p = '\0';
1148 }
1149 return 0;
1150 }
1151 hostname[0] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08001152 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-05-06 11:30:57 +08001153 herror(NULL);
1154 return -1;
1155 }
1156
1157 strcpy(hostname, ht->h_name);
1158
1159 return 0;
1160}
1161
1162static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
1163{
1164 int count, index, words_count;
1165 char * split_lines[128]= {0};
1166 char * split_words[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08001167 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +08001168 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001169 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-05-06 11:30:57 +08001170
1171 CHECK_WPA_CTRL(ap_sta);
1172
1173 DO_REQUEST(lynq_wifi_list_networks);
1174
1175 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1176
1177 //@todo check ssid field to compatible
1178
1179 ret = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001180 for(index=1; index < count; index++)
1181 {
you.chen35020192022-05-06 11:30:57 +08001182 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001183 if (words_count > 2)
1184 {
you.chend2fef3f2023-02-13 10:50:35 +08001185 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001186 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
1187 {
you.chen35020192022-05-06 11:30:57 +08001188 net_no_list[ret++] = atoi(split_words[0]);
1189 }
1190 }
1191 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001192 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +08001193 return ret;
1194}
1195
1196static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001197 size_t i=0;
you.chen35020192022-05-06 11:30:57 +08001198 CHECK_WPA_CTRL(ap_sta);
1199 const char *lynq_wifi_add_network = "ADD_NETWORK";
1200
qs.xiong9fbf74e2023-03-28 13:38:22 +08001201 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +08001202 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001203 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1204 {
1205 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen35020192022-05-06 11:30:57 +08001206 return -1;
1207 }
1208
qs.xiong9fbf74e2023-03-28 13:38:22 +08001209 for(i=0;i<reply_len;i++)
1210 {
1211 if(cmd_reply[i] == '\n')
1212 {
you.chen35020192022-05-06 11:30:57 +08001213 cmd_reply[i] = '\0';
1214 break;
1215 }
1216 }
1217 return atoi(cmd_reply);
1218}
you.chena6cd55a2022-05-08 12:20:18 +08001219
you.chen35020192022-05-06 11:30:57 +08001220static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
1221{
1222 int count, index;
1223 int net_no_list[128];
1224
qs.xiong9fbf74e2023-03-28 13:38:22 +08001225 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +08001226 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001227 for (index=0; index < count; index++)
1228 {
1229 if (net_no_list[index] == net_no)
1230 {
you.chen35020192022-05-06 11:30:57 +08001231 return 0;
1232 }
1233 }
1234
1235 if (count >= 1)
1236 index = net_no_list[count - 1];
1237 else
1238 index = -1;
1239
qs.xiong9fbf74e2023-03-28 13:38:22 +08001240 while (index < net_no )
1241 {
you.chen35020192022-05-06 11:30:57 +08001242 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001243 if (index >= net_no)
1244 { // required network no created
1245 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +08001246 return 0;
1247 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001248 else if( index < 0)
1249 {
1250 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +08001251 return -1;
1252 }
you.chen35020192022-05-06 11:30:57 +08001253 }
1254
1255 if (index < 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001256 {
1257 RLOGE("[lynq_check_network_number] network index < 0");
1258 return -1;
1259 }
1260 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen35020192022-05-06 11:30:57 +08001261 return 0;
1262}
1263
1264static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +08001265 if (freq > 5000 && freq < 6000)
1266 {
you.chen35020192022-05-06 11:30:57 +08001267 return LYNQ_WIFI_5G_band;
1268 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001269 else if (freq > 2000 && freq < 3000)
1270 {
you.chen35020192022-05-06 11:30:57 +08001271 return LYNQ_WIFI_2G_band;
1272 }
1273 return LYNQ_WIFI_2_and_5G_band;
1274}
1275
1276static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001277 if (key_mgmt != NULL)
1278 {
1279 if (memcmp( key_mgmt, "NONE", 4) == 0)
1280 {
you.chen35020192022-05-06 11:30:57 +08001281 return LYNQ_WIFI_AUTH_OPEN;
1282 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001283 else if (memcmp( key_mgmt, "WEP", 3) == 0)
1284 {
you.chen35020192022-05-06 11:30:57 +08001285 return LYNQ_WIFI_AUTH_WEP;
1286 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001287 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
1288 {
you.chen35020192022-05-06 11:30:57 +08001289 return LYNQ_WIFI_AUTH_WPA_PSK;
1290 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001291 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
1292 {
you.chen35020192022-05-06 11:30:57 +08001293 return LYNQ_WIFI_AUTH_WPA2_PSK;
1294 }
1295 }
1296
1297 return -1;
1298}
1299
1300static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001301 if (flag != NULL)
1302 {
qs.xiong3e506812023-04-06 11:08:48 +08001303 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
1304 {
1305 return LYNQ_WIFI_AUTH_WPA3_PSK;
1306 }else if ( strstr( flag,"SAE-CCMP") != NULL )
1307 {
1308 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
1309 }else if (strstr( flag, "WPA2-PSK") != NULL)
1310 {
you.chen35020192022-05-06 11:30:57 +08001311 return LYNQ_WIFI_AUTH_WPA2_PSK;
1312 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001313 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001314 {
you.chen35020192022-05-06 11:30:57 +08001315 return LYNQ_WIFI_AUTH_WPA_PSK;
1316 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001317 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001318 {
you.chen35020192022-05-06 11:30:57 +08001319 return LYNQ_WIFI_AUTH_WEP;
1320 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001321 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001322 {
you.chen35020192022-05-06 11:30:57 +08001323 return LYNQ_WIFI_AUTH_OPEN;
1324 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001325 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +08001326 {
you.chend2fef3f2023-02-13 10:50:35 +08001327 return LYNQ_WIFI_AUTH_OPEN;
1328 }
you.chen35020192022-05-06 11:30:57 +08001329 }
1330
1331 return -1;
1332}
1333
1334static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
1335 switch (bw) {
1336 case 10:
1337 return LYNQ_WIFI_BANDWIDTH_HT10;
1338 break;
1339 case 20:
1340 return LYNQ_WIFI_BANDWIDTH_HT20;
1341 break;
1342 case 40:
1343 return LYNQ_WIFI_BANDWIDTH_HT40;
1344 break;
1345 case 80:
1346 return LYNQ_WIFI_BANDWIDTH_HT80;
1347 break;
1348 default:
1349 break;
1350 }
1351
1352 return -1;
1353}
1354
you.chen70f377f2023-04-14 18:17:09 +08001355static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth);
you.chen35020192022-05-06 11:30:57 +08001356static int inner_get_status_info(int interface, curr_status_info *curr_state) {
1357 int i, count;
1358 char *p;
1359 const char *lynq_status_cmd = "STATUS";
1360 const char * FLAG_SSID = "ssid=";
1361 const char * FLAG_SBSID = "bssid=";
1362 const char * FLAG_KEY_MGMT = "key_mgmt=";
1363 const char * FLAG_FREQ = "freq=";
1364 const char * FLAG_STATE = "wpa_state=";
1365 const char * FLAG_ID = "id=";
you.chend2fef3f2023-02-13 10:50:35 +08001366 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +08001367 char *split_lines[128] = {0};
1368
1369 CHECK_WPA_CTRL(interface);
1370
qs.xiong9fbf74e2023-03-28 13:38:22 +08001371 if (curr_state == NULL)
1372 {
1373 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-05-06 11:30:57 +08001374 return -1;
1375 }
1376
1377 DO_REQUEST(lynq_status_cmd);
1378
1379 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1380
1381 curr_state->net_no = -1;
1382 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001383 for(i=0; i < count; i++)
1384 {
1385 if (curr_state->ap != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001386 {
you.chen35020192022-05-06 11:30:57 +08001387 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001388 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001389 {
you.chend2fef3f2023-02-13 10:50:35 +08001390 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +08001391 ret = 0;
1392 continue;
1393 }
you.chenf58b3c92022-06-21 16:53:48 +08001394 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001395 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001396 {
you.chend2fef3f2023-02-13 10:50:35 +08001397 inner_copy_ssid(curr_state->ap->ap_ssid, p + strlen(FLAG_SSID), sizeof (curr_state->ap->ap_ssid));
you.chenf58b3c92022-06-21 16:53:48 +08001398 ret = 0;
1399 continue;
1400 }
you.chen35020192022-05-06 11:30:57 +08001401 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001402 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001403 {
you.chen450d0172022-07-15 17:56:48 +08001404 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001405 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +08001406 ret = 0;
1407 continue;
1408 }
1409 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001410 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001411 {
you.chen35020192022-05-06 11:30:57 +08001412 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1413 ret = 0;
1414 continue;
1415 }
you.chend2fef3f2023-02-13 10:50:35 +08001416 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001417 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001418 {
you.chend2fef3f2023-02-13 10:50:35 +08001419 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1420 ret = 0;
1421 continue;
1422 }
you.chen35020192022-05-06 11:30:57 +08001423 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001424 if (curr_state->state != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001425 {
you.chen35020192022-05-06 11:30:57 +08001426 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001427 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001428 {
you.chen35020192022-05-06 11:30:57 +08001429 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1430 ret = 0;
1431 continue;
1432 }
1433
1434 } //end else if (state != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001435 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
you.chen70f377f2023-04-14 18:17:09 +08001436 {
you.chen35020192022-05-06 11:30:57 +08001437 ret = 0;
you.chen450d0172022-07-15 17:56:48 +08001438 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001439 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +08001440 }
1441 }
1442
you.chen70f377f2023-04-14 18:17:09 +08001443 if (ret == 0 && curr_state->ap != NULL && curr_state->net_no >= 0) // auth may not right when add wpa3
1444 {
1445 inner_get_network_auth(interface, curr_state->net_no, &curr_state->ap->auth);
1446 }
1447
you.chen35020192022-05-06 11:30:57 +08001448 return ret;
1449}
1450
qs.xiongf1b525b2022-03-31 00:58:23 -04001451int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001452{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001453 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +08001454 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -05001455
qs.xiong9fbf74e2023-03-28 13:38:22 +08001456 if (ap_ssid == NULL)
1457 {
1458 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +08001459 return -1;
1460 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001461 else
1462 {
1463 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen35020192022-05-06 11:30:57 +08001464 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001465
qs.xiong9fbf74e2023-03-28 13:38:22 +08001466 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1467 {
1468 RLOGE("Do check ap network_number fail");
you.chen35020192022-05-06 11:30:57 +08001469 return -1;
1470 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001471
you.chen35020192022-05-06 11:30:57 +08001472 CHECK_IDX(idx, CTRL_AP);
1473
1474 CHECK_WPA_CTRL(CTRL_AP);
1475
1476 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1477
1478 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1479 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001480 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1481 return 0;
you.chen35020192022-05-06 11:30:57 +08001482
qs.xiong7a105ce2022-03-02 09:43:11 -05001483}
1484
you.chen35020192022-05-06 11:30:57 +08001485int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001486{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001487 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001488 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001489 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001490}
1491
qs.xiongc9c79f72022-10-17 15:27:18 +08001492/*****
1493 *frequency <------>channel
1494 *
1495 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1496 *
1497 *
1498 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1499 *
1500 *
1501 * */
1502static int lynq_check_set_frequency(int input_frequency){
qs.xiongc00b6032022-11-29 16:28:03 +08001503 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};
1504 int i;
1505 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1506
qs.xiong69a332b2022-12-02 09:58:57 +08001507 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001508 {
1509 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001510 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001511 }
qs.xiongc00b6032022-11-29 16:28:03 +08001512
1513 if(i == arr_len)
1514 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001515 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001516 return -1;
1517 }
qs.xiongc00b6032022-11-29 16:28:03 +08001518
qs.xiongc9c79f72022-10-17 15:27:18 +08001519 return 0;
1520}
qs.xiong13673462023-02-21 19:12:54 +08001521
1522static int lynq_check_frequencyby_country_code(int input_frequency)
1523{
1524 char str_cnc[]="CN";
1525 char str_dest[20]="";
1526
1527 if( lynq_get_country_code(1,str_dest) != 0 )
1528 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001529 RLOGE("get country_code error\n");
qs.xiong13673462023-02-21 19:12:54 +08001530 return -1;
1531 }
1532 if( strncmp(str_dest,str_cnc,2) != 0 )
1533 {
1534 return 0;
1535 }else if( 2473 < input_frequency && input_frequency < 5744)
1536 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001537 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001538 return -1;
1539 }
1540 return 0;
1541}
qs.xiongf1b525b2022-03-31 00:58:23 -04001542int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001543{
qs.xiongc00b6032022-11-29 16:28:03 +08001544 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001545 char lynq_wifi_frequency_cmd[128]={0};
1546 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001547 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001548 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001549 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001550 check = lynq_check_set_frequency(lynq_wifi_frequency);
1551 if(check != 0)
1552 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001553 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001554 return -1;
you.chen35020192022-05-06 11:30:57 +08001555 }
qs.xiong13673462023-02-21 19:12:54 +08001556 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1557 if(check != 0)
1558 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001559 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001560 return -1;
1561 }
1562
qs.xiongc00b6032022-11-29 16:28:03 +08001563 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1564 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001565 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001566 return -1;
1567 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001568
you.chen35020192022-05-06 11:30:57 +08001569 CHECK_IDX(idx, CTRL_AP);
1570
1571 CHECK_WPA_CTRL(CTRL_AP);
1572
1573 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1574 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1575 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1576
you.chen6c2dd9c2022-05-16 17:55:28 +08001577 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-05-06 11:30:57 +08001578 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1579 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1580 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001581
qs.xiong9fbf74e2023-03-28 13:38:22 +08001582 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001583}
1584
qs.xiongf1b525b2022-03-31 00:58:23 -04001585int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001586{
you.chen35020192022-05-06 11:30:57 +08001587 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001588 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001589 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001590
qs.xiong9fbf74e2023-03-28 13:38:22 +08001591 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1592 {
1593 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen35020192022-05-06 11:30:57 +08001594 return -1;
1595 }
1596 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001597
qs.xiong9fbf74e2023-03-28 13:38:22 +08001598 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001599}
1600
qs.xiongf1b525b2022-03-31 00:58:23 -04001601int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1602{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001603 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001604 CHECK_IDX(idx, CTRL_AP);
1605 switch(bandwidth){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001606 case LYNQ_WIFI_BANDWIDTH_HT10:
1607 {
1608 RLOGE("bandwith [%d] not support now\n", bandwidth);
1609 return -1;
1610 }
1611 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen35020192022-05-06 11:30:57 +08001612 {
1613 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1614 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001615 if (system(lynq_cmd_bandwith) != 0 )
1616 {
1617 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001618 return -1;
1619 }
1620 system("wl up");
1621 break;
1622 }
1623 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001624 {
qs.xiong10379192023-02-21 13:19:42 +08001625 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001626 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1627 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001628 if (system(lynq_cmd_bandwith) != 0 )
1629 {
1630 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001631 return -1;
1632 }
1633 system("wl up");
1634 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001635 }
you.chen35020192022-05-06 11:30:57 +08001636 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001637 {
qs.xiong10379192023-02-21 13:19:42 +08001638 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001639 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001640 if (system(lynq_cmd_bandwith) != 0 )
1641 {
1642 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001643 return -1;
1644 }
1645 system("wl up");
1646 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001647 }
1648 default:
you.chen35020192022-05-06 11:30:57 +08001649 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001650 RLOGE("auth type [%d] not support now\n", bandwidth);
1651 return -1;
you.chen35020192022-05-06 11:30:57 +08001652 }
1653 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001654
1655
you.chen35020192022-05-06 11:30:57 +08001656 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001657}
you.chen35020192022-05-06 11:30:57 +08001658
qs.xiongf1b525b2022-03-31 00:58:23 -04001659int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1660{
you.chen35020192022-05-06 11:30:57 +08001661 int count = 0;
1662 int index = 0;
1663 char *split_words[128] = {0};
1664 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001665 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001666 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001667
you.chen35020192022-05-06 11:30:57 +08001668 CHECK_WPA_CTRL(CTRL_AP);
1669
1670 DO_REQUEST(lynq_chanspec_cmd);
1671
1672 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1673 for(;index < count; index++) {
1674 if (strncmp(split_words[index], "bw", 2) != 0) {
1675 continue;
1676 }
1677
1678 index++;
1679 if (index >= count) {
1680 return -1;
1681 }
1682
qs.xiong9fbf74e2023-03-28 13:38:22 +08001683 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001684 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1685 return 0;
1686 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001687 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001688 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001689}
qs.xiong0fb469a2022-04-14 03:50:45 -04001690
qs.xiongf1b525b2022-03-31 00:58:23 -04001691int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001692{
you.chen35020192022-05-06 11:30:57 +08001693 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001694 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001695 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001696
you.chen35020192022-05-06 11:30:57 +08001697 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001698
qs.xiong9fbf74e2023-03-28 13:38:22 +08001699 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1700 {
you.chen35020192022-05-06 11:30:57 +08001701 return -1;
1702 }
1703
1704 system("wl down");
1705 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001706 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001707 return -1;
1708 }
1709 system("wl up");
1710 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001711}
qs.xiong0fb469a2022-04-14 03:50:45 -04001712
qs.xiongf1b525b2022-03-31 00:58:23 -04001713int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001714{
you.chen35020192022-05-06 11:30:57 +08001715 int count = 0;
1716 int index = 0;
1717 char *split_words[128] = {0};
1718 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001719 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001720 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001721
you.chen35020192022-05-06 11:30:57 +08001722 CHECK_WPA_CTRL(CTRL_AP);
1723
1724 DO_REQUEST(lynq_chanspec_cmd);
1725
1726 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001727 for(;index < count; index++)
1728 {
1729 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001730 if (strncmp(split_words[index], "channel", 2) != 0) {
1731 continue;
1732 }
1733
1734 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001735 if (index >= count)
1736 {
you.chen35020192022-05-06 11:30:57 +08001737 return -1;
1738 }
1739
1740 *channel = atoi(split_words[index]);
1741 return 0;
1742 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001743 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001744 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001745}
1746
1747
you.chen35020192022-05-06 11:30:57 +08001748int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001749{
you.chen6c2dd9c2022-05-16 17:55:28 +08001750 char ssid[MAX_CMD] = {0};
1751 int freq = 0;
1752 char lynq_auth_cmd[64]={0};
1753 char lynq_auth_alg_cmd[64]={0};
1754 char lynq_psk_cmd[64]={0};
1755 char lynq_pairwise_cmd[64]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001756 char lynq_ieee80211_cmd[64]={0};
1757 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001758 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001759 CHECK_IDX(idx, CTRL_AP);
1760
you.chen6c2dd9c2022-05-16 17:55:28 +08001761 CHECK_WPA_CTRL(CTRL_AP);
1762
qs.xiong9fbf74e2023-03-28 13:38:22 +08001763 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1764 {
1765 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen35020192022-05-06 11:30:57 +08001766 return -1;
1767 }
1768
you.chen92fd5d32022-05-25 10:09:47 +08001769 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001770 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001771 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001772 return 0;
1773 }
1774 else {
1775 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1776 ssid[0] = '\0';
1777 }
1778 lynq_wifi_ap_frequency_get(idx, &freq);
1779
1780 DO_OK_FAIL_REQUEST(cmd_disconnect);
1781 DO_OK_FAIL_REQUEST(cmd_remove_all);
1782 if (ssid[0] != '\0') {
1783 lynq_wifi_ap_ssid_set(idx, ssid);
1784 }
1785 if (freq != 0) {
1786 lynq_wifi_ap_frequency_set(idx, freq);
1787 }
1788 }
1789 }
you.chen35020192022-05-06 11:30:57 +08001790
qs.xiong9fbf74e2023-03-28 13:38:22 +08001791 switch(auth){
1792 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001793 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001794 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001795 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001796 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001797 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001798 break;
1799 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001800 case LYNQ_WIFI_AUTH_WEP:
1801 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001802 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001803 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001804 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-05-16 17:55:28 +08001805 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1806
1807 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1808 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1809 break;
1810 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001811 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-03-29 17:36:14 +08001812 {
1813 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1814 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1815 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1816
1817 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1818 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1819 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1820 break;
1821
1822 }
you.chen35020192022-05-06 11:30:57 +08001823 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001824 {
1825 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1826 {
you.chen35020192022-05-06 11:30:57 +08001827 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1828 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1829 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001830 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1831 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001832 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001833 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001834 }
1835// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1836// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1837 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong7a105ce2022-03-02 09:43:11 -05001838
you.chen35020192022-05-06 11:30:57 +08001839 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1840 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1841 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001842 break;
1843 }
1844 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1845 {
1846 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1847 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1848 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1849 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1850
1851 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1852 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1853 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1854 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1855 break;
1856 }
1857 case LYNQ_WIFI_AUTH_WPA3_PSK:
1858 {
1859 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1860 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xiong3e506812023-04-06 11:08:48 +08001861 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001862 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1863
1864 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1865 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1866 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1867 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1868 break;
1869 }
1870 default:
you.chen35020192022-05-06 11:30:57 +08001871 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001872 RLOGE("auth type [%d] not support now\n", auth);
1873 return -1;
you.chen35020192022-05-06 11:30:57 +08001874 }
1875 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001876 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001877
qs.xiong9fbf74e2023-03-28 13:38:22 +08001878 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001879}
1880
you.chen35020192022-05-06 11:30:57 +08001881int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001882{
you.chen35020192022-05-06 11:30:57 +08001883 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001884 char lynq_auth_alg_str[MAX_RET] = {0};
1885 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001886 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001887 CHECK_IDX(idx, CTRL_AP);
1888
qs.xiong9fbf74e2023-03-28 13:38:22 +08001889 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1890 {
1891 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen35020192022-05-06 11:30:57 +08001892 return -1;
1893 }
1894
qs.xiong9fbf74e2023-03-28 13:38:22 +08001895 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1896 {
1897 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1898 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001899 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001900 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001901 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001902 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001903 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1904 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001905 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001906 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001907 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001908 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001909 else
1910 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001911 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001912 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001913 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001914 }
you.chen35020192022-05-06 11:30:57 +08001915 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001916 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1917 {
1918 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1919 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001920 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001921 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001922 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001923 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1924 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001925 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001926 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001927 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001928 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001929 else
1930 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001931 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001932 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001933 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001934 }
you.chen35020192022-05-06 11:30:57 +08001935 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001936
1937 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1938 {
1939 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1940 return -1;
1941 }
1942
1943 if (memcmp(lynq_auth_str,"1",1) == 0 )
1944 {
1945 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1946 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001947 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001948 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1949 {
1950 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1951 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001952 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001953 }
1954 else
1955 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001956 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001957 *auth = -1;
1958 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001959
you.chen6c2dd9c2022-05-16 17:55:28 +08001960 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001961}
qs.xiong1af5daf2022-03-14 09:12:12 -04001962
you.chenb95401e2023-05-12 19:39:06 +08001963static int inner_check_ap_connected(lynq_wifi_index_e idx, int retry_count)
1964{
1965 char status[64];
you.chencba13492023-05-19 13:53:43 +08001966 char LYNQ_WIFI_CMD[32]={0};
you.chenb95401e2023-05-12 19:39:06 +08001967 curr_status_info curr_state;
1968
1969 CHECK_WPA_CTRL(CTRL_AP);
1970
1971 memset(status, 0, sizeof (status));
1972
1973 curr_state.ap = NULL;
1974 curr_state.state = status;
1975
1976 printf("inner_check_ap_connected %d\n", retry_count);
1977 usleep(500*1000);
1978 if (0 == inner_get_status_info(idx, &curr_state))
1979 {
1980 if (strcmp(status, STATE_COMPLETED) == 0)
1981 {
1982 return 0;
1983 }
1984 else if (retry_count == 4) //not ok in 2s, do reconnect
1985 {
1986 DO_REQUEST("RECONNECT");
1987 return inner_check_ap_connected(idx, retry_count+1);
1988 }
you.chencba13492023-05-19 13:53:43 +08001989 else if (retry_count > 20)
you.chenb95401e2023-05-12 19:39:06 +08001990 {
1991 printf("retry 10 time\n");
1992 return -1;
1993 }
1994 else
1995 {
you.chen6d247052023-06-01 16:39:54 +08001996 if (strcmp(status, STATE_DISCONNECTED) == 0)
1997 {
1998 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1999 DO_REQUEST(LYNQ_WIFI_CMD);
2000 }
you.chenb95401e2023-05-12 19:39:06 +08002001 return inner_check_ap_connected(idx, retry_count+1);
2002 }
2003 }
2004 return -1;
2005}
qs.xiong1af5daf2022-03-14 09:12:12 -04002006
qs.xiongf1b525b2022-03-31 00:58:23 -04002007int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002008{
you.chen35020192022-05-06 11:30:57 +08002009 char LYNQ_WIFI_CMD[128]={0};
2010 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
2011 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08002012 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08002013 CHECK_IDX(idx, CTRL_AP);
2014
2015 CHECK_WPA_CTRL(CTRL_AP);
2016
you.chen0df3e7e2023-05-10 15:56:26 +08002017 if (inner_get_ap_interface_name() == NULL)
you.chenc9928582023-04-24 15:39:37 +08002018 {
you.chen0df3e7e2023-05-10 15:56:26 +08002019 RLOGE("lynq_wifi_ap_start get ap name fail");
you.chenc9928582023-04-24 15:39:37 +08002020 return -1;
2021 }
you.chen35020192022-05-06 11:30:57 +08002022
2023 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
2024 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
2025
2026 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
2027 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
2028
you.chenc9928582023-04-24 15:39:37 +08002029 ret = system_call_v("%s %s", start_stop_ap_script, "start");
2030 if (ret != 0)
2031 {
2032 RLOGE("lynq_wifi_ap_start excute script fail");
2033 return -1;
2034 }
2035
you.chenb95401e2023-05-12 19:39:06 +08002036 if (inner_check_ap_connected(idx, 0) != 0)
2037 {
2038 return -1;
2039 }
2040
you.chen0df3e7e2023-05-10 15:56:26 +08002041 check_tether_and_notify();
2042
qs.xiong9fbf74e2023-03-28 13:38:22 +08002043 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002044}
2045
qs.xiongf1b525b2022-03-31 00:58:23 -04002046int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002047{
you.chen35020192022-05-06 11:30:57 +08002048 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05002049}
2050
qs.xiongf1b525b2022-03-31 00:58:23 -04002051int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002052{
you.chen35020192022-05-06 11:30:57 +08002053 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04002054
you.chen35020192022-05-06 11:30:57 +08002055 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002056
you.chen35020192022-05-06 11:30:57 +08002057 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002058
you.chen35020192022-05-06 11:30:57 +08002059 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
2060
2061 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
2062
you.chenb4b121c2022-05-06 17:50:16 +08002063// system("connmanctl tether wifi off");
you.chenc9928582023-04-24 15:39:37 +08002064
2065 ret = system_call_v("%s %s", start_stop_ap_script, "stop");
2066 if (ret != 0)
2067 {
2068 RLOGE("lynq_wifi_ap_start excute script fail");
2069 return -1;
2070 }
2071
qs.xiong9fbf74e2023-03-28 13:38:22 +08002072 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002073}
qs.xiong1af5daf2022-03-14 09:12:12 -04002074
qs.xiongf1b525b2022-03-31 00:58:23 -04002075int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002076{
you.chen35020192022-05-06 11:30:57 +08002077 char lynq_disable_cmd[128] = {0};
2078 char lynq_select_cmd[128] = {0};
2079 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08002080 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08002081 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05002082
you.chen35020192022-05-06 11:30:57 +08002083 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08002084 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2085 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2086
2087 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2088 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
2089 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04002090
qs.xiong9fbf74e2023-03-28 13:38:22 +08002091 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002092}
2093
qs.xiongf1b525b2022-03-31 00:58:23 -04002094int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002095{
you.chen35020192022-05-06 11:30:57 +08002096 char lynq_disable_cmd[128] = {0};
2097 char lynq_select_cmd[128] = {0};
2098 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08002099 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08002100 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05002101
you.chen35020192022-05-06 11:30:57 +08002102 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002103
you.chen35020192022-05-06 11:30:57 +08002104 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2105 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2106
2107 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2108 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
2109 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05002110
qs.xiong9fbf74e2023-03-28 13:38:22 +08002111 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002112}
qs.xiongf1b525b2022-03-31 00:58:23 -04002113
you.chen35020192022-05-06 11:30:57 +08002114int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002115{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002116 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08002117 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002118 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08002119 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002120 RLOGD("enter lynq_ap_password_set");
2121 if( password == NULL )
2122 {
2123 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08002124 return -1;
2125 }
2126 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08002127 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002128 if(pass_len < 8 || pass_len >= 64)
2129 {
2130 RLOGE("[lynq_ap_password_set]input password len not in rage");
2131 return -1;
you.chen35020192022-05-06 11:30:57 +08002132 }
qs.xiongf1b525b2022-03-31 00:58:23 -04002133
you.chen35020192022-05-06 11:30:57 +08002134 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002135
qs.xiong9fbf74e2023-03-28 13:38:22 +08002136 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
2137 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002138 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002139 return -1;
2140 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002141 else if (auth == LYNQ_WIFI_AUTH_OPEN)
2142 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002143 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
2144 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08002145 }
2146
you.chen35020192022-05-06 11:30:57 +08002147 CHECK_WPA_CTRL(CTRL_AP);
2148
qs.xiong9fbf74e2023-03-28 13:38:22 +08002149 if (auth == LYNQ_WIFI_AUTH_WEP)
2150 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002151 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002152 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
2153 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
2154 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2155 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
2156 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002157 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2158 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002159 RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA_PSK LYNQ_WIFI_AUTH_WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002160 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
2161 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2162 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002163 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
2164 {
2165
qs.xiongc8d92a62023-03-29 17:36:14 +08002166 RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA2_WPA3 LYNQ_WIFI_AUTH_WPA3_PSK\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002167 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08002168 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002169 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2170 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
2171
2172 }
2173 else
qs.xiongc8d92a62023-03-29 17:36:14 +08002174 {
2175 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002176 return -1;
2177 }
you.chen35020192022-05-06 11:30:57 +08002178
you.chen35020192022-05-06 11:30:57 +08002179 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04002180
qs.xiong9fbf74e2023-03-28 13:38:22 +08002181 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04002182}
2183
you.chen35020192022-05-06 11:30:57 +08002184int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04002185{
you.chen35020192022-05-06 11:30:57 +08002186 FILE * fp;
2187 int len, ret;
2188 int count, index;
2189 char *split_lines[128] = {0};
2190 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002191 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04002192
you.chen35020192022-05-06 11:30:57 +08002193 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002194
you.chen35020192022-05-06 11:30:57 +08002195 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
2196// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002197 if (NULL == fp)
2198 {
2199 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002200 return -1;
2201 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002202
you.chen35020192022-05-06 11:30:57 +08002203 buff = alloca(MAX_RET);
2204 fseek(fp, 0, SEEK_SET);
2205 len = fread(buff, 1, MAX_RET, fp);
2206 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04002207
qs.xiong9fbf74e2023-03-28 13:38:22 +08002208 for(index=0; index < len; index ++)
2209 {
2210 if (memcmp(buff + index, "network={", 9) != 0)
2211 {
you.chen35020192022-05-06 11:30:57 +08002212 continue;
2213 }
2214 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002215 for (; index < len; index ++ )
2216 {
2217 if (buff[index] != '}')
2218 {
you.chen35020192022-05-06 11:30:57 +08002219 continue;
2220 }
2221 buff[index] = '\0';
2222 break;
2223 }
2224 len = buff + index - p;
2225 }
2226
2227 count = lynq_split(p, len, '\n', split_lines);
2228
2229 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002230 for(index=0; index < count; index++)
2231 {
you.chen35020192022-05-06 11:30:57 +08002232 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002233 if (p != NULL)
2234 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002235 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002236 if (*p == '\"')
2237 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002238 p++;
2239 }
you.chen35020192022-05-06 11:30:57 +08002240 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002241 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2242 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002243 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002244 if (*p == '\"')
2245 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002246 p++;
2247 }
2248 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002249 else
2250 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002251 continue;
you.chen35020192022-05-06 11:30:57 +08002252 }
2253
2254 strcpy(password, p);
2255
qs.xiong9fbf74e2023-03-28 13:38:22 +08002256 while(*password != '\0')
2257 {
2258 if (*password == '\"')
2259 {
you.chen35020192022-05-06 11:30:57 +08002260 *password = '\0';
2261 break;
2262 }
2263 password++;
2264 }
2265 ret = 0;
2266 break;
2267 } //end for(index=0; index < count; index++)
2268
2269 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002270}
2271
you.chen35020192022-05-06 11:30:57 +08002272static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
2273 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08002274 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002275
qs.xiong9fbf74e2023-03-28 13:38:22 +08002276 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
2277 {
you.chen35020192022-05-06 11:30:57 +08002278 return -1;
2279 }
2280
2281 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08002282
qs.xiong9fbf74e2023-03-28 13:38:22 +08002283 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
2284 {
2285 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
you.chen70f377f2023-04-14 18:17:09 +08002286 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002287 if (strcmp(lynq_proto_str, "RSN") == 0)
you.chen70f377f2023-04-14 18:17:09 +08002288 {
you.chena6cd55a2022-05-08 12:20:18 +08002289 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002290 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08002291 }
you.chen70f377f2023-04-14 18:17:09 +08002292 else if (strcmp(lynq_proto_str, "WPA") == 0) // need compare when wpa3 supported
2293 {
2294 return 0;
2295 }
you.chena6cd55a2022-05-08 12:20:18 +08002296 }
2297 }
you.chen70f377f2023-04-14 18:17:09 +08002298 else if (*auth == LYNQ_WIFI_AUTH_OPEN || *auth == LYNQ_WIFI_AUTH_WEP)
2299 {
2300 return 0;
2301 }
2302
qs.xiong9fbf74e2023-03-28 13:38:22 +08002303 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
2304 {
you.chen70f377f2023-04-14 18:17:09 +08002305 RLOGE("check ieee80211w error\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002306 return -1;
2307 }
2308 if ( strncmp(lynq_auth_str,"1",1) == 0 )
2309 {
2310
you.chen70f377f2023-04-14 18:17:09 +08002311 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
2312 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002313 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
2314 {
2315
2316 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002317 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002318 }else
2319 {
you.chen70f377f2023-04-14 18:17:09 +08002320 RLOGE("check ieee80211w error, not 1 or 2\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002321 *auth = -1;
2322 return -1;
2323 }
you.chen35020192022-05-06 11:30:57 +08002324 return 0;
2325}
2326
2327int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002328{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002329 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002330 int pass_len, net_no, count, index;
2331 char lynq_tmp_cmd[300]={0};
2332 int net_no_list[128];
2333 lynq_wifi_auth_s net_auth;
2334 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002335 if(pass_len < 8 || pass_len >= 64)
2336 {
2337 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08002338 return -1;
2339 }
2340
2341 CHECK_IDX(idx, CTRL_STA);
2342
2343 net_no = -1;
2344 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
2345
qs.xiong9fbf74e2023-03-28 13:38:22 +08002346 for (index=0; index < count; index++)
2347 {
you.chen35020192022-05-06 11:30:57 +08002348 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002349 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
2350 {
you.chen35020192022-05-06 11:30:57 +08002351 net_no = net_no_list[index];
2352 break;
2353 }
2354 }
2355
qs.xiong9fbf74e2023-03-28 13:38:22 +08002356 if (net_no < 0)
2357 {
you.chen35020192022-05-06 11:30:57 +08002358 return -1;
2359 }
2360
2361 CHECK_WPA_CTRL(CTRL_STA);
2362
2363 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
2364
2365 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2366 DO_OK_FAIL_REQUEST(cmd_save_config);
2367
2368 return 0;
2369}
2370
2371int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
2372
2373 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08002374 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08002375 int count, index;
2376 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08002377 char *buff, *p, *ssid, *ssid_end_flag;
2378 char tmp_ssid[128]={0};
you.chen6d247052023-06-01 16:39:54 +08002379 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08002380
you.chen755332b2022-08-06 16:59:10 +08002381 network_len = 0;
2382 p = NULL;
you.chen6d247052023-06-01 16:39:54 +08002383 buff = NULL;
you.chen755332b2022-08-06 16:59:10 +08002384
you.chen35020192022-05-06 11:30:57 +08002385 CHECK_IDX(idx, CTRL_STA);
2386
qs.xiong9fbf74e2023-03-28 13:38:22 +08002387 if (NULL == password)
2388 {
2389 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08002390 return -1;
2391 }
2392
you.chen35020192022-05-06 11:30:57 +08002393 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002394 if (NULL == fp)
2395 {
2396 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002397 return -1;
2398 }
2399
you.chen6d247052023-06-01 16:39:54 +08002400 fseek(fp, 0, SEEK_END);
2401 len = ftell(fp);
2402 buff = malloc(len + 1);
2403
2404 if (buff == NULL)
2405 {
2406 RLOGE("[lynq_sta_ssid_password_get] malloc memory [%d] fail\n", len);
2407 return -1;
2408 }
2409
you.chen35020192022-05-06 11:30:57 +08002410 fseek(fp, 0, SEEK_SET);
you.chen6d247052023-06-01 16:39:54 +08002411 len = fread(buff, 1, len, fp);
you.chen35020192022-05-06 11:30:57 +08002412 fclose(fp);
2413
qs.xiong9fbf74e2023-03-28 13:38:22 +08002414 for(index=0; index < len; index ++)
2415 {
2416 for(; index < len; index ++)
you.chen6d247052023-06-01 16:39:54 +08002417 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002418 if (memcmp(buff + index, "network={", 9) != 0)
you.chen6d247052023-06-01 16:39:54 +08002419 {
you.chen35020192022-05-06 11:30:57 +08002420 continue;
2421 }
you.chen6d247052023-06-01 16:39:54 +08002422 p = buff + index + 9;
2423 for (; index < len; index ++ )
2424 {
2425 if (buff[index] != '}')
2426 {
2427 continue;
2428 }
2429 buff[index] = '\0';
2430 break;
2431 }
2432 network_len = buff + index - p;
2433 break;
you.chen35020192022-05-06 11:30:57 +08002434 }
2435
qs.xiongb3f26af2023-02-17 18:41:07 +08002436 if (p == NULL)
you.chen6d247052023-06-01 16:39:54 +08002437 {
2438 if (buff != NULL)
2439 {
2440 free(buff);
2441 }
2442
qs.xiongb3f26af2023-02-17 18:41:07 +08002443 return -1;
you.chen6d247052023-06-01 16:39:54 +08002444 }
qs.xiongb3f26af2023-02-17 18:41:07 +08002445
you.chend2fef3f2023-02-13 10:50:35 +08002446 ssid = strstr(p, "ssid=");
2447 if (ssid != NULL) {
2448 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002449 if (ssid[0] == '\"')
you.chen6d247052023-06-01 16:39:54 +08002450 {
you.chend2fef3f2023-02-13 10:50:35 +08002451 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2452 break;
2453 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002454 else
you.chen6d247052023-06-01 16:39:54 +08002455 {
you.chend2fef3f2023-02-13 10:50:35 +08002456 ssid_end_flag = strstr(ssid, "\n");
2457 if (ssid_end_flag != NULL)
2458 {
2459 ssid_len = (ssid_end_flag - ssid) / 2;
2460 for(i=0; i<ssid_len; i++)
2461 {
2462 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2463 }
2464 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2465 break;
2466 }
2467 }
you.chen35020192022-05-06 11:30:57 +08002468 }
you.chend2fef3f2023-02-13 10:50:35 +08002469
you.chen35020192022-05-06 11:30:57 +08002470 }
2471
qs.xiong9fbf74e2023-03-28 13:38:22 +08002472 if (index >= len || NULL == p || network_len <= 0)
2473 {
you.chen6d247052023-06-01 16:39:54 +08002474 if (buff != NULL)
2475 {
2476 free(buff);
2477 }
you.chen35020192022-05-06 11:30:57 +08002478 return -1;
2479 }
2480
you.chen755332b2022-08-06 16:59:10 +08002481 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08002482
2483 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002484 for(index=0; index < count; index++)
2485 {
you.chen35020192022-05-06 11:30:57 +08002486 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002487 if (p != NULL)
you.chen6d247052023-06-01 16:39:54 +08002488 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002489 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002490 if (*p == '\"')
you.chen6d247052023-06-01 16:39:54 +08002491 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002492 p++;
2493 }
you.chen35020192022-05-06 11:30:57 +08002494 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002495 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
you.chen6d247052023-06-01 16:39:54 +08002496 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002497 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002498 if (*p == '\"')
you.chen6d247052023-06-01 16:39:54 +08002499 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002500 p++;
2501 }
2502 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002503 else
you.chen6d247052023-06-01 16:39:54 +08002504 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002505 continue;
you.chen35020192022-05-06 11:30:57 +08002506 }
2507
qs.xiong13673462023-02-21 19:12:54 +08002508 if (*p == '\"')
2509 p++;
2510 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08002511
qs.xiong13673462023-02-21 19:12:54 +08002512 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002513 while(password - p < 64 && *password != '\0')
you.chen6d247052023-06-01 16:39:54 +08002514 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002515 if (*password == '\"')
you.chen6d247052023-06-01 16:39:54 +08002516 {
you.chen35020192022-05-06 11:30:57 +08002517 *password = '\0';
2518 break;
2519 }
2520 password++;
2521 }
2522 ret = 0;
2523 break;
2524 } //end for(index=0; index < count; index++)
2525
you.chen6d247052023-06-01 16:39:54 +08002526 if (buff != NULL)
2527 {
2528 free(buff);
2529 }
2530
you.chen35020192022-05-06 11:30:57 +08002531 return ret;
2532}
2533
2534static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2535{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002536 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04002537
qs.xiong9fbf74e2023-03-28 13:38:22 +08002538 if (sta_ssid == NULL)
2539 {
2540 RLOGE("sta_ssid is null\n");
2541 return -1;
you.chen35020192022-05-06 11:30:57 +08002542 }
2543
qs.xiong9fbf74e2023-03-28 13:38:22 +08002544 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002545
2546 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2547
2548 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2549// DO_OK_FAIL_REQUEST(cmd_save_config);
2550
qs.xiong9fbf74e2023-03-28 13:38:22 +08002551 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002552
2553}
2554
you.chen35020192022-05-06 11:30:57 +08002555static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05002556{
you.chen35020192022-05-06 11:30:57 +08002557 char lynq_disable_cmd[128]={0};
2558 char lynq_select_cmd[128]={0};
2559
2560 CHECK_WPA_CTRL(CTRL_STA);
2561
qs.xiong9fbf74e2023-03-28 13:38:22 +08002562 if (save != 0)
2563 {
you.chenc29444e2022-06-07 18:01:16 +08002564 if (start_flag != 0)
2565 {
2566 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2567 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2568 }
2569 else
2570 {
2571 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2572 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2573 }
you.chen35020192022-05-06 11:30:57 +08002574 DO_OK_FAIL_REQUEST(cmd_save_config);
2575 }
2576
qs.xiong9fbf74e2023-03-28 13:38:22 +08002577 if (start_flag == 0)
2578 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002579 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002580 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2581 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002582 else
2583 {
you.chen35020192022-05-06 11:30:57 +08002584 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2585 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2586 }
2587
2588 return 0;
2589}
2590
2591int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2592{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002593 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002594 CHECK_IDX(idx, CTRL_STA);
2595
you.chen6c2dd9c2022-05-16 17:55:28 +08002596 curr_status_info curr_state;
2597 ap_info_s ap_info;
2598 curr_state.ap = &ap_info;
2599 curr_state.state = NULL;
2600
qs.xiong9fbf74e2023-03-28 13:38:22 +08002601 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2602 {
you.chend2fef3f2023-02-13 10:50:35 +08002603 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002604 return 0;
2605 }
2606
2607 return -1;
you.chen35020192022-05-06 11:30:57 +08002608}
2609
2610int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2611{
you.chen9ac66392022-08-06 17:01:16 +08002612 scan_info_s *scan_list = NULL;
2613 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002614 int scan_len=0;
2615 int save_len=0;
2616 int best_index = -1;
2617 int best_scan_index = -1;
2618 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002619 int i, j, ret;
2620
2621 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002622
2623 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002624 if (info == NULL)
2625 {
you.chen35020192022-05-06 11:30:57 +08002626 return -1;
2627 }
2628
2629 curr_status_info curr_state;
2630 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002631 char status[64];
you.chen35020192022-05-06 11:30:57 +08002632
you.chen9ac66392022-08-06 17:01:16 +08002633 memset(&ap_info, 0, sizeof (ap_info));
2634 memset(status, 0, sizeof (status));
2635
2636 curr_state.ap = &ap_info;
2637 curr_state.state = status;
2638
qs.xiong9fbf74e2023-03-28 13:38:22 +08002639 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2640 {
you.chen35020192022-05-06 11:30:57 +08002641 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002642 if (strcmp(status, STATE_COMPLETED) == 0)
2643 {
2644 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2645 }
2646 else
2647 {
2648 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2649 }
you.chen593621d2023-04-27 17:52:44 +08002650 lynq_get_connect_ap_ip(idx, info->base_info.ap_ip);
you.chen35020192022-05-06 11:30:57 +08002651 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002652 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002653 return 0;
2654 }
2655
you.chen9ac66392022-08-06 17:01:16 +08002656 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002657 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002658 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2659 {
you.chen9ac66392022-08-06 17:01:16 +08002660 if (NULL != scan_list)
2661 {
2662 free(scan_list);
2663 }
you.chen35020192022-05-06 11:30:57 +08002664 return -1;
2665 }
2666
qs.xiong9fbf74e2023-03-28 13:38:22 +08002667 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2668 {
you.chen9ac66392022-08-06 17:01:16 +08002669 if (NULL != scan_list)
2670 {
2671 free(scan_list);
2672 }
2673 if (NULL != save_list)
2674 {
2675 free(save_list);
2676 }
you.chen35020192022-05-06 11:30:57 +08002677 return -1;
2678 }
2679
qs.xiong9fbf74e2023-03-28 13:38:22 +08002680 for (i=0; i < save_len; i++)
2681 {
2682 for (j=0; j < scan_len; j++)
2683 {
you.chen35020192022-05-06 11:30:57 +08002684 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002685 && save_list[i].base_info.auth == scan_list[j].auth)
2686 {
2687 if (best_rssi == 0)
2688 {
you.chen9ac66392022-08-06 17:01:16 +08002689 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002690 best_rssi = scan_list[j].rssi;
2691 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002692 else if (best_rssi > scan_list[j].rssi)
2693 {
you.chen35020192022-05-06 11:30:57 +08002694 best_index = i;
2695 best_scan_index = j;
2696 best_rssi = scan_list[j].rssi;
2697 }
you.chend2fef3f2023-02-13 10:50:35 +08002698 strncpy(save_list[i].base_info.ap_mac, scan_list[j].mac, sizeof (save_list[i].base_info.ap_mac));
you.chen35020192022-05-06 11:30:57 +08002699 break;
2700 }
2701 }
2702 }
2703
qs.xiong9fbf74e2023-03-28 13:38:22 +08002704 if (best_index >= 0)
2705 {
you.chen35020192022-05-06 11:30:57 +08002706 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002707 inner_get_ip_by_mac( info->base_info.ap_mac, info->base_info.ap_ip, sizeof (info->base_info.ap_ip));
you.chen35020192022-05-06 11:30:57 +08002708 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2709 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002710 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002711 }
2712
you.chen9ac66392022-08-06 17:01:16 +08002713 if (NULL != scan_list)
2714 {
2715 free(scan_list);
2716 }
2717 if (NULL != save_list)
2718 {
2719 free(save_list);
2720 }
2721
2722 return ret;
you.chen35020192022-05-06 11:30:57 +08002723}
2724
2725static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2726{
qs.xiongc8d92a62023-03-29 17:36:14 +08002727 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002728 char lynq_ket_mgmt_cmd[64]={0};
2729 char lynq_pairwise_cmd[64]={0};
2730 char lynq_psk_cmd[64]={0};
2731
2732 CHECK_WPA_CTRL(CTRL_STA);
2733
qs.xiong9fbf74e2023-03-28 13:38:22 +08002734 switch(auth)
2735 {
2736 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002737 {
2738 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002739
you.chen35020192022-05-06 11:30:57 +08002740 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002741// DO_OK_FAIL_REQUEST(cmd_save_config);
2742 break;
2743 }
2744 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002745 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002746 {
2747 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2748 {
you.chen35020192022-05-06 11:30:57 +08002749 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2750 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002751 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2752 {
you.chena6cd55a2022-05-08 12:20:18 +08002753 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002754 }
2755 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2756 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002757
you.chen35020192022-05-06 11:30:57 +08002758 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2759 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2760 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002761
qs.xiong9fbf74e2023-03-28 13:38:22 +08002762 if (password != NULL)
2763 {
you.chen35020192022-05-06 11:30:57 +08002764 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2765 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002766 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002767 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002768
you.chen35020192022-05-06 11:30:57 +08002769// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002770 break;
2771 }
2772 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2773 {
qs.xiong3e506812023-04-06 11:08:48 +08002774 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002775 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002776 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2777 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2778
qs.xiong3e506812023-04-06 11:08:48 +08002779 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002780 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2781 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2782 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2783
2784 break;
2785 }
2786 case LYNQ_WIFI_AUTH_WPA3_PSK:
2787 {
qs.xiong3e506812023-04-06 11:08:48 +08002788 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiong03556d52023-04-17 09:45:19 +08002789 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002790 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2791 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2792
qs.xiong3e506812023-04-06 11:08:48 +08002793 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002794 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2795 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2796 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2797
2798 break;
2799 }
2800 default:
2801 return -1;
you.chen35020192022-05-06 11:30:57 +08002802 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002803
qs.xiong9fbf74e2023-03-28 13:38:22 +08002804 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002805}
qs.xiong7a105ce2022-03-02 09:43:11 -05002806
you.chen35020192022-05-06 11:30:57 +08002807static int inner_get_curr_net_no(int interface) {
2808 curr_status_info curr_state;
2809 curr_state.ap = NULL;
2810 curr_state.state = NULL;
2811
qs.xiong9fbf74e2023-03-28 13:38:22 +08002812 if (0 != inner_get_status_info(interface, &curr_state))
2813 {
you.chen35020192022-05-06 11:30:57 +08002814 return -1;
2815 }
2816
2817 return curr_state.net_no;
2818}
2819
2820int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002821{
you.chen35020192022-05-06 11:30:57 +08002822 int net_no;
2823 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002824
you.chen35020192022-05-06 11:30:57 +08002825 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002826
qs.xiong9fbf74e2023-03-28 13:38:22 +08002827 if (net_no < 0)
2828 {
you.chen35020192022-05-06 11:30:57 +08002829 return -1;
2830 }
2831
2832 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002833}
2834
you.chenb95401e2023-05-12 19:39:06 +08002835int lynq_wifi_sta_connect_timeout(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw, int timeout)
qs.xiong7a105ce2022-03-02 09:43:11 -05002836{
you.chen35020192022-05-06 11:30:57 +08002837 int count, net_no, index;
2838 int net_no_list[128];
qs.xiongf71b53b2023-05-03 13:12:07 +08002839 char rm_net_cmd[128];
you.chen35020192022-05-06 11:30:57 +08002840 lynq_wifi_auth_s net_auth;
you.chen70f377f2023-04-14 18:17:09 +08002841 curr_status_info curr_state;
2842 ap_info_s ap_info;
2843 char status[64];
qs.xiongf1b525b2022-03-31 00:58:23 -04002844
qs.xiong9fbf74e2023-03-28 13:38:22 +08002845 if (ssid == NULL || *ssid == '\0')
2846 {
2847 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002848 return -1;
2849 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002850
qs.xiong9fbf74e2023-03-28 13:38:22 +08002851 if (LYNQ_WIFI_AUTH_OPEN != auth)
2852 {
2853 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
you.chen70f377f2023-04-14 18:17:09 +08002854 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002855 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002856 return -1;
2857 }
2858 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002859
you.chen70f377f2023-04-14 18:17:09 +08002860
2861 pthread_mutex_lock(&s_global_check_mutex);
2862 if (s_sta_status != INNER_STA_STATUS_INIT)
2863 {
2864 s_sta_status = INNER_STA_STATUS_CANCEL;
2865 pthread_cond_signal(&s_global_check_cond);
2866 }
2867 pthread_mutex_unlock(&s_global_check_mutex);
2868
you.chen35020192022-05-06 11:30:57 +08002869 CHECK_IDX(idx, CTRL_STA);
you.chen70f377f2023-04-14 18:17:09 +08002870 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002871
2872 net_no = -1;
you.chen70f377f2023-04-14 18:17:09 +08002873 memset(&ap_info, 0, sizeof (ap_info));
2874 memset(status, 0, sizeof (status));
you.chen35020192022-05-06 11:30:57 +08002875
you.chen70f377f2023-04-14 18:17:09 +08002876 curr_state.ap = &ap_info;
2877 curr_state.state = status;
2878
2879 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002880 {
you.chen70f377f2023-04-14 18:17:09 +08002881 if (strcmp(status, STATE_COMPLETED) == 0 && strcmp(ap_info.ap_ssid, ssid) ==0 && ap_info.auth == auth)
2882 {
2883 net_no = curr_state.net_no;
2884 if (0 == lynq_sta_ssid_password_get(idx, &ap_info, ap_info.psw)
2885 && strcmp(ap_info.psw, psw) == 0)
2886 {
2887 RLOGD("already connected\n");
2888
2889 pthread_mutex_lock(&s_global_check_mutex);
2890 s_sta_status = INNER_STA_STATUS_CONNECTED;
2891 pthread_cond_signal(&s_global_check_cond);
2892 pthread_mutex_unlock(&s_global_check_mutex);
2893 return 0;
2894 }
you.chen35020192022-05-06 11:30:57 +08002895 }
2896 }
2897
you.chen70f377f2023-04-14 18:17:09 +08002898 if (net_no == -1)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002899 {
you.chen70f377f2023-04-14 18:17:09 +08002900 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2901
2902 for (index=0; index < count; index++)
2903 {
2904 net_auth = -1;
2905 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2906 {
2907 net_no = net_no_list[index];
2908 break;
2909 }
you.chen35020192022-05-06 11:30:57 +08002910 }
2911
you.chen70f377f2023-04-14 18:17:09 +08002912 if (net_no < 0)
2913 {
qs.xiongf71b53b2023-05-03 13:12:07 +08002914 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
2915 for ( index = 0; index < (count - STA_MAX_SAVED_AP_NUM + 1 ) ;index++) //+1 is for add new network
2916 {
2917 sprintf(rm_net_cmd,"REMOVE_NETWORK %d",net_no_list[index]);
2918 RLOGD("call cmd rm_net_cmd: %s;index is %d\n",rm_net_cmd,index);
2919 DO_OK_FAIL_REQUEST(rm_net_cmd);
2920 }
you.chen70f377f2023-04-14 18:17:09 +08002921 net_no = lynq_add_network(CTRL_STA);
2922 if (net_no == -1)
2923 {
2924 return -1;
2925 }
2926
2927 RLOGD("net no is %d\n", net_no);
2928 if (0 != inner_set_sta_ssid(net_no, ssid))
2929 {
2930 return -1;
2931 }
you.chen35020192022-05-06 11:30:57 +08002932 }
2933 }
2934
qs.xiong9fbf74e2023-03-28 13:38:22 +08002935 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2936 {
you.chen35020192022-05-06 11:30:57 +08002937 return -1;
2938 }
2939
you.chen70f377f2023-04-14 18:17:09 +08002940
2941 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen186d3c32023-05-18 14:19:46 +08002942 system("echo \"\" > /tmp/wlan0_dhcpcd_router");
you.chen70f377f2023-04-14 18:17:09 +08002943 usleep(200*1000);
2944
2945 ret = inner_sta_start_stop(net_no, 1, 1);
2946
2947 pthread_mutex_lock(&s_global_check_mutex);
2948 s_sta_status = INNER_STA_STATUS_CONNECTING;
2949 strcpy(s_sta_current_connecting_ssid, ssid);
2950 struct timeval now;
2951 gettimeofday(&now,NULL);
you.chenb95401e2023-05-12 19:39:06 +08002952 s_sta_connect_timeout.tv_sec = now.tv_sec + timeout;
you.chen70f377f2023-04-14 18:17:09 +08002953 s_sta_connect_timeout.tv_nsec = now.tv_usec*1000;
2954 pthread_cond_signal(&s_global_check_cond);
2955 pthread_mutex_unlock(&s_global_check_mutex);
2956 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002957}
2958
you.chenb95401e2023-05-12 19:39:06 +08002959int lynq_wifi_sta_connect(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw)
2960{
2961 return lynq_wifi_sta_connect_timeout(idx, ssid, auth, psw, MAX_CONNNECT_TIME);
2962}
2963
you.chen35020192022-05-06 11:30:57 +08002964int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002965{
you.chen35020192022-05-06 11:30:57 +08002966 ap_info_s ap;
2967 curr_status_info curr_state;
2968 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002969
qs.xiong9fbf74e2023-03-28 13:38:22 +08002970 if (ssid == NULL || *ssid == '\0')
2971 {
2972 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002973 return -1;
2974 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002975
you.chen35020192022-05-06 11:30:57 +08002976 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002977
you.chen35020192022-05-06 11:30:57 +08002978 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002979 curr_state.state = NULL;
2980
qs.xiong9fbf74e2023-03-28 13:38:22 +08002981 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2982 {
you.chen35020192022-05-06 11:30:57 +08002983 return 0;
2984 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002985
qs.xiong9fbf74e2023-03-28 13:38:22 +08002986 if (strcmp(ap.ap_ssid, ssid) != 0)
2987 {
you.chen35020192022-05-06 11:30:57 +08002988 return 0;
2989 }
2990
you.chen70f377f2023-04-14 18:17:09 +08002991 pthread_mutex_lock(&s_global_check_mutex);
2992 s_sta_status = INNER_STA_STATUS_DISCONNECTING;
2993 pthread_mutex_unlock(&s_global_check_mutex);
you.chen35020192022-05-06 11:30:57 +08002994 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002995}
qs.xiong97fa59b2022-04-07 05:41:29 -04002996
you.chena6cd55a2022-05-08 12:20:18 +08002997int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2998{
qs.xiongad2f89d2023-01-18 13:17:41 +08002999// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
3000// const char *lynq_reconnect_cmd = "RECONNECT";
3001 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
3002 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
3003// const char *lynq_first_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 remove_net all";
qs.xiong7a105ce2022-03-02 09:43:11 -05003004
you.chen35020192022-05-06 11:30:57 +08003005 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08003006 CHECK_WPA_CTRL(CTRL_STA);
3007
you.chenc9928582023-04-24 15:39:37 +08003008 ret = system_call_v("%s %s", start_stop_sta_script, "start");
3009 if (ret != 0)
qs.xiongad2f89d2023-01-18 13:17:41 +08003010 {
you.chenc9928582023-04-24 15:39:37 +08003011 RLOGE("lynq_wifi_ap_start excute script fail");
you.chen35020192022-05-06 11:30:57 +08003012 return -1;
3013 }
qs.xiong9c99fa92022-03-15 08:03:26 -04003014
qs.xiongad2f89d2023-01-18 13:17:41 +08003015 system(lynq_enable_sta_cmd);
3016 system(lynq_reconnect_cmd);
3017// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08003018 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05003019}
3020
you.chen6d247052023-06-01 16:39:54 +08003021static int inner_get_status_info_state (int interface, char *state) {
3022 curr_status_info curr_state;
3023 curr_state.ap = NULL;
3024 curr_state.state = state;
3025 return inner_get_status_info(interface, &curr_state);
3026}
you.chen35020192022-05-06 11:30:57 +08003027int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04003028{
qs.xiongad2f89d2023-01-18 13:17:41 +08003029// char lynq_disable_network_cmd[MAX_CMD];
3030// curr_status_info curr_state;
3031// ap_info_s ap_info;
you.chen6d247052023-06-01 16:39:54 +08003032 int i=0;
3033 char state[MAX_CMD];
you.chen35020192022-05-06 11:30:57 +08003034
you.chen6d247052023-06-01 16:39:54 +08003035// const char * lynq_disable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disable_net all";
you.chena6cd55a2022-05-08 12:20:18 +08003036 CHECK_IDX(idx, CTRL_STA);
3037 CHECK_WPA_CTRL(CTRL_STA);
3038
you.chen6d247052023-06-01 16:39:54 +08003039// system(lynq_disable_sta_cmd);
3040 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chena6cd55a2022-05-08 12:20:18 +08003041 DO_OK_FAIL_REQUEST(cmd_save_config);
you.chenc9928582023-04-24 15:39:37 +08003042
3043 ret = system_call_v("%s %s", start_stop_sta_script, "stop");
3044 if (ret != 0)
3045 {
3046 RLOGE("lynq_wifi_ap_start excute script fail");
3047 return -1;
3048 }
3049
you.chen6d247052023-06-01 16:39:54 +08003050 for (i=0; i < 30; i++) // to check if sta is realy stoped
3051 {
3052 if (inner_get_status_info_state(idx, state) != 0)
3053 {
3054 break;
3055 }
3056
3057 if (memcmp(state, STATE_DISCONNECTED, strlen (STATE_DISCONNECTED)) == 0)
3058 {
3059 break;
3060 }
3061 RLOGD("lynq_wifi_ap_start curr state %s", state);
3062 usleep(SLEEP_TIME_ON_IDLE);
3063 }
3064
you.chena6cd55a2022-05-08 12:20:18 +08003065 return 0;
3066// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04003067}
qs.xiong7a105ce2022-03-02 09:43:11 -05003068
you.chen35020192022-05-06 11:30:57 +08003069//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
3070// int i, count;
3071// char *p;
3072// const char * FLAG_SSID = "ssid=";
3073// const char * FLAG_SBSID = "bssid=";
3074// const char * FLAG_KEY_MGMT = "key_mgmt=";
3075// const char * FLAG_FREQ = "freq=";
3076// char lynq_sta_cmd[MAX_CMD];
3077// char *split_lines[128] = {0};
3078
3079// CHECK_WPA_CTRL(CTRL_AP);
3080
3081// sprintf(lynq_sta_cmd, "STA %s", bssid);
3082
3083// DO_REQUEST(lynq_sta_cmd);
3084
3085// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3086
3087// for(i=0; i < count; i++) {
3088// p = strstr(split_lines[i], FLAG_SSID);
3089// if (p != NULL) {
3090// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
3091// continue;
3092// }
3093// }
3094
3095// lynq_get_interface_ip(idx, ap->ap_ip);
3096// lynq_ap_password_set(idx, ap->psw);
3097
3098// return 0;
3099//}
3100
3101static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
3102 curr_status_info curr_state;
3103 curr_state.ap = ap;
3104 curr_state.state = NULL;
3105 return inner_get_status_info(interface, &curr_state);
3106}
3107
3108int lynq_get_ap_device_list(lynq_wifi_index_e idx, ap_info_s **ap, device_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04003109{
you.chend2fef3f2023-02-13 10:50:35 +08003110 int index, line_count;
3111 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08003112 const char *lynq_first_sta_cmd = "STA-FIRST";
3113 char lynq_next_sta_cmd[MAX_CMD];
3114 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08003115 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04003116
you.chen35020192022-05-06 11:30:57 +08003117 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04003118
you.chen35020192022-05-06 11:30:57 +08003119 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04003120
you.chenb95401e2023-05-12 19:39:06 +08003121 // ap_info_s * tmp_ap;
3122 // device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003123 if (ap == NULL || list == NULL || len == NULL)
3124 {
3125 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08003126 return -1;
3127 }
3128
you.chenb95401e2023-05-12 19:39:06 +08003129 // ap = &tmp_ap;
3130 // list = &tmp_list;
you.chen35020192022-05-06 11:30:57 +08003131 *ap = malloc(sizeof (ap_info_s));
you.chenb95401e2023-05-12 19:39:06 +08003132 memset(*ap, 0, sizeof (ap_info_s));
you.chen35020192022-05-06 11:30:57 +08003133
you.chenb95401e2023-05-12 19:39:06 +08003134 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0 || (*ap)->ap_ssid[0] == '\0')
qs.xiong9fbf74e2023-03-28 13:38:22 +08003135 {
you.chenb95401e2023-05-12 19:39:06 +08003136 RLOGE("inner_get_status_info_ap !=0 or ap_ssid is empty\n");
you.chen35020192022-05-06 11:30:57 +08003137 return -1;
3138 }
3139
3140 lynq_get_interface_ip(idx, (*ap)->ap_ip);
3141 lynq_ap_password_get(idx, (*ap)->psw);
3142
you.chen35020192022-05-06 11:30:57 +08003143 DO_REQUEST(lynq_first_sta_cmd);
3144
3145 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003146 while (reply_len > 0)
3147 {
3148 if (memcmp(cmd_reply, "FAIL", 4) == 0)
you.chenb95401e2023-05-12 19:39:06 +08003149 {
you.chen35020192022-05-06 11:30:57 +08003150 break;
3151 }
3152 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3153 bssid[index] = malloc(strlen(split_lines[0]) + 1);
3154 strcpy(bssid[index], split_lines[0]);
3155 index++;
3156 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
3157 reply_len = MAX_RET;
3158 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08003159 ret = local_wpa_ctrl_request(lynq_wpa_ctrl, lynq_next_sta_cmd, strlen(lynq_next_sta_cmd), cmd_reply, &reply_len, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003160 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
you.chenb95401e2023-05-12 19:39:06 +08003161 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003162 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08003163 break;
3164 }
3165 }
3166
3167 *len = index;
3168
3169 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08003170 for (index=0; index < *len; index++)
3171 {
you.chend2fef3f2023-02-13 10:50:35 +08003172 dev_info = &(*list)[index];
3173 memset(dev_info, 0, sizeof(device_info_s));
3174 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
3175 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
3176 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
3177 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08003178 free(bssid[index]);
3179 }
3180
3181 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003182}
3183
you.chen35020192022-05-06 11:30:57 +08003184int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04003185{
you.chen35020192022-05-06 11:30:57 +08003186 int i, count, index, count_words;
3187 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
3188 char *split_lines[128] = {0};
3189 char *split_words[128] = {0};
3190 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04003191
qs.xiong9fbf74e2023-03-28 13:38:22 +08003192 if (list == NULL || len == NULL)
3193 {
you.chen35020192022-05-06 11:30:57 +08003194 return -1;
3195 }
qs.xiong97fa59b2022-04-07 05:41:29 -04003196
you.chen9ac66392022-08-06 17:01:16 +08003197 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
3198 {
3199 usleep(100 * 1000);
3200 }
3201
you.chen35020192022-05-06 11:30:57 +08003202 CHECK_IDX(idx, CTRL_STA);
3203
3204 CHECK_WPA_CTRL(CTRL_STA);
3205
3206 DO_REQUEST(lynq_scan_result_cmd);
3207
3208 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3209 *len = count - 1;
3210 *list = malloc(sizeof (scan_info_s) * *len);
3211
3212 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08003213 for (index=0; index <count_words; index++)
3214 {
3215 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08003216 }
3217
qs.xiong9fbf74e2023-03-28 13:38:22 +08003218 for(index = 1;index < count; index++)
3219 {
3220 RLOGD("---- %s\n",split_lines[index]);
you.chen6ed36a62023-04-27 17:51:56 +08003221 memset(split_words, 0 , sizeof (split_words));
you.chen35020192022-05-06 11:30:57 +08003222 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
3223 if (count_words < 4)
3224 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003225 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08003226 //bssid / frequency / signal level / flags / ssid
3227 p = (*list) + index - 1;
3228 strcpy(p->mac, split_words[0]);
3229 p->band = convert_band_from_freq(atoi(split_words[1]));
3230 p->rssi = -1 * atoi( split_words[2]);
3231 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chen6ed36a62023-04-27 17:51:56 +08003232 if (count_words == 4) // ssid hided
3233 {
3234 p->ssid[0] = '\0';
3235 }
3236 else
3237 {
3238 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
3239 }
you.chen35020192022-05-06 11:30:57 +08003240 }
3241
3242 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003243}
qs.xiong97fa59b2022-04-07 05:41:29 -04003244
you.chen35020192022-05-06 11:30:57 +08003245int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
3246{
3247 int count, net_no, index;
3248 int net_no_list[128];
3249 lynq_wifi_auth_s net_auth;
3250 char lynq_remove_cmd[MAX_CMD];
3251
qs.xiong9fbf74e2023-03-28 13:38:22 +08003252 if (ssid == NULL || *ssid == '\0')
3253 {
3254 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08003255 return -1;
3256 }
3257
3258 CHECK_IDX(idx, CTRL_STA);
3259
3260 CHECK_WPA_CTRL(CTRL_STA);
3261
3262 net_no = -1;
3263 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
3264
qs.xiong9fbf74e2023-03-28 13:38:22 +08003265 for (index=0; index < count; index++)
3266 {
you.chen35020192022-05-06 11:30:57 +08003267 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003268 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
3269 {
you.chen35020192022-05-06 11:30:57 +08003270 net_no = net_no_list[index];
3271 break;
3272 }
3273 }
3274
qs.xiong9fbf74e2023-03-28 13:38:22 +08003275 if (net_no < 0)
3276 {
you.chen35020192022-05-06 11:30:57 +08003277 return 0;
3278 }
3279
3280 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
3281
3282 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
3283 DO_OK_FAIL_REQUEST(cmd_save_config);
3284
3285 return 0;
3286}
3287
3288int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003289{
you.chend2fef3f2023-02-13 10:50:35 +08003290 int count, index;
you.chen35020192022-05-06 11:30:57 +08003291 int net_no_list[128];
3292 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003293 RLOGD("enter lynq_get_sta_saved_ap api\n");
3294 if (list == NULL || len == NULL)
3295 {
3296 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08003297 return -1;
3298 }
3299
3300 CHECK_IDX(idx, CTRL_STA);
3301
3302// CHECK_WPA_CTRL(CTRL_STA);
3303
3304 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003305 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08003306
you.chen057aac42023-04-13 14:06:58 +08003307 if (count < 0)
3308 {
3309 RLOGE("list network fail");
3310 return count;
3311 }
3312 else if (count == 0)
3313 {
3314 *list = NULL;
3315 *len = 0;
3316 return 0;
3317 }
3318
you.chen35020192022-05-06 11:30:57 +08003319 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08003320 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08003321 *len = count;
3322
qs.xiong9fbf74e2023-03-28 13:38:22 +08003323 for (index=0; index < count; index++)
3324 {
you.chen35020192022-05-06 11:30:57 +08003325 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
you.chen35020192022-05-06 11:30:57 +08003326 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
you.chen35020192022-05-06 11:30:57 +08003327 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003328 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
you.chen057aac42023-04-13 14:06:58 +08003329 {
you.chen35020192022-05-06 11:30:57 +08003330 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
3331 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003332 else
you.chen057aac42023-04-13 14:06:58 +08003333 {
you.chen35020192022-05-06 11:30:57 +08003334 (*list)[index].base_info.band = -1;
3335 }
you.chen057aac42023-04-13 14:06:58 +08003336 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08003337 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08003338 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003339 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08003340 return 0;
3341}
3342
3343int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
3344{
qs.xiongc8d92a62023-03-29 17:36:14 +08003345 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08003346 const char *lynq_scan_cmd = "SCAN";
3347
3348 CHECK_IDX(idx, CTRL_STA);
3349
3350 CHECK_WPA_CTRL(CTRL_STA);
3351
you.chen0df3e7e2023-05-10 15:56:26 +08003352 if (g_sta_scan_finish_flag == 1 && s_sta_status == INNER_STA_STATUS_INIT) // temp add
3353 {
3354 RLOGD("tmp clear scanlist");
3355 system(clean_last_re);
3356 }
you.chen9ac66392022-08-06 17:01:16 +08003357 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08003358 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003359 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
3360 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003361 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003362 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
3363 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003364 g_sta_scan_finish_flag = 1;
3365 return -1;
3366 }
you.chen35020192022-05-06 11:30:57 +08003367
3368 return 0;
3369}
3370
3371int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003372 if (cb == NULL)
3373 {
3374 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003375 return -1;
3376 }
3377
you.chen6d247052023-06-01 16:39:54 +08003378 pthread_mutex_lock(&s_ap_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003379 g_ap_callback_priv = priv;
3380 g_ap_callback_func = cb;
you.chen6d247052023-06-01 16:39:54 +08003381 pthread_mutex_unlock(&s_ap_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003382
you.chen6d247052023-06-01 16:39:54 +08003383 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chene9d00032023-04-24 13:55:29 +08003384 if (g_ap_watcher_pid == 0 )
3385 {
3386 if(pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL) < 0)
3387 {
3388 g_ap_watcher_pid = 0;
3389 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3390 RLOGE("[wifi error]creat APWatcherThreadProc fail");
3391 return -1;
3392 }
3393 }
3394
3395 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3396 RLOGD("creat APWatcherTheradProc susccs");
3397
you.chen35020192022-05-06 11:30:57 +08003398 return 0;
3399}
3400
3401int lynq_unreg_ap_event_callback(void * priv) {
you.chen6d247052023-06-01 16:39:54 +08003402 pthread_mutex_lock(&s_ap_callback_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003403 if (g_ap_callback_priv == priv)
3404 {
you.chen35020192022-05-06 11:30:57 +08003405 g_ap_callback_func = NULL;
3406 g_ap_callback_priv = NULL;
you.chen6d247052023-06-01 16:39:54 +08003407 pthread_mutex_unlock(&s_ap_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003408 return 0;
3409 }
you.chen6d247052023-06-01 16:39:54 +08003410 pthread_mutex_unlock(&s_ap_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003411 return -1;
3412}
3413
3414int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08003415 if (cb == NULL)
3416 {
3417 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003418 return -1;
3419 }
3420
you.chen6d247052023-06-01 16:39:54 +08003421 pthread_mutex_lock(&s_sta_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003422 g_sta_callback_priv = priv;
3423 g_sta_callback_func = cb;
you.chen6d247052023-06-01 16:39:54 +08003424 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003425
you.chen6d247052023-06-01 16:39:54 +08003426 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chene9d00032023-04-24 13:55:29 +08003427 if (g_sta_watcher_pid == 0 ) {
3428 if(pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL) < 0)
3429 {
3430 g_sta_watcher_pid = 0;
3431 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3432 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
3433 return -1;
3434 }
3435 }
3436
3437 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3438 RLOGD("creat STAWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +08003439 return 0;
3440}
3441
3442int lynq_unreg_sta_event_callback(void * priv) {
you.chen6d247052023-06-01 16:39:54 +08003443 pthread_mutex_lock(&s_sta_callback_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003444 if (g_sta_callback_priv == priv)
3445 {
you.chen35020192022-05-06 11:30:57 +08003446 g_sta_callback_func = NULL;
3447 g_sta_callback_priv = NULL;
you.chen6d247052023-06-01 16:39:54 +08003448 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003449 return 0;
3450 }
you.chen6d247052023-06-01 16:39:54 +08003451 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003452 return -1;
3453}
3454
you.chen35020192022-05-06 11:30:57 +08003455int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
3456{
3457 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003458 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08003459 CHECK_IDX(idx, CTRL_AP);
3460
qs.xiong9fbf74e2023-03-28 13:38:22 +08003461 if (inner_get_status_info_state(CTRL_AP, state) != 0)
3462 {
you.chen35020192022-05-06 11:30:57 +08003463 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3464 return 0;
3465 }
3466
qs.xiong9fbf74e2023-03-28 13:38:22 +08003467 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3468 {
you.chen35020192022-05-06 11:30:57 +08003469 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
3470 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003471 else
3472 {
you.chen35020192022-05-06 11:30:57 +08003473 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3474 }
3475
3476 return 0;
3477}
3478
3479int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
3480 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003481 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08003482 CHECK_IDX(idx, CTRL_STA);
3483
qs.xiong9fbf74e2023-03-28 13:38:22 +08003484 if (inner_get_status_info_state(CTRL_STA, state) != 0)
3485 {
you.chen35020192022-05-06 11:30:57 +08003486 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3487 return 0;
3488 }
3489
qs.xiong9fbf74e2023-03-28 13:38:22 +08003490 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3491 {
you.chen35020192022-05-06 11:30:57 +08003492 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
3493 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003494 else
3495 {
you.chen35020192022-05-06 11:30:57 +08003496 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3497 }
3498
3499 return 0;
3500}
3501
3502int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
3503// CHECK_IDX(idx, CTRL_AP);
3504// int ret = 0;
3505// size_t reply_len = MAX_RET;
3506// char cmd_reply[MAX_RET]={0};
3507// const char * cmd_str = "GET country";
3508// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
3509// do{
3510// if (NULL == s_lynq_wpa_ctrl) {
3511// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
3512// if (NULL == s_lynq_wpa_ctrl ) {
3513// printf("wpa_ctrl_open fail\n");
3514// return -1;
3515// }
3516// }
3517// }while(0);
3518
3519// do {
3520// reply_len = MAX_RET;
3521// cmd_reply[0] = '\0';
3522// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08003523// ret = local_wpa_ctrl_request(s_lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL);
you.chen35020192022-05-06 11:30:57 +08003524// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003525// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08003526// return ret;
3527// }
3528// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08003529// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08003530// }while(0);
3531
3532 FILE *fp;
3533 size_t i = 0;
3534 char lynq_cmd_ret[MAX_RET]={0};
3535
3536// CHECK_IDX(idx, CTRL_AP);
3537
3538 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003539 {
3540 perror("popen error!");
3541 return -1;
3542 }
you.chen35020192022-05-06 11:30:57 +08003543 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
3544 {
3545 perror("fread fail!");
3546 return -1;
3547 }
3548
qs.xiong9fbf74e2023-03-28 13:38:22 +08003549 for(i=0; i < strlen(lynq_cmd_ret); i++)
3550 {
3551 if (lynq_cmd_ret[i] == ' ')
3552 {
you.chen35020192022-05-06 11:30:57 +08003553 lynq_cmd_ret[i] = '\0';
3554 break;
3555 }
3556 }
3557
3558 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003559 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08003560
3561 int ret=pclose(fp);
3562 if(ret==-1)
3563 {
3564 perror("close file faild");
3565 }
3566
3567 return 0;
3568}
3569
you.chen705a7ef2023-06-01 22:06:45 +08003570static int check_and_init_uci_config(char * country_code)
3571{
3572 FILE * fp;
3573 int is_different = 0;
3574 const char * check_uci_cmd ="uci show | grep lynq_wifi_country_code";
3575 const char * create_uci_cmd ="uci set lynq_uci.lynq_wifi_country_code='lynq_wifi_country_code'";
3576 const char * commit_uci_cmd ="uci commit";
3577 char set_country_cmd[MAX_CMD];
3578 char lynq_cmd_ret[MAX_CMD]={0};
xj3df9fd82023-06-01 20:50:02 +08003579
you.chen705a7ef2023-06-01 22:06:45 +08003580 sprintf(set_country_cmd, "uci set lynq_uci.lynq_wifi_country_code.code='%s'",country_code);
qs.xiong62034bf2023-06-01 19:23:13 +08003581
you.chen705a7ef2023-06-01 22:06:45 +08003582 if (0 != system(check_uci_cmd))
qs.xiong62034bf2023-06-01 19:23:13 +08003583 {
you.chen705a7ef2023-06-01 22:06:45 +08003584 if (0 != system(create_uci_cmd))
3585 {
3586 RLOGE("creat_uci_cmd fail");
3587 return -1;
3588 }
3589 is_different = 1;
3590 }
3591
3592 if((fp=popen("uci get lynq_uci.lynq_wifi_country_code.code","r"))==NULL)
3593 {
3594 RLOGE("popen error!");
qs.xiong62034bf2023-06-01 19:23:13 +08003595 return -1;
3596 }
3597
you.chen705a7ef2023-06-01 22:06:45 +08003598 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0 )
qs.xiong62034bf2023-06-01 19:23:13 +08003599 {
you.chen705a7ef2023-06-01 22:06:45 +08003600 RLOGE("fread fail!");
3601 fclose(fp);
3602 return -1;
qs.xiong62034bf2023-06-01 19:23:13 +08003603 }
3604
you.chen705a7ef2023-06-01 22:06:45 +08003605 if ( strncmp(lynq_cmd_ret,country_code,2) != 0 )
3606 {
3607 RLOGE("get country code for uci %s,input cpuntry code is:%s\n",lynq_cmd_ret,country_code);
3608 is_different = 1;
3609 }
3610
3611 fclose(fp);
3612
3613 if (is_different)
3614 {
3615 if ( 0 != system(set_country_cmd))
3616 {
3617 RLOGE("set_country_cmd fail");
3618 return -1;
3619 }
3620 if (0 != system(commit_uci_cmd))
3621 {
3622 RLOGE("commmit fail");
3623 }
3624 }
3625
3626 return is_different;
3627}
3628
3629int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
3630 char check_current_code[10];
3631 const char * support_country[] = {"CN", "EU"};
3632
3633 int ret,is_different, i, cc_count;
3634
3635 if (country_code == NULL || country_code[0] == '\0')
3636 {
3637 RLOGE("bad country code\n");
3638 return -1;
3639 }
3640
3641 cc_count = sizeof (support_country) / sizeof (char*);
3642 for(i=0; i < cc_count; i++)
3643 {
3644 if (strcmp(support_country[i], country_code) == 0)
3645 {
3646 break;
3647 }
3648 }
3649
3650 if (i >= cc_count)
3651 {
3652 RLOGE("unspported country code %s\n", country_code);
3653 return -1;
3654 }
3655
3656 is_different = check_and_init_uci_config(country_code);
3657 if( is_different < 0 )
3658 {
3659 RLOGE("init set uci fail\n");
3660 return -1;
3661 }
3662
3663 ret = lynq_get_country_code(idx,check_current_code);
3664 if( ret == 0 && (is_different == 1 || strcmp(check_current_code, country_code) != 0))
3665 {
3666 ret = lynq_wifi_disable();
3667 if(ret != 0 )
3668 {
3669 RLOGE("berfore set country,find bcmdhd insmod,remod fail\n");
3670 return -1;
3671 }
3672 }
3673
3674 return 0;
you.chen35020192022-05-06 11:30:57 +08003675}
3676
3677int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
3678{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003679 RLOGD("enter lynq_get_connect_ap_mac\n");
3680 if (mac == NULL)
3681 {
3682 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08003683 return -1;
3684 }
3685
3686 CHECK_IDX(idx, CTRL_STA);
3687 ap_info_s ap;
3688 ap.ap_mac[0] = '\0';
3689
qs.xiong9fbf74e2023-03-28 13:38:22 +08003690 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3691 {
you.chen35020192022-05-06 11:30:57 +08003692 return -1;
3693 }
3694 strcpy(mac, ap.ap_mac);
3695
3696 return 0;
3697}
3698
3699int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
3700{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003701 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08003702 struct ifaddrs *ifaddr_header, *ifaddr;
3703 struct in_addr * ifa;
3704 const char * ifaName = "wlan0";
3705 if (ip == NULL)
3706 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003707 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08003708 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003709 }
you.chenf58b3c92022-06-21 16:53:48 +08003710
qs.xiong9fbf74e2023-03-28 13:38:22 +08003711 if (idx == 1)
3712 {
you.chen0df3e7e2023-05-10 15:56:26 +08003713 ifaName = inner_get_ap_interface_name();
3714 if (ifaName == NULL)
3715 {
3716 RLOGE("[lynq_get_interface_ip] ap name get fail");
3717 return -1;
3718 }
you.chen9ac66392022-08-06 17:01:16 +08003719 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003720 else if (idx != 0)
3721 {
you.chen35020192022-05-06 11:30:57 +08003722 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003723 }
you.chen35020192022-05-06 11:30:57 +08003724
you.chen9ac66392022-08-06 17:01:16 +08003725 if (getifaddrs(&ifaddr_header) == -1)
3726 {
you.chen35020192022-05-06 11:30:57 +08003727 perror("getifaddrs");
3728 return -1;
3729 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08003730 }
you.chen35020192022-05-06 11:30:57 +08003731
3732
you.chen9ac66392022-08-06 17:01:16 +08003733 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3734 {
3735 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08003736 continue;
you.chen9ac66392022-08-06 17:01:16 +08003737 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3738 {
3739 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3740 {
3741 // is a valid IP4 Address
3742 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3743 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003744 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08003745 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003746 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08003747 return 0;
3748 }
3749 }
3750 }
qs.xiongc4f007c2023-02-08 18:16:58 +08003751 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003752 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08003753 return -1;
you.chen35020192022-05-06 11:30:57 +08003754}
3755
3756int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3757{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003758 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08003759 int count;
3760 size_t i;
3761 char *split_words[128] = {0};
3762 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3763
3764 CHECK_WPA_CTRL(idx);
3765
3766 DO_REQUEST(lynq_get_mac_cmd);
3767
qs.xiong9fbf74e2023-03-28 13:38:22 +08003768 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3769 {
3770 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08003771 return -1;
3772 }
3773
3774 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3775
qs.xiong9fbf74e2023-03-28 13:38:22 +08003776 if (count < 2)
3777 {
you.chen35020192022-05-06 11:30:57 +08003778 return -1;
3779 }
3780
qs.xiong9fbf74e2023-03-28 13:38:22 +08003781 for (i=0; i < strlen(split_words[1]); i++ )
3782 {
3783 if (split_words[1][i] != ' ')
3784 {
you.chen35020192022-05-06 11:30:57 +08003785 break;
3786 }
3787 }
3788
3789 strcpy(mac, split_words[1] + i);
3790
3791 return 0;
3792}
3793
3794int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3795{
3796// int count;
3797// char *split_words[128] = {0};
3798// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3799
3800// if (rssi == NULL) {
3801// return -1;
3802// }
3803
3804// CHECK_IDX(idx, CTRL_STA);
3805
3806// CHECK_WPA_CTRL(CTRL_STA);
3807
3808// DO_REQUEST(lynq_get_rssi_cmd);
3809
3810// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3811// return -1;
3812// }
3813
3814// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3815
3816// if (count < 2) {
3817// return -1;
3818// }
3819
3820// *rssi = atoi(split_words[1]) * -1;
3821
you.chen35020192022-05-06 11:30:57 +08003822 char lynq_cmd_ret[MAX_RET]={0};
3823
qs.xiongff0ae0f2022-10-11 15:47:14 +08003824/*******change other cmd to get rssi*******
3825 *
3826 *wl rssi ---> wl -i wlan0 rssi
3827 *
3828 ***** change by qs.xiong 20221011*******/
you.chen23c4a5f2023-04-12 16:46:00 +08003829 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiong9fbf74e2023-03-28 13:38:22 +08003830 {
you.chen23c4a5f2023-04-12 16:46:00 +08003831 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen35020192022-05-06 11:30:57 +08003832 return -1;
3833 }
you.chen9f17e4d2022-06-06 17:18:18 +08003834 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003835/****** if got rssi is 0,means sta didn't connected any device****/
3836 if(*rssi == 0)
3837 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003838 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chen23c4a5f2023-04-12 16:46:00 +08003839 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003840 }
you.chen35020192022-05-06 11:30:57 +08003841
3842 return 0;
3843}
3844
3845int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3846{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003847 RLOGD("enter lynq_get_connect_ap_band\n");
3848 if (band == NULL)
3849 {
you.chen35020192022-05-06 11:30:57 +08003850 return -1;
3851 }
3852
3853 CHECK_IDX(idx, CTRL_STA);
3854 ap_info_s ap;
3855 ap.band = -1;
3856
qs.xiong9fbf74e2023-03-28 13:38:22 +08003857 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3858 {
you.chen35020192022-05-06 11:30:57 +08003859 return -1;
3860 }
3861 *band = ap.band;
3862
3863 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003864}
you.chenf58b3c92022-06-21 16:53:48 +08003865
3866int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3867{
you.chenb95401e2023-05-12 19:39:06 +08003868 int ret;
3869 char *p;
qs.xionge4cbf1c2023-02-28 18:22:49 +08003870 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003871
3872 if (ip == NULL)
3873 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003874 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003875 return -1;
3876 }
3877
3878 CHECK_IDX(idx, CTRL_STA);
3879
qs.xionge4cbf1c2023-02-28 18:22:49 +08003880 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003881 {
3882 return -1;
3883 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003884
you.chenb95401e2023-05-12 19:39:06 +08003885 ip[0] = '\0';
3886 ret = inner_get_ip_by_mac(bssid, ip, 32); //better input by user
3887 if (ret != 0)
3888 {
3889 RLOGE("[lynq_get_connect_ap_ip] inner_get_ip_by_mac return fail");
3890 return -1;
3891 }
3892
3893 if (ip[0] == '\0' || strchr(ip, ':') != NULL) //temp change, not ok
3894 {
3895 ip[0] = '\0';
you.chen186d3c32023-05-18 14:19:46 +08003896 ret = exec_cmd("grep \"new_router\" /tmp/wlan0_dhcpcd_router | awk '{print $2}'| tail -1", ip, 32);
you.chenb95401e2023-05-12 19:39:06 +08003897 if (ret != 0)
3898 {
3899 ip[0] = '\0';
3900 return 0;
3901 }
3902 else
3903 {
3904 p = strchr(ip, '\n');
3905 if (p != NULL)
3906 {
3907 *p = '\0';
3908 }
3909 }
3910 }
3911 return 0;
you.chenf58b3c92022-06-21 16:53:48 +08003912}
3913
qs.xiong026c5c72022-10-17 11:15:45 +08003914int lynq_ap_connect_num(int sta_number)
3915{
3916 char lynq_limit_cmd[32]={0};
3917 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003918 if((sta_number < 1 ) && (sta_number > 15))
3919 {
3920 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003921 return -1;
3922 }
3923 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3924 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003925 if(ret != 0)
3926 {
3927 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003928 }
3929 return 0;
3930}
you.chenf58b3c92022-06-21 16:53:48 +08003931
qs.xiong77905552022-10-17 11:19:57 +08003932int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3933{
3934
3935 char lynq_wifi_acs_cmd[128]={0};
3936 char lynq_cmd_mode[128]={0};
3937 char lynq_cmd_slect[128]={0};
3938
qs.xiong9fbf74e2023-03-28 13:38:22 +08003939 if((acs_mode != 2) && (acs_mode != 5))
3940 {
qs.xiong77905552022-10-17 11:19:57 +08003941 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3942 }
3943
qs.xiong9fbf74e2023-03-28 13:38:22 +08003944 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3945 {
qs.xiong77905552022-10-17 11:19:57 +08003946 return -1;
3947 }
3948
3949 CHECK_IDX(idx, CTRL_AP);
3950
3951 CHECK_WPA_CTRL(CTRL_AP);
3952
3953 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3954 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3955 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3956
3957 DO_OK_FAIL_REQUEST(cmd_disconnect);
3958 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3959 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3960 DO_OK_FAIL_REQUEST(cmd_save_config);
3961 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3962
3963 return 0;
3964}
you.chen0f5c6432022-11-07 18:31:14 +08003965//you.chen add for tv-box start
3966static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3967 FILE *fp;
3968 //printf("to exec cmd:%s\n", str_cmd);
3969 if((fp=popen(str_cmd,"r"))==NULL)
3970 {
3971 perror("popen error!");
3972 return -1;
3973 }
3974 if((fread(str_cmd_ret,max_len,1,fp))<0)
3975 {
3976 perror("fread fail!");
3977 fclose(fp);
3978 return -1;
3979 }
3980 fclose(fp);
3981 return 0;
3982}
3983
3984static int get_netmask_length(const char* mask)
3985{
3986 int masklen=0, i=0;
3987 int netmask=0;
3988
3989 if(mask == NULL)
3990 {
3991 return 0;
3992 }
3993
3994 struct in_addr ip_addr;
3995 if( inet_aton(mask, &ip_addr) )
3996 {
3997 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003998 }else
3999 {
you.chen0f5c6432022-11-07 18:31:14 +08004000 netmask = 0;
4001 return 0;
4002 }
4003
4004 while(0 == (netmask & 0x01) && i<32)
4005 {
4006 i++;
4007 netmask = netmask>>1;
4008 }
4009 masklen = 32-i;
4010 return masklen;
4011}
4012
4013static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
4014 int mask_len;
4015 char *p;
4016 char tmp[64] = {0};
you.chenc9928582023-04-24 15:39:37 +08004017 sprintf(tmp, "ifconfig %s | grep Mask", s_ap_iterface_name);
4018 if (exec_cmd(tmp, str_cmd_ret, max_len) != 0)
you.chen0f5c6432022-11-07 18:31:14 +08004019 return -1;
4020 p = strstr(str_cmd_ret, "Mask:");
4021 if (p == NULL)
4022 return -1;
4023 mask_len = get_netmask_length(p + 5);
4024 if (mask_len == 0)
4025 return -1;
4026 p = strstr(str_cmd_ret, "inet addr:");
4027 if (p == NULL)
4028 return -1;
4029 strcpy(tmp, p + 10);
4030 p = strstr(tmp, " ");
4031 if (p != NULL)
4032 *p = '\0';
4033 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
4034 return 0;
4035}
4036
4037static void GBWWatchThreadProc() {
4038 int i,n, nloop, nmax, ncheckcount, nidlecount;
4039 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
4040 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
4041 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
4042 char *results[16] = {0};
4043 char str_cmd[256] = {0};
4044 char str_cmd_ret[128] = {0};
4045 char dest_ip[32] = {0};
4046 lastAP1Bytes = lastAP2Bytes = 0;
4047 lastAP1Drop = lastAP2Drop = 0;
4048 lastAP1Speed = lastAP2Speed = 0;
4049 setAP1Speed = 50;
4050 setAP2Speed = 80;
4051 nloop = 0;
4052 nmax = 6;
4053 ncheckcount = nidlecount = 0;
4054
you.chen0df3e7e2023-05-10 15:56:26 +08004055 if (inner_get_ap_interface_name() == NULL)
you.chenc9928582023-04-24 15:39:37 +08004056 {
4057 RLOGE("------gbw thread run\n");
4058 return;
4059 }
4060
qs.xiong9fbf74e2023-03-28 13:38:22 +08004061 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08004062 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
4063 while (dest_ip[0] == '\0') {
4064 sleep(1);
4065 str_cmd_ret[0] = '\0';
4066 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
4067 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
4068 if (str_cmd_ret[n] == '\n'){
4069 str_cmd_ret[n] = '\0';
4070 break;
4071 }
4072 }
4073 if (str_cmd_ret[0] != '\0')
4074 {
4075 strcpy(dest_ip, str_cmd_ret);
4076 }
4077 }
4078
you.chenc9928582023-04-24 15:39:37 +08004079 system_call_v("tc qdisc del dev %s root > /dev/null 2>&1", s_ap_iterface_name);
4080 system_call_v("tc qdisc add dev %s root handle 1: htb r2q 1", s_ap_iterface_name);
4081 system_call_v("tc class add dev %s parent 1: classid 1:1 htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000", s_ap_iterface_name);
you.chen0f5c6432022-11-07 18:31:14 +08004082 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
4083 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08004084 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08004085 return;
4086 }
you.chenc9928582023-04-24 15:39:37 +08004087 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);
4088 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);
4089 system_call_v("tc filter add dev %s parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", s_ap_iterface_name, dest_ip);
you.chen0f5c6432022-11-07 18:31:14 +08004090
4091 while (1) {
4092 sleep(1);
4093 memset(str_cmd, 0, sizeof(str_cmd));
you.chenc9928582023-04-24 15:39:37 +08004094 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
4095 sprintf(str_cmd, "tc -s class show dev %s classid 1:1 | grep Sent", s_ap_iterface_name);
4096 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen0f5c6432022-11-07 18:31:14 +08004097 continue;
4098 //printf("ap1 --- %s\n", str_cmd);
you.chenc9928582023-04-24 15:39:37 +08004099 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen0f5c6432022-11-07 18:31:14 +08004100 if (n > 9) {
4101 if (strcmp(results[1], "Sent") == 0) {
4102 currAP1Bytes = atoll(results[2]);
4103 }
4104 if (strcmp(results[6], "(dropped") == 0) {
4105 currAP1Drop = atoi(results[7]);
4106 }
4107 }
4108
4109 memset(str_cmd, 0, sizeof(str_cmd));
you.chenc9928582023-04-24 15:39:37 +08004110 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
4111 sprintf(str_cmd, "tc -s class show dev %s classid 1:2 | grep Sent", s_ap_iterface_name);
4112 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen0f5c6432022-11-07 18:31:14 +08004113 continue;
4114 //printf("ap2 --- %s\n", str_cmd);
you.chenc9928582023-04-24 15:39:37 +08004115 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen0f5c6432022-11-07 18:31:14 +08004116 if (n > 9) {
4117 if (strcmp(results[1], "Sent") == 0) {
4118 currAP2Bytes = atoll(results[2]);
4119 }
4120 if (strcmp(results[6], "(dropped") == 0) {
4121 currAP2Drop = atoi(results[7]);
4122 }
4123 }
4124
4125 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
4126 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
4127 lastAP1Bytes = currAP1Bytes;
4128 lastAP2Bytes = currAP2Bytes;
4129 continue;
4130 }
4131
4132 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
4133 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
4134 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
4135 lastAP1Speed = currAP1Speed;
4136 lastAP2Speed = currAP2Speed;
4137 lastAP1Bytes = currAP1Bytes;
4138 lastAP2Bytes = currAP2Bytes;
4139
4140 currSetAP1Speed = setAP1Speed;
4141 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
4142 ncheckcount++;
4143 if (ncheckcount > 3) {
4144 ncheckcount = 0;
4145 currSetAP1Speed = 5;
4146 }
4147 }
4148 else {
4149 ncheckcount = 0;
4150 if (currAP1Speed < 5)
4151 nidlecount++;
4152 else
4153 nidlecount = 0;
4154
4155 }
4156
4157 if (nidlecount > 60 ){
4158 currSetAP1Speed = 50;
4159 }
4160
4161 if (currSetAP1Speed != setAP1Speed) {
4162 setAP1Speed = currSetAP1Speed;
you.chenc9928582023-04-24 15:39:37 +08004163 system_call_v(str_cmd, "tc class replace dev %s parent 1: classid 1:1 htb rate %dMbit ceil %dMbit prio 2 quantum 3000",
4164 s_ap_iterface_name, setAP1Speed, (int)(setAP1Speed*1.4));
you.chen0f5c6432022-11-07 18:31:14 +08004165 }
4166 }
4167}
4168
4169int enableGBW(const char* mac) {
4170 int i,len;
4171 char get_ipaddr_cmd[128]={0};
4172 ap_info_s *ap;
4173 device_info_s * list;
4174
4175 if (mac == NULL || g_gbw_enabled == 1)
4176 return -1;
4177 len = strlen(mac);
4178 g_gbw_mac = malloc(len + 1);
4179 for(i=0;i<len;i++) {
4180 if (mac[i] >= 'A' && mac[i] <= 'Z')
4181 {
4182 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
4183 }
4184 else
4185 g_gbw_mac[i] = mac[i];
4186 }
4187 g_gbw_mac[i] = '\0';
4188 g_gbw_enabled = 1;
4189
4190 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
4191 if (system(get_ipaddr_cmd) == 0) {
4192 //startGBW();
4193 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
4194 for (i=0;i<len;i++) {
4195 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
4196 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
4197 startGBW();
4198 }
4199 free(ap);
4200 free(list);
4201 }
4202 }
4203 return 0;
4204}
4205
4206int disableGBW() {
4207 stopGBW();
4208 free(g_gbw_mac);
4209 g_gbw_mac = NULL;
4210 g_gbw_enabled = 1;
4211 return 0;
4212}
4213
4214static int startGBW() {
4215 if (g_gbw_watcher_pid != 0) {
4216 stopGBW();
4217 }
4218 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
4219}
4220
4221static int stopGBW() {
4222 void* retval;
you.chenc9928582023-04-24 15:39:37 +08004223 char cmd[64] = {0};
you.chen0f5c6432022-11-07 18:31:14 +08004224 pthread_cancel(g_gbw_watcher_pid);
4225 pthread_join(g_gbw_watcher_pid, &retval);
4226 g_gbw_watcher_pid = 0;
you.chenc9928582023-04-24 15:39:37 +08004227 sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
4228 if (s_ap_iterface_name[0] != '\0')
4229 {
4230 sprintf(cmd, "tc qdisc del dev %s root", s_ap_iterface_name);
4231 system(cmd);
4232 }
you.chen0f5c6432022-11-07 18:31:14 +08004233}
4234//you.chen add for tv-box end