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