blob: e6c394b77055d8b98ebc07eb95ed13b98d04f489 [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.chend2fef3f2023-02-13 10:50:35 +080073struct local_wpa_ctrl{
74 struct wpa_ctrl *ctrl;
75 pthread_mutex_t mutex;
76};
77
you.chen70f377f2023-04-14 18:17:09 +080078
you.chend2fef3f2023-02-13 10:50:35 +080079static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
80
81static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
you.chen35020192022-05-06 11:30:57 +080082
you.chen0f5c6432022-11-07 18:31:14 +080083//you.chen add for tv-box start
84volatile int g_gbw_enabled = 0;
85char * g_gbw_mac = NULL;
86pthread_t g_gbw_watcher_pid = 0;
87static int startGBW();
88static int stopGBW();
89//you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +080090
91typedef struct __curr_status_info {
92 ap_info_s *ap;
93 char * state;
94 int net_no;
95}curr_status_info;
qs.xiong97fa59b2022-04-07 05:41:29 -040096
you.chen70f377f2023-04-14 18:17:09 +080097typedef enum {
98 INNER_STA_STATUS_INIT = 0,
99 INNER_STA_STATUS_CONNECTING,
100 INNER_STA_STATUS_ASSOCIATING,
101 INNER_STA_STATUS_ASSOCIATED,
102 INNER_STA_STATUS_CONNECTED,
103 INNER_STA_STATUS_DISCONNECTING,
104 INNER_STA_STATUS_DISCONNECTED,
105 INNER_STA_STATUS_CANCEL,
106}inner_sta_status_s;
107
108static pthread_cond_t s_global_check_cond = PTHREAD_COND_INITIALIZER;
109static pthread_mutex_t s_global_check_mutex = PTHREAD_MUTEX_INITIALIZER;
110static inner_sta_status_s s_sta_status = INNER_STA_STATUS_INIT;
111static error_number_s s_sta_error_number = -1;
112static char s_sta_current_connecting_ssid[64] = {0};
113static struct timespec s_sta_connect_timeout;
114const int MAX_CONNNECT_TIME = 15; // second
115pthread_t g_global_watcher_pid = 0;
116static int s_service_invoke_timeout_cnt=0;
117const int FAKE_MAX_INT_VALUE = 99999;
118
119static void notify_service_invoke_fail(int error)
120{
121 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
122 pthread_mutex_lock(&s_global_check_mutex);
123 if (error == -2) //timeout
124 {
125 s_service_invoke_timeout_cnt++;
126 if (s_service_invoke_timeout_cnt > 10)
127 {
128 pthread_cond_signal(&s_global_check_cond);
129 }
130 }
131 else if (error == -1)
132 {
133 // check if can connect wpa service
134 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[0]);
135 if (lynq_wpa_ctrl == NULL)
136 {
137 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
138 pthread_cond_signal(&s_global_check_cond);
139 }
140 wpa_ctrl_close(lynq_wpa_ctrl);
141 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[1]);
142 if (lynq_wpa_ctrl == NULL)
143 {
144 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
145 pthread_cond_signal(&s_global_check_cond);
146 }
147 wpa_ctrl_close(lynq_wpa_ctrl);
148 }
149
150 pthread_mutex_unlock(&s_global_check_mutex);
151}
152
153static void check_tether_and_notify()
154{
155 RLOGD("check_tether_and_notify called");
156 if (0 == system("ifconfig | grep tether"))
157 {
158 return;
159 }
160 pthread_mutex_lock(&s_global_check_mutex);
161 s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
162 pthread_cond_signal(&s_global_check_cond);
163 pthread_mutex_unlock(&s_global_check_mutex);
164}
165
you.chend2fef3f2023-02-13 10:50:35 +0800166static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
167 char *reply, size_t *reply_len,
168 void (*msg_cb)(char *msg, size_t len))
169{
170 int ret;
171 if (ctrl->ctrl == NULL) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800172 RLOGE("local_wpa_ctrl_request ctrl is null\n");
you.chend2fef3f2023-02-13 10:50:35 +0800173 return -1;
174 }
175 pthread_mutex_lock(&ctrl->mutex);
176 ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
177 pthread_mutex_unlock(&ctrl->mutex);
you.chen70f377f2023-04-14 18:17:09 +0800178 if (ret != 0)
179 {
180 notify_service_invoke_fail(ret);
181 }
you.chend2fef3f2023-02-13 10:50:35 +0800182 return ret;
183}
184
185static struct local_wpa_ctrl * inner_get_wpa_ctrl(int index) {
186 int repeat_cnt;
187 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
188 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800189 RLOGD("inner_get_wpa_ctrl\n");
you.chend2fef3f2023-02-13 10:50:35 +0800190 for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
191 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
192// printf("wait enable finish\n");
193 usleep(500 * 1000);
194 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
195 }
196 if (NULL == g_lynq_wpa_ctrl[index]) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800197 RLOGE("NULL == g_lynq_wpa_ctrl[index]");
you.chend2fef3f2023-02-13 10:50:35 +0800198 goto out_addr;
199 }
200 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
201 g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
202 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800203 RLOGE("wpa_ctrl_open fail\n");
you.chend2fef3f2023-02-13 10:50:35 +0800204 goto out_addr;
205 }
206 pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
207 }
208 lynq_wpa_ctrl = g_lynq_wpa_ctrl[index];
209out_addr:
210 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
211 return lynq_wpa_ctrl;
212}
213
qs.xiong97fa59b2022-04-07 05:41:29 -0400214#define PRINT_AND_RETURN_VALUE(str,value) \
qs.xiong97fa59b2022-04-07 05:41:29 -0400215{\
you.chen35020192022-05-06 11:30:57 +0800216 perror((str));\
217 return (value);\
qs.xiong97fa59b2022-04-07 05:41:29 -0400218}
219
you.chen35020192022-05-06 11:30:57 +0800220#define CHECK_IDX(idx, type) do { \
221 if ( (idx == LYNQ_WIFI_INTERFACE_0 && type != CTRL_STA) || (idx == LYNQ_WIFI_INTERFACE_1 && type != CTRL_AP) \
222 || idx < LYNQ_WIFI_INTERFACE_0 || idx > LYNQ_WIFI_INTERFACE_1 ) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800223 RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
you.chen35020192022-05-06 11:30:57 +0800224 return -1; \
225 } \
226 }while (0)
227
228#define CHECK_WPA_CTRL(index) int ret = 0;\
229 size_t reply_len = MAX_RET; \
230 char cmd_reply[MAX_RET]={0}; \
you.chend2fef3f2023-02-13 10:50:35 +0800231 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
you.chen35020192022-05-06 11:30:57 +0800232 do{ \
you.chend2fef3f2023-02-13 10:50:35 +0800233 lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
234 if (NULL == lynq_wpa_ctrl) return -1; \
you.chen35020192022-05-06 11:30:57 +0800235 }while(0)
236
237#define DO_REQUEST(cmd_str) do { \
238 reply_len = MAX_RET;\
239 cmd_reply[0] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800240 RLOGD("to call [%s]\n", cmd_str); \
you.chend2fef3f2023-02-13 10:50:35 +0800241 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 +0800242 if (ret != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800243 RLOGE("call "#cmd_str" fail %d\n", ret); \
you.chen35020192022-05-06 11:30:57 +0800244 return ret; \
245 } \
246 cmd_reply[reply_len+1] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800247 RLOGD("cmd replay [ %s ]\n", cmd_reply); \
you.chen35020192022-05-06 11:30:57 +0800248 }while(0)
249
250#define DO_OK_FAIL_REQUEST(cmd_str) do { \
251 DO_REQUEST(cmd_str); \
252 if (reply_len >=4 && memcmp(cmd_reply, "FAIL", 4) == 0 ) {\
qs.xiong9fbf74e2023-03-28 13:38:22 +0800253 RLOGE("cmd "#cmd_str" return FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800254 return -1; \
255 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800256 RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800257 return -1; \
258 } \
259 }while (0)
260
261
you.chend2fef3f2023-02-13 10:50:35 +0800262static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
you.chen35020192022-05-06 11:30:57 +0800263
you.chenf711c8a2023-04-13 13:49:45 +0800264static int check_connection(struct wpa_ctrl * wpa_ctrl)
265{
266 size_t reply_len = MAX_RET;
267 char cmd_reply[MAX_RET]={0};
268 int ret;
269
270 RLOGD("check_connection [%p]", wpa_ctrl);
271 ret = wpa_ctrl_request(wpa_ctrl, cmd_ping, strlen(cmd_ping), cmd_reply, &reply_len, NULL);
272
273 if (ret != 0 || reply_len < 4 || memcmp(cmd_reply, rsp_pong, 4) != 0)
274 {
275 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 +0800276 if (ret != 0)
277 {
278 notify_service_invoke_fail(ret);
279 }
you.chenf711c8a2023-04-13 13:49:45 +0800280 return -1;
281 }
282
283 return 0;
284}
285
286/**
287 * @brief check_pending_msg
288 * @param lynq_wpa_ctrl
289 * @return 1 has msg, 0 no msg, -1 error
290 */
291static int check_pending_msg(struct wpa_ctrl ** pp_lynq_wpa_ctrl, int type, int* idle_count, int *started_flag)
292{
293 int ret;
294
295 if (*pp_lynq_wpa_ctrl == NULL) // need connect
296 {
297 *pp_lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[type]); //@todo temp change
298 if (*pp_lynq_wpa_ctrl == NULL)
299 {
300 usleep(SLEEP_TIME_ON_IDLE);
301 return -1;
302 }
303
304 ret = wpa_ctrl_attach(*pp_lynq_wpa_ctrl);
305 if (ret == 0) // attach success
306 {
307 *started_flag = 1;
308 }
309 else
310 {
you.chen70f377f2023-04-14 18:17:09 +0800311 RLOGE("[wifi error]sta watch thread wpa_ctrl_attach fail");
you.chenf711c8a2023-04-13 13:49:45 +0800312 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
313 *pp_lynq_wpa_ctrl = NULL;
314 *idle_count = 0;
you.chen70f377f2023-04-14 18:17:09 +0800315 notify_service_invoke_fail(-2);
you.chenf711c8a2023-04-13 13:49:45 +0800316 usleep(SLEEP_TIME_ON_IDLE);
317 return -1;
318 }
319 }
320
321 ret = wpa_ctrl_pending(*pp_lynq_wpa_ctrl);
322 if ( ret == 0) // no pending messages
323 {
324 usleep(SLEEP_TIME_ON_IDLE);
325 *idle_count += 1;
326 if (*idle_count > MAX_IDLE_COUNT)
327 {
328 if (check_connection(*pp_lynq_wpa_ctrl) != 0)
329 {
330 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
331 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
332 *pp_lynq_wpa_ctrl = NULL;
333 *idle_count = 0;
334 return -1;
335 }
336 *idle_count = 0;
337 }
338 return 0;
339 }
340 else if ( ret == -1) // on error
341 {
342 RLOGE("[wifi error]sta wpa_ctrl_pending");
343 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
344 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
345 *pp_lynq_wpa_ctrl = NULL;
346 *idle_count = 0;
you.chen70f377f2023-04-14 18:17:09 +0800347 notify_service_invoke_fail(ret);
you.chenf711c8a2023-04-13 13:49:45 +0800348 return -1;
349 }
350
351 *idle_count = 0;
352 return 1;
353}
354
you.chen35020192022-05-06 11:30:57 +0800355static void APWatcherThreadProc() {
356 size_t len = MAX_RET;
357 char msg_notify[MAX_RET];
you.chenf711c8a2023-04-13 13:49:45 +0800358 int idle_count = 0;
you.chen35020192022-05-06 11:30:57 +0800359
you.chen6c2dd9c2022-05-16 17:55:28 +0800360 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800361 g_ap_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800362
qs.xiong9fbf74e2023-03-28 13:38:22 +0800363 while (g_ap_watcher_stop_flag == 0)
364 {
you.chenf711c8a2023-04-13 13:49:45 +0800365 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_AP, &idle_count, &g_ap_watcher_started_flag) != 1)
366 {
you.chen70f377f2023-04-14 18:17:09 +0800367 if (g_ap_callback_func != NULL && idle_count == MAX_IDLE_COUNT - 100 )
368 {
369 check_tether_and_notify();
370 }
371
you.chen35020192022-05-06 11:30:57 +0800372 continue;
373 }
you.chenf711c8a2023-04-13 13:49:45 +0800374
you.chen6c2dd9c2022-05-16 17:55:28 +0800375 memset(msg_notify, 0, MAX_RET);
376 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800377 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
you.chenf711c8a2023-04-13 13:49:45 +0800378 {
you.chen35020192022-05-06 11:30:57 +0800379 msg_notify[len+1] = '\0';
qs.xiong455c30b2023-04-12 11:40:02 +0800380 RLOGD("APWatcherThreadProc ap------> %s\n", msg_notify);
you.chenf711c8a2023-04-13 13:49:45 +0800381 //you.chen change for tv-box start
qs.xiong9fbf74e2023-03-28 13:38:22 +0800382 if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800383 {
you.chen0f5c6432022-11-07 18:31:14 +0800384 if (g_ap_callback_func != NULL)
385 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_DISCONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800386 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800387 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800388 RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
389 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800390 {
you.chen0f5c6432022-11-07 18:31:14 +0800391 stopGBW();
392 }
393 }
you.chen35020192022-05-06 11:30:57 +0800394 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800395 else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800396 {
you.chen0f5c6432022-11-07 18:31:14 +0800397 if (g_ap_callback_func != NULL)
398 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_CONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800399 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800400 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800401 RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
402 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800403 {
you.chen0f5c6432022-11-07 18:31:14 +0800404 startGBW();
405 }
406 }
you.chen35020192022-05-06 11:30:57 +0800407 }
you.chenf711c8a2023-04-13 13:49:45 +0800408 //you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +0800409 } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
410 } // end while (g_ap_watcher_stop_flag == 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800411 if (lynq_wpa_ctrl != NULL)
412 {
you.chen92fd5d32022-05-25 10:09:47 +0800413 wpa_ctrl_detach(lynq_wpa_ctrl);
414 wpa_ctrl_close(lynq_wpa_ctrl);
415 }
qs.xiong97fa59b2022-04-07 05:41:29 -0400416}
417
you.chen70f377f2023-04-14 18:17:09 +0800418static void inner_check_connect_error(const char * event_msg, lynq_wifi_sta_status_s state, error_number_s error_num)
419{
420 char * p;
421 const char * try_associat_flag = "Trying to associate";
422 const char * associated_flag = "Associated with ";
423
424 pthread_mutex_lock(&s_global_check_mutex);
425 if (s_sta_status < INNER_STA_STATUS_CONNECTING || s_sta_status >= INNER_STA_STATUS_CONNECTED) //not in connecting stage, egnore
426 {
427 pthread_mutex_unlock(&s_global_check_mutex);
428 return;
429 }
430
431 if (state == LYNQ_WIFI_STATUS_EGNORE)
432 {
433 if (strstr(event_msg, try_associat_flag) != NULL && strstr(event_msg, s_sta_current_connecting_ssid) != NULL) //associating request ssid
434 {
435 s_sta_status = INNER_STA_STATUS_ASSOCIATING;
436 }
437 else if (s_sta_status == INNER_STA_STATUS_ASSOCIATING && (p=strstr(event_msg, associated_flag)) != NULL)
438 {
439 s_sta_status = INNER_STA_STATUS_ASSOCIATED;
440 }
441 }
442 else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
443 {
444 s_sta_error_number = error_num;
445 if (s_sta_status >= INNER_STA_STATUS_ASSOCIATING && strstr(event_msg, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL && error_num != LYNQ_WAIT_CONNECT_ACTIVE)
446 {
447 s_sta_status = INNER_STA_STATUS_DISCONNECTED;
448 pthread_cond_signal(&s_global_check_cond);
449 }
450 }
451 else if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
452 {
453 s_sta_status = INNER_STA_STATUS_CONNECTED;
454 pthread_cond_signal(&s_global_check_cond);
455 }
456 pthread_mutex_unlock(&s_global_check_mutex);
457}
458
qs.xiong455c30b2023-04-12 11:40:02 +0800459void get_state_error(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error)
460{
461 char *pReason;
462 *error = LYNQ_WAIT_CONNECT_ACTIVE;
463 if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
464 {
465 *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
466 RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d\n",*state,*error);
467 return;
468 }
469
470 if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
471 {
472 *state = LYNQ_WIFI_STA_STATUS_CONNECT;
473 RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
474 return;
475 }
476
477 if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
478 {
479 pReason = strstr(modify, "reason=");
480 if (pReason != NULL)
481 {
482 pReason += strlen("reason=");
483 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
484 {
485 *error = LYNQ_TIME_OUT;
486 }
487 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
488 {
489 *error = LYNQ_PSW_ERROR;
490 }
491 else
492 {
493 *error = LYNQ_UNSPECIFIED_REASON;
494 }
495 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
496 RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d\n",*state,*error);
497 return;
498 }
499 else
500 {
501 *error = LYNQ_UNSPECIFIED_REASON;
502 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
503 return;
504 }
505
506 }
507
508 if (strstr(modify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
509 {
510 *error = LYNQ_NOT_FIND_AP;
511 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
512 RLOGD("CTRL-EVENT-NETWORK-NOT-FOUND state:%d,error:%d\n",*state,*error);
513 return;
514 }
515
516
517 if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
518 {
519 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
520 pReason = strstr(modify, "status_code=");
521 if (pReason != NULL)
522 {
523 pReason += strlen("status_code=");
524 if (memcmp(pReason, "17", 2) == 0)
525 {
526 *error = LYNQ_AP_UNABLE_HANDLE;
527 }
528 else if (memcmp(pReason, "1",1) == 0)
529 {
530 *error = LYNQ_UNSPECIFIED_REASON;
531 }
532 else
533 {
534 *error = LYNQ_UNSPECIFIED_REASON;
535 }
536
537 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
538 RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d\n",*state,*error);
539 return;
540 }
541 else
542 {
543 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
544 *error = LYNQ_UNSPECIFIED_REASON;
545 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
546 RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d\n",*state,*error);
547 return;
548 }
549 }
550
551 if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
552 {
553 RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
554 *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
555 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
556 RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d\n",*state,*error);
557 return;
558 }
559
560 if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
561 {
562 RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
563 *error = LYNQ_WAIT_CONNECT_ACTIVE;
564 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
565 RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
566 return;
567 }
568
you.chen32cb31e2023-04-13 14:05:45 +0800569 RLOGD("EVENT : %s\n", modify);
qs.xiong455c30b2023-04-12 11:40:02 +0800570 *error = LYNQ_UNSPECIFIED_REASON;
you.chen32cb31e2023-04-13 14:05:45 +0800571 *state = LYNQ_WIFI_STATUS_EGNORE;
qs.xiong455c30b2023-04-12 11:40:02 +0800572 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
573 return;
574
575}
576
you.chen70f377f2023-04-14 18:17:09 +0800577static void notify_connect_status(lynq_wifi_sta_status_s state, error_number_s error)
578{
579 if (g_sta_callback_func != NULL && state != LYNQ_WIFI_STATUS_EGNORE)
580 {
581 RLOGD("STAWatcherThreadProc callback begin ------> %d %d\n", state, error);
582 g_sta_callback_func(g_sta_callback_priv, state, error);
583 RLOGD("STAWatcherThreadProc callback end ------> %d %d\n", state, error);
584 }
585}
586
you.chen35020192022-05-06 11:30:57 +0800587static void STAWatcherThreadProc() {
588 size_t len = MAX_RET;
589 char msg_notify[MAX_RET];
you.chen35020192022-05-06 11:30:57 +0800590 error_number_s error;
qs.xiong455c30b2023-04-12 11:40:02 +0800591 lynq_wifi_sta_status_s state;
you.chenf711c8a2023-04-13 13:49:45 +0800592 int idle_count = 0;
qs.xiongf1b525b2022-03-31 00:58:23 -0400593
you.chen6c2dd9c2022-05-16 17:55:28 +0800594 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800595 g_sta_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800596
you.chen70f377f2023-04-14 18:17:09 +0800597 RLOGD("STAWatcherThreadProc thread started ------");
qs.xiong9fbf74e2023-03-28 13:38:22 +0800598 while (g_sta_watcher_stop_flag == 0)
599 {
you.chenf711c8a2023-04-13 13:49:45 +0800600 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
qs.xiong455c30b2023-04-12 11:40:02 +0800601 {
you.chen35020192022-05-06 11:30:57 +0800602 continue;
603 }
you.chenf711c8a2023-04-13 13:49:45 +0800604
you.chen6c2dd9c2022-05-16 17:55:28 +0800605 memset(msg_notify, 0, MAX_RET);
606 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800607 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiong455c30b2023-04-12 11:40:02 +0800608 {
you.chen35020192022-05-06 11:30:57 +0800609 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800610 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
611 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800612 {
you.chen35020192022-05-06 11:30:57 +0800613 g_sta_scan_finish_flag = 1;
614 }
615
qs.xiong9fbf74e2023-03-28 13:38:22 +0800616 if (g_sta_callback_func == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800617 {
you.chen35020192022-05-06 11:30:57 +0800618 continue;
619 }
qs.xiong455c30b2023-04-12 11:40:02 +0800620 get_state_error(msg_notify,&state,&error);
you.chen70f377f2023-04-14 18:17:09 +0800621 notify_connect_status(state, error);
622
623 if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
you.chen32cb31e2023-04-13 14:05:45 +0800624 {
you.chen70f377f2023-04-14 18:17:09 +0800625 inner_check_connect_error(msg_notify, state, error);
you.chen32cb31e2023-04-13 14:05:45 +0800626 }
you.chen35020192022-05-06 11:30:57 +0800627 }
628 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800629 if (lynq_wpa_ctrl != NULL)
630 {
you.chen92fd5d32022-05-25 10:09:47 +0800631 wpa_ctrl_detach(lynq_wpa_ctrl);
632 wpa_ctrl_close(lynq_wpa_ctrl);
633 }
qs.xiongf1b525b2022-03-31 00:58:23 -0400634}
635
you.chen70f377f2023-04-14 18:17:09 +0800636// this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
637static void GlobalWatcherThreadProc()
638{
639 int ret, connect_timeout, service_abnormal;
640 error_number_s error_num = -1;
641 inner_sta_status_s sta_status;
642 scan_info_s *scan_list = NULL;
643 int i, scan_len=0;
644 char connecting_ssid[64];
645 struct timeval now;
646
647 RLOGD("GlobalWatcherThreadProc start to run");
648
649 while (1)
650 {
651 pthread_mutex_lock(&s_global_check_mutex);
652 pthread_cond_wait(&s_global_check_cond,&s_global_check_mutex);
653 if (s_sta_status == INNER_STA_STATUS_CONNECTED)
654 {
655 pthread_mutex_unlock(&s_global_check_mutex);
656 usleep(50*1000);
657 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
658 continue;
659 }
660
661 connect_timeout = 0;
662 service_abnormal = 0;
663 if (s_sta_status >= INNER_STA_STATUS_CONNECTING && s_sta_status < INNER_STA_STATUS_CONNECTED)
664 {
665 while (1)
666 {
667 ret = pthread_cond_timedwait(&s_global_check_cond, &s_global_check_mutex, &s_sta_connect_timeout);
668 if (ret == ETIME)
669 {
670 connect_timeout = 1;
671 }
672 else if (ret != 0)
673 {
674 gettimeofday(&now,NULL);
675 if (now.tv_sec < s_sta_connect_timeout.tv_sec) //time not arrive
676 {
677 usleep(SLEEP_TIME_ON_IDLE);
678 continue;
679 }
680 connect_timeout = 1;
681 }
682 sta_status = s_sta_status;
683 error_num = s_sta_error_number;
684 s_sta_status = INNER_STA_STATUS_INIT;
685 strcpy(connecting_ssid, s_sta_current_connecting_ssid);
686 memset(&s_sta_connect_timeout, 0, sizeof (s_sta_connect_timeout));
687 memset(&s_sta_current_connecting_ssid, 0, sizeof (s_sta_current_connecting_ssid));
688 break;
689 }
690 }
691 if (s_service_invoke_timeout_cnt > 10)
692 {
693 service_abnormal = 1;
694 s_service_invoke_timeout_cnt = 0;
695 }
696 pthread_mutex_unlock(&s_global_check_mutex);
697
698 if (service_abnormal == 1)
699 {
700 sleep(1);
701 RLOGE("wpa service is abnormal info app to exit");
702 notify_connect_status(LYNQ_WIFI_STA_SERVICE_ABNORMAL, -1);
703 if (g_ap_callback_func != NULL)
704 {
705 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_SERVICE_ABNORMAL);
706 }
707 sleep(FAKE_MAX_INT_VALUE); // wait process to exit
708 }
709
710 if (sta_status == INNER_STA_STATUS_CANCEL)
711 {
712 continue;
713 }
714 else if (sta_status == INNER_STA_STATUS_CONNECTED)
715 {
716 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
717 }
718 else if (connect_timeout == 0 && error_num == LYNQ_NOT_FIND_AP) // not found ap maybe mismatch auth
719 {
720 if (0 == lynq_get_scan_list(0, &scan_list, &scan_len) && NULL != scan_list) // if not found, but scan result exist, maybe auth error
721 {
722 for(i=0; i < scan_len;i++)
723 {
724 if (strcmp(scan_list[i].ssid, connecting_ssid) == 0)
725 {
726 error_num = LYNQ_AUTH_ERROR;
727 break;
728 }
729 }
730 free(scan_list);
731 }
732 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
733 }
734 else if (connect_timeout == 0)
735 {
736 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
737 }
738 else // wait timeout
739 {
740 if (0 != lynq_get_sta_status(LYNQ_WIFI_INTERFACE_0, &sta_status)) // get status fail
741 {
742 ; // wpa service abnormal
743 }
744 else if (sta_status == LYNQ_WIFI_STA_STATUS_ENABLE) // connect ok
745 {
746 RLOGD("GlobalWatcherThreadProc notify connected");
747 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
748 }
749 else
750 {
751 RLOGD("GlobalWatcherThreadProc notify timeout");
752 notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, LYNQ_TIME_OUT);
753 }
754 }
755 } // while (1)
756}
757
qs.xiong1af5daf2022-03-14 09:12:12 -0400758int lynq_wifi_enable(void)
759{
you.chen35020192022-05-06 11:30:57 +0800760 int ret = 0;
you.chen6c2dd9c2022-05-16 17:55:28 +0800761 int i;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800762 RLOGD("enter lynq_wifi_enable");
you.chend2fef3f2023-02-13 10:50:35 +0800763 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
764
qs.xiong9fbf74e2023-03-28 13:38:22 +0800765 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
766 {
you.chend2fef3f2023-02-13 10:50:35 +0800767 goto out_enable;
768 }
769
you.chen35020192022-05-06 11:30:57 +0800770 const char * cmd_check_service =
771 "state=`systemctl is-active wg870_drv_insmod.service`\n"
772 "[ \"\"$state == \"active\" ] && exit 0\n"
773 "[ \"\"$state == \"inactive\" ] && systemctl start wg870_drv_insmod.service\n";
774// if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL) {
775// return 0;
776// }
qs.xiong1af5daf2022-03-14 09:12:12 -0400777
you.chen35020192022-05-06 11:30:57 +0800778 ret = system(cmd_check_service);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800779 if (ret != 0)
780 {
781 //printf("service state %d\n", ret);
782 RLOGE("[wifi error]service state %d",ret);
you.chend2fef3f2023-02-13 10:50:35 +0800783 ret = -1;
784 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800785 }
lhfe8da902022-10-11 18:55:36 +0800786
qs.xiong9fbf74e2023-03-28 13:38:22 +0800787 RLOGD("check service state is OK");
788 for (i=0; i<10; i++)
789 {
you.chena6fa5b22022-05-18 10:28:19 +0800790 if (system("connmanctl technologies | grep -q \"/net/connman/technology/wifi\"") == 0) {
you.chen6c2dd9c2022-05-16 17:55:28 +0800791 break;
792 }
793 usleep(300*1000);
794 }
795
qs.xiong9fbf74e2023-03-28 13:38:22 +0800796 if (i >= 10)
797 {
798 RLOGE("[wifi error] check connman technologies no wifi");
you.chend2fef3f2023-02-13 10:50:35 +0800799 ret = -1;
800 goto out_enable;
you.chen6c2dd9c2022-05-16 17:55:28 +0800801 }
802
you.chen9f17e4d2022-06-06 17:18:18 +0800803 //@todo delete add temp check for socket avilable start (20220606)
804 for (i=0; i<60; i++)
805 {
806 if (system("netstat -an | grep -q DGRAM") == 0) {
807 break;
808 }
809 sleep(1);
810 }
811
812 if (i >= 60)
813 {
you.chend2fef3f2023-02-13 10:50:35 +0800814 ret = -1;
815 goto out_enable;
you.chen9f17e4d2022-06-06 17:18:18 +0800816 }
817 //@todo delete add temp check for socket avilable end (20220606)
818
qs.xiong9fbf74e2023-03-28 13:38:22 +0800819 if (0 != system("ifconfig | grep -q ap0"))
820 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800821 system("connmanctl enable wifi");
you.chena6fa5b22022-05-18 10:28:19 +0800822 usleep(300*1000);
you.chen01bfac32022-06-07 10:36:00 +0800823 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disconnect");
you.chen6c2dd9c2022-05-16 17:55:28 +0800824 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 DRIVER interface_create ap0");
you.chena6fa5b22022-05-18 10:28:19 +0800825 usleep(300*1000);
you.chen6c2dd9c2022-05-16 17:55:28 +0800826 system("connmanctl tether wifi on lynq 1qaz@WSX#$%^");
you.chena6fa5b22022-05-18 10:28:19 +0800827 usleep(300*1000);
you.chen01bfac32022-06-07 10:36:00 +0800828 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=ap0 disconnect");
you.chen6c2dd9c2022-05-16 17:55:28 +0800829 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800830 if (g_ap_watcher_pid == 0 )
qs.xiong55f32762023-02-16 15:59:45 +0800831 {
you.chen35020192022-05-06 11:30:57 +0800832 ret=pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800833 if(ret<0)
you.chen70f377f2023-04-14 18:17:09 +0800834 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800835 RLOGE("[wifi error]creat APWatcherThreadProc fail");
you.chend2fef3f2023-02-13 10:50:35 +0800836 ret = -1;
837 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800838 }
839 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800840
841 RLOGD("creat APWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +0800842 if (g_sta_watcher_pid == 0 ) {
843 ret=pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800844 if(ret<0)
you.chen70f377f2023-04-14 18:17:09 +0800845 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800846 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
you.chend2fef3f2023-02-13 10:50:35 +0800847 ret = -1;
848 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800849 }
850 }
851
you.chen70f377f2023-04-14 18:17:09 +0800852 if (g_global_watcher_pid == 0 ) // this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
853 {
854 ret=pthread_create(&g_global_watcher_pid,NULL,GlobalWatcherThreadProc,NULL);
855 if(ret<0)
856 {
857 RLOGE("[wifi error]creat GlobalWatcherThreadProc fail");
858 ret = -1;
859 goto out_enable;
860 }
861 }
862
qs.xiong9fbf74e2023-03-28 13:38:22 +0800863 RLOGD("creat STAWatcherTheradProc susccs");
864 for (i=0; i<10; i++)
865 {
you.chena6fa5b22022-05-18 10:28:19 +0800866 usleep(300*1000);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800867 if (g_ap_watcher_started_flag == 1 && g_sta_watcher_started_flag == 1)
you.chen70f377f2023-04-14 18:17:09 +0800868 {
you.chena6fa5b22022-05-18 10:28:19 +0800869 break;
870 }
871 }
872
you.chend2fef3f2023-02-13 10:50:35 +0800873 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
874 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
875 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
876 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
877out_enable:
878 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800879 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500880}
881
qs.xiong1af5daf2022-03-14 09:12:12 -0400882int lynq_wifi_disable(void)
883{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800884 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800885 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800886 g_ap_watcher_stop_flag = 1;
887 g_sta_watcher_stop_flag = 1;
888 if (g_ap_watcher_pid != 0)
889 pthread_join(g_ap_watcher_pid, NULL);
890 if (g_sta_watcher_pid != 0)
891 pthread_join(g_sta_watcher_pid, NULL);
892 if (g_lynq_wpa_ctrl[0] != NULL)
893 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
894 if (g_lynq_wpa_ctrl[1] != NULL)
895 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
896 g_ap_watcher_pid = 0;
897 g_sta_watcher_pid = 0;
898 g_lynq_wpa_ctrl[0] = NULL;
899 g_lynq_wpa_ctrl[1] = NULL;
900 system("systemctl stop wg870_drv_insmod.service");
you.chend2fef3f2023-02-13 10:50:35 +0800901 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
902 return 0;
903}
904
905static inline char inner_convert_char(char in)
906{
907 if (in >= '0' && in <= '9')
908 {
909 return in - '0';
910 }
911 else if (in >= 'a' && in <= 'f')
912 {
913 return in - 'a' + 10;
914 }
915 else if (in >= 'A' && in <= 'F')
916 {
917 return in - 'A' + 10;
918 }
919 else
920 {
921 return '\xff';
922 }
923}
924
925static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
926{
927 char *p;
928 size_t pos = 0;
929 if (NULL == out_ssid)
930 return;
931 //printf("input ssid=[%s]\n", ssid);
932 memset(out_ssid, 0, out_ssid_len);
933 if (NULL == ssid)
934 return;
935 p = strchr(ssid, '\\');
936 if (NULL == p)
937 {
938 strncpy(out_ssid, ssid, out_ssid_len);
939 //printf(" first %s\n", out_ssid);
940 }
941 else
942 {
943 pos = p - ssid;
944 memcpy(out_ssid, ssid, pos);
945 //printf("pos %lu -- %s\n", pos, out_ssid);
946 for(; pos < out_ssid_len; pos ++)
947 {
948 if (p[0] == '\0')
949 {
950 //printf(" out %s\n", out_ssid);
951 return;
952 }
953 else if (p[0] != '\\')
954 {
955 out_ssid[pos] = p[0];
956 p += 1;
957 }
958 else if (p[1] == 'x' || p[1] == 'X')
959 {
960 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
961 p += 4;
962 }
963 else if (p[1] == '\\')
964 {
965 out_ssid[pos] = '\\';
966 p += 2;
967 }
968 else if (p[1] == 't')
969 {
970 out_ssid[pos] = '\t';
971 p += 2;
972 }
973 else if (p[1] == 'r')
974 {
975 out_ssid[pos] = '\r';
976 p += 2;
977 }
978 else if (p[1] == 'n')
979 {
980 out_ssid[pos] = '\n';
981 p += 2;
982 }//todo find a better way to convert?
983 }
984 }
985 //printf(" out %s\n", out_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -0500986}
qs.xiong1af5daf2022-03-14 09:12:12 -0400987
you.chen35020192022-05-06 11:30:57 +0800988static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +0800989 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +0800990 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +0800991 RLOGD("enter inner_get_param");
992 if (out_put == NULL)
993 {
994 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +0800995 return -1;
996 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800997 if (param_name == NULL)
998 {
999 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +08001000 return -1;
1001 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001002 if (param_name[0] == '\0')
1003 {
1004 RLOGE("param is empty");
you.chen35020192022-05-06 11:30:57 +08001005 return -1;
1006 }
1007
1008 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
1009
1010 CHECK_WPA_CTRL(interface);
1011
1012 DO_REQUEST(lynq_cmd_get);
1013
qs.xiong9fbf74e2023-03-28 13:38:22 +08001014 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1015 {
1016 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +08001017 return -1;
1018 }
1019
you.chena6fa5b22022-05-18 10:28:19 +08001020// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +08001021 if (strcmp(param_name, "ssid") == 0)
1022 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001023 if (cmd_reply[0] == '\"')
1024 {
you.chend2fef3f2023-02-13 10:50:35 +08001025 ssid_len = reply_len - 1;
1026 memcpy(out_put, cmd_reply + 1, ssid_len);
1027 if (out_put[ssid_len-1] == '\"')
1028 {
1029 out_put[ssid_len-1] = '\0';
1030 }
1031 else
1032 {
1033 out_put[ssid_len] = '\0';
1034 }
1035 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001036 else
1037 {
you.chend2fef3f2023-02-13 10:50:35 +08001038 ssid_len = reply_len / 2;
1039 for(i=0; i<ssid_len; i++)
1040 {
1041 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
1042 }
1043 out_put[ssid_len] = '\0';
1044 }
1045 }
1046 else
1047 {
1048 memcpy(out_put, cmd_reply, reply_len + 1);
1049 }
you.chen35020192022-05-06 11:30:57 +08001050 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001051}
qs.xiong1af5daf2022-03-14 09:12:12 -04001052
you.chen35020192022-05-06 11:30:57 +08001053static int lynq_split(char * str, int len, char delimiter, char * results[]) {
1054 int ret = 0;
1055 char * end = str + len - 1;
1056 results[ret++] = str;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001057 while(str < end)
1058 {
1059 if (*str == delimiter)
1060 {
you.chen35020192022-05-06 11:30:57 +08001061 *str++ = '\0';
1062 results[ret++] = str;
1063 continue;
1064 }
1065 str++;
1066 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001067 if (*str == delimiter)
1068 {
you.chen35020192022-05-06 11:30:57 +08001069 *str = '\0';
1070 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001071
you.chen35020192022-05-06 11:30:57 +08001072 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001073}
1074
you.chend2fef3f2023-02-13 10:50:35 +08001075static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
1076{
1077 char * p;
1078 int ret = 0;
1079 char cmd[256]={0};
1080 if (NULL == mac || NULL == ip)
you.chen35020192022-05-06 11:30:57 +08001081 return -1;
you.chend2fef3f2023-02-13 10:50:35 +08001082 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +08001083 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-02-13 10:50:35 +08001084 ret = exec_cmd(cmd, ip, ip_len);
1085 p = strchr(ip, '\n');
1086 if (NULL != p)
1087 {
1088 *p = '\0';
you.chen35020192022-05-06 11:30:57 +08001089 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001090 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +08001091 return ret;
1092}
1093
you.chend2fef3f2023-02-13 10:50:35 +08001094static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +08001095 struct in_addr addr ={0};
1096 struct hostent *ht;
1097
qs.xiong9fbf74e2023-03-28 13:38:22 +08001098 if (ip == NULL || *ip == '\0' || hostname == NULL)
1099 {
1100 RLOGE("ip == NULL or hostname == NULL");
1101 return -1;
you.chen35020192022-05-06 11:30:57 +08001102 }
1103
you.chend2fef3f2023-02-13 10:50:35 +08001104 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08001105 if (inet_aton(ip, &addr) == 0)
1106 {
you.chen35020192022-05-06 11:30:57 +08001107 printf("---inet_aton fail\n");
1108 return -1;
1109 }
1110
1111 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
1112
qs.xiong9fbf74e2023-03-28 13:38:22 +08001113 if (ht == NULL)
1114 {
1115 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-05-06 11:30:57 +08001116 herror(NULL);
1117 return -1;
1118 }
1119
1120 strcpy(hostname, ht->h_name);
1121
1122 return 0;
1123}
1124
1125static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
1126{
1127 int count, index, words_count;
1128 char * split_lines[128]= {0};
1129 char * split_words[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08001130 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +08001131 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001132 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-05-06 11:30:57 +08001133
1134 CHECK_WPA_CTRL(ap_sta);
1135
1136 DO_REQUEST(lynq_wifi_list_networks);
1137
1138 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1139
1140 //@todo check ssid field to compatible
1141
1142 ret = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001143 for(index=1; index < count; index++)
1144 {
you.chen35020192022-05-06 11:30:57 +08001145 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001146 if (words_count > 2)
1147 {
you.chend2fef3f2023-02-13 10:50:35 +08001148 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001149 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
1150 {
you.chen35020192022-05-06 11:30:57 +08001151 net_no_list[ret++] = atoi(split_words[0]);
1152 }
1153 }
1154 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001155 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +08001156 return ret;
1157}
1158
1159static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001160 size_t i=0;
you.chen35020192022-05-06 11:30:57 +08001161 CHECK_WPA_CTRL(ap_sta);
1162 const char *lynq_wifi_add_network = "ADD_NETWORK";
1163
qs.xiong9fbf74e2023-03-28 13:38:22 +08001164 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +08001165 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001166 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1167 {
1168 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen35020192022-05-06 11:30:57 +08001169 return -1;
1170 }
1171
qs.xiong9fbf74e2023-03-28 13:38:22 +08001172 for(i=0;i<reply_len;i++)
1173 {
1174 if(cmd_reply[i] == '\n')
1175 {
you.chen35020192022-05-06 11:30:57 +08001176 cmd_reply[i] = '\0';
1177 break;
1178 }
1179 }
1180 return atoi(cmd_reply);
1181}
you.chena6cd55a2022-05-08 12:20:18 +08001182
you.chen35020192022-05-06 11:30:57 +08001183static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
1184{
1185 int count, index;
1186 int net_no_list[128];
1187
qs.xiong9fbf74e2023-03-28 13:38:22 +08001188 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +08001189 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001190 for (index=0; index < count; index++)
1191 {
1192 if (net_no_list[index] == net_no)
1193 {
you.chen35020192022-05-06 11:30:57 +08001194 return 0;
1195 }
1196 }
1197
1198 if (count >= 1)
1199 index = net_no_list[count - 1];
1200 else
1201 index = -1;
1202
qs.xiong9fbf74e2023-03-28 13:38:22 +08001203 while (index < net_no )
1204 {
you.chen35020192022-05-06 11:30:57 +08001205 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001206 if (index >= net_no)
1207 { // required network no created
1208 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +08001209 return 0;
1210 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001211 else if( index < 0)
1212 {
1213 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +08001214 return -1;
1215 }
you.chen35020192022-05-06 11:30:57 +08001216 }
1217
1218 if (index < 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001219 {
1220 RLOGE("[lynq_check_network_number] network index < 0");
1221 return -1;
1222 }
1223 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen35020192022-05-06 11:30:57 +08001224 return 0;
1225}
1226
1227static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +08001228 if (freq > 5000 && freq < 6000)
1229 {
you.chen35020192022-05-06 11:30:57 +08001230 return LYNQ_WIFI_5G_band;
1231 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001232 else if (freq > 2000 && freq < 3000)
1233 {
you.chen35020192022-05-06 11:30:57 +08001234 return LYNQ_WIFI_2G_band;
1235 }
1236 return LYNQ_WIFI_2_and_5G_band;
1237}
1238
1239static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001240 if (key_mgmt != NULL)
1241 {
1242 if (memcmp( key_mgmt, "NONE", 4) == 0)
1243 {
you.chen35020192022-05-06 11:30:57 +08001244 return LYNQ_WIFI_AUTH_OPEN;
1245 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001246 else if (memcmp( key_mgmt, "WEP", 3) == 0)
1247 {
you.chen35020192022-05-06 11:30:57 +08001248 return LYNQ_WIFI_AUTH_WEP;
1249 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001250 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
1251 {
you.chen35020192022-05-06 11:30:57 +08001252 return LYNQ_WIFI_AUTH_WPA_PSK;
1253 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001254 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
1255 {
you.chen35020192022-05-06 11:30:57 +08001256 return LYNQ_WIFI_AUTH_WPA2_PSK;
1257 }
1258 }
1259
1260 return -1;
1261}
1262
1263static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001264 if (flag != NULL)
1265 {
qs.xiong3e506812023-04-06 11:08:48 +08001266 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
1267 {
1268 return LYNQ_WIFI_AUTH_WPA3_PSK;
1269 }else if ( strstr( flag,"SAE-CCMP") != NULL )
1270 {
1271 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
1272 }else if (strstr( flag, "WPA2-PSK") != NULL)
1273 {
you.chen35020192022-05-06 11:30:57 +08001274 return LYNQ_WIFI_AUTH_WPA2_PSK;
1275 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001276 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001277 {
you.chen35020192022-05-06 11:30:57 +08001278 return LYNQ_WIFI_AUTH_WPA_PSK;
1279 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001280 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001281 {
you.chen35020192022-05-06 11:30:57 +08001282 return LYNQ_WIFI_AUTH_WEP;
1283 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001284 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001285 {
you.chen35020192022-05-06 11:30:57 +08001286 return LYNQ_WIFI_AUTH_OPEN;
1287 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001288 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +08001289 {
you.chend2fef3f2023-02-13 10:50:35 +08001290 return LYNQ_WIFI_AUTH_OPEN;
1291 }
you.chen35020192022-05-06 11:30:57 +08001292 }
1293
1294 return -1;
1295}
1296
1297static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
1298 switch (bw) {
1299 case 10:
1300 return LYNQ_WIFI_BANDWIDTH_HT10;
1301 break;
1302 case 20:
1303 return LYNQ_WIFI_BANDWIDTH_HT20;
1304 break;
1305 case 40:
1306 return LYNQ_WIFI_BANDWIDTH_HT40;
1307 break;
1308 case 80:
1309 return LYNQ_WIFI_BANDWIDTH_HT80;
1310 break;
1311 default:
1312 break;
1313 }
1314
1315 return -1;
1316}
1317
you.chen70f377f2023-04-14 18:17:09 +08001318static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth);
you.chen35020192022-05-06 11:30:57 +08001319static int inner_get_status_info(int interface, curr_status_info *curr_state) {
1320 int i, count;
1321 char *p;
1322 const char *lynq_status_cmd = "STATUS";
1323 const char * FLAG_SSID = "ssid=";
1324 const char * FLAG_SBSID = "bssid=";
1325 const char * FLAG_KEY_MGMT = "key_mgmt=";
1326 const char * FLAG_FREQ = "freq=";
1327 const char * FLAG_STATE = "wpa_state=";
1328 const char * FLAG_ID = "id=";
you.chend2fef3f2023-02-13 10:50:35 +08001329 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +08001330 char *split_lines[128] = {0};
1331
1332 CHECK_WPA_CTRL(interface);
1333
qs.xiong9fbf74e2023-03-28 13:38:22 +08001334 if (curr_state == NULL)
1335 {
1336 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-05-06 11:30:57 +08001337 return -1;
1338 }
1339
1340 DO_REQUEST(lynq_status_cmd);
1341
1342 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1343
1344 curr_state->net_no = -1;
1345 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001346 for(i=0; i < count; i++)
1347 {
1348 if (curr_state->ap != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001349 {
you.chen35020192022-05-06 11:30:57 +08001350 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001351 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001352 {
you.chend2fef3f2023-02-13 10:50:35 +08001353 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +08001354 ret = 0;
1355 continue;
1356 }
you.chenf58b3c92022-06-21 16:53:48 +08001357 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001358 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001359 {
you.chend2fef3f2023-02-13 10:50:35 +08001360 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 +08001361 ret = 0;
1362 continue;
1363 }
you.chen35020192022-05-06 11:30:57 +08001364 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001365 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001366 {
you.chen450d0172022-07-15 17:56:48 +08001367 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001368 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +08001369 ret = 0;
1370 continue;
1371 }
1372 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001373 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001374 {
you.chen35020192022-05-06 11:30:57 +08001375 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1376 ret = 0;
1377 continue;
1378 }
you.chend2fef3f2023-02-13 10:50:35 +08001379 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001380 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001381 {
you.chend2fef3f2023-02-13 10:50:35 +08001382 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1383 ret = 0;
1384 continue;
1385 }
you.chen35020192022-05-06 11:30:57 +08001386 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001387 if (curr_state->state != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001388 {
you.chen35020192022-05-06 11:30:57 +08001389 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001390 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001391 {
you.chen35020192022-05-06 11:30:57 +08001392 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1393 ret = 0;
1394 continue;
1395 }
1396
1397 } //end else if (state != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001398 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
you.chen70f377f2023-04-14 18:17:09 +08001399 {
you.chen35020192022-05-06 11:30:57 +08001400 ret = 0;
you.chen450d0172022-07-15 17:56:48 +08001401 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001402 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +08001403 }
1404 }
1405
you.chen70f377f2023-04-14 18:17:09 +08001406 if (ret == 0 && curr_state->ap != NULL && curr_state->net_no >= 0) // auth may not right when add wpa3
1407 {
1408 inner_get_network_auth(interface, curr_state->net_no, &curr_state->ap->auth);
1409 }
1410
you.chen35020192022-05-06 11:30:57 +08001411 return ret;
1412}
1413
qs.xiongf1b525b2022-03-31 00:58:23 -04001414int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001415{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001416 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +08001417 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -05001418
qs.xiong9fbf74e2023-03-28 13:38:22 +08001419 if (ap_ssid == NULL)
1420 {
1421 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +08001422 return -1;
1423 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001424 else
1425 {
1426 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen35020192022-05-06 11:30:57 +08001427 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001428
qs.xiong9fbf74e2023-03-28 13:38:22 +08001429 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1430 {
1431 RLOGE("Do check ap network_number fail");
you.chen35020192022-05-06 11:30:57 +08001432 return -1;
1433 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001434
you.chen35020192022-05-06 11:30:57 +08001435 CHECK_IDX(idx, CTRL_AP);
1436
1437 CHECK_WPA_CTRL(CTRL_AP);
1438
1439 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1440
1441 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1442 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001443 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1444 return 0;
you.chen35020192022-05-06 11:30:57 +08001445
qs.xiong7a105ce2022-03-02 09:43:11 -05001446}
1447
you.chen35020192022-05-06 11:30:57 +08001448int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001449{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001450 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001451 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001452 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001453}
1454
qs.xiongc9c79f72022-10-17 15:27:18 +08001455/*****
1456 *frequency <------>channel
1457 *
1458 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1459 *
1460 *
1461 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1462 *
1463 *
1464 * */
1465static int lynq_check_set_frequency(int input_frequency){
qs.xiongc00b6032022-11-29 16:28:03 +08001466 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};
1467 int i;
1468 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1469
qs.xiong69a332b2022-12-02 09:58:57 +08001470 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001471 {
1472 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001473 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001474 }
qs.xiongc00b6032022-11-29 16:28:03 +08001475
1476 if(i == arr_len)
1477 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001478 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001479 return -1;
1480 }
qs.xiongc00b6032022-11-29 16:28:03 +08001481
qs.xiongc9c79f72022-10-17 15:27:18 +08001482 return 0;
1483}
qs.xiong13673462023-02-21 19:12:54 +08001484
1485static int lynq_check_frequencyby_country_code(int input_frequency)
1486{
1487 char str_cnc[]="CN";
1488 char str_dest[20]="";
1489
1490 if( lynq_get_country_code(1,str_dest) != 0 )
1491 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001492 RLOGE("get country_code error\n");
qs.xiong13673462023-02-21 19:12:54 +08001493 return -1;
1494 }
1495 if( strncmp(str_dest,str_cnc,2) != 0 )
1496 {
1497 return 0;
1498 }else if( 2473 < input_frequency && input_frequency < 5744)
1499 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001500 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001501 return -1;
1502 }
1503 return 0;
1504}
qs.xiongf1b525b2022-03-31 00:58:23 -04001505int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001506{
qs.xiongc00b6032022-11-29 16:28:03 +08001507 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001508 char lynq_wifi_frequency_cmd[128]={0};
1509 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001510 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001511 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001512 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001513 check = lynq_check_set_frequency(lynq_wifi_frequency);
1514 if(check != 0)
1515 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001516 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001517 return -1;
you.chen35020192022-05-06 11:30:57 +08001518 }
qs.xiong13673462023-02-21 19:12:54 +08001519 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1520 if(check != 0)
1521 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001522 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001523 return -1;
1524 }
1525
qs.xiongc00b6032022-11-29 16:28:03 +08001526 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1527 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001528 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001529 return -1;
1530 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001531
you.chen35020192022-05-06 11:30:57 +08001532 CHECK_IDX(idx, CTRL_AP);
1533
1534 CHECK_WPA_CTRL(CTRL_AP);
1535
1536 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1537 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1538 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1539
you.chen6c2dd9c2022-05-16 17:55:28 +08001540 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-05-06 11:30:57 +08001541 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1542 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1543 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001544
qs.xiong9fbf74e2023-03-28 13:38:22 +08001545 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001546}
1547
qs.xiongf1b525b2022-03-31 00:58:23 -04001548int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001549{
you.chen35020192022-05-06 11:30:57 +08001550 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001551 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001552 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001553
qs.xiong9fbf74e2023-03-28 13:38:22 +08001554 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1555 {
1556 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen35020192022-05-06 11:30:57 +08001557 return -1;
1558 }
1559 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001560
qs.xiong9fbf74e2023-03-28 13:38:22 +08001561 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001562}
1563
qs.xiongf1b525b2022-03-31 00:58:23 -04001564int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1565{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001566 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001567 CHECK_IDX(idx, CTRL_AP);
1568 switch(bandwidth){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001569 case LYNQ_WIFI_BANDWIDTH_HT10:
1570 {
1571 RLOGE("bandwith [%d] not support now\n", bandwidth);
1572 return -1;
1573 }
1574 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen35020192022-05-06 11:30:57 +08001575 {
1576 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1577 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001578 if (system(lynq_cmd_bandwith) != 0 )
1579 {
1580 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001581 return -1;
1582 }
1583 system("wl up");
1584 break;
1585 }
1586 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001587 {
qs.xiong10379192023-02-21 13:19:42 +08001588 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001589 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1590 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001591 if (system(lynq_cmd_bandwith) != 0 )
1592 {
1593 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001594 return -1;
1595 }
1596 system("wl up");
1597 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001598 }
you.chen35020192022-05-06 11:30:57 +08001599 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001600 {
qs.xiong10379192023-02-21 13:19:42 +08001601 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001602 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001603 if (system(lynq_cmd_bandwith) != 0 )
1604 {
1605 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001606 return -1;
1607 }
1608 system("wl up");
1609 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001610 }
1611 default:
you.chen35020192022-05-06 11:30:57 +08001612 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001613 RLOGE("auth type [%d] not support now\n", bandwidth);
1614 return -1;
you.chen35020192022-05-06 11:30:57 +08001615 }
1616 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001617
1618
you.chen35020192022-05-06 11:30:57 +08001619 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001620}
you.chen35020192022-05-06 11:30:57 +08001621
qs.xiongf1b525b2022-03-31 00:58:23 -04001622int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1623{
you.chen35020192022-05-06 11:30:57 +08001624 int count = 0;
1625 int index = 0;
1626 char *split_words[128] = {0};
1627 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001628 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001629 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001630
you.chen35020192022-05-06 11:30:57 +08001631 CHECK_WPA_CTRL(CTRL_AP);
1632
1633 DO_REQUEST(lynq_chanspec_cmd);
1634
1635 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1636 for(;index < count; index++) {
1637 if (strncmp(split_words[index], "bw", 2) != 0) {
1638 continue;
1639 }
1640
1641 index++;
1642 if (index >= count) {
1643 return -1;
1644 }
1645
qs.xiong9fbf74e2023-03-28 13:38:22 +08001646 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001647 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1648 return 0;
1649 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001650 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001651 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001652}
qs.xiong0fb469a2022-04-14 03:50:45 -04001653
qs.xiongf1b525b2022-03-31 00:58:23 -04001654int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001655{
you.chen35020192022-05-06 11:30:57 +08001656 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001657 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001658 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001659
you.chen35020192022-05-06 11:30:57 +08001660 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001661
qs.xiong9fbf74e2023-03-28 13:38:22 +08001662 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1663 {
you.chen35020192022-05-06 11:30:57 +08001664 return -1;
1665 }
1666
1667 system("wl down");
1668 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001669 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001670 return -1;
1671 }
1672 system("wl up");
1673 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001674}
qs.xiong0fb469a2022-04-14 03:50:45 -04001675
qs.xiongf1b525b2022-03-31 00:58:23 -04001676int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001677{
you.chen35020192022-05-06 11:30:57 +08001678 int count = 0;
1679 int index = 0;
1680 char *split_words[128] = {0};
1681 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001682 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001683 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001684
you.chen35020192022-05-06 11:30:57 +08001685 CHECK_WPA_CTRL(CTRL_AP);
1686
1687 DO_REQUEST(lynq_chanspec_cmd);
1688
1689 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001690 for(;index < count; index++)
1691 {
1692 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001693 if (strncmp(split_words[index], "channel", 2) != 0) {
1694 continue;
1695 }
1696
1697 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001698 if (index >= count)
1699 {
you.chen35020192022-05-06 11:30:57 +08001700 return -1;
1701 }
1702
1703 *channel = atoi(split_words[index]);
1704 return 0;
1705 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001706 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001707 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001708}
1709
1710
you.chen35020192022-05-06 11:30:57 +08001711int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001712{
you.chen6c2dd9c2022-05-16 17:55:28 +08001713 char ssid[MAX_CMD] = {0};
1714 int freq = 0;
1715 char lynq_auth_cmd[64]={0};
1716 char lynq_auth_alg_cmd[64]={0};
1717 char lynq_psk_cmd[64]={0};
1718 char lynq_pairwise_cmd[64]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001719 char lynq_ieee80211_cmd[64]={0};
1720 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001721 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001722 CHECK_IDX(idx, CTRL_AP);
1723
you.chen6c2dd9c2022-05-16 17:55:28 +08001724 CHECK_WPA_CTRL(CTRL_AP);
1725
qs.xiong9fbf74e2023-03-28 13:38:22 +08001726 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1727 {
1728 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen35020192022-05-06 11:30:57 +08001729 return -1;
1730 }
1731
you.chen92fd5d32022-05-25 10:09:47 +08001732 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001733 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001734 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001735 return 0;
1736 }
1737 else {
1738 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1739 ssid[0] = '\0';
1740 }
1741 lynq_wifi_ap_frequency_get(idx, &freq);
1742
1743 DO_OK_FAIL_REQUEST(cmd_disconnect);
1744 DO_OK_FAIL_REQUEST(cmd_remove_all);
1745 if (ssid[0] != '\0') {
1746 lynq_wifi_ap_ssid_set(idx, ssid);
1747 }
1748 if (freq != 0) {
1749 lynq_wifi_ap_frequency_set(idx, freq);
1750 }
1751 }
1752 }
you.chen35020192022-05-06 11:30:57 +08001753
qs.xiong9fbf74e2023-03-28 13:38:22 +08001754 switch(auth){
1755 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001756 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001757 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001758 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001759 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001760 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001761 break;
1762 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001763 case LYNQ_WIFI_AUTH_WEP:
1764 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001765 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001766 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001767 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-05-16 17:55:28 +08001768 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1769
1770 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1771 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1772 break;
1773 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001774 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-03-29 17:36:14 +08001775 {
1776 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1777 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1778 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1779
1780 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1781 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1782 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1783 break;
1784
1785 }
you.chen35020192022-05-06 11:30:57 +08001786 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001787 {
1788 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1789 {
you.chen35020192022-05-06 11:30:57 +08001790 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1791 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1792 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001793 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1794 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001795 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001796 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001797 }
1798// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1799// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1800 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong7a105ce2022-03-02 09:43:11 -05001801
you.chen35020192022-05-06 11:30:57 +08001802 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1803 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1804 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001805 break;
1806 }
1807 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1808 {
1809 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1810 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1811 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1812 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1813
1814 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1815 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1816 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1817 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1818 break;
1819 }
1820 case LYNQ_WIFI_AUTH_WPA3_PSK:
1821 {
1822 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1823 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xiong3e506812023-04-06 11:08:48 +08001824 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001825 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1826
1827 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1828 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1829 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1830 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1831 break;
1832 }
1833 default:
you.chen35020192022-05-06 11:30:57 +08001834 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001835 RLOGE("auth type [%d] not support now\n", auth);
1836 return -1;
you.chen35020192022-05-06 11:30:57 +08001837 }
1838 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001839 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001840
qs.xiong9fbf74e2023-03-28 13:38:22 +08001841 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001842}
1843
you.chen35020192022-05-06 11:30:57 +08001844int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001845{
you.chen35020192022-05-06 11:30:57 +08001846 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001847 char lynq_auth_alg_str[MAX_RET] = {0};
1848 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001849 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001850 CHECK_IDX(idx, CTRL_AP);
1851
qs.xiong9fbf74e2023-03-28 13:38:22 +08001852 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1853 {
1854 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen35020192022-05-06 11:30:57 +08001855 return -1;
1856 }
1857
qs.xiong9fbf74e2023-03-28 13:38:22 +08001858 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1859 {
1860 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1861 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001862 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001863 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001864 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001865 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001866 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1867 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001868 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001869 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001870 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001871 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001872 else
1873 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001874 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001875 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001876 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001877 }
you.chen35020192022-05-06 11:30:57 +08001878 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001879 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1880 {
1881 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1882 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001883 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001884 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001885 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001886 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1887 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001888 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001889 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001890 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001891 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001892 else
1893 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001894 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001895 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001896 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001897 }
you.chen35020192022-05-06 11:30:57 +08001898 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001899
1900 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1901 {
1902 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1903 return -1;
1904 }
1905
1906 if (memcmp(lynq_auth_str,"1",1) == 0 )
1907 {
1908 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1909 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001910 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001911 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1912 {
1913 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1914 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001915 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001916 }
1917 else
1918 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001919 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001920 *auth = -1;
1921 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001922
you.chen6c2dd9c2022-05-16 17:55:28 +08001923 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001924}
qs.xiong1af5daf2022-03-14 09:12:12 -04001925
qs.xiong1af5daf2022-03-14 09:12:12 -04001926
qs.xiongf1b525b2022-03-31 00:58:23 -04001927int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001928{
you.chen35020192022-05-06 11:30:57 +08001929 char LYNQ_WIFI_CMD[128]={0};
1930 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1931 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001932 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001933 CHECK_IDX(idx, CTRL_AP);
1934
1935 CHECK_WPA_CTRL(CTRL_AP);
1936
1937// system("connmanctl enable wifi");
1938// system("connmanctl tether wifi on cy-test 12345678");
1939// system("ifconfig wlan0 down");
1940// system("ifconfig wlan0 up");
1941// system("ifconfig wlan0 up");
1942
1943 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1944 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1945
1946 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1947 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1948
you.chen70f377f2023-04-14 18:17:09 +08001949 check_tether_and_notify();
1950
qs.xiong9fbf74e2023-03-28 13:38:22 +08001951 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001952}
1953
qs.xiongf1b525b2022-03-31 00:58:23 -04001954int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001955{
you.chen35020192022-05-06 11:30:57 +08001956 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001957}
1958
qs.xiongf1b525b2022-03-31 00:58:23 -04001959int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001960{
you.chen35020192022-05-06 11:30:57 +08001961 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04001962
you.chen35020192022-05-06 11:30:57 +08001963 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001964
you.chen35020192022-05-06 11:30:57 +08001965 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001966
you.chen35020192022-05-06 11:30:57 +08001967 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
1968
1969 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1970
you.chenb4b121c2022-05-06 17:50:16 +08001971// system("connmanctl tether wifi off");
you.chen35020192022-05-06 11:30:57 +08001972
qs.xiong9fbf74e2023-03-28 13:38:22 +08001973 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001974}
qs.xiong1af5daf2022-03-14 09:12:12 -04001975
qs.xiongf1b525b2022-03-31 00:58:23 -04001976int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001977{
you.chen35020192022-05-06 11:30:57 +08001978 char lynq_disable_cmd[128] = {0};
1979 char lynq_select_cmd[128] = {0};
1980 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001981 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08001982 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001983
you.chen35020192022-05-06 11:30:57 +08001984 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08001985 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1986 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1987
1988 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1989 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
1990 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04001991
qs.xiong9fbf74e2023-03-28 13:38:22 +08001992 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001993}
1994
qs.xiongf1b525b2022-03-31 00:58:23 -04001995int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001996{
you.chen35020192022-05-06 11:30:57 +08001997 char lynq_disable_cmd[128] = {0};
1998 char lynq_select_cmd[128] = {0};
1999 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08002000 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08002001 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05002002
you.chen35020192022-05-06 11:30:57 +08002003 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002004
you.chen35020192022-05-06 11:30:57 +08002005 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
2006 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
2007
2008 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2009 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
2010 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05002011
qs.xiong9fbf74e2023-03-28 13:38:22 +08002012 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002013}
qs.xiongf1b525b2022-03-31 00:58:23 -04002014
you.chen35020192022-05-06 11:30:57 +08002015int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002016{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002017 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08002018 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002019 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08002020 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002021 RLOGD("enter lynq_ap_password_set");
2022 if( password == NULL )
2023 {
2024 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08002025 return -1;
2026 }
2027 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08002028 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002029 if(pass_len < 8 || pass_len >= 64)
2030 {
2031 RLOGE("[lynq_ap_password_set]input password len not in rage");
2032 return -1;
you.chen35020192022-05-06 11:30:57 +08002033 }
qs.xiongf1b525b2022-03-31 00:58:23 -04002034
you.chen35020192022-05-06 11:30:57 +08002035 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002036
qs.xiong9fbf74e2023-03-28 13:38:22 +08002037 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
2038 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002039 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002040 return -1;
2041 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002042 else if (auth == LYNQ_WIFI_AUTH_OPEN)
2043 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002044 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
2045 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08002046 }
2047
you.chen35020192022-05-06 11:30:57 +08002048 CHECK_WPA_CTRL(CTRL_AP);
2049
qs.xiong9fbf74e2023-03-28 13:38:22 +08002050 if (auth == LYNQ_WIFI_AUTH_WEP)
2051 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002052 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002053 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
2054 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
2055 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2056 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
2057 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002058 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2059 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002060 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 +08002061 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
2062 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2063 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002064 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
2065 {
2066
qs.xiongc8d92a62023-03-29 17:36:14 +08002067 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 +08002068 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08002069 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002070 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2071 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
2072
2073 }
2074 else
qs.xiongc8d92a62023-03-29 17:36:14 +08002075 {
2076 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002077 return -1;
2078 }
you.chen35020192022-05-06 11:30:57 +08002079
you.chen35020192022-05-06 11:30:57 +08002080 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04002081
qs.xiong9fbf74e2023-03-28 13:38:22 +08002082 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04002083}
2084
you.chen35020192022-05-06 11:30:57 +08002085int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04002086{
you.chen35020192022-05-06 11:30:57 +08002087 FILE * fp;
2088 int len, ret;
2089 int count, index;
2090 char *split_lines[128] = {0};
2091 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002092 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04002093
you.chen35020192022-05-06 11:30:57 +08002094 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002095
you.chen35020192022-05-06 11:30:57 +08002096 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
2097// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002098 if (NULL == fp)
2099 {
2100 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002101 return -1;
2102 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002103
you.chen35020192022-05-06 11:30:57 +08002104 buff = alloca(MAX_RET);
2105 fseek(fp, 0, SEEK_SET);
2106 len = fread(buff, 1, MAX_RET, fp);
2107 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04002108
qs.xiong9fbf74e2023-03-28 13:38:22 +08002109 for(index=0; index < len; index ++)
2110 {
2111 if (memcmp(buff + index, "network={", 9) != 0)
2112 {
you.chen35020192022-05-06 11:30:57 +08002113 continue;
2114 }
2115 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002116 for (; index < len; index ++ )
2117 {
2118 if (buff[index] != '}')
2119 {
you.chen35020192022-05-06 11:30:57 +08002120 continue;
2121 }
2122 buff[index] = '\0';
2123 break;
2124 }
2125 len = buff + index - p;
2126 }
2127
2128 count = lynq_split(p, len, '\n', split_lines);
2129
2130 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002131 for(index=0; index < count; index++)
2132 {
you.chen35020192022-05-06 11:30:57 +08002133 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002134 if (p != NULL)
2135 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002136 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002137 if (*p == '\"')
2138 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002139 p++;
2140 }
you.chen35020192022-05-06 11:30:57 +08002141 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002142 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2143 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002144 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002145 if (*p == '\"')
2146 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002147 p++;
2148 }
2149 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002150 else
2151 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002152 continue;
you.chen35020192022-05-06 11:30:57 +08002153 }
2154
2155 strcpy(password, p);
2156
qs.xiong9fbf74e2023-03-28 13:38:22 +08002157 while(*password != '\0')
2158 {
2159 if (*password == '\"')
2160 {
you.chen35020192022-05-06 11:30:57 +08002161 *password = '\0';
2162 break;
2163 }
2164 password++;
2165 }
2166 ret = 0;
2167 break;
2168 } //end for(index=0; index < count; index++)
2169
2170 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002171}
2172
you.chen35020192022-05-06 11:30:57 +08002173static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
2174 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08002175 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002176
qs.xiong9fbf74e2023-03-28 13:38:22 +08002177 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
2178 {
you.chen35020192022-05-06 11:30:57 +08002179 return -1;
2180 }
2181
2182 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08002183
qs.xiong9fbf74e2023-03-28 13:38:22 +08002184 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
2185 {
2186 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
you.chen70f377f2023-04-14 18:17:09 +08002187 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002188 if (strcmp(lynq_proto_str, "RSN") == 0)
you.chen70f377f2023-04-14 18:17:09 +08002189 {
you.chena6cd55a2022-05-08 12:20:18 +08002190 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002191 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08002192 }
you.chen70f377f2023-04-14 18:17:09 +08002193 else if (strcmp(lynq_proto_str, "WPA") == 0) // need compare when wpa3 supported
2194 {
2195 return 0;
2196 }
you.chena6cd55a2022-05-08 12:20:18 +08002197 }
2198 }
you.chen70f377f2023-04-14 18:17:09 +08002199 else if (*auth == LYNQ_WIFI_AUTH_OPEN || *auth == LYNQ_WIFI_AUTH_WEP)
2200 {
2201 return 0;
2202 }
2203
qs.xiong9fbf74e2023-03-28 13:38:22 +08002204 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
2205 {
you.chen70f377f2023-04-14 18:17:09 +08002206 RLOGE("check ieee80211w error\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002207 return -1;
2208 }
2209 if ( strncmp(lynq_auth_str,"1",1) == 0 )
2210 {
2211
you.chen70f377f2023-04-14 18:17:09 +08002212 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
2213 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002214 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
2215 {
2216
2217 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002218 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002219 }else
2220 {
you.chen70f377f2023-04-14 18:17:09 +08002221 RLOGE("check ieee80211w error, not 1 or 2\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002222 *auth = -1;
2223 return -1;
2224 }
you.chen35020192022-05-06 11:30:57 +08002225 return 0;
2226}
2227
2228int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002229{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002230 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002231 int pass_len, net_no, count, index;
2232 char lynq_tmp_cmd[300]={0};
2233 int net_no_list[128];
2234 lynq_wifi_auth_s net_auth;
2235 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002236 if(pass_len < 8 || pass_len >= 64)
2237 {
2238 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08002239 return -1;
2240 }
2241
2242 CHECK_IDX(idx, CTRL_STA);
2243
2244 net_no = -1;
2245 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
2246
qs.xiong9fbf74e2023-03-28 13:38:22 +08002247 for (index=0; index < count; index++)
2248 {
you.chen35020192022-05-06 11:30:57 +08002249 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002250 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
2251 {
you.chen35020192022-05-06 11:30:57 +08002252 net_no = net_no_list[index];
2253 break;
2254 }
2255 }
2256
qs.xiong9fbf74e2023-03-28 13:38:22 +08002257 if (net_no < 0)
2258 {
you.chen35020192022-05-06 11:30:57 +08002259 return -1;
2260 }
2261
2262 CHECK_WPA_CTRL(CTRL_STA);
2263
2264 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
2265
2266 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2267 DO_OK_FAIL_REQUEST(cmd_save_config);
2268
2269 return 0;
2270}
2271
2272int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
2273
2274 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08002275 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08002276 int count, index;
2277 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08002278 char *buff, *p, *ssid, *ssid_end_flag;
2279 char tmp_ssid[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002280 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08002281
you.chen755332b2022-08-06 16:59:10 +08002282 network_len = 0;
2283 p = NULL;
2284
you.chen35020192022-05-06 11:30:57 +08002285 CHECK_IDX(idx, CTRL_STA);
2286
qs.xiong9fbf74e2023-03-28 13:38:22 +08002287 if (NULL == password)
2288 {
2289 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08002290 return -1;
2291 }
2292
you.chen35020192022-05-06 11:30:57 +08002293 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002294 if (NULL == fp)
2295 {
2296 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002297 return -1;
2298 }
2299
2300 buff = alloca(MAX_RET);
2301 fseek(fp, 0, SEEK_SET);
2302 len = fread(buff, 1, MAX_RET, fp);
2303 fclose(fp);
2304
qs.xiong9fbf74e2023-03-28 13:38:22 +08002305 for(index=0; index < len; index ++)
2306 {
2307 for(; index < len; index ++)
2308 {
2309 if (memcmp(buff + index, "network={", 9) != 0)
2310 {
you.chen35020192022-05-06 11:30:57 +08002311 continue;
2312 }
2313 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002314 for (; index < len; index ++ )
2315 {
2316 if (buff[index] != '}')
2317 {
you.chen35020192022-05-06 11:30:57 +08002318 continue;
2319 }
2320 buff[index] = '\0';
2321 break;
2322 }
you.chen755332b2022-08-06 16:59:10 +08002323 network_len = buff + index - p;
2324 break;
you.chen35020192022-05-06 11:30:57 +08002325 }
2326
qs.xiongb3f26af2023-02-17 18:41:07 +08002327 if (p == NULL)
2328 return -1;
2329
you.chend2fef3f2023-02-13 10:50:35 +08002330 ssid = strstr(p, "ssid=");
2331 if (ssid != NULL) {
2332 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002333 if (ssid[0] == '\"')
2334 {
you.chend2fef3f2023-02-13 10:50:35 +08002335 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2336 break;
2337 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002338 else
2339 {
you.chend2fef3f2023-02-13 10:50:35 +08002340 ssid_end_flag = strstr(ssid, "\n");
2341 if (ssid_end_flag != NULL)
2342 {
2343 ssid_len = (ssid_end_flag - ssid) / 2;
2344 for(i=0; i<ssid_len; i++)
2345 {
2346 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2347 }
2348 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2349 break;
2350 }
2351 }
you.chen35020192022-05-06 11:30:57 +08002352 }
you.chend2fef3f2023-02-13 10:50:35 +08002353
you.chen35020192022-05-06 11:30:57 +08002354 }
2355
qs.xiong9fbf74e2023-03-28 13:38:22 +08002356 if (index >= len || NULL == p || network_len <= 0)
2357 {
you.chen35020192022-05-06 11:30:57 +08002358 return -1;
2359 }
2360
you.chen755332b2022-08-06 16:59:10 +08002361 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08002362
2363 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002364 for(index=0; index < count; index++)
2365 {
you.chen35020192022-05-06 11:30:57 +08002366 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002367 if (p != NULL)
2368 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002369 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002370 if (*p == '\"')
2371 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002372 p++;
2373 }
you.chen35020192022-05-06 11:30:57 +08002374 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002375 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2376 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002377 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002378 if (*p == '\"')
2379 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002380 p++;
2381 }
2382 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002383 else
2384 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002385 continue;
you.chen35020192022-05-06 11:30:57 +08002386 }
2387
qs.xiong13673462023-02-21 19:12:54 +08002388 if (*p == '\"')
2389 p++;
2390 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08002391
qs.xiong13673462023-02-21 19:12:54 +08002392 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002393 while(password - p < 64 && *password != '\0')
2394 {
2395 if (*password == '\"')
2396 {
you.chen35020192022-05-06 11:30:57 +08002397 *password = '\0';
2398 break;
2399 }
2400 password++;
2401 }
2402 ret = 0;
2403 break;
2404 } //end for(index=0; index < count; index++)
2405
2406 return ret;
2407}
2408
2409static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2410{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002411 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04002412
qs.xiong9fbf74e2023-03-28 13:38:22 +08002413 if (sta_ssid == NULL)
2414 {
2415 RLOGE("sta_ssid is null\n");
2416 return -1;
you.chen35020192022-05-06 11:30:57 +08002417 }
2418
qs.xiong9fbf74e2023-03-28 13:38:22 +08002419 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002420
2421 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2422
2423 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2424// DO_OK_FAIL_REQUEST(cmd_save_config);
2425
qs.xiong9fbf74e2023-03-28 13:38:22 +08002426 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002427
2428}
2429
you.chen35020192022-05-06 11:30:57 +08002430static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05002431{
you.chen35020192022-05-06 11:30:57 +08002432 char lynq_disable_cmd[128]={0};
2433 char lynq_select_cmd[128]={0};
2434
2435 CHECK_WPA_CTRL(CTRL_STA);
2436
qs.xiong9fbf74e2023-03-28 13:38:22 +08002437 if (save != 0)
2438 {
you.chenc29444e2022-06-07 18:01:16 +08002439 if (start_flag != 0)
2440 {
2441 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2442 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2443 }
2444 else
2445 {
2446 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2447 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2448 }
you.chen35020192022-05-06 11:30:57 +08002449 DO_OK_FAIL_REQUEST(cmd_save_config);
2450 }
2451
qs.xiong9fbf74e2023-03-28 13:38:22 +08002452 if (start_flag == 0)
2453 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002454 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002455 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2456 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002457 else
2458 {
you.chen35020192022-05-06 11:30:57 +08002459 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2460 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2461 }
2462
2463 return 0;
2464}
2465
2466int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2467{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002468 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002469 CHECK_IDX(idx, CTRL_STA);
2470
you.chen6c2dd9c2022-05-16 17:55:28 +08002471 curr_status_info curr_state;
2472 ap_info_s ap_info;
2473 curr_state.ap = &ap_info;
2474 curr_state.state = NULL;
2475
qs.xiong9fbf74e2023-03-28 13:38:22 +08002476 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2477 {
you.chend2fef3f2023-02-13 10:50:35 +08002478 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002479 return 0;
2480 }
2481
2482 return -1;
you.chen35020192022-05-06 11:30:57 +08002483}
2484
2485int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2486{
you.chen9ac66392022-08-06 17:01:16 +08002487 scan_info_s *scan_list = NULL;
2488 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002489 int scan_len=0;
2490 int save_len=0;
2491 int best_index = -1;
2492 int best_scan_index = -1;
2493 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002494 int i, j, ret;
2495
2496 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002497
2498 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002499 if (info == NULL)
2500 {
you.chen35020192022-05-06 11:30:57 +08002501 return -1;
2502 }
2503
2504 curr_status_info curr_state;
2505 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002506 char status[64];
you.chen35020192022-05-06 11:30:57 +08002507
you.chen9ac66392022-08-06 17:01:16 +08002508 memset(&ap_info, 0, sizeof (ap_info));
2509 memset(status, 0, sizeof (status));
2510
2511 curr_state.ap = &ap_info;
2512 curr_state.state = status;
2513
qs.xiong9fbf74e2023-03-28 13:38:22 +08002514 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2515 {
you.chen35020192022-05-06 11:30:57 +08002516 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002517 if (strcmp(status, STATE_COMPLETED) == 0)
2518 {
2519 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2520 }
2521 else
2522 {
2523 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2524 }
you.chen35020192022-05-06 11:30:57 +08002525 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002526 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002527 return 0;
2528 }
2529
you.chen9ac66392022-08-06 17:01:16 +08002530 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002531 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002532 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2533 {
you.chen9ac66392022-08-06 17:01:16 +08002534 if (NULL != scan_list)
2535 {
2536 free(scan_list);
2537 }
you.chen35020192022-05-06 11:30:57 +08002538 return -1;
2539 }
2540
qs.xiong9fbf74e2023-03-28 13:38:22 +08002541 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2542 {
you.chen9ac66392022-08-06 17:01:16 +08002543 if (NULL != scan_list)
2544 {
2545 free(scan_list);
2546 }
2547 if (NULL != save_list)
2548 {
2549 free(save_list);
2550 }
you.chen35020192022-05-06 11:30:57 +08002551 return -1;
2552 }
2553
qs.xiong9fbf74e2023-03-28 13:38:22 +08002554 for (i=0; i < save_len; i++)
2555 {
2556 for (j=0; j < scan_len; j++)
2557 {
you.chen35020192022-05-06 11:30:57 +08002558 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002559 && save_list[i].base_info.auth == scan_list[j].auth)
2560 {
2561 if (best_rssi == 0)
2562 {
you.chen9ac66392022-08-06 17:01:16 +08002563 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002564 best_rssi = scan_list[j].rssi;
2565 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002566 else if (best_rssi > scan_list[j].rssi)
2567 {
you.chen35020192022-05-06 11:30:57 +08002568 best_index = i;
2569 best_scan_index = j;
2570 best_rssi = scan_list[j].rssi;
2571 }
you.chend2fef3f2023-02-13 10:50:35 +08002572 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 +08002573 break;
2574 }
2575 }
2576 }
2577
qs.xiong9fbf74e2023-03-28 13:38:22 +08002578 if (best_index >= 0)
2579 {
you.chen35020192022-05-06 11:30:57 +08002580 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002581 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 +08002582 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2583 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002584 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002585 }
2586
you.chen9ac66392022-08-06 17:01:16 +08002587 if (NULL != scan_list)
2588 {
2589 free(scan_list);
2590 }
2591 if (NULL != save_list)
2592 {
2593 free(save_list);
2594 }
2595
2596 return ret;
you.chen35020192022-05-06 11:30:57 +08002597}
2598
2599static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2600{
qs.xiongc8d92a62023-03-29 17:36:14 +08002601 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002602 char lynq_ket_mgmt_cmd[64]={0};
2603 char lynq_pairwise_cmd[64]={0};
2604 char lynq_psk_cmd[64]={0};
2605
2606 CHECK_WPA_CTRL(CTRL_STA);
2607
qs.xiong9fbf74e2023-03-28 13:38:22 +08002608 switch(auth)
2609 {
2610 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002611 {
2612 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002613
you.chen35020192022-05-06 11:30:57 +08002614 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002615// DO_OK_FAIL_REQUEST(cmd_save_config);
2616 break;
2617 }
2618 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002619 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002620 {
2621 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2622 {
you.chen35020192022-05-06 11:30:57 +08002623 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2624 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002625 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2626 {
you.chena6cd55a2022-05-08 12:20:18 +08002627 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002628 }
2629 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2630 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002631
you.chen35020192022-05-06 11:30:57 +08002632 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2633 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2634 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002635
qs.xiong9fbf74e2023-03-28 13:38:22 +08002636 if (password != NULL)
2637 {
you.chen35020192022-05-06 11:30:57 +08002638 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2639 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002640 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002641 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002642
you.chen35020192022-05-06 11:30:57 +08002643// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002644 break;
2645 }
2646 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2647 {
qs.xiong3e506812023-04-06 11:08:48 +08002648 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002649 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002650 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2651 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2652
qs.xiong3e506812023-04-06 11:08:48 +08002653 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002654 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2655 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2656 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2657
2658 break;
2659 }
2660 case LYNQ_WIFI_AUTH_WPA3_PSK:
2661 {
qs.xiong3e506812023-04-06 11:08:48 +08002662 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002663 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORk %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002664 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2665 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2666
qs.xiong3e506812023-04-06 11:08:48 +08002667 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong455c30b2023-04-12 11:40:02 +08002668 RLOGD("inner_set_sta_auth_psw before set SAE CMD");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002669 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
qs.xiong455c30b2023-04-12 11:40:02 +08002670 RLOGD("inner_set_sta_auth_psw after set SAE CMD");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002671 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2672 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2673
2674 break;
2675 }
2676 default:
2677 return -1;
you.chen35020192022-05-06 11:30:57 +08002678 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002679
qs.xiong9fbf74e2023-03-28 13:38:22 +08002680 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002681}
qs.xiong7a105ce2022-03-02 09:43:11 -05002682
you.chen35020192022-05-06 11:30:57 +08002683static int inner_get_curr_net_no(int interface) {
2684 curr_status_info curr_state;
2685 curr_state.ap = NULL;
2686 curr_state.state = NULL;
2687
qs.xiong9fbf74e2023-03-28 13:38:22 +08002688 if (0 != inner_get_status_info(interface, &curr_state))
2689 {
you.chen35020192022-05-06 11:30:57 +08002690 return -1;
2691 }
2692
2693 return curr_state.net_no;
2694}
2695
2696int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002697{
you.chen35020192022-05-06 11:30:57 +08002698 int net_no;
2699 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002700
you.chen35020192022-05-06 11:30:57 +08002701 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002702
qs.xiong9fbf74e2023-03-28 13:38:22 +08002703 if (net_no < 0)
2704 {
you.chen35020192022-05-06 11:30:57 +08002705 return -1;
2706 }
2707
2708 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002709}
2710
you.chen35020192022-05-06 11:30:57 +08002711int 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 -05002712{
you.chen35020192022-05-06 11:30:57 +08002713 int count, net_no, index;
2714 int net_no_list[128];
2715 lynq_wifi_auth_s net_auth;
you.chen70f377f2023-04-14 18:17:09 +08002716 curr_status_info curr_state;
2717 ap_info_s ap_info;
2718 char status[64];
qs.xiongf1b525b2022-03-31 00:58:23 -04002719
qs.xiong9fbf74e2023-03-28 13:38:22 +08002720 if (ssid == NULL || *ssid == '\0')
2721 {
2722 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002723 return -1;
2724 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002725
qs.xiong9fbf74e2023-03-28 13:38:22 +08002726 if (LYNQ_WIFI_AUTH_OPEN != auth)
2727 {
2728 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
you.chen70f377f2023-04-14 18:17:09 +08002729 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002730 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002731 return -1;
2732 }
2733 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002734
you.chen70f377f2023-04-14 18:17:09 +08002735
2736 pthread_mutex_lock(&s_global_check_mutex);
2737 if (s_sta_status != INNER_STA_STATUS_INIT)
2738 {
2739 s_sta_status = INNER_STA_STATUS_CANCEL;
2740 pthread_cond_signal(&s_global_check_cond);
2741 }
2742 pthread_mutex_unlock(&s_global_check_mutex);
2743
you.chen35020192022-05-06 11:30:57 +08002744 CHECK_IDX(idx, CTRL_STA);
you.chen70f377f2023-04-14 18:17:09 +08002745 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002746
2747 net_no = -1;
you.chen70f377f2023-04-14 18:17:09 +08002748 memset(&ap_info, 0, sizeof (ap_info));
2749 memset(status, 0, sizeof (status));
you.chen35020192022-05-06 11:30:57 +08002750
you.chen70f377f2023-04-14 18:17:09 +08002751 curr_state.ap = &ap_info;
2752 curr_state.state = status;
2753
2754 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002755 {
you.chen70f377f2023-04-14 18:17:09 +08002756 if (strcmp(status, STATE_COMPLETED) == 0 && strcmp(ap_info.ap_ssid, ssid) ==0 && ap_info.auth == auth)
2757 {
2758 net_no = curr_state.net_no;
2759 if (0 == lynq_sta_ssid_password_get(idx, &ap_info, ap_info.psw)
2760 && strcmp(ap_info.psw, psw) == 0)
2761 {
2762 RLOGD("already connected\n");
2763
2764 pthread_mutex_lock(&s_global_check_mutex);
2765 s_sta_status = INNER_STA_STATUS_CONNECTED;
2766 pthread_cond_signal(&s_global_check_cond);
2767 pthread_mutex_unlock(&s_global_check_mutex);
2768 return 0;
2769 }
you.chen35020192022-05-06 11:30:57 +08002770 }
2771 }
2772
you.chen70f377f2023-04-14 18:17:09 +08002773 if (net_no == -1)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002774 {
you.chen70f377f2023-04-14 18:17:09 +08002775 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2776
2777 for (index=0; index < count; index++)
2778 {
2779 net_auth = -1;
2780 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2781 {
2782 net_no = net_no_list[index];
2783 break;
2784 }
you.chen35020192022-05-06 11:30:57 +08002785 }
2786
you.chen70f377f2023-04-14 18:17:09 +08002787 if (net_no < 0)
2788 {
2789 net_no = lynq_add_network(CTRL_STA);
2790 if (net_no == -1)
2791 {
2792 return -1;
2793 }
2794
2795 RLOGD("net no is %d\n", net_no);
2796 if (0 != inner_set_sta_ssid(net_no, ssid))
2797 {
2798 return -1;
2799 }
you.chen35020192022-05-06 11:30:57 +08002800 }
2801 }
2802
qs.xiong9fbf74e2023-03-28 13:38:22 +08002803 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2804 {
you.chen35020192022-05-06 11:30:57 +08002805 return -1;
2806 }
2807
you.chen70f377f2023-04-14 18:17:09 +08002808
2809 DO_OK_FAIL_REQUEST(cmd_disconnect);
2810 usleep(200*1000);
2811
2812 ret = inner_sta_start_stop(net_no, 1, 1);
2813
2814 pthread_mutex_lock(&s_global_check_mutex);
2815 s_sta_status = INNER_STA_STATUS_CONNECTING;
2816 strcpy(s_sta_current_connecting_ssid, ssid);
2817 struct timeval now;
2818 gettimeofday(&now,NULL);
2819 s_sta_connect_timeout.tv_sec = now.tv_sec + MAX_CONNNECT_TIME;
2820 s_sta_connect_timeout.tv_nsec = now.tv_usec*1000;
2821 pthread_cond_signal(&s_global_check_cond);
2822 pthread_mutex_unlock(&s_global_check_mutex);
2823 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002824}
2825
you.chen35020192022-05-06 11:30:57 +08002826int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002827{
you.chen35020192022-05-06 11:30:57 +08002828 ap_info_s ap;
2829 curr_status_info curr_state;
2830 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002831
qs.xiong9fbf74e2023-03-28 13:38:22 +08002832 if (ssid == NULL || *ssid == '\0')
2833 {
2834 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002835 return -1;
2836 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002837
you.chen35020192022-05-06 11:30:57 +08002838 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002839
you.chen35020192022-05-06 11:30:57 +08002840 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002841 curr_state.state = NULL;
2842
qs.xiong9fbf74e2023-03-28 13:38:22 +08002843 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2844 {
you.chen35020192022-05-06 11:30:57 +08002845 return 0;
2846 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002847
qs.xiong9fbf74e2023-03-28 13:38:22 +08002848 if (strcmp(ap.ap_ssid, ssid) != 0)
2849 {
you.chen35020192022-05-06 11:30:57 +08002850 return 0;
2851 }
2852
you.chen70f377f2023-04-14 18:17:09 +08002853 pthread_mutex_lock(&s_global_check_mutex);
2854 s_sta_status = INNER_STA_STATUS_DISCONNECTING;
2855 pthread_mutex_unlock(&s_global_check_mutex);
you.chen35020192022-05-06 11:30:57 +08002856 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002857}
qs.xiong97fa59b2022-04-07 05:41:29 -04002858
you.chena6cd55a2022-05-08 12:20:18 +08002859int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2860{
qs.xiongad2f89d2023-01-18 13:17:41 +08002861// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2862// const char *lynq_reconnect_cmd = "RECONNECT";
2863 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2864 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2865// 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 -05002866
you.chen35020192022-05-06 11:30:57 +08002867 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08002868 CHECK_WPA_CTRL(CTRL_STA);
2869
2870 system("connmanctl enable wifi");
2871
qs.xiongad2f89d2023-01-18 13:17:41 +08002872 if (system("ifconfig | grep -q wlan0") != 0)
2873 {
you.chen35020192022-05-06 11:30:57 +08002874 return -1;
2875 }
qs.xiong9c99fa92022-03-15 08:03:26 -04002876
qs.xiongad2f89d2023-01-18 13:17:41 +08002877// DO_OK_FAIL_REQUEST(cmd_remove_all);
2878// system(lynq_first_sta_cmd);
2879// system(lynq_reconfigure_cmd);
2880// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
2881 system(lynq_enable_sta_cmd);
2882 system(lynq_reconnect_cmd);
2883// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002884 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002885}
2886
you.chen35020192022-05-06 11:30:57 +08002887int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04002888{
qs.xiongad2f89d2023-01-18 13:17:41 +08002889// char lynq_disable_network_cmd[MAX_CMD];
2890// curr_status_info curr_state;
2891// ap_info_s ap_info;
you.chen35020192022-05-06 11:30:57 +08002892
qs.xiongad2f89d2023-01-18 13:17:41 +08002893 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 +08002894 CHECK_IDX(idx, CTRL_STA);
2895 CHECK_WPA_CTRL(CTRL_STA);
2896
qs.xiongad2f89d2023-01-18 13:17:41 +08002897// curr_state.ap = &ap_info;
2898// curr_state.state = NULL;
you.chena6cd55a2022-05-08 12:20:18 +08002899
qs.xiongad2f89d2023-01-18 13:17:41 +08002900// if (0 != inner_get_status_info(CTRL_STA, &curr_state) || curr_state.net_no < 0) {
2901// return 0;
2902// }
you.chena6cd55a2022-05-08 12:20:18 +08002903
qs.xiongad2f89d2023-01-18 13:17:41 +08002904// sprintf(lynq_disable_network_cmd, "DISABLE_NETWORK %d", curr_state.net_no);
2905// DO_OK_FAIL_REQUEST(lynq_disable_network_cmd);
2906 system(lynq_disable_sta_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002907 DO_OK_FAIL_REQUEST(cmd_save_config);
2908
2909 return 0;
2910// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04002911}
qs.xiong7a105ce2022-03-02 09:43:11 -05002912
you.chen35020192022-05-06 11:30:57 +08002913//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
2914// int i, count;
2915// char *p;
2916// const char * FLAG_SSID = "ssid=";
2917// const char * FLAG_SBSID = "bssid=";
2918// const char * FLAG_KEY_MGMT = "key_mgmt=";
2919// const char * FLAG_FREQ = "freq=";
2920// char lynq_sta_cmd[MAX_CMD];
2921// char *split_lines[128] = {0};
2922
2923// CHECK_WPA_CTRL(CTRL_AP);
2924
2925// sprintf(lynq_sta_cmd, "STA %s", bssid);
2926
2927// DO_REQUEST(lynq_sta_cmd);
2928
2929// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2930
2931// for(i=0; i < count; i++) {
2932// p = strstr(split_lines[i], FLAG_SSID);
2933// if (p != NULL) {
2934// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
2935// continue;
2936// }
2937// }
2938
2939// lynq_get_interface_ip(idx, ap->ap_ip);
2940// lynq_ap_password_set(idx, ap->psw);
2941
2942// return 0;
2943//}
2944
2945static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
2946 curr_status_info curr_state;
2947 curr_state.ap = ap;
2948 curr_state.state = NULL;
2949 return inner_get_status_info(interface, &curr_state);
2950}
2951
2952int 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 -04002953{
you.chend2fef3f2023-02-13 10:50:35 +08002954 int index, line_count;
2955 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08002956 const char *lynq_first_sta_cmd = "STA-FIRST";
2957 char lynq_next_sta_cmd[MAX_CMD];
2958 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08002959 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002960
you.chen35020192022-05-06 11:30:57 +08002961 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002962
you.chen35020192022-05-06 11:30:57 +08002963 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002964
you.chen35020192022-05-06 11:30:57 +08002965// ap_info_s * tmp_ap;
2966// device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002967 if (ap == NULL || list == NULL || len == NULL)
2968 {
2969 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08002970 return -1;
2971 }
2972
2973// ap = &tmp_ap;
2974// list = &tmp_list;
2975 *ap = malloc(sizeof (ap_info_s));
2976
qs.xiong9fbf74e2023-03-28 13:38:22 +08002977 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0)
2978 {
2979 RLOGE("inner_get_status_info_ap !=0\n");
you.chen35020192022-05-06 11:30:57 +08002980 return -1;
2981 }
2982
2983 lynq_get_interface_ip(idx, (*ap)->ap_ip);
2984 lynq_ap_password_get(idx, (*ap)->psw);
2985
you.chen35020192022-05-06 11:30:57 +08002986 DO_REQUEST(lynq_first_sta_cmd);
2987
2988 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002989 while (reply_len > 0)
2990 {
2991 if (memcmp(cmd_reply, "FAIL", 4) == 0)
2992 {
you.chen35020192022-05-06 11:30:57 +08002993 break;
2994 }
2995 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2996 bssid[index] = malloc(strlen(split_lines[0]) + 1);
2997 strcpy(bssid[index], split_lines[0]);
2998 index++;
2999 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
3000 reply_len = MAX_RET;
3001 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08003002 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 +08003003 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
3004 {
3005 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08003006 break;
3007 }
3008 }
3009
3010 *len = index;
3011
3012 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08003013 for (index=0; index < *len; index++)
3014 {
you.chend2fef3f2023-02-13 10:50:35 +08003015 dev_info = &(*list)[index];
3016 memset(dev_info, 0, sizeof(device_info_s));
3017 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
3018 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
3019 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
3020 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08003021 free(bssid[index]);
3022 }
3023
3024 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003025}
3026
you.chen35020192022-05-06 11:30:57 +08003027int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04003028{
you.chen35020192022-05-06 11:30:57 +08003029 int i, count, index, count_words;
3030 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
3031 char *split_lines[128] = {0};
3032 char *split_words[128] = {0};
3033 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04003034
qs.xiong9fbf74e2023-03-28 13:38:22 +08003035 if (list == NULL || len == NULL)
3036 {
you.chen35020192022-05-06 11:30:57 +08003037 return -1;
3038 }
qs.xiong97fa59b2022-04-07 05:41:29 -04003039
you.chen9ac66392022-08-06 17:01:16 +08003040 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
3041 {
3042 usleep(100 * 1000);
3043 }
3044
you.chen35020192022-05-06 11:30:57 +08003045 CHECK_IDX(idx, CTRL_STA);
3046
3047 CHECK_WPA_CTRL(CTRL_STA);
3048
3049 DO_REQUEST(lynq_scan_result_cmd);
3050
3051 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3052 *len = count - 1;
3053 *list = malloc(sizeof (scan_info_s) * *len);
3054
3055 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08003056 for (index=0; index <count_words; index++)
3057 {
3058 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08003059 }
3060
qs.xiong9fbf74e2023-03-28 13:38:22 +08003061 for(index = 1;index < count; index++)
3062 {
3063 RLOGD("---- %s\n",split_lines[index]);
you.chen35020192022-05-06 11:30:57 +08003064 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
3065 if (count_words < 4)
3066 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003067 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08003068 //bssid / frequency / signal level / flags / ssid
3069 p = (*list) + index - 1;
3070 strcpy(p->mac, split_words[0]);
3071 p->band = convert_band_from_freq(atoi(split_words[1]));
3072 p->rssi = -1 * atoi( split_words[2]);
3073 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chend2fef3f2023-02-13 10:50:35 +08003074 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
you.chen35020192022-05-06 11:30:57 +08003075 }
3076
3077 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003078}
qs.xiong97fa59b2022-04-07 05:41:29 -04003079
you.chen35020192022-05-06 11:30:57 +08003080int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
3081{
3082 int count, net_no, index;
3083 int net_no_list[128];
3084 lynq_wifi_auth_s net_auth;
3085 char lynq_remove_cmd[MAX_CMD];
3086
qs.xiong9fbf74e2023-03-28 13:38:22 +08003087 if (ssid == NULL || *ssid == '\0')
3088 {
3089 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08003090 return -1;
3091 }
3092
3093 CHECK_IDX(idx, CTRL_STA);
3094
3095 CHECK_WPA_CTRL(CTRL_STA);
3096
3097 net_no = -1;
3098 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
3099
qs.xiong9fbf74e2023-03-28 13:38:22 +08003100 for (index=0; index < count; index++)
3101 {
you.chen35020192022-05-06 11:30:57 +08003102 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003103 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
3104 {
you.chen35020192022-05-06 11:30:57 +08003105 net_no = net_no_list[index];
3106 break;
3107 }
3108 }
3109
qs.xiong9fbf74e2023-03-28 13:38:22 +08003110 if (net_no < 0)
3111 {
you.chen35020192022-05-06 11:30:57 +08003112 return 0;
3113 }
3114
3115 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
3116
3117 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
3118 DO_OK_FAIL_REQUEST(cmd_save_config);
3119
3120 return 0;
3121}
3122
3123int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003124{
you.chend2fef3f2023-02-13 10:50:35 +08003125 int count, index;
you.chen35020192022-05-06 11:30:57 +08003126 int net_no_list[128];
3127 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003128 RLOGD("enter lynq_get_sta_saved_ap api\n");
3129 if (list == NULL || len == NULL)
3130 {
3131 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08003132 return -1;
3133 }
3134
3135 CHECK_IDX(idx, CTRL_STA);
3136
3137// CHECK_WPA_CTRL(CTRL_STA);
3138
3139 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003140 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08003141
you.chen057aac42023-04-13 14:06:58 +08003142 if (count < 0)
3143 {
3144 RLOGE("list network fail");
3145 return count;
3146 }
3147 else if (count == 0)
3148 {
3149 *list = NULL;
3150 *len = 0;
3151 return 0;
3152 }
3153
you.chen35020192022-05-06 11:30:57 +08003154 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08003155 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08003156 *len = count;
3157
qs.xiong9fbf74e2023-03-28 13:38:22 +08003158 for (index=0; index < count; index++)
3159 {
you.chen35020192022-05-06 11:30:57 +08003160 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
you.chen35020192022-05-06 11:30:57 +08003161 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
you.chen35020192022-05-06 11:30:57 +08003162 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003163 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
you.chen057aac42023-04-13 14:06:58 +08003164 {
you.chen35020192022-05-06 11:30:57 +08003165 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
3166 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003167 else
you.chen057aac42023-04-13 14:06:58 +08003168 {
you.chen35020192022-05-06 11:30:57 +08003169 (*list)[index].base_info.band = -1;
3170 }
you.chen057aac42023-04-13 14:06:58 +08003171 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08003172 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08003173 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003174 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08003175 return 0;
3176}
3177
3178int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
3179{
qs.xiongc8d92a62023-03-29 17:36:14 +08003180 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08003181 const char *lynq_scan_cmd = "SCAN";
3182
3183 CHECK_IDX(idx, CTRL_STA);
3184
3185 CHECK_WPA_CTRL(CTRL_STA);
3186
you.chen70f377f2023-04-14 18:17:09 +08003187// system(clean_last_re); // youchen @ 2023-04-14 temp delete ,next time to fix the orginal bug
you.chen9ac66392022-08-06 17:01:16 +08003188 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08003189 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003190 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
3191 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003192 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003193 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
3194 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003195 g_sta_scan_finish_flag = 1;
3196 return -1;
3197 }
you.chen35020192022-05-06 11:30:57 +08003198
3199 return 0;
3200}
3201
3202int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003203 if (cb == NULL)
3204 {
3205 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003206 return -1;
3207 }
3208
3209 g_ap_callback_priv = priv;
3210 g_ap_callback_func = cb;
3211
3212 return 0;
3213}
3214
3215int lynq_unreg_ap_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003216 if (g_ap_callback_priv == priv)
3217 {
you.chen35020192022-05-06 11:30:57 +08003218 g_ap_callback_func = NULL;
3219 g_ap_callback_priv = NULL;
3220 return 0;
3221 }
3222 return -1;
3223}
3224
3225int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08003226 if (cb == NULL)
3227 {
3228 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003229 return -1;
3230 }
3231
3232 g_sta_callback_priv = priv;
3233 g_sta_callback_func = cb;
3234
3235 return 0;
3236}
3237
3238int lynq_unreg_sta_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003239 if (g_sta_callback_priv == priv)
3240 {
you.chen35020192022-05-06 11:30:57 +08003241 g_sta_callback_func = NULL;
3242 g_sta_callback_priv = NULL;
3243 return 0;
3244 }
3245 return -1;
3246}
3247
3248
3249static int inner_get_status_info_state (int interface, char *state) {
3250 curr_status_info curr_state;
3251 curr_state.ap = NULL;
3252 curr_state.state = state;
3253 return inner_get_status_info(interface, &curr_state);
3254}
3255
3256int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
3257{
3258 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003259 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08003260 CHECK_IDX(idx, CTRL_AP);
3261
qs.xiong9fbf74e2023-03-28 13:38:22 +08003262 if (inner_get_status_info_state(CTRL_AP, state) != 0)
3263 {
you.chen35020192022-05-06 11:30:57 +08003264 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3265 return 0;
3266 }
3267
qs.xiong9fbf74e2023-03-28 13:38:22 +08003268 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3269 {
you.chen35020192022-05-06 11:30:57 +08003270 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
3271 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003272 else
3273 {
you.chen35020192022-05-06 11:30:57 +08003274 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3275 }
3276
3277 return 0;
3278}
3279
3280int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
3281 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003282 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08003283 CHECK_IDX(idx, CTRL_STA);
3284
qs.xiong9fbf74e2023-03-28 13:38:22 +08003285 if (inner_get_status_info_state(CTRL_STA, state) != 0)
3286 {
you.chen35020192022-05-06 11:30:57 +08003287 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3288 return 0;
3289 }
3290
qs.xiong9fbf74e2023-03-28 13:38:22 +08003291 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3292 {
you.chen35020192022-05-06 11:30:57 +08003293 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
3294 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003295 else
3296 {
you.chen35020192022-05-06 11:30:57 +08003297 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3298 }
3299
3300 return 0;
3301}
3302
3303int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
3304// CHECK_IDX(idx, CTRL_AP);
3305// int ret = 0;
3306// size_t reply_len = MAX_RET;
3307// char cmd_reply[MAX_RET]={0};
3308// const char * cmd_str = "GET country";
3309// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
3310// do{
3311// if (NULL == s_lynq_wpa_ctrl) {
3312// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
3313// if (NULL == s_lynq_wpa_ctrl ) {
3314// printf("wpa_ctrl_open fail\n");
3315// return -1;
3316// }
3317// }
3318// }while(0);
3319
3320// do {
3321// reply_len = MAX_RET;
3322// cmd_reply[0] = '\0';
3323// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08003324// 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 +08003325// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003326// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08003327// return ret;
3328// }
3329// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08003330// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08003331// }while(0);
3332
3333 FILE *fp;
3334 size_t i = 0;
3335 char lynq_cmd_ret[MAX_RET]={0};
3336
3337// CHECK_IDX(idx, CTRL_AP);
3338
3339 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003340 {
3341 perror("popen error!");
3342 return -1;
3343 }
you.chen35020192022-05-06 11:30:57 +08003344 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
3345 {
3346 perror("fread fail!");
3347 return -1;
3348 }
3349
qs.xiong9fbf74e2023-03-28 13:38:22 +08003350 for(i=0; i < strlen(lynq_cmd_ret); i++)
3351 {
3352 if (lynq_cmd_ret[i] == ' ')
3353 {
you.chen35020192022-05-06 11:30:57 +08003354 lynq_cmd_ret[i] = '\0';
3355 break;
3356 }
3357 }
3358
3359 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003360 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08003361
3362 int ret=pclose(fp);
3363 if(ret==-1)
3364 {
3365 perror("close file faild");
3366 }
3367
3368 return 0;
3369}
3370
3371int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
3372// const char * cmd_str = "GET country";
3373// CHECK_IDX(idx, CTRL_AP);
3374// CHECK_WPA_CTRL(CTRL_STA);
3375
3376// DO_REQUEST(cmd_str);
3377// printf("result %s\n", cmd_reply);
3378
qs.xiong9fbf74e2023-03-28 13:38:22 +08003379 if (country_code == NULL || *country_code == '\0')
3380 {
3381 RLOGD("bad country code\n");
you.chen35020192022-05-06 11:30:57 +08003382 return -1;
3383 }
3384
3385 char lynq_country_cmd[MAX_CMD];
3386 sprintf(lynq_country_cmd, "wl country %s", country_code);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003387 if (system(lynq_country_cmd) == 0)
3388 {
you.chen35020192022-05-06 11:30:57 +08003389 return 0;
3390 }
3391
3392 return -1;
3393}
3394
3395int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
3396{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003397 RLOGD("enter lynq_get_connect_ap_mac\n");
3398 if (mac == NULL)
3399 {
3400 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08003401 return -1;
3402 }
3403
3404 CHECK_IDX(idx, CTRL_STA);
3405 ap_info_s ap;
3406 ap.ap_mac[0] = '\0';
3407
qs.xiong9fbf74e2023-03-28 13:38:22 +08003408 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3409 {
you.chen35020192022-05-06 11:30:57 +08003410 return -1;
3411 }
3412 strcpy(mac, ap.ap_mac);
3413
3414 return 0;
3415}
3416
3417int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
3418{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003419 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08003420 struct ifaddrs *ifaddr_header, *ifaddr;
3421 struct in_addr * ifa;
3422 const char * ifaName = "wlan0";
3423 if (ip == NULL)
3424 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003425 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08003426 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003427 }
you.chenf58b3c92022-06-21 16:53:48 +08003428
qs.xiong9fbf74e2023-03-28 13:38:22 +08003429 if (idx == 1)
3430 {
you.chen6c2dd9c2022-05-16 17:55:28 +08003431 ifaName = "tether";
you.chen9ac66392022-08-06 17:01:16 +08003432 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003433 else if (idx != 0)
3434 {
you.chen35020192022-05-06 11:30:57 +08003435 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003436 }
you.chen35020192022-05-06 11:30:57 +08003437
you.chen9ac66392022-08-06 17:01:16 +08003438 if (getifaddrs(&ifaddr_header) == -1)
3439 {
you.chen35020192022-05-06 11:30:57 +08003440 perror("getifaddrs");
3441 return -1;
3442 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08003443 }
you.chen35020192022-05-06 11:30:57 +08003444
3445
you.chen9ac66392022-08-06 17:01:16 +08003446 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3447 {
3448 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08003449 continue;
you.chen9ac66392022-08-06 17:01:16 +08003450 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3451 {
3452 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3453 {
3454 // is a valid IP4 Address
3455 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3456 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003457 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08003458 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003459 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08003460 return 0;
3461 }
3462 }
3463 }
qs.xiongc4f007c2023-02-08 18:16:58 +08003464 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003465 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08003466 return -1;
you.chen35020192022-05-06 11:30:57 +08003467}
3468
3469int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3470{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003471 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08003472 int count;
3473 size_t i;
3474 char *split_words[128] = {0};
3475 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3476
3477 CHECK_WPA_CTRL(idx);
3478
3479 DO_REQUEST(lynq_get_mac_cmd);
3480
qs.xiong9fbf74e2023-03-28 13:38:22 +08003481 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3482 {
3483 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08003484 return -1;
3485 }
3486
3487 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3488
qs.xiong9fbf74e2023-03-28 13:38:22 +08003489 if (count < 2)
3490 {
you.chen35020192022-05-06 11:30:57 +08003491 return -1;
3492 }
3493
qs.xiong9fbf74e2023-03-28 13:38:22 +08003494 for (i=0; i < strlen(split_words[1]); i++ )
3495 {
3496 if (split_words[1][i] != ' ')
3497 {
you.chen35020192022-05-06 11:30:57 +08003498 break;
3499 }
3500 }
3501
3502 strcpy(mac, split_words[1] + i);
3503
3504 return 0;
3505}
3506
3507int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3508{
3509// int count;
3510// char *split_words[128] = {0};
3511// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3512
3513// if (rssi == NULL) {
3514// return -1;
3515// }
3516
3517// CHECK_IDX(idx, CTRL_STA);
3518
3519// CHECK_WPA_CTRL(CTRL_STA);
3520
3521// DO_REQUEST(lynq_get_rssi_cmd);
3522
3523// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3524// return -1;
3525// }
3526
3527// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3528
3529// if (count < 2) {
3530// return -1;
3531// }
3532
3533// *rssi = atoi(split_words[1]) * -1;
3534
you.chen35020192022-05-06 11:30:57 +08003535 char lynq_cmd_ret[MAX_RET]={0};
3536
qs.xiongff0ae0f2022-10-11 15:47:14 +08003537/*******change other cmd to get rssi*******
3538 *
3539 *wl rssi ---> wl -i wlan0 rssi
3540 *
3541 ***** change by qs.xiong 20221011*******/
you.chen23c4a5f2023-04-12 16:46:00 +08003542 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiong9fbf74e2023-03-28 13:38:22 +08003543 {
you.chen23c4a5f2023-04-12 16:46:00 +08003544 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen35020192022-05-06 11:30:57 +08003545 return -1;
3546 }
you.chen9f17e4d2022-06-06 17:18:18 +08003547 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003548/****** if got rssi is 0,means sta didn't connected any device****/
3549 if(*rssi == 0)
3550 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003551 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chen23c4a5f2023-04-12 16:46:00 +08003552 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003553 }
you.chen35020192022-05-06 11:30:57 +08003554
3555 return 0;
3556}
3557
3558int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3559{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003560 RLOGD("enter lynq_get_connect_ap_band\n");
3561 if (band == NULL)
3562 {
you.chen35020192022-05-06 11:30:57 +08003563 return -1;
3564 }
3565
3566 CHECK_IDX(idx, CTRL_STA);
3567 ap_info_s ap;
3568 ap.band = -1;
3569
qs.xiong9fbf74e2023-03-28 13:38:22 +08003570 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3571 {
you.chen35020192022-05-06 11:30:57 +08003572 return -1;
3573 }
3574 *band = ap.band;
3575
3576 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003577}
you.chenf58b3c92022-06-21 16:53:48 +08003578
3579int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3580{
qs.xionge4cbf1c2023-02-28 18:22:49 +08003581 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003582
3583 if (ip == NULL)
3584 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003585 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003586 return -1;
3587 }
3588
3589 CHECK_IDX(idx, CTRL_STA);
3590
qs.xionge4cbf1c2023-02-28 18:22:49 +08003591 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003592 {
3593 return -1;
3594 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003595
3596 return inner_get_ip_by_mac(bssid, ip, 32); //better input by user
you.chenf58b3c92022-06-21 16:53:48 +08003597}
3598
qs.xiong026c5c72022-10-17 11:15:45 +08003599int lynq_ap_connect_num(int sta_number)
3600{
3601 char lynq_limit_cmd[32]={0};
3602 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003603 if((sta_number < 1 ) && (sta_number > 15))
3604 {
3605 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003606 return -1;
3607 }
3608 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3609 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003610 if(ret != 0)
3611 {
3612 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003613 }
3614 return 0;
3615}
you.chenf58b3c92022-06-21 16:53:48 +08003616
qs.xiong77905552022-10-17 11:19:57 +08003617int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3618{
3619
3620 char lynq_wifi_acs_cmd[128]={0};
3621 char lynq_cmd_mode[128]={0};
3622 char lynq_cmd_slect[128]={0};
3623
qs.xiong9fbf74e2023-03-28 13:38:22 +08003624 if((acs_mode != 2) && (acs_mode != 5))
3625 {
qs.xiong77905552022-10-17 11:19:57 +08003626 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3627 }
3628
qs.xiong9fbf74e2023-03-28 13:38:22 +08003629 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3630 {
qs.xiong77905552022-10-17 11:19:57 +08003631 return -1;
3632 }
3633
3634 CHECK_IDX(idx, CTRL_AP);
3635
3636 CHECK_WPA_CTRL(CTRL_AP);
3637
3638 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3639 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3640 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3641
3642 DO_OK_FAIL_REQUEST(cmd_disconnect);
3643 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3644 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3645 DO_OK_FAIL_REQUEST(cmd_save_config);
3646 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3647
3648 return 0;
3649}
you.chen0f5c6432022-11-07 18:31:14 +08003650//you.chen add for tv-box start
3651static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3652 FILE *fp;
3653 //printf("to exec cmd:%s\n", str_cmd);
3654 if((fp=popen(str_cmd,"r"))==NULL)
3655 {
3656 perror("popen error!");
3657 return -1;
3658 }
3659 if((fread(str_cmd_ret,max_len,1,fp))<0)
3660 {
3661 perror("fread fail!");
3662 fclose(fp);
3663 return -1;
3664 }
3665 fclose(fp);
3666 return 0;
3667}
3668
3669static int get_netmask_length(const char* mask)
3670{
3671 int masklen=0, i=0;
3672 int netmask=0;
3673
3674 if(mask == NULL)
3675 {
3676 return 0;
3677 }
3678
3679 struct in_addr ip_addr;
3680 if( inet_aton(mask, &ip_addr) )
3681 {
3682 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003683 }else
3684 {
you.chen0f5c6432022-11-07 18:31:14 +08003685 netmask = 0;
3686 return 0;
3687 }
3688
3689 while(0 == (netmask & 0x01) && i<32)
3690 {
3691 i++;
3692 netmask = netmask>>1;
3693 }
3694 masklen = 32-i;
3695 return masklen;
3696}
3697
3698static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3699 int mask_len;
3700 char *p;
3701 char tmp[64] = {0};
3702 if (exec_cmd("ifconfig tether | grep Mask", str_cmd_ret, max_len) != 0)
3703 return -1;
3704 p = strstr(str_cmd_ret, "Mask:");
3705 if (p == NULL)
3706 return -1;
3707 mask_len = get_netmask_length(p + 5);
3708 if (mask_len == 0)
3709 return -1;
3710 p = strstr(str_cmd_ret, "inet addr:");
3711 if (p == NULL)
3712 return -1;
3713 strcpy(tmp, p + 10);
3714 p = strstr(tmp, " ");
3715 if (p != NULL)
3716 *p = '\0';
3717 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
3718 return 0;
3719}
3720
3721static void GBWWatchThreadProc() {
3722 int i,n, nloop, nmax, ncheckcount, nidlecount;
3723 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
3724 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
3725 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
3726 char *results[16] = {0};
3727 char str_cmd[256] = {0};
3728 char str_cmd_ret[128] = {0};
3729 char dest_ip[32] = {0};
3730 lastAP1Bytes = lastAP2Bytes = 0;
3731 lastAP1Drop = lastAP2Drop = 0;
3732 lastAP1Speed = lastAP2Speed = 0;
3733 setAP1Speed = 50;
3734 setAP2Speed = 80;
3735 nloop = 0;
3736 nmax = 6;
3737 ncheckcount = nidlecount = 0;
3738
qs.xiong9fbf74e2023-03-28 13:38:22 +08003739 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08003740 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
3741 while (dest_ip[0] == '\0') {
3742 sleep(1);
3743 str_cmd_ret[0] = '\0';
3744 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
3745 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
3746 if (str_cmd_ret[n] == '\n'){
3747 str_cmd_ret[n] = '\0';
3748 break;
3749 }
3750 }
3751 if (str_cmd_ret[0] != '\0')
3752 {
3753 strcpy(dest_ip, str_cmd_ret);
3754 }
3755 }
3756
3757 system("tc qdisc del dev tether root > /dev/null 2>&1");
3758 system("tc qdisc add dev tether root handle 1: htb r2q 1");
3759 system("tc class add dev tether parent 1: classid 1:1 htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000");
3760 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
3761 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003762 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08003763 return;
3764 }
3765 sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 16 u32 match ip dst %s flowid 1:1", str_cmd_ret);
3766 system(str_cmd);
3767 system("tc class add dev tether parent 1: classid 1:2 htb rate 80Mbit ceil 100Mbit prio 0 quantum 3000000");
3768 sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", dest_ip);
3769 //printf("----cmd:%s\n", str_cmd);
3770 system(str_cmd);
3771
3772 while (1) {
3773 sleep(1);
3774 memset(str_cmd, 0, sizeof(str_cmd));
3775 if (0 != exec_cmd("tc -s class show dev tether classid 1:1 | grep Sent", str_cmd, sizeof (str_cmd)))
3776 continue;
3777 //printf("ap1 --- %s\n", str_cmd);
3778 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3779 if (n > 9) {
3780 if (strcmp(results[1], "Sent") == 0) {
3781 currAP1Bytes = atoll(results[2]);
3782 }
3783 if (strcmp(results[6], "(dropped") == 0) {
3784 currAP1Drop = atoi(results[7]);
3785 }
3786 }
3787
3788 memset(str_cmd, 0, sizeof(str_cmd));
3789 if (0 != exec_cmd("tc -s class show dev tether classid 1:2 | grep Sent", str_cmd, sizeof (str_cmd)))
3790 continue;
3791 //printf("ap2 --- %s\n", str_cmd);
3792 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3793 if (n > 9) {
3794 if (strcmp(results[1], "Sent") == 0) {
3795 currAP2Bytes = atoll(results[2]);
3796 }
3797 if (strcmp(results[6], "(dropped") == 0) {
3798 currAP2Drop = atoi(results[7]);
3799 }
3800 }
3801
3802 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
3803 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
3804 lastAP1Bytes = currAP1Bytes;
3805 lastAP2Bytes = currAP2Bytes;
3806 continue;
3807 }
3808
3809 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
3810 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
3811 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
3812 lastAP1Speed = currAP1Speed;
3813 lastAP2Speed = currAP2Speed;
3814 lastAP1Bytes = currAP1Bytes;
3815 lastAP2Bytes = currAP2Bytes;
3816
3817 currSetAP1Speed = setAP1Speed;
3818 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
3819 ncheckcount++;
3820 if (ncheckcount > 3) {
3821 ncheckcount = 0;
3822 currSetAP1Speed = 5;
3823 }
3824 }
3825 else {
3826 ncheckcount = 0;
3827 if (currAP1Speed < 5)
3828 nidlecount++;
3829 else
3830 nidlecount = 0;
3831
3832 }
3833
3834 if (nidlecount > 60 ){
3835 currSetAP1Speed = 50;
3836 }
3837
3838 if (currSetAP1Speed != setAP1Speed) {
3839 setAP1Speed = currSetAP1Speed;
3840 sprintf(str_cmd, "tc class replace dev tether parent 1: classid 1:1 htb rate %dMbit ceil %dMbit prio 2 quantum 3000", setAP1Speed, (int)(setAP1Speed*1.4));
3841 //printf("------***change speed: %s\n", str_cmd);
3842 system(str_cmd);
3843 }
3844 }
3845}
3846
3847int enableGBW(const char* mac) {
3848 int i,len;
3849 char get_ipaddr_cmd[128]={0};
3850 ap_info_s *ap;
3851 device_info_s * list;
3852
3853 if (mac == NULL || g_gbw_enabled == 1)
3854 return -1;
3855 len = strlen(mac);
3856 g_gbw_mac = malloc(len + 1);
3857 for(i=0;i<len;i++) {
3858 if (mac[i] >= 'A' && mac[i] <= 'Z')
3859 {
3860 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
3861 }
3862 else
3863 g_gbw_mac[i] = mac[i];
3864 }
3865 g_gbw_mac[i] = '\0';
3866 g_gbw_enabled = 1;
3867
3868 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
3869 if (system(get_ipaddr_cmd) == 0) {
3870 //startGBW();
3871 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
3872 for (i=0;i<len;i++) {
3873 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
3874 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
3875 startGBW();
3876 }
3877 free(ap);
3878 free(list);
3879 }
3880 }
3881 return 0;
3882}
3883
3884int disableGBW() {
3885 stopGBW();
3886 free(g_gbw_mac);
3887 g_gbw_mac = NULL;
3888 g_gbw_enabled = 1;
3889 return 0;
3890}
3891
3892static int startGBW() {
3893 if (g_gbw_watcher_pid != 0) {
3894 stopGBW();
3895 }
3896 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
3897}
3898
3899static int stopGBW() {
3900 void* retval;
3901 pthread_cancel(g_gbw_watcher_pid);
3902 pthread_join(g_gbw_watcher_pid, &retval);
3903 g_gbw_watcher_pid = 0;
3904 system("tc qdisc del dev tether root");
3905}
3906//you.chen add for tv-box end