blob: 2ac57a65a1de8d03e997562409d0e9f93e623789 [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
43
44pthread_t g_ap_watcher_pid = 0;
45volatile int g_ap_watcher_stop_flag = 0;
you.chena6fa5b22022-05-18 10:28:19 +080046volatile int g_ap_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080047
48pthread_t g_sta_watcher_pid = 0;
49volatile int g_sta_watcher_stop_flag = 0;
you.chen9ac66392022-08-06 17:01:16 +080050volatile int g_sta_scan_finish_flag = 1;
you.chena6fa5b22022-05-18 10:28:19 +080051volatile int g_sta_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080052
53void * g_ap_callback_priv = NULL;
54AP_CALLBACK_FUNC_PTR g_ap_callback_func = NULL;
55void * g_sta_callback_priv = NULL;
56STA_CALLBACK_FUNC_PTR g_sta_callback_func = NULL;
57
58//const char * CTRL_PATH="/var/run/wpa_supplicant";
59const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/ap0"};
60//const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/wlan0"};
61const char * cmd_list_networks = "LIST_NETWORKS";
62const char * cmd_save_config = "SAVE_CONFIG";
you.chen6c2dd9c2022-05-16 17:55:28 +080063const char * cmd_disconnect = "DISCONNECT";
64const char * cmd_remove_all = "REMOVE_NETWORK all";
you.chen35020192022-05-06 11:30:57 +080065const char * state_scan_result = "CTRL-EVENT-SCAN-RESULTS";
you.chen9ac66392022-08-06 17:01:16 +080066const char * STATE_COMPLETED = "COMPLETED";
you.chen35020192022-05-06 11:30:57 +080067
you.chenf711c8a2023-04-13 13:49:45 +080068const char * cmd_ping = "PING";
69const char * rsp_pong = "PONG";
70const int SLEEP_TIME_ON_IDLE = 100 * 1000; // usecond
71const int MAX_IDLE_COUNT = 600; // 60s
72
you.chenc9928582023-04-24 15:39:37 +080073const char * start_wg870_service_script = "/etc/wg870/scripts/start_wg870_service.sh";
74const char * get_interface_name_script = "/etc/wg870/scripts/get_interface_name.sh";
75const char * start_stop_sta_script = "/etc/wg870/scripts/start_stop_sta.sh";
76const char * start_stop_ap_script = "/etc/wg870/scripts/start_stop_ap.sh";
77const char * sta_status_change_script = "/etc/wg870/scripts/sta_status_change.sh";
78
79static char s_ap_iterface_name[64] = {0};
80
you.chend2fef3f2023-02-13 10:50:35 +080081struct local_wpa_ctrl{
82 struct wpa_ctrl *ctrl;
83 pthread_mutex_t mutex;
84};
85
you.chen70f377f2023-04-14 18:17:09 +080086
you.chend2fef3f2023-02-13 10:50:35 +080087static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
88
89static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
you.chen35020192022-05-06 11:30:57 +080090
you.chen0f5c6432022-11-07 18:31:14 +080091//you.chen add for tv-box start
92volatile int g_gbw_enabled = 0;
93char * g_gbw_mac = NULL;
94pthread_t g_gbw_watcher_pid = 0;
95static int startGBW();
96static int stopGBW();
97//you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +080098
99typedef struct __curr_status_info {
100 ap_info_s *ap;
101 char * state;
102 int net_no;
103}curr_status_info;
qs.xiong97fa59b2022-04-07 05:41:29 -0400104
you.chen70f377f2023-04-14 18:17:09 +0800105typedef enum {
106 INNER_STA_STATUS_INIT = 0,
107 INNER_STA_STATUS_CONNECTING,
108 INNER_STA_STATUS_ASSOCIATING,
109 INNER_STA_STATUS_ASSOCIATED,
110 INNER_STA_STATUS_CONNECTED,
111 INNER_STA_STATUS_DISCONNECTING,
112 INNER_STA_STATUS_DISCONNECTED,
113 INNER_STA_STATUS_CANCEL,
114}inner_sta_status_s;
115
116static pthread_cond_t s_global_check_cond = PTHREAD_COND_INITIALIZER;
117static pthread_mutex_t s_global_check_mutex = PTHREAD_MUTEX_INITIALIZER;
118static inner_sta_status_s s_sta_status = INNER_STA_STATUS_INIT;
119static error_number_s s_sta_error_number = -1;
120static char s_sta_current_connecting_ssid[64] = {0};
121static struct timespec s_sta_connect_timeout;
122const int MAX_CONNNECT_TIME = 15; // second
123pthread_t g_global_watcher_pid = 0;
124static int s_service_invoke_timeout_cnt=0;
125const int FAKE_MAX_INT_VALUE = 99999;
126
127static void notify_service_invoke_fail(int error)
128{
129 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
130 pthread_mutex_lock(&s_global_check_mutex);
131 if (error == -2) //timeout
132 {
133 s_service_invoke_timeout_cnt++;
134 if (s_service_invoke_timeout_cnt > 10)
135 {
136 pthread_cond_signal(&s_global_check_cond);
137 }
138 }
139 else if (error == -1)
140 {
141 // check if can connect wpa service
142 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[0]);
143 if (lynq_wpa_ctrl == NULL)
144 {
145 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
146 pthread_cond_signal(&s_global_check_cond);
147 }
148 wpa_ctrl_close(lynq_wpa_ctrl);
149 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[1]);
150 if (lynq_wpa_ctrl == NULL)
151 {
152 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
153 pthread_cond_signal(&s_global_check_cond);
154 }
155 wpa_ctrl_close(lynq_wpa_ctrl);
156 }
157
158 pthread_mutex_unlock(&s_global_check_mutex);
159}
160
you.chenc9928582023-04-24 15:39:37 +0800161static int system_call_v(const char * fmt, ...)
162{
163 char str_cmd[256] = {0};
164 va_list args;
165 va_start(args, fmt);
166 vsprintf(str_cmd, fmt, args);
167 va_end(args);
168 printf("system call----------%s\n", str_cmd);
169 return system(str_cmd);
170}
171
you.chen70f377f2023-04-14 18:17:09 +0800172static void check_tether_and_notify()
173{
174 RLOGD("check_tether_and_notify called");
you.chenc9928582023-04-24 15:39:37 +0800175 if (s_ap_iterface_name[0] != '\0' && 0 == system_call_v("ifconfig | grep %s", s_ap_iterface_name))
you.chen70f377f2023-04-14 18:17:09 +0800176 {
177 return;
178 }
179 pthread_mutex_lock(&s_global_check_mutex);
180 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
181 pthread_cond_signal(&s_global_check_cond);
182 pthread_mutex_unlock(&s_global_check_mutex);
183}
184
you.chend2fef3f2023-02-13 10:50:35 +0800185static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
186 char *reply, size_t *reply_len,
187 void (*msg_cb)(char *msg, size_t len))
188{
189 int ret;
190 if (ctrl->ctrl == NULL) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800191 RLOGE("local_wpa_ctrl_request ctrl is null\n");
you.chend2fef3f2023-02-13 10:50:35 +0800192 return -1;
193 }
194 pthread_mutex_lock(&ctrl->mutex);
195 ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
196 pthread_mutex_unlock(&ctrl->mutex);
you.chen70f377f2023-04-14 18:17:09 +0800197 if (ret != 0)
198 {
199 notify_service_invoke_fail(ret);
200 }
you.chend2fef3f2023-02-13 10:50:35 +0800201 return ret;
202}
203
204static struct local_wpa_ctrl * inner_get_wpa_ctrl(int index) {
205 int repeat_cnt;
206 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
207 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800208 RLOGD("inner_get_wpa_ctrl\n");
you.chend2fef3f2023-02-13 10:50:35 +0800209 for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
210 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
211// printf("wait enable finish\n");
212 usleep(500 * 1000);
213 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
214 }
215 if (NULL == g_lynq_wpa_ctrl[index]) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800216 RLOGE("NULL == g_lynq_wpa_ctrl[index]");
you.chend2fef3f2023-02-13 10:50:35 +0800217 goto out_addr;
218 }
219 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
220 g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
221 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800222 RLOGE("wpa_ctrl_open fail\n");
you.chend2fef3f2023-02-13 10:50:35 +0800223 goto out_addr;
224 }
225 pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
226 }
227 lynq_wpa_ctrl = g_lynq_wpa_ctrl[index];
228out_addr:
229 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
230 return lynq_wpa_ctrl;
231}
232
qs.xiong97fa59b2022-04-07 05:41:29 -0400233#define PRINT_AND_RETURN_VALUE(str,value) \
qs.xiong97fa59b2022-04-07 05:41:29 -0400234{\
you.chen35020192022-05-06 11:30:57 +0800235 perror((str));\
236 return (value);\
qs.xiong97fa59b2022-04-07 05:41:29 -0400237}
238
you.chen35020192022-05-06 11:30:57 +0800239#define CHECK_IDX(idx, type) do { \
240 if ( (idx == LYNQ_WIFI_INTERFACE_0 && type != CTRL_STA) || (idx == LYNQ_WIFI_INTERFACE_1 && type != CTRL_AP) \
241 || idx < LYNQ_WIFI_INTERFACE_0 || idx > LYNQ_WIFI_INTERFACE_1 ) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800242 RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
you.chen35020192022-05-06 11:30:57 +0800243 return -1; \
244 } \
245 }while (0)
246
247#define CHECK_WPA_CTRL(index) int ret = 0;\
248 size_t reply_len = MAX_RET; \
249 char cmd_reply[MAX_RET]={0}; \
you.chend2fef3f2023-02-13 10:50:35 +0800250 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
you.chen35020192022-05-06 11:30:57 +0800251 do{ \
you.chend2fef3f2023-02-13 10:50:35 +0800252 lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
253 if (NULL == lynq_wpa_ctrl) return -1; \
you.chen35020192022-05-06 11:30:57 +0800254 }while(0)
255
256#define DO_REQUEST(cmd_str) do { \
257 reply_len = MAX_RET;\
258 cmd_reply[0] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800259 RLOGD("to call [%s]\n", cmd_str); \
you.chend2fef3f2023-02-13 10:50:35 +0800260 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 +0800261 if (ret != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800262 RLOGE("call "#cmd_str" fail %d\n", ret); \
you.chen35020192022-05-06 11:30:57 +0800263 return ret; \
264 } \
265 cmd_reply[reply_len+1] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800266 RLOGD("cmd replay [ %s ]\n", cmd_reply); \
you.chen35020192022-05-06 11:30:57 +0800267 }while(0)
268
269#define DO_OK_FAIL_REQUEST(cmd_str) do { \
270 DO_REQUEST(cmd_str); \
271 if (reply_len >=4 && memcmp(cmd_reply, "FAIL", 4) == 0 ) {\
qs.xiong9fbf74e2023-03-28 13:38:22 +0800272 RLOGE("cmd "#cmd_str" return FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800273 return -1; \
274 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800275 RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800276 return -1; \
277 } \
278 }while (0)
279
280
you.chend2fef3f2023-02-13 10:50:35 +0800281static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
you.chen35020192022-05-06 11:30:57 +0800282
you.chenf711c8a2023-04-13 13:49:45 +0800283static int check_connection(struct wpa_ctrl * wpa_ctrl)
284{
285 size_t reply_len = MAX_RET;
286 char cmd_reply[MAX_RET]={0};
287 int ret;
288
289 RLOGD("check_connection [%p]", wpa_ctrl);
290 ret = wpa_ctrl_request(wpa_ctrl, cmd_ping, strlen(cmd_ping), cmd_reply, &reply_len, NULL);
291
292 if (ret != 0 || reply_len < 4 || memcmp(cmd_reply, rsp_pong, 4) != 0)
293 {
294 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 +0800295 if (ret != 0)
296 {
297 notify_service_invoke_fail(ret);
298 }
you.chenf711c8a2023-04-13 13:49:45 +0800299 return -1;
300 }
301
302 return 0;
303}
304
305/**
306 * @brief check_pending_msg
307 * @param lynq_wpa_ctrl
308 * @return 1 has msg, 0 no msg, -1 error
309 */
310static int check_pending_msg(struct wpa_ctrl ** pp_lynq_wpa_ctrl, int type, int* idle_count, int *started_flag)
311{
312 int ret;
313
314 if (*pp_lynq_wpa_ctrl == NULL) // need connect
315 {
316 *pp_lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[type]); //@todo temp change
317 if (*pp_lynq_wpa_ctrl == NULL)
318 {
319 usleep(SLEEP_TIME_ON_IDLE);
320 return -1;
321 }
322
323 ret = wpa_ctrl_attach(*pp_lynq_wpa_ctrl);
324 if (ret == 0) // attach success
325 {
326 *started_flag = 1;
327 }
328 else
329 {
you.chen70f377f2023-04-14 18:17:09 +0800330 RLOGE("[wifi error]sta watch thread wpa_ctrl_attach fail");
you.chenf711c8a2023-04-13 13:49:45 +0800331 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
332 *pp_lynq_wpa_ctrl = NULL;
333 *idle_count = 0;
you.chen70f377f2023-04-14 18:17:09 +0800334 notify_service_invoke_fail(-2);
you.chenf711c8a2023-04-13 13:49:45 +0800335 usleep(SLEEP_TIME_ON_IDLE);
336 return -1;
337 }
338 }
339
340 ret = wpa_ctrl_pending(*pp_lynq_wpa_ctrl);
341 if ( ret == 0) // no pending messages
342 {
343 usleep(SLEEP_TIME_ON_IDLE);
344 *idle_count += 1;
345 if (*idle_count > MAX_IDLE_COUNT)
346 {
347 if (check_connection(*pp_lynq_wpa_ctrl) != 0)
348 {
349 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
350 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
351 *pp_lynq_wpa_ctrl = NULL;
352 *idle_count = 0;
353 return -1;
354 }
355 *idle_count = 0;
356 }
357 return 0;
358 }
359 else if ( ret == -1) // on error
360 {
361 RLOGE("[wifi error]sta wpa_ctrl_pending");
362 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
363 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
364 *pp_lynq_wpa_ctrl = NULL;
365 *idle_count = 0;
you.chen70f377f2023-04-14 18:17:09 +0800366 notify_service_invoke_fail(ret);
you.chenf711c8a2023-04-13 13:49:45 +0800367 return -1;
368 }
369
370 *idle_count = 0;
371 return 1;
372}
373
you.chen35020192022-05-06 11:30:57 +0800374static void APWatcherThreadProc() {
375 size_t len = MAX_RET;
376 char msg_notify[MAX_RET];
you.chenf711c8a2023-04-13 13:49:45 +0800377 int idle_count = 0;
you.chen35020192022-05-06 11:30:57 +0800378
you.chen6c2dd9c2022-05-16 17:55:28 +0800379 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800380 g_ap_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800381
qs.xiong9fbf74e2023-03-28 13:38:22 +0800382 while (g_ap_watcher_stop_flag == 0)
383 {
you.chenf711c8a2023-04-13 13:49:45 +0800384 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_AP, &idle_count, &g_ap_watcher_started_flag) != 1)
385 {
you.chen70f377f2023-04-14 18:17:09 +0800386 if (g_ap_callback_func != NULL && idle_count == MAX_IDLE_COUNT - 100 )
387 {
388 check_tether_and_notify();
389 }
390
you.chen35020192022-05-06 11:30:57 +0800391 continue;
392 }
you.chenf711c8a2023-04-13 13:49:45 +0800393
you.chen6c2dd9c2022-05-16 17:55:28 +0800394 memset(msg_notify, 0, MAX_RET);
395 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800396 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
you.chenf711c8a2023-04-13 13:49:45 +0800397 {
you.chen35020192022-05-06 11:30:57 +0800398 msg_notify[len+1] = '\0';
qs.xiong455c30b2023-04-12 11:40:02 +0800399 RLOGD("APWatcherThreadProc ap------> %s\n", msg_notify);
you.chenf711c8a2023-04-13 13:49:45 +0800400 //you.chen change for tv-box start
qs.xiong9fbf74e2023-03-28 13:38:22 +0800401 if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800402 {
you.chen0f5c6432022-11-07 18:31:14 +0800403 if (g_ap_callback_func != NULL)
404 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_DISCONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800405 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800406 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800407 RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
408 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800409 {
you.chen0f5c6432022-11-07 18:31:14 +0800410 stopGBW();
411 }
412 }
you.chen35020192022-05-06 11:30:57 +0800413 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800414 else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800415 {
you.chen0f5c6432022-11-07 18:31:14 +0800416 if (g_ap_callback_func != NULL)
417 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_CONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800418 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800419 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800420 RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
421 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800422 {
you.chen0f5c6432022-11-07 18:31:14 +0800423 startGBW();
424 }
425 }
you.chen35020192022-05-06 11:30:57 +0800426 }
you.chenf711c8a2023-04-13 13:49:45 +0800427 //you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +0800428 } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
429 } // end while (g_ap_watcher_stop_flag == 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800430 if (lynq_wpa_ctrl != NULL)
431 {
you.chen92fd5d32022-05-25 10:09:47 +0800432 wpa_ctrl_detach(lynq_wpa_ctrl);
433 wpa_ctrl_close(lynq_wpa_ctrl);
434 }
qs.xiong97fa59b2022-04-07 05:41:29 -0400435}
436
you.chen70f377f2023-04-14 18:17:09 +0800437static void inner_check_connect_error(const char * event_msg, lynq_wifi_sta_status_s state, error_number_s error_num)
438{
439 char * p;
440 const char * try_associat_flag = "Trying to associate";
441 const char * associated_flag = "Associated with ";
442
443 pthread_mutex_lock(&s_global_check_mutex);
444 if (s_sta_status < INNER_STA_STATUS_CONNECTING || s_sta_status >= INNER_STA_STATUS_CONNECTED) //not in connecting stage, egnore
445 {
446 pthread_mutex_unlock(&s_global_check_mutex);
447 return;
448 }
449
450 if (state == LYNQ_WIFI_STATUS_EGNORE)
451 {
452 if (strstr(event_msg, try_associat_flag) != NULL && strstr(event_msg, s_sta_current_connecting_ssid) != NULL) //associating request ssid
453 {
454 s_sta_status = INNER_STA_STATUS_ASSOCIATING;
455 }
456 else if (s_sta_status == INNER_STA_STATUS_ASSOCIATING && (p=strstr(event_msg, associated_flag)) != NULL)
457 {
458 s_sta_status = INNER_STA_STATUS_ASSOCIATED;
459 }
460 }
461 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
462 {
463 s_sta_error_number = error_num;
464 if (s_sta_status >= INNER_STA_STATUS_ASSOCIATING && strstr(event_msg, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL && error_num != LYNQ_WAIT_CONNECT_ACTIVE)
465 {
466 s_sta_status = INNER_STA_STATUS_DISCONNECTED;
467 pthread_cond_signal(&s_global_check_cond);
468 }
469 }
470 else if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
471 {
472 s_sta_status = INNER_STA_STATUS_CONNECTED;
473 pthread_cond_signal(&s_global_check_cond);
474 }
475 pthread_mutex_unlock(&s_global_check_mutex);
476}
477
qs.xiong455c30b2023-04-12 11:40:02 +0800478void get_state_error(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error)
479{
480 char *pReason;
481 *error = LYNQ_WAIT_CONNECT_ACTIVE;
482 if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
483 {
484 *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
485 RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d\n",*state,*error);
486 return;
487 }
488
489 if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
490 {
491 *state = LYNQ_WIFI_STA_STATUS_CONNECT;
492 RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
493 return;
494 }
495
496 if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
497 {
498 pReason = strstr(modify, "reason=");
499 if (pReason != NULL)
500 {
501 pReason += strlen("reason=");
502 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
503 {
504 *error = LYNQ_TIME_OUT;
505 }
506 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
507 {
508 *error = LYNQ_PSW_ERROR;
509 }
510 else
511 {
512 *error = LYNQ_UNSPECIFIED_REASON;
513 }
514 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
515 RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d\n",*state,*error);
516 return;
517 }
518 else
519 {
520 *error = LYNQ_UNSPECIFIED_REASON;
521 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
522 return;
523 }
524
525 }
526
527 if (strstr(modify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
528 {
529 *error = LYNQ_NOT_FIND_AP;
530 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
531 RLOGD("CTRL-EVENT-NETWORK-NOT-FOUND state:%d,error:%d\n",*state,*error);
532 return;
533 }
534
535
536 if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
537 {
538 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
539 pReason = strstr(modify, "status_code=");
540 if (pReason != NULL)
541 {
542 pReason += strlen("status_code=");
543 if (memcmp(pReason, "17", 2) == 0)
544 {
545 *error = LYNQ_AP_UNABLE_HANDLE;
546 }
547 else if (memcmp(pReason, "1",1) == 0)
548 {
549 *error = LYNQ_UNSPECIFIED_REASON;
550 }
551 else
552 {
553 *error = LYNQ_UNSPECIFIED_REASON;
554 }
555
556 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
557 RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d\n",*state,*error);
558 return;
559 }
560 else
561 {
562 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
563 *error = LYNQ_UNSPECIFIED_REASON;
564 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
565 RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d\n",*state,*error);
566 return;
567 }
568 }
569
570 if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
571 {
572 RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
573 *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
574 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
575 RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d\n",*state,*error);
576 return;
577 }
578
579 if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
580 {
581 RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
582 *error = LYNQ_WAIT_CONNECT_ACTIVE;
583 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
584 RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
585 return;
586 }
587
you.chen32cb31e2023-04-13 14:05:45 +0800588 RLOGD("EVENT : %s\n", modify);
qs.xiong455c30b2023-04-12 11:40:02 +0800589 *error = LYNQ_UNSPECIFIED_REASON;
you.chen32cb31e2023-04-13 14:05:45 +0800590 *state = LYNQ_WIFI_STATUS_EGNORE;
qs.xiong455c30b2023-04-12 11:40:02 +0800591 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
592 return;
593
594}
595
you.chen70f377f2023-04-14 18:17:09 +0800596static void notify_connect_status(lynq_wifi_sta_status_s state, error_number_s error)
597{
598 if (g_sta_callback_func != NULL && state != LYNQ_WIFI_STATUS_EGNORE)
599 {
600 RLOGD("STAWatcherThreadProc callback begin ------> %d %d\n", state, error);
601 g_sta_callback_func(g_sta_callback_priv, state, error);
602 RLOGD("STAWatcherThreadProc callback end ------> %d %d\n", state, error);
603 }
604}
605
you.chen35020192022-05-06 11:30:57 +0800606static void STAWatcherThreadProc() {
607 size_t len = MAX_RET;
608 char msg_notify[MAX_RET];
you.chen35020192022-05-06 11:30:57 +0800609 error_number_s error;
you.chenc9928582023-04-24 15:39:37 +0800610 lynq_wifi_sta_status_s state, last_state = -1;
you.chenf711c8a2023-04-13 13:49:45 +0800611 int idle_count = 0;
qs.xiongf1b525b2022-03-31 00:58:23 -0400612
you.chen6c2dd9c2022-05-16 17:55:28 +0800613 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800614 g_sta_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800615
you.chen70f377f2023-04-14 18:17:09 +0800616 RLOGD("STAWatcherThreadProc thread started ------");
qs.xiong9fbf74e2023-03-28 13:38:22 +0800617 while (g_sta_watcher_stop_flag == 0)
618 {
you.chenf711c8a2023-04-13 13:49:45 +0800619 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
qs.xiong455c30b2023-04-12 11:40:02 +0800620 {
you.chen35020192022-05-06 11:30:57 +0800621 continue;
622 }
you.chenf711c8a2023-04-13 13:49:45 +0800623
you.chen6c2dd9c2022-05-16 17:55:28 +0800624 memset(msg_notify, 0, MAX_RET);
625 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800626 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiong455c30b2023-04-12 11:40:02 +0800627 {
you.chen35020192022-05-06 11:30:57 +0800628 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800629 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
630 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800631 {
you.chen35020192022-05-06 11:30:57 +0800632 g_sta_scan_finish_flag = 1;
633 }
634
qs.xiong9fbf74e2023-03-28 13:38:22 +0800635 if (g_sta_callback_func == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800636 {
you.chen35020192022-05-06 11:30:57 +0800637 continue;
638 }
qs.xiong455c30b2023-04-12 11:40:02 +0800639 get_state_error(msg_notify,&state,&error);
you.chen70f377f2023-04-14 18:17:09 +0800640 notify_connect_status(state, error);
641
642 if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
you.chen32cb31e2023-04-13 14:05:45 +0800643 {
you.chen70f377f2023-04-14 18:17:09 +0800644 inner_check_connect_error(msg_notify, state, error);
you.chenc9928582023-04-24 15:39:37 +0800645 if (last_state != state)
646 {
647 if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
648 {
649 system_call_v("%s %s", sta_status_change_script, "connect");
650 }
651 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
652 {
653 system_call_v("%s %s", sta_status_change_script, "disconnect");
654 }
655 }
656
657 last_state = state;
you.chen32cb31e2023-04-13 14:05:45 +0800658 }
you.chen35020192022-05-06 11:30:57 +0800659 }
660 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800661 if (lynq_wpa_ctrl != NULL)
662 {
you.chen92fd5d32022-05-25 10:09:47 +0800663 wpa_ctrl_detach(lynq_wpa_ctrl);
664 wpa_ctrl_close(lynq_wpa_ctrl);
665 }
qs.xiongf1b525b2022-03-31 00:58:23 -0400666}
667
you.chen70f377f2023-04-14 18:17:09 +0800668// this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
669static void GlobalWatcherThreadProc()
670{
671 int ret, connect_timeout, service_abnormal;
672 error_number_s error_num = -1;
673 inner_sta_status_s sta_status;
674 scan_info_s *scan_list = NULL;
675 int i, scan_len=0;
676 char connecting_ssid[64];
677 struct timeval now;
678
679 RLOGD("GlobalWatcherThreadProc start to run");
680
681 while (1)
682 {
683 pthread_mutex_lock(&s_global_check_mutex);
684 pthread_cond_wait(&s_global_check_cond,&s_global_check_mutex);
685 if (s_sta_status == INNER_STA_STATUS_CONNECTED)
686 {
687 pthread_mutex_unlock(&s_global_check_mutex);
688 usleep(50*1000);
689 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
690 continue;
691 }
692
693 connect_timeout = 0;
694 service_abnormal = 0;
695 if (s_sta_status >= INNER_STA_STATUS_CONNECTING && s_sta_status < INNER_STA_STATUS_CONNECTED)
696 {
697 while (1)
698 {
699 ret = pthread_cond_timedwait(&s_global_check_cond, &s_global_check_mutex, &s_sta_connect_timeout);
700 if (ret == ETIME)
701 {
702 connect_timeout = 1;
703 }
704 else if (ret != 0)
705 {
706 gettimeofday(&now,NULL);
707 if (now.tv_sec < s_sta_connect_timeout.tv_sec) //time not arrive
708 {
709 usleep(SLEEP_TIME_ON_IDLE);
710 continue;
711 }
712 connect_timeout = 1;
713 }
714 sta_status = s_sta_status;
715 error_num = s_sta_error_number;
716 s_sta_status = INNER_STA_STATUS_INIT;
717 strcpy(connecting_ssid, s_sta_current_connecting_ssid);
718 memset(&s_sta_connect_timeout, 0, sizeof (s_sta_connect_timeout));
719 memset(&s_sta_current_connecting_ssid, 0, sizeof (s_sta_current_connecting_ssid));
720 break;
721 }
722 }
723 if (s_service_invoke_timeout_cnt > 10)
724 {
725 service_abnormal = 1;
726 s_service_invoke_timeout_cnt = 0;
727 }
728 pthread_mutex_unlock(&s_global_check_mutex);
729
730 if (service_abnormal == 1)
731 {
732 sleep(1);
733 RLOGE("wpa service is abnormal info app to exit");
734 notify_connect_status(LYNQ_WIFI_STA_SERVICE_ABNORMAL, -1);
735 if (g_ap_callback_func != NULL)
736 {
737 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_SERVICE_ABNORMAL);
738 }
739 sleep(FAKE_MAX_INT_VALUE); // wait process to exit
740 }
741
742 if (sta_status == INNER_STA_STATUS_CANCEL)
743 {
744 continue;
745 }
746 else if (sta_status == INNER_STA_STATUS_CONNECTED)
747 {
748 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
749 }
750 else if (connect_timeout == 0 && error_num == LYNQ_NOT_FIND_AP) // not found ap maybe mismatch auth
751 {
752 if (0 == lynq_get_scan_list(0, &scan_list, &scan_len) && NULL != scan_list) // if not found, but scan result exist, maybe auth error
753 {
754 for(i=0; i < scan_len;i++)
755 {
756 if (strcmp(scan_list[i].ssid, connecting_ssid) == 0)
757 {
758 error_num = LYNQ_AUTH_ERROR;
759 break;
760 }
761 }
762 free(scan_list);
763 }
764 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
765 }
766 else if (connect_timeout == 0)
767 {
768 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
769 }
770 else // wait timeout
771 {
772 if (0 != lynq_get_sta_status(LYNQ_WIFI_INTERFACE_0, &sta_status)) // get status fail
773 {
774 ; // wpa service abnormal
775 }
776 else if (sta_status == LYNQ_WIFI_STA_STATUS_ENABLE) // connect ok
777 {
778 RLOGD("GlobalWatcherThreadProc notify connected");
779 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
780 }
781 else
782 {
783 RLOGD("GlobalWatcherThreadProc notify timeout");
784 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, LYNQ_TIME_OUT);
785 }
786 }
787 } // while (1)
788}
789
qs.xiong1af5daf2022-03-14 09:12:12 -0400790int lynq_wifi_enable(void)
791{
you.chen35020192022-05-06 11:30:57 +0800792 int ret = 0;
you.chen6c2dd9c2022-05-16 17:55:28 +0800793 int i;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800794 RLOGD("enter lynq_wifi_enable");
you.chend2fef3f2023-02-13 10:50:35 +0800795 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
796
qs.xiong9fbf74e2023-03-28 13:38:22 +0800797 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
798 {
you.chend2fef3f2023-02-13 10:50:35 +0800799 goto out_enable;
800 }
801
you.chenc9928582023-04-24 15:39:37 +0800802 ret = system(start_wg870_service_script);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800803 if (ret != 0)
804 {
805 //printf("service state %d\n", ret);
806 RLOGE("[wifi error]service state %d",ret);
you.chend2fef3f2023-02-13 10:50:35 +0800807 ret = -1;
808 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800809 }
lhfe8da902022-10-11 18:55:36 +0800810
you.chen70f377f2023-04-14 18:17:09 +0800811 if (g_global_watcher_pid == 0 ) // this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
812 {
813 ret=pthread_create(&g_global_watcher_pid,NULL,GlobalWatcherThreadProc,NULL);
814 if(ret<0)
815 {
816 RLOGE("[wifi error]creat GlobalWatcherThreadProc fail");
817 ret = -1;
818 goto out_enable;
819 }
820 }
821
you.chend2fef3f2023-02-13 10:50:35 +0800822 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
823 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
824 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
825 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
826out_enable:
827 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800828 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500829}
830
qs.xiong1af5daf2022-03-14 09:12:12 -0400831int lynq_wifi_disable(void)
832{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800833 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800834 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800835 g_ap_watcher_stop_flag = 1;
836 g_sta_watcher_stop_flag = 1;
837 if (g_ap_watcher_pid != 0)
838 pthread_join(g_ap_watcher_pid, NULL);
839 if (g_sta_watcher_pid != 0)
840 pthread_join(g_sta_watcher_pid, NULL);
841 if (g_lynq_wpa_ctrl[0] != NULL)
842 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
843 if (g_lynq_wpa_ctrl[1] != NULL)
844 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
845 g_ap_watcher_pid = 0;
846 g_sta_watcher_pid = 0;
847 g_lynq_wpa_ctrl[0] = NULL;
848 g_lynq_wpa_ctrl[1] = NULL;
849 system("systemctl stop wg870_drv_insmod.service");
you.chend2fef3f2023-02-13 10:50:35 +0800850 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
851 return 0;
852}
853
854static inline char inner_convert_char(char in)
855{
856 if (in >= '0' && in <= '9')
857 {
858 return in - '0';
859 }
860 else if (in >= 'a' && in <= 'f')
861 {
862 return in - 'a' + 10;
863 }
864 else if (in >= 'A' && in <= 'F')
865 {
866 return in - 'A' + 10;
867 }
868 else
869 {
870 return '\xff';
871 }
872}
873
874static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
875{
876 char *p;
877 size_t pos = 0;
878 if (NULL == out_ssid)
879 return;
880 //printf("input ssid=[%s]\n", ssid);
881 memset(out_ssid, 0, out_ssid_len);
882 if (NULL == ssid)
883 return;
884 p = strchr(ssid, '\\');
885 if (NULL == p)
886 {
887 strncpy(out_ssid, ssid, out_ssid_len);
888 //printf(" first %s\n", out_ssid);
889 }
890 else
891 {
892 pos = p - ssid;
893 memcpy(out_ssid, ssid, pos);
894 //printf("pos %lu -- %s\n", pos, out_ssid);
895 for(; pos < out_ssid_len; pos ++)
896 {
897 if (p[0] == '\0')
898 {
899 //printf(" out %s\n", out_ssid);
900 return;
901 }
902 else if (p[0] != '\\')
903 {
904 out_ssid[pos] = p[0];
905 p += 1;
906 }
907 else if (p[1] == 'x' || p[1] == 'X')
908 {
909 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
910 p += 4;
911 }
912 else if (p[1] == '\\')
913 {
914 out_ssid[pos] = '\\';
915 p += 2;
916 }
917 else if (p[1] == 't')
918 {
919 out_ssid[pos] = '\t';
920 p += 2;
921 }
922 else if (p[1] == 'r')
923 {
924 out_ssid[pos] = '\r';
925 p += 2;
926 }
927 else if (p[1] == 'n')
928 {
929 out_ssid[pos] = '\n';
930 p += 2;
931 }//todo find a better way to convert?
932 }
933 }
934 //printf(" out %s\n", out_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -0500935}
qs.xiong1af5daf2022-03-14 09:12:12 -0400936
you.chen35020192022-05-06 11:30:57 +0800937static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +0800938 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +0800939 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +0800940 RLOGD("enter inner_get_param");
941 if (out_put == NULL)
942 {
943 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +0800944 return -1;
945 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800946 if (param_name == NULL)
947 {
948 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +0800949 return -1;
950 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800951 if (param_name[0] == '\0')
952 {
953 RLOGE("param is empty");
you.chen35020192022-05-06 11:30:57 +0800954 return -1;
955 }
956
957 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
958
959 CHECK_WPA_CTRL(interface);
960
961 DO_REQUEST(lynq_cmd_get);
962
qs.xiong9fbf74e2023-03-28 13:38:22 +0800963 if (memcmp(cmd_reply, "FAIL", 4) == 0)
964 {
965 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +0800966 return -1;
967 }
968
you.chena6fa5b22022-05-18 10:28:19 +0800969// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +0800970 if (strcmp(param_name, "ssid") == 0)
971 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800972 if (cmd_reply[0] == '\"')
973 {
you.chend2fef3f2023-02-13 10:50:35 +0800974 ssid_len = reply_len - 1;
975 memcpy(out_put, cmd_reply + 1, ssid_len);
976 if (out_put[ssid_len-1] == '\"')
977 {
978 out_put[ssid_len-1] = '\0';
979 }
980 else
981 {
982 out_put[ssid_len] = '\0';
983 }
984 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800985 else
986 {
you.chend2fef3f2023-02-13 10:50:35 +0800987 ssid_len = reply_len / 2;
988 for(i=0; i<ssid_len; i++)
989 {
990 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
991 }
992 out_put[ssid_len] = '\0';
993 }
994 }
995 else
996 {
997 memcpy(out_put, cmd_reply, reply_len + 1);
998 }
you.chen35020192022-05-06 11:30:57 +0800999 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001000}
qs.xiong1af5daf2022-03-14 09:12:12 -04001001
you.chen35020192022-05-06 11:30:57 +08001002static int lynq_split(char * str, int len, char delimiter, char * results[]) {
1003 int ret = 0;
1004 char * end = str + len - 1;
1005 results[ret++] = str;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001006 while(str < end)
1007 {
1008 if (*str == delimiter)
1009 {
you.chen35020192022-05-06 11:30:57 +08001010 *str++ = '\0';
1011 results[ret++] = str;
1012 continue;
1013 }
1014 str++;
1015 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001016 if (*str == delimiter)
1017 {
you.chen35020192022-05-06 11:30:57 +08001018 *str = '\0';
1019 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001020
you.chen35020192022-05-06 11:30:57 +08001021 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001022}
1023
you.chend2fef3f2023-02-13 10:50:35 +08001024static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
1025{
1026 char * p;
1027 int ret = 0;
1028 char cmd[256]={0};
1029 if (NULL == mac || NULL == ip)
you.chen35020192022-05-06 11:30:57 +08001030 return -1;
you.chend2fef3f2023-02-13 10:50:35 +08001031 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +08001032 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-02-13 10:50:35 +08001033 ret = exec_cmd(cmd, ip, ip_len);
1034 p = strchr(ip, '\n');
1035 if (NULL != p)
1036 {
1037 *p = '\0';
you.chen35020192022-05-06 11:30:57 +08001038 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001039 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +08001040 return ret;
1041}
1042
you.chend2fef3f2023-02-13 10:50:35 +08001043static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +08001044 struct in_addr addr ={0};
1045 struct hostent *ht;
1046
qs.xiong9fbf74e2023-03-28 13:38:22 +08001047 if (ip == NULL || *ip == '\0' || hostname == NULL)
1048 {
1049 RLOGE("ip == NULL or hostname == NULL");
1050 return -1;
you.chen35020192022-05-06 11:30:57 +08001051 }
1052
you.chend2fef3f2023-02-13 10:50:35 +08001053 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08001054 if (inet_aton(ip, &addr) == 0)
1055 {
you.chen35020192022-05-06 11:30:57 +08001056 printf("---inet_aton fail\n");
1057 return -1;
1058 }
1059
1060 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
1061
qs.xiong9fbf74e2023-03-28 13:38:22 +08001062 if (ht == NULL)
1063 {
1064 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-05-06 11:30:57 +08001065 herror(NULL);
1066 return -1;
1067 }
1068
1069 strcpy(hostname, ht->h_name);
1070
1071 return 0;
1072}
1073
1074static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
1075{
1076 int count, index, words_count;
1077 char * split_lines[128]= {0};
1078 char * split_words[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08001079 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +08001080 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001081 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-05-06 11:30:57 +08001082
1083 CHECK_WPA_CTRL(ap_sta);
1084
1085 DO_REQUEST(lynq_wifi_list_networks);
1086
1087 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1088
1089 //@todo check ssid field to compatible
1090
1091 ret = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001092 for(index=1; index < count; index++)
1093 {
you.chen35020192022-05-06 11:30:57 +08001094 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001095 if (words_count > 2)
1096 {
you.chend2fef3f2023-02-13 10:50:35 +08001097 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001098 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
1099 {
you.chen35020192022-05-06 11:30:57 +08001100 net_no_list[ret++] = atoi(split_words[0]);
1101 }
1102 }
1103 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001104 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +08001105 return ret;
1106}
1107
1108static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001109 size_t i=0;
you.chen35020192022-05-06 11:30:57 +08001110 CHECK_WPA_CTRL(ap_sta);
1111 const char *lynq_wifi_add_network = "ADD_NETWORK";
1112
qs.xiong9fbf74e2023-03-28 13:38:22 +08001113 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +08001114 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001115 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1116 {
1117 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen35020192022-05-06 11:30:57 +08001118 return -1;
1119 }
1120
qs.xiong9fbf74e2023-03-28 13:38:22 +08001121 for(i=0;i<reply_len;i++)
1122 {
1123 if(cmd_reply[i] == '\n')
1124 {
you.chen35020192022-05-06 11:30:57 +08001125 cmd_reply[i] = '\0';
1126 break;
1127 }
1128 }
1129 return atoi(cmd_reply);
1130}
you.chena6cd55a2022-05-08 12:20:18 +08001131
you.chen35020192022-05-06 11:30:57 +08001132static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
1133{
1134 int count, index;
1135 int net_no_list[128];
1136
qs.xiong9fbf74e2023-03-28 13:38:22 +08001137 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +08001138 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001139 for (index=0; index < count; index++)
1140 {
1141 if (net_no_list[index] == net_no)
1142 {
you.chen35020192022-05-06 11:30:57 +08001143 return 0;
1144 }
1145 }
1146
1147 if (count >= 1)
1148 index = net_no_list[count - 1];
1149 else
1150 index = -1;
1151
qs.xiong9fbf74e2023-03-28 13:38:22 +08001152 while (index < net_no )
1153 {
you.chen35020192022-05-06 11:30:57 +08001154 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001155 if (index >= net_no)
1156 { // required network no created
1157 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +08001158 return 0;
1159 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001160 else if( index < 0)
1161 {
1162 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +08001163 return -1;
1164 }
you.chen35020192022-05-06 11:30:57 +08001165 }
1166
1167 if (index < 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001168 {
1169 RLOGE("[lynq_check_network_number] network index < 0");
1170 return -1;
1171 }
1172 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen35020192022-05-06 11:30:57 +08001173 return 0;
1174}
1175
1176static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +08001177 if (freq > 5000 && freq < 6000)
1178 {
you.chen35020192022-05-06 11:30:57 +08001179 return LYNQ_WIFI_5G_band;
1180 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001181 else if (freq > 2000 && freq < 3000)
1182 {
you.chen35020192022-05-06 11:30:57 +08001183 return LYNQ_WIFI_2G_band;
1184 }
1185 return LYNQ_WIFI_2_and_5G_band;
1186}
1187
1188static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001189 if (key_mgmt != NULL)
1190 {
1191 if (memcmp( key_mgmt, "NONE", 4) == 0)
1192 {
you.chen35020192022-05-06 11:30:57 +08001193 return LYNQ_WIFI_AUTH_OPEN;
1194 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001195 else if (memcmp( key_mgmt, "WEP", 3) == 0)
1196 {
you.chen35020192022-05-06 11:30:57 +08001197 return LYNQ_WIFI_AUTH_WEP;
1198 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001199 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
1200 {
you.chen35020192022-05-06 11:30:57 +08001201 return LYNQ_WIFI_AUTH_WPA_PSK;
1202 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001203 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
1204 {
you.chen35020192022-05-06 11:30:57 +08001205 return LYNQ_WIFI_AUTH_WPA2_PSK;
1206 }
1207 }
1208
1209 return -1;
1210}
1211
1212static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001213 if (flag != NULL)
1214 {
qs.xiong3e506812023-04-06 11:08:48 +08001215 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
1216 {
1217 return LYNQ_WIFI_AUTH_WPA3_PSK;
1218 }else if ( strstr( flag,"SAE-CCMP") != NULL )
1219 {
1220 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
1221 }else if (strstr( flag, "WPA2-PSK") != NULL)
1222 {
you.chen35020192022-05-06 11:30:57 +08001223 return LYNQ_WIFI_AUTH_WPA2_PSK;
1224 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001225 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001226 {
you.chen35020192022-05-06 11:30:57 +08001227 return LYNQ_WIFI_AUTH_WPA_PSK;
1228 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001229 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001230 {
you.chen35020192022-05-06 11:30:57 +08001231 return LYNQ_WIFI_AUTH_WEP;
1232 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001233 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001234 {
you.chen35020192022-05-06 11:30:57 +08001235 return LYNQ_WIFI_AUTH_OPEN;
1236 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001237 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +08001238 {
you.chend2fef3f2023-02-13 10:50:35 +08001239 return LYNQ_WIFI_AUTH_OPEN;
1240 }
you.chen35020192022-05-06 11:30:57 +08001241 }
1242
1243 return -1;
1244}
1245
1246static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
1247 switch (bw) {
1248 case 10:
1249 return LYNQ_WIFI_BANDWIDTH_HT10;
1250 break;
1251 case 20:
1252 return LYNQ_WIFI_BANDWIDTH_HT20;
1253 break;
1254 case 40:
1255 return LYNQ_WIFI_BANDWIDTH_HT40;
1256 break;
1257 case 80:
1258 return LYNQ_WIFI_BANDWIDTH_HT80;
1259 break;
1260 default:
1261 break;
1262 }
1263
1264 return -1;
1265}
1266
you.chen70f377f2023-04-14 18:17:09 +08001267static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth);
you.chen35020192022-05-06 11:30:57 +08001268static int inner_get_status_info(int interface, curr_status_info *curr_state) {
1269 int i, count;
1270 char *p;
1271 const char *lynq_status_cmd = "STATUS";
1272 const char * FLAG_SSID = "ssid=";
1273 const char * FLAG_SBSID = "bssid=";
1274 const char * FLAG_KEY_MGMT = "key_mgmt=";
1275 const char * FLAG_FREQ = "freq=";
1276 const char * FLAG_STATE = "wpa_state=";
1277 const char * FLAG_ID = "id=";
you.chend2fef3f2023-02-13 10:50:35 +08001278 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +08001279 char *split_lines[128] = {0};
1280
1281 CHECK_WPA_CTRL(interface);
1282
qs.xiong9fbf74e2023-03-28 13:38:22 +08001283 if (curr_state == NULL)
1284 {
1285 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-05-06 11:30:57 +08001286 return -1;
1287 }
1288
1289 DO_REQUEST(lynq_status_cmd);
1290
1291 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1292
1293 curr_state->net_no = -1;
1294 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001295 for(i=0; i < count; i++)
1296 {
1297 if (curr_state->ap != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001298 {
you.chen35020192022-05-06 11:30:57 +08001299 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001300 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001301 {
you.chend2fef3f2023-02-13 10:50:35 +08001302 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +08001303 ret = 0;
1304 continue;
1305 }
you.chenf58b3c92022-06-21 16:53:48 +08001306 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001307 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001308 {
you.chend2fef3f2023-02-13 10:50:35 +08001309 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 +08001310 ret = 0;
1311 continue;
1312 }
you.chen35020192022-05-06 11:30:57 +08001313 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001314 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001315 {
you.chen450d0172022-07-15 17:56:48 +08001316 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001317 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +08001318 ret = 0;
1319 continue;
1320 }
1321 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001322 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001323 {
you.chen35020192022-05-06 11:30:57 +08001324 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1325 ret = 0;
1326 continue;
1327 }
you.chend2fef3f2023-02-13 10:50:35 +08001328 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001329 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001330 {
you.chend2fef3f2023-02-13 10:50:35 +08001331 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1332 ret = 0;
1333 continue;
1334 }
you.chen35020192022-05-06 11:30:57 +08001335 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001336 if (curr_state->state != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001337 {
you.chen35020192022-05-06 11:30:57 +08001338 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001339 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001340 {
you.chen35020192022-05-06 11:30:57 +08001341 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1342 ret = 0;
1343 continue;
1344 }
1345
1346 } //end else if (state != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001347 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
you.chen70f377f2023-04-14 18:17:09 +08001348 {
you.chen35020192022-05-06 11:30:57 +08001349 ret = 0;
you.chen450d0172022-07-15 17:56:48 +08001350 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001351 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +08001352 }
1353 }
1354
you.chen70f377f2023-04-14 18:17:09 +08001355 if (ret == 0 && curr_state->ap != NULL && curr_state->net_no >= 0) // auth may not right when add wpa3
1356 {
1357 inner_get_network_auth(interface, curr_state->net_no, &curr_state->ap->auth);
1358 }
1359
you.chen35020192022-05-06 11:30:57 +08001360 return ret;
1361}
1362
qs.xiongf1b525b2022-03-31 00:58:23 -04001363int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001364{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001365 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +08001366 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -05001367
qs.xiong9fbf74e2023-03-28 13:38:22 +08001368 if (ap_ssid == NULL)
1369 {
1370 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +08001371 return -1;
1372 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001373 else
1374 {
1375 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen35020192022-05-06 11:30:57 +08001376 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001377
qs.xiong9fbf74e2023-03-28 13:38:22 +08001378 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1379 {
1380 RLOGE("Do check ap network_number fail");
you.chen35020192022-05-06 11:30:57 +08001381 return -1;
1382 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001383
you.chen35020192022-05-06 11:30:57 +08001384 CHECK_IDX(idx, CTRL_AP);
1385
1386 CHECK_WPA_CTRL(CTRL_AP);
1387
1388 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1389
1390 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1391 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001392 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1393 return 0;
you.chen35020192022-05-06 11:30:57 +08001394
qs.xiong7a105ce2022-03-02 09:43:11 -05001395}
1396
you.chen35020192022-05-06 11:30:57 +08001397int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001398{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001399 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001400 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001401 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001402}
1403
qs.xiongc9c79f72022-10-17 15:27:18 +08001404/*****
1405 *frequency <------>channel
1406 *
1407 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1408 *
1409 *
1410 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1411 *
1412 *
1413 * */
1414static int lynq_check_set_frequency(int input_frequency){
qs.xiongc00b6032022-11-29 16:28:03 +08001415 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};
1416 int i;
1417 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1418
qs.xiong69a332b2022-12-02 09:58:57 +08001419 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001420 {
1421 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001422 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001423 }
qs.xiongc00b6032022-11-29 16:28:03 +08001424
1425 if(i == arr_len)
1426 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001427 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001428 return -1;
1429 }
qs.xiongc00b6032022-11-29 16:28:03 +08001430
qs.xiongc9c79f72022-10-17 15:27:18 +08001431 return 0;
1432}
qs.xiong13673462023-02-21 19:12:54 +08001433
1434static int lynq_check_frequencyby_country_code(int input_frequency)
1435{
1436 char str_cnc[]="CN";
1437 char str_dest[20]="";
1438
1439 if( lynq_get_country_code(1,str_dest) != 0 )
1440 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001441 RLOGE("get country_code error\n");
qs.xiong13673462023-02-21 19:12:54 +08001442 return -1;
1443 }
1444 if( strncmp(str_dest,str_cnc,2) != 0 )
1445 {
1446 return 0;
1447 }else if( 2473 < input_frequency && input_frequency < 5744)
1448 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001449 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001450 return -1;
1451 }
1452 return 0;
1453}
qs.xiongf1b525b2022-03-31 00:58:23 -04001454int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001455{
qs.xiongc00b6032022-11-29 16:28:03 +08001456 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001457 char lynq_wifi_frequency_cmd[128]={0};
1458 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001459 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001460 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001461 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001462 check = lynq_check_set_frequency(lynq_wifi_frequency);
1463 if(check != 0)
1464 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001465 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001466 return -1;
you.chen35020192022-05-06 11:30:57 +08001467 }
qs.xiong13673462023-02-21 19:12:54 +08001468 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1469 if(check != 0)
1470 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001471 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001472 return -1;
1473 }
1474
qs.xiongc00b6032022-11-29 16:28:03 +08001475 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1476 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001477 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001478 return -1;
1479 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001480
you.chen35020192022-05-06 11:30:57 +08001481 CHECK_IDX(idx, CTRL_AP);
1482
1483 CHECK_WPA_CTRL(CTRL_AP);
1484
1485 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1486 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1487 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1488
you.chen6c2dd9c2022-05-16 17:55:28 +08001489 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-05-06 11:30:57 +08001490 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1491 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1492 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001493
qs.xiong9fbf74e2023-03-28 13:38:22 +08001494 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001495}
1496
qs.xiongf1b525b2022-03-31 00:58:23 -04001497int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001498{
you.chen35020192022-05-06 11:30:57 +08001499 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001500 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001501 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001502
qs.xiong9fbf74e2023-03-28 13:38:22 +08001503 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1504 {
1505 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen35020192022-05-06 11:30:57 +08001506 return -1;
1507 }
1508 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001509
qs.xiong9fbf74e2023-03-28 13:38:22 +08001510 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001511}
1512
qs.xiongf1b525b2022-03-31 00:58:23 -04001513int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1514{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001515 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001516 CHECK_IDX(idx, CTRL_AP);
1517 switch(bandwidth){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001518 case LYNQ_WIFI_BANDWIDTH_HT10:
1519 {
1520 RLOGE("bandwith [%d] not support now\n", bandwidth);
1521 return -1;
1522 }
1523 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen35020192022-05-06 11:30:57 +08001524 {
1525 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1526 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001527 if (system(lynq_cmd_bandwith) != 0 )
1528 {
1529 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001530 return -1;
1531 }
1532 system("wl up");
1533 break;
1534 }
1535 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001536 {
qs.xiong10379192023-02-21 13:19:42 +08001537 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001538 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1539 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001540 if (system(lynq_cmd_bandwith) != 0 )
1541 {
1542 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001543 return -1;
1544 }
1545 system("wl up");
1546 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001547 }
you.chen35020192022-05-06 11:30:57 +08001548 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001549 {
qs.xiong10379192023-02-21 13:19:42 +08001550 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001551 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001552 if (system(lynq_cmd_bandwith) != 0 )
1553 {
1554 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001555 return -1;
1556 }
1557 system("wl up");
1558 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001559 }
1560 default:
you.chen35020192022-05-06 11:30:57 +08001561 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001562 RLOGE("auth type [%d] not support now\n", bandwidth);
1563 return -1;
you.chen35020192022-05-06 11:30:57 +08001564 }
1565 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001566
1567
you.chen35020192022-05-06 11:30:57 +08001568 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001569}
you.chen35020192022-05-06 11:30:57 +08001570
qs.xiongf1b525b2022-03-31 00:58:23 -04001571int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1572{
you.chen35020192022-05-06 11:30:57 +08001573 int count = 0;
1574 int index = 0;
1575 char *split_words[128] = {0};
1576 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001577 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001578 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001579
you.chen35020192022-05-06 11:30:57 +08001580 CHECK_WPA_CTRL(CTRL_AP);
1581
1582 DO_REQUEST(lynq_chanspec_cmd);
1583
1584 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1585 for(;index < count; index++) {
1586 if (strncmp(split_words[index], "bw", 2) != 0) {
1587 continue;
1588 }
1589
1590 index++;
1591 if (index >= count) {
1592 return -1;
1593 }
1594
qs.xiong9fbf74e2023-03-28 13:38:22 +08001595 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001596 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1597 return 0;
1598 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001599 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001600 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001601}
qs.xiong0fb469a2022-04-14 03:50:45 -04001602
qs.xiongf1b525b2022-03-31 00:58:23 -04001603int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001604{
you.chen35020192022-05-06 11:30:57 +08001605 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001606 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001607 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001608
you.chen35020192022-05-06 11:30:57 +08001609 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001610
qs.xiong9fbf74e2023-03-28 13:38:22 +08001611 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1612 {
you.chen35020192022-05-06 11:30:57 +08001613 return -1;
1614 }
1615
1616 system("wl down");
1617 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001618 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001619 return -1;
1620 }
1621 system("wl up");
1622 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001623}
qs.xiong0fb469a2022-04-14 03:50:45 -04001624
qs.xiongf1b525b2022-03-31 00:58:23 -04001625int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001626{
you.chen35020192022-05-06 11:30:57 +08001627 int count = 0;
1628 int index = 0;
1629 char *split_words[128] = {0};
1630 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001631 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001632 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001633
you.chen35020192022-05-06 11:30:57 +08001634 CHECK_WPA_CTRL(CTRL_AP);
1635
1636 DO_REQUEST(lynq_chanspec_cmd);
1637
1638 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001639 for(;index < count; index++)
1640 {
1641 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001642 if (strncmp(split_words[index], "channel", 2) != 0) {
1643 continue;
1644 }
1645
1646 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001647 if (index >= count)
1648 {
you.chen35020192022-05-06 11:30:57 +08001649 return -1;
1650 }
1651
1652 *channel = atoi(split_words[index]);
1653 return 0;
1654 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001655 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001656 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001657}
1658
1659
you.chen35020192022-05-06 11:30:57 +08001660int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001661{
you.chen6c2dd9c2022-05-16 17:55:28 +08001662 char ssid[MAX_CMD] = {0};
1663 int freq = 0;
1664 char lynq_auth_cmd[64]={0};
1665 char lynq_auth_alg_cmd[64]={0};
1666 char lynq_psk_cmd[64]={0};
1667 char lynq_pairwise_cmd[64]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001668 char lynq_ieee80211_cmd[64]={0};
1669 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001670 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001671 CHECK_IDX(idx, CTRL_AP);
1672
you.chen6c2dd9c2022-05-16 17:55:28 +08001673 CHECK_WPA_CTRL(CTRL_AP);
1674
qs.xiong9fbf74e2023-03-28 13:38:22 +08001675 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1676 {
1677 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen35020192022-05-06 11:30:57 +08001678 return -1;
1679 }
1680
you.chen92fd5d32022-05-25 10:09:47 +08001681 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001682 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001683 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001684 return 0;
1685 }
1686 else {
1687 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1688 ssid[0] = '\0';
1689 }
1690 lynq_wifi_ap_frequency_get(idx, &freq);
1691
1692 DO_OK_FAIL_REQUEST(cmd_disconnect);
1693 DO_OK_FAIL_REQUEST(cmd_remove_all);
1694 if (ssid[0] != '\0') {
1695 lynq_wifi_ap_ssid_set(idx, ssid);
1696 }
1697 if (freq != 0) {
1698 lynq_wifi_ap_frequency_set(idx, freq);
1699 }
1700 }
1701 }
you.chen35020192022-05-06 11:30:57 +08001702
qs.xiong9fbf74e2023-03-28 13:38:22 +08001703 switch(auth){
1704 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001705 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001706 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001707 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001708 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001709 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001710 break;
1711 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001712 case LYNQ_WIFI_AUTH_WEP:
1713 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001714 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001715 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001716 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-05-16 17:55:28 +08001717 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1718
1719 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1720 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1721 break;
1722 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001723 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-03-29 17:36:14 +08001724 {
1725 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1726 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1727 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1728
1729 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1730 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1731 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1732 break;
1733
1734 }
you.chen35020192022-05-06 11:30:57 +08001735 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001736 {
1737 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1738 {
you.chen35020192022-05-06 11:30:57 +08001739 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1740 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1741 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001742 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1743 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001744 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001745 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001746 }
1747// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1748// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1749 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong7a105ce2022-03-02 09:43:11 -05001750
you.chen35020192022-05-06 11:30:57 +08001751 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1752 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1753 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001754 break;
1755 }
1756 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1757 {
1758 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1759 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1760 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1761 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1762
1763 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1764 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1765 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1766 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1767 break;
1768 }
1769 case LYNQ_WIFI_AUTH_WPA3_PSK:
1770 {
1771 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1772 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xiong3e506812023-04-06 11:08:48 +08001773 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001774 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1775
1776 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1777 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1778 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1779 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1780 break;
1781 }
1782 default:
you.chen35020192022-05-06 11:30:57 +08001783 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001784 RLOGE("auth type [%d] not support now\n", auth);
1785 return -1;
you.chen35020192022-05-06 11:30:57 +08001786 }
1787 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001788 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001789
qs.xiong9fbf74e2023-03-28 13:38:22 +08001790 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001791}
1792
you.chen35020192022-05-06 11:30:57 +08001793int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001794{
you.chen35020192022-05-06 11:30:57 +08001795 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001796 char lynq_auth_alg_str[MAX_RET] = {0};
1797 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001798 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001799 CHECK_IDX(idx, CTRL_AP);
1800
qs.xiong9fbf74e2023-03-28 13:38:22 +08001801 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1802 {
1803 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen35020192022-05-06 11:30:57 +08001804 return -1;
1805 }
1806
qs.xiong9fbf74e2023-03-28 13:38:22 +08001807 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1808 {
1809 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1810 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001811 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001812 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001813 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001814 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001815 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1816 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001817 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001818 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001819 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001820 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001821 else
1822 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001823 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001824 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001825 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001826 }
you.chen35020192022-05-06 11:30:57 +08001827 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001828 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1829 {
1830 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1831 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001832 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001833 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001834 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001835 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1836 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001837 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001838 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001839 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001840 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001841 else
1842 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001843 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001844 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001845 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001846 }
you.chen35020192022-05-06 11:30:57 +08001847 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001848
1849 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1850 {
1851 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1852 return -1;
1853 }
1854
1855 if (memcmp(lynq_auth_str,"1",1) == 0 )
1856 {
1857 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1858 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001859 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001860 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1861 {
1862 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1863 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001864 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001865 }
1866 else
1867 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001868 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001869 *auth = -1;
1870 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001871
you.chen6c2dd9c2022-05-16 17:55:28 +08001872 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001873}
qs.xiong1af5daf2022-03-14 09:12:12 -04001874
qs.xiong1af5daf2022-03-14 09:12:12 -04001875
qs.xiongf1b525b2022-03-31 00:58:23 -04001876int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001877{
you.chen35020192022-05-06 11:30:57 +08001878 char LYNQ_WIFI_CMD[128]={0};
1879 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1880 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001881 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001882 CHECK_IDX(idx, CTRL_AP);
1883
1884 CHECK_WPA_CTRL(CTRL_AP);
1885
you.chenc9928582023-04-24 15:39:37 +08001886 sprintf(LYNQ_WIFI_CMD, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
1887 if (0 != exec_cmd(LYNQ_WIFI_CMD, s_ap_iterface_name, sizeof(s_ap_iterface_name)) || s_ap_iterface_name[0] == '\0')
1888 {
1889 return -1;
1890 }
you.chen35020192022-05-06 11:30:57 +08001891
1892 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1893 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1894
1895 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1896 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1897
you.chen70f377f2023-04-14 18:17:09 +08001898 check_tether_and_notify();
1899
you.chenc9928582023-04-24 15:39:37 +08001900 ret = system_call_v("%s %s", start_stop_ap_script, "start");
1901 if (ret != 0)
1902 {
1903 RLOGE("lynq_wifi_ap_start excute script fail");
1904 return -1;
1905 }
1906
qs.xiong9fbf74e2023-03-28 13:38:22 +08001907 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001908}
1909
qs.xiongf1b525b2022-03-31 00:58:23 -04001910int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001911{
you.chen35020192022-05-06 11:30:57 +08001912 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001913}
1914
qs.xiongf1b525b2022-03-31 00:58:23 -04001915int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001916{
you.chen35020192022-05-06 11:30:57 +08001917 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04001918
you.chen35020192022-05-06 11:30:57 +08001919 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001920
you.chen35020192022-05-06 11:30:57 +08001921 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001922
you.chen35020192022-05-06 11:30:57 +08001923 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
1924
1925 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1926
you.chenb4b121c2022-05-06 17:50:16 +08001927// system("connmanctl tether wifi off");
you.chenc9928582023-04-24 15:39:37 +08001928
1929 ret = system_call_v("%s %s", start_stop_ap_script, "stop");
1930 if (ret != 0)
1931 {
1932 RLOGE("lynq_wifi_ap_start excute script fail");
1933 return -1;
1934 }
1935
qs.xiong9fbf74e2023-03-28 13:38:22 +08001936 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001937}
qs.xiong1af5daf2022-03-14 09:12:12 -04001938
qs.xiongf1b525b2022-03-31 00:58:23 -04001939int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001940{
you.chen35020192022-05-06 11:30:57 +08001941 char lynq_disable_cmd[128] = {0};
1942 char lynq_select_cmd[128] = {0};
1943 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001944 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08001945 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001946
you.chen35020192022-05-06 11:30:57 +08001947 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08001948 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1949 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1950
1951 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1952 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
1953 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04001954
qs.xiong9fbf74e2023-03-28 13:38:22 +08001955 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001956}
1957
qs.xiongf1b525b2022-03-31 00:58:23 -04001958int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001959{
you.chen35020192022-05-06 11:30:57 +08001960 char lynq_disable_cmd[128] = {0};
1961 char lynq_select_cmd[128] = {0};
1962 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001963 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08001964 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001965
you.chen35020192022-05-06 11:30:57 +08001966 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001967
you.chen35020192022-05-06 11:30:57 +08001968 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1969 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1970
1971 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1972 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
1973 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05001974
qs.xiong9fbf74e2023-03-28 13:38:22 +08001975 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001976}
qs.xiongf1b525b2022-03-31 00:58:23 -04001977
you.chen35020192022-05-06 11:30:57 +08001978int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001979{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001980 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08001981 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001982 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001983 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001984 RLOGD("enter lynq_ap_password_set");
1985 if( password == NULL )
1986 {
1987 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08001988 return -1;
1989 }
1990 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08001991 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001992 if(pass_len < 8 || pass_len >= 64)
1993 {
1994 RLOGE("[lynq_ap_password_set]input password len not in rage");
1995 return -1;
you.chen35020192022-05-06 11:30:57 +08001996 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001997
you.chen35020192022-05-06 11:30:57 +08001998 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001999
qs.xiong9fbf74e2023-03-28 13:38:22 +08002000 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
2001 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002002 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002003 return -1;
2004 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002005 else if (auth == LYNQ_WIFI_AUTH_OPEN)
2006 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002007 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
2008 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08002009 }
2010
you.chen35020192022-05-06 11:30:57 +08002011 CHECK_WPA_CTRL(CTRL_AP);
2012
qs.xiong9fbf74e2023-03-28 13:38:22 +08002013 if (auth == LYNQ_WIFI_AUTH_WEP)
2014 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002015 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002016 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
2017 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
2018 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2019 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
2020 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002021 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2022 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002023 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 +08002024 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
2025 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2026 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002027 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
2028 {
2029
qs.xiongc8d92a62023-03-29 17:36:14 +08002030 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 +08002031 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08002032 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002033 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2034 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
2035
2036 }
2037 else
qs.xiongc8d92a62023-03-29 17:36:14 +08002038 {
2039 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002040 return -1;
2041 }
you.chen35020192022-05-06 11:30:57 +08002042
you.chen35020192022-05-06 11:30:57 +08002043 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04002044
qs.xiong9fbf74e2023-03-28 13:38:22 +08002045 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04002046}
2047
you.chen35020192022-05-06 11:30:57 +08002048int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04002049{
you.chen35020192022-05-06 11:30:57 +08002050 FILE * fp;
2051 int len, ret;
2052 int count, index;
2053 char *split_lines[128] = {0};
2054 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002055 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04002056
you.chen35020192022-05-06 11:30:57 +08002057 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002058
you.chen35020192022-05-06 11:30:57 +08002059 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
2060// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002061 if (NULL == fp)
2062 {
2063 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002064 return -1;
2065 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002066
you.chen35020192022-05-06 11:30:57 +08002067 buff = alloca(MAX_RET);
2068 fseek(fp, 0, SEEK_SET);
2069 len = fread(buff, 1, MAX_RET, fp);
2070 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04002071
qs.xiong9fbf74e2023-03-28 13:38:22 +08002072 for(index=0; index < len; index ++)
2073 {
2074 if (memcmp(buff + index, "network={", 9) != 0)
2075 {
you.chen35020192022-05-06 11:30:57 +08002076 continue;
2077 }
2078 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002079 for (; index < len; index ++ )
2080 {
2081 if (buff[index] != '}')
2082 {
you.chen35020192022-05-06 11:30:57 +08002083 continue;
2084 }
2085 buff[index] = '\0';
2086 break;
2087 }
2088 len = buff + index - p;
2089 }
2090
2091 count = lynq_split(p, len, '\n', split_lines);
2092
2093 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002094 for(index=0; index < count; index++)
2095 {
you.chen35020192022-05-06 11:30:57 +08002096 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002097 if (p != NULL)
2098 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002099 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002100 if (*p == '\"')
2101 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002102 p++;
2103 }
you.chen35020192022-05-06 11:30:57 +08002104 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002105 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2106 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002107 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002108 if (*p == '\"')
2109 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002110 p++;
2111 }
2112 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002113 else
2114 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002115 continue;
you.chen35020192022-05-06 11:30:57 +08002116 }
2117
2118 strcpy(password, p);
2119
qs.xiong9fbf74e2023-03-28 13:38:22 +08002120 while(*password != '\0')
2121 {
2122 if (*password == '\"')
2123 {
you.chen35020192022-05-06 11:30:57 +08002124 *password = '\0';
2125 break;
2126 }
2127 password++;
2128 }
2129 ret = 0;
2130 break;
2131 } //end for(index=0; index < count; index++)
2132
2133 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002134}
2135
you.chen35020192022-05-06 11:30:57 +08002136static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
2137 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08002138 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002139
qs.xiong9fbf74e2023-03-28 13:38:22 +08002140 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
2141 {
you.chen35020192022-05-06 11:30:57 +08002142 return -1;
2143 }
2144
2145 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08002146
qs.xiong9fbf74e2023-03-28 13:38:22 +08002147 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
2148 {
2149 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
you.chen70f377f2023-04-14 18:17:09 +08002150 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002151 if (strcmp(lynq_proto_str, "RSN") == 0)
you.chen70f377f2023-04-14 18:17:09 +08002152 {
you.chena6cd55a2022-05-08 12:20:18 +08002153 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002154 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08002155 }
you.chen70f377f2023-04-14 18:17:09 +08002156 else if (strcmp(lynq_proto_str, "WPA") == 0) // need compare when wpa3 supported
2157 {
2158 return 0;
2159 }
you.chena6cd55a2022-05-08 12:20:18 +08002160 }
2161 }
you.chen70f377f2023-04-14 18:17:09 +08002162 else if (*auth == LYNQ_WIFI_AUTH_OPEN || *auth == LYNQ_WIFI_AUTH_WEP)
2163 {
2164 return 0;
2165 }
2166
qs.xiong9fbf74e2023-03-28 13:38:22 +08002167 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
2168 {
you.chen70f377f2023-04-14 18:17:09 +08002169 RLOGE("check ieee80211w error\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002170 return -1;
2171 }
2172 if ( strncmp(lynq_auth_str,"1",1) == 0 )
2173 {
2174
you.chen70f377f2023-04-14 18:17:09 +08002175 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
2176 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002177 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
2178 {
2179
2180 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002181 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002182 }else
2183 {
you.chen70f377f2023-04-14 18:17:09 +08002184 RLOGE("check ieee80211w error, not 1 or 2\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002185 *auth = -1;
2186 return -1;
2187 }
you.chen35020192022-05-06 11:30:57 +08002188 return 0;
2189}
2190
2191int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002192{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002193 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002194 int pass_len, net_no, count, index;
2195 char lynq_tmp_cmd[300]={0};
2196 int net_no_list[128];
2197 lynq_wifi_auth_s net_auth;
2198 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002199 if(pass_len < 8 || pass_len >= 64)
2200 {
2201 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08002202 return -1;
2203 }
2204
2205 CHECK_IDX(idx, CTRL_STA);
2206
2207 net_no = -1;
2208 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
2209
qs.xiong9fbf74e2023-03-28 13:38:22 +08002210 for (index=0; index < count; index++)
2211 {
you.chen35020192022-05-06 11:30:57 +08002212 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002213 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
2214 {
you.chen35020192022-05-06 11:30:57 +08002215 net_no = net_no_list[index];
2216 break;
2217 }
2218 }
2219
qs.xiong9fbf74e2023-03-28 13:38:22 +08002220 if (net_no < 0)
2221 {
you.chen35020192022-05-06 11:30:57 +08002222 return -1;
2223 }
2224
2225 CHECK_WPA_CTRL(CTRL_STA);
2226
2227 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
2228
2229 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2230 DO_OK_FAIL_REQUEST(cmd_save_config);
2231
2232 return 0;
2233}
2234
2235int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
2236
2237 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08002238 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08002239 int count, index;
2240 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08002241 char *buff, *p, *ssid, *ssid_end_flag;
2242 char tmp_ssid[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002243 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08002244
you.chen755332b2022-08-06 16:59:10 +08002245 network_len = 0;
2246 p = NULL;
2247
you.chen35020192022-05-06 11:30:57 +08002248 CHECK_IDX(idx, CTRL_STA);
2249
qs.xiong9fbf74e2023-03-28 13:38:22 +08002250 if (NULL == password)
2251 {
2252 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08002253 return -1;
2254 }
2255
you.chen35020192022-05-06 11:30:57 +08002256 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002257 if (NULL == fp)
2258 {
2259 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002260 return -1;
2261 }
2262
2263 buff = alloca(MAX_RET);
2264 fseek(fp, 0, SEEK_SET);
2265 len = fread(buff, 1, MAX_RET, fp);
2266 fclose(fp);
2267
qs.xiong9fbf74e2023-03-28 13:38:22 +08002268 for(index=0; index < len; index ++)
2269 {
2270 for(; index < len; index ++)
2271 {
2272 if (memcmp(buff + index, "network={", 9) != 0)
2273 {
you.chen35020192022-05-06 11:30:57 +08002274 continue;
2275 }
2276 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002277 for (; index < len; index ++ )
2278 {
2279 if (buff[index] != '}')
2280 {
you.chen35020192022-05-06 11:30:57 +08002281 continue;
2282 }
2283 buff[index] = '\0';
2284 break;
2285 }
you.chen755332b2022-08-06 16:59:10 +08002286 network_len = buff + index - p;
2287 break;
you.chen35020192022-05-06 11:30:57 +08002288 }
2289
qs.xiongb3f26af2023-02-17 18:41:07 +08002290 if (p == NULL)
2291 return -1;
2292
you.chend2fef3f2023-02-13 10:50:35 +08002293 ssid = strstr(p, "ssid=");
2294 if (ssid != NULL) {
2295 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002296 if (ssid[0] == '\"')
2297 {
you.chend2fef3f2023-02-13 10:50:35 +08002298 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2299 break;
2300 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002301 else
2302 {
you.chend2fef3f2023-02-13 10:50:35 +08002303 ssid_end_flag = strstr(ssid, "\n");
2304 if (ssid_end_flag != NULL)
2305 {
2306 ssid_len = (ssid_end_flag - ssid) / 2;
2307 for(i=0; i<ssid_len; i++)
2308 {
2309 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2310 }
2311 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2312 break;
2313 }
2314 }
you.chen35020192022-05-06 11:30:57 +08002315 }
you.chend2fef3f2023-02-13 10:50:35 +08002316
you.chen35020192022-05-06 11:30:57 +08002317 }
2318
qs.xiong9fbf74e2023-03-28 13:38:22 +08002319 if (index >= len || NULL == p || network_len <= 0)
2320 {
you.chen35020192022-05-06 11:30:57 +08002321 return -1;
2322 }
2323
you.chen755332b2022-08-06 16:59:10 +08002324 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08002325
2326 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002327 for(index=0; index < count; index++)
2328 {
you.chen35020192022-05-06 11:30:57 +08002329 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002330 if (p != NULL)
2331 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002332 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002333 if (*p == '\"')
2334 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002335 p++;
2336 }
you.chen35020192022-05-06 11:30:57 +08002337 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002338 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2339 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002340 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002341 if (*p == '\"')
2342 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002343 p++;
2344 }
2345 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002346 else
2347 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002348 continue;
you.chen35020192022-05-06 11:30:57 +08002349 }
2350
qs.xiong13673462023-02-21 19:12:54 +08002351 if (*p == '\"')
2352 p++;
2353 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08002354
qs.xiong13673462023-02-21 19:12:54 +08002355 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002356 while(password - p < 64 && *password != '\0')
2357 {
2358 if (*password == '\"')
2359 {
you.chen35020192022-05-06 11:30:57 +08002360 *password = '\0';
2361 break;
2362 }
2363 password++;
2364 }
2365 ret = 0;
2366 break;
2367 } //end for(index=0; index < count; index++)
2368
2369 return ret;
2370}
2371
2372static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2373{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002374 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04002375
qs.xiong9fbf74e2023-03-28 13:38:22 +08002376 if (sta_ssid == NULL)
2377 {
2378 RLOGE("sta_ssid is null\n");
2379 return -1;
you.chen35020192022-05-06 11:30:57 +08002380 }
2381
qs.xiong9fbf74e2023-03-28 13:38:22 +08002382 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002383
2384 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2385
2386 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2387// DO_OK_FAIL_REQUEST(cmd_save_config);
2388
qs.xiong9fbf74e2023-03-28 13:38:22 +08002389 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002390
2391}
2392
you.chen35020192022-05-06 11:30:57 +08002393static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05002394{
you.chen35020192022-05-06 11:30:57 +08002395 char lynq_disable_cmd[128]={0};
2396 char lynq_select_cmd[128]={0};
2397
2398 CHECK_WPA_CTRL(CTRL_STA);
2399
qs.xiong9fbf74e2023-03-28 13:38:22 +08002400 if (save != 0)
2401 {
you.chenc29444e2022-06-07 18:01:16 +08002402 if (start_flag != 0)
2403 {
2404 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2405 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2406 }
2407 else
2408 {
2409 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2410 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2411 }
you.chen35020192022-05-06 11:30:57 +08002412 DO_OK_FAIL_REQUEST(cmd_save_config);
2413 }
2414
qs.xiong9fbf74e2023-03-28 13:38:22 +08002415 if (start_flag == 0)
2416 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002417 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002418 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2419 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002420 else
2421 {
you.chen35020192022-05-06 11:30:57 +08002422 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2423 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2424 }
2425
2426 return 0;
2427}
2428
2429int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2430{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002431 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002432 CHECK_IDX(idx, CTRL_STA);
2433
you.chen6c2dd9c2022-05-16 17:55:28 +08002434 curr_status_info curr_state;
2435 ap_info_s ap_info;
2436 curr_state.ap = &ap_info;
2437 curr_state.state = NULL;
2438
qs.xiong9fbf74e2023-03-28 13:38:22 +08002439 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2440 {
you.chend2fef3f2023-02-13 10:50:35 +08002441 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002442 return 0;
2443 }
2444
2445 return -1;
you.chen35020192022-05-06 11:30:57 +08002446}
2447
2448int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2449{
you.chen9ac66392022-08-06 17:01:16 +08002450 scan_info_s *scan_list = NULL;
2451 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002452 int scan_len=0;
2453 int save_len=0;
2454 int best_index = -1;
2455 int best_scan_index = -1;
2456 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002457 int i, j, ret;
2458
2459 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002460
2461 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002462 if (info == NULL)
2463 {
you.chen35020192022-05-06 11:30:57 +08002464 return -1;
2465 }
2466
2467 curr_status_info curr_state;
2468 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002469 char status[64];
you.chen35020192022-05-06 11:30:57 +08002470
you.chen9ac66392022-08-06 17:01:16 +08002471 memset(&ap_info, 0, sizeof (ap_info));
2472 memset(status, 0, sizeof (status));
2473
2474 curr_state.ap = &ap_info;
2475 curr_state.state = status;
2476
qs.xiong9fbf74e2023-03-28 13:38:22 +08002477 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2478 {
you.chen35020192022-05-06 11:30:57 +08002479 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002480 if (strcmp(status, STATE_COMPLETED) == 0)
2481 {
2482 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2483 }
2484 else
2485 {
2486 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2487 }
you.chen35020192022-05-06 11:30:57 +08002488 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002489 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002490 return 0;
2491 }
2492
you.chen9ac66392022-08-06 17:01:16 +08002493 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002494 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002495 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2496 {
you.chen9ac66392022-08-06 17:01:16 +08002497 if (NULL != scan_list)
2498 {
2499 free(scan_list);
2500 }
you.chen35020192022-05-06 11:30:57 +08002501 return -1;
2502 }
2503
qs.xiong9fbf74e2023-03-28 13:38:22 +08002504 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2505 {
you.chen9ac66392022-08-06 17:01:16 +08002506 if (NULL != scan_list)
2507 {
2508 free(scan_list);
2509 }
2510 if (NULL != save_list)
2511 {
2512 free(save_list);
2513 }
you.chen35020192022-05-06 11:30:57 +08002514 return -1;
2515 }
2516
qs.xiong9fbf74e2023-03-28 13:38:22 +08002517 for (i=0; i < save_len; i++)
2518 {
2519 for (j=0; j < scan_len; j++)
2520 {
you.chen35020192022-05-06 11:30:57 +08002521 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002522 && save_list[i].base_info.auth == scan_list[j].auth)
2523 {
2524 if (best_rssi == 0)
2525 {
you.chen9ac66392022-08-06 17:01:16 +08002526 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002527 best_rssi = scan_list[j].rssi;
2528 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002529 else if (best_rssi > scan_list[j].rssi)
2530 {
you.chen35020192022-05-06 11:30:57 +08002531 best_index = i;
2532 best_scan_index = j;
2533 best_rssi = scan_list[j].rssi;
2534 }
you.chend2fef3f2023-02-13 10:50:35 +08002535 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 +08002536 break;
2537 }
2538 }
2539 }
2540
qs.xiong9fbf74e2023-03-28 13:38:22 +08002541 if (best_index >= 0)
2542 {
you.chen35020192022-05-06 11:30:57 +08002543 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002544 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 +08002545 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2546 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002547 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002548 }
2549
you.chen9ac66392022-08-06 17:01:16 +08002550 if (NULL != scan_list)
2551 {
2552 free(scan_list);
2553 }
2554 if (NULL != save_list)
2555 {
2556 free(save_list);
2557 }
2558
2559 return ret;
you.chen35020192022-05-06 11:30:57 +08002560}
2561
2562static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2563{
qs.xiongc8d92a62023-03-29 17:36:14 +08002564 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002565 char lynq_ket_mgmt_cmd[64]={0};
2566 char lynq_pairwise_cmd[64]={0};
2567 char lynq_psk_cmd[64]={0};
2568
2569 CHECK_WPA_CTRL(CTRL_STA);
2570
qs.xiong9fbf74e2023-03-28 13:38:22 +08002571 switch(auth)
2572 {
2573 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002574 {
2575 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002576
you.chen35020192022-05-06 11:30:57 +08002577 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002578// DO_OK_FAIL_REQUEST(cmd_save_config);
2579 break;
2580 }
2581 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002582 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002583 {
2584 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2585 {
you.chen35020192022-05-06 11:30:57 +08002586 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2587 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002588 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2589 {
you.chena6cd55a2022-05-08 12:20:18 +08002590 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002591 }
2592 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2593 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002594
you.chen35020192022-05-06 11:30:57 +08002595 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2596 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2597 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002598
qs.xiong9fbf74e2023-03-28 13:38:22 +08002599 if (password != NULL)
2600 {
you.chen35020192022-05-06 11:30:57 +08002601 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2602 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002603 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002604 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002605
you.chen35020192022-05-06 11:30:57 +08002606// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002607 break;
2608 }
2609 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2610 {
qs.xiong3e506812023-04-06 11:08:48 +08002611 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002612 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002613 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2614 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2615
qs.xiong3e506812023-04-06 11:08:48 +08002616 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002617 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2618 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2619 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2620
2621 break;
2622 }
2623 case LYNQ_WIFI_AUTH_WPA3_PSK:
2624 {
qs.xiong3e506812023-04-06 11:08:48 +08002625 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiong03556d52023-04-17 09:45:19 +08002626 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002627 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2628 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2629
qs.xiong3e506812023-04-06 11:08:48 +08002630 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002631 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2632 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2633 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2634
2635 break;
2636 }
2637 default:
2638 return -1;
you.chen35020192022-05-06 11:30:57 +08002639 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002640
qs.xiong9fbf74e2023-03-28 13:38:22 +08002641 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002642}
qs.xiong7a105ce2022-03-02 09:43:11 -05002643
you.chen35020192022-05-06 11:30:57 +08002644static int inner_get_curr_net_no(int interface) {
2645 curr_status_info curr_state;
2646 curr_state.ap = NULL;
2647 curr_state.state = NULL;
2648
qs.xiong9fbf74e2023-03-28 13:38:22 +08002649 if (0 != inner_get_status_info(interface, &curr_state))
2650 {
you.chen35020192022-05-06 11:30:57 +08002651 return -1;
2652 }
2653
2654 return curr_state.net_no;
2655}
2656
2657int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002658{
you.chen35020192022-05-06 11:30:57 +08002659 int net_no;
2660 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002661
you.chen35020192022-05-06 11:30:57 +08002662 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002663
qs.xiong9fbf74e2023-03-28 13:38:22 +08002664 if (net_no < 0)
2665 {
you.chen35020192022-05-06 11:30:57 +08002666 return -1;
2667 }
2668
2669 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002670}
2671
you.chen35020192022-05-06 11:30:57 +08002672int lynq_wifi_sta_connect(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw)
qs.xiong7a105ce2022-03-02 09:43:11 -05002673{
you.chen35020192022-05-06 11:30:57 +08002674 int count, net_no, index;
2675 int net_no_list[128];
2676 lynq_wifi_auth_s net_auth;
you.chen70f377f2023-04-14 18:17:09 +08002677 curr_status_info curr_state;
2678 ap_info_s ap_info;
2679 char status[64];
qs.xiongf1b525b2022-03-31 00:58:23 -04002680
qs.xiong9fbf74e2023-03-28 13:38:22 +08002681 if (ssid == NULL || *ssid == '\0')
2682 {
2683 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002684 return -1;
2685 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002686
qs.xiong9fbf74e2023-03-28 13:38:22 +08002687 if (LYNQ_WIFI_AUTH_OPEN != auth)
2688 {
2689 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
you.chen70f377f2023-04-14 18:17:09 +08002690 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002691 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002692 return -1;
2693 }
2694 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002695
you.chen70f377f2023-04-14 18:17:09 +08002696
2697 pthread_mutex_lock(&s_global_check_mutex);
2698 if (s_sta_status != INNER_STA_STATUS_INIT)
2699 {
2700 s_sta_status = INNER_STA_STATUS_CANCEL;
2701 pthread_cond_signal(&s_global_check_cond);
2702 }
2703 pthread_mutex_unlock(&s_global_check_mutex);
2704
you.chen35020192022-05-06 11:30:57 +08002705 CHECK_IDX(idx, CTRL_STA);
you.chen70f377f2023-04-14 18:17:09 +08002706 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002707
2708 net_no = -1;
you.chen70f377f2023-04-14 18:17:09 +08002709 memset(&ap_info, 0, sizeof (ap_info));
2710 memset(status, 0, sizeof (status));
you.chen35020192022-05-06 11:30:57 +08002711
you.chen70f377f2023-04-14 18:17:09 +08002712 curr_state.ap = &ap_info;
2713 curr_state.state = status;
2714
2715 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002716 {
you.chen70f377f2023-04-14 18:17:09 +08002717 if (strcmp(status, STATE_COMPLETED) == 0 && strcmp(ap_info.ap_ssid, ssid) ==0 && ap_info.auth == auth)
2718 {
2719 net_no = curr_state.net_no;
2720 if (0 == lynq_sta_ssid_password_get(idx, &ap_info, ap_info.psw)
2721 && strcmp(ap_info.psw, psw) == 0)
2722 {
2723 RLOGD("already connected\n");
2724
2725 pthread_mutex_lock(&s_global_check_mutex);
2726 s_sta_status = INNER_STA_STATUS_CONNECTED;
2727 pthread_cond_signal(&s_global_check_cond);
2728 pthread_mutex_unlock(&s_global_check_mutex);
2729 return 0;
2730 }
you.chen35020192022-05-06 11:30:57 +08002731 }
2732 }
2733
you.chen70f377f2023-04-14 18:17:09 +08002734 if (net_no == -1)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002735 {
you.chen70f377f2023-04-14 18:17:09 +08002736 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2737
2738 for (index=0; index < count; index++)
2739 {
2740 net_auth = -1;
2741 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2742 {
2743 net_no = net_no_list[index];
2744 break;
2745 }
you.chen35020192022-05-06 11:30:57 +08002746 }
2747
you.chen70f377f2023-04-14 18:17:09 +08002748 if (net_no < 0)
2749 {
2750 net_no = lynq_add_network(CTRL_STA);
2751 if (net_no == -1)
2752 {
2753 return -1;
2754 }
2755
2756 RLOGD("net no is %d\n", net_no);
2757 if (0 != inner_set_sta_ssid(net_no, ssid))
2758 {
2759 return -1;
2760 }
you.chen35020192022-05-06 11:30:57 +08002761 }
2762 }
2763
qs.xiong9fbf74e2023-03-28 13:38:22 +08002764 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2765 {
you.chen35020192022-05-06 11:30:57 +08002766 return -1;
2767 }
2768
you.chen70f377f2023-04-14 18:17:09 +08002769
2770 DO_OK_FAIL_REQUEST(cmd_disconnect);
2771 usleep(200*1000);
2772
2773 ret = inner_sta_start_stop(net_no, 1, 1);
2774
2775 pthread_mutex_lock(&s_global_check_mutex);
2776 s_sta_status = INNER_STA_STATUS_CONNECTING;
2777 strcpy(s_sta_current_connecting_ssid, ssid);
2778 struct timeval now;
2779 gettimeofday(&now,NULL);
2780 s_sta_connect_timeout.tv_sec = now.tv_sec + MAX_CONNNECT_TIME;
2781 s_sta_connect_timeout.tv_nsec = now.tv_usec*1000;
2782 pthread_cond_signal(&s_global_check_cond);
2783 pthread_mutex_unlock(&s_global_check_mutex);
2784 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002785}
2786
you.chen35020192022-05-06 11:30:57 +08002787int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002788{
you.chen35020192022-05-06 11:30:57 +08002789 ap_info_s ap;
2790 curr_status_info curr_state;
2791 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002792
qs.xiong9fbf74e2023-03-28 13:38:22 +08002793 if (ssid == NULL || *ssid == '\0')
2794 {
2795 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002796 return -1;
2797 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002798
you.chen35020192022-05-06 11:30:57 +08002799 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002800
you.chen35020192022-05-06 11:30:57 +08002801 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002802 curr_state.state = NULL;
2803
qs.xiong9fbf74e2023-03-28 13:38:22 +08002804 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2805 {
you.chen35020192022-05-06 11:30:57 +08002806 return 0;
2807 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002808
qs.xiong9fbf74e2023-03-28 13:38:22 +08002809 if (strcmp(ap.ap_ssid, ssid) != 0)
2810 {
you.chen35020192022-05-06 11:30:57 +08002811 return 0;
2812 }
2813
you.chen70f377f2023-04-14 18:17:09 +08002814 pthread_mutex_lock(&s_global_check_mutex);
2815 s_sta_status = INNER_STA_STATUS_DISCONNECTING;
2816 pthread_mutex_unlock(&s_global_check_mutex);
you.chen35020192022-05-06 11:30:57 +08002817 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002818}
qs.xiong97fa59b2022-04-07 05:41:29 -04002819
you.chena6cd55a2022-05-08 12:20:18 +08002820int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2821{
qs.xiongad2f89d2023-01-18 13:17:41 +08002822// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2823// const char *lynq_reconnect_cmd = "RECONNECT";
2824 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2825 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2826// 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 -05002827
you.chen35020192022-05-06 11:30:57 +08002828 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08002829 CHECK_WPA_CTRL(CTRL_STA);
2830
you.chenc9928582023-04-24 15:39:37 +08002831 ret = system_call_v("%s %s", start_stop_sta_script, "start");
2832 if (ret != 0)
qs.xiongad2f89d2023-01-18 13:17:41 +08002833 {
you.chenc9928582023-04-24 15:39:37 +08002834 RLOGE("lynq_wifi_ap_start excute script fail");
you.chen35020192022-05-06 11:30:57 +08002835 return -1;
2836 }
qs.xiong9c99fa92022-03-15 08:03:26 -04002837
qs.xiongad2f89d2023-01-18 13:17:41 +08002838 system(lynq_enable_sta_cmd);
2839 system(lynq_reconnect_cmd);
2840// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002841 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002842}
2843
you.chen35020192022-05-06 11:30:57 +08002844int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04002845{
qs.xiongad2f89d2023-01-18 13:17:41 +08002846// char lynq_disable_network_cmd[MAX_CMD];
2847// curr_status_info curr_state;
2848// ap_info_s ap_info;
you.chen35020192022-05-06 11:30:57 +08002849
qs.xiongad2f89d2023-01-18 13:17:41 +08002850 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 +08002851 CHECK_IDX(idx, CTRL_STA);
2852 CHECK_WPA_CTRL(CTRL_STA);
2853
qs.xiongad2f89d2023-01-18 13:17:41 +08002854 system(lynq_disable_sta_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002855 DO_OK_FAIL_REQUEST(cmd_save_config);
you.chenc9928582023-04-24 15:39:37 +08002856
2857 ret = system_call_v("%s %s", start_stop_sta_script, "stop");
2858 if (ret != 0)
2859 {
2860 RLOGE("lynq_wifi_ap_start excute script fail");
2861 return -1;
2862 }
2863
you.chena6cd55a2022-05-08 12:20:18 +08002864 return 0;
2865// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04002866}
qs.xiong7a105ce2022-03-02 09:43:11 -05002867
you.chen35020192022-05-06 11:30:57 +08002868//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
2869// int i, count;
2870// char *p;
2871// const char * FLAG_SSID = "ssid=";
2872// const char * FLAG_SBSID = "bssid=";
2873// const char * FLAG_KEY_MGMT = "key_mgmt=";
2874// const char * FLAG_FREQ = "freq=";
2875// char lynq_sta_cmd[MAX_CMD];
2876// char *split_lines[128] = {0};
2877
2878// CHECK_WPA_CTRL(CTRL_AP);
2879
2880// sprintf(lynq_sta_cmd, "STA %s", bssid);
2881
2882// DO_REQUEST(lynq_sta_cmd);
2883
2884// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2885
2886// for(i=0; i < count; i++) {
2887// p = strstr(split_lines[i], FLAG_SSID);
2888// if (p != NULL) {
2889// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
2890// continue;
2891// }
2892// }
2893
2894// lynq_get_interface_ip(idx, ap->ap_ip);
2895// lynq_ap_password_set(idx, ap->psw);
2896
2897// return 0;
2898//}
2899
2900static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
2901 curr_status_info curr_state;
2902 curr_state.ap = ap;
2903 curr_state.state = NULL;
2904 return inner_get_status_info(interface, &curr_state);
2905}
2906
2907int 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 -04002908{
you.chend2fef3f2023-02-13 10:50:35 +08002909 int index, line_count;
2910 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08002911 const char *lynq_first_sta_cmd = "STA-FIRST";
2912 char lynq_next_sta_cmd[MAX_CMD];
2913 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08002914 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002915
you.chen35020192022-05-06 11:30:57 +08002916 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002917
you.chen35020192022-05-06 11:30:57 +08002918 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002919
you.chen35020192022-05-06 11:30:57 +08002920// ap_info_s * tmp_ap;
2921// device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002922 if (ap == NULL || list == NULL || len == NULL)
2923 {
2924 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08002925 return -1;
2926 }
2927
2928// ap = &tmp_ap;
2929// list = &tmp_list;
2930 *ap = malloc(sizeof (ap_info_s));
2931
qs.xiong9fbf74e2023-03-28 13:38:22 +08002932 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0)
2933 {
2934 RLOGE("inner_get_status_info_ap !=0\n");
you.chen35020192022-05-06 11:30:57 +08002935 return -1;
2936 }
2937
2938 lynq_get_interface_ip(idx, (*ap)->ap_ip);
2939 lynq_ap_password_get(idx, (*ap)->psw);
2940
you.chen35020192022-05-06 11:30:57 +08002941 DO_REQUEST(lynq_first_sta_cmd);
2942
2943 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002944 while (reply_len > 0)
2945 {
2946 if (memcmp(cmd_reply, "FAIL", 4) == 0)
2947 {
you.chen35020192022-05-06 11:30:57 +08002948 break;
2949 }
2950 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2951 bssid[index] = malloc(strlen(split_lines[0]) + 1);
2952 strcpy(bssid[index], split_lines[0]);
2953 index++;
2954 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
2955 reply_len = MAX_RET;
2956 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08002957 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 +08002958 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
2959 {
2960 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08002961 break;
2962 }
2963 }
2964
2965 *len = index;
2966
2967 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08002968 for (index=0; index < *len; index++)
2969 {
you.chend2fef3f2023-02-13 10:50:35 +08002970 dev_info = &(*list)[index];
2971 memset(dev_info, 0, sizeof(device_info_s));
2972 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
2973 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
2974 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
2975 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08002976 free(bssid[index]);
2977 }
2978
2979 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002980}
2981
you.chen35020192022-05-06 11:30:57 +08002982int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04002983{
you.chen35020192022-05-06 11:30:57 +08002984 int i, count, index, count_words;
2985 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
2986 char *split_lines[128] = {0};
2987 char *split_words[128] = {0};
2988 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04002989
qs.xiong9fbf74e2023-03-28 13:38:22 +08002990 if (list == NULL || len == NULL)
2991 {
you.chen35020192022-05-06 11:30:57 +08002992 return -1;
2993 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002994
you.chen9ac66392022-08-06 17:01:16 +08002995 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
2996 {
2997 usleep(100 * 1000);
2998 }
2999
you.chen35020192022-05-06 11:30:57 +08003000 CHECK_IDX(idx, CTRL_STA);
3001
3002 CHECK_WPA_CTRL(CTRL_STA);
3003
3004 DO_REQUEST(lynq_scan_result_cmd);
3005
3006 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3007 *len = count - 1;
3008 *list = malloc(sizeof (scan_info_s) * *len);
3009
3010 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08003011 for (index=0; index <count_words; index++)
3012 {
3013 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08003014 }
3015
qs.xiong9fbf74e2023-03-28 13:38:22 +08003016 for(index = 1;index < count; index++)
3017 {
3018 RLOGD("---- %s\n",split_lines[index]);
you.chen35020192022-05-06 11:30:57 +08003019 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
3020 if (count_words < 4)
3021 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003022 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08003023 //bssid / frequency / signal level / flags / ssid
3024 p = (*list) + index - 1;
3025 strcpy(p->mac, split_words[0]);
3026 p->band = convert_band_from_freq(atoi(split_words[1]));
3027 p->rssi = -1 * atoi( split_words[2]);
3028 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chend2fef3f2023-02-13 10:50:35 +08003029 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
you.chen35020192022-05-06 11:30:57 +08003030 }
3031
3032 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003033}
qs.xiong97fa59b2022-04-07 05:41:29 -04003034
you.chen35020192022-05-06 11:30:57 +08003035int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
3036{
3037 int count, net_no, index;
3038 int net_no_list[128];
3039 lynq_wifi_auth_s net_auth;
3040 char lynq_remove_cmd[MAX_CMD];
3041
qs.xiong9fbf74e2023-03-28 13:38:22 +08003042 if (ssid == NULL || *ssid == '\0')
3043 {
3044 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08003045 return -1;
3046 }
3047
3048 CHECK_IDX(idx, CTRL_STA);
3049
3050 CHECK_WPA_CTRL(CTRL_STA);
3051
3052 net_no = -1;
3053 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
3054
qs.xiong9fbf74e2023-03-28 13:38:22 +08003055 for (index=0; index < count; index++)
3056 {
you.chen35020192022-05-06 11:30:57 +08003057 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003058 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
3059 {
you.chen35020192022-05-06 11:30:57 +08003060 net_no = net_no_list[index];
3061 break;
3062 }
3063 }
3064
qs.xiong9fbf74e2023-03-28 13:38:22 +08003065 if (net_no < 0)
3066 {
you.chen35020192022-05-06 11:30:57 +08003067 return 0;
3068 }
3069
3070 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
3071
3072 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
3073 DO_OK_FAIL_REQUEST(cmd_save_config);
3074
3075 return 0;
3076}
3077
3078int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003079{
you.chend2fef3f2023-02-13 10:50:35 +08003080 int count, index;
you.chen35020192022-05-06 11:30:57 +08003081 int net_no_list[128];
3082 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003083 RLOGD("enter lynq_get_sta_saved_ap api\n");
3084 if (list == NULL || len == NULL)
3085 {
3086 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08003087 return -1;
3088 }
3089
3090 CHECK_IDX(idx, CTRL_STA);
3091
3092// CHECK_WPA_CTRL(CTRL_STA);
3093
3094 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003095 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08003096
you.chen057aac42023-04-13 14:06:58 +08003097 if (count < 0)
3098 {
3099 RLOGE("list network fail");
3100 return count;
3101 }
3102 else if (count == 0)
3103 {
3104 *list = NULL;
3105 *len = 0;
3106 return 0;
3107 }
3108
you.chen35020192022-05-06 11:30:57 +08003109 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08003110 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08003111 *len = count;
3112
qs.xiong9fbf74e2023-03-28 13:38:22 +08003113 for (index=0; index < count; index++)
3114 {
you.chen35020192022-05-06 11:30:57 +08003115 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
you.chen35020192022-05-06 11:30:57 +08003116 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
you.chen35020192022-05-06 11:30:57 +08003117 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003118 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
you.chen057aac42023-04-13 14:06:58 +08003119 {
you.chen35020192022-05-06 11:30:57 +08003120 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
3121 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003122 else
you.chen057aac42023-04-13 14:06:58 +08003123 {
you.chen35020192022-05-06 11:30:57 +08003124 (*list)[index].base_info.band = -1;
3125 }
you.chen057aac42023-04-13 14:06:58 +08003126 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08003127 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08003128 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003129 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08003130 return 0;
3131}
3132
3133int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
3134{
qs.xiongc8d92a62023-03-29 17:36:14 +08003135 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08003136 const char *lynq_scan_cmd = "SCAN";
3137
3138 CHECK_IDX(idx, CTRL_STA);
3139
3140 CHECK_WPA_CTRL(CTRL_STA);
3141
you.chen70f377f2023-04-14 18:17:09 +08003142// system(clean_last_re); // youchen @ 2023-04-14 temp delete ,next time to fix the orginal bug
you.chen9ac66392022-08-06 17:01:16 +08003143 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08003144 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003145 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
3146 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003147 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003148 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
3149 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003150 g_sta_scan_finish_flag = 1;
3151 return -1;
3152 }
you.chen35020192022-05-06 11:30:57 +08003153
3154 return 0;
3155}
3156
3157int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003158 if (cb == NULL)
3159 {
3160 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003161 return -1;
3162 }
3163
you.chene9d00032023-04-24 13:55:29 +08003164 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +08003165 g_ap_callback_priv = priv;
3166 g_ap_callback_func = cb;
3167
you.chene9d00032023-04-24 13:55:29 +08003168 if (g_ap_watcher_pid == 0 )
3169 {
3170 if(pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL) < 0)
3171 {
3172 g_ap_watcher_pid = 0;
3173 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3174 RLOGE("[wifi error]creat APWatcherThreadProc fail");
3175 return -1;
3176 }
3177 }
3178
3179 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3180 RLOGD("creat APWatcherTheradProc susccs");
3181
you.chen35020192022-05-06 11:30:57 +08003182 return 0;
3183}
3184
3185int lynq_unreg_ap_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003186 if (g_ap_callback_priv == priv)
3187 {
you.chen35020192022-05-06 11:30:57 +08003188 g_ap_callback_func = NULL;
3189 g_ap_callback_priv = NULL;
3190 return 0;
3191 }
3192 return -1;
3193}
3194
3195int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08003196 if (cb == NULL)
3197 {
3198 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003199 return -1;
3200 }
3201
you.chene9d00032023-04-24 13:55:29 +08003202 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +08003203 g_sta_callback_priv = priv;
3204 g_sta_callback_func = cb;
3205
you.chene9d00032023-04-24 13:55:29 +08003206 if (g_sta_watcher_pid == 0 ) {
3207 if(pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL) < 0)
3208 {
3209 g_sta_watcher_pid = 0;
3210 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3211 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
3212 return -1;
3213 }
3214 }
3215
3216 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3217 RLOGD("creat STAWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +08003218 return 0;
3219}
3220
3221int lynq_unreg_sta_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003222 if (g_sta_callback_priv == priv)
3223 {
you.chen35020192022-05-06 11:30:57 +08003224 g_sta_callback_func = NULL;
3225 g_sta_callback_priv = NULL;
3226 return 0;
3227 }
3228 return -1;
3229}
3230
3231
3232static int inner_get_status_info_state (int interface, char *state) {
3233 curr_status_info curr_state;
3234 curr_state.ap = NULL;
3235 curr_state.state = state;
3236 return inner_get_status_info(interface, &curr_state);
3237}
3238
3239int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
3240{
3241 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003242 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08003243 CHECK_IDX(idx, CTRL_AP);
3244
qs.xiong9fbf74e2023-03-28 13:38:22 +08003245 if (inner_get_status_info_state(CTRL_AP, state) != 0)
3246 {
you.chen35020192022-05-06 11:30:57 +08003247 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3248 return 0;
3249 }
3250
qs.xiong9fbf74e2023-03-28 13:38:22 +08003251 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3252 {
you.chen35020192022-05-06 11:30:57 +08003253 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
3254 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003255 else
3256 {
you.chen35020192022-05-06 11:30:57 +08003257 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3258 }
3259
3260 return 0;
3261}
3262
3263int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
3264 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003265 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08003266 CHECK_IDX(idx, CTRL_STA);
3267
qs.xiong9fbf74e2023-03-28 13:38:22 +08003268 if (inner_get_status_info_state(CTRL_STA, state) != 0)
3269 {
you.chen35020192022-05-06 11:30:57 +08003270 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3271 return 0;
3272 }
3273
qs.xiong9fbf74e2023-03-28 13:38:22 +08003274 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3275 {
you.chen35020192022-05-06 11:30:57 +08003276 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
3277 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003278 else
3279 {
you.chen35020192022-05-06 11:30:57 +08003280 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3281 }
3282
3283 return 0;
3284}
3285
3286int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
3287// CHECK_IDX(idx, CTRL_AP);
3288// int ret = 0;
3289// size_t reply_len = MAX_RET;
3290// char cmd_reply[MAX_RET]={0};
3291// const char * cmd_str = "GET country";
3292// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
3293// do{
3294// if (NULL == s_lynq_wpa_ctrl) {
3295// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
3296// if (NULL == s_lynq_wpa_ctrl ) {
3297// printf("wpa_ctrl_open fail\n");
3298// return -1;
3299// }
3300// }
3301// }while(0);
3302
3303// do {
3304// reply_len = MAX_RET;
3305// cmd_reply[0] = '\0';
3306// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08003307// 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 +08003308// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003309// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08003310// return ret;
3311// }
3312// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08003313// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08003314// }while(0);
3315
3316 FILE *fp;
3317 size_t i = 0;
3318 char lynq_cmd_ret[MAX_RET]={0};
3319
3320// CHECK_IDX(idx, CTRL_AP);
3321
3322 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003323 {
3324 perror("popen error!");
3325 return -1;
3326 }
you.chen35020192022-05-06 11:30:57 +08003327 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
3328 {
3329 perror("fread fail!");
3330 return -1;
3331 }
3332
qs.xiong9fbf74e2023-03-28 13:38:22 +08003333 for(i=0; i < strlen(lynq_cmd_ret); i++)
3334 {
3335 if (lynq_cmd_ret[i] == ' ')
3336 {
you.chen35020192022-05-06 11:30:57 +08003337 lynq_cmd_ret[i] = '\0';
3338 break;
3339 }
3340 }
3341
3342 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003343 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08003344
3345 int ret=pclose(fp);
3346 if(ret==-1)
3347 {
3348 perror("close file faild");
3349 }
3350
3351 return 0;
3352}
3353
3354int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
3355// const char * cmd_str = "GET country";
3356// CHECK_IDX(idx, CTRL_AP);
3357// CHECK_WPA_CTRL(CTRL_STA);
3358
3359// DO_REQUEST(cmd_str);
3360// printf("result %s\n", cmd_reply);
3361
qs.xiong9fbf74e2023-03-28 13:38:22 +08003362 if (country_code == NULL || *country_code == '\0')
3363 {
3364 RLOGD("bad country code\n");
you.chen35020192022-05-06 11:30:57 +08003365 return -1;
3366 }
3367
3368 char lynq_country_cmd[MAX_CMD];
3369 sprintf(lynq_country_cmd, "wl country %s", country_code);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003370 if (system(lynq_country_cmd) == 0)
3371 {
you.chen35020192022-05-06 11:30:57 +08003372 return 0;
3373 }
3374
3375 return -1;
3376}
3377
3378int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
3379{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003380 RLOGD("enter lynq_get_connect_ap_mac\n");
3381 if (mac == NULL)
3382 {
3383 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08003384 return -1;
3385 }
3386
3387 CHECK_IDX(idx, CTRL_STA);
3388 ap_info_s ap;
3389 ap.ap_mac[0] = '\0';
3390
qs.xiong9fbf74e2023-03-28 13:38:22 +08003391 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3392 {
you.chen35020192022-05-06 11:30:57 +08003393 return -1;
3394 }
3395 strcpy(mac, ap.ap_mac);
3396
3397 return 0;
3398}
3399
3400int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
3401{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003402 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08003403 struct ifaddrs *ifaddr_header, *ifaddr;
3404 struct in_addr * ifa;
3405 const char * ifaName = "wlan0";
3406 if (ip == NULL)
3407 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003408 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08003409 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003410 }
you.chenf58b3c92022-06-21 16:53:48 +08003411
qs.xiong9fbf74e2023-03-28 13:38:22 +08003412 if (idx == 1)
3413 {
you.chenc9928582023-04-24 15:39:37 +08003414 ifaName = s_ap_iterface_name;
you.chen9ac66392022-08-06 17:01:16 +08003415 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003416 else if (idx != 0)
3417 {
you.chen35020192022-05-06 11:30:57 +08003418 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003419 }
you.chen35020192022-05-06 11:30:57 +08003420
you.chen9ac66392022-08-06 17:01:16 +08003421 if (getifaddrs(&ifaddr_header) == -1)
3422 {
you.chen35020192022-05-06 11:30:57 +08003423 perror("getifaddrs");
3424 return -1;
3425 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08003426 }
you.chen35020192022-05-06 11:30:57 +08003427
3428
you.chen9ac66392022-08-06 17:01:16 +08003429 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3430 {
3431 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08003432 continue;
you.chen9ac66392022-08-06 17:01:16 +08003433 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3434 {
3435 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3436 {
3437 // is a valid IP4 Address
3438 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3439 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003440 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08003441 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003442 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08003443 return 0;
3444 }
3445 }
3446 }
qs.xiongc4f007c2023-02-08 18:16:58 +08003447 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003448 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08003449 return -1;
you.chen35020192022-05-06 11:30:57 +08003450}
3451
3452int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3453{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003454 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08003455 int count;
3456 size_t i;
3457 char *split_words[128] = {0};
3458 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3459
3460 CHECK_WPA_CTRL(idx);
3461
3462 DO_REQUEST(lynq_get_mac_cmd);
3463
qs.xiong9fbf74e2023-03-28 13:38:22 +08003464 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3465 {
3466 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08003467 return -1;
3468 }
3469
3470 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3471
qs.xiong9fbf74e2023-03-28 13:38:22 +08003472 if (count < 2)
3473 {
you.chen35020192022-05-06 11:30:57 +08003474 return -1;
3475 }
3476
qs.xiong9fbf74e2023-03-28 13:38:22 +08003477 for (i=0; i < strlen(split_words[1]); i++ )
3478 {
3479 if (split_words[1][i] != ' ')
3480 {
you.chen35020192022-05-06 11:30:57 +08003481 break;
3482 }
3483 }
3484
3485 strcpy(mac, split_words[1] + i);
3486
3487 return 0;
3488}
3489
3490int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3491{
3492// int count;
3493// char *split_words[128] = {0};
3494// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3495
3496// if (rssi == NULL) {
3497// return -1;
3498// }
3499
3500// CHECK_IDX(idx, CTRL_STA);
3501
3502// CHECK_WPA_CTRL(CTRL_STA);
3503
3504// DO_REQUEST(lynq_get_rssi_cmd);
3505
3506// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3507// return -1;
3508// }
3509
3510// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3511
3512// if (count < 2) {
3513// return -1;
3514// }
3515
3516// *rssi = atoi(split_words[1]) * -1;
3517
you.chen35020192022-05-06 11:30:57 +08003518 char lynq_cmd_ret[MAX_RET]={0};
3519
qs.xiongff0ae0f2022-10-11 15:47:14 +08003520/*******change other cmd to get rssi*******
3521 *
3522 *wl rssi ---> wl -i wlan0 rssi
3523 *
3524 ***** change by qs.xiong 20221011*******/
you.chen23c4a5f2023-04-12 16:46:00 +08003525 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiong9fbf74e2023-03-28 13:38:22 +08003526 {
you.chen23c4a5f2023-04-12 16:46:00 +08003527 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen35020192022-05-06 11:30:57 +08003528 return -1;
3529 }
you.chen9f17e4d2022-06-06 17:18:18 +08003530 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003531/****** if got rssi is 0,means sta didn't connected any device****/
3532 if(*rssi == 0)
3533 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003534 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chen23c4a5f2023-04-12 16:46:00 +08003535 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003536 }
you.chen35020192022-05-06 11:30:57 +08003537
3538 return 0;
3539}
3540
3541int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3542{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003543 RLOGD("enter lynq_get_connect_ap_band\n");
3544 if (band == NULL)
3545 {
you.chen35020192022-05-06 11:30:57 +08003546 return -1;
3547 }
3548
3549 CHECK_IDX(idx, CTRL_STA);
3550 ap_info_s ap;
3551 ap.band = -1;
3552
qs.xiong9fbf74e2023-03-28 13:38:22 +08003553 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3554 {
you.chen35020192022-05-06 11:30:57 +08003555 return -1;
3556 }
3557 *band = ap.band;
3558
3559 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003560}
you.chenf58b3c92022-06-21 16:53:48 +08003561
3562int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3563{
qs.xionge4cbf1c2023-02-28 18:22:49 +08003564 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003565
3566 if (ip == NULL)
3567 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003568 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003569 return -1;
3570 }
3571
3572 CHECK_IDX(idx, CTRL_STA);
3573
qs.xionge4cbf1c2023-02-28 18:22:49 +08003574 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003575 {
3576 return -1;
3577 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003578
3579 return inner_get_ip_by_mac(bssid, ip, 32); //better input by user
you.chenf58b3c92022-06-21 16:53:48 +08003580}
3581
qs.xiong026c5c72022-10-17 11:15:45 +08003582int lynq_ap_connect_num(int sta_number)
3583{
3584 char lynq_limit_cmd[32]={0};
3585 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003586 if((sta_number < 1 ) && (sta_number > 15))
3587 {
3588 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003589 return -1;
3590 }
3591 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3592 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003593 if(ret != 0)
3594 {
3595 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003596 }
3597 return 0;
3598}
you.chenf58b3c92022-06-21 16:53:48 +08003599
qs.xiong77905552022-10-17 11:19:57 +08003600int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3601{
3602
3603 char lynq_wifi_acs_cmd[128]={0};
3604 char lynq_cmd_mode[128]={0};
3605 char lynq_cmd_slect[128]={0};
3606
qs.xiong9fbf74e2023-03-28 13:38:22 +08003607 if((acs_mode != 2) && (acs_mode != 5))
3608 {
qs.xiong77905552022-10-17 11:19:57 +08003609 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3610 }
3611
qs.xiong9fbf74e2023-03-28 13:38:22 +08003612 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3613 {
qs.xiong77905552022-10-17 11:19:57 +08003614 return -1;
3615 }
3616
3617 CHECK_IDX(idx, CTRL_AP);
3618
3619 CHECK_WPA_CTRL(CTRL_AP);
3620
3621 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3622 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3623 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3624
3625 DO_OK_FAIL_REQUEST(cmd_disconnect);
3626 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3627 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3628 DO_OK_FAIL_REQUEST(cmd_save_config);
3629 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3630
3631 return 0;
3632}
you.chen0f5c6432022-11-07 18:31:14 +08003633//you.chen add for tv-box start
3634static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3635 FILE *fp;
3636 //printf("to exec cmd:%s\n", str_cmd);
3637 if((fp=popen(str_cmd,"r"))==NULL)
3638 {
3639 perror("popen error!");
3640 return -1;
3641 }
3642 if((fread(str_cmd_ret,max_len,1,fp))<0)
3643 {
3644 perror("fread fail!");
3645 fclose(fp);
3646 return -1;
3647 }
3648 fclose(fp);
3649 return 0;
3650}
3651
3652static int get_netmask_length(const char* mask)
3653{
3654 int masklen=0, i=0;
3655 int netmask=0;
3656
3657 if(mask == NULL)
3658 {
3659 return 0;
3660 }
3661
3662 struct in_addr ip_addr;
3663 if( inet_aton(mask, &ip_addr) )
3664 {
3665 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003666 }else
3667 {
you.chen0f5c6432022-11-07 18:31:14 +08003668 netmask = 0;
3669 return 0;
3670 }
3671
3672 while(0 == (netmask & 0x01) && i<32)
3673 {
3674 i++;
3675 netmask = netmask>>1;
3676 }
3677 masklen = 32-i;
3678 return masklen;
3679}
3680
3681static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3682 int mask_len;
3683 char *p;
3684 char tmp[64] = {0};
you.chenc9928582023-04-24 15:39:37 +08003685 sprintf(tmp, "ifconfig %s | grep Mask", s_ap_iterface_name);
3686 if (exec_cmd(tmp, str_cmd_ret, max_len) != 0)
you.chen0f5c6432022-11-07 18:31:14 +08003687 return -1;
3688 p = strstr(str_cmd_ret, "Mask:");
3689 if (p == NULL)
3690 return -1;
3691 mask_len = get_netmask_length(p + 5);
3692 if (mask_len == 0)
3693 return -1;
3694 p = strstr(str_cmd_ret, "inet addr:");
3695 if (p == NULL)
3696 return -1;
3697 strcpy(tmp, p + 10);
3698 p = strstr(tmp, " ");
3699 if (p != NULL)
3700 *p = '\0';
3701 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
3702 return 0;
3703}
3704
3705static void GBWWatchThreadProc() {
3706 int i,n, nloop, nmax, ncheckcount, nidlecount;
3707 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
3708 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
3709 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
3710 char *results[16] = {0};
3711 char str_cmd[256] = {0};
3712 char str_cmd_ret[128] = {0};
3713 char dest_ip[32] = {0};
3714 lastAP1Bytes = lastAP2Bytes = 0;
3715 lastAP1Drop = lastAP2Drop = 0;
3716 lastAP1Speed = lastAP2Speed = 0;
3717 setAP1Speed = 50;
3718 setAP2Speed = 80;
3719 nloop = 0;
3720 nmax = 6;
3721 ncheckcount = nidlecount = 0;
3722
you.chenc9928582023-04-24 15:39:37 +08003723 if (s_ap_iterface_name[0] == '\0')
3724 {
3725 RLOGE("------gbw thread run\n");
3726 return;
3727 }
3728
qs.xiong9fbf74e2023-03-28 13:38:22 +08003729 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08003730 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
3731 while (dest_ip[0] == '\0') {
3732 sleep(1);
3733 str_cmd_ret[0] = '\0';
3734 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
3735 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
3736 if (str_cmd_ret[n] == '\n'){
3737 str_cmd_ret[n] = '\0';
3738 break;
3739 }
3740 }
3741 if (str_cmd_ret[0] != '\0')
3742 {
3743 strcpy(dest_ip, str_cmd_ret);
3744 }
3745 }
3746
you.chenc9928582023-04-24 15:39:37 +08003747 system_call_v("tc qdisc del dev %s root > /dev/null 2>&1", s_ap_iterface_name);
3748 system_call_v("tc qdisc add dev %s root handle 1: htb r2q 1", s_ap_iterface_name);
3749 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 +08003750 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
3751 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003752 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08003753 return;
3754 }
you.chenc9928582023-04-24 15:39:37 +08003755 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);
3756 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);
3757 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 +08003758
3759 while (1) {
3760 sleep(1);
3761 memset(str_cmd, 0, sizeof(str_cmd));
you.chenc9928582023-04-24 15:39:37 +08003762 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
3763 sprintf(str_cmd, "tc -s class show dev %s classid 1:1 | grep Sent", s_ap_iterface_name);
3764 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen0f5c6432022-11-07 18:31:14 +08003765 continue;
3766 //printf("ap1 --- %s\n", str_cmd);
you.chenc9928582023-04-24 15:39:37 +08003767 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen0f5c6432022-11-07 18:31:14 +08003768 if (n > 9) {
3769 if (strcmp(results[1], "Sent") == 0) {
3770 currAP1Bytes = atoll(results[2]);
3771 }
3772 if (strcmp(results[6], "(dropped") == 0) {
3773 currAP1Drop = atoi(results[7]);
3774 }
3775 }
3776
3777 memset(str_cmd, 0, sizeof(str_cmd));
you.chenc9928582023-04-24 15:39:37 +08003778 memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
3779 sprintf(str_cmd, "tc -s class show dev %s classid 1:2 | grep Sent", s_ap_iterface_name);
3780 if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
you.chen0f5c6432022-11-07 18:31:14 +08003781 continue;
3782 //printf("ap2 --- %s\n", str_cmd);
you.chenc9928582023-04-24 15:39:37 +08003783 n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
you.chen0f5c6432022-11-07 18:31:14 +08003784 if (n > 9) {
3785 if (strcmp(results[1], "Sent") == 0) {
3786 currAP2Bytes = atoll(results[2]);
3787 }
3788 if (strcmp(results[6], "(dropped") == 0) {
3789 currAP2Drop = atoi(results[7]);
3790 }
3791 }
3792
3793 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
3794 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
3795 lastAP1Bytes = currAP1Bytes;
3796 lastAP2Bytes = currAP2Bytes;
3797 continue;
3798 }
3799
3800 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
3801 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
3802 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
3803 lastAP1Speed = currAP1Speed;
3804 lastAP2Speed = currAP2Speed;
3805 lastAP1Bytes = currAP1Bytes;
3806 lastAP2Bytes = currAP2Bytes;
3807
3808 currSetAP1Speed = setAP1Speed;
3809 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
3810 ncheckcount++;
3811 if (ncheckcount > 3) {
3812 ncheckcount = 0;
3813 currSetAP1Speed = 5;
3814 }
3815 }
3816 else {
3817 ncheckcount = 0;
3818 if (currAP1Speed < 5)
3819 nidlecount++;
3820 else
3821 nidlecount = 0;
3822
3823 }
3824
3825 if (nidlecount > 60 ){
3826 currSetAP1Speed = 50;
3827 }
3828
3829 if (currSetAP1Speed != setAP1Speed) {
3830 setAP1Speed = currSetAP1Speed;
you.chenc9928582023-04-24 15:39:37 +08003831 system_call_v(str_cmd, "tc class replace dev %s parent 1: classid 1:1 htb rate %dMbit ceil %dMbit prio 2 quantum 3000",
3832 s_ap_iterface_name, setAP1Speed, (int)(setAP1Speed*1.4));
you.chen0f5c6432022-11-07 18:31:14 +08003833 }
3834 }
3835}
3836
3837int enableGBW(const char* mac) {
3838 int i,len;
3839 char get_ipaddr_cmd[128]={0};
3840 ap_info_s *ap;
3841 device_info_s * list;
3842
3843 if (mac == NULL || g_gbw_enabled == 1)
3844 return -1;
3845 len = strlen(mac);
3846 g_gbw_mac = malloc(len + 1);
3847 for(i=0;i<len;i++) {
3848 if (mac[i] >= 'A' && mac[i] <= 'Z')
3849 {
3850 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
3851 }
3852 else
3853 g_gbw_mac[i] = mac[i];
3854 }
3855 g_gbw_mac[i] = '\0';
3856 g_gbw_enabled = 1;
3857
3858 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
3859 if (system(get_ipaddr_cmd) == 0) {
3860 //startGBW();
3861 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
3862 for (i=0;i<len;i++) {
3863 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
3864 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
3865 startGBW();
3866 }
3867 free(ap);
3868 free(list);
3869 }
3870 }
3871 return 0;
3872}
3873
3874int disableGBW() {
3875 stopGBW();
3876 free(g_gbw_mac);
3877 g_gbw_mac = NULL;
3878 g_gbw_enabled = 1;
3879 return 0;
3880}
3881
3882static int startGBW() {
3883 if (g_gbw_watcher_pid != 0) {
3884 stopGBW();
3885 }
3886 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
3887}
3888
3889static int stopGBW() {
3890 void* retval;
you.chenc9928582023-04-24 15:39:37 +08003891 char cmd[64] = {0};
you.chen0f5c6432022-11-07 18:31:14 +08003892 pthread_cancel(g_gbw_watcher_pid);
3893 pthread_join(g_gbw_watcher_pid, &retval);
3894 g_gbw_watcher_pid = 0;
you.chenc9928582023-04-24 15:39:37 +08003895 sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
3896 if (s_ap_iterface_name[0] != '\0')
3897 {
3898 sprintf(cmd, "tc qdisc del dev %s root", s_ap_iterface_name);
3899 system(cmd);
3900 }
you.chen0f5c6432022-11-07 18:31:14 +08003901}
3902//you.chen add for tv-box end