blob: b9658b900eded7d9bdfe727c6fed7665882f1f8c [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.xiong455c30b2023-04-12 11:40:02 +0800517void get_state_error(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error)
518{
519 char *pReason;
520 *error = LYNQ_WAIT_CONNECT_ACTIVE;
521 if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
522 {
523 *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
524 RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d\n",*state,*error);
525 return;
526 }
527
528 if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
529 {
530 *state = LYNQ_WIFI_STA_STATUS_CONNECT;
531 RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
532 return;
533 }
534
535 if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
536 {
537 pReason = strstr(modify, "reason=");
538 if (pReason != NULL)
539 {
540 pReason += strlen("reason=");
541 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
542 {
543 *error = LYNQ_TIME_OUT;
544 }
545 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
546 {
547 *error = LYNQ_PSW_ERROR;
548 }
549 else
550 {
551 *error = LYNQ_UNSPECIFIED_REASON;
552 }
553 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
554 RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d\n",*state,*error);
555 return;
556 }
557 else
558 {
559 *error = LYNQ_UNSPECIFIED_REASON;
560 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
561 return;
562 }
563
564 }
565
566 if (strstr(modify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
567 {
568 *error = LYNQ_NOT_FIND_AP;
569 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
570 RLOGD("CTRL-EVENT-NETWORK-NOT-FOUND state:%d,error:%d\n",*state,*error);
571 return;
572 }
573
574
575 if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
576 {
577 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
578 pReason = strstr(modify, "status_code=");
579 if (pReason != NULL)
580 {
581 pReason += strlen("status_code=");
582 if (memcmp(pReason, "17", 2) == 0)
583 {
584 *error = LYNQ_AP_UNABLE_HANDLE;
585 }
586 else if (memcmp(pReason, "1",1) == 0)
587 {
588 *error = LYNQ_UNSPECIFIED_REASON;
589 }
590 else
591 {
592 *error = LYNQ_UNSPECIFIED_REASON;
593 }
594
595 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
596 RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d\n",*state,*error);
597 return;
598 }
599 else
600 {
601 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
602 *error = LYNQ_UNSPECIFIED_REASON;
603 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
604 RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d\n",*state,*error);
605 return;
606 }
607 }
608
609 if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
610 {
611 RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
612 *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
613 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
614 RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d\n",*state,*error);
615 return;
616 }
617
618 if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
619 {
620 RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
621 *error = LYNQ_WAIT_CONNECT_ACTIVE;
622 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
623 RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
624 return;
625 }
626
you.chen32cb31e2023-04-13 14:05:45 +0800627 RLOGD("EVENT : %s\n", modify);
qs.xiong455c30b2023-04-12 11:40:02 +0800628 *error = LYNQ_UNSPECIFIED_REASON;
you.chen32cb31e2023-04-13 14:05:45 +0800629 *state = LYNQ_WIFI_STATUS_EGNORE;
qs.xiong455c30b2023-04-12 11:40:02 +0800630 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
631 return;
632
633}
634
you.chen70f377f2023-04-14 18:17:09 +0800635static void notify_connect_status(lynq_wifi_sta_status_s state, error_number_s error)
636{
you.chen6d247052023-06-01 16:39:54 +0800637 pthread_mutex_lock(&s_sta_callback_mutex);
you.chen70f377f2023-04-14 18:17:09 +0800638 if (g_sta_callback_func != NULL && state != LYNQ_WIFI_STATUS_EGNORE)
639 {
640 RLOGD("STAWatcherThreadProc callback begin ------> %d %d\n", state, error);
641 g_sta_callback_func(g_sta_callback_priv, state, error);
642 RLOGD("STAWatcherThreadProc callback end ------> %d %d\n", state, error);
643 }
you.chen6d247052023-06-01 16:39:54 +0800644 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen70f377f2023-04-14 18:17:09 +0800645}
646
you.chen35020192022-05-06 11:30:57 +0800647static void STAWatcherThreadProc() {
648 size_t len = MAX_RET;
649 char msg_notify[MAX_RET];
you.chen35020192022-05-06 11:30:57 +0800650 error_number_s error;
you.chenc9928582023-04-24 15:39:37 +0800651 lynq_wifi_sta_status_s state, last_state = -1;
you.chenf711c8a2023-04-13 13:49:45 +0800652 int idle_count = 0;
qs.xiongf1b525b2022-03-31 00:58:23 -0400653
you.chen6c2dd9c2022-05-16 17:55:28 +0800654 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800655 g_sta_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800656
you.chen70f377f2023-04-14 18:17:09 +0800657 RLOGD("STAWatcherThreadProc thread started ------");
qs.xiong9fbf74e2023-03-28 13:38:22 +0800658 while (g_sta_watcher_stop_flag == 0)
659 {
you.chenf711c8a2023-04-13 13:49:45 +0800660 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
qs.xiong455c30b2023-04-12 11:40:02 +0800661 {
you.chen35020192022-05-06 11:30:57 +0800662 continue;
663 }
you.chenf711c8a2023-04-13 13:49:45 +0800664
you.chen6c2dd9c2022-05-16 17:55:28 +0800665 memset(msg_notify, 0, MAX_RET);
666 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800667 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiong455c30b2023-04-12 11:40:02 +0800668 {
you.chen35020192022-05-06 11:30:57 +0800669 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800670 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
671 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800672 {
you.chen35020192022-05-06 11:30:57 +0800673 g_sta_scan_finish_flag = 1;
674 }
675
qs.xiong9fbf74e2023-03-28 13:38:22 +0800676 if (g_sta_callback_func == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800677 {
you.chen35020192022-05-06 11:30:57 +0800678 continue;
679 }
qs.xiong455c30b2023-04-12 11:40:02 +0800680 get_state_error(msg_notify,&state,&error);
you.chen70f377f2023-04-14 18:17:09 +0800681 notify_connect_status(state, error);
682
683 if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
you.chen32cb31e2023-04-13 14:05:45 +0800684 {
you.chen70f377f2023-04-14 18:17:09 +0800685 inner_check_connect_error(msg_notify, state, error);
you.chenc9928582023-04-24 15:39:37 +0800686 if (last_state != state)
687 {
688 if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
689 {
690 system_call_v("%s %s", sta_status_change_script, "connect");
691 }
692 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
693 {
694 system_call_v("%s %s", sta_status_change_script, "disconnect");
695 }
696 }
697
698 last_state = state;
you.chen32cb31e2023-04-13 14:05:45 +0800699 }
you.chen35020192022-05-06 11:30:57 +0800700 }
701 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800702 if (lynq_wpa_ctrl != NULL)
703 {
you.chen92fd5d32022-05-25 10:09:47 +0800704 wpa_ctrl_detach(lynq_wpa_ctrl);
705 wpa_ctrl_close(lynq_wpa_ctrl);
706 }
qs.xiongf1b525b2022-03-31 00:58:23 -0400707}
708
you.chen70f377f2023-04-14 18:17:09 +0800709// this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
710static void GlobalWatcherThreadProc()
711{
712 int ret, connect_timeout, service_abnormal;
713 error_number_s error_num = -1;
714 inner_sta_status_s sta_status;
715 scan_info_s *scan_list = NULL;
716 int i, scan_len=0;
717 char connecting_ssid[64];
718 struct timeval now;
719
720 RLOGD("GlobalWatcherThreadProc start to run");
721
722 while (1)
723 {
724 pthread_mutex_lock(&s_global_check_mutex);
725 pthread_cond_wait(&s_global_check_cond,&s_global_check_mutex);
726 if (s_sta_status == INNER_STA_STATUS_CONNECTED)
727 {
728 pthread_mutex_unlock(&s_global_check_mutex);
729 usleep(50*1000);
730 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
731 continue;
732 }
733
734 connect_timeout = 0;
735 service_abnormal = 0;
736 if (s_sta_status >= INNER_STA_STATUS_CONNECTING && s_sta_status < INNER_STA_STATUS_CONNECTED)
737 {
738 while (1)
739 {
740 ret = pthread_cond_timedwait(&s_global_check_cond, &s_global_check_mutex, &s_sta_connect_timeout);
741 if (ret == ETIME)
742 {
743 connect_timeout = 1;
744 }
745 else if (ret != 0)
746 {
747 gettimeofday(&now,NULL);
748 if (now.tv_sec < s_sta_connect_timeout.tv_sec) //time not arrive
749 {
750 usleep(SLEEP_TIME_ON_IDLE);
751 continue;
752 }
753 connect_timeout = 1;
754 }
755 sta_status = s_sta_status;
756 error_num = s_sta_error_number;
757 s_sta_status = INNER_STA_STATUS_INIT;
758 strcpy(connecting_ssid, s_sta_current_connecting_ssid);
759 memset(&s_sta_connect_timeout, 0, sizeof (s_sta_connect_timeout));
760 memset(&s_sta_current_connecting_ssid, 0, sizeof (s_sta_current_connecting_ssid));
761 break;
762 }
763 }
764 if (s_service_invoke_timeout_cnt > 10)
765 {
766 service_abnormal = 1;
767 s_service_invoke_timeout_cnt = 0;
768 }
769 pthread_mutex_unlock(&s_global_check_mutex);
770
771 if (service_abnormal == 1)
772 {
773 sleep(1);
774 RLOGE("wpa service is abnormal info app to exit");
775 notify_connect_status(LYNQ_WIFI_STA_SERVICE_ABNORMAL, -1);
you.chen6d247052023-06-01 16:39:54 +0800776
777 inner_notify_ap_msg(LYNQ_WIFI_SERVICE_ABNORMAL);
778
you.chen70f377f2023-04-14 18:17:09 +0800779 sleep(FAKE_MAX_INT_VALUE); // wait process to exit
780 }
781
782 if (sta_status == INNER_STA_STATUS_CANCEL)
783 {
784 continue;
785 }
786 else if (sta_status == INNER_STA_STATUS_CONNECTED)
787 {
788 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
789 }
790 else if (connect_timeout == 0 && error_num == LYNQ_NOT_FIND_AP) // not found ap maybe mismatch auth
791 {
792 if (0 == lynq_get_scan_list(0, &scan_list, &scan_len) && NULL != scan_list) // if not found, but scan result exist, maybe auth error
793 {
794 for(i=0; i < scan_len;i++)
795 {
796 if (strcmp(scan_list[i].ssid, connecting_ssid) == 0)
797 {
798 error_num = LYNQ_AUTH_ERROR;
799 break;
800 }
801 }
802 free(scan_list);
803 }
804 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
805 }
806 else if (connect_timeout == 0)
807 {
808 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
809 }
810 else // wait timeout
811 {
812 if (0 != lynq_get_sta_status(LYNQ_WIFI_INTERFACE_0, &sta_status)) // get status fail
813 {
814 ; // wpa service abnormal
815 }
816 else if (sta_status == LYNQ_WIFI_STA_STATUS_ENABLE) // connect ok
817 {
818 RLOGD("GlobalWatcherThreadProc notify connected");
819 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
820 }
821 else
822 {
823 RLOGD("GlobalWatcherThreadProc notify timeout");
824 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, LYNQ_TIME_OUT);
825 }
826 }
827 } // while (1)
828}
829
qs.xiong1af5daf2022-03-14 09:12:12 -0400830int lynq_wifi_enable(void)
831{
you.chen35020192022-05-06 11:30:57 +0800832 int ret = 0;
you.chen6c2dd9c2022-05-16 17:55:28 +0800833 int i;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800834 RLOGD("enter lynq_wifi_enable");
you.chend2fef3f2023-02-13 10:50:35 +0800835 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
836
qs.xiong9fbf74e2023-03-28 13:38:22 +0800837 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
838 {
you.chend2fef3f2023-02-13 10:50:35 +0800839 goto out_enable;
840 }
841
you.chenc9928582023-04-24 15:39:37 +0800842 ret = system(start_wg870_service_script);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800843 if (ret != 0)
844 {
845 //printf("service state %d\n", ret);
846 RLOGE("[wifi error]service state %d",ret);
you.chend2fef3f2023-02-13 10:50:35 +0800847 ret = -1;
848 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800849 }
lhfe8da902022-10-11 18:55:36 +0800850
you.chen70f377f2023-04-14 18:17:09 +0800851 if (g_global_watcher_pid == 0 ) // this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
852 {
853 ret=pthread_create(&g_global_watcher_pid,NULL,GlobalWatcherThreadProc,NULL);
854 if(ret<0)
855 {
856 RLOGE("[wifi error]creat GlobalWatcherThreadProc fail");
857 ret = -1;
858 goto out_enable;
859 }
860 }
861
you.chend2fef3f2023-02-13 10:50:35 +0800862 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
863 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
864 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
865 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
866out_enable:
867 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800868 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500869}
870
qs.xiong1af5daf2022-03-14 09:12:12 -0400871int lynq_wifi_disable(void)
872{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800873 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800874 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800875 g_ap_watcher_stop_flag = 1;
876 g_sta_watcher_stop_flag = 1;
877 if (g_ap_watcher_pid != 0)
878 pthread_join(g_ap_watcher_pid, NULL);
879 if (g_sta_watcher_pid != 0)
880 pthread_join(g_sta_watcher_pid, NULL);
881 if (g_lynq_wpa_ctrl[0] != NULL)
882 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
883 if (g_lynq_wpa_ctrl[1] != NULL)
884 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
885 g_ap_watcher_pid = 0;
886 g_sta_watcher_pid = 0;
887 g_lynq_wpa_ctrl[0] = NULL;
888 g_lynq_wpa_ctrl[1] = NULL;
889 system("systemctl stop wg870_drv_insmod.service");
you.chend2fef3f2023-02-13 10:50:35 +0800890 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
891 return 0;
892}
893
894static inline char inner_convert_char(char in)
895{
896 if (in >= '0' && in <= '9')
897 {
898 return in - '0';
899 }
900 else if (in >= 'a' && in <= 'f')
901 {
902 return in - 'a' + 10;
903 }
904 else if (in >= 'A' && in <= 'F')
905 {
906 return in - 'A' + 10;
907 }
908 else
909 {
910 return '\xff';
911 }
912}
913
914static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
915{
916 char *p;
917 size_t pos = 0;
918 if (NULL == out_ssid)
919 return;
920 //printf("input ssid=[%s]\n", ssid);
921 memset(out_ssid, 0, out_ssid_len);
922 if (NULL == ssid)
923 return;
924 p = strchr(ssid, '\\');
925 if (NULL == p)
926 {
927 strncpy(out_ssid, ssid, out_ssid_len);
928 //printf(" first %s\n", out_ssid);
929 }
930 else
931 {
932 pos = p - ssid;
933 memcpy(out_ssid, ssid, pos);
934 //printf("pos %lu -- %s\n", pos, out_ssid);
935 for(; pos < out_ssid_len; pos ++)
936 {
937 if (p[0] == '\0')
938 {
939 //printf(" out %s\n", out_ssid);
940 return;
941 }
942 else if (p[0] != '\\')
943 {
944 out_ssid[pos] = p[0];
945 p += 1;
946 }
947 else if (p[1] == 'x' || p[1] == 'X')
948 {
949 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
950 p += 4;
951 }
952 else if (p[1] == '\\')
953 {
954 out_ssid[pos] = '\\';
955 p += 2;
956 }
957 else if (p[1] == 't')
958 {
959 out_ssid[pos] = '\t';
960 p += 2;
961 }
962 else if (p[1] == 'r')
963 {
964 out_ssid[pos] = '\r';
965 p += 2;
966 }
967 else if (p[1] == 'n')
968 {
969 out_ssid[pos] = '\n';
970 p += 2;
971 }//todo find a better way to convert?
972 }
973 }
974 //printf(" out %s\n", out_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -0500975}
qs.xiong1af5daf2022-03-14 09:12:12 -0400976
you.chen35020192022-05-06 11:30:57 +0800977static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +0800978 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +0800979 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +0800980 RLOGD("enter inner_get_param");
981 if (out_put == NULL)
982 {
983 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +0800984 return -1;
985 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800986 if (param_name == NULL)
987 {
988 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +0800989 return -1;
990 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800991 if (param_name[0] == '\0')
992 {
993 RLOGE("param is empty");
you.chen35020192022-05-06 11:30:57 +0800994 return -1;
995 }
996
997 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
998
999 CHECK_WPA_CTRL(interface);
1000
1001 DO_REQUEST(lynq_cmd_get);
1002
qs.xiong9fbf74e2023-03-28 13:38:22 +08001003 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1004 {
1005 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +08001006 return -1;
1007 }
1008
you.chena6fa5b22022-05-18 10:28:19 +08001009// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +08001010 if (strcmp(param_name, "ssid") == 0)
1011 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001012 if (cmd_reply[0] == '\"')
1013 {
you.chend2fef3f2023-02-13 10:50:35 +08001014 ssid_len = reply_len - 1;
1015 memcpy(out_put, cmd_reply + 1, ssid_len);
1016 if (out_put[ssid_len-1] == '\"')
1017 {
1018 out_put[ssid_len-1] = '\0';
1019 }
1020 else
1021 {
1022 out_put[ssid_len] = '\0';
1023 }
1024 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001025 else
1026 {
you.chend2fef3f2023-02-13 10:50:35 +08001027 ssid_len = reply_len / 2;
1028 for(i=0; i<ssid_len; i++)
1029 {
1030 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
1031 }
1032 out_put[ssid_len] = '\0';
1033 }
1034 }
1035 else
1036 {
1037 memcpy(out_put, cmd_reply, reply_len + 1);
1038 }
you.chen35020192022-05-06 11:30:57 +08001039 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001040}
qs.xiong1af5daf2022-03-14 09:12:12 -04001041
you.chen35020192022-05-06 11:30:57 +08001042static int lynq_split(char * str, int len, char delimiter, char * results[]) {
1043 int ret = 0;
1044 char * end = str + len - 1;
1045 results[ret++] = str;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001046 while(str < end)
1047 {
1048 if (*str == delimiter)
1049 {
you.chen35020192022-05-06 11:30:57 +08001050 *str++ = '\0';
1051 results[ret++] = str;
1052 continue;
1053 }
1054 str++;
1055 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001056 if (*str == delimiter)
1057 {
you.chen35020192022-05-06 11:30:57 +08001058 *str = '\0';
1059 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001060
you.chen6ed36a62023-04-27 17:51:56 +08001061 results[ret] = NULL;
1062
you.chen35020192022-05-06 11:30:57 +08001063 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001064}
1065
you.chend2fef3f2023-02-13 10:50:35 +08001066static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
1067{
1068 char * p;
1069 int ret = 0;
1070 char cmd[256]={0};
1071 if (NULL == mac || NULL == ip)
you.chen35020192022-05-06 11:30:57 +08001072 return -1;
you.chend2fef3f2023-02-13 10:50:35 +08001073 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +08001074 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-02-13 10:50:35 +08001075 ret = exec_cmd(cmd, ip, ip_len);
1076 p = strchr(ip, '\n');
1077 if (NULL != p)
1078 {
1079 *p = '\0';
you.chen35020192022-05-06 11:30:57 +08001080 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001081 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +08001082 return ret;
1083}
1084
you.chend2fef3f2023-02-13 10:50:35 +08001085static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +08001086 struct in_addr addr ={0};
1087 struct hostent *ht;
you.chen186d3c32023-05-18 14:19:46 +08001088 char cmd[64] = {0};
1089 char * p;
1090 int ret;
you.chen35020192022-05-06 11:30:57 +08001091
qs.xiong9fbf74e2023-03-28 13:38:22 +08001092 if (ip == NULL || *ip == '\0' || hostname == NULL)
1093 {
1094 RLOGE("ip == NULL or hostname == NULL");
1095 return -1;
you.chen35020192022-05-06 11:30:57 +08001096 }
1097
you.chend2fef3f2023-02-13 10:50:35 +08001098 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08001099 if (inet_aton(ip, &addr) == 0)
1100 {
you.chen35020192022-05-06 11:30:57 +08001101 printf("---inet_aton fail\n");
1102 return -1;
1103 }
1104
1105 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
1106
qs.xiong9fbf74e2023-03-28 13:38:22 +08001107 if (ht == NULL)
1108 {
you.chen186d3c32023-05-18 14:19:46 +08001109 hostname[0] = '\0';
1110 sprintf(cmd, "grep -F '%s' /run/wg870/ap0.lease | awk '{print $4}' | tail -1", ip);
1111 ret = exec_cmd(cmd, hostname, 32);
1112 if (ret == 0)
1113 {
1114 p = strchr(hostname, '\n');
1115 if (p != NULL)
1116 {
1117 *p = '\0';
1118 }
1119 return 0;
1120 }
1121 hostname[0] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08001122 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-05-06 11:30:57 +08001123 herror(NULL);
1124 return -1;
1125 }
1126
1127 strcpy(hostname, ht->h_name);
1128
1129 return 0;
1130}
1131
1132static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
1133{
1134 int count, index, words_count;
1135 char * split_lines[128]= {0};
1136 char * split_words[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08001137 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +08001138 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001139 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-05-06 11:30:57 +08001140
1141 CHECK_WPA_CTRL(ap_sta);
1142
1143 DO_REQUEST(lynq_wifi_list_networks);
1144
1145 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1146
1147 //@todo check ssid field to compatible
1148
1149 ret = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001150 for(index=1; index < count; index++)
1151 {
you.chen35020192022-05-06 11:30:57 +08001152 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001153 if (words_count > 2)
1154 {
you.chend2fef3f2023-02-13 10:50:35 +08001155 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001156 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
1157 {
you.chen35020192022-05-06 11:30:57 +08001158 net_no_list[ret++] = atoi(split_words[0]);
1159 }
1160 }
1161 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001162 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +08001163 return ret;
1164}
1165
1166static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001167 size_t i=0;
you.chen35020192022-05-06 11:30:57 +08001168 CHECK_WPA_CTRL(ap_sta);
1169 const char *lynq_wifi_add_network = "ADD_NETWORK";
1170
qs.xiong9fbf74e2023-03-28 13:38:22 +08001171 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +08001172 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001173 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1174 {
1175 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen35020192022-05-06 11:30:57 +08001176 return -1;
1177 }
1178
qs.xiong9fbf74e2023-03-28 13:38:22 +08001179 for(i=0;i<reply_len;i++)
1180 {
1181 if(cmd_reply[i] == '\n')
1182 {
you.chen35020192022-05-06 11:30:57 +08001183 cmd_reply[i] = '\0';
1184 break;
1185 }
1186 }
1187 return atoi(cmd_reply);
1188}
you.chena6cd55a2022-05-08 12:20:18 +08001189
you.chen35020192022-05-06 11:30:57 +08001190static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
1191{
1192 int count, index;
1193 int net_no_list[128];
1194
qs.xiong9fbf74e2023-03-28 13:38:22 +08001195 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +08001196 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001197 for (index=0; index < count; index++)
1198 {
1199 if (net_no_list[index] == net_no)
1200 {
you.chen35020192022-05-06 11:30:57 +08001201 return 0;
1202 }
1203 }
1204
1205 if (count >= 1)
1206 index = net_no_list[count - 1];
1207 else
1208 index = -1;
1209
qs.xiong9fbf74e2023-03-28 13:38:22 +08001210 while (index < net_no )
1211 {
you.chen35020192022-05-06 11:30:57 +08001212 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001213 if (index >= net_no)
1214 { // required network no created
1215 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +08001216 return 0;
1217 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001218 else if( index < 0)
1219 {
1220 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +08001221 return -1;
1222 }
you.chen35020192022-05-06 11:30:57 +08001223 }
1224
1225 if (index < 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001226 {
1227 RLOGE("[lynq_check_network_number] network index < 0");
1228 return -1;
1229 }
1230 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen35020192022-05-06 11:30:57 +08001231 return 0;
1232}
1233
1234static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +08001235 if (freq > 5000 && freq < 6000)
1236 {
you.chen35020192022-05-06 11:30:57 +08001237 return LYNQ_WIFI_5G_band;
1238 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001239 else if (freq > 2000 && freq < 3000)
1240 {
you.chen35020192022-05-06 11:30:57 +08001241 return LYNQ_WIFI_2G_band;
1242 }
1243 return LYNQ_WIFI_2_and_5G_band;
1244}
1245
1246static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001247 if (key_mgmt != NULL)
1248 {
1249 if (memcmp( key_mgmt, "NONE", 4) == 0)
1250 {
you.chen35020192022-05-06 11:30:57 +08001251 return LYNQ_WIFI_AUTH_OPEN;
1252 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001253 else if (memcmp( key_mgmt, "WEP", 3) == 0)
1254 {
you.chen35020192022-05-06 11:30:57 +08001255 return LYNQ_WIFI_AUTH_WEP;
1256 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001257 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
1258 {
you.chen35020192022-05-06 11:30:57 +08001259 return LYNQ_WIFI_AUTH_WPA_PSK;
1260 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001261 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
1262 {
you.chen35020192022-05-06 11:30:57 +08001263 return LYNQ_WIFI_AUTH_WPA2_PSK;
1264 }
1265 }
1266
1267 return -1;
1268}
1269
1270static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001271 if (flag != NULL)
1272 {
qs.xiong3e506812023-04-06 11:08:48 +08001273 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
1274 {
1275 return LYNQ_WIFI_AUTH_WPA3_PSK;
1276 }else if ( strstr( flag,"SAE-CCMP") != NULL )
1277 {
1278 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
1279 }else if (strstr( flag, "WPA2-PSK") != NULL)
1280 {
you.chen35020192022-05-06 11:30:57 +08001281 return LYNQ_WIFI_AUTH_WPA2_PSK;
1282 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001283 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001284 {
you.chen35020192022-05-06 11:30:57 +08001285 return LYNQ_WIFI_AUTH_WPA_PSK;
1286 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001287 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001288 {
you.chen35020192022-05-06 11:30:57 +08001289 return LYNQ_WIFI_AUTH_WEP;
1290 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001291 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001292 {
you.chen35020192022-05-06 11:30:57 +08001293 return LYNQ_WIFI_AUTH_OPEN;
1294 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001295 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +08001296 {
you.chend2fef3f2023-02-13 10:50:35 +08001297 return LYNQ_WIFI_AUTH_OPEN;
1298 }
you.chen35020192022-05-06 11:30:57 +08001299 }
1300
1301 return -1;
1302}
1303
1304static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
1305 switch (bw) {
1306 case 10:
1307 return LYNQ_WIFI_BANDWIDTH_HT10;
1308 break;
1309 case 20:
1310 return LYNQ_WIFI_BANDWIDTH_HT20;
1311 break;
1312 case 40:
1313 return LYNQ_WIFI_BANDWIDTH_HT40;
1314 break;
1315 case 80:
1316 return LYNQ_WIFI_BANDWIDTH_HT80;
1317 break;
1318 default:
1319 break;
1320 }
1321
1322 return -1;
1323}
1324
you.chen70f377f2023-04-14 18:17:09 +08001325static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth);
you.chen35020192022-05-06 11:30:57 +08001326static int inner_get_status_info(int interface, curr_status_info *curr_state) {
1327 int i, count;
1328 char *p;
1329 const char *lynq_status_cmd = "STATUS";
1330 const char * FLAG_SSID = "ssid=";
1331 const char * FLAG_SBSID = "bssid=";
1332 const char * FLAG_KEY_MGMT = "key_mgmt=";
1333 const char * FLAG_FREQ = "freq=";
1334 const char * FLAG_STATE = "wpa_state=";
1335 const char * FLAG_ID = "id=";
you.chend2fef3f2023-02-13 10:50:35 +08001336 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +08001337 char *split_lines[128] = {0};
1338
1339 CHECK_WPA_CTRL(interface);
1340
qs.xiong9fbf74e2023-03-28 13:38:22 +08001341 if (curr_state == NULL)
1342 {
1343 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-05-06 11:30:57 +08001344 return -1;
1345 }
1346
1347 DO_REQUEST(lynq_status_cmd);
1348
1349 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1350
1351 curr_state->net_no = -1;
1352 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001353 for(i=0; i < count; i++)
1354 {
1355 if (curr_state->ap != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001356 {
you.chen35020192022-05-06 11:30:57 +08001357 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001358 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001359 {
you.chend2fef3f2023-02-13 10:50:35 +08001360 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +08001361 ret = 0;
1362 continue;
1363 }
you.chenf58b3c92022-06-21 16:53:48 +08001364 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001365 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001366 {
you.chend2fef3f2023-02-13 10:50:35 +08001367 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 +08001368 ret = 0;
1369 continue;
1370 }
you.chen35020192022-05-06 11:30:57 +08001371 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001372 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001373 {
you.chen450d0172022-07-15 17:56:48 +08001374 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001375 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +08001376 ret = 0;
1377 continue;
1378 }
1379 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001380 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001381 {
you.chen35020192022-05-06 11:30:57 +08001382 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1383 ret = 0;
1384 continue;
1385 }
you.chend2fef3f2023-02-13 10:50:35 +08001386 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001387 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001388 {
you.chend2fef3f2023-02-13 10:50:35 +08001389 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1390 ret = 0;
1391 continue;
1392 }
you.chen35020192022-05-06 11:30:57 +08001393 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001394 if (curr_state->state != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001395 {
you.chen35020192022-05-06 11:30:57 +08001396 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001397 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001398 {
you.chen35020192022-05-06 11:30:57 +08001399 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1400 ret = 0;
1401 continue;
1402 }
1403
1404 } //end else if (state != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001405 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
you.chen70f377f2023-04-14 18:17:09 +08001406 {
you.chen35020192022-05-06 11:30:57 +08001407 ret = 0;
you.chen450d0172022-07-15 17:56:48 +08001408 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001409 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +08001410 }
1411 }
1412
you.chen70f377f2023-04-14 18:17:09 +08001413 if (ret == 0 && curr_state->ap != NULL && curr_state->net_no >= 0) // auth may not right when add wpa3
1414 {
1415 inner_get_network_auth(interface, curr_state->net_no, &curr_state->ap->auth);
1416 }
1417
you.chen35020192022-05-06 11:30:57 +08001418 return ret;
1419}
1420
qs.xiongf1b525b2022-03-31 00:58:23 -04001421int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001422{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001423 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +08001424 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -05001425
qs.xiong9fbf74e2023-03-28 13:38:22 +08001426 if (ap_ssid == NULL)
1427 {
1428 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +08001429 return -1;
1430 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001431 else
1432 {
1433 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen35020192022-05-06 11:30:57 +08001434 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001435
qs.xiong9fbf74e2023-03-28 13:38:22 +08001436 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1437 {
1438 RLOGE("Do check ap network_number fail");
you.chen35020192022-05-06 11:30:57 +08001439 return -1;
1440 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001441
you.chen35020192022-05-06 11:30:57 +08001442 CHECK_IDX(idx, CTRL_AP);
1443
1444 CHECK_WPA_CTRL(CTRL_AP);
1445
1446 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1447
1448 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1449 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001450 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1451 return 0;
you.chen35020192022-05-06 11:30:57 +08001452
qs.xiong7a105ce2022-03-02 09:43:11 -05001453}
1454
you.chen35020192022-05-06 11:30:57 +08001455int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001456{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001457 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001458 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001459 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001460}
1461
qs.xiongc9c79f72022-10-17 15:27:18 +08001462/*****
1463 *frequency <------>channel
1464 *
1465 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1466 *
1467 *
1468 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1469 *
1470 *
1471 * */
1472static int lynq_check_set_frequency(int input_frequency){
qs.xiongc00b6032022-11-29 16:28:03 +08001473 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};
1474 int i;
1475 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1476
qs.xiong69a332b2022-12-02 09:58:57 +08001477 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001478 {
1479 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001480 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001481 }
qs.xiongc00b6032022-11-29 16:28:03 +08001482
1483 if(i == arr_len)
1484 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001485 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001486 return -1;
1487 }
qs.xiongc00b6032022-11-29 16:28:03 +08001488
qs.xiongc9c79f72022-10-17 15:27:18 +08001489 return 0;
1490}
qs.xiong13673462023-02-21 19:12:54 +08001491
1492static int lynq_check_frequencyby_country_code(int input_frequency)
1493{
1494 char str_cnc[]="CN";
1495 char str_dest[20]="";
1496
1497 if( lynq_get_country_code(1,str_dest) != 0 )
1498 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001499 RLOGE("get country_code error\n");
qs.xiong13673462023-02-21 19:12:54 +08001500 return -1;
1501 }
1502 if( strncmp(str_dest,str_cnc,2) != 0 )
1503 {
1504 return 0;
1505 }else if( 2473 < input_frequency && input_frequency < 5744)
1506 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001507 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001508 return -1;
1509 }
1510 return 0;
1511}
qs.xiongf1b525b2022-03-31 00:58:23 -04001512int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001513{
qs.xiongc00b6032022-11-29 16:28:03 +08001514 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001515 char lynq_wifi_frequency_cmd[128]={0};
1516 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001517 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001518 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001519 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001520 check = lynq_check_set_frequency(lynq_wifi_frequency);
1521 if(check != 0)
1522 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001523 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001524 return -1;
you.chen35020192022-05-06 11:30:57 +08001525 }
qs.xiong13673462023-02-21 19:12:54 +08001526 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1527 if(check != 0)
1528 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001529 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001530 return -1;
1531 }
1532
qs.xiongc00b6032022-11-29 16:28:03 +08001533 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1534 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001535 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001536 return -1;
1537 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001538
you.chen35020192022-05-06 11:30:57 +08001539 CHECK_IDX(idx, CTRL_AP);
1540
1541 CHECK_WPA_CTRL(CTRL_AP);
1542
1543 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1544 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1545 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1546
you.chen6c2dd9c2022-05-16 17:55:28 +08001547 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-05-06 11:30:57 +08001548 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1549 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1550 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001551
qs.xiong9fbf74e2023-03-28 13:38:22 +08001552 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001553}
1554
qs.xiongf1b525b2022-03-31 00:58:23 -04001555int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001556{
you.chen35020192022-05-06 11:30:57 +08001557 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001558 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001559 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001560
qs.xiong9fbf74e2023-03-28 13:38:22 +08001561 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1562 {
1563 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen35020192022-05-06 11:30:57 +08001564 return -1;
1565 }
1566 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001567
qs.xiong9fbf74e2023-03-28 13:38:22 +08001568 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001569}
1570
qs.xiongf1b525b2022-03-31 00:58:23 -04001571int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1572{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001573 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001574 CHECK_IDX(idx, CTRL_AP);
1575 switch(bandwidth){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001576 case LYNQ_WIFI_BANDWIDTH_HT10:
1577 {
1578 RLOGE("bandwith [%d] not support now\n", bandwidth);
1579 return -1;
1580 }
1581 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen35020192022-05-06 11:30:57 +08001582 {
1583 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1584 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001585 if (system(lynq_cmd_bandwith) != 0 )
1586 {
1587 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001588 return -1;
1589 }
1590 system("wl up");
1591 break;
1592 }
1593 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001594 {
qs.xiong10379192023-02-21 13:19:42 +08001595 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001596 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1597 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001598 if (system(lynq_cmd_bandwith) != 0 )
1599 {
1600 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001601 return -1;
1602 }
1603 system("wl up");
1604 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001605 }
you.chen35020192022-05-06 11:30:57 +08001606 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001607 {
qs.xiong10379192023-02-21 13:19:42 +08001608 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001609 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001610 if (system(lynq_cmd_bandwith) != 0 )
1611 {
1612 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001613 return -1;
1614 }
1615 system("wl up");
1616 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001617 }
1618 default:
you.chen35020192022-05-06 11:30:57 +08001619 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001620 RLOGE("auth type [%d] not support now\n", bandwidth);
1621 return -1;
you.chen35020192022-05-06 11:30:57 +08001622 }
1623 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001624
1625
you.chen35020192022-05-06 11:30:57 +08001626 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001627}
you.chen35020192022-05-06 11:30:57 +08001628
qs.xiongf1b525b2022-03-31 00:58:23 -04001629int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1630{
you.chen35020192022-05-06 11:30:57 +08001631 int count = 0;
1632 int index = 0;
1633 char *split_words[128] = {0};
1634 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001635 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001636 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001637
you.chen35020192022-05-06 11:30:57 +08001638 CHECK_WPA_CTRL(CTRL_AP);
1639
1640 DO_REQUEST(lynq_chanspec_cmd);
1641
1642 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1643 for(;index < count; index++) {
1644 if (strncmp(split_words[index], "bw", 2) != 0) {
1645 continue;
1646 }
1647
1648 index++;
1649 if (index >= count) {
1650 return -1;
1651 }
1652
qs.xiong9fbf74e2023-03-28 13:38:22 +08001653 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001654 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1655 return 0;
1656 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001657 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001658 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001659}
qs.xiong0fb469a2022-04-14 03:50:45 -04001660
qs.xiongf1b525b2022-03-31 00:58:23 -04001661int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001662{
you.chen35020192022-05-06 11:30:57 +08001663 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001664 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001665 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001666
you.chen35020192022-05-06 11:30:57 +08001667 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001668
qs.xiong9fbf74e2023-03-28 13:38:22 +08001669 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1670 {
you.chen35020192022-05-06 11:30:57 +08001671 return -1;
1672 }
1673
1674 system("wl down");
1675 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001676 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001677 return -1;
1678 }
1679 system("wl up");
1680 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001681}
qs.xiong0fb469a2022-04-14 03:50:45 -04001682
qs.xiongf1b525b2022-03-31 00:58:23 -04001683int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001684{
you.chen35020192022-05-06 11:30:57 +08001685 int count = 0;
1686 int index = 0;
1687 char *split_words[128] = {0};
1688 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001689 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001690 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001691
you.chen35020192022-05-06 11:30:57 +08001692 CHECK_WPA_CTRL(CTRL_AP);
1693
1694 DO_REQUEST(lynq_chanspec_cmd);
1695
1696 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001697 for(;index < count; index++)
1698 {
1699 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001700 if (strncmp(split_words[index], "channel", 2) != 0) {
1701 continue;
1702 }
1703
1704 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001705 if (index >= count)
1706 {
you.chen35020192022-05-06 11:30:57 +08001707 return -1;
1708 }
1709
1710 *channel = atoi(split_words[index]);
1711 return 0;
1712 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001713 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001714 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001715}
1716
1717
you.chen35020192022-05-06 11:30:57 +08001718int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001719{
you.chen6c2dd9c2022-05-16 17:55:28 +08001720 char ssid[MAX_CMD] = {0};
1721 int freq = 0;
1722 char lynq_auth_cmd[64]={0};
1723 char lynq_auth_alg_cmd[64]={0};
1724 char lynq_psk_cmd[64]={0};
1725 char lynq_pairwise_cmd[64]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001726 char lynq_ieee80211_cmd[64]={0};
1727 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001728 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001729 CHECK_IDX(idx, CTRL_AP);
1730
you.chen6c2dd9c2022-05-16 17:55:28 +08001731 CHECK_WPA_CTRL(CTRL_AP);
1732
qs.xiong9fbf74e2023-03-28 13:38:22 +08001733 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1734 {
1735 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen35020192022-05-06 11:30:57 +08001736 return -1;
1737 }
1738
you.chen92fd5d32022-05-25 10:09:47 +08001739 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001740 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001741 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001742 return 0;
1743 }
1744 else {
1745 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1746 ssid[0] = '\0';
1747 }
1748 lynq_wifi_ap_frequency_get(idx, &freq);
1749
1750 DO_OK_FAIL_REQUEST(cmd_disconnect);
1751 DO_OK_FAIL_REQUEST(cmd_remove_all);
1752 if (ssid[0] != '\0') {
1753 lynq_wifi_ap_ssid_set(idx, ssid);
1754 }
1755 if (freq != 0) {
1756 lynq_wifi_ap_frequency_set(idx, freq);
1757 }
1758 }
1759 }
you.chen35020192022-05-06 11:30:57 +08001760
qs.xiong9fbf74e2023-03-28 13:38:22 +08001761 switch(auth){
1762 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001763 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001764 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001765 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001766 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001767 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001768 break;
1769 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001770 case LYNQ_WIFI_AUTH_WEP:
1771 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001772 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001773 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001774 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-05-16 17:55:28 +08001775 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1776
1777 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1778 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1779 break;
1780 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001781 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-03-29 17:36:14 +08001782 {
1783 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1784 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1785 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1786
1787 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1788 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1789 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1790 break;
1791
1792 }
you.chen35020192022-05-06 11:30:57 +08001793 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001794 {
1795 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1796 {
you.chen35020192022-05-06 11:30:57 +08001797 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1798 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1799 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001800 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1801 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001802 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001803 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001804 }
1805// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1806// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1807 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong7a105ce2022-03-02 09:43:11 -05001808
you.chen35020192022-05-06 11:30:57 +08001809 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1810 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1811 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001812 break;
1813 }
1814 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1815 {
1816 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1817 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1818 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1819 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1820
1821 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1822 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1823 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1824 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1825 break;
1826 }
1827 case LYNQ_WIFI_AUTH_WPA3_PSK:
1828 {
1829 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1830 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xiong3e506812023-04-06 11:08:48 +08001831 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001832 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1833
1834 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1835 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1836 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1837 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1838 break;
1839 }
1840 default:
you.chen35020192022-05-06 11:30:57 +08001841 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001842 RLOGE("auth type [%d] not support now\n", auth);
1843 return -1;
you.chen35020192022-05-06 11:30:57 +08001844 }
1845 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001846 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001847
qs.xiong9fbf74e2023-03-28 13:38:22 +08001848 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001849}
1850
you.chen35020192022-05-06 11:30:57 +08001851int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001852{
you.chen35020192022-05-06 11:30:57 +08001853 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001854 char lynq_auth_alg_str[MAX_RET] = {0};
1855 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001856 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001857 CHECK_IDX(idx, CTRL_AP);
1858
qs.xiong9fbf74e2023-03-28 13:38:22 +08001859 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1860 {
1861 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen35020192022-05-06 11:30:57 +08001862 return -1;
1863 }
1864
qs.xiong9fbf74e2023-03-28 13:38:22 +08001865 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1866 {
1867 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1868 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001869 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001870 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001871 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001872 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001873 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1874 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001875 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001876 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001877 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001878 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001879 else
1880 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001881 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001882 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001883 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001884 }
you.chen35020192022-05-06 11:30:57 +08001885 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001886 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1887 {
1888 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1889 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001890 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001891 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001892 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001893 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1894 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001895 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001896 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001897 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001898 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001899 else
1900 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001901 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001902 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001903 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001904 }
you.chen35020192022-05-06 11:30:57 +08001905 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001906
1907 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1908 {
1909 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1910 return -1;
1911 }
1912
1913 if (memcmp(lynq_auth_str,"1",1) == 0 )
1914 {
1915 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1916 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001917 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001918 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1919 {
1920 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1921 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001922 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001923 }
1924 else
1925 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001926 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001927 *auth = -1;
1928 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001929
you.chen6c2dd9c2022-05-16 17:55:28 +08001930 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001931}
qs.xiong1af5daf2022-03-14 09:12:12 -04001932
you.chenb95401e2023-05-12 19:39:06 +08001933static int inner_check_ap_connected(lynq_wifi_index_e idx, int retry_count)
1934{
1935 char status[64];
you.chencba13492023-05-19 13:53:43 +08001936 char LYNQ_WIFI_CMD[32]={0};
you.chenb95401e2023-05-12 19:39:06 +08001937 curr_status_info curr_state;
1938
1939 CHECK_WPA_CTRL(CTRL_AP);
1940
1941 memset(status, 0, sizeof (status));
1942
1943 curr_state.ap = NULL;
1944 curr_state.state = status;
1945
1946 printf("inner_check_ap_connected %d\n", retry_count);
1947 usleep(500*1000);
1948 if (0 == inner_get_status_info(idx, &curr_state))
1949 {
1950 if (strcmp(status, STATE_COMPLETED) == 0)
1951 {
1952 return 0;
1953 }
1954 else if (retry_count == 4) //not ok in 2s, do reconnect
1955 {
1956 DO_REQUEST("RECONNECT");
1957 return inner_check_ap_connected(idx, retry_count+1);
1958 }
you.chencba13492023-05-19 13:53:43 +08001959 else if (retry_count > 20)
you.chenb95401e2023-05-12 19:39:06 +08001960 {
1961 printf("retry 10 time\n");
1962 return -1;
1963 }
1964 else
1965 {
you.chen6d247052023-06-01 16:39:54 +08001966 if (strcmp(status, STATE_DISCONNECTED) == 0)
1967 {
1968 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1969 DO_REQUEST(LYNQ_WIFI_CMD);
1970 }
you.chenb95401e2023-05-12 19:39:06 +08001971 return inner_check_ap_connected(idx, retry_count+1);
1972 }
1973 }
1974 return -1;
1975}
qs.xiong1af5daf2022-03-14 09:12:12 -04001976
qs.xiongf1b525b2022-03-31 00:58:23 -04001977int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001978{
you.chen35020192022-05-06 11:30:57 +08001979 char LYNQ_WIFI_CMD[128]={0};
1980 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1981 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001982 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001983 CHECK_IDX(idx, CTRL_AP);
1984
1985 CHECK_WPA_CTRL(CTRL_AP);
1986
you.chen0df3e7e2023-05-10 15:56:26 +08001987 if (inner_get_ap_interface_name() == NULL)
you.chenc9928582023-04-24 15:39:37 +08001988 {
you.chen0df3e7e2023-05-10 15:56:26 +08001989 RLOGE("lynq_wifi_ap_start get ap name fail");
you.chenc9928582023-04-24 15:39:37 +08001990 return -1;
1991 }
you.chen35020192022-05-06 11:30:57 +08001992
1993 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1994 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1995
1996 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1997 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1998
you.chenc9928582023-04-24 15:39:37 +08001999 ret = system_call_v("%s %s", start_stop_ap_script, "start");
2000 if (ret != 0)
2001 {
2002 RLOGE("lynq_wifi_ap_start excute script fail");
2003 return -1;
2004 }
2005
you.chenb95401e2023-05-12 19:39:06 +08002006 if (inner_check_ap_connected(idx, 0) != 0)
2007 {
2008 return -1;
2009 }
2010
you.chen0df3e7e2023-05-10 15:56:26 +08002011 check_tether_and_notify();
2012
qs.xiong9fbf74e2023-03-28 13:38:22 +08002013 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002014}
2015
qs.xiongf1b525b2022-03-31 00:58:23 -04002016int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002017{
you.chen35020192022-05-06 11:30:57 +08002018 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05002019}
2020
qs.xiongf1b525b2022-03-31 00:58:23 -04002021int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002022{
you.chen35020192022-05-06 11:30:57 +08002023 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04002024
you.chen35020192022-05-06 11:30:57 +08002025 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002026
you.chen35020192022-05-06 11:30:57 +08002027 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002028
you.chen35020192022-05-06 11:30:57 +08002029 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
2030
2031 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
2032
you.chenb4b121c2022-05-06 17:50:16 +08002033// system("connmanctl tether wifi off");
you.chenc9928582023-04-24 15:39:37 +08002034
2035 ret = system_call_v("%s %s", start_stop_ap_script, "stop");
2036 if (ret != 0)
2037 {
2038 RLOGE("lynq_wifi_ap_start excute script fail");
2039 return -1;
2040 }
2041
qs.xiong9fbf74e2023-03-28 13:38:22 +08002042 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002043}
qs.xiong1af5daf2022-03-14 09:12:12 -04002044
qs.xiongf1b525b2022-03-31 00:58:23 -04002045int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002046{
you.chen35020192022-05-06 11:30:57 +08002047 char lynq_disable_cmd[128] = {0};
2048 char lynq_select_cmd[128] = {0};
2049 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08002050 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08002051 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05002052
you.chen35020192022-05-06 11:30:57 +08002053 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08002054 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2055 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2056
2057 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2058 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
2059 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04002060
qs.xiong9fbf74e2023-03-28 13:38:22 +08002061 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002062}
2063
qs.xiongf1b525b2022-03-31 00:58:23 -04002064int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05002065{
you.chen35020192022-05-06 11:30:57 +08002066 char lynq_disable_cmd[128] = {0};
2067 char lynq_select_cmd[128] = {0};
2068 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08002069 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08002070 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05002071
you.chen35020192022-05-06 11:30:57 +08002072 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002073
you.chen35020192022-05-06 11:30:57 +08002074 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2075 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2076
2077 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2078 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
2079 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05002080
qs.xiong9fbf74e2023-03-28 13:38:22 +08002081 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002082}
qs.xiongf1b525b2022-03-31 00:58:23 -04002083
you.chen35020192022-05-06 11:30:57 +08002084int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002085{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002086 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08002087 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002088 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08002089 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002090 RLOGD("enter lynq_ap_password_set");
2091 if( password == NULL )
2092 {
2093 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08002094 return -1;
2095 }
2096 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08002097 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002098 if(pass_len < 8 || pass_len >= 64)
2099 {
2100 RLOGE("[lynq_ap_password_set]input password len not in rage");
2101 return -1;
you.chen35020192022-05-06 11:30:57 +08002102 }
qs.xiongf1b525b2022-03-31 00:58:23 -04002103
you.chen35020192022-05-06 11:30:57 +08002104 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002105
qs.xiong9fbf74e2023-03-28 13:38:22 +08002106 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
2107 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002108 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002109 return -1;
2110 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002111 else if (auth == LYNQ_WIFI_AUTH_OPEN)
2112 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002113 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
2114 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08002115 }
2116
you.chen35020192022-05-06 11:30:57 +08002117 CHECK_WPA_CTRL(CTRL_AP);
2118
qs.xiong9fbf74e2023-03-28 13:38:22 +08002119 if (auth == LYNQ_WIFI_AUTH_WEP)
2120 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002121 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002122 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
2123 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
2124 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2125 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
2126 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002127 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2128 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002129 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 +08002130 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
2131 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2132 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002133 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
2134 {
2135
qs.xiongc8d92a62023-03-29 17:36:14 +08002136 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 +08002137 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08002138 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002139 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2140 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
2141
2142 }
2143 else
qs.xiongc8d92a62023-03-29 17:36:14 +08002144 {
2145 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002146 return -1;
2147 }
you.chen35020192022-05-06 11:30:57 +08002148
you.chen35020192022-05-06 11:30:57 +08002149 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04002150
qs.xiong9fbf74e2023-03-28 13:38:22 +08002151 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04002152}
2153
you.chen35020192022-05-06 11:30:57 +08002154int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04002155{
you.chen35020192022-05-06 11:30:57 +08002156 FILE * fp;
2157 int len, ret;
2158 int count, index;
2159 char *split_lines[128] = {0};
2160 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002161 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04002162
you.chen35020192022-05-06 11:30:57 +08002163 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002164
you.chen35020192022-05-06 11:30:57 +08002165 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
2166// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002167 if (NULL == fp)
2168 {
2169 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002170 return -1;
2171 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002172
you.chen35020192022-05-06 11:30:57 +08002173 buff = alloca(MAX_RET);
2174 fseek(fp, 0, SEEK_SET);
2175 len = fread(buff, 1, MAX_RET, fp);
2176 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04002177
qs.xiong9fbf74e2023-03-28 13:38:22 +08002178 for(index=0; index < len; index ++)
2179 {
2180 if (memcmp(buff + index, "network={", 9) != 0)
2181 {
you.chen35020192022-05-06 11:30:57 +08002182 continue;
2183 }
2184 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002185 for (; index < len; index ++ )
2186 {
2187 if (buff[index] != '}')
2188 {
you.chen35020192022-05-06 11:30:57 +08002189 continue;
2190 }
2191 buff[index] = '\0';
2192 break;
2193 }
2194 len = buff + index - p;
2195 }
2196
2197 count = lynq_split(p, len, '\n', split_lines);
2198
2199 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002200 for(index=0; index < count; index++)
2201 {
you.chen35020192022-05-06 11:30:57 +08002202 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002203 if (p != NULL)
2204 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002205 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002206 if (*p == '\"')
2207 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002208 p++;
2209 }
you.chen35020192022-05-06 11:30:57 +08002210 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002211 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2212 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002213 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002214 if (*p == '\"')
2215 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002216 p++;
2217 }
2218 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002219 else
2220 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002221 continue;
you.chen35020192022-05-06 11:30:57 +08002222 }
2223
2224 strcpy(password, p);
2225
qs.xiong9fbf74e2023-03-28 13:38:22 +08002226 while(*password != '\0')
2227 {
2228 if (*password == '\"')
2229 {
you.chen35020192022-05-06 11:30:57 +08002230 *password = '\0';
2231 break;
2232 }
2233 password++;
2234 }
2235 ret = 0;
2236 break;
2237 } //end for(index=0; index < count; index++)
2238
2239 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002240}
2241
you.chen35020192022-05-06 11:30:57 +08002242static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
2243 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08002244 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002245
qs.xiong9fbf74e2023-03-28 13:38:22 +08002246 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
2247 {
you.chen35020192022-05-06 11:30:57 +08002248 return -1;
2249 }
2250
2251 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08002252
qs.xiong9fbf74e2023-03-28 13:38:22 +08002253 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
2254 {
2255 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
you.chen70f377f2023-04-14 18:17:09 +08002256 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002257 if (strcmp(lynq_proto_str, "RSN") == 0)
you.chen70f377f2023-04-14 18:17:09 +08002258 {
you.chena6cd55a2022-05-08 12:20:18 +08002259 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002260 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08002261 }
you.chen70f377f2023-04-14 18:17:09 +08002262 else if (strcmp(lynq_proto_str, "WPA") == 0) // need compare when wpa3 supported
2263 {
2264 return 0;
2265 }
you.chena6cd55a2022-05-08 12:20:18 +08002266 }
2267 }
you.chen70f377f2023-04-14 18:17:09 +08002268 else if (*auth == LYNQ_WIFI_AUTH_OPEN || *auth == LYNQ_WIFI_AUTH_WEP)
2269 {
2270 return 0;
2271 }
2272
qs.xiong9fbf74e2023-03-28 13:38:22 +08002273 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
2274 {
you.chen70f377f2023-04-14 18:17:09 +08002275 RLOGE("check ieee80211w error\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002276 return -1;
2277 }
2278 if ( strncmp(lynq_auth_str,"1",1) == 0 )
2279 {
2280
you.chen70f377f2023-04-14 18:17:09 +08002281 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
2282 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002283 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
2284 {
2285
2286 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002287 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002288 }else
2289 {
you.chen70f377f2023-04-14 18:17:09 +08002290 RLOGE("check ieee80211w error, not 1 or 2\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002291 *auth = -1;
2292 return -1;
2293 }
you.chen35020192022-05-06 11:30:57 +08002294 return 0;
2295}
2296
2297int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002298{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002299 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002300 int pass_len, net_no, count, index;
2301 char lynq_tmp_cmd[300]={0};
2302 int net_no_list[128];
2303 lynq_wifi_auth_s net_auth;
2304 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002305 if(pass_len < 8 || pass_len >= 64)
2306 {
2307 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08002308 return -1;
2309 }
2310
2311 CHECK_IDX(idx, CTRL_STA);
2312
2313 net_no = -1;
2314 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
2315
qs.xiong9fbf74e2023-03-28 13:38:22 +08002316 for (index=0; index < count; index++)
2317 {
you.chen35020192022-05-06 11:30:57 +08002318 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002319 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
2320 {
you.chen35020192022-05-06 11:30:57 +08002321 net_no = net_no_list[index];
2322 break;
2323 }
2324 }
2325
qs.xiong9fbf74e2023-03-28 13:38:22 +08002326 if (net_no < 0)
2327 {
you.chen35020192022-05-06 11:30:57 +08002328 return -1;
2329 }
2330
2331 CHECK_WPA_CTRL(CTRL_STA);
2332
2333 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
2334
2335 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2336 DO_OK_FAIL_REQUEST(cmd_save_config);
2337
2338 return 0;
2339}
2340
2341int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
2342
2343 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08002344 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08002345 int count, index;
2346 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08002347 char *buff, *p, *ssid, *ssid_end_flag;
2348 char tmp_ssid[128]={0};
you.chen6d247052023-06-01 16:39:54 +08002349 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08002350
you.chen755332b2022-08-06 16:59:10 +08002351 network_len = 0;
2352 p = NULL;
you.chen6d247052023-06-01 16:39:54 +08002353 buff = NULL;
you.chen755332b2022-08-06 16:59:10 +08002354
you.chen35020192022-05-06 11:30:57 +08002355 CHECK_IDX(idx, CTRL_STA);
2356
qs.xiong9fbf74e2023-03-28 13:38:22 +08002357 if (NULL == password)
2358 {
2359 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08002360 return -1;
2361 }
2362
you.chen35020192022-05-06 11:30:57 +08002363 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002364 if (NULL == fp)
2365 {
2366 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002367 return -1;
2368 }
2369
you.chen6d247052023-06-01 16:39:54 +08002370 fseek(fp, 0, SEEK_END);
2371 len = ftell(fp);
2372 buff = malloc(len + 1);
2373
2374 if (buff == NULL)
2375 {
2376 RLOGE("[lynq_sta_ssid_password_get] malloc memory [%d] fail\n", len);
2377 return -1;
2378 }
2379
you.chen35020192022-05-06 11:30:57 +08002380 fseek(fp, 0, SEEK_SET);
you.chen6d247052023-06-01 16:39:54 +08002381 len = fread(buff, 1, len, fp);
you.chen35020192022-05-06 11:30:57 +08002382 fclose(fp);
2383
qs.xiong9fbf74e2023-03-28 13:38:22 +08002384 for(index=0; index < len; index ++)
2385 {
2386 for(; index < len; index ++)
you.chen6d247052023-06-01 16:39:54 +08002387 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002388 if (memcmp(buff + index, "network={", 9) != 0)
you.chen6d247052023-06-01 16:39:54 +08002389 {
you.chen35020192022-05-06 11:30:57 +08002390 continue;
2391 }
you.chen6d247052023-06-01 16:39:54 +08002392 p = buff + index + 9;
2393 for (; index < len; index ++ )
2394 {
2395 if (buff[index] != '}')
2396 {
2397 continue;
2398 }
2399 buff[index] = '\0';
2400 break;
2401 }
2402 network_len = buff + index - p;
2403 break;
you.chen35020192022-05-06 11:30:57 +08002404 }
2405
qs.xiongb3f26af2023-02-17 18:41:07 +08002406 if (p == NULL)
you.chen6d247052023-06-01 16:39:54 +08002407 {
2408 if (buff != NULL)
2409 {
2410 free(buff);
2411 }
2412
qs.xiongb3f26af2023-02-17 18:41:07 +08002413 return -1;
you.chen6d247052023-06-01 16:39:54 +08002414 }
qs.xiongb3f26af2023-02-17 18:41:07 +08002415
you.chend2fef3f2023-02-13 10:50:35 +08002416 ssid = strstr(p, "ssid=");
2417 if (ssid != NULL) {
2418 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002419 if (ssid[0] == '\"')
you.chen6d247052023-06-01 16:39:54 +08002420 {
you.chend2fef3f2023-02-13 10:50:35 +08002421 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2422 break;
2423 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002424 else
you.chen6d247052023-06-01 16:39:54 +08002425 {
you.chend2fef3f2023-02-13 10:50:35 +08002426 ssid_end_flag = strstr(ssid, "\n");
2427 if (ssid_end_flag != NULL)
2428 {
2429 ssid_len = (ssid_end_flag - ssid) / 2;
2430 for(i=0; i<ssid_len; i++)
2431 {
2432 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2433 }
2434 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2435 break;
2436 }
2437 }
you.chen35020192022-05-06 11:30:57 +08002438 }
you.chend2fef3f2023-02-13 10:50:35 +08002439
you.chen35020192022-05-06 11:30:57 +08002440 }
2441
qs.xiong9fbf74e2023-03-28 13:38:22 +08002442 if (index >= len || NULL == p || network_len <= 0)
2443 {
you.chen6d247052023-06-01 16:39:54 +08002444 if (buff != NULL)
2445 {
2446 free(buff);
2447 }
you.chen35020192022-05-06 11:30:57 +08002448 return -1;
2449 }
2450
you.chen755332b2022-08-06 16:59:10 +08002451 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08002452
2453 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002454 for(index=0; index < count; index++)
2455 {
you.chen35020192022-05-06 11:30:57 +08002456 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002457 if (p != NULL)
you.chen6d247052023-06-01 16:39:54 +08002458 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002459 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002460 if (*p == '\"')
you.chen6d247052023-06-01 16:39:54 +08002461 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002462 p++;
2463 }
you.chen35020192022-05-06 11:30:57 +08002464 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002465 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
you.chen6d247052023-06-01 16:39:54 +08002466 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002467 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002468 if (*p == '\"')
you.chen6d247052023-06-01 16:39:54 +08002469 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002470 p++;
2471 }
2472 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002473 else
you.chen6d247052023-06-01 16:39:54 +08002474 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002475 continue;
you.chen35020192022-05-06 11:30:57 +08002476 }
2477
qs.xiong13673462023-02-21 19:12:54 +08002478 if (*p == '\"')
2479 p++;
2480 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08002481
qs.xiong13673462023-02-21 19:12:54 +08002482 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002483 while(password - p < 64 && *password != '\0')
you.chen6d247052023-06-01 16:39:54 +08002484 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002485 if (*password == '\"')
you.chen6d247052023-06-01 16:39:54 +08002486 {
you.chen35020192022-05-06 11:30:57 +08002487 *password = '\0';
2488 break;
2489 }
2490 password++;
2491 }
2492 ret = 0;
2493 break;
2494 } //end for(index=0; index < count; index++)
2495
you.chen6d247052023-06-01 16:39:54 +08002496 if (buff != NULL)
2497 {
2498 free(buff);
2499 }
2500
you.chen35020192022-05-06 11:30:57 +08002501 return ret;
2502}
2503
2504static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2505{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002506 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04002507
qs.xiong9fbf74e2023-03-28 13:38:22 +08002508 if (sta_ssid == NULL)
2509 {
2510 RLOGE("sta_ssid is null\n");
2511 return -1;
you.chen35020192022-05-06 11:30:57 +08002512 }
2513
qs.xiong9fbf74e2023-03-28 13:38:22 +08002514 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002515
2516 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2517
2518 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2519// DO_OK_FAIL_REQUEST(cmd_save_config);
2520
qs.xiong9fbf74e2023-03-28 13:38:22 +08002521 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002522
2523}
2524
you.chen35020192022-05-06 11:30:57 +08002525static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05002526{
you.chen35020192022-05-06 11:30:57 +08002527 char lynq_disable_cmd[128]={0};
2528 char lynq_select_cmd[128]={0};
2529
2530 CHECK_WPA_CTRL(CTRL_STA);
2531
qs.xiong9fbf74e2023-03-28 13:38:22 +08002532 if (save != 0)
2533 {
you.chenc29444e2022-06-07 18:01:16 +08002534 if (start_flag != 0)
2535 {
2536 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2537 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2538 }
2539 else
2540 {
2541 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2542 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2543 }
you.chen35020192022-05-06 11:30:57 +08002544 DO_OK_FAIL_REQUEST(cmd_save_config);
2545 }
2546
qs.xiong9fbf74e2023-03-28 13:38:22 +08002547 if (start_flag == 0)
2548 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002549 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002550 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2551 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002552 else
2553 {
you.chen35020192022-05-06 11:30:57 +08002554 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2555 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2556 }
2557
2558 return 0;
2559}
2560
2561int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2562{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002563 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002564 CHECK_IDX(idx, CTRL_STA);
2565
you.chen6c2dd9c2022-05-16 17:55:28 +08002566 curr_status_info curr_state;
2567 ap_info_s ap_info;
2568 curr_state.ap = &ap_info;
2569 curr_state.state = NULL;
2570
qs.xiong9fbf74e2023-03-28 13:38:22 +08002571 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2572 {
you.chend2fef3f2023-02-13 10:50:35 +08002573 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002574 return 0;
2575 }
2576
2577 return -1;
you.chen35020192022-05-06 11:30:57 +08002578}
2579
2580int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2581{
you.chen9ac66392022-08-06 17:01:16 +08002582 scan_info_s *scan_list = NULL;
2583 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002584 int scan_len=0;
2585 int save_len=0;
2586 int best_index = -1;
2587 int best_scan_index = -1;
2588 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002589 int i, j, ret;
2590
2591 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002592
2593 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002594 if (info == NULL)
2595 {
you.chen35020192022-05-06 11:30:57 +08002596 return -1;
2597 }
2598
2599 curr_status_info curr_state;
2600 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002601 char status[64];
you.chen35020192022-05-06 11:30:57 +08002602
you.chen9ac66392022-08-06 17:01:16 +08002603 memset(&ap_info, 0, sizeof (ap_info));
2604 memset(status, 0, sizeof (status));
2605
2606 curr_state.ap = &ap_info;
2607 curr_state.state = status;
2608
qs.xiong9fbf74e2023-03-28 13:38:22 +08002609 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2610 {
you.chen35020192022-05-06 11:30:57 +08002611 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002612 if (strcmp(status, STATE_COMPLETED) == 0)
2613 {
2614 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2615 }
2616 else
2617 {
2618 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2619 }
you.chen593621d2023-04-27 17:52:44 +08002620 lynq_get_connect_ap_ip(idx, info->base_info.ap_ip);
you.chen35020192022-05-06 11:30:57 +08002621 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002622 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002623 return 0;
2624 }
2625
you.chen9ac66392022-08-06 17:01:16 +08002626 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002627 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002628 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2629 {
you.chen9ac66392022-08-06 17:01:16 +08002630 if (NULL != scan_list)
2631 {
2632 free(scan_list);
2633 }
you.chen35020192022-05-06 11:30:57 +08002634 return -1;
2635 }
2636
qs.xiong9fbf74e2023-03-28 13:38:22 +08002637 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2638 {
you.chen9ac66392022-08-06 17:01:16 +08002639 if (NULL != scan_list)
2640 {
2641 free(scan_list);
2642 }
2643 if (NULL != save_list)
2644 {
2645 free(save_list);
2646 }
you.chen35020192022-05-06 11:30:57 +08002647 return -1;
2648 }
2649
qs.xiong9fbf74e2023-03-28 13:38:22 +08002650 for (i=0; i < save_len; i++)
2651 {
2652 for (j=0; j < scan_len; j++)
2653 {
you.chen35020192022-05-06 11:30:57 +08002654 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002655 && save_list[i].base_info.auth == scan_list[j].auth)
2656 {
2657 if (best_rssi == 0)
2658 {
you.chen9ac66392022-08-06 17:01:16 +08002659 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002660 best_rssi = scan_list[j].rssi;
2661 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002662 else if (best_rssi > scan_list[j].rssi)
2663 {
you.chen35020192022-05-06 11:30:57 +08002664 best_index = i;
2665 best_scan_index = j;
2666 best_rssi = scan_list[j].rssi;
2667 }
you.chend2fef3f2023-02-13 10:50:35 +08002668 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 +08002669 break;
2670 }
2671 }
2672 }
2673
qs.xiong9fbf74e2023-03-28 13:38:22 +08002674 if (best_index >= 0)
2675 {
you.chen35020192022-05-06 11:30:57 +08002676 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002677 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 +08002678 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2679 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002680 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002681 }
2682
you.chen9ac66392022-08-06 17:01:16 +08002683 if (NULL != scan_list)
2684 {
2685 free(scan_list);
2686 }
2687 if (NULL != save_list)
2688 {
2689 free(save_list);
2690 }
2691
2692 return ret;
you.chen35020192022-05-06 11:30:57 +08002693}
2694
2695static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2696{
qs.xiongc8d92a62023-03-29 17:36:14 +08002697 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002698 char lynq_ket_mgmt_cmd[64]={0};
2699 char lynq_pairwise_cmd[64]={0};
2700 char lynq_psk_cmd[64]={0};
2701
2702 CHECK_WPA_CTRL(CTRL_STA);
2703
qs.xiong9fbf74e2023-03-28 13:38:22 +08002704 switch(auth)
2705 {
2706 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002707 {
2708 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002709
you.chen35020192022-05-06 11:30:57 +08002710 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002711// DO_OK_FAIL_REQUEST(cmd_save_config);
2712 break;
2713 }
2714 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002715 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002716 {
2717 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2718 {
you.chen35020192022-05-06 11:30:57 +08002719 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2720 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002721 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2722 {
you.chena6cd55a2022-05-08 12:20:18 +08002723 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002724 }
2725 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2726 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002727
you.chen35020192022-05-06 11:30:57 +08002728 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2729 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2730 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002731
qs.xiong9fbf74e2023-03-28 13:38:22 +08002732 if (password != NULL)
2733 {
you.chen35020192022-05-06 11:30:57 +08002734 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2735 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002736 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002737 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002738
you.chen35020192022-05-06 11:30:57 +08002739// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002740 break;
2741 }
2742 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2743 {
qs.xiong3e506812023-04-06 11:08:48 +08002744 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002745 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002746 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2747 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2748
qs.xiong3e506812023-04-06 11:08:48 +08002749 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002750 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2751 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2752 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2753
2754 break;
2755 }
2756 case LYNQ_WIFI_AUTH_WPA3_PSK:
2757 {
qs.xiong3e506812023-04-06 11:08:48 +08002758 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiong03556d52023-04-17 09:45:19 +08002759 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002760 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2761 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2762
qs.xiong3e506812023-04-06 11:08:48 +08002763 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002764 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2765 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2766 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2767
2768 break;
2769 }
2770 default:
2771 return -1;
you.chen35020192022-05-06 11:30:57 +08002772 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002773
qs.xiong9fbf74e2023-03-28 13:38:22 +08002774 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002775}
qs.xiong7a105ce2022-03-02 09:43:11 -05002776
you.chen35020192022-05-06 11:30:57 +08002777static int inner_get_curr_net_no(int interface) {
2778 curr_status_info curr_state;
2779 curr_state.ap = NULL;
2780 curr_state.state = NULL;
2781
qs.xiong9fbf74e2023-03-28 13:38:22 +08002782 if (0 != inner_get_status_info(interface, &curr_state))
2783 {
you.chen35020192022-05-06 11:30:57 +08002784 return -1;
2785 }
2786
2787 return curr_state.net_no;
2788}
2789
2790int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002791{
you.chen35020192022-05-06 11:30:57 +08002792 int net_no;
2793 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002794
you.chen35020192022-05-06 11:30:57 +08002795 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002796
qs.xiong9fbf74e2023-03-28 13:38:22 +08002797 if (net_no < 0)
2798 {
you.chen35020192022-05-06 11:30:57 +08002799 return -1;
2800 }
2801
2802 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002803}
2804
you.chenb95401e2023-05-12 19:39:06 +08002805int 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 -05002806{
you.chen35020192022-05-06 11:30:57 +08002807 int count, net_no, index;
2808 int net_no_list[128];
qs.xiongf71b53b2023-05-03 13:12:07 +08002809 char rm_net_cmd[128];
you.chen35020192022-05-06 11:30:57 +08002810 lynq_wifi_auth_s net_auth;
you.chen70f377f2023-04-14 18:17:09 +08002811 curr_status_info curr_state;
2812 ap_info_s ap_info;
2813 char status[64];
qs.xiongf1b525b2022-03-31 00:58:23 -04002814
qs.xiong9fbf74e2023-03-28 13:38:22 +08002815 if (ssid == NULL || *ssid == '\0')
2816 {
2817 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002818 return -1;
2819 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002820
qs.xiong9fbf74e2023-03-28 13:38:22 +08002821 if (LYNQ_WIFI_AUTH_OPEN != auth)
2822 {
2823 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
you.chen70f377f2023-04-14 18:17:09 +08002824 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002825 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002826 return -1;
2827 }
2828 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002829
you.chen70f377f2023-04-14 18:17:09 +08002830
2831 pthread_mutex_lock(&s_global_check_mutex);
2832 if (s_sta_status != INNER_STA_STATUS_INIT)
2833 {
2834 s_sta_status = INNER_STA_STATUS_CANCEL;
2835 pthread_cond_signal(&s_global_check_cond);
2836 }
2837 pthread_mutex_unlock(&s_global_check_mutex);
2838
you.chen35020192022-05-06 11:30:57 +08002839 CHECK_IDX(idx, CTRL_STA);
you.chen70f377f2023-04-14 18:17:09 +08002840 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002841
2842 net_no = -1;
you.chen70f377f2023-04-14 18:17:09 +08002843 memset(&ap_info, 0, sizeof (ap_info));
2844 memset(status, 0, sizeof (status));
you.chen35020192022-05-06 11:30:57 +08002845
you.chen70f377f2023-04-14 18:17:09 +08002846 curr_state.ap = &ap_info;
2847 curr_state.state = status;
2848
2849 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002850 {
you.chen70f377f2023-04-14 18:17:09 +08002851 if (strcmp(status, STATE_COMPLETED) == 0 && strcmp(ap_info.ap_ssid, ssid) ==0 && ap_info.auth == auth)
2852 {
2853 net_no = curr_state.net_no;
2854 if (0 == lynq_sta_ssid_password_get(idx, &ap_info, ap_info.psw)
2855 && strcmp(ap_info.psw, psw) == 0)
2856 {
2857 RLOGD("already connected\n");
2858
2859 pthread_mutex_lock(&s_global_check_mutex);
2860 s_sta_status = INNER_STA_STATUS_CONNECTED;
2861 pthread_cond_signal(&s_global_check_cond);
2862 pthread_mutex_unlock(&s_global_check_mutex);
2863 return 0;
2864 }
you.chen35020192022-05-06 11:30:57 +08002865 }
2866 }
2867
you.chen70f377f2023-04-14 18:17:09 +08002868 if (net_no == -1)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002869 {
you.chen70f377f2023-04-14 18:17:09 +08002870 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2871
2872 for (index=0; index < count; index++)
2873 {
2874 net_auth = -1;
2875 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2876 {
2877 net_no = net_no_list[index];
2878 break;
2879 }
you.chen35020192022-05-06 11:30:57 +08002880 }
2881
you.chen70f377f2023-04-14 18:17:09 +08002882 if (net_no < 0)
2883 {
qs.xiongf71b53b2023-05-03 13:12:07 +08002884 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
2885 for ( index = 0; index < (count - STA_MAX_SAVED_AP_NUM + 1 ) ;index++) //+1 is for add new network
2886 {
2887 sprintf(rm_net_cmd,"REMOVE_NETWORK %d",net_no_list[index]);
2888 RLOGD("call cmd rm_net_cmd: %s;index is %d\n",rm_net_cmd,index);
2889 DO_OK_FAIL_REQUEST(rm_net_cmd);
2890 }
you.chen70f377f2023-04-14 18:17:09 +08002891 net_no = lynq_add_network(CTRL_STA);
2892 if (net_no == -1)
2893 {
2894 return -1;
2895 }
2896
2897 RLOGD("net no is %d\n", net_no);
2898 if (0 != inner_set_sta_ssid(net_no, ssid))
2899 {
2900 return -1;
2901 }
you.chen35020192022-05-06 11:30:57 +08002902 }
2903 }
2904
qs.xiong9fbf74e2023-03-28 13:38:22 +08002905 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2906 {
you.chen35020192022-05-06 11:30:57 +08002907 return -1;
2908 }
2909
you.chen70f377f2023-04-14 18:17:09 +08002910
2911 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen186d3c32023-05-18 14:19:46 +08002912 system("echo \"\" > /tmp/wlan0_dhcpcd_router");
you.chen70f377f2023-04-14 18:17:09 +08002913 usleep(200*1000);
2914
2915 ret = inner_sta_start_stop(net_no, 1, 1);
2916
2917 pthread_mutex_lock(&s_global_check_mutex);
2918 s_sta_status = INNER_STA_STATUS_CONNECTING;
2919 strcpy(s_sta_current_connecting_ssid, ssid);
2920 struct timeval now;
2921 gettimeofday(&now,NULL);
you.chenb95401e2023-05-12 19:39:06 +08002922 s_sta_connect_timeout.tv_sec = now.tv_sec + timeout;
you.chen70f377f2023-04-14 18:17:09 +08002923 s_sta_connect_timeout.tv_nsec = now.tv_usec*1000;
2924 pthread_cond_signal(&s_global_check_cond);
2925 pthread_mutex_unlock(&s_global_check_mutex);
2926 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002927}
2928
you.chenb95401e2023-05-12 19:39:06 +08002929int lynq_wifi_sta_connect(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw)
2930{
2931 return lynq_wifi_sta_connect_timeout(idx, ssid, auth, psw, MAX_CONNNECT_TIME);
2932}
2933
you.chen35020192022-05-06 11:30:57 +08002934int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002935{
you.chen35020192022-05-06 11:30:57 +08002936 ap_info_s ap;
2937 curr_status_info curr_state;
2938 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002939
qs.xiong9fbf74e2023-03-28 13:38:22 +08002940 if (ssid == NULL || *ssid == '\0')
2941 {
2942 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002943 return -1;
2944 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002945
you.chen35020192022-05-06 11:30:57 +08002946 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002947
you.chen35020192022-05-06 11:30:57 +08002948 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002949 curr_state.state = NULL;
2950
qs.xiong9fbf74e2023-03-28 13:38:22 +08002951 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2952 {
you.chen35020192022-05-06 11:30:57 +08002953 return 0;
2954 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002955
qs.xiong9fbf74e2023-03-28 13:38:22 +08002956 if (strcmp(ap.ap_ssid, ssid) != 0)
2957 {
you.chen35020192022-05-06 11:30:57 +08002958 return 0;
2959 }
2960
you.chen70f377f2023-04-14 18:17:09 +08002961 pthread_mutex_lock(&s_global_check_mutex);
2962 s_sta_status = INNER_STA_STATUS_DISCONNECTING;
2963 pthread_mutex_unlock(&s_global_check_mutex);
you.chen35020192022-05-06 11:30:57 +08002964 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002965}
qs.xiong97fa59b2022-04-07 05:41:29 -04002966
you.chena6cd55a2022-05-08 12:20:18 +08002967int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2968{
qs.xiongad2f89d2023-01-18 13:17:41 +08002969// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2970// const char *lynq_reconnect_cmd = "RECONNECT";
2971 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2972 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2973// 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 -05002974
you.chen35020192022-05-06 11:30:57 +08002975 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08002976 CHECK_WPA_CTRL(CTRL_STA);
2977
you.chenc9928582023-04-24 15:39:37 +08002978 ret = system_call_v("%s %s", start_stop_sta_script, "start");
2979 if (ret != 0)
qs.xiongad2f89d2023-01-18 13:17:41 +08002980 {
you.chenc9928582023-04-24 15:39:37 +08002981 RLOGE("lynq_wifi_ap_start excute script fail");
you.chen35020192022-05-06 11:30:57 +08002982 return -1;
2983 }
qs.xiong9c99fa92022-03-15 08:03:26 -04002984
qs.xiongad2f89d2023-01-18 13:17:41 +08002985 system(lynq_enable_sta_cmd);
2986 system(lynq_reconnect_cmd);
2987// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002988 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002989}
2990
you.chen6d247052023-06-01 16:39:54 +08002991static int inner_get_status_info_state (int interface, char *state) {
2992 curr_status_info curr_state;
2993 curr_state.ap = NULL;
2994 curr_state.state = state;
2995 return inner_get_status_info(interface, &curr_state);
2996}
2997
you.chen35020192022-05-06 11:30:57 +08002998int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04002999{
qs.xiongad2f89d2023-01-18 13:17:41 +08003000// char lynq_disable_network_cmd[MAX_CMD];
3001// curr_status_info curr_state;
3002// ap_info_s ap_info;
you.chen6d247052023-06-01 16:39:54 +08003003 int i=0;
3004 char state[MAX_CMD];
you.chen35020192022-05-06 11:30:57 +08003005
you.chen6d247052023-06-01 16:39:54 +08003006// 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 +08003007 CHECK_IDX(idx, CTRL_STA);
3008 CHECK_WPA_CTRL(CTRL_STA);
3009
you.chen6d247052023-06-01 16:39:54 +08003010// system(lynq_disable_sta_cmd);
3011 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chena6cd55a2022-05-08 12:20:18 +08003012 DO_OK_FAIL_REQUEST(cmd_save_config);
you.chenc9928582023-04-24 15:39:37 +08003013
3014 ret = system_call_v("%s %s", start_stop_sta_script, "stop");
3015 if (ret != 0)
3016 {
3017 RLOGE("lynq_wifi_ap_start excute script fail");
3018 return -1;
3019 }
3020
you.chen6d247052023-06-01 16:39:54 +08003021 for (i=0; i < 30; i++) // to check if sta is realy stoped
3022 {
3023 if (inner_get_status_info_state(idx, state) != 0)
3024 {
3025 break;
3026 }
3027
3028 if (memcmp(state, STATE_DISCONNECTED, strlen (STATE_DISCONNECTED)) == 0)
3029 {
3030 break;
3031 }
3032 RLOGD("lynq_wifi_ap_start curr state %s", state);
3033 usleep(SLEEP_TIME_ON_IDLE);
3034 }
3035
you.chena6cd55a2022-05-08 12:20:18 +08003036 return 0;
3037// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04003038}
qs.xiong7a105ce2022-03-02 09:43:11 -05003039
you.chen35020192022-05-06 11:30:57 +08003040//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
3041// int i, count;
3042// char *p;
3043// const char * FLAG_SSID = "ssid=";
3044// const char * FLAG_SBSID = "bssid=";
3045// const char * FLAG_KEY_MGMT = "key_mgmt=";
3046// const char * FLAG_FREQ = "freq=";
3047// char lynq_sta_cmd[MAX_CMD];
3048// char *split_lines[128] = {0};
3049
3050// CHECK_WPA_CTRL(CTRL_AP);
3051
3052// sprintf(lynq_sta_cmd, "STA %s", bssid);
3053
3054// DO_REQUEST(lynq_sta_cmd);
3055
3056// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3057
3058// for(i=0; i < count; i++) {
3059// p = strstr(split_lines[i], FLAG_SSID);
3060// if (p != NULL) {
3061// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
3062// continue;
3063// }
3064// }
3065
3066// lynq_get_interface_ip(idx, ap->ap_ip);
3067// lynq_ap_password_set(idx, ap->psw);
3068
3069// return 0;
3070//}
3071
3072static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
3073 curr_status_info curr_state;
3074 curr_state.ap = ap;
3075 curr_state.state = NULL;
3076 return inner_get_status_info(interface, &curr_state);
3077}
3078
3079int 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 -04003080{
you.chend2fef3f2023-02-13 10:50:35 +08003081 int index, line_count;
3082 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08003083 const char *lynq_first_sta_cmd = "STA-FIRST";
3084 char lynq_next_sta_cmd[MAX_CMD];
3085 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08003086 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04003087
you.chen35020192022-05-06 11:30:57 +08003088 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04003089
you.chen35020192022-05-06 11:30:57 +08003090 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04003091
you.chenb95401e2023-05-12 19:39:06 +08003092 // ap_info_s * tmp_ap;
3093 // device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003094 if (ap == NULL || list == NULL || len == NULL)
3095 {
3096 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08003097 return -1;
3098 }
3099
you.chenb95401e2023-05-12 19:39:06 +08003100 // ap = &tmp_ap;
3101 // list = &tmp_list;
you.chen35020192022-05-06 11:30:57 +08003102 *ap = malloc(sizeof (ap_info_s));
you.chenb95401e2023-05-12 19:39:06 +08003103 memset(*ap, 0, sizeof (ap_info_s));
you.chen35020192022-05-06 11:30:57 +08003104
you.chenb95401e2023-05-12 19:39:06 +08003105 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0 || (*ap)->ap_ssid[0] == '\0')
qs.xiong9fbf74e2023-03-28 13:38:22 +08003106 {
you.chenb95401e2023-05-12 19:39:06 +08003107 RLOGE("inner_get_status_info_ap !=0 or ap_ssid is empty\n");
you.chen35020192022-05-06 11:30:57 +08003108 return -1;
3109 }
3110
3111 lynq_get_interface_ip(idx, (*ap)->ap_ip);
3112 lynq_ap_password_get(idx, (*ap)->psw);
3113
you.chen35020192022-05-06 11:30:57 +08003114 DO_REQUEST(lynq_first_sta_cmd);
3115
3116 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003117 while (reply_len > 0)
3118 {
3119 if (memcmp(cmd_reply, "FAIL", 4) == 0)
you.chenb95401e2023-05-12 19:39:06 +08003120 {
you.chen35020192022-05-06 11:30:57 +08003121 break;
3122 }
3123 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3124 bssid[index] = malloc(strlen(split_lines[0]) + 1);
3125 strcpy(bssid[index], split_lines[0]);
3126 index++;
3127 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
3128 reply_len = MAX_RET;
3129 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08003130 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 +08003131 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
you.chenb95401e2023-05-12 19:39:06 +08003132 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003133 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08003134 break;
3135 }
3136 }
3137
3138 *len = index;
3139
3140 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08003141 for (index=0; index < *len; index++)
3142 {
you.chend2fef3f2023-02-13 10:50:35 +08003143 dev_info = &(*list)[index];
3144 memset(dev_info, 0, sizeof(device_info_s));
3145 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
3146 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
3147 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
3148 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08003149 free(bssid[index]);
3150 }
3151
3152 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003153}
3154
you.chen35020192022-05-06 11:30:57 +08003155int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04003156{
you.chen35020192022-05-06 11:30:57 +08003157 int i, count, index, count_words;
3158 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
3159 char *split_lines[128] = {0};
3160 char *split_words[128] = {0};
3161 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04003162
qs.xiong9fbf74e2023-03-28 13:38:22 +08003163 if (list == NULL || len == NULL)
3164 {
you.chen35020192022-05-06 11:30:57 +08003165 return -1;
3166 }
qs.xiong97fa59b2022-04-07 05:41:29 -04003167
you.chen9ac66392022-08-06 17:01:16 +08003168 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
3169 {
3170 usleep(100 * 1000);
3171 }
3172
you.chen35020192022-05-06 11:30:57 +08003173 CHECK_IDX(idx, CTRL_STA);
3174
3175 CHECK_WPA_CTRL(CTRL_STA);
3176
3177 DO_REQUEST(lynq_scan_result_cmd);
3178
3179 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3180 *len = count - 1;
3181 *list = malloc(sizeof (scan_info_s) * *len);
3182
3183 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08003184 for (index=0; index <count_words; index++)
3185 {
3186 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08003187 }
3188
qs.xiong9fbf74e2023-03-28 13:38:22 +08003189 for(index = 1;index < count; index++)
3190 {
3191 RLOGD("---- %s\n",split_lines[index]);
you.chen6ed36a62023-04-27 17:51:56 +08003192 memset(split_words, 0 , sizeof (split_words));
you.chen35020192022-05-06 11:30:57 +08003193 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
3194 if (count_words < 4)
3195 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003196 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08003197 //bssid / frequency / signal level / flags / ssid
3198 p = (*list) + index - 1;
3199 strcpy(p->mac, split_words[0]);
3200 p->band = convert_band_from_freq(atoi(split_words[1]));
3201 p->rssi = -1 * atoi( split_words[2]);
3202 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chen6ed36a62023-04-27 17:51:56 +08003203 if (count_words == 4) // ssid hided
3204 {
3205 p->ssid[0] = '\0';
3206 }
3207 else
3208 {
3209 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
3210 }
you.chen35020192022-05-06 11:30:57 +08003211 }
3212
3213 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003214}
qs.xiong97fa59b2022-04-07 05:41:29 -04003215
you.chen35020192022-05-06 11:30:57 +08003216int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
3217{
3218 int count, net_no, index;
3219 int net_no_list[128];
3220 lynq_wifi_auth_s net_auth;
3221 char lynq_remove_cmd[MAX_CMD];
3222
qs.xiong9fbf74e2023-03-28 13:38:22 +08003223 if (ssid == NULL || *ssid == '\0')
3224 {
3225 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08003226 return -1;
3227 }
3228
3229 CHECK_IDX(idx, CTRL_STA);
3230
3231 CHECK_WPA_CTRL(CTRL_STA);
3232
3233 net_no = -1;
3234 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
3235
qs.xiong9fbf74e2023-03-28 13:38:22 +08003236 for (index=0; index < count; index++)
3237 {
you.chen35020192022-05-06 11:30:57 +08003238 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003239 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
3240 {
you.chen35020192022-05-06 11:30:57 +08003241 net_no = net_no_list[index];
3242 break;
3243 }
3244 }
3245
qs.xiong9fbf74e2023-03-28 13:38:22 +08003246 if (net_no < 0)
3247 {
you.chen35020192022-05-06 11:30:57 +08003248 return 0;
3249 }
3250
3251 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
3252
3253 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
3254 DO_OK_FAIL_REQUEST(cmd_save_config);
3255
3256 return 0;
3257}
3258
3259int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003260{
you.chend2fef3f2023-02-13 10:50:35 +08003261 int count, index;
you.chen35020192022-05-06 11:30:57 +08003262 int net_no_list[128];
3263 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003264 RLOGD("enter lynq_get_sta_saved_ap api\n");
3265 if (list == NULL || len == NULL)
3266 {
3267 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08003268 return -1;
3269 }
3270
3271 CHECK_IDX(idx, CTRL_STA);
3272
3273// CHECK_WPA_CTRL(CTRL_STA);
3274
3275 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003276 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08003277
you.chen057aac42023-04-13 14:06:58 +08003278 if (count < 0)
3279 {
3280 RLOGE("list network fail");
3281 return count;
3282 }
3283 else if (count == 0)
3284 {
3285 *list = NULL;
3286 *len = 0;
3287 return 0;
3288 }
3289
you.chen35020192022-05-06 11:30:57 +08003290 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08003291 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08003292 *len = count;
3293
qs.xiong9fbf74e2023-03-28 13:38:22 +08003294 for (index=0; index < count; index++)
3295 {
you.chen35020192022-05-06 11:30:57 +08003296 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
you.chen35020192022-05-06 11:30:57 +08003297 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
you.chen35020192022-05-06 11:30:57 +08003298 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003299 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
you.chen057aac42023-04-13 14:06:58 +08003300 {
you.chen35020192022-05-06 11:30:57 +08003301 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
3302 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003303 else
you.chen057aac42023-04-13 14:06:58 +08003304 {
you.chen35020192022-05-06 11:30:57 +08003305 (*list)[index].base_info.band = -1;
3306 }
you.chen057aac42023-04-13 14:06:58 +08003307 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08003308 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08003309 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003310 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08003311 return 0;
3312}
3313
3314int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
3315{
qs.xiongc8d92a62023-03-29 17:36:14 +08003316 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08003317 const char *lynq_scan_cmd = "SCAN";
3318
3319 CHECK_IDX(idx, CTRL_STA);
3320
3321 CHECK_WPA_CTRL(CTRL_STA);
3322
you.chen0df3e7e2023-05-10 15:56:26 +08003323 if (g_sta_scan_finish_flag == 1 && s_sta_status == INNER_STA_STATUS_INIT) // temp add
3324 {
3325 RLOGD("tmp clear scanlist");
3326 system(clean_last_re);
3327 }
you.chen9ac66392022-08-06 17:01:16 +08003328 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08003329 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003330 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
3331 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003332 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003333 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
3334 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003335 g_sta_scan_finish_flag = 1;
3336 return -1;
3337 }
you.chen35020192022-05-06 11:30:57 +08003338
3339 return 0;
3340}
3341
3342int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003343 if (cb == NULL)
3344 {
3345 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003346 return -1;
3347 }
3348
you.chen6d247052023-06-01 16:39:54 +08003349 pthread_mutex_lock(&s_ap_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003350 g_ap_callback_priv = priv;
3351 g_ap_callback_func = cb;
you.chen6d247052023-06-01 16:39:54 +08003352 pthread_mutex_unlock(&s_ap_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003353
you.chen6d247052023-06-01 16:39:54 +08003354 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chene9d00032023-04-24 13:55:29 +08003355 if (g_ap_watcher_pid == 0 )
3356 {
3357 if(pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL) < 0)
3358 {
3359 g_ap_watcher_pid = 0;
3360 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3361 RLOGE("[wifi error]creat APWatcherThreadProc fail");
3362 return -1;
3363 }
3364 }
3365
3366 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3367 RLOGD("creat APWatcherTheradProc susccs");
3368
you.chen35020192022-05-06 11:30:57 +08003369 return 0;
3370}
3371
3372int lynq_unreg_ap_event_callback(void * priv) {
you.chen6d247052023-06-01 16:39:54 +08003373 pthread_mutex_lock(&s_ap_callback_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003374 if (g_ap_callback_priv == priv)
3375 {
you.chen35020192022-05-06 11:30:57 +08003376 g_ap_callback_func = NULL;
3377 g_ap_callback_priv = NULL;
you.chen6d247052023-06-01 16:39:54 +08003378 pthread_mutex_unlock(&s_ap_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003379 return 0;
3380 }
you.chen6d247052023-06-01 16:39:54 +08003381 pthread_mutex_unlock(&s_ap_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003382 return -1;
3383}
3384
3385int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08003386 if (cb == NULL)
3387 {
3388 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003389 return -1;
3390 }
3391
you.chen6d247052023-06-01 16:39:54 +08003392 pthread_mutex_lock(&s_sta_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003393 g_sta_callback_priv = priv;
3394 g_sta_callback_func = cb;
you.chen6d247052023-06-01 16:39:54 +08003395 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003396
you.chen6d247052023-06-01 16:39:54 +08003397 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chene9d00032023-04-24 13:55:29 +08003398 if (g_sta_watcher_pid == 0 ) {
3399 if(pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL) < 0)
3400 {
3401 g_sta_watcher_pid = 0;
3402 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3403 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
3404 return -1;
3405 }
3406 }
3407
3408 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3409 RLOGD("creat STAWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +08003410 return 0;
3411}
3412
3413int lynq_unreg_sta_event_callback(void * priv) {
you.chen6d247052023-06-01 16:39:54 +08003414 pthread_mutex_lock(&s_sta_callback_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003415 if (g_sta_callback_priv == priv)
3416 {
you.chen35020192022-05-06 11:30:57 +08003417 g_sta_callback_func = NULL;
3418 g_sta_callback_priv = NULL;
you.chen6d247052023-06-01 16:39:54 +08003419 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003420 return 0;
3421 }
you.chen6d247052023-06-01 16:39:54 +08003422 pthread_mutex_unlock(&s_sta_callback_mutex);
you.chen35020192022-05-06 11:30:57 +08003423 return -1;
3424}
3425
you.chen35020192022-05-06 11:30:57 +08003426int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
3427{
3428 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003429 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08003430 CHECK_IDX(idx, CTRL_AP);
3431
qs.xiong9fbf74e2023-03-28 13:38:22 +08003432 if (inner_get_status_info_state(CTRL_AP, state) != 0)
3433 {
you.chen35020192022-05-06 11:30:57 +08003434 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3435 return 0;
3436 }
3437
qs.xiong9fbf74e2023-03-28 13:38:22 +08003438 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3439 {
you.chen35020192022-05-06 11:30:57 +08003440 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
3441 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003442 else
3443 {
you.chen35020192022-05-06 11:30:57 +08003444 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3445 }
3446
3447 return 0;
3448}
3449
3450int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
3451 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003452 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08003453 CHECK_IDX(idx, CTRL_STA);
3454
qs.xiong9fbf74e2023-03-28 13:38:22 +08003455 if (inner_get_status_info_state(CTRL_STA, state) != 0)
3456 {
you.chen35020192022-05-06 11:30:57 +08003457 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3458 return 0;
3459 }
3460
qs.xiong9fbf74e2023-03-28 13:38:22 +08003461 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3462 {
you.chen35020192022-05-06 11:30:57 +08003463 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
3464 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003465 else
3466 {
you.chen35020192022-05-06 11:30:57 +08003467 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3468 }
3469
3470 return 0;
3471}
3472
3473int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
3474// CHECK_IDX(idx, CTRL_AP);
3475// int ret = 0;
3476// size_t reply_len = MAX_RET;
3477// char cmd_reply[MAX_RET]={0};
3478// const char * cmd_str = "GET country";
3479// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
3480// do{
3481// if (NULL == s_lynq_wpa_ctrl) {
3482// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
3483// if (NULL == s_lynq_wpa_ctrl ) {
3484// printf("wpa_ctrl_open fail\n");
3485// return -1;
3486// }
3487// }
3488// }while(0);
3489
3490// do {
3491// reply_len = MAX_RET;
3492// cmd_reply[0] = '\0';
3493// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08003494// 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 +08003495// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003496// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08003497// return ret;
3498// }
3499// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08003500// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08003501// }while(0);
3502
3503 FILE *fp;
3504 size_t i = 0;
3505 char lynq_cmd_ret[MAX_RET]={0};
3506
3507// CHECK_IDX(idx, CTRL_AP);
3508
3509 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003510 {
3511 perror("popen error!");
3512 return -1;
3513 }
you.chen35020192022-05-06 11:30:57 +08003514 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
3515 {
3516 perror("fread fail!");
3517 return -1;
3518 }
3519
qs.xiong9fbf74e2023-03-28 13:38:22 +08003520 for(i=0; i < strlen(lynq_cmd_ret); i++)
3521 {
3522 if (lynq_cmd_ret[i] == ' ')
3523 {
you.chen35020192022-05-06 11:30:57 +08003524 lynq_cmd_ret[i] = '\0';
3525 break;
3526 }
3527 }
3528
3529 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003530 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08003531
3532 int ret=pclose(fp);
3533 if(ret==-1)
3534 {
3535 perror("close file faild");
3536 }
3537
3538 return 0;
3539}
3540
you.chen705a7ef2023-06-01 22:06:45 +08003541static int check_and_init_uci_config(char * country_code)
3542{
3543 FILE * fp;
3544 int is_different = 0;
3545 const char * check_uci_cmd ="uci show | grep lynq_wifi_country_code";
3546 const char * create_uci_cmd ="uci set lynq_uci.lynq_wifi_country_code='lynq_wifi_country_code'";
3547 const char * commit_uci_cmd ="uci commit";
3548 char set_country_cmd[MAX_CMD];
3549 char lynq_cmd_ret[MAX_CMD]={0};
xj3df9fd82023-06-01 20:50:02 +08003550
you.chen705a7ef2023-06-01 22:06:45 +08003551 sprintf(set_country_cmd, "uci set lynq_uci.lynq_wifi_country_code.code='%s'",country_code);
qs.xiong62034bf2023-06-01 19:23:13 +08003552
you.chen705a7ef2023-06-01 22:06:45 +08003553 if (0 != system(check_uci_cmd))
qs.xiong62034bf2023-06-01 19:23:13 +08003554 {
you.chen705a7ef2023-06-01 22:06:45 +08003555 if (0 != system(create_uci_cmd))
3556 {
3557 RLOGE("creat_uci_cmd fail");
3558 return -1;
3559 }
3560 is_different = 1;
3561 }
3562
3563 if((fp=popen("uci get lynq_uci.lynq_wifi_country_code.code","r"))==NULL)
3564 {
3565 RLOGE("popen error!");
qs.xiong62034bf2023-06-01 19:23:13 +08003566 return -1;
3567 }
3568
you.chen705a7ef2023-06-01 22:06:45 +08003569 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0 )
qs.xiong62034bf2023-06-01 19:23:13 +08003570 {
you.chen705a7ef2023-06-01 22:06:45 +08003571 RLOGE("fread fail!");
3572 fclose(fp);
3573 return -1;
qs.xiong62034bf2023-06-01 19:23:13 +08003574 }
3575
you.chen705a7ef2023-06-01 22:06:45 +08003576 if ( strncmp(lynq_cmd_ret,country_code,2) != 0 )
3577 {
3578 RLOGE("get country code for uci %s,input cpuntry code is:%s\n",lynq_cmd_ret,country_code);
3579 is_different = 1;
3580 }
3581
3582 fclose(fp);
3583
3584 if (is_different)
3585 {
3586 if ( 0 != system(set_country_cmd))
3587 {
3588 RLOGE("set_country_cmd fail");
3589 return -1;
3590 }
3591 if (0 != system(commit_uci_cmd))
3592 {
3593 RLOGE("commmit fail");
3594 }
3595 }
3596
3597 return is_different;
3598}
3599
3600int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
3601 char check_current_code[10];
3602 const char * support_country[] = {"CN", "EU"};
3603
3604 int ret,is_different, i, cc_count;
3605
3606 if (country_code == NULL || country_code[0] == '\0')
3607 {
3608 RLOGE("bad country code\n");
3609 return -1;
3610 }
3611
3612 cc_count = sizeof (support_country) / sizeof (char*);
3613 for(i=0; i < cc_count; i++)
3614 {
3615 if (strcmp(support_country[i], country_code) == 0)
3616 {
3617 break;
3618 }
3619 }
3620
3621 if (i >= cc_count)
3622 {
3623 RLOGE("unspported country code %s\n", country_code);
3624 return -1;
3625 }
3626
3627 is_different = check_and_init_uci_config(country_code);
3628 if( is_different < 0 )
3629 {
3630 RLOGE("init set uci fail\n");
3631 return -1;
3632 }
3633
3634 ret = lynq_get_country_code(idx,check_current_code);
3635 if( ret == 0 && (is_different == 1 || strcmp(check_current_code, country_code) != 0))
3636 {
3637 ret = lynq_wifi_disable();
3638 if(ret != 0 )
3639 {
3640 RLOGE("berfore set country,find bcmdhd insmod,remod fail\n");
3641 return -1;
3642 }
3643 }
3644
3645 return 0;
you.chen35020192022-05-06 11:30:57 +08003646}
3647
3648int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
3649{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003650 RLOGD("enter lynq_get_connect_ap_mac\n");
3651 if (mac == NULL)
3652 {
3653 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08003654 return -1;
3655 }
3656
3657 CHECK_IDX(idx, CTRL_STA);
3658 ap_info_s ap;
3659 ap.ap_mac[0] = '\0';
3660
qs.xiong9fbf74e2023-03-28 13:38:22 +08003661 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3662 {
you.chen35020192022-05-06 11:30:57 +08003663 return -1;
3664 }
3665 strcpy(mac, ap.ap_mac);
3666
3667 return 0;
3668}
3669
3670int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
3671{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003672 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08003673 struct ifaddrs *ifaddr_header, *ifaddr;
3674 struct in_addr * ifa;
3675 const char * ifaName = "wlan0";
3676 if (ip == NULL)
3677 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003678 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08003679 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003680 }
you.chenf58b3c92022-06-21 16:53:48 +08003681
qs.xiong9fbf74e2023-03-28 13:38:22 +08003682 if (idx == 1)
3683 {
you.chen0df3e7e2023-05-10 15:56:26 +08003684 ifaName = inner_get_ap_interface_name();
3685 if (ifaName == NULL)
3686 {
3687 RLOGE("[lynq_get_interface_ip] ap name get fail");
3688 return -1;
3689 }
you.chen9ac66392022-08-06 17:01:16 +08003690 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003691 else if (idx != 0)
3692 {
you.chen35020192022-05-06 11:30:57 +08003693 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003694 }
you.chen35020192022-05-06 11:30:57 +08003695
you.chen9ac66392022-08-06 17:01:16 +08003696 if (getifaddrs(&ifaddr_header) == -1)
3697 {
you.chen35020192022-05-06 11:30:57 +08003698 perror("getifaddrs");
3699 return -1;
3700 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08003701 }
you.chen35020192022-05-06 11:30:57 +08003702
3703
you.chen9ac66392022-08-06 17:01:16 +08003704 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3705 {
3706 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08003707 continue;
you.chen9ac66392022-08-06 17:01:16 +08003708 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3709 {
3710 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3711 {
3712 // is a valid IP4 Address
3713 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3714 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003715 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08003716 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003717 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08003718 return 0;
3719 }
3720 }
3721 }
qs.xiongc4f007c2023-02-08 18:16:58 +08003722 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003723 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08003724 return -1;
you.chen35020192022-05-06 11:30:57 +08003725}
3726
3727int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3728{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003729 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08003730 int count;
3731 size_t i;
3732 char *split_words[128] = {0};
3733 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3734
3735 CHECK_WPA_CTRL(idx);
3736
3737 DO_REQUEST(lynq_get_mac_cmd);
3738
qs.xiong9fbf74e2023-03-28 13:38:22 +08003739 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3740 {
3741 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08003742 return -1;
3743 }
3744
3745 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3746
qs.xiong9fbf74e2023-03-28 13:38:22 +08003747 if (count < 2)
3748 {
you.chen35020192022-05-06 11:30:57 +08003749 return -1;
3750 }
3751
qs.xiong9fbf74e2023-03-28 13:38:22 +08003752 for (i=0; i < strlen(split_words[1]); i++ )
3753 {
3754 if (split_words[1][i] != ' ')
3755 {
you.chen35020192022-05-06 11:30:57 +08003756 break;
3757 }
3758 }
3759
3760 strcpy(mac, split_words[1] + i);
3761
3762 return 0;
3763}
3764
3765int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3766{
3767// int count;
3768// char *split_words[128] = {0};
3769// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3770
3771// if (rssi == NULL) {
3772// return -1;
3773// }
3774
3775// CHECK_IDX(idx, CTRL_STA);
3776
3777// CHECK_WPA_CTRL(CTRL_STA);
3778
3779// DO_REQUEST(lynq_get_rssi_cmd);
3780
3781// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3782// return -1;
3783// }
3784
3785// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3786
3787// if (count < 2) {
3788// return -1;
3789// }
3790
3791// *rssi = atoi(split_words[1]) * -1;
3792
you.chen35020192022-05-06 11:30:57 +08003793 char lynq_cmd_ret[MAX_RET]={0};
3794
qs.xiongff0ae0f2022-10-11 15:47:14 +08003795/*******change other cmd to get rssi*******
3796 *
3797 *wl rssi ---> wl -i wlan0 rssi
3798 *
3799 ***** change by qs.xiong 20221011*******/
you.chen23c4a5f2023-04-12 16:46:00 +08003800 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiong9fbf74e2023-03-28 13:38:22 +08003801 {
you.chen23c4a5f2023-04-12 16:46:00 +08003802 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen35020192022-05-06 11:30:57 +08003803 return -1;
3804 }
you.chen9f17e4d2022-06-06 17:18:18 +08003805 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003806/****** if got rssi is 0,means sta didn't connected any device****/
3807 if(*rssi == 0)
3808 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003809 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chen23c4a5f2023-04-12 16:46:00 +08003810 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003811 }
you.chen35020192022-05-06 11:30:57 +08003812
3813 return 0;
3814}
3815
3816int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3817{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003818 RLOGD("enter lynq_get_connect_ap_band\n");
3819 if (band == NULL)
3820 {
you.chen35020192022-05-06 11:30:57 +08003821 return -1;
3822 }
3823
3824 CHECK_IDX(idx, CTRL_STA);
3825 ap_info_s ap;
3826 ap.band = -1;
3827
qs.xiong9fbf74e2023-03-28 13:38:22 +08003828 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3829 {
you.chen35020192022-05-06 11:30:57 +08003830 return -1;
3831 }
3832 *band = ap.band;
3833
3834 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003835}
you.chenf58b3c92022-06-21 16:53:48 +08003836
3837int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3838{
you.chenb95401e2023-05-12 19:39:06 +08003839 int ret;
3840 char *p;
qs.xionge4cbf1c2023-02-28 18:22:49 +08003841 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003842
3843 if (ip == NULL)
3844 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003845 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003846 return -1;
3847 }
3848
3849 CHECK_IDX(idx, CTRL_STA);
3850
qs.xionge4cbf1c2023-02-28 18:22:49 +08003851 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003852 {
3853 return -1;
3854 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003855
you.chenb95401e2023-05-12 19:39:06 +08003856 ip[0] = '\0';
3857 ret = inner_get_ip_by_mac(bssid, ip, 32); //better input by user
3858 if (ret != 0)
3859 {
3860 RLOGE("[lynq_get_connect_ap_ip] inner_get_ip_by_mac return fail");
3861 return -1;
3862 }
3863
3864 if (ip[0] == '\0' || strchr(ip, ':') != NULL) //temp change, not ok
3865 {
3866 ip[0] = '\0';
you.chen186d3c32023-05-18 14:19:46 +08003867 ret = exec_cmd("grep \"new_router\" /tmp/wlan0_dhcpcd_router | awk '{print $2}'| tail -1", ip, 32);
you.chenb95401e2023-05-12 19:39:06 +08003868 if (ret != 0)
3869 {
3870 ip[0] = '\0';
3871 return 0;
3872 }
3873 else
3874 {
3875 p = strchr(ip, '\n');
3876 if (p != NULL)
3877 {
3878 *p = '\0';
3879 }
3880 }
3881 }
3882 return 0;
you.chenf58b3c92022-06-21 16:53:48 +08003883}
3884
qs.xiong026c5c72022-10-17 11:15:45 +08003885int lynq_ap_connect_num(int sta_number)
3886{
3887 char lynq_limit_cmd[32]={0};
3888 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003889 if((sta_number < 1 ) && (sta_number > 15))
3890 {
3891 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003892 return -1;
3893 }
3894 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3895 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003896 if(ret != 0)
3897 {
3898 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003899 }
3900 return 0;
3901}
you.chenf58b3c92022-06-21 16:53:48 +08003902
qs.xiong77905552022-10-17 11:19:57 +08003903int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3904{
3905
3906 char lynq_wifi_acs_cmd[128]={0};
3907 char lynq_cmd_mode[128]={0};
3908 char lynq_cmd_slect[128]={0};
3909
qs.xiong9fbf74e2023-03-28 13:38:22 +08003910 if((acs_mode != 2) && (acs_mode != 5))
3911 {
qs.xiong77905552022-10-17 11:19:57 +08003912 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3913 }
3914
qs.xiong9fbf74e2023-03-28 13:38:22 +08003915 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3916 {
qs.xiong77905552022-10-17 11:19:57 +08003917 return -1;
3918 }
3919
3920 CHECK_IDX(idx, CTRL_AP);
3921
3922 CHECK_WPA_CTRL(CTRL_AP);
3923
3924 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3925 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3926 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3927
3928 DO_OK_FAIL_REQUEST(cmd_disconnect);
3929 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3930 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3931 DO_OK_FAIL_REQUEST(cmd_save_config);
3932 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3933
3934 return 0;
3935}
you.chen0f5c6432022-11-07 18:31:14 +08003936//you.chen add for tv-box start
3937static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3938 FILE *fp;
3939 //printf("to exec cmd:%s\n", str_cmd);
3940 if((fp=popen(str_cmd,"r"))==NULL)
3941 {
3942 perror("popen error!");
3943 return -1;
3944 }
3945 if((fread(str_cmd_ret,max_len,1,fp))<0)
3946 {
3947 perror("fread fail!");
3948 fclose(fp);
3949 return -1;
3950 }
3951 fclose(fp);
3952 return 0;
3953}
3954
3955static int get_netmask_length(const char* mask)
3956{
3957 int masklen=0, i=0;
3958 int netmask=0;
3959
3960 if(mask == NULL)
3961 {
3962 return 0;
3963 }
3964
3965 struct in_addr ip_addr;
3966 if( inet_aton(mask, &ip_addr) )
3967 {
3968 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003969 }else
3970 {
you.chen0f5c6432022-11-07 18:31:14 +08003971 netmask = 0;
3972 return 0;
3973 }
3974
3975 while(0 == (netmask & 0x01) && i<32)
3976 {
3977 i++;
3978 netmask = netmask>>1;
3979 }
3980 masklen = 32-i;
3981 return masklen;
3982}
3983
3984static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3985 int mask_len;
3986 char *p;
3987 char tmp[64] = {0};
you.chenc9928582023-04-24 15:39:37 +08003988 sprintf(tmp, "ifconfig %s | grep Mask", s_ap_iterface_name);
3989 if (exec_cmd(tmp, str_cmd_ret, max_len) != 0)
you.chen0f5c6432022-11-07 18:31:14 +08003990 return -1;
3991 p = strstr(str_cmd_ret, "Mask:");
3992 if (p == NULL)
3993 return -1;
3994 mask_len = get_netmask_length(p + 5);
3995 if (mask_len == 0)
3996 return -1;
3997 p = strstr(str_cmd_ret, "inet addr:");
3998 if (p == NULL)
3999 return -1;
4000 strcpy(tmp, p + 10);
4001 p = strstr(tmp, " ");
4002 if (p != NULL)
4003 *p = '\0';
4004 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
4005 return 0;
4006}
4007
4008static void GBWWatchThreadProc() {
4009 int i,n, nloop, nmax, ncheckcount, nidlecount;
4010 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
4011 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
4012 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
4013 char *results[16] = {0};
4014 char str_cmd[256] = {0};
4015 char str_cmd_ret[128] = {0};
4016 char dest_ip[32] = {0};
4017 lastAP1Bytes = lastAP2Bytes = 0;
4018 lastAP1Drop = lastAP2Drop = 0;
4019 lastAP1Speed = lastAP2Speed = 0;
4020 setAP1Speed = 50;
4021 setAP2Speed = 80;
4022 nloop = 0;
4023 nmax = 6;
4024 ncheckcount = nidlecount = 0;
4025
you.chen0df3e7e2023-05-10 15:56:26 +08004026 if (inner_get_ap_interface_name() == NULL)
you.chenc9928582023-04-24 15:39:37 +08004027 {
4028 RLOGE("------gbw thread run\n");
4029 return;
4030 }
4031
qs.xiong9fbf74e2023-03-28 13:38:22 +08004032 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08004033 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
4034 while (dest_ip[0] == '\0') {
4035 sleep(1);
4036 str_cmd_ret[0] = '\0';
4037 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
4038 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
4039 if (str_cmd_ret[n] == '\n'){
4040 str_cmd_ret[n] = '\0';
4041 break;
4042 }
4043 }
4044 if (str_cmd_ret[0] != '\0')
4045 {
4046 strcpy(dest_ip, str_cmd_ret);
4047 }
4048 }
4049
you.chenc9928582023-04-24 15:39:37 +08004050 system_call_v("tc qdisc del dev %s root > /dev/null 2>&1", s_ap_iterface_name);
4051 system_call_v("tc qdisc add dev %s root handle 1: htb r2q 1", s_ap_iterface_name);
4052 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 +08004053 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
4054 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08004055 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08004056 return;
4057 }
you.chenc9928582023-04-24 15:39:37 +08004058 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);
4059 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);
4060 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 +08004061
4062 while (1) {
4063 sleep(1);
4064 memset(str_cmd, 0, sizeof(str_cmd));
you.chenc9928582023-04-24 15:39:37 +08004065 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
4066 sprintf(str_cmd, "tc -s class show dev %s classid 1:1 | grep Sent", s_ap_iterface_name);
4067 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen0f5c6432022-11-07 18:31:14 +08004068 continue;
4069 //printf("ap1 --- %s\n", str_cmd);
you.chenc9928582023-04-24 15:39:37 +08004070 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen0f5c6432022-11-07 18:31:14 +08004071 if (n > 9) {
4072 if (strcmp(results[1], "Sent") == 0) {
4073 currAP1Bytes = atoll(results[2]);
4074 }
4075 if (strcmp(results[6], "(dropped") == 0) {
4076 currAP1Drop = atoi(results[7]);
4077 }
4078 }
4079
4080 memset(str_cmd, 0, sizeof(str_cmd));
you.chenc9928582023-04-24 15:39:37 +08004081 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
4082 sprintf(str_cmd, "tc -s class show dev %s classid 1:2 | grep Sent", s_ap_iterface_name);
4083 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen0f5c6432022-11-07 18:31:14 +08004084 continue;
4085 //printf("ap2 --- %s\n", str_cmd);
you.chenc9928582023-04-24 15:39:37 +08004086 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen0f5c6432022-11-07 18:31:14 +08004087 if (n > 9) {
4088 if (strcmp(results[1], "Sent") == 0) {
4089 currAP2Bytes = atoll(results[2]);
4090 }
4091 if (strcmp(results[6], "(dropped") == 0) {
4092 currAP2Drop = atoi(results[7]);
4093 }
4094 }
4095
4096 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
4097 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
4098 lastAP1Bytes = currAP1Bytes;
4099 lastAP2Bytes = currAP2Bytes;
4100 continue;
4101 }
4102
4103 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
4104 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
4105 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
4106 lastAP1Speed = currAP1Speed;
4107 lastAP2Speed = currAP2Speed;
4108 lastAP1Bytes = currAP1Bytes;
4109 lastAP2Bytes = currAP2Bytes;
4110
4111 currSetAP1Speed = setAP1Speed;
4112 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
4113 ncheckcount++;
4114 if (ncheckcount > 3) {
4115 ncheckcount = 0;
4116 currSetAP1Speed = 5;
4117 }
4118 }
4119 else {
4120 ncheckcount = 0;
4121 if (currAP1Speed < 5)
4122 nidlecount++;
4123 else
4124 nidlecount = 0;
4125
4126 }
4127
4128 if (nidlecount > 60 ){
4129 currSetAP1Speed = 50;
4130 }
4131
4132 if (currSetAP1Speed != setAP1Speed) {
4133 setAP1Speed = currSetAP1Speed;
you.chenc9928582023-04-24 15:39:37 +08004134 system_call_v(str_cmd, "tc class replace dev %s parent 1: classid 1:1 htb rate %dMbit ceil %dMbit prio 2 quantum 3000",
4135 s_ap_iterface_name, setAP1Speed, (int)(setAP1Speed*1.4));
you.chen0f5c6432022-11-07 18:31:14 +08004136 }
4137 }
4138}
4139
4140int enableGBW(const char* mac) {
4141 int i,len;
4142 char get_ipaddr_cmd[128]={0};
4143 ap_info_s *ap;
4144 device_info_s * list;
4145
4146 if (mac == NULL || g_gbw_enabled == 1)
4147 return -1;
4148 len = strlen(mac);
4149 g_gbw_mac = malloc(len + 1);
4150 for(i=0;i<len;i++) {
4151 if (mac[i] >= 'A' && mac[i] <= 'Z')
4152 {
4153 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
4154 }
4155 else
4156 g_gbw_mac[i] = mac[i];
4157 }
4158 g_gbw_mac[i] = '\0';
4159 g_gbw_enabled = 1;
4160
4161 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
4162 if (system(get_ipaddr_cmd) == 0) {
4163 //startGBW();
4164 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
4165 for (i=0;i<len;i++) {
4166 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
4167 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
4168 startGBW();
4169 }
4170 free(ap);
4171 free(list);
4172 }
4173 }
4174 return 0;
4175}
4176
4177int disableGBW() {
4178 stopGBW();
4179 free(g_gbw_mac);
4180 g_gbw_mac = NULL;
4181 g_gbw_enabled = 1;
4182 return 0;
4183}
4184
4185static int startGBW() {
4186 if (g_gbw_watcher_pid != 0) {
4187 stopGBW();
4188 }
4189 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
4190}
4191
4192static int stopGBW() {
4193 void* retval;
you.chenc9928582023-04-24 15:39:37 +08004194 char cmd[64] = {0};
you.chen0f5c6432022-11-07 18:31:14 +08004195 pthread_cancel(g_gbw_watcher_pid);
4196 pthread_join(g_gbw_watcher_pid, &retval);
4197 g_gbw_watcher_pid = 0;
you.chenc9928582023-04-24 15:39:37 +08004198 sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
4199 if (s_ap_iterface_name[0] != '\0')
4200 {
4201 sprintf(cmd, "tc qdisc del dev %s root", s_ap_iterface_name);
4202 system(cmd);
4203 }
you.chen0f5c6432022-11-07 18:31:14 +08004204}
4205//you.chen add for tv-box end