blob: 5ee8afc2d1194790fcc3f65d9046c8ba99ba7154 [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 }
you.chen35020192022-05-06 11:30:57 +0800830
you.chen70f377f2023-04-14 18:17:09 +0800831 if (g_global_watcher_pid == 0 ) // this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
832 {
833 ret=pthread_create(&g_global_watcher_pid,NULL,GlobalWatcherThreadProc,NULL);
834 if(ret<0)
835 {
836 RLOGE("[wifi error]creat GlobalWatcherThreadProc fail");
837 ret = -1;
838 goto out_enable;
839 }
840 }
841
you.chend2fef3f2023-02-13 10:50:35 +0800842 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
843 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
844 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
845 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
846out_enable:
847 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800848 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500849}
850
qs.xiong1af5daf2022-03-14 09:12:12 -0400851int lynq_wifi_disable(void)
852{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800853 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800854 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800855 g_ap_watcher_stop_flag = 1;
856 g_sta_watcher_stop_flag = 1;
857 if (g_ap_watcher_pid != 0)
858 pthread_join(g_ap_watcher_pid, NULL);
859 if (g_sta_watcher_pid != 0)
860 pthread_join(g_sta_watcher_pid, NULL);
861 if (g_lynq_wpa_ctrl[0] != NULL)
862 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
863 if (g_lynq_wpa_ctrl[1] != NULL)
864 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
865 g_ap_watcher_pid = 0;
866 g_sta_watcher_pid = 0;
867 g_lynq_wpa_ctrl[0] = NULL;
868 g_lynq_wpa_ctrl[1] = NULL;
869 system("systemctl stop wg870_drv_insmod.service");
you.chend2fef3f2023-02-13 10:50:35 +0800870 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
871 return 0;
872}
873
874static inline char inner_convert_char(char in)
875{
876 if (in >= '0' && in <= '9')
877 {
878 return in - '0';
879 }
880 else if (in >= 'a' && in <= 'f')
881 {
882 return in - 'a' + 10;
883 }
884 else if (in >= 'A' && in <= 'F')
885 {
886 return in - 'A' + 10;
887 }
888 else
889 {
890 return '\xff';
891 }
892}
893
894static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
895{
896 char *p;
897 size_t pos = 0;
898 if (NULL == out_ssid)
899 return;
900 //printf("input ssid=[%s]\n", ssid);
901 memset(out_ssid, 0, out_ssid_len);
902 if (NULL == ssid)
903 return;
904 p = strchr(ssid, '\\');
905 if (NULL == p)
906 {
907 strncpy(out_ssid, ssid, out_ssid_len);
908 //printf(" first %s\n", out_ssid);
909 }
910 else
911 {
912 pos = p - ssid;
913 memcpy(out_ssid, ssid, pos);
914 //printf("pos %lu -- %s\n", pos, out_ssid);
915 for(; pos < out_ssid_len; pos ++)
916 {
917 if (p[0] == '\0')
918 {
919 //printf(" out %s\n", out_ssid);
920 return;
921 }
922 else if (p[0] != '\\')
923 {
924 out_ssid[pos] = p[0];
925 p += 1;
926 }
927 else if (p[1] == 'x' || p[1] == 'X')
928 {
929 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
930 p += 4;
931 }
932 else if (p[1] == '\\')
933 {
934 out_ssid[pos] = '\\';
935 p += 2;
936 }
937 else if (p[1] == 't')
938 {
939 out_ssid[pos] = '\t';
940 p += 2;
941 }
942 else if (p[1] == 'r')
943 {
944 out_ssid[pos] = '\r';
945 p += 2;
946 }
947 else if (p[1] == 'n')
948 {
949 out_ssid[pos] = '\n';
950 p += 2;
951 }//todo find a better way to convert?
952 }
953 }
954 //printf(" out %s\n", out_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -0500955}
qs.xiong1af5daf2022-03-14 09:12:12 -0400956
you.chen35020192022-05-06 11:30:57 +0800957static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +0800958 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +0800959 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +0800960 RLOGD("enter inner_get_param");
961 if (out_put == NULL)
962 {
963 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +0800964 return -1;
965 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800966 if (param_name == NULL)
967 {
968 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +0800969 return -1;
970 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800971 if (param_name[0] == '\0')
972 {
973 RLOGE("param is empty");
you.chen35020192022-05-06 11:30:57 +0800974 return -1;
975 }
976
977 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
978
979 CHECK_WPA_CTRL(interface);
980
981 DO_REQUEST(lynq_cmd_get);
982
qs.xiong9fbf74e2023-03-28 13:38:22 +0800983 if (memcmp(cmd_reply, "FAIL", 4) == 0)
984 {
985 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +0800986 return -1;
987 }
988
you.chena6fa5b22022-05-18 10:28:19 +0800989// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +0800990 if (strcmp(param_name, "ssid") == 0)
991 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800992 if (cmd_reply[0] == '\"')
993 {
you.chend2fef3f2023-02-13 10:50:35 +0800994 ssid_len = reply_len - 1;
995 memcpy(out_put, cmd_reply + 1, ssid_len);
996 if (out_put[ssid_len-1] == '\"')
997 {
998 out_put[ssid_len-1] = '\0';
999 }
1000 else
1001 {
1002 out_put[ssid_len] = '\0';
1003 }
1004 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001005 else
1006 {
you.chend2fef3f2023-02-13 10:50:35 +08001007 ssid_len = reply_len / 2;
1008 for(i=0; i<ssid_len; i++)
1009 {
1010 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
1011 }
1012 out_put[ssid_len] = '\0';
1013 }
1014 }
1015 else
1016 {
1017 memcpy(out_put, cmd_reply, reply_len + 1);
1018 }
you.chen35020192022-05-06 11:30:57 +08001019 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001020}
qs.xiong1af5daf2022-03-14 09:12:12 -04001021
you.chen35020192022-05-06 11:30:57 +08001022static int lynq_split(char * str, int len, char delimiter, char * results[]) {
1023 int ret = 0;
1024 char * end = str + len - 1;
1025 results[ret++] = str;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001026 while(str < end)
1027 {
1028 if (*str == delimiter)
1029 {
you.chen35020192022-05-06 11:30:57 +08001030 *str++ = '\0';
1031 results[ret++] = str;
1032 continue;
1033 }
1034 str++;
1035 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001036 if (*str == delimiter)
1037 {
you.chen35020192022-05-06 11:30:57 +08001038 *str = '\0';
1039 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001040
you.chen35020192022-05-06 11:30:57 +08001041 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001042}
1043
you.chend2fef3f2023-02-13 10:50:35 +08001044static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
1045{
1046 char * p;
1047 int ret = 0;
1048 char cmd[256]={0};
1049 if (NULL == mac || NULL == ip)
you.chen35020192022-05-06 11:30:57 +08001050 return -1;
you.chend2fef3f2023-02-13 10:50:35 +08001051 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +08001052 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-02-13 10:50:35 +08001053 ret = exec_cmd(cmd, ip, ip_len);
1054 p = strchr(ip, '\n');
1055 if (NULL != p)
1056 {
1057 *p = '\0';
you.chen35020192022-05-06 11:30:57 +08001058 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001059 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +08001060 return ret;
1061}
1062
you.chend2fef3f2023-02-13 10:50:35 +08001063static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +08001064 struct in_addr addr ={0};
1065 struct hostent *ht;
1066
qs.xiong9fbf74e2023-03-28 13:38:22 +08001067 if (ip == NULL || *ip == '\0' || hostname == NULL)
1068 {
1069 RLOGE("ip == NULL or hostname == NULL");
1070 return -1;
you.chen35020192022-05-06 11:30:57 +08001071 }
1072
you.chend2fef3f2023-02-13 10:50:35 +08001073 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08001074 if (inet_aton(ip, &addr) == 0)
1075 {
you.chen35020192022-05-06 11:30:57 +08001076 printf("---inet_aton fail\n");
1077 return -1;
1078 }
1079
1080 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
1081
qs.xiong9fbf74e2023-03-28 13:38:22 +08001082 if (ht == NULL)
1083 {
1084 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-05-06 11:30:57 +08001085 herror(NULL);
1086 return -1;
1087 }
1088
1089 strcpy(hostname, ht->h_name);
1090
1091 return 0;
1092}
1093
1094static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
1095{
1096 int count, index, words_count;
1097 char * split_lines[128]= {0};
1098 char * split_words[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08001099 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +08001100 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001101 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-05-06 11:30:57 +08001102
1103 CHECK_WPA_CTRL(ap_sta);
1104
1105 DO_REQUEST(lynq_wifi_list_networks);
1106
1107 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1108
1109 //@todo check ssid field to compatible
1110
1111 ret = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001112 for(index=1; index < count; index++)
1113 {
you.chen35020192022-05-06 11:30:57 +08001114 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001115 if (words_count > 2)
1116 {
you.chend2fef3f2023-02-13 10:50:35 +08001117 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001118 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
1119 {
you.chen35020192022-05-06 11:30:57 +08001120 net_no_list[ret++] = atoi(split_words[0]);
1121 }
1122 }
1123 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001124 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +08001125 return ret;
1126}
1127
1128static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001129 size_t i=0;
you.chen35020192022-05-06 11:30:57 +08001130 CHECK_WPA_CTRL(ap_sta);
1131 const char *lynq_wifi_add_network = "ADD_NETWORK";
1132
qs.xiong9fbf74e2023-03-28 13:38:22 +08001133 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +08001134 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001135 if (memcmp(cmd_reply, "FAIL", 4) == 0)
1136 {
1137 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen35020192022-05-06 11:30:57 +08001138 return -1;
1139 }
1140
qs.xiong9fbf74e2023-03-28 13:38:22 +08001141 for(i=0;i<reply_len;i++)
1142 {
1143 if(cmd_reply[i] == '\n')
1144 {
you.chen35020192022-05-06 11:30:57 +08001145 cmd_reply[i] = '\0';
1146 break;
1147 }
1148 }
1149 return atoi(cmd_reply);
1150}
you.chena6cd55a2022-05-08 12:20:18 +08001151
you.chen35020192022-05-06 11:30:57 +08001152static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
1153{
1154 int count, index;
1155 int net_no_list[128];
1156
qs.xiong9fbf74e2023-03-28 13:38:22 +08001157 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +08001158 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001159 for (index=0; index < count; index++)
1160 {
1161 if (net_no_list[index] == net_no)
1162 {
you.chen35020192022-05-06 11:30:57 +08001163 return 0;
1164 }
1165 }
1166
1167 if (count >= 1)
1168 index = net_no_list[count - 1];
1169 else
1170 index = -1;
1171
qs.xiong9fbf74e2023-03-28 13:38:22 +08001172 while (index < net_no )
1173 {
you.chen35020192022-05-06 11:30:57 +08001174 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001175 if (index >= net_no)
1176 { // required network no created
1177 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +08001178 return 0;
1179 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001180 else if( index < 0)
1181 {
1182 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +08001183 return -1;
1184 }
you.chen35020192022-05-06 11:30:57 +08001185 }
1186
1187 if (index < 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001188 {
1189 RLOGE("[lynq_check_network_number] network index < 0");
1190 return -1;
1191 }
1192 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen35020192022-05-06 11:30:57 +08001193 return 0;
1194}
1195
1196static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +08001197 if (freq > 5000 && freq < 6000)
1198 {
you.chen35020192022-05-06 11:30:57 +08001199 return LYNQ_WIFI_5G_band;
1200 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001201 else if (freq > 2000 && freq < 3000)
1202 {
you.chen35020192022-05-06 11:30:57 +08001203 return LYNQ_WIFI_2G_band;
1204 }
1205 return LYNQ_WIFI_2_and_5G_band;
1206}
1207
1208static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001209 if (key_mgmt != NULL)
1210 {
1211 if (memcmp( key_mgmt, "NONE", 4) == 0)
1212 {
you.chen35020192022-05-06 11:30:57 +08001213 return LYNQ_WIFI_AUTH_OPEN;
1214 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001215 else if (memcmp( key_mgmt, "WEP", 3) == 0)
1216 {
you.chen35020192022-05-06 11:30:57 +08001217 return LYNQ_WIFI_AUTH_WEP;
1218 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001219 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
1220 {
you.chen35020192022-05-06 11:30:57 +08001221 return LYNQ_WIFI_AUTH_WPA_PSK;
1222 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001223 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
1224 {
you.chen35020192022-05-06 11:30:57 +08001225 return LYNQ_WIFI_AUTH_WPA2_PSK;
1226 }
1227 }
1228
1229 return -1;
1230}
1231
1232static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001233 if (flag != NULL)
1234 {
qs.xiong3e506812023-04-06 11:08:48 +08001235 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
1236 {
1237 return LYNQ_WIFI_AUTH_WPA3_PSK;
1238 }else if ( strstr( flag,"SAE-CCMP") != NULL )
1239 {
1240 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
1241 }else if (strstr( flag, "WPA2-PSK") != NULL)
1242 {
you.chen35020192022-05-06 11:30:57 +08001243 return LYNQ_WIFI_AUTH_WPA2_PSK;
1244 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001245 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001246 {
you.chen35020192022-05-06 11:30:57 +08001247 return LYNQ_WIFI_AUTH_WPA_PSK;
1248 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001249 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001250 {
you.chen35020192022-05-06 11:30:57 +08001251 return LYNQ_WIFI_AUTH_WEP;
1252 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001253 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001254 {
you.chen35020192022-05-06 11:30:57 +08001255 return LYNQ_WIFI_AUTH_OPEN;
1256 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001257 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +08001258 {
you.chend2fef3f2023-02-13 10:50:35 +08001259 return LYNQ_WIFI_AUTH_OPEN;
1260 }
you.chen35020192022-05-06 11:30:57 +08001261 }
1262
1263 return -1;
1264}
1265
1266static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
1267 switch (bw) {
1268 case 10:
1269 return LYNQ_WIFI_BANDWIDTH_HT10;
1270 break;
1271 case 20:
1272 return LYNQ_WIFI_BANDWIDTH_HT20;
1273 break;
1274 case 40:
1275 return LYNQ_WIFI_BANDWIDTH_HT40;
1276 break;
1277 case 80:
1278 return LYNQ_WIFI_BANDWIDTH_HT80;
1279 break;
1280 default:
1281 break;
1282 }
1283
1284 return -1;
1285}
1286
you.chen70f377f2023-04-14 18:17:09 +08001287static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth);
you.chen35020192022-05-06 11:30:57 +08001288static int inner_get_status_info(int interface, curr_status_info *curr_state) {
1289 int i, count;
1290 char *p;
1291 const char *lynq_status_cmd = "STATUS";
1292 const char * FLAG_SSID = "ssid=";
1293 const char * FLAG_SBSID = "bssid=";
1294 const char * FLAG_KEY_MGMT = "key_mgmt=";
1295 const char * FLAG_FREQ = "freq=";
1296 const char * FLAG_STATE = "wpa_state=";
1297 const char * FLAG_ID = "id=";
you.chend2fef3f2023-02-13 10:50:35 +08001298 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +08001299 char *split_lines[128] = {0};
1300
1301 CHECK_WPA_CTRL(interface);
1302
qs.xiong9fbf74e2023-03-28 13:38:22 +08001303 if (curr_state == NULL)
1304 {
1305 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-05-06 11:30:57 +08001306 return -1;
1307 }
1308
1309 DO_REQUEST(lynq_status_cmd);
1310
1311 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1312
1313 curr_state->net_no = -1;
1314 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001315 for(i=0; i < count; i++)
1316 {
1317 if (curr_state->ap != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001318 {
you.chen35020192022-05-06 11:30:57 +08001319 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001320 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001321 {
you.chend2fef3f2023-02-13 10:50:35 +08001322 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +08001323 ret = 0;
1324 continue;
1325 }
you.chenf58b3c92022-06-21 16:53:48 +08001326 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001327 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001328 {
you.chend2fef3f2023-02-13 10:50:35 +08001329 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 +08001330 ret = 0;
1331 continue;
1332 }
you.chen35020192022-05-06 11:30:57 +08001333 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001334 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001335 {
you.chen450d0172022-07-15 17:56:48 +08001336 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001337 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +08001338 ret = 0;
1339 continue;
1340 }
1341 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001342 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001343 {
you.chen35020192022-05-06 11:30:57 +08001344 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1345 ret = 0;
1346 continue;
1347 }
you.chend2fef3f2023-02-13 10:50:35 +08001348 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001349 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001350 {
you.chend2fef3f2023-02-13 10:50:35 +08001351 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1352 ret = 0;
1353 continue;
1354 }
you.chen35020192022-05-06 11:30:57 +08001355 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001356 if (curr_state->state != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001357 {
you.chen35020192022-05-06 11:30:57 +08001358 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001359 if (p != NULL)
you.chen70f377f2023-04-14 18:17:09 +08001360 {
you.chen35020192022-05-06 11:30:57 +08001361 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1362 ret = 0;
1363 continue;
1364 }
1365
1366 } //end else if (state != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001367 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
you.chen70f377f2023-04-14 18:17:09 +08001368 {
you.chen35020192022-05-06 11:30:57 +08001369 ret = 0;
you.chen450d0172022-07-15 17:56:48 +08001370 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001371 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +08001372 }
1373 }
1374
you.chen70f377f2023-04-14 18:17:09 +08001375 if (ret == 0 && curr_state->ap != NULL && curr_state->net_no >= 0) // auth may not right when add wpa3
1376 {
1377 inner_get_network_auth(interface, curr_state->net_no, &curr_state->ap->auth);
1378 }
1379
you.chen35020192022-05-06 11:30:57 +08001380 return ret;
1381}
1382
qs.xiongf1b525b2022-03-31 00:58:23 -04001383int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001384{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001385 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +08001386 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -05001387
qs.xiong9fbf74e2023-03-28 13:38:22 +08001388 if (ap_ssid == NULL)
1389 {
1390 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +08001391 return -1;
1392 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001393 else
1394 {
1395 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen35020192022-05-06 11:30:57 +08001396 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001397
qs.xiong9fbf74e2023-03-28 13:38:22 +08001398 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1399 {
1400 RLOGE("Do check ap network_number fail");
you.chen35020192022-05-06 11:30:57 +08001401 return -1;
1402 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001403
you.chen35020192022-05-06 11:30:57 +08001404 CHECK_IDX(idx, CTRL_AP);
1405
1406 CHECK_WPA_CTRL(CTRL_AP);
1407
1408 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1409
1410 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1411 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001412 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1413 return 0;
you.chen35020192022-05-06 11:30:57 +08001414
qs.xiong7a105ce2022-03-02 09:43:11 -05001415}
1416
you.chen35020192022-05-06 11:30:57 +08001417int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001418{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001419 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001420 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001421 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001422}
1423
qs.xiongc9c79f72022-10-17 15:27:18 +08001424/*****
1425 *frequency <------>channel
1426 *
1427 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1428 *
1429 *
1430 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1431 *
1432 *
1433 * */
1434static int lynq_check_set_frequency(int input_frequency){
qs.xiongc00b6032022-11-29 16:28:03 +08001435 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};
1436 int i;
1437 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1438
qs.xiong69a332b2022-12-02 09:58:57 +08001439 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001440 {
1441 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001442 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001443 }
qs.xiongc00b6032022-11-29 16:28:03 +08001444
1445 if(i == arr_len)
1446 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001447 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001448 return -1;
1449 }
qs.xiongc00b6032022-11-29 16:28:03 +08001450
qs.xiongc9c79f72022-10-17 15:27:18 +08001451 return 0;
1452}
qs.xiong13673462023-02-21 19:12:54 +08001453
1454static int lynq_check_frequencyby_country_code(int input_frequency)
1455{
1456 char str_cnc[]="CN";
1457 char str_dest[20]="";
1458
1459 if( lynq_get_country_code(1,str_dest) != 0 )
1460 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001461 RLOGE("get country_code error\n");
qs.xiong13673462023-02-21 19:12:54 +08001462 return -1;
1463 }
1464 if( strncmp(str_dest,str_cnc,2) != 0 )
1465 {
1466 return 0;
1467 }else if( 2473 < input_frequency && input_frequency < 5744)
1468 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001469 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001470 return -1;
1471 }
1472 return 0;
1473}
qs.xiongf1b525b2022-03-31 00:58:23 -04001474int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001475{
qs.xiongc00b6032022-11-29 16:28:03 +08001476 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001477 char lynq_wifi_frequency_cmd[128]={0};
1478 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001479 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001480 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001481 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001482 check = lynq_check_set_frequency(lynq_wifi_frequency);
1483 if(check != 0)
1484 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001485 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001486 return -1;
you.chen35020192022-05-06 11:30:57 +08001487 }
qs.xiong13673462023-02-21 19:12:54 +08001488 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1489 if(check != 0)
1490 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001491 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001492 return -1;
1493 }
1494
qs.xiongc00b6032022-11-29 16:28:03 +08001495 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1496 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001497 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001498 return -1;
1499 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001500
you.chen35020192022-05-06 11:30:57 +08001501 CHECK_IDX(idx, CTRL_AP);
1502
1503 CHECK_WPA_CTRL(CTRL_AP);
1504
1505 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1506 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1507 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1508
you.chen6c2dd9c2022-05-16 17:55:28 +08001509 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-05-06 11:30:57 +08001510 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1511 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1512 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001513
qs.xiong9fbf74e2023-03-28 13:38:22 +08001514 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001515}
1516
qs.xiongf1b525b2022-03-31 00:58:23 -04001517int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001518{
you.chen35020192022-05-06 11:30:57 +08001519 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001520 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001521 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001522
qs.xiong9fbf74e2023-03-28 13:38:22 +08001523 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1524 {
1525 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen35020192022-05-06 11:30:57 +08001526 return -1;
1527 }
1528 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001529
qs.xiong9fbf74e2023-03-28 13:38:22 +08001530 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001531}
1532
qs.xiongf1b525b2022-03-31 00:58:23 -04001533int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1534{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001535 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001536 CHECK_IDX(idx, CTRL_AP);
1537 switch(bandwidth){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001538 case LYNQ_WIFI_BANDWIDTH_HT10:
1539 {
1540 RLOGE("bandwith [%d] not support now\n", bandwidth);
1541 return -1;
1542 }
1543 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen35020192022-05-06 11:30:57 +08001544 {
1545 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1546 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001547 if (system(lynq_cmd_bandwith) != 0 )
1548 {
1549 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001550 return -1;
1551 }
1552 system("wl up");
1553 break;
1554 }
1555 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001556 {
qs.xiong10379192023-02-21 13:19:42 +08001557 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001558 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1559 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001560 if (system(lynq_cmd_bandwith) != 0 )
1561 {
1562 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001563 return -1;
1564 }
1565 system("wl up");
1566 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001567 }
you.chen35020192022-05-06 11:30:57 +08001568 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001569 {
qs.xiong10379192023-02-21 13:19:42 +08001570 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001571 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001572 if (system(lynq_cmd_bandwith) != 0 )
1573 {
1574 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001575 return -1;
1576 }
1577 system("wl up");
1578 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001579 }
1580 default:
you.chen35020192022-05-06 11:30:57 +08001581 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001582 RLOGE("auth type [%d] not support now\n", bandwidth);
1583 return -1;
you.chen35020192022-05-06 11:30:57 +08001584 }
1585 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001586
1587
you.chen35020192022-05-06 11:30:57 +08001588 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001589}
you.chen35020192022-05-06 11:30:57 +08001590
qs.xiongf1b525b2022-03-31 00:58:23 -04001591int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1592{
you.chen35020192022-05-06 11:30:57 +08001593 int count = 0;
1594 int index = 0;
1595 char *split_words[128] = {0};
1596 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001597 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001598 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001599
you.chen35020192022-05-06 11:30:57 +08001600 CHECK_WPA_CTRL(CTRL_AP);
1601
1602 DO_REQUEST(lynq_chanspec_cmd);
1603
1604 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1605 for(;index < count; index++) {
1606 if (strncmp(split_words[index], "bw", 2) != 0) {
1607 continue;
1608 }
1609
1610 index++;
1611 if (index >= count) {
1612 return -1;
1613 }
1614
qs.xiong9fbf74e2023-03-28 13:38:22 +08001615 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001616 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1617 return 0;
1618 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001619 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001620 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001621}
qs.xiong0fb469a2022-04-14 03:50:45 -04001622
qs.xiongf1b525b2022-03-31 00:58:23 -04001623int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001624{
you.chen35020192022-05-06 11:30:57 +08001625 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001626 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001627 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001628
you.chen35020192022-05-06 11:30:57 +08001629 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001630
qs.xiong9fbf74e2023-03-28 13:38:22 +08001631 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1632 {
you.chen35020192022-05-06 11:30:57 +08001633 return -1;
1634 }
1635
1636 system("wl down");
1637 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001638 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001639 return -1;
1640 }
1641 system("wl up");
1642 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001643}
qs.xiong0fb469a2022-04-14 03:50:45 -04001644
qs.xiongf1b525b2022-03-31 00:58:23 -04001645int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001646{
you.chen35020192022-05-06 11:30:57 +08001647 int count = 0;
1648 int index = 0;
1649 char *split_words[128] = {0};
1650 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001651 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001652 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001653
you.chen35020192022-05-06 11:30:57 +08001654 CHECK_WPA_CTRL(CTRL_AP);
1655
1656 DO_REQUEST(lynq_chanspec_cmd);
1657
1658 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001659 for(;index < count; index++)
1660 {
1661 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001662 if (strncmp(split_words[index], "channel", 2) != 0) {
1663 continue;
1664 }
1665
1666 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001667 if (index >= count)
1668 {
you.chen35020192022-05-06 11:30:57 +08001669 return -1;
1670 }
1671
1672 *channel = atoi(split_words[index]);
1673 return 0;
1674 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001675 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001676 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001677}
1678
1679
you.chen35020192022-05-06 11:30:57 +08001680int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001681{
you.chen6c2dd9c2022-05-16 17:55:28 +08001682 char ssid[MAX_CMD] = {0};
1683 int freq = 0;
1684 char lynq_auth_cmd[64]={0};
1685 char lynq_auth_alg_cmd[64]={0};
1686 char lynq_psk_cmd[64]={0};
1687 char lynq_pairwise_cmd[64]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001688 char lynq_ieee80211_cmd[64]={0};
1689 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001690 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001691 CHECK_IDX(idx, CTRL_AP);
1692
you.chen6c2dd9c2022-05-16 17:55:28 +08001693 CHECK_WPA_CTRL(CTRL_AP);
1694
qs.xiong9fbf74e2023-03-28 13:38:22 +08001695 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1696 {
1697 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen35020192022-05-06 11:30:57 +08001698 return -1;
1699 }
1700
you.chen92fd5d32022-05-25 10:09:47 +08001701 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001702 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001703 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001704 return 0;
1705 }
1706 else {
1707 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1708 ssid[0] = '\0';
1709 }
1710 lynq_wifi_ap_frequency_get(idx, &freq);
1711
1712 DO_OK_FAIL_REQUEST(cmd_disconnect);
1713 DO_OK_FAIL_REQUEST(cmd_remove_all);
1714 if (ssid[0] != '\0') {
1715 lynq_wifi_ap_ssid_set(idx, ssid);
1716 }
1717 if (freq != 0) {
1718 lynq_wifi_ap_frequency_set(idx, freq);
1719 }
1720 }
1721 }
you.chen35020192022-05-06 11:30:57 +08001722
qs.xiong9fbf74e2023-03-28 13:38:22 +08001723 switch(auth){
1724 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001725 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001726 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001727 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001728 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001729 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001730 break;
1731 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001732 case LYNQ_WIFI_AUTH_WEP:
1733 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001734 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001735 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001736 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-05-16 17:55:28 +08001737 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1738
1739 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1740 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1741 break;
1742 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001743 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-03-29 17:36:14 +08001744 {
1745 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1746 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1747 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1748
1749 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1750 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1751 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1752 break;
1753
1754 }
you.chen35020192022-05-06 11:30:57 +08001755 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001756 {
1757 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1758 {
you.chen35020192022-05-06 11:30:57 +08001759 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1760 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1761 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001762 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1763 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001764 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001765 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001766 }
1767// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1768// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1769 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong7a105ce2022-03-02 09:43:11 -05001770
you.chen35020192022-05-06 11:30:57 +08001771 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1772 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1773 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001774 break;
1775 }
1776 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1777 {
1778 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1779 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1780 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1781 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1782
1783 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1784 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1785 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1786 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1787 break;
1788 }
1789 case LYNQ_WIFI_AUTH_WPA3_PSK:
1790 {
1791 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1792 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xiong3e506812023-04-06 11:08:48 +08001793 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001794 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1795
1796 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1797 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1798 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1799 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1800 break;
1801 }
1802 default:
you.chen35020192022-05-06 11:30:57 +08001803 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001804 RLOGE("auth type [%d] not support now\n", auth);
1805 return -1;
you.chen35020192022-05-06 11:30:57 +08001806 }
1807 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001808 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001809
qs.xiong9fbf74e2023-03-28 13:38:22 +08001810 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001811}
1812
you.chen35020192022-05-06 11:30:57 +08001813int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001814{
you.chen35020192022-05-06 11:30:57 +08001815 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001816 char lynq_auth_alg_str[MAX_RET] = {0};
1817 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001818 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001819 CHECK_IDX(idx, CTRL_AP);
1820
qs.xiong9fbf74e2023-03-28 13:38:22 +08001821 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1822 {
1823 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen35020192022-05-06 11:30:57 +08001824 return -1;
1825 }
1826
qs.xiong9fbf74e2023-03-28 13:38:22 +08001827 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1828 {
1829 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1830 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001831 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001832 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001833 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001834 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001835 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1836 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001837 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001838 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001839 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001840 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001841 else
1842 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001843 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001844 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001845 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001846 }
you.chen35020192022-05-06 11:30:57 +08001847 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001848 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1849 {
1850 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1851 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001852 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001853 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001854 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001855 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1856 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001857 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001858 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001859 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001860 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001861 else
1862 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001863 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001864 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001865 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001866 }
you.chen35020192022-05-06 11:30:57 +08001867 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001868
1869 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1870 {
1871 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1872 return -1;
1873 }
1874
1875 if (memcmp(lynq_auth_str,"1",1) == 0 )
1876 {
1877 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1878 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001879 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001880 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1881 {
1882 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1883 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001884 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001885 }
1886 else
1887 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001888 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001889 *auth = -1;
1890 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001891
you.chen6c2dd9c2022-05-16 17:55:28 +08001892 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001893}
qs.xiong1af5daf2022-03-14 09:12:12 -04001894
qs.xiong1af5daf2022-03-14 09:12:12 -04001895
qs.xiongf1b525b2022-03-31 00:58:23 -04001896int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001897{
you.chen35020192022-05-06 11:30:57 +08001898 char LYNQ_WIFI_CMD[128]={0};
1899 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1900 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001901 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001902 CHECK_IDX(idx, CTRL_AP);
1903
1904 CHECK_WPA_CTRL(CTRL_AP);
1905
1906// system("connmanctl enable wifi");
1907// system("connmanctl tether wifi on cy-test 12345678");
1908// system("ifconfig wlan0 down");
1909// system("ifconfig wlan0 up");
1910// system("ifconfig wlan0 up");
1911
1912 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1913 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1914
1915 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1916 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1917
you.chen70f377f2023-04-14 18:17:09 +08001918 check_tether_and_notify();
1919
qs.xiong9fbf74e2023-03-28 13:38:22 +08001920 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001921}
1922
qs.xiongf1b525b2022-03-31 00:58:23 -04001923int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001924{
you.chen35020192022-05-06 11:30:57 +08001925 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001926}
1927
qs.xiongf1b525b2022-03-31 00:58:23 -04001928int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001929{
you.chen35020192022-05-06 11:30:57 +08001930 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04001931
you.chen35020192022-05-06 11:30:57 +08001932 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001933
you.chen35020192022-05-06 11:30:57 +08001934 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001935
you.chen35020192022-05-06 11:30:57 +08001936 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
1937
1938 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1939
you.chenb4b121c2022-05-06 17:50:16 +08001940// system("connmanctl tether wifi off");
you.chen35020192022-05-06 11:30:57 +08001941
qs.xiong9fbf74e2023-03-28 13:38:22 +08001942 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001943}
qs.xiong1af5daf2022-03-14 09:12:12 -04001944
qs.xiongf1b525b2022-03-31 00:58:23 -04001945int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001946{
you.chen35020192022-05-06 11:30:57 +08001947 char lynq_disable_cmd[128] = {0};
1948 char lynq_select_cmd[128] = {0};
1949 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001950 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08001951 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001952
you.chen35020192022-05-06 11:30:57 +08001953 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08001954 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1955 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1956
1957 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1958 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
1959 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04001960
qs.xiong9fbf74e2023-03-28 13:38:22 +08001961 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001962}
1963
qs.xiongf1b525b2022-03-31 00:58:23 -04001964int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001965{
you.chen35020192022-05-06 11:30:57 +08001966 char lynq_disable_cmd[128] = {0};
1967 char lynq_select_cmd[128] = {0};
1968 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001969 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08001970 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001971
you.chen35020192022-05-06 11:30:57 +08001972 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001973
you.chen35020192022-05-06 11:30:57 +08001974 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1975 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1976
1977 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1978 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
1979 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05001980
qs.xiong9fbf74e2023-03-28 13:38:22 +08001981 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001982}
qs.xiongf1b525b2022-03-31 00:58:23 -04001983
you.chen35020192022-05-06 11:30:57 +08001984int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001985{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001986 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08001987 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001988 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001989 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001990 RLOGD("enter lynq_ap_password_set");
1991 if( password == NULL )
1992 {
1993 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08001994 return -1;
1995 }
1996 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08001997 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001998 if(pass_len < 8 || pass_len >= 64)
1999 {
2000 RLOGE("[lynq_ap_password_set]input password len not in rage");
2001 return -1;
you.chen35020192022-05-06 11:30:57 +08002002 }
qs.xiongf1b525b2022-03-31 00:58:23 -04002003
you.chen35020192022-05-06 11:30:57 +08002004 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002005
qs.xiong9fbf74e2023-03-28 13:38:22 +08002006 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
2007 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002008 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002009 return -1;
2010 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002011 else if (auth == LYNQ_WIFI_AUTH_OPEN)
2012 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002013 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
2014 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08002015 }
2016
you.chen35020192022-05-06 11:30:57 +08002017 CHECK_WPA_CTRL(CTRL_AP);
2018
qs.xiong9fbf74e2023-03-28 13:38:22 +08002019 if (auth == LYNQ_WIFI_AUTH_WEP)
2020 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002021 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002022 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
2023 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
2024 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2025 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
2026 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002027 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2028 {
qs.xiongc8d92a62023-03-29 17:36:14 +08002029 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 +08002030 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
2031 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2032 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002033 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
2034 {
2035
qs.xiongc8d92a62023-03-29 17:36:14 +08002036 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 +08002037 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08002038 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002039 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2040 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
2041
2042 }
2043 else
qs.xiongc8d92a62023-03-29 17:36:14 +08002044 {
2045 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08002046 return -1;
2047 }
you.chen35020192022-05-06 11:30:57 +08002048
you.chen35020192022-05-06 11:30:57 +08002049 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04002050
qs.xiong9fbf74e2023-03-28 13:38:22 +08002051 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04002052}
2053
you.chen35020192022-05-06 11:30:57 +08002054int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04002055{
you.chen35020192022-05-06 11:30:57 +08002056 FILE * fp;
2057 int len, ret;
2058 int count, index;
2059 char *split_lines[128] = {0};
2060 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002061 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04002062
you.chen35020192022-05-06 11:30:57 +08002063 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002064
you.chen35020192022-05-06 11:30:57 +08002065 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
2066// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002067 if (NULL == fp)
2068 {
2069 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002070 return -1;
2071 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002072
you.chen35020192022-05-06 11:30:57 +08002073 buff = alloca(MAX_RET);
2074 fseek(fp, 0, SEEK_SET);
2075 len = fread(buff, 1, MAX_RET, fp);
2076 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04002077
qs.xiong9fbf74e2023-03-28 13:38:22 +08002078 for(index=0; index < len; index ++)
2079 {
2080 if (memcmp(buff + index, "network={", 9) != 0)
2081 {
you.chen35020192022-05-06 11:30:57 +08002082 continue;
2083 }
2084 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002085 for (; index < len; index ++ )
2086 {
2087 if (buff[index] != '}')
2088 {
you.chen35020192022-05-06 11:30:57 +08002089 continue;
2090 }
2091 buff[index] = '\0';
2092 break;
2093 }
2094 len = buff + index - p;
2095 }
2096
2097 count = lynq_split(p, len, '\n', split_lines);
2098
2099 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002100 for(index=0; index < count; index++)
2101 {
you.chen35020192022-05-06 11:30:57 +08002102 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002103 if (p != NULL)
2104 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002105 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002106 if (*p == '\"')
2107 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002108 p++;
2109 }
you.chen35020192022-05-06 11:30:57 +08002110 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002111 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2112 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002113 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002114 if (*p == '\"')
2115 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002116 p++;
2117 }
2118 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002119 else
2120 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002121 continue;
you.chen35020192022-05-06 11:30:57 +08002122 }
2123
2124 strcpy(password, p);
2125
qs.xiong9fbf74e2023-03-28 13:38:22 +08002126 while(*password != '\0')
2127 {
2128 if (*password == '\"')
2129 {
you.chen35020192022-05-06 11:30:57 +08002130 *password = '\0';
2131 break;
2132 }
2133 password++;
2134 }
2135 ret = 0;
2136 break;
2137 } //end for(index=0; index < count; index++)
2138
2139 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002140}
2141
you.chen35020192022-05-06 11:30:57 +08002142static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
2143 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08002144 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002145
qs.xiong9fbf74e2023-03-28 13:38:22 +08002146 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
2147 {
you.chen35020192022-05-06 11:30:57 +08002148 return -1;
2149 }
2150
2151 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08002152
qs.xiong9fbf74e2023-03-28 13:38:22 +08002153 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
2154 {
2155 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
you.chen70f377f2023-04-14 18:17:09 +08002156 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002157 if (strcmp(lynq_proto_str, "RSN") == 0)
you.chen70f377f2023-04-14 18:17:09 +08002158 {
you.chena6cd55a2022-05-08 12:20:18 +08002159 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002160 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08002161 }
you.chen70f377f2023-04-14 18:17:09 +08002162 else if (strcmp(lynq_proto_str, "WPA") == 0) // need compare when wpa3 supported
2163 {
2164 return 0;
2165 }
you.chena6cd55a2022-05-08 12:20:18 +08002166 }
2167 }
you.chen70f377f2023-04-14 18:17:09 +08002168 else if (*auth == LYNQ_WIFI_AUTH_OPEN || *auth == LYNQ_WIFI_AUTH_WEP)
2169 {
2170 return 0;
2171 }
2172
qs.xiong9fbf74e2023-03-28 13:38:22 +08002173 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
2174 {
you.chen70f377f2023-04-14 18:17:09 +08002175 RLOGE("check ieee80211w error\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002176 return -1;
2177 }
2178 if ( strncmp(lynq_auth_str,"1",1) == 0 )
2179 {
2180
you.chen70f377f2023-04-14 18:17:09 +08002181 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
2182 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002183 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
2184 {
2185
2186 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08002187 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002188 }else
2189 {
you.chen70f377f2023-04-14 18:17:09 +08002190 RLOGE("check ieee80211w error, not 1 or 2\n");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002191 *auth = -1;
2192 return -1;
2193 }
you.chen35020192022-05-06 11:30:57 +08002194 return 0;
2195}
2196
2197int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05002198{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002199 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002200 int pass_len, net_no, count, index;
2201 char lynq_tmp_cmd[300]={0};
2202 int net_no_list[128];
2203 lynq_wifi_auth_s net_auth;
2204 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002205 if(pass_len < 8 || pass_len >= 64)
2206 {
2207 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08002208 return -1;
2209 }
2210
2211 CHECK_IDX(idx, CTRL_STA);
2212
2213 net_no = -1;
2214 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
2215
qs.xiong9fbf74e2023-03-28 13:38:22 +08002216 for (index=0; index < count; index++)
2217 {
you.chen35020192022-05-06 11:30:57 +08002218 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002219 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
2220 {
you.chen35020192022-05-06 11:30:57 +08002221 net_no = net_no_list[index];
2222 break;
2223 }
2224 }
2225
qs.xiong9fbf74e2023-03-28 13:38:22 +08002226 if (net_no < 0)
2227 {
you.chen35020192022-05-06 11:30:57 +08002228 return -1;
2229 }
2230
2231 CHECK_WPA_CTRL(CTRL_STA);
2232
2233 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
2234
2235 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
2236 DO_OK_FAIL_REQUEST(cmd_save_config);
2237
2238 return 0;
2239}
2240
2241int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
2242
2243 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08002244 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08002245 int count, index;
2246 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08002247 char *buff, *p, *ssid, *ssid_end_flag;
2248 char tmp_ssid[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08002249 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08002250
you.chen755332b2022-08-06 16:59:10 +08002251 network_len = 0;
2252 p = NULL;
2253
you.chen35020192022-05-06 11:30:57 +08002254 CHECK_IDX(idx, CTRL_STA);
2255
qs.xiong9fbf74e2023-03-28 13:38:22 +08002256 if (NULL == password)
2257 {
2258 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08002259 return -1;
2260 }
2261
you.chen35020192022-05-06 11:30:57 +08002262 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002263 if (NULL == fp)
2264 {
2265 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002266 return -1;
2267 }
2268
2269 buff = alloca(MAX_RET);
2270 fseek(fp, 0, SEEK_SET);
2271 len = fread(buff, 1, MAX_RET, fp);
2272 fclose(fp);
2273
qs.xiong9fbf74e2023-03-28 13:38:22 +08002274 for(index=0; index < len; index ++)
2275 {
2276 for(; index < len; index ++)
2277 {
2278 if (memcmp(buff + index, "network={", 9) != 0)
2279 {
you.chen35020192022-05-06 11:30:57 +08002280 continue;
2281 }
2282 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002283 for (; index < len; index ++ )
2284 {
2285 if (buff[index] != '}')
2286 {
you.chen35020192022-05-06 11:30:57 +08002287 continue;
2288 }
2289 buff[index] = '\0';
2290 break;
2291 }
you.chen755332b2022-08-06 16:59:10 +08002292 network_len = buff + index - p;
2293 break;
you.chen35020192022-05-06 11:30:57 +08002294 }
2295
qs.xiongb3f26af2023-02-17 18:41:07 +08002296 if (p == NULL)
2297 return -1;
2298
you.chend2fef3f2023-02-13 10:50:35 +08002299 ssid = strstr(p, "ssid=");
2300 if (ssid != NULL) {
2301 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002302 if (ssid[0] == '\"')
2303 {
you.chend2fef3f2023-02-13 10:50:35 +08002304 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2305 break;
2306 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002307 else
2308 {
you.chend2fef3f2023-02-13 10:50:35 +08002309 ssid_end_flag = strstr(ssid, "\n");
2310 if (ssid_end_flag != NULL)
2311 {
2312 ssid_len = (ssid_end_flag - ssid) / 2;
2313 for(i=0; i<ssid_len; i++)
2314 {
2315 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2316 }
2317 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2318 break;
2319 }
2320 }
you.chen35020192022-05-06 11:30:57 +08002321 }
you.chend2fef3f2023-02-13 10:50:35 +08002322
you.chen35020192022-05-06 11:30:57 +08002323 }
2324
qs.xiong9fbf74e2023-03-28 13:38:22 +08002325 if (index >= len || NULL == p || network_len <= 0)
2326 {
you.chen35020192022-05-06 11:30:57 +08002327 return -1;
2328 }
2329
you.chen755332b2022-08-06 16:59:10 +08002330 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08002331
2332 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002333 for(index=0; index < count; index++)
2334 {
you.chen35020192022-05-06 11:30:57 +08002335 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002336 if (p != NULL)
2337 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002338 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002339 if (*p == '\"')
2340 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002341 p++;
2342 }
you.chen35020192022-05-06 11:30:57 +08002343 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002344 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2345 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002346 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002347 if (*p == '\"')
2348 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002349 p++;
2350 }
2351 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002352 else
2353 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002354 continue;
you.chen35020192022-05-06 11:30:57 +08002355 }
2356
qs.xiong13673462023-02-21 19:12:54 +08002357 if (*p == '\"')
2358 p++;
2359 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08002360
qs.xiong13673462023-02-21 19:12:54 +08002361 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002362 while(password - p < 64 && *password != '\0')
2363 {
2364 if (*password == '\"')
2365 {
you.chen35020192022-05-06 11:30:57 +08002366 *password = '\0';
2367 break;
2368 }
2369 password++;
2370 }
2371 ret = 0;
2372 break;
2373 } //end for(index=0; index < count; index++)
2374
2375 return ret;
2376}
2377
2378static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2379{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002380 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04002381
qs.xiong9fbf74e2023-03-28 13:38:22 +08002382 if (sta_ssid == NULL)
2383 {
2384 RLOGE("sta_ssid is null\n");
2385 return -1;
you.chen35020192022-05-06 11:30:57 +08002386 }
2387
qs.xiong9fbf74e2023-03-28 13:38:22 +08002388 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002389
2390 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2391
2392 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2393// DO_OK_FAIL_REQUEST(cmd_save_config);
2394
qs.xiong9fbf74e2023-03-28 13:38:22 +08002395 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002396
2397}
2398
you.chen35020192022-05-06 11:30:57 +08002399static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05002400{
you.chen35020192022-05-06 11:30:57 +08002401 char lynq_disable_cmd[128]={0};
2402 char lynq_select_cmd[128]={0};
2403
2404 CHECK_WPA_CTRL(CTRL_STA);
2405
qs.xiong9fbf74e2023-03-28 13:38:22 +08002406 if (save != 0)
2407 {
you.chenc29444e2022-06-07 18:01:16 +08002408 if (start_flag != 0)
2409 {
2410 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2411 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2412 }
2413 else
2414 {
2415 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2416 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2417 }
you.chen35020192022-05-06 11:30:57 +08002418 DO_OK_FAIL_REQUEST(cmd_save_config);
2419 }
2420
qs.xiong9fbf74e2023-03-28 13:38:22 +08002421 if (start_flag == 0)
2422 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002423 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002424 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2425 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002426 else
2427 {
you.chen35020192022-05-06 11:30:57 +08002428 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2429 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2430 }
2431
2432 return 0;
2433}
2434
2435int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2436{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002437 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002438 CHECK_IDX(idx, CTRL_STA);
2439
you.chen6c2dd9c2022-05-16 17:55:28 +08002440 curr_status_info curr_state;
2441 ap_info_s ap_info;
2442 curr_state.ap = &ap_info;
2443 curr_state.state = NULL;
2444
qs.xiong9fbf74e2023-03-28 13:38:22 +08002445 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2446 {
you.chend2fef3f2023-02-13 10:50:35 +08002447 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002448 return 0;
2449 }
2450
2451 return -1;
you.chen35020192022-05-06 11:30:57 +08002452}
2453
2454int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2455{
you.chen9ac66392022-08-06 17:01:16 +08002456 scan_info_s *scan_list = NULL;
2457 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002458 int scan_len=0;
2459 int save_len=0;
2460 int best_index = -1;
2461 int best_scan_index = -1;
2462 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002463 int i, j, ret;
2464
2465 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002466
2467 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002468 if (info == NULL)
2469 {
you.chen35020192022-05-06 11:30:57 +08002470 return -1;
2471 }
2472
2473 curr_status_info curr_state;
2474 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002475 char status[64];
you.chen35020192022-05-06 11:30:57 +08002476
you.chen9ac66392022-08-06 17:01:16 +08002477 memset(&ap_info, 0, sizeof (ap_info));
2478 memset(status, 0, sizeof (status));
2479
2480 curr_state.ap = &ap_info;
2481 curr_state.state = status;
2482
qs.xiong9fbf74e2023-03-28 13:38:22 +08002483 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2484 {
you.chen35020192022-05-06 11:30:57 +08002485 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002486 if (strcmp(status, STATE_COMPLETED) == 0)
2487 {
2488 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2489 }
2490 else
2491 {
2492 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2493 }
you.chen35020192022-05-06 11:30:57 +08002494 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002495 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002496 return 0;
2497 }
2498
you.chen9ac66392022-08-06 17:01:16 +08002499 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002500 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002501 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2502 {
you.chen9ac66392022-08-06 17:01:16 +08002503 if (NULL != scan_list)
2504 {
2505 free(scan_list);
2506 }
you.chen35020192022-05-06 11:30:57 +08002507 return -1;
2508 }
2509
qs.xiong9fbf74e2023-03-28 13:38:22 +08002510 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2511 {
you.chen9ac66392022-08-06 17:01:16 +08002512 if (NULL != scan_list)
2513 {
2514 free(scan_list);
2515 }
2516 if (NULL != save_list)
2517 {
2518 free(save_list);
2519 }
you.chen35020192022-05-06 11:30:57 +08002520 return -1;
2521 }
2522
qs.xiong9fbf74e2023-03-28 13:38:22 +08002523 for (i=0; i < save_len; i++)
2524 {
2525 for (j=0; j < scan_len; j++)
2526 {
you.chen35020192022-05-06 11:30:57 +08002527 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002528 && save_list[i].base_info.auth == scan_list[j].auth)
2529 {
2530 if (best_rssi == 0)
2531 {
you.chen9ac66392022-08-06 17:01:16 +08002532 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002533 best_rssi = scan_list[j].rssi;
2534 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002535 else if (best_rssi > scan_list[j].rssi)
2536 {
you.chen35020192022-05-06 11:30:57 +08002537 best_index = i;
2538 best_scan_index = j;
2539 best_rssi = scan_list[j].rssi;
2540 }
you.chend2fef3f2023-02-13 10:50:35 +08002541 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 +08002542 break;
2543 }
2544 }
2545 }
2546
qs.xiong9fbf74e2023-03-28 13:38:22 +08002547 if (best_index >= 0)
2548 {
you.chen35020192022-05-06 11:30:57 +08002549 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002550 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 +08002551 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2552 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002553 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002554 }
2555
you.chen9ac66392022-08-06 17:01:16 +08002556 if (NULL != scan_list)
2557 {
2558 free(scan_list);
2559 }
2560 if (NULL != save_list)
2561 {
2562 free(save_list);
2563 }
2564
2565 return ret;
you.chen35020192022-05-06 11:30:57 +08002566}
2567
2568static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2569{
qs.xiongc8d92a62023-03-29 17:36:14 +08002570 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002571 char lynq_ket_mgmt_cmd[64]={0};
2572 char lynq_pairwise_cmd[64]={0};
2573 char lynq_psk_cmd[64]={0};
2574
2575 CHECK_WPA_CTRL(CTRL_STA);
2576
qs.xiong9fbf74e2023-03-28 13:38:22 +08002577 switch(auth)
2578 {
2579 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002580 {
2581 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002582
you.chen35020192022-05-06 11:30:57 +08002583 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002584// DO_OK_FAIL_REQUEST(cmd_save_config);
2585 break;
2586 }
2587 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002588 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002589 {
2590 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2591 {
you.chen35020192022-05-06 11:30:57 +08002592 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2593 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002594 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2595 {
you.chena6cd55a2022-05-08 12:20:18 +08002596 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002597 }
2598 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2599 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002600
you.chen35020192022-05-06 11:30:57 +08002601 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2602 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2603 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002604
qs.xiong9fbf74e2023-03-28 13:38:22 +08002605 if (password != NULL)
2606 {
you.chen35020192022-05-06 11:30:57 +08002607 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2608 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002609 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002610 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002611
you.chen35020192022-05-06 11:30:57 +08002612// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002613 break;
2614 }
2615 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2616 {
qs.xiong3e506812023-04-06 11:08:48 +08002617 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002618 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002619 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2620 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2621
qs.xiong3e506812023-04-06 11:08:48 +08002622 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002623 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2624 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2625 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2626
2627 break;
2628 }
2629 case LYNQ_WIFI_AUTH_WPA3_PSK:
2630 {
qs.xiong3e506812023-04-06 11:08:48 +08002631 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiong03556d52023-04-17 09:45:19 +08002632 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002633 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2634 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2635
qs.xiong3e506812023-04-06 11:08:48 +08002636 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002637 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2638 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2639 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2640
2641 break;
2642 }
2643 default:
2644 return -1;
you.chen35020192022-05-06 11:30:57 +08002645 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002646
qs.xiong9fbf74e2023-03-28 13:38:22 +08002647 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002648}
qs.xiong7a105ce2022-03-02 09:43:11 -05002649
you.chen35020192022-05-06 11:30:57 +08002650static int inner_get_curr_net_no(int interface) {
2651 curr_status_info curr_state;
2652 curr_state.ap = NULL;
2653 curr_state.state = NULL;
2654
qs.xiong9fbf74e2023-03-28 13:38:22 +08002655 if (0 != inner_get_status_info(interface, &curr_state))
2656 {
you.chen35020192022-05-06 11:30:57 +08002657 return -1;
2658 }
2659
2660 return curr_state.net_no;
2661}
2662
2663int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002664{
you.chen35020192022-05-06 11:30:57 +08002665 int net_no;
2666 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002667
you.chen35020192022-05-06 11:30:57 +08002668 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002669
qs.xiong9fbf74e2023-03-28 13:38:22 +08002670 if (net_no < 0)
2671 {
you.chen35020192022-05-06 11:30:57 +08002672 return -1;
2673 }
2674
2675 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002676}
2677
you.chen35020192022-05-06 11:30:57 +08002678int 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 -05002679{
you.chen35020192022-05-06 11:30:57 +08002680 int count, net_no, index;
2681 int net_no_list[128];
2682 lynq_wifi_auth_s net_auth;
you.chen70f377f2023-04-14 18:17:09 +08002683 curr_status_info curr_state;
2684 ap_info_s ap_info;
2685 char status[64];
qs.xiongf1b525b2022-03-31 00:58:23 -04002686
qs.xiong9fbf74e2023-03-28 13:38:22 +08002687 if (ssid == NULL || *ssid == '\0')
2688 {
2689 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002690 return -1;
2691 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002692
qs.xiong9fbf74e2023-03-28 13:38:22 +08002693 if (LYNQ_WIFI_AUTH_OPEN != auth)
2694 {
2695 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
you.chen70f377f2023-04-14 18:17:09 +08002696 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002697 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002698 return -1;
2699 }
2700 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002701
you.chen70f377f2023-04-14 18:17:09 +08002702
2703 pthread_mutex_lock(&s_global_check_mutex);
2704 if (s_sta_status != INNER_STA_STATUS_INIT)
2705 {
2706 s_sta_status = INNER_STA_STATUS_CANCEL;
2707 pthread_cond_signal(&s_global_check_cond);
2708 }
2709 pthread_mutex_unlock(&s_global_check_mutex);
2710
you.chen35020192022-05-06 11:30:57 +08002711 CHECK_IDX(idx, CTRL_STA);
you.chen70f377f2023-04-14 18:17:09 +08002712 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002713
2714 net_no = -1;
you.chen70f377f2023-04-14 18:17:09 +08002715 memset(&ap_info, 0, sizeof (ap_info));
2716 memset(status, 0, sizeof (status));
you.chen35020192022-05-06 11:30:57 +08002717
you.chen70f377f2023-04-14 18:17:09 +08002718 curr_state.ap = &ap_info;
2719 curr_state.state = status;
2720
2721 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002722 {
you.chen70f377f2023-04-14 18:17:09 +08002723 if (strcmp(status, STATE_COMPLETED) == 0 && strcmp(ap_info.ap_ssid, ssid) ==0 && ap_info.auth == auth)
2724 {
2725 net_no = curr_state.net_no;
2726 if (0 == lynq_sta_ssid_password_get(idx, &ap_info, ap_info.psw)
2727 && strcmp(ap_info.psw, psw) == 0)
2728 {
2729 RLOGD("already connected\n");
2730
2731 pthread_mutex_lock(&s_global_check_mutex);
2732 s_sta_status = INNER_STA_STATUS_CONNECTED;
2733 pthread_cond_signal(&s_global_check_cond);
2734 pthread_mutex_unlock(&s_global_check_mutex);
2735 return 0;
2736 }
you.chen35020192022-05-06 11:30:57 +08002737 }
2738 }
2739
you.chen70f377f2023-04-14 18:17:09 +08002740 if (net_no == -1)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002741 {
you.chen70f377f2023-04-14 18:17:09 +08002742 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2743
2744 for (index=0; index < count; index++)
2745 {
2746 net_auth = -1;
2747 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2748 {
2749 net_no = net_no_list[index];
2750 break;
2751 }
you.chen35020192022-05-06 11:30:57 +08002752 }
2753
you.chen70f377f2023-04-14 18:17:09 +08002754 if (net_no < 0)
2755 {
2756 net_no = lynq_add_network(CTRL_STA);
2757 if (net_no == -1)
2758 {
2759 return -1;
2760 }
2761
2762 RLOGD("net no is %d\n", net_no);
2763 if (0 != inner_set_sta_ssid(net_no, ssid))
2764 {
2765 return -1;
2766 }
you.chen35020192022-05-06 11:30:57 +08002767 }
2768 }
2769
qs.xiong9fbf74e2023-03-28 13:38:22 +08002770 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2771 {
you.chen35020192022-05-06 11:30:57 +08002772 return -1;
2773 }
2774
you.chen70f377f2023-04-14 18:17:09 +08002775
2776 DO_OK_FAIL_REQUEST(cmd_disconnect);
2777 usleep(200*1000);
2778
2779 ret = inner_sta_start_stop(net_no, 1, 1);
2780
2781 pthread_mutex_lock(&s_global_check_mutex);
2782 s_sta_status = INNER_STA_STATUS_CONNECTING;
2783 strcpy(s_sta_current_connecting_ssid, ssid);
2784 struct timeval now;
2785 gettimeofday(&now,NULL);
2786 s_sta_connect_timeout.tv_sec = now.tv_sec + MAX_CONNNECT_TIME;
2787 s_sta_connect_timeout.tv_nsec = now.tv_usec*1000;
2788 pthread_cond_signal(&s_global_check_cond);
2789 pthread_mutex_unlock(&s_global_check_mutex);
2790 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05002791}
2792
you.chen35020192022-05-06 11:30:57 +08002793int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002794{
you.chen35020192022-05-06 11:30:57 +08002795 ap_info_s ap;
2796 curr_status_info curr_state;
2797 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002798
qs.xiong9fbf74e2023-03-28 13:38:22 +08002799 if (ssid == NULL || *ssid == '\0')
2800 {
2801 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002802 return -1;
2803 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002804
you.chen35020192022-05-06 11:30:57 +08002805 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002806
you.chen35020192022-05-06 11:30:57 +08002807 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002808 curr_state.state = NULL;
2809
qs.xiong9fbf74e2023-03-28 13:38:22 +08002810 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2811 {
you.chen35020192022-05-06 11:30:57 +08002812 return 0;
2813 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002814
qs.xiong9fbf74e2023-03-28 13:38:22 +08002815 if (strcmp(ap.ap_ssid, ssid) != 0)
2816 {
you.chen35020192022-05-06 11:30:57 +08002817 return 0;
2818 }
2819
you.chen70f377f2023-04-14 18:17:09 +08002820 pthread_mutex_lock(&s_global_check_mutex);
2821 s_sta_status = INNER_STA_STATUS_DISCONNECTING;
2822 pthread_mutex_unlock(&s_global_check_mutex);
you.chen35020192022-05-06 11:30:57 +08002823 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002824}
qs.xiong97fa59b2022-04-07 05:41:29 -04002825
you.chena6cd55a2022-05-08 12:20:18 +08002826int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2827{
qs.xiongad2f89d2023-01-18 13:17:41 +08002828// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2829// const char *lynq_reconnect_cmd = "RECONNECT";
2830 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2831 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2832// 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 -05002833
you.chen35020192022-05-06 11:30:57 +08002834 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08002835 CHECK_WPA_CTRL(CTRL_STA);
2836
2837 system("connmanctl enable wifi");
2838
qs.xiongad2f89d2023-01-18 13:17:41 +08002839 if (system("ifconfig | grep -q wlan0") != 0)
2840 {
you.chen35020192022-05-06 11:30:57 +08002841 return -1;
2842 }
qs.xiong9c99fa92022-03-15 08:03:26 -04002843
qs.xiongad2f89d2023-01-18 13:17:41 +08002844// DO_OK_FAIL_REQUEST(cmd_remove_all);
2845// system(lynq_first_sta_cmd);
2846// system(lynq_reconfigure_cmd);
2847// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
2848 system(lynq_enable_sta_cmd);
2849 system(lynq_reconnect_cmd);
2850// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002851 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002852}
2853
you.chen35020192022-05-06 11:30:57 +08002854int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04002855{
qs.xiongad2f89d2023-01-18 13:17:41 +08002856// char lynq_disable_network_cmd[MAX_CMD];
2857// curr_status_info curr_state;
2858// ap_info_s ap_info;
you.chen35020192022-05-06 11:30:57 +08002859
qs.xiongad2f89d2023-01-18 13:17:41 +08002860 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 +08002861 CHECK_IDX(idx, CTRL_STA);
2862 CHECK_WPA_CTRL(CTRL_STA);
2863
qs.xiongad2f89d2023-01-18 13:17:41 +08002864// curr_state.ap = &ap_info;
2865// curr_state.state = NULL;
you.chena6cd55a2022-05-08 12:20:18 +08002866
qs.xiongad2f89d2023-01-18 13:17:41 +08002867// if (0 != inner_get_status_info(CTRL_STA, &curr_state) || curr_state.net_no < 0) {
2868// return 0;
2869// }
you.chena6cd55a2022-05-08 12:20:18 +08002870
qs.xiongad2f89d2023-01-18 13:17:41 +08002871// sprintf(lynq_disable_network_cmd, "DISABLE_NETWORK %d", curr_state.net_no);
2872// DO_OK_FAIL_REQUEST(lynq_disable_network_cmd);
2873 system(lynq_disable_sta_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002874 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong3fe220f2023-04-18 16:31:35 +08002875//tmp add cmd fix gsw wlan0 didn't free ip after stop sta
2876 system("ifconfig wlan0 0.0.0.0");
you.chena6cd55a2022-05-08 12:20:18 +08002877 return 0;
2878// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04002879}
qs.xiong7a105ce2022-03-02 09:43:11 -05002880
you.chen35020192022-05-06 11:30:57 +08002881//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
2882// int i, count;
2883// char *p;
2884// const char * FLAG_SSID = "ssid=";
2885// const char * FLAG_SBSID = "bssid=";
2886// const char * FLAG_KEY_MGMT = "key_mgmt=";
2887// const char * FLAG_FREQ = "freq=";
2888// char lynq_sta_cmd[MAX_CMD];
2889// char *split_lines[128] = {0};
2890
2891// CHECK_WPA_CTRL(CTRL_AP);
2892
2893// sprintf(lynq_sta_cmd, "STA %s", bssid);
2894
2895// DO_REQUEST(lynq_sta_cmd);
2896
2897// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2898
2899// for(i=0; i < count; i++) {
2900// p = strstr(split_lines[i], FLAG_SSID);
2901// if (p != NULL) {
2902// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
2903// continue;
2904// }
2905// }
2906
2907// lynq_get_interface_ip(idx, ap->ap_ip);
2908// lynq_ap_password_set(idx, ap->psw);
2909
2910// return 0;
2911//}
2912
2913static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
2914 curr_status_info curr_state;
2915 curr_state.ap = ap;
2916 curr_state.state = NULL;
2917 return inner_get_status_info(interface, &curr_state);
2918}
2919
2920int 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 -04002921{
you.chend2fef3f2023-02-13 10:50:35 +08002922 int index, line_count;
2923 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08002924 const char *lynq_first_sta_cmd = "STA-FIRST";
2925 char lynq_next_sta_cmd[MAX_CMD];
2926 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08002927 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002928
you.chen35020192022-05-06 11:30:57 +08002929 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002930
you.chen35020192022-05-06 11:30:57 +08002931 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002932
you.chen35020192022-05-06 11:30:57 +08002933// ap_info_s * tmp_ap;
2934// device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002935 if (ap == NULL || list == NULL || len == NULL)
2936 {
2937 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08002938 return -1;
2939 }
2940
2941// ap = &tmp_ap;
2942// list = &tmp_list;
2943 *ap = malloc(sizeof (ap_info_s));
2944
qs.xiong9fbf74e2023-03-28 13:38:22 +08002945 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0)
2946 {
2947 RLOGE("inner_get_status_info_ap !=0\n");
you.chen35020192022-05-06 11:30:57 +08002948 return -1;
2949 }
2950
2951 lynq_get_interface_ip(idx, (*ap)->ap_ip);
2952 lynq_ap_password_get(idx, (*ap)->psw);
2953
you.chen35020192022-05-06 11:30:57 +08002954 DO_REQUEST(lynq_first_sta_cmd);
2955
2956 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002957 while (reply_len > 0)
2958 {
2959 if (memcmp(cmd_reply, "FAIL", 4) == 0)
2960 {
you.chen35020192022-05-06 11:30:57 +08002961 break;
2962 }
2963 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2964 bssid[index] = malloc(strlen(split_lines[0]) + 1);
2965 strcpy(bssid[index], split_lines[0]);
2966 index++;
2967 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
2968 reply_len = MAX_RET;
2969 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08002970 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 +08002971 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
2972 {
2973 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08002974 break;
2975 }
2976 }
2977
2978 *len = index;
2979
2980 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08002981 for (index=0; index < *len; index++)
2982 {
you.chend2fef3f2023-02-13 10:50:35 +08002983 dev_info = &(*list)[index];
2984 memset(dev_info, 0, sizeof(device_info_s));
2985 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
2986 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
2987 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
2988 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08002989 free(bssid[index]);
2990 }
2991
2992 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002993}
2994
you.chen35020192022-05-06 11:30:57 +08002995int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04002996{
you.chen35020192022-05-06 11:30:57 +08002997 int i, count, index, count_words;
2998 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
2999 char *split_lines[128] = {0};
3000 char *split_words[128] = {0};
3001 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04003002
qs.xiong9fbf74e2023-03-28 13:38:22 +08003003 if (list == NULL || len == NULL)
3004 {
you.chen35020192022-05-06 11:30:57 +08003005 return -1;
3006 }
qs.xiong97fa59b2022-04-07 05:41:29 -04003007
you.chen9ac66392022-08-06 17:01:16 +08003008 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
3009 {
3010 usleep(100 * 1000);
3011 }
3012
you.chen35020192022-05-06 11:30:57 +08003013 CHECK_IDX(idx, CTRL_STA);
3014
3015 CHECK_WPA_CTRL(CTRL_STA);
3016
3017 DO_REQUEST(lynq_scan_result_cmd);
3018
3019 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
3020 *len = count - 1;
3021 *list = malloc(sizeof (scan_info_s) * *len);
3022
3023 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08003024 for (index=0; index <count_words; index++)
3025 {
3026 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08003027 }
3028
qs.xiong9fbf74e2023-03-28 13:38:22 +08003029 for(index = 1;index < count; index++)
3030 {
3031 RLOGD("---- %s\n",split_lines[index]);
you.chen35020192022-05-06 11:30:57 +08003032 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
3033 if (count_words < 4)
3034 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003035 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08003036 //bssid / frequency / signal level / flags / ssid
3037 p = (*list) + index - 1;
3038 strcpy(p->mac, split_words[0]);
3039 p->band = convert_band_from_freq(atoi(split_words[1]));
3040 p->rssi = -1 * atoi( split_words[2]);
3041 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chend2fef3f2023-02-13 10:50:35 +08003042 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
you.chen35020192022-05-06 11:30:57 +08003043 }
3044
3045 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003046}
qs.xiong97fa59b2022-04-07 05:41:29 -04003047
you.chen35020192022-05-06 11:30:57 +08003048int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
3049{
3050 int count, net_no, index;
3051 int net_no_list[128];
3052 lynq_wifi_auth_s net_auth;
3053 char lynq_remove_cmd[MAX_CMD];
3054
qs.xiong9fbf74e2023-03-28 13:38:22 +08003055 if (ssid == NULL || *ssid == '\0')
3056 {
3057 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08003058 return -1;
3059 }
3060
3061 CHECK_IDX(idx, CTRL_STA);
3062
3063 CHECK_WPA_CTRL(CTRL_STA);
3064
3065 net_no = -1;
3066 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
3067
qs.xiong9fbf74e2023-03-28 13:38:22 +08003068 for (index=0; index < count; index++)
3069 {
you.chen35020192022-05-06 11:30:57 +08003070 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003071 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
3072 {
you.chen35020192022-05-06 11:30:57 +08003073 net_no = net_no_list[index];
3074 break;
3075 }
3076 }
3077
qs.xiong9fbf74e2023-03-28 13:38:22 +08003078 if (net_no < 0)
3079 {
you.chen35020192022-05-06 11:30:57 +08003080 return 0;
3081 }
3082
3083 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
3084
3085 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
3086 DO_OK_FAIL_REQUEST(cmd_save_config);
3087
3088 return 0;
3089}
3090
3091int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003092{
you.chend2fef3f2023-02-13 10:50:35 +08003093 int count, index;
you.chen35020192022-05-06 11:30:57 +08003094 int net_no_list[128];
3095 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003096 RLOGD("enter lynq_get_sta_saved_ap api\n");
3097 if (list == NULL || len == NULL)
3098 {
3099 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08003100 return -1;
3101 }
3102
3103 CHECK_IDX(idx, CTRL_STA);
3104
3105// CHECK_WPA_CTRL(CTRL_STA);
3106
3107 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003108 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08003109
you.chen057aac42023-04-13 14:06:58 +08003110 if (count < 0)
3111 {
3112 RLOGE("list network fail");
3113 return count;
3114 }
3115 else if (count == 0)
3116 {
3117 *list = NULL;
3118 *len = 0;
3119 return 0;
3120 }
3121
you.chen35020192022-05-06 11:30:57 +08003122 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08003123 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08003124 *len = count;
3125
qs.xiong9fbf74e2023-03-28 13:38:22 +08003126 for (index=0; index < count; index++)
3127 {
you.chen35020192022-05-06 11:30:57 +08003128 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
you.chen35020192022-05-06 11:30:57 +08003129 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
you.chen35020192022-05-06 11:30:57 +08003130 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003131 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
you.chen057aac42023-04-13 14:06:58 +08003132 {
you.chen35020192022-05-06 11:30:57 +08003133 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
3134 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003135 else
you.chen057aac42023-04-13 14:06:58 +08003136 {
you.chen35020192022-05-06 11:30:57 +08003137 (*list)[index].base_info.band = -1;
3138 }
you.chen057aac42023-04-13 14:06:58 +08003139 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08003140 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08003141 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003142 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08003143 return 0;
3144}
3145
3146int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
3147{
qs.xiongc8d92a62023-03-29 17:36:14 +08003148 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08003149 const char *lynq_scan_cmd = "SCAN";
3150
3151 CHECK_IDX(idx, CTRL_STA);
3152
3153 CHECK_WPA_CTRL(CTRL_STA);
3154
you.chen70f377f2023-04-14 18:17:09 +08003155// system(clean_last_re); // youchen @ 2023-04-14 temp delete ,next time to fix the orginal bug
you.chen9ac66392022-08-06 17:01:16 +08003156 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08003157 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003158 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
3159 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003160 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003161 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
3162 {
qs.xiongb3f26af2023-02-17 18:41:07 +08003163 g_sta_scan_finish_flag = 1;
3164 return -1;
3165 }
you.chen35020192022-05-06 11:30:57 +08003166
3167 return 0;
3168}
3169
3170int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003171 if (cb == NULL)
3172 {
3173 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003174 return -1;
3175 }
3176
you.chene9d00032023-04-24 13:55:29 +08003177 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +08003178 g_ap_callback_priv = priv;
3179 g_ap_callback_func = cb;
3180
you.chene9d00032023-04-24 13:55:29 +08003181 if (g_ap_watcher_pid == 0 )
3182 {
3183 if(pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL) < 0)
3184 {
3185 g_ap_watcher_pid = 0;
3186 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3187 RLOGE("[wifi error]creat APWatcherThreadProc fail");
3188 return -1;
3189 }
3190 }
3191
3192 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3193 RLOGD("creat APWatcherTheradProc susccs");
3194
you.chen35020192022-05-06 11:30:57 +08003195 return 0;
3196}
3197
3198int lynq_unreg_ap_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003199 if (g_ap_callback_priv == priv)
3200 {
you.chen35020192022-05-06 11:30:57 +08003201 g_ap_callback_func = NULL;
3202 g_ap_callback_priv = NULL;
3203 return 0;
3204 }
3205 return -1;
3206}
3207
3208int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08003209 if (cb == NULL)
3210 {
3211 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08003212 return -1;
3213 }
3214
you.chene9d00032023-04-24 13:55:29 +08003215 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +08003216 g_sta_callback_priv = priv;
3217 g_sta_callback_func = cb;
3218
you.chene9d00032023-04-24 13:55:29 +08003219 if (g_sta_watcher_pid == 0 ) {
3220 if(pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL) < 0)
3221 {
3222 g_sta_watcher_pid = 0;
3223 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3224 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
3225 return -1;
3226 }
3227 }
3228
3229 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
3230 RLOGD("creat STAWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +08003231 return 0;
3232}
3233
3234int lynq_unreg_sta_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003235 if (g_sta_callback_priv == priv)
3236 {
you.chen35020192022-05-06 11:30:57 +08003237 g_sta_callback_func = NULL;
3238 g_sta_callback_priv = NULL;
3239 return 0;
3240 }
3241 return -1;
3242}
3243
3244
3245static int inner_get_status_info_state (int interface, char *state) {
3246 curr_status_info curr_state;
3247 curr_state.ap = NULL;
3248 curr_state.state = state;
3249 return inner_get_status_info(interface, &curr_state);
3250}
3251
3252int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
3253{
3254 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003255 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08003256 CHECK_IDX(idx, CTRL_AP);
3257
qs.xiong9fbf74e2023-03-28 13:38:22 +08003258 if (inner_get_status_info_state(CTRL_AP, state) != 0)
3259 {
you.chen35020192022-05-06 11:30:57 +08003260 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3261 return 0;
3262 }
3263
qs.xiong9fbf74e2023-03-28 13:38:22 +08003264 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3265 {
you.chen35020192022-05-06 11:30:57 +08003266 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
3267 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003268 else
3269 {
you.chen35020192022-05-06 11:30:57 +08003270 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
3271 }
3272
3273 return 0;
3274}
3275
3276int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
3277 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08003278 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08003279 CHECK_IDX(idx, CTRL_STA);
3280
qs.xiong9fbf74e2023-03-28 13:38:22 +08003281 if (inner_get_status_info_state(CTRL_STA, state) != 0)
3282 {
you.chen35020192022-05-06 11:30:57 +08003283 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3284 return 0;
3285 }
3286
qs.xiong9fbf74e2023-03-28 13:38:22 +08003287 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
3288 {
you.chen35020192022-05-06 11:30:57 +08003289 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
3290 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003291 else
3292 {
you.chen35020192022-05-06 11:30:57 +08003293 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
3294 }
3295
3296 return 0;
3297}
3298
3299int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
3300// CHECK_IDX(idx, CTRL_AP);
3301// int ret = 0;
3302// size_t reply_len = MAX_RET;
3303// char cmd_reply[MAX_RET]={0};
3304// const char * cmd_str = "GET country";
3305// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
3306// do{
3307// if (NULL == s_lynq_wpa_ctrl) {
3308// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
3309// if (NULL == s_lynq_wpa_ctrl ) {
3310// printf("wpa_ctrl_open fail\n");
3311// return -1;
3312// }
3313// }
3314// }while(0);
3315
3316// do {
3317// reply_len = MAX_RET;
3318// cmd_reply[0] = '\0';
3319// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08003320// 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 +08003321// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003322// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08003323// return ret;
3324// }
3325// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08003326// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08003327// }while(0);
3328
3329 FILE *fp;
3330 size_t i = 0;
3331 char lynq_cmd_ret[MAX_RET]={0};
3332
3333// CHECK_IDX(idx, CTRL_AP);
3334
3335 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003336 {
3337 perror("popen error!");
3338 return -1;
3339 }
you.chen35020192022-05-06 11:30:57 +08003340 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
3341 {
3342 perror("fread fail!");
3343 return -1;
3344 }
3345
qs.xiong9fbf74e2023-03-28 13:38:22 +08003346 for(i=0; i < strlen(lynq_cmd_ret); i++)
3347 {
3348 if (lynq_cmd_ret[i] == ' ')
3349 {
you.chen35020192022-05-06 11:30:57 +08003350 lynq_cmd_ret[i] = '\0';
3351 break;
3352 }
3353 }
3354
3355 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003356 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08003357
3358 int ret=pclose(fp);
3359 if(ret==-1)
3360 {
3361 perror("close file faild");
3362 }
3363
3364 return 0;
3365}
3366
3367int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
3368// const char * cmd_str = "GET country";
3369// CHECK_IDX(idx, CTRL_AP);
3370// CHECK_WPA_CTRL(CTRL_STA);
3371
3372// DO_REQUEST(cmd_str);
3373// printf("result %s\n", cmd_reply);
3374
qs.xiong9fbf74e2023-03-28 13:38:22 +08003375 if (country_code == NULL || *country_code == '\0')
3376 {
3377 RLOGD("bad country code\n");
you.chen35020192022-05-06 11:30:57 +08003378 return -1;
3379 }
3380
3381 char lynq_country_cmd[MAX_CMD];
3382 sprintf(lynq_country_cmd, "wl country %s", country_code);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003383 if (system(lynq_country_cmd) == 0)
3384 {
you.chen35020192022-05-06 11:30:57 +08003385 return 0;
3386 }
3387
3388 return -1;
3389}
3390
3391int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
3392{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003393 RLOGD("enter lynq_get_connect_ap_mac\n");
3394 if (mac == NULL)
3395 {
3396 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08003397 return -1;
3398 }
3399
3400 CHECK_IDX(idx, CTRL_STA);
3401 ap_info_s ap;
3402 ap.ap_mac[0] = '\0';
3403
qs.xiong9fbf74e2023-03-28 13:38:22 +08003404 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3405 {
you.chen35020192022-05-06 11:30:57 +08003406 return -1;
3407 }
3408 strcpy(mac, ap.ap_mac);
3409
3410 return 0;
3411}
3412
3413int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
3414{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003415 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08003416 struct ifaddrs *ifaddr_header, *ifaddr;
3417 struct in_addr * ifa;
3418 const char * ifaName = "wlan0";
3419 if (ip == NULL)
3420 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003421 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08003422 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003423 }
you.chenf58b3c92022-06-21 16:53:48 +08003424
qs.xiong9fbf74e2023-03-28 13:38:22 +08003425 if (idx == 1)
3426 {
you.chen6c2dd9c2022-05-16 17:55:28 +08003427 ifaName = "tether";
you.chen9ac66392022-08-06 17:01:16 +08003428 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003429 else if (idx != 0)
3430 {
you.chen35020192022-05-06 11:30:57 +08003431 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003432 }
you.chen35020192022-05-06 11:30:57 +08003433
you.chen9ac66392022-08-06 17:01:16 +08003434 if (getifaddrs(&ifaddr_header) == -1)
3435 {
you.chen35020192022-05-06 11:30:57 +08003436 perror("getifaddrs");
3437 return -1;
3438 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08003439 }
you.chen35020192022-05-06 11:30:57 +08003440
3441
you.chen9ac66392022-08-06 17:01:16 +08003442 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3443 {
3444 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08003445 continue;
you.chen9ac66392022-08-06 17:01:16 +08003446 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3447 {
3448 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3449 {
3450 // is a valid IP4 Address
3451 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3452 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003453 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08003454 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003455 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08003456 return 0;
3457 }
3458 }
3459 }
qs.xiongc4f007c2023-02-08 18:16:58 +08003460 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003461 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08003462 return -1;
you.chen35020192022-05-06 11:30:57 +08003463}
3464
3465int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3466{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003467 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08003468 int count;
3469 size_t i;
3470 char *split_words[128] = {0};
3471 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3472
3473 CHECK_WPA_CTRL(idx);
3474
3475 DO_REQUEST(lynq_get_mac_cmd);
3476
qs.xiong9fbf74e2023-03-28 13:38:22 +08003477 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3478 {
3479 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08003480 return -1;
3481 }
3482
3483 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3484
qs.xiong9fbf74e2023-03-28 13:38:22 +08003485 if (count < 2)
3486 {
you.chen35020192022-05-06 11:30:57 +08003487 return -1;
3488 }
3489
qs.xiong9fbf74e2023-03-28 13:38:22 +08003490 for (i=0; i < strlen(split_words[1]); i++ )
3491 {
3492 if (split_words[1][i] != ' ')
3493 {
you.chen35020192022-05-06 11:30:57 +08003494 break;
3495 }
3496 }
3497
3498 strcpy(mac, split_words[1] + i);
3499
3500 return 0;
3501}
3502
3503int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3504{
3505// int count;
3506// char *split_words[128] = {0};
3507// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3508
3509// if (rssi == NULL) {
3510// return -1;
3511// }
3512
3513// CHECK_IDX(idx, CTRL_STA);
3514
3515// CHECK_WPA_CTRL(CTRL_STA);
3516
3517// DO_REQUEST(lynq_get_rssi_cmd);
3518
3519// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3520// return -1;
3521// }
3522
3523// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3524
3525// if (count < 2) {
3526// return -1;
3527// }
3528
3529// *rssi = atoi(split_words[1]) * -1;
3530
you.chen35020192022-05-06 11:30:57 +08003531 char lynq_cmd_ret[MAX_RET]={0};
3532
qs.xiongff0ae0f2022-10-11 15:47:14 +08003533/*******change other cmd to get rssi*******
3534 *
3535 *wl rssi ---> wl -i wlan0 rssi
3536 *
3537 ***** change by qs.xiong 20221011*******/
you.chen23c4a5f2023-04-12 16:46:00 +08003538 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiong9fbf74e2023-03-28 13:38:22 +08003539 {
you.chen23c4a5f2023-04-12 16:46:00 +08003540 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen35020192022-05-06 11:30:57 +08003541 return -1;
3542 }
you.chen9f17e4d2022-06-06 17:18:18 +08003543 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003544/****** if got rssi is 0,means sta didn't connected any device****/
3545 if(*rssi == 0)
3546 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003547 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chen23c4a5f2023-04-12 16:46:00 +08003548 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003549 }
you.chen35020192022-05-06 11:30:57 +08003550
3551 return 0;
3552}
3553
3554int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3555{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003556 RLOGD("enter lynq_get_connect_ap_band\n");
3557 if (band == NULL)
3558 {
you.chen35020192022-05-06 11:30:57 +08003559 return -1;
3560 }
3561
3562 CHECK_IDX(idx, CTRL_STA);
3563 ap_info_s ap;
3564 ap.band = -1;
3565
qs.xiong9fbf74e2023-03-28 13:38:22 +08003566 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3567 {
you.chen35020192022-05-06 11:30:57 +08003568 return -1;
3569 }
3570 *band = ap.band;
3571
3572 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003573}
you.chenf58b3c92022-06-21 16:53:48 +08003574
3575int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3576{
qs.xionge4cbf1c2023-02-28 18:22:49 +08003577 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003578
3579 if (ip == NULL)
3580 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003581 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003582 return -1;
3583 }
3584
3585 CHECK_IDX(idx, CTRL_STA);
3586
qs.xionge4cbf1c2023-02-28 18:22:49 +08003587 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003588 {
3589 return -1;
3590 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003591
3592 return inner_get_ip_by_mac(bssid, ip, 32); //better input by user
you.chenf58b3c92022-06-21 16:53:48 +08003593}
3594
qs.xiong026c5c72022-10-17 11:15:45 +08003595int lynq_ap_connect_num(int sta_number)
3596{
3597 char lynq_limit_cmd[32]={0};
3598 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003599 if((sta_number < 1 ) && (sta_number > 15))
3600 {
3601 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003602 return -1;
3603 }
3604 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3605 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003606 if(ret != 0)
3607 {
3608 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003609 }
3610 return 0;
3611}
you.chenf58b3c92022-06-21 16:53:48 +08003612
qs.xiong77905552022-10-17 11:19:57 +08003613int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3614{
3615
3616 char lynq_wifi_acs_cmd[128]={0};
3617 char lynq_cmd_mode[128]={0};
3618 char lynq_cmd_slect[128]={0};
3619
qs.xiong9fbf74e2023-03-28 13:38:22 +08003620 if((acs_mode != 2) && (acs_mode != 5))
3621 {
qs.xiong77905552022-10-17 11:19:57 +08003622 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3623 }
3624
qs.xiong9fbf74e2023-03-28 13:38:22 +08003625 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3626 {
qs.xiong77905552022-10-17 11:19:57 +08003627 return -1;
3628 }
3629
3630 CHECK_IDX(idx, CTRL_AP);
3631
3632 CHECK_WPA_CTRL(CTRL_AP);
3633
3634 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3635 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3636 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3637
3638 DO_OK_FAIL_REQUEST(cmd_disconnect);
3639 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3640 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3641 DO_OK_FAIL_REQUEST(cmd_save_config);
3642 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3643
3644 return 0;
3645}
you.chen0f5c6432022-11-07 18:31:14 +08003646//you.chen add for tv-box start
3647static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3648 FILE *fp;
3649 //printf("to exec cmd:%s\n", str_cmd);
3650 if((fp=popen(str_cmd,"r"))==NULL)
3651 {
3652 perror("popen error!");
3653 return -1;
3654 }
3655 if((fread(str_cmd_ret,max_len,1,fp))<0)
3656 {
3657 perror("fread fail!");
3658 fclose(fp);
3659 return -1;
3660 }
3661 fclose(fp);
3662 return 0;
3663}
3664
3665static int get_netmask_length(const char* mask)
3666{
3667 int masklen=0, i=0;
3668 int netmask=0;
3669
3670 if(mask == NULL)
3671 {
3672 return 0;
3673 }
3674
3675 struct in_addr ip_addr;
3676 if( inet_aton(mask, &ip_addr) )
3677 {
3678 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003679 }else
3680 {
you.chen0f5c6432022-11-07 18:31:14 +08003681 netmask = 0;
3682 return 0;
3683 }
3684
3685 while(0 == (netmask & 0x01) && i<32)
3686 {
3687 i++;
3688 netmask = netmask>>1;
3689 }
3690 masklen = 32-i;
3691 return masklen;
3692}
3693
3694static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3695 int mask_len;
3696 char *p;
3697 char tmp[64] = {0};
3698 if (exec_cmd("ifconfig tether | grep Mask", str_cmd_ret, max_len) != 0)
3699 return -1;
3700 p = strstr(str_cmd_ret, "Mask:");
3701 if (p == NULL)
3702 return -1;
3703 mask_len = get_netmask_length(p + 5);
3704 if (mask_len == 0)
3705 return -1;
3706 p = strstr(str_cmd_ret, "inet addr:");
3707 if (p == NULL)
3708 return -1;
3709 strcpy(tmp, p + 10);
3710 p = strstr(tmp, " ");
3711 if (p != NULL)
3712 *p = '\0';
3713 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
3714 return 0;
3715}
3716
3717static void GBWWatchThreadProc() {
3718 int i,n, nloop, nmax, ncheckcount, nidlecount;
3719 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
3720 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
3721 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
3722 char *results[16] = {0};
3723 char str_cmd[256] = {0};
3724 char str_cmd_ret[128] = {0};
3725 char dest_ip[32] = {0};
3726 lastAP1Bytes = lastAP2Bytes = 0;
3727 lastAP1Drop = lastAP2Drop = 0;
3728 lastAP1Speed = lastAP2Speed = 0;
3729 setAP1Speed = 50;
3730 setAP2Speed = 80;
3731 nloop = 0;
3732 nmax = 6;
3733 ncheckcount = nidlecount = 0;
3734
qs.xiong9fbf74e2023-03-28 13:38:22 +08003735 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08003736 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
3737 while (dest_ip[0] == '\0') {
3738 sleep(1);
3739 str_cmd_ret[0] = '\0';
3740 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
3741 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
3742 if (str_cmd_ret[n] == '\n'){
3743 str_cmd_ret[n] = '\0';
3744 break;
3745 }
3746 }
3747 if (str_cmd_ret[0] != '\0')
3748 {
3749 strcpy(dest_ip, str_cmd_ret);
3750 }
3751 }
3752
3753 system("tc qdisc del dev tether root > /dev/null 2>&1");
3754 system("tc qdisc add dev tether root handle 1: htb r2q 1");
3755 system("tc class add dev tether parent 1: classid 1:1 htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000");
3756 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
3757 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003758 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08003759 return;
3760 }
3761 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);
3762 system(str_cmd);
3763 system("tc class add dev tether parent 1: classid 1:2 htb rate 80Mbit ceil 100Mbit prio 0 quantum 3000000");
3764 sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", dest_ip);
3765 //printf("----cmd:%s\n", str_cmd);
3766 system(str_cmd);
3767
3768 while (1) {
3769 sleep(1);
3770 memset(str_cmd, 0, sizeof(str_cmd));
3771 if (0 != exec_cmd("tc -s class show dev tether classid 1:1 | grep Sent", str_cmd, sizeof (str_cmd)))
3772 continue;
3773 //printf("ap1 --- %s\n", str_cmd);
3774 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3775 if (n > 9) {
3776 if (strcmp(results[1], "Sent") == 0) {
3777 currAP1Bytes = atoll(results[2]);
3778 }
3779 if (strcmp(results[6], "(dropped") == 0) {
3780 currAP1Drop = atoi(results[7]);
3781 }
3782 }
3783
3784 memset(str_cmd, 0, sizeof(str_cmd));
3785 if (0 != exec_cmd("tc -s class show dev tether classid 1:2 | grep Sent", str_cmd, sizeof (str_cmd)))
3786 continue;
3787 //printf("ap2 --- %s\n", str_cmd);
3788 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3789 if (n > 9) {
3790 if (strcmp(results[1], "Sent") == 0) {
3791 currAP2Bytes = atoll(results[2]);
3792 }
3793 if (strcmp(results[6], "(dropped") == 0) {
3794 currAP2Drop = atoi(results[7]);
3795 }
3796 }
3797
3798 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
3799 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
3800 lastAP1Bytes = currAP1Bytes;
3801 lastAP2Bytes = currAP2Bytes;
3802 continue;
3803 }
3804
3805 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
3806 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
3807 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
3808 lastAP1Speed = currAP1Speed;
3809 lastAP2Speed = currAP2Speed;
3810 lastAP1Bytes = currAP1Bytes;
3811 lastAP2Bytes = currAP2Bytes;
3812
3813 currSetAP1Speed = setAP1Speed;
3814 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
3815 ncheckcount++;
3816 if (ncheckcount > 3) {
3817 ncheckcount = 0;
3818 currSetAP1Speed = 5;
3819 }
3820 }
3821 else {
3822 ncheckcount = 0;
3823 if (currAP1Speed < 5)
3824 nidlecount++;
3825 else
3826 nidlecount = 0;
3827
3828 }
3829
3830 if (nidlecount > 60 ){
3831 currSetAP1Speed = 50;
3832 }
3833
3834 if (currSetAP1Speed != setAP1Speed) {
3835 setAP1Speed = currSetAP1Speed;
3836 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));
3837 //printf("------***change speed: %s\n", str_cmd);
3838 system(str_cmd);
3839 }
3840 }
3841}
3842
3843int enableGBW(const char* mac) {
3844 int i,len;
3845 char get_ipaddr_cmd[128]={0};
3846 ap_info_s *ap;
3847 device_info_s * list;
3848
3849 if (mac == NULL || g_gbw_enabled == 1)
3850 return -1;
3851 len = strlen(mac);
3852 g_gbw_mac = malloc(len + 1);
3853 for(i=0;i<len;i++) {
3854 if (mac[i] >= 'A' && mac[i] <= 'Z')
3855 {
3856 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
3857 }
3858 else
3859 g_gbw_mac[i] = mac[i];
3860 }
3861 g_gbw_mac[i] = '\0';
3862 g_gbw_enabled = 1;
3863
3864 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
3865 if (system(get_ipaddr_cmd) == 0) {
3866 //startGBW();
3867 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
3868 for (i=0;i<len;i++) {
3869 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
3870 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
3871 startGBW();
3872 }
3873 free(ap);
3874 free(list);
3875 }
3876 }
3877 return 0;
3878}
3879
3880int disableGBW() {
3881 stopGBW();
3882 free(g_gbw_mac);
3883 g_gbw_mac = NULL;
3884 g_gbw_enabled = 1;
3885 return 0;
3886}
3887
3888static int startGBW() {
3889 if (g_gbw_watcher_pid != 0) {
3890 stopGBW();
3891 }
3892 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
3893}
3894
3895static int stopGBW() {
3896 void* retval;
3897 pthread_cancel(g_gbw_watcher_pid);
3898 pthread_join(g_gbw_watcher_pid, &retval);
3899 g_gbw_watcher_pid = 0;
3900 system("tc qdisc del dev tether root");
3901}
3902//you.chen add for tv-box end