blob: 3f684f1d8fb431459cfdcc683fdaadb3b9d7ed9d [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"
qs.xiong7a105ce2022-03-02 09:43:11 -050025
qs.xiong1af5daf2022-03-14 09:12:12 -040026#ifdef __cplusplus
27extern "C" {
28#endif
29#ifdef __cplusplus
30}
31#endif
you.chen35020192022-05-06 11:30:57 +080032
qs.xiong9fbf74e2023-03-28 13:38:22 +080033#undef LOG_TAG
34#define LOG_TAG "LYNQ_WIFI"
you.chen35020192022-05-06 11:30:57 +080035#define MAX_CMD 128
36#define MAX_RET 4096
qs.xiongf1b525b2022-03-31 00:58:23 -040037#define MODE_LEN 10
you.chen35020192022-05-06 11:30:57 +080038#define CTRL_STA 0
39#define CTRL_AP 1
40#define AP_NETWORK_0 0
41
42pthread_t g_ap_watcher_pid = 0;
43volatile int g_ap_watcher_stop_flag = 0;
you.chena6fa5b22022-05-18 10:28:19 +080044volatile int g_ap_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080045
46pthread_t g_sta_watcher_pid = 0;
47volatile int g_sta_watcher_stop_flag = 0;
you.chen9ac66392022-08-06 17:01:16 +080048volatile int g_sta_scan_finish_flag = 1;
you.chena6fa5b22022-05-18 10:28:19 +080049volatile int g_sta_watcher_started_flag = 0;
you.chen35020192022-05-06 11:30:57 +080050
51void * g_ap_callback_priv = NULL;
52AP_CALLBACK_FUNC_PTR g_ap_callback_func = NULL;
53void * g_sta_callback_priv = NULL;
54STA_CALLBACK_FUNC_PTR g_sta_callback_func = NULL;
55
56//const char * CTRL_PATH="/var/run/wpa_supplicant";
57const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/ap0"};
58//const char * CTRL_PATH[2] = {"/var/run/wpa_supplicant/wlan0", "/var/run/wpa_supplicant/wlan0"};
59const char * cmd_list_networks = "LIST_NETWORKS";
60const char * cmd_save_config = "SAVE_CONFIG";
you.chen6c2dd9c2022-05-16 17:55:28 +080061const char * cmd_disconnect = "DISCONNECT";
62const char * cmd_remove_all = "REMOVE_NETWORK all";
you.chen35020192022-05-06 11:30:57 +080063const char * state_scan_result = "CTRL-EVENT-SCAN-RESULTS";
you.chen9ac66392022-08-06 17:01:16 +080064const char * STATE_COMPLETED = "COMPLETED";
you.chen35020192022-05-06 11:30:57 +080065
you.chenf711c8a2023-04-13 13:49:45 +080066const char * cmd_ping = "PING";
67const char * rsp_pong = "PONG";
68const int SLEEP_TIME_ON_IDLE = 100 * 1000; // usecond
69const int MAX_IDLE_COUNT = 600; // 60s
70
you.chend2fef3f2023-02-13 10:50:35 +080071struct local_wpa_ctrl{
72 struct wpa_ctrl *ctrl;
73 pthread_mutex_t mutex;
74};
75
76static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
77
78static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
you.chen35020192022-05-06 11:30:57 +080079
you.chen0f5c6432022-11-07 18:31:14 +080080//you.chen add for tv-box start
81volatile int g_gbw_enabled = 0;
82char * g_gbw_mac = NULL;
83pthread_t g_gbw_watcher_pid = 0;
84static int startGBW();
85static int stopGBW();
86//you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +080087
88typedef struct __curr_status_info {
89 ap_info_s *ap;
90 char * state;
91 int net_no;
92}curr_status_info;
qs.xiong97fa59b2022-04-07 05:41:29 -040093
you.chend2fef3f2023-02-13 10:50:35 +080094static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
95 char *reply, size_t *reply_len,
96 void (*msg_cb)(char *msg, size_t len))
97{
98 int ret;
99 if (ctrl->ctrl == NULL) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800100 RLOGE("local_wpa_ctrl_request ctrl is null\n");
you.chend2fef3f2023-02-13 10:50:35 +0800101 return -1;
102 }
103 pthread_mutex_lock(&ctrl->mutex);
104 ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
105 pthread_mutex_unlock(&ctrl->mutex);
106 return ret;
107}
108
109static struct local_wpa_ctrl * inner_get_wpa_ctrl(int index) {
110 int repeat_cnt;
111 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
112 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800113 RLOGD("inner_get_wpa_ctrl\n");
you.chend2fef3f2023-02-13 10:50:35 +0800114 for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
115 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
116// printf("wait enable finish\n");
117 usleep(500 * 1000);
118 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
119 }
120 if (NULL == g_lynq_wpa_ctrl[index]) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800121 RLOGE("NULL == g_lynq_wpa_ctrl[index]");
you.chend2fef3f2023-02-13 10:50:35 +0800122 goto out_addr;
123 }
124 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
125 g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
126 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800127 RLOGE("wpa_ctrl_open fail\n");
you.chend2fef3f2023-02-13 10:50:35 +0800128 goto out_addr;
129 }
130 pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
131 }
132 lynq_wpa_ctrl = g_lynq_wpa_ctrl[index];
133out_addr:
134 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
135 return lynq_wpa_ctrl;
136}
137
qs.xiong97fa59b2022-04-07 05:41:29 -0400138#define PRINT_AND_RETURN_VALUE(str,value) \
qs.xiong97fa59b2022-04-07 05:41:29 -0400139{\
you.chen35020192022-05-06 11:30:57 +0800140 perror((str));\
141 return (value);\
qs.xiong97fa59b2022-04-07 05:41:29 -0400142}
143
you.chen35020192022-05-06 11:30:57 +0800144#define CHECK_IDX(idx, type) do { \
145 if ( (idx == LYNQ_WIFI_INTERFACE_0 && type != CTRL_STA) || (idx == LYNQ_WIFI_INTERFACE_1 && type != CTRL_AP) \
146 || idx < LYNQ_WIFI_INTERFACE_0 || idx > LYNQ_WIFI_INTERFACE_1 ) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800147 RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
you.chen35020192022-05-06 11:30:57 +0800148 return -1; \
149 } \
150 }while (0)
151
152#define CHECK_WPA_CTRL(index) int ret = 0;\
153 size_t reply_len = MAX_RET; \
154 char cmd_reply[MAX_RET]={0}; \
you.chend2fef3f2023-02-13 10:50:35 +0800155 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
you.chen35020192022-05-06 11:30:57 +0800156 do{ \
you.chend2fef3f2023-02-13 10:50:35 +0800157 lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
158 if (NULL == lynq_wpa_ctrl) return -1; \
you.chen35020192022-05-06 11:30:57 +0800159 }while(0)
160
161#define DO_REQUEST(cmd_str) do { \
162 reply_len = MAX_RET;\
163 cmd_reply[0] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800164 RLOGD("to call [%s]\n", cmd_str); \
you.chend2fef3f2023-02-13 10:50:35 +0800165 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 +0800166 if (ret != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800167 RLOGE("call "#cmd_str" fail %d\n", ret); \
you.chen35020192022-05-06 11:30:57 +0800168 return ret; \
169 } \
170 cmd_reply[reply_len+1] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800171 RLOGD("cmd replay [ %s ]\n", cmd_reply); \
you.chen35020192022-05-06 11:30:57 +0800172 }while(0)
173
174#define DO_OK_FAIL_REQUEST(cmd_str) do { \
175 DO_REQUEST(cmd_str); \
176 if (reply_len >=4 && memcmp(cmd_reply, "FAIL", 4) == 0 ) {\
qs.xiong9fbf74e2023-03-28 13:38:22 +0800177 RLOGE("cmd "#cmd_str" return FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800178 return -1; \
179 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800180 RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800181 return -1; \
182 } \
183 }while (0)
184
185
you.chend2fef3f2023-02-13 10:50:35 +0800186static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
you.chen35020192022-05-06 11:30:57 +0800187
you.chenf711c8a2023-04-13 13:49:45 +0800188static int check_connection(struct wpa_ctrl * wpa_ctrl)
189{
190 size_t reply_len = MAX_RET;
191 char cmd_reply[MAX_RET]={0};
192 int ret;
193
194 RLOGD("check_connection [%p]", wpa_ctrl);
195 ret = wpa_ctrl_request(wpa_ctrl, cmd_ping, strlen(cmd_ping), cmd_reply, &reply_len, NULL);
196
197 if (ret != 0 || reply_len < 4 || memcmp(cmd_reply, rsp_pong, 4) != 0)
198 {
199 RLOGE("check_connection error: ctrl [%p], ret [%d], reply_len [%d], rsp [%s]", wpa_ctrl, ret, reply_len, cmd_reply);
200 return -1;
201 }
202
203 return 0;
204}
205
206/**
207 * @brief check_pending_msg
208 * @param lynq_wpa_ctrl
209 * @return 1 has msg, 0 no msg, -1 error
210 */
211static int check_pending_msg(struct wpa_ctrl ** pp_lynq_wpa_ctrl, int type, int* idle_count, int *started_flag)
212{
213 int ret;
214
215 if (*pp_lynq_wpa_ctrl == NULL) // need connect
216 {
217 *pp_lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[type]); //@todo temp change
218 if (*pp_lynq_wpa_ctrl == NULL)
219 {
220 usleep(SLEEP_TIME_ON_IDLE);
221 return -1;
222 }
223
224 ret = wpa_ctrl_attach(*pp_lynq_wpa_ctrl);
225 if (ret == 0) // attach success
226 {
227 *started_flag = 1;
228 }
229 else
230 {
231 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
232 *pp_lynq_wpa_ctrl = NULL;
233 *idle_count = 0;
234 usleep(SLEEP_TIME_ON_IDLE);
235 return -1;
236 }
237 }
238
239 ret = wpa_ctrl_pending(*pp_lynq_wpa_ctrl);
240 if ( ret == 0) // no pending messages
241 {
242 usleep(SLEEP_TIME_ON_IDLE);
243 *idle_count += 1;
244 if (*idle_count > MAX_IDLE_COUNT)
245 {
246 if (check_connection(*pp_lynq_wpa_ctrl) != 0)
247 {
248 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
249 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
250 *pp_lynq_wpa_ctrl = NULL;
251 *idle_count = 0;
252 return -1;
253 }
254 *idle_count = 0;
255 }
256 return 0;
257 }
258 else if ( ret == -1) // on error
259 {
260 RLOGE("[wifi error]sta wpa_ctrl_pending");
261 wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
262 wpa_ctrl_close(*pp_lynq_wpa_ctrl);
263 *pp_lynq_wpa_ctrl = NULL;
264 *idle_count = 0;
265 return -1;
266 }
267
268 *idle_count = 0;
269 return 1;
270}
271
you.chen35020192022-05-06 11:30:57 +0800272static void APWatcherThreadProc() {
273 size_t len = MAX_RET;
274 char msg_notify[MAX_RET];
you.chenf711c8a2023-04-13 13:49:45 +0800275 int idle_count = 0;
you.chen35020192022-05-06 11:30:57 +0800276
you.chen6c2dd9c2022-05-16 17:55:28 +0800277 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800278 g_ap_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800279
qs.xiong9fbf74e2023-03-28 13:38:22 +0800280 while (g_ap_watcher_stop_flag == 0)
281 {
you.chenf711c8a2023-04-13 13:49:45 +0800282 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_AP, &idle_count, &g_ap_watcher_started_flag) != 1)
283 {
you.chen35020192022-05-06 11:30:57 +0800284 continue;
285 }
you.chenf711c8a2023-04-13 13:49:45 +0800286
you.chen6c2dd9c2022-05-16 17:55:28 +0800287 memset(msg_notify, 0, MAX_RET);
288 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800289 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
you.chenf711c8a2023-04-13 13:49:45 +0800290 {
you.chen35020192022-05-06 11:30:57 +0800291 msg_notify[len+1] = '\0';
qs.xiong455c30b2023-04-12 11:40:02 +0800292 RLOGD("APWatcherThreadProc ap------> %s\n", msg_notify);
you.chenf711c8a2023-04-13 13:49:45 +0800293 //you.chen change for tv-box start
qs.xiong9fbf74e2023-03-28 13:38:22 +0800294 if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800295 {
you.chen0f5c6432022-11-07 18:31:14 +0800296 if (g_ap_callback_func != NULL)
297 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_DISCONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800298 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800299 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800300 RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
301 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800302 {
you.chen0f5c6432022-11-07 18:31:14 +0800303 stopGBW();
304 }
305 }
you.chen35020192022-05-06 11:30:57 +0800306 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800307 else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800308 {
you.chen0f5c6432022-11-07 18:31:14 +0800309 if (g_ap_callback_func != NULL)
310 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_CONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800311 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800312 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800313 RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
314 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
you.chenf711c8a2023-04-13 13:49:45 +0800315 {
you.chen0f5c6432022-11-07 18:31:14 +0800316 startGBW();
317 }
318 }
you.chen35020192022-05-06 11:30:57 +0800319 }
you.chenf711c8a2023-04-13 13:49:45 +0800320 //you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +0800321 } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
322 } // end while (g_ap_watcher_stop_flag == 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800323 if (lynq_wpa_ctrl != NULL)
324 {
you.chen92fd5d32022-05-25 10:09:47 +0800325 wpa_ctrl_detach(lynq_wpa_ctrl);
326 wpa_ctrl_close(lynq_wpa_ctrl);
327 }
qs.xiong97fa59b2022-04-07 05:41:29 -0400328}
329
qs.xiong455c30b2023-04-12 11:40:02 +0800330void get_state_error(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error)
331{
332 char *pReason;
333 *error = LYNQ_WAIT_CONNECT_ACTIVE;
334 if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
335 {
336 *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
337 RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d\n",*state,*error);
338 return;
339 }
340
341 if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
342 {
343 *state = LYNQ_WIFI_STA_STATUS_CONNECT;
344 RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
345 return;
346 }
347
348 if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
349 {
350 pReason = strstr(modify, "reason=");
351 if (pReason != NULL)
352 {
353 pReason += strlen("reason=");
354 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
355 {
356 *error = LYNQ_TIME_OUT;
357 }
358 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
359 {
360 *error = LYNQ_PSW_ERROR;
361 }
362 else
363 {
364 *error = LYNQ_UNSPECIFIED_REASON;
365 }
366 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
367 RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d\n",*state,*error);
368 return;
369 }
370 else
371 {
372 *error = LYNQ_UNSPECIFIED_REASON;
373 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
374 return;
375 }
376
377 }
378
379 if (strstr(modify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
380 {
381 *error = LYNQ_NOT_FIND_AP;
382 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
383 RLOGD("CTRL-EVENT-NETWORK-NOT-FOUND state:%d,error:%d\n",*state,*error);
384 return;
385 }
386
387
388 if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
389 {
390 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
391 pReason = strstr(modify, "status_code=");
392 if (pReason != NULL)
393 {
394 pReason += strlen("status_code=");
395 if (memcmp(pReason, "17", 2) == 0)
396 {
397 *error = LYNQ_AP_UNABLE_HANDLE;
398 }
399 else if (memcmp(pReason, "1",1) == 0)
400 {
401 *error = LYNQ_UNSPECIFIED_REASON;
402 }
403 else
404 {
405 *error = LYNQ_UNSPECIFIED_REASON;
406 }
407
408 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
409 RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d\n",*state,*error);
410 return;
411 }
412 else
413 {
414 RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
415 *error = LYNQ_UNSPECIFIED_REASON;
416 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
417 RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d\n",*state,*error);
418 return;
419 }
420 }
421
422 if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
423 {
424 RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
425 *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
426 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
427 RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d\n",*state,*error);
428 return;
429 }
430
431 if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
432 {
433 RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
434 *error = LYNQ_WAIT_CONNECT_ACTIVE;
435 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
436 RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
437 return;
438 }
439
440 *error = LYNQ_UNSPECIFIED_REASON;
441 *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
442 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
443 return;
444
445}
446
you.chen35020192022-05-06 11:30:57 +0800447static void STAWatcherThreadProc() {
448 size_t len = MAX_RET;
449 char msg_notify[MAX_RET];
you.chen35020192022-05-06 11:30:57 +0800450 error_number_s error;
qs.xiong455c30b2023-04-12 11:40:02 +0800451 lynq_wifi_sta_status_s state;
you.chenf711c8a2023-04-13 13:49:45 +0800452 int idle_count = 0;
qs.xiongf1b525b2022-03-31 00:58:23 -0400453
you.chen6c2dd9c2022-05-16 17:55:28 +0800454 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800455 g_sta_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800456
qs.xiong9fbf74e2023-03-28 13:38:22 +0800457 while (g_sta_watcher_stop_flag == 0)
458 {
you.chenf711c8a2023-04-13 13:49:45 +0800459 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
qs.xiong455c30b2023-04-12 11:40:02 +0800460 {
you.chen35020192022-05-06 11:30:57 +0800461 continue;
462 }
you.chenf711c8a2023-04-13 13:49:45 +0800463
you.chen6c2dd9c2022-05-16 17:55:28 +0800464 memset(msg_notify, 0, MAX_RET);
465 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800466 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiong455c30b2023-04-12 11:40:02 +0800467 {
you.chen35020192022-05-06 11:30:57 +0800468 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800469 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
470 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800471 {
you.chen35020192022-05-06 11:30:57 +0800472 g_sta_scan_finish_flag = 1;
473 }
474
qs.xiong9fbf74e2023-03-28 13:38:22 +0800475 if (g_sta_callback_func == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800476 {
you.chen35020192022-05-06 11:30:57 +0800477 continue;
478 }
qs.xiong455c30b2023-04-12 11:40:02 +0800479 get_state_error(msg_notify,&state,&error);
you.chenf711c8a2023-04-13 13:49:45 +0800480 RLOGD("STAWatcherThreadProc callback begin ------> %d %d\n", state, error);
qs.xiong455c30b2023-04-12 11:40:02 +0800481 g_sta_callback_func(g_sta_callback_priv, state, error);
you.chenf711c8a2023-04-13 13:49:45 +0800482 RLOGD("STAWatcherThreadProc callback end ------> %d %d\n", state, error);
you.chen35020192022-05-06 11:30:57 +0800483 }
484 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800485 if (lynq_wpa_ctrl != NULL)
486 {
you.chen92fd5d32022-05-25 10:09:47 +0800487 wpa_ctrl_detach(lynq_wpa_ctrl);
488 wpa_ctrl_close(lynq_wpa_ctrl);
489 }
qs.xiongf1b525b2022-03-31 00:58:23 -0400490}
491
qs.xiong1af5daf2022-03-14 09:12:12 -0400492int lynq_wifi_enable(void)
493{
you.chen35020192022-05-06 11:30:57 +0800494 int ret = 0;
you.chen6c2dd9c2022-05-16 17:55:28 +0800495 int i;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800496 RLOGD("enter lynq_wifi_enable");
you.chend2fef3f2023-02-13 10:50:35 +0800497 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
498
qs.xiong9fbf74e2023-03-28 13:38:22 +0800499 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
500 {
you.chend2fef3f2023-02-13 10:50:35 +0800501 goto out_enable;
502 }
503
you.chen35020192022-05-06 11:30:57 +0800504 const char * cmd_check_service =
505 "state=`systemctl is-active wg870_drv_insmod.service`\n"
506 "[ \"\"$state == \"active\" ] && exit 0\n"
507 "[ \"\"$state == \"inactive\" ] && systemctl start wg870_drv_insmod.service\n";
508// if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL) {
509// return 0;
510// }
qs.xiong1af5daf2022-03-14 09:12:12 -0400511
you.chen35020192022-05-06 11:30:57 +0800512 ret = system(cmd_check_service);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800513 if (ret != 0)
514 {
515 //printf("service state %d\n", ret);
516 RLOGE("[wifi error]service state %d",ret);
you.chend2fef3f2023-02-13 10:50:35 +0800517 ret = -1;
518 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800519 }
lhfe8da902022-10-11 18:55:36 +0800520
qs.xiong9fbf74e2023-03-28 13:38:22 +0800521 RLOGD("check service state is OK");
522 for (i=0; i<10; i++)
523 {
you.chena6fa5b22022-05-18 10:28:19 +0800524 if (system("connmanctl technologies | grep -q \"/net/connman/technology/wifi\"") == 0) {
you.chen6c2dd9c2022-05-16 17:55:28 +0800525 break;
526 }
527 usleep(300*1000);
528 }
529
qs.xiong9fbf74e2023-03-28 13:38:22 +0800530 if (i >= 10)
531 {
532 RLOGE("[wifi error] check connman technologies no wifi");
you.chend2fef3f2023-02-13 10:50:35 +0800533 ret = -1;
534 goto out_enable;
you.chen6c2dd9c2022-05-16 17:55:28 +0800535 }
536
you.chen9f17e4d2022-06-06 17:18:18 +0800537 //@todo delete add temp check for socket avilable start (20220606)
538 for (i=0; i<60; i++)
539 {
540 if (system("netstat -an | grep -q DGRAM") == 0) {
541 break;
542 }
543 sleep(1);
544 }
545
546 if (i >= 60)
547 {
you.chend2fef3f2023-02-13 10:50:35 +0800548 ret = -1;
549 goto out_enable;
you.chen9f17e4d2022-06-06 17:18:18 +0800550 }
551 //@todo delete add temp check for socket avilable end (20220606)
552
qs.xiong9fbf74e2023-03-28 13:38:22 +0800553 if (0 != system("ifconfig | grep -q ap0"))
554 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800555 system("connmanctl enable wifi");
you.chena6fa5b22022-05-18 10:28:19 +0800556 usleep(300*1000);
you.chen01bfac32022-06-07 10:36:00 +0800557 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disconnect");
you.chen6c2dd9c2022-05-16 17:55:28 +0800558 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 DRIVER interface_create ap0");
you.chena6fa5b22022-05-18 10:28:19 +0800559 usleep(300*1000);
you.chen6c2dd9c2022-05-16 17:55:28 +0800560 system("connmanctl tether wifi on lynq 1qaz@WSX#$%^");
you.chena6fa5b22022-05-18 10:28:19 +0800561 usleep(300*1000);
you.chen01bfac32022-06-07 10:36:00 +0800562 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=ap0 disconnect");
you.chen6c2dd9c2022-05-16 17:55:28 +0800563 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800564 if (g_ap_watcher_pid == 0 )
qs.xiong55f32762023-02-16 15:59:45 +0800565 {
you.chen35020192022-05-06 11:30:57 +0800566 ret=pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800567 if(ret<0)
568 {
569 RLOGE("[wifi error]creat APWatcherThreadProc fail");
you.chend2fef3f2023-02-13 10:50:35 +0800570 ret = -1;
571 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800572 }
573 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800574
575 RLOGD("creat APWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +0800576 if (g_sta_watcher_pid == 0 ) {
577 ret=pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800578 if(ret<0)
579 {
580 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
you.chend2fef3f2023-02-13 10:50:35 +0800581 ret = -1;
582 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800583 }
584 }
585
qs.xiong9fbf74e2023-03-28 13:38:22 +0800586 RLOGD("creat STAWatcherTheradProc susccs");
587 for (i=0; i<10; i++)
588 {
you.chena6fa5b22022-05-18 10:28:19 +0800589 usleep(300*1000);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800590 if (g_ap_watcher_started_flag == 1 && g_sta_watcher_started_flag == 1)
591 {
you.chena6fa5b22022-05-18 10:28:19 +0800592 break;
593 }
594 }
595
you.chend2fef3f2023-02-13 10:50:35 +0800596 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
597 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
598 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
599 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
600out_enable:
601 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800602 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500603}
604
qs.xiong1af5daf2022-03-14 09:12:12 -0400605int lynq_wifi_disable(void)
606{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800607 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800608 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800609 g_ap_watcher_stop_flag = 1;
610 g_sta_watcher_stop_flag = 1;
611 if (g_ap_watcher_pid != 0)
612 pthread_join(g_ap_watcher_pid, NULL);
613 if (g_sta_watcher_pid != 0)
614 pthread_join(g_sta_watcher_pid, NULL);
615 if (g_lynq_wpa_ctrl[0] != NULL)
616 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
617 if (g_lynq_wpa_ctrl[1] != NULL)
618 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
619 g_ap_watcher_pid = 0;
620 g_sta_watcher_pid = 0;
621 g_lynq_wpa_ctrl[0] = NULL;
622 g_lynq_wpa_ctrl[1] = NULL;
623 system("systemctl stop wg870_drv_insmod.service");
you.chend2fef3f2023-02-13 10:50:35 +0800624 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
625 return 0;
626}
627
628static inline char inner_convert_char(char in)
629{
630 if (in >= '0' && in <= '9')
631 {
632 return in - '0';
633 }
634 else if (in >= 'a' && in <= 'f')
635 {
636 return in - 'a' + 10;
637 }
638 else if (in >= 'A' && in <= 'F')
639 {
640 return in - 'A' + 10;
641 }
642 else
643 {
644 return '\xff';
645 }
646}
647
648static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
649{
650 char *p;
651 size_t pos = 0;
652 if (NULL == out_ssid)
653 return;
654 //printf("input ssid=[%s]\n", ssid);
655 memset(out_ssid, 0, out_ssid_len);
656 if (NULL == ssid)
657 return;
658 p = strchr(ssid, '\\');
659 if (NULL == p)
660 {
661 strncpy(out_ssid, ssid, out_ssid_len);
662 //printf(" first %s\n", out_ssid);
663 }
664 else
665 {
666 pos = p - ssid;
667 memcpy(out_ssid, ssid, pos);
668 //printf("pos %lu -- %s\n", pos, out_ssid);
669 for(; pos < out_ssid_len; pos ++)
670 {
671 if (p[0] == '\0')
672 {
673 //printf(" out %s\n", out_ssid);
674 return;
675 }
676 else if (p[0] != '\\')
677 {
678 out_ssid[pos] = p[0];
679 p += 1;
680 }
681 else if (p[1] == 'x' || p[1] == 'X')
682 {
683 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
684 p += 4;
685 }
686 else if (p[1] == '\\')
687 {
688 out_ssid[pos] = '\\';
689 p += 2;
690 }
691 else if (p[1] == 't')
692 {
693 out_ssid[pos] = '\t';
694 p += 2;
695 }
696 else if (p[1] == 'r')
697 {
698 out_ssid[pos] = '\r';
699 p += 2;
700 }
701 else if (p[1] == 'n')
702 {
703 out_ssid[pos] = '\n';
704 p += 2;
705 }//todo find a better way to convert?
706 }
707 }
708 //printf(" out %s\n", out_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -0500709}
qs.xiong1af5daf2022-03-14 09:12:12 -0400710
you.chen35020192022-05-06 11:30:57 +0800711static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +0800712 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +0800713 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +0800714 RLOGD("enter inner_get_param");
715 if (out_put == NULL)
716 {
717 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +0800718 return -1;
719 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800720 if (param_name == NULL)
721 {
722 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +0800723 return -1;
724 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800725 if (param_name[0] == '\0')
726 {
727 RLOGE("param is empty");
you.chen35020192022-05-06 11:30:57 +0800728 return -1;
729 }
730
731 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
732
733 CHECK_WPA_CTRL(interface);
734
735 DO_REQUEST(lynq_cmd_get);
736
qs.xiong9fbf74e2023-03-28 13:38:22 +0800737 if (memcmp(cmd_reply, "FAIL", 4) == 0)
738 {
739 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +0800740 return -1;
741 }
742
you.chena6fa5b22022-05-18 10:28:19 +0800743// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +0800744 if (strcmp(param_name, "ssid") == 0)
745 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800746 if (cmd_reply[0] == '\"')
747 {
you.chend2fef3f2023-02-13 10:50:35 +0800748 ssid_len = reply_len - 1;
749 memcpy(out_put, cmd_reply + 1, ssid_len);
750 if (out_put[ssid_len-1] == '\"')
751 {
752 out_put[ssid_len-1] = '\0';
753 }
754 else
755 {
756 out_put[ssid_len] = '\0';
757 }
758 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800759 else
760 {
you.chend2fef3f2023-02-13 10:50:35 +0800761 ssid_len = reply_len / 2;
762 for(i=0; i<ssid_len; i++)
763 {
764 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
765 }
766 out_put[ssid_len] = '\0';
767 }
768 }
769 else
770 {
771 memcpy(out_put, cmd_reply, reply_len + 1);
772 }
you.chen35020192022-05-06 11:30:57 +0800773 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -0500774}
qs.xiong1af5daf2022-03-14 09:12:12 -0400775
you.chen35020192022-05-06 11:30:57 +0800776static int lynq_split(char * str, int len, char delimiter, char * results[]) {
777 int ret = 0;
778 char * end = str + len - 1;
779 results[ret++] = str;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800780 while(str < end)
781 {
782 if (*str == delimiter)
783 {
you.chen35020192022-05-06 11:30:57 +0800784 *str++ = '\0';
785 results[ret++] = str;
786 continue;
787 }
788 str++;
789 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800790 if (*str == delimiter)
791 {
you.chen35020192022-05-06 11:30:57 +0800792 *str = '\0';
793 }
qs.xiong1af5daf2022-03-14 09:12:12 -0400794
you.chen35020192022-05-06 11:30:57 +0800795 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500796}
797
you.chend2fef3f2023-02-13 10:50:35 +0800798static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
799{
800 char * p;
801 int ret = 0;
802 char cmd[256]={0};
803 if (NULL == mac || NULL == ip)
you.chen35020192022-05-06 11:30:57 +0800804 return -1;
you.chend2fef3f2023-02-13 10:50:35 +0800805 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +0800806 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-02-13 10:50:35 +0800807 ret = exec_cmd(cmd, ip, ip_len);
808 p = strchr(ip, '\n');
809 if (NULL != p)
810 {
811 *p = '\0';
you.chen35020192022-05-06 11:30:57 +0800812 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800813 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +0800814 return ret;
815}
816
you.chend2fef3f2023-02-13 10:50:35 +0800817static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +0800818 struct in_addr addr ={0};
819 struct hostent *ht;
820
qs.xiong9fbf74e2023-03-28 13:38:22 +0800821 if (ip == NULL || *ip == '\0' || hostname == NULL)
822 {
823 RLOGE("ip == NULL or hostname == NULL");
824 return -1;
you.chen35020192022-05-06 11:30:57 +0800825 }
826
you.chend2fef3f2023-02-13 10:50:35 +0800827 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800828 if (inet_aton(ip, &addr) == 0)
829 {
you.chen35020192022-05-06 11:30:57 +0800830 printf("---inet_aton fail\n");
831 return -1;
832 }
833
834 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
835
qs.xiong9fbf74e2023-03-28 13:38:22 +0800836 if (ht == NULL)
837 {
838 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-05-06 11:30:57 +0800839 herror(NULL);
840 return -1;
841 }
842
843 strcpy(hostname, ht->h_name);
844
845 return 0;
846}
847
848static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
849{
850 int count, index, words_count;
851 char * split_lines[128]= {0};
852 char * split_words[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +0800853 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +0800854 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +0800855 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-05-06 11:30:57 +0800856
857 CHECK_WPA_CTRL(ap_sta);
858
859 DO_REQUEST(lynq_wifi_list_networks);
860
861 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
862
863 //@todo check ssid field to compatible
864
865 ret = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800866 for(index=1; index < count; index++)
867 {
you.chen35020192022-05-06 11:30:57 +0800868 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800869 if (words_count > 2)
870 {
you.chend2fef3f2023-02-13 10:50:35 +0800871 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +0800872 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
873 {
you.chen35020192022-05-06 11:30:57 +0800874 net_no_list[ret++] = atoi(split_words[0]);
875 }
876 }
877 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800878 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +0800879 return ret;
880}
881
882static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +0800883 size_t i=0;
you.chen35020192022-05-06 11:30:57 +0800884 CHECK_WPA_CTRL(ap_sta);
885 const char *lynq_wifi_add_network = "ADD_NETWORK";
886
qs.xiong9fbf74e2023-03-28 13:38:22 +0800887 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +0800888 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800889 if (memcmp(cmd_reply, "FAIL", 4) == 0)
890 {
891 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen35020192022-05-06 11:30:57 +0800892 return -1;
893 }
894
qs.xiong9fbf74e2023-03-28 13:38:22 +0800895 for(i=0;i<reply_len;i++)
896 {
897 if(cmd_reply[i] == '\n')
898 {
you.chen35020192022-05-06 11:30:57 +0800899 cmd_reply[i] = '\0';
900 break;
901 }
902 }
903 return atoi(cmd_reply);
904}
you.chena6cd55a2022-05-08 12:20:18 +0800905
you.chen35020192022-05-06 11:30:57 +0800906static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
907{
908 int count, index;
909 int net_no_list[128];
910
qs.xiong9fbf74e2023-03-28 13:38:22 +0800911 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +0800912 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800913 for (index=0; index < count; index++)
914 {
915 if (net_no_list[index] == net_no)
916 {
you.chen35020192022-05-06 11:30:57 +0800917 return 0;
918 }
919 }
920
921 if (count >= 1)
922 index = net_no_list[count - 1];
923 else
924 index = -1;
925
qs.xiong9fbf74e2023-03-28 13:38:22 +0800926 while (index < net_no )
927 {
you.chen35020192022-05-06 11:30:57 +0800928 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800929 if (index >= net_no)
930 { // required network no created
931 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +0800932 return 0;
933 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800934 else if( index < 0)
935 {
936 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +0800937 return -1;
938 }
you.chen35020192022-05-06 11:30:57 +0800939 }
940
941 if (index < 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800942 {
943 RLOGE("[lynq_check_network_number] network index < 0");
944 return -1;
945 }
946 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen35020192022-05-06 11:30:57 +0800947 return 0;
948}
949
950static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +0800951 if (freq > 5000 && freq < 6000)
952 {
you.chen35020192022-05-06 11:30:57 +0800953 return LYNQ_WIFI_5G_band;
954 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800955 else if (freq > 2000 && freq < 3000)
956 {
you.chen35020192022-05-06 11:30:57 +0800957 return LYNQ_WIFI_2G_band;
958 }
959 return LYNQ_WIFI_2_and_5G_band;
960}
961
962static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800963 if (key_mgmt != NULL)
964 {
965 if (memcmp( key_mgmt, "NONE", 4) == 0)
966 {
you.chen35020192022-05-06 11:30:57 +0800967 return LYNQ_WIFI_AUTH_OPEN;
968 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800969 else if (memcmp( key_mgmt, "WEP", 3) == 0)
970 {
you.chen35020192022-05-06 11:30:57 +0800971 return LYNQ_WIFI_AUTH_WEP;
972 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800973 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
974 {
you.chen35020192022-05-06 11:30:57 +0800975 return LYNQ_WIFI_AUTH_WPA_PSK;
976 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800977 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
978 {
you.chen35020192022-05-06 11:30:57 +0800979 return LYNQ_WIFI_AUTH_WPA2_PSK;
980 }
981 }
982
983 return -1;
984}
985
986static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800987 if (flag != NULL)
988 {
qs.xiong3e506812023-04-06 11:08:48 +0800989 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
990 {
991 return LYNQ_WIFI_AUTH_WPA3_PSK;
992 }else if ( strstr( flag,"SAE-CCMP") != NULL )
993 {
994 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
995 }else if (strstr( flag, "WPA2-PSK") != NULL)
996 {
you.chen35020192022-05-06 11:30:57 +0800997 return LYNQ_WIFI_AUTH_WPA2_PSK;
998 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800999 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001000 {
you.chen35020192022-05-06 11:30:57 +08001001 return LYNQ_WIFI_AUTH_WPA_PSK;
1002 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001003 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001004 {
you.chen35020192022-05-06 11:30:57 +08001005 return LYNQ_WIFI_AUTH_WEP;
1006 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001007 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001008 {
you.chen35020192022-05-06 11:30:57 +08001009 return LYNQ_WIFI_AUTH_OPEN;
1010 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001011 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +08001012 {
you.chend2fef3f2023-02-13 10:50:35 +08001013 return LYNQ_WIFI_AUTH_OPEN;
1014 }
you.chen35020192022-05-06 11:30:57 +08001015 }
1016
1017 return -1;
1018}
1019
1020static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
1021 switch (bw) {
1022 case 10:
1023 return LYNQ_WIFI_BANDWIDTH_HT10;
1024 break;
1025 case 20:
1026 return LYNQ_WIFI_BANDWIDTH_HT20;
1027 break;
1028 case 40:
1029 return LYNQ_WIFI_BANDWIDTH_HT40;
1030 break;
1031 case 80:
1032 return LYNQ_WIFI_BANDWIDTH_HT80;
1033 break;
1034 default:
1035 break;
1036 }
1037
1038 return -1;
1039}
1040
1041static int inner_get_status_info(int interface, curr_status_info *curr_state) {
1042 int i, count;
1043 char *p;
1044 const char *lynq_status_cmd = "STATUS";
1045 const char * FLAG_SSID = "ssid=";
1046 const char * FLAG_SBSID = "bssid=";
1047 const char * FLAG_KEY_MGMT = "key_mgmt=";
1048 const char * FLAG_FREQ = "freq=";
1049 const char * FLAG_STATE = "wpa_state=";
1050 const char * FLAG_ID = "id=";
you.chend2fef3f2023-02-13 10:50:35 +08001051 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +08001052 char *split_lines[128] = {0};
1053
1054 CHECK_WPA_CTRL(interface);
1055
qs.xiong9fbf74e2023-03-28 13:38:22 +08001056 if (curr_state == NULL)
1057 {
1058 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-05-06 11:30:57 +08001059 return -1;
1060 }
1061
1062 DO_REQUEST(lynq_status_cmd);
1063
1064 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1065
1066 curr_state->net_no = -1;
1067 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001068 for(i=0; i < count; i++)
1069 {
1070 if (curr_state->ap != NULL)
1071 {
you.chen35020192022-05-06 11:30:57 +08001072 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001073 if (p != NULL)
1074 {
you.chend2fef3f2023-02-13 10:50:35 +08001075 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +08001076 ret = 0;
1077 continue;
1078 }
you.chenf58b3c92022-06-21 16:53:48 +08001079 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001080 if (p != NULL)
1081 {
you.chend2fef3f2023-02-13 10:50:35 +08001082 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 +08001083 ret = 0;
1084 continue;
1085 }
you.chen35020192022-05-06 11:30:57 +08001086 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001087 if (p != NULL)
1088 {
you.chen450d0172022-07-15 17:56:48 +08001089 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001090 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +08001091 ret = 0;
1092 continue;
1093 }
1094 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001095 if (p != NULL)
1096 {
you.chen35020192022-05-06 11:30:57 +08001097 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1098 ret = 0;
1099 continue;
1100 }
you.chend2fef3f2023-02-13 10:50:35 +08001101 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001102 if (p != NULL)
1103 {
you.chend2fef3f2023-02-13 10:50:35 +08001104 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1105 ret = 0;
1106 continue;
1107 }
you.chen35020192022-05-06 11:30:57 +08001108 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001109 if (curr_state->state != NULL)
1110 {
you.chen35020192022-05-06 11:30:57 +08001111 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001112 if (p != NULL)
1113 {
you.chen35020192022-05-06 11:30:57 +08001114 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1115 ret = 0;
1116 continue;
1117 }
1118
1119 } //end else if (state != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001120 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
1121 {
you.chen35020192022-05-06 11:30:57 +08001122 ret = 0;
you.chen450d0172022-07-15 17:56:48 +08001123 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001124 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +08001125 }
1126 }
1127
1128 return ret;
1129}
1130
1131
qs.xiongf1b525b2022-03-31 00:58:23 -04001132int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001133{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001134 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +08001135 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -05001136
qs.xiong9fbf74e2023-03-28 13:38:22 +08001137 if (ap_ssid == NULL)
1138 {
1139 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +08001140 return -1;
1141 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001142 else
1143 {
1144 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen35020192022-05-06 11:30:57 +08001145 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001146
qs.xiong9fbf74e2023-03-28 13:38:22 +08001147 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1148 {
1149 RLOGE("Do check ap network_number fail");
you.chen35020192022-05-06 11:30:57 +08001150 return -1;
1151 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001152
you.chen35020192022-05-06 11:30:57 +08001153 CHECK_IDX(idx, CTRL_AP);
1154
1155 CHECK_WPA_CTRL(CTRL_AP);
1156
1157 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1158
1159 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1160 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001161 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1162 return 0;
you.chen35020192022-05-06 11:30:57 +08001163
qs.xiong7a105ce2022-03-02 09:43:11 -05001164}
1165
you.chen35020192022-05-06 11:30:57 +08001166int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001167{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001168 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001169 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001170 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001171}
1172
qs.xiongc9c79f72022-10-17 15:27:18 +08001173/*****
1174 *frequency <------>channel
1175 *
1176 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1177 *
1178 *
1179 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1180 *
1181 *
1182 * */
1183static int lynq_check_set_frequency(int input_frequency){
qs.xiongc00b6032022-11-29 16:28:03 +08001184 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};
1185 int i;
1186 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1187
qs.xiong69a332b2022-12-02 09:58:57 +08001188 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001189 {
1190 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001191 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001192 }
qs.xiongc00b6032022-11-29 16:28:03 +08001193
1194 if(i == arr_len)
1195 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001196 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001197 return -1;
1198 }
qs.xiongc00b6032022-11-29 16:28:03 +08001199
qs.xiongc9c79f72022-10-17 15:27:18 +08001200 return 0;
1201}
qs.xiong13673462023-02-21 19:12:54 +08001202
1203static int lynq_check_frequencyby_country_code(int input_frequency)
1204{
1205 char str_cnc[]="CN";
1206 char str_dest[20]="";
1207
1208 if( lynq_get_country_code(1,str_dest) != 0 )
1209 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001210 RLOGE("get country_code error\n");
qs.xiong13673462023-02-21 19:12:54 +08001211 return -1;
1212 }
1213 if( strncmp(str_dest,str_cnc,2) != 0 )
1214 {
1215 return 0;
1216 }else if( 2473 < input_frequency && input_frequency < 5744)
1217 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001218 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001219 return -1;
1220 }
1221 return 0;
1222}
qs.xiongf1b525b2022-03-31 00:58:23 -04001223int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001224{
qs.xiongc00b6032022-11-29 16:28:03 +08001225 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001226 char lynq_wifi_frequency_cmd[128]={0};
1227 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001228 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001229 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001230 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001231 check = lynq_check_set_frequency(lynq_wifi_frequency);
1232 if(check != 0)
1233 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001234 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001235 return -1;
you.chen35020192022-05-06 11:30:57 +08001236 }
qs.xiong13673462023-02-21 19:12:54 +08001237 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1238 if(check != 0)
1239 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001240 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001241 return -1;
1242 }
1243
qs.xiongc00b6032022-11-29 16:28:03 +08001244 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1245 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001246 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001247 return -1;
1248 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001249
you.chen35020192022-05-06 11:30:57 +08001250 CHECK_IDX(idx, CTRL_AP);
1251
1252 CHECK_WPA_CTRL(CTRL_AP);
1253
1254 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1255 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1256 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1257
you.chen6c2dd9c2022-05-16 17:55:28 +08001258 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-05-06 11:30:57 +08001259 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1260 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1261 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001262
qs.xiong9fbf74e2023-03-28 13:38:22 +08001263 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001264}
1265
qs.xiongf1b525b2022-03-31 00:58:23 -04001266int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001267{
you.chen35020192022-05-06 11:30:57 +08001268 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001269 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001270 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001271
qs.xiong9fbf74e2023-03-28 13:38:22 +08001272 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1273 {
1274 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen35020192022-05-06 11:30:57 +08001275 return -1;
1276 }
1277 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001278
qs.xiong9fbf74e2023-03-28 13:38:22 +08001279 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001280}
1281
qs.xiongf1b525b2022-03-31 00:58:23 -04001282int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1283{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001284 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001285 CHECK_IDX(idx, CTRL_AP);
1286 switch(bandwidth){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001287 case LYNQ_WIFI_BANDWIDTH_HT10:
1288 {
1289 RLOGE("bandwith [%d] not support now\n", bandwidth);
1290 return -1;
1291 }
1292 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen35020192022-05-06 11:30:57 +08001293 {
1294 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1295 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001296 if (system(lynq_cmd_bandwith) != 0 )
1297 {
1298 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001299 return -1;
1300 }
1301 system("wl up");
1302 break;
1303 }
1304 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001305 {
qs.xiong10379192023-02-21 13:19:42 +08001306 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001307 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1308 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001309 if (system(lynq_cmd_bandwith) != 0 )
1310 {
1311 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001312 return -1;
1313 }
1314 system("wl up");
1315 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001316 }
you.chen35020192022-05-06 11:30:57 +08001317 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001318 {
qs.xiong10379192023-02-21 13:19:42 +08001319 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001320 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001321 if (system(lynq_cmd_bandwith) != 0 )
1322 {
1323 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001324 return -1;
1325 }
1326 system("wl up");
1327 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001328 }
1329 default:
you.chen35020192022-05-06 11:30:57 +08001330 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001331 RLOGE("auth type [%d] not support now\n", bandwidth);
1332 return -1;
you.chen35020192022-05-06 11:30:57 +08001333 }
1334 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001335
1336
you.chen35020192022-05-06 11:30:57 +08001337 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001338}
you.chen35020192022-05-06 11:30:57 +08001339
qs.xiongf1b525b2022-03-31 00:58:23 -04001340int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1341{
you.chen35020192022-05-06 11:30:57 +08001342 int count = 0;
1343 int index = 0;
1344 char *split_words[128] = {0};
1345 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001346 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001347 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001348
you.chen35020192022-05-06 11:30:57 +08001349 CHECK_WPA_CTRL(CTRL_AP);
1350
1351 DO_REQUEST(lynq_chanspec_cmd);
1352
1353 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1354 for(;index < count; index++) {
1355 if (strncmp(split_words[index], "bw", 2) != 0) {
1356 continue;
1357 }
1358
1359 index++;
1360 if (index >= count) {
1361 return -1;
1362 }
1363
qs.xiong9fbf74e2023-03-28 13:38:22 +08001364 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001365 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1366 return 0;
1367 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001368 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001369 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001370}
qs.xiong0fb469a2022-04-14 03:50:45 -04001371
qs.xiongf1b525b2022-03-31 00:58:23 -04001372int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001373{
you.chen35020192022-05-06 11:30:57 +08001374 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001375 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001376 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001377
you.chen35020192022-05-06 11:30:57 +08001378 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001379
qs.xiong9fbf74e2023-03-28 13:38:22 +08001380 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1381 {
you.chen35020192022-05-06 11:30:57 +08001382 return -1;
1383 }
1384
1385 system("wl down");
1386 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001387 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001388 return -1;
1389 }
1390 system("wl up");
1391 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001392}
qs.xiong0fb469a2022-04-14 03:50:45 -04001393
qs.xiongf1b525b2022-03-31 00:58:23 -04001394int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001395{
you.chen35020192022-05-06 11:30:57 +08001396 int count = 0;
1397 int index = 0;
1398 char *split_words[128] = {0};
1399 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001400 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001401 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001402
you.chen35020192022-05-06 11:30:57 +08001403 CHECK_WPA_CTRL(CTRL_AP);
1404
1405 DO_REQUEST(lynq_chanspec_cmd);
1406
1407 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001408 for(;index < count; index++)
1409 {
1410 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001411 if (strncmp(split_words[index], "channel", 2) != 0) {
1412 continue;
1413 }
1414
1415 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001416 if (index >= count)
1417 {
you.chen35020192022-05-06 11:30:57 +08001418 return -1;
1419 }
1420
1421 *channel = atoi(split_words[index]);
1422 return 0;
1423 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001424 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001425 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001426}
1427
1428
you.chen35020192022-05-06 11:30:57 +08001429int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001430{
you.chen6c2dd9c2022-05-16 17:55:28 +08001431 char ssid[MAX_CMD] = {0};
1432 int freq = 0;
1433 char lynq_auth_cmd[64]={0};
1434 char lynq_auth_alg_cmd[64]={0};
1435 char lynq_psk_cmd[64]={0};
1436 char lynq_pairwise_cmd[64]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001437 char lynq_ieee80211_cmd[64]={0};
1438 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001439 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001440 CHECK_IDX(idx, CTRL_AP);
1441
you.chen6c2dd9c2022-05-16 17:55:28 +08001442 CHECK_WPA_CTRL(CTRL_AP);
1443
qs.xiong9fbf74e2023-03-28 13:38:22 +08001444 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1445 {
1446 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen35020192022-05-06 11:30:57 +08001447 return -1;
1448 }
1449
you.chen92fd5d32022-05-25 10:09:47 +08001450 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001451 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001452 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001453 return 0;
1454 }
1455 else {
1456 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1457 ssid[0] = '\0';
1458 }
1459 lynq_wifi_ap_frequency_get(idx, &freq);
1460
1461 DO_OK_FAIL_REQUEST(cmd_disconnect);
1462 DO_OK_FAIL_REQUEST(cmd_remove_all);
1463 if (ssid[0] != '\0') {
1464 lynq_wifi_ap_ssid_set(idx, ssid);
1465 }
1466 if (freq != 0) {
1467 lynq_wifi_ap_frequency_set(idx, freq);
1468 }
1469 }
1470 }
you.chen35020192022-05-06 11:30:57 +08001471
qs.xiong9fbf74e2023-03-28 13:38:22 +08001472 switch(auth){
1473 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001474 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001475 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001476 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001477 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001478 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001479 break;
1480 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001481 case LYNQ_WIFI_AUTH_WEP:
1482 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001483 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001484 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001485 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-05-16 17:55:28 +08001486 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1487
1488 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1489 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1490 break;
1491 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001492 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-03-29 17:36:14 +08001493 {
1494 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1495 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1496 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1497
1498 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1499 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1500 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1501 break;
1502
1503 }
you.chen35020192022-05-06 11:30:57 +08001504 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001505 {
1506 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1507 {
you.chen35020192022-05-06 11:30:57 +08001508 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1509 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1510 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001511 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1512 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001513 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001514 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001515 }
1516// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1517// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1518 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong7a105ce2022-03-02 09:43:11 -05001519
you.chen35020192022-05-06 11:30:57 +08001520 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1521 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1522 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001523 break;
1524 }
1525 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1526 {
1527 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1528 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1529 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1530 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1531
1532 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1533 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1534 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1535 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1536 break;
1537 }
1538 case LYNQ_WIFI_AUTH_WPA3_PSK:
1539 {
1540 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1541 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xiong3e506812023-04-06 11:08:48 +08001542 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001543 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1544
1545 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1546 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1547 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1548 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1549 break;
1550 }
1551 default:
you.chen35020192022-05-06 11:30:57 +08001552 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001553 RLOGE("auth type [%d] not support now\n", auth);
1554 return -1;
you.chen35020192022-05-06 11:30:57 +08001555 }
1556 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001557 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001558
qs.xiong9fbf74e2023-03-28 13:38:22 +08001559 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001560}
1561
you.chen35020192022-05-06 11:30:57 +08001562int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001563{
you.chen35020192022-05-06 11:30:57 +08001564 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001565 char lynq_auth_alg_str[MAX_RET] = {0};
1566 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001567 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001568 CHECK_IDX(idx, CTRL_AP);
1569
qs.xiong9fbf74e2023-03-28 13:38:22 +08001570 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1571 {
1572 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen35020192022-05-06 11:30:57 +08001573 return -1;
1574 }
1575
qs.xiong9fbf74e2023-03-28 13:38:22 +08001576 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1577 {
1578 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1579 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001580 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001581 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001582 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001583 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001584 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1585 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001586 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001587 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001588 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001589 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001590 else
1591 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001592 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001593 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001594 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001595 }
you.chen35020192022-05-06 11:30:57 +08001596 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001597 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1598 {
1599 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1600 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001601 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001602 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001603 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001604 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1605 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001606 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001607 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001608 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001609 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001610 else
1611 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001612 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001613 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001614 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001615 }
you.chen35020192022-05-06 11:30:57 +08001616 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001617
1618 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1619 {
1620 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1621 return -1;
1622 }
1623
1624 if (memcmp(lynq_auth_str,"1",1) == 0 )
1625 {
1626 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1627 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001628 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001629 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1630 {
1631 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1632 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001633 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001634 }
1635 else
1636 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001637 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001638 *auth = -1;
1639 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001640
you.chen6c2dd9c2022-05-16 17:55:28 +08001641 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001642}
qs.xiong1af5daf2022-03-14 09:12:12 -04001643
qs.xiong1af5daf2022-03-14 09:12:12 -04001644
qs.xiongf1b525b2022-03-31 00:58:23 -04001645int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001646{
you.chen35020192022-05-06 11:30:57 +08001647 char LYNQ_WIFI_CMD[128]={0};
1648 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1649 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001650 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001651 CHECK_IDX(idx, CTRL_AP);
1652
1653 CHECK_WPA_CTRL(CTRL_AP);
1654
1655// system("connmanctl enable wifi");
1656// system("connmanctl tether wifi on cy-test 12345678");
1657// system("ifconfig wlan0 down");
1658// system("ifconfig wlan0 up");
1659// system("ifconfig wlan0 up");
1660
1661 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1662 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1663
1664 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1665 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1666
qs.xiong9fbf74e2023-03-28 13:38:22 +08001667 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001668}
1669
qs.xiongf1b525b2022-03-31 00:58:23 -04001670int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001671{
you.chen35020192022-05-06 11:30:57 +08001672 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001673}
1674
qs.xiongf1b525b2022-03-31 00:58:23 -04001675int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001676{
you.chen35020192022-05-06 11:30:57 +08001677 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04001678
you.chen35020192022-05-06 11:30:57 +08001679 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001680
you.chen35020192022-05-06 11:30:57 +08001681 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001682
you.chen35020192022-05-06 11:30:57 +08001683 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
1684
1685 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1686
you.chenb4b121c2022-05-06 17:50:16 +08001687// system("connmanctl tether wifi off");
you.chen35020192022-05-06 11:30:57 +08001688
qs.xiong9fbf74e2023-03-28 13:38:22 +08001689 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001690}
qs.xiong1af5daf2022-03-14 09:12:12 -04001691
qs.xiongf1b525b2022-03-31 00:58:23 -04001692int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001693{
you.chen35020192022-05-06 11:30:57 +08001694 char lynq_disable_cmd[128] = {0};
1695 char lynq_select_cmd[128] = {0};
1696 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001697 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08001698 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001699
you.chen35020192022-05-06 11:30:57 +08001700 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08001701 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1702 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1703
1704 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1705 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
1706 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04001707
qs.xiong9fbf74e2023-03-28 13:38:22 +08001708 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001709}
1710
qs.xiongf1b525b2022-03-31 00:58:23 -04001711int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001712{
you.chen35020192022-05-06 11:30:57 +08001713 char lynq_disable_cmd[128] = {0};
1714 char lynq_select_cmd[128] = {0};
1715 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001716 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08001717 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001718
you.chen35020192022-05-06 11:30:57 +08001719 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001720
you.chen35020192022-05-06 11:30:57 +08001721 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1722 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1723
1724 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1725 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
1726 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05001727
qs.xiong9fbf74e2023-03-28 13:38:22 +08001728 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001729}
qs.xiongf1b525b2022-03-31 00:58:23 -04001730
you.chen35020192022-05-06 11:30:57 +08001731int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001732{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001733 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08001734 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001735 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001736 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001737 RLOGD("enter lynq_ap_password_set");
1738 if( password == NULL )
1739 {
1740 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08001741 return -1;
1742 }
1743 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08001744 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001745 if(pass_len < 8 || pass_len >= 64)
1746 {
1747 RLOGE("[lynq_ap_password_set]input password len not in rage");
1748 return -1;
you.chen35020192022-05-06 11:30:57 +08001749 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001750
you.chen35020192022-05-06 11:30:57 +08001751 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001752
qs.xiong9fbf74e2023-03-28 13:38:22 +08001753 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
1754 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001755 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001756 return -1;
1757 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001758 else if (auth == LYNQ_WIFI_AUTH_OPEN)
1759 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001760 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
1761 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001762 }
1763
you.chen35020192022-05-06 11:30:57 +08001764 CHECK_WPA_CTRL(CTRL_AP);
1765
qs.xiong9fbf74e2023-03-28 13:38:22 +08001766 if (auth == LYNQ_WIFI_AUTH_WEP)
1767 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001768 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001769 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
1770 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
1771 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1772 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
1773 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001774 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1775 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001776 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 +08001777 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
1778 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1779 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001780 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
1781 {
1782
qs.xiongc8d92a62023-03-29 17:36:14 +08001783 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 +08001784 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08001785 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001786 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1787 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
1788
1789 }
1790 else
qs.xiongc8d92a62023-03-29 17:36:14 +08001791 {
1792 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001793 return -1;
1794 }
you.chen35020192022-05-06 11:30:57 +08001795
you.chen35020192022-05-06 11:30:57 +08001796 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04001797
qs.xiong9fbf74e2023-03-28 13:38:22 +08001798 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001799}
1800
you.chen35020192022-05-06 11:30:57 +08001801int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04001802{
you.chen35020192022-05-06 11:30:57 +08001803 FILE * fp;
1804 int len, ret;
1805 int count, index;
1806 char *split_lines[128] = {0};
1807 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001808 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04001809
you.chen35020192022-05-06 11:30:57 +08001810 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001811
you.chen35020192022-05-06 11:30:57 +08001812 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
1813// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001814 if (NULL == fp)
1815 {
1816 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08001817 return -1;
1818 }
qs.xiong97fa59b2022-04-07 05:41:29 -04001819
you.chen35020192022-05-06 11:30:57 +08001820 buff = alloca(MAX_RET);
1821 fseek(fp, 0, SEEK_SET);
1822 len = fread(buff, 1, MAX_RET, fp);
1823 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04001824
qs.xiong9fbf74e2023-03-28 13:38:22 +08001825 for(index=0; index < len; index ++)
1826 {
1827 if (memcmp(buff + index, "network={", 9) != 0)
1828 {
you.chen35020192022-05-06 11:30:57 +08001829 continue;
1830 }
1831 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001832 for (; index < len; index ++ )
1833 {
1834 if (buff[index] != '}')
1835 {
you.chen35020192022-05-06 11:30:57 +08001836 continue;
1837 }
1838 buff[index] = '\0';
1839 break;
1840 }
1841 len = buff + index - p;
1842 }
1843
1844 count = lynq_split(p, len, '\n', split_lines);
1845
1846 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001847 for(index=0; index < count; index++)
1848 {
you.chen35020192022-05-06 11:30:57 +08001849 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001850 if (p != NULL)
1851 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001852 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001853 if (*p == '\"')
1854 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001855 p++;
1856 }
you.chen35020192022-05-06 11:30:57 +08001857 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001858 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
1859 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001860 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001861 if (*p == '\"')
1862 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001863 p++;
1864 }
1865 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001866 else
1867 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001868 continue;
you.chen35020192022-05-06 11:30:57 +08001869 }
1870
1871 strcpy(password, p);
1872
qs.xiong9fbf74e2023-03-28 13:38:22 +08001873 while(*password != '\0')
1874 {
1875 if (*password == '\"')
1876 {
you.chen35020192022-05-06 11:30:57 +08001877 *password = '\0';
1878 break;
1879 }
1880 password++;
1881 }
1882 ret = 0;
1883 break;
1884 } //end for(index=0; index < count; index++)
1885
1886 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001887}
1888
you.chen35020192022-05-06 11:30:57 +08001889static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
1890 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08001891 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04001892
qs.xiong9fbf74e2023-03-28 13:38:22 +08001893 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
1894 {
you.chen35020192022-05-06 11:30:57 +08001895 return -1;
1896 }
1897
1898 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08001899
qs.xiong9fbf74e2023-03-28 13:38:22 +08001900 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
1901 {
1902 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
1903 {
1904 if (strcmp(lynq_proto_str, "RSN") == 0)
1905 {
you.chena6cd55a2022-05-08 12:20:18 +08001906 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001907 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08001908 }
1909 }
1910 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001911 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
1912 {
1913 RLOGE("check ieee80211w error\n");
1914 return -1;
1915 }
1916 if ( strncmp(lynq_auth_str,"1",1) == 0 )
1917 {
1918
1919 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001920 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001921 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
1922 {
1923
1924 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001925 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001926 }else
1927 {
1928 *auth = -1;
1929 return -1;
1930 }
you.chen35020192022-05-06 11:30:57 +08001931 return 0;
1932}
1933
1934int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001935{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001936 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08001937 int pass_len, net_no, count, index;
1938 char lynq_tmp_cmd[300]={0};
1939 int net_no_list[128];
1940 lynq_wifi_auth_s net_auth;
1941 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001942 if(pass_len < 8 || pass_len >= 64)
1943 {
1944 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08001945 return -1;
1946 }
1947
1948 CHECK_IDX(idx, CTRL_STA);
1949
1950 net_no = -1;
1951 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
1952
qs.xiong9fbf74e2023-03-28 13:38:22 +08001953 for (index=0; index < count; index++)
1954 {
you.chen35020192022-05-06 11:30:57 +08001955 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001956 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
1957 {
you.chen35020192022-05-06 11:30:57 +08001958 net_no = net_no_list[index];
1959 break;
1960 }
1961 }
1962
qs.xiong9fbf74e2023-03-28 13:38:22 +08001963 if (net_no < 0)
1964 {
you.chen35020192022-05-06 11:30:57 +08001965 return -1;
1966 }
1967
1968 CHECK_WPA_CTRL(CTRL_STA);
1969
1970 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
1971
1972 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1973 DO_OK_FAIL_REQUEST(cmd_save_config);
1974
1975 return 0;
1976}
1977
1978int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
1979
1980 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08001981 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08001982 int count, index;
1983 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08001984 char *buff, *p, *ssid, *ssid_end_flag;
1985 char tmp_ssid[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001986 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08001987
you.chen755332b2022-08-06 16:59:10 +08001988 network_len = 0;
1989 p = NULL;
1990
you.chen35020192022-05-06 11:30:57 +08001991 CHECK_IDX(idx, CTRL_STA);
1992
qs.xiong9fbf74e2023-03-28 13:38:22 +08001993 if (NULL == password)
1994 {
1995 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08001996 return -1;
1997 }
1998
you.chen35020192022-05-06 11:30:57 +08001999 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002000 if (NULL == fp)
2001 {
2002 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002003 return -1;
2004 }
2005
2006 buff = alloca(MAX_RET);
2007 fseek(fp, 0, SEEK_SET);
2008 len = fread(buff, 1, MAX_RET, fp);
2009 fclose(fp);
2010
qs.xiong9fbf74e2023-03-28 13:38:22 +08002011 for(index=0; index < len; index ++)
2012 {
2013 for(; index < len; index ++)
2014 {
2015 if (memcmp(buff + index, "network={", 9) != 0)
2016 {
you.chen35020192022-05-06 11:30:57 +08002017 continue;
2018 }
2019 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002020 for (; index < len; index ++ )
2021 {
2022 if (buff[index] != '}')
2023 {
you.chen35020192022-05-06 11:30:57 +08002024 continue;
2025 }
2026 buff[index] = '\0';
2027 break;
2028 }
you.chen755332b2022-08-06 16:59:10 +08002029 network_len = buff + index - p;
2030 break;
you.chen35020192022-05-06 11:30:57 +08002031 }
2032
qs.xiongb3f26af2023-02-17 18:41:07 +08002033 if (p == NULL)
2034 return -1;
2035
you.chend2fef3f2023-02-13 10:50:35 +08002036 ssid = strstr(p, "ssid=");
2037 if (ssid != NULL) {
2038 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002039 if (ssid[0] == '\"')
2040 {
you.chend2fef3f2023-02-13 10:50:35 +08002041 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2042 break;
2043 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002044 else
2045 {
you.chend2fef3f2023-02-13 10:50:35 +08002046 ssid_end_flag = strstr(ssid, "\n");
2047 if (ssid_end_flag != NULL)
2048 {
2049 ssid_len = (ssid_end_flag - ssid) / 2;
2050 for(i=0; i<ssid_len; i++)
2051 {
2052 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2053 }
2054 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2055 break;
2056 }
2057 }
you.chen35020192022-05-06 11:30:57 +08002058 }
you.chend2fef3f2023-02-13 10:50:35 +08002059
you.chen35020192022-05-06 11:30:57 +08002060 }
2061
qs.xiong9fbf74e2023-03-28 13:38:22 +08002062 if (index >= len || NULL == p || network_len <= 0)
2063 {
you.chen35020192022-05-06 11:30:57 +08002064 return -1;
2065 }
2066
you.chen755332b2022-08-06 16:59:10 +08002067 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08002068
2069 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002070 for(index=0; index < count; index++)
2071 {
you.chen35020192022-05-06 11:30:57 +08002072 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002073 if (p != NULL)
2074 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002075 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002076 if (*p == '\"')
2077 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002078 p++;
2079 }
you.chen35020192022-05-06 11:30:57 +08002080 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002081 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2082 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002083 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002084 if (*p == '\"')
2085 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002086 p++;
2087 }
2088 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002089 else
2090 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002091 continue;
you.chen35020192022-05-06 11:30:57 +08002092 }
2093
qs.xiong13673462023-02-21 19:12:54 +08002094 if (*p == '\"')
2095 p++;
2096 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08002097
qs.xiong13673462023-02-21 19:12:54 +08002098 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002099 while(password - p < 64 && *password != '\0')
2100 {
2101 if (*password == '\"')
2102 {
you.chen35020192022-05-06 11:30:57 +08002103 *password = '\0';
2104 break;
2105 }
2106 password++;
2107 }
2108 ret = 0;
2109 break;
2110 } //end for(index=0; index < count; index++)
2111
2112 return ret;
2113}
2114
2115static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2116{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002117 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04002118
qs.xiong9fbf74e2023-03-28 13:38:22 +08002119 if (sta_ssid == NULL)
2120 {
2121 RLOGE("sta_ssid is null\n");
2122 return -1;
you.chen35020192022-05-06 11:30:57 +08002123 }
2124
qs.xiong9fbf74e2023-03-28 13:38:22 +08002125 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002126
2127 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2128
2129 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2130// DO_OK_FAIL_REQUEST(cmd_save_config);
2131
qs.xiong9fbf74e2023-03-28 13:38:22 +08002132 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002133
2134}
2135
you.chen35020192022-05-06 11:30:57 +08002136static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05002137{
you.chen35020192022-05-06 11:30:57 +08002138 char lynq_disable_cmd[128]={0};
2139 char lynq_select_cmd[128]={0};
2140
2141 CHECK_WPA_CTRL(CTRL_STA);
2142
qs.xiong9fbf74e2023-03-28 13:38:22 +08002143 if (save != 0)
2144 {
you.chenc29444e2022-06-07 18:01:16 +08002145 if (start_flag != 0)
2146 {
2147 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2148 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2149 }
2150 else
2151 {
2152 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2153 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2154 }
you.chen35020192022-05-06 11:30:57 +08002155 DO_OK_FAIL_REQUEST(cmd_save_config);
2156 }
2157
qs.xiong9fbf74e2023-03-28 13:38:22 +08002158 if (start_flag == 0)
2159 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002160 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002161 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2162 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002163 else
2164 {
you.chen35020192022-05-06 11:30:57 +08002165 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2166 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2167 }
2168
2169 return 0;
2170}
2171
2172int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2173{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002174 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002175 CHECK_IDX(idx, CTRL_STA);
2176
you.chen6c2dd9c2022-05-16 17:55:28 +08002177 curr_status_info curr_state;
2178 ap_info_s ap_info;
2179 curr_state.ap = &ap_info;
2180 curr_state.state = NULL;
2181
qs.xiong9fbf74e2023-03-28 13:38:22 +08002182 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2183 {
you.chend2fef3f2023-02-13 10:50:35 +08002184 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002185 return 0;
2186 }
2187
2188 return -1;
you.chen35020192022-05-06 11:30:57 +08002189}
2190
2191int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2192{
you.chen9ac66392022-08-06 17:01:16 +08002193 scan_info_s *scan_list = NULL;
2194 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002195 int scan_len=0;
2196 int save_len=0;
2197 int best_index = -1;
2198 int best_scan_index = -1;
2199 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002200 int i, j, ret;
2201
2202 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002203
2204 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002205 if (info == NULL)
2206 {
you.chen35020192022-05-06 11:30:57 +08002207 return -1;
2208 }
2209
2210 curr_status_info curr_state;
2211 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002212 char status[64];
you.chen35020192022-05-06 11:30:57 +08002213
you.chen9ac66392022-08-06 17:01:16 +08002214 memset(&ap_info, 0, sizeof (ap_info));
2215 memset(status, 0, sizeof (status));
2216
2217 curr_state.ap = &ap_info;
2218 curr_state.state = status;
2219
qs.xiong9fbf74e2023-03-28 13:38:22 +08002220 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2221 {
you.chen35020192022-05-06 11:30:57 +08002222 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002223 if (strcmp(status, STATE_COMPLETED) == 0)
2224 {
2225 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2226 }
2227 else
2228 {
2229 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2230 }
you.chen35020192022-05-06 11:30:57 +08002231 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002232 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002233 return 0;
2234 }
2235
you.chen9ac66392022-08-06 17:01:16 +08002236 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002237 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002238 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2239 {
you.chen9ac66392022-08-06 17:01:16 +08002240 if (NULL != scan_list)
2241 {
2242 free(scan_list);
2243 }
you.chen35020192022-05-06 11:30:57 +08002244 return -1;
2245 }
2246
qs.xiong9fbf74e2023-03-28 13:38:22 +08002247 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2248 {
you.chen9ac66392022-08-06 17:01:16 +08002249 if (NULL != scan_list)
2250 {
2251 free(scan_list);
2252 }
2253 if (NULL != save_list)
2254 {
2255 free(save_list);
2256 }
you.chen35020192022-05-06 11:30:57 +08002257 return -1;
2258 }
2259
qs.xiong9fbf74e2023-03-28 13:38:22 +08002260 for (i=0; i < save_len; i++)
2261 {
2262 for (j=0; j < scan_len; j++)
2263 {
you.chen35020192022-05-06 11:30:57 +08002264 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002265 && save_list[i].base_info.auth == scan_list[j].auth)
2266 {
2267 if (best_rssi == 0)
2268 {
you.chen9ac66392022-08-06 17:01:16 +08002269 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002270 best_rssi = scan_list[j].rssi;
2271 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002272 else if (best_rssi > scan_list[j].rssi)
2273 {
you.chen35020192022-05-06 11:30:57 +08002274 best_index = i;
2275 best_scan_index = j;
2276 best_rssi = scan_list[j].rssi;
2277 }
you.chend2fef3f2023-02-13 10:50:35 +08002278 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 +08002279 break;
2280 }
2281 }
2282 }
2283
qs.xiong9fbf74e2023-03-28 13:38:22 +08002284 if (best_index >= 0)
2285 {
you.chen35020192022-05-06 11:30:57 +08002286 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002287 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 +08002288 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2289 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002290 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002291 }
2292
you.chen9ac66392022-08-06 17:01:16 +08002293 if (NULL != scan_list)
2294 {
2295 free(scan_list);
2296 }
2297 if (NULL != save_list)
2298 {
2299 free(save_list);
2300 }
2301
2302 return ret;
you.chen35020192022-05-06 11:30:57 +08002303}
2304
2305static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2306{
qs.xiongc8d92a62023-03-29 17:36:14 +08002307 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002308 char lynq_ket_mgmt_cmd[64]={0};
2309 char lynq_pairwise_cmd[64]={0};
2310 char lynq_psk_cmd[64]={0};
2311
2312 CHECK_WPA_CTRL(CTRL_STA);
2313
qs.xiong9fbf74e2023-03-28 13:38:22 +08002314 switch(auth)
2315 {
2316 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002317 {
2318 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002319
you.chen35020192022-05-06 11:30:57 +08002320 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002321// DO_OK_FAIL_REQUEST(cmd_save_config);
2322 break;
2323 }
2324 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002325 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002326 {
2327 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2328 {
you.chen35020192022-05-06 11:30:57 +08002329 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2330 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002331 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2332 {
you.chena6cd55a2022-05-08 12:20:18 +08002333 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002334 }
2335 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2336 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002337
you.chen35020192022-05-06 11:30:57 +08002338 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2339 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2340 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002341
qs.xiong9fbf74e2023-03-28 13:38:22 +08002342 if (password != NULL)
2343 {
you.chen35020192022-05-06 11:30:57 +08002344 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2345 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002346 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002347 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002348
you.chen35020192022-05-06 11:30:57 +08002349// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002350 break;
2351 }
2352 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2353 {
qs.xiong3e506812023-04-06 11:08:48 +08002354 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002355 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002356 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2357 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2358
qs.xiong3e506812023-04-06 11:08:48 +08002359 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002360 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2361 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2362 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2363
2364 break;
2365 }
2366 case LYNQ_WIFI_AUTH_WPA3_PSK:
2367 {
qs.xiong3e506812023-04-06 11:08:48 +08002368 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002369 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORk %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002370 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2371 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2372
qs.xiong3e506812023-04-06 11:08:48 +08002373 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong455c30b2023-04-12 11:40:02 +08002374 RLOGD("inner_set_sta_auth_psw before set SAE CMD");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002375 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
qs.xiong455c30b2023-04-12 11:40:02 +08002376 RLOGD("inner_set_sta_auth_psw after set SAE CMD");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002377 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2378 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2379
2380 break;
2381 }
2382 default:
2383 return -1;
you.chen35020192022-05-06 11:30:57 +08002384 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002385
qs.xiong9fbf74e2023-03-28 13:38:22 +08002386 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002387}
qs.xiong7a105ce2022-03-02 09:43:11 -05002388
you.chen35020192022-05-06 11:30:57 +08002389static int inner_get_curr_net_no(int interface) {
2390 curr_status_info curr_state;
2391 curr_state.ap = NULL;
2392 curr_state.state = NULL;
2393
qs.xiong9fbf74e2023-03-28 13:38:22 +08002394 if (0 != inner_get_status_info(interface, &curr_state))
2395 {
you.chen35020192022-05-06 11:30:57 +08002396 return -1;
2397 }
2398
2399 return curr_state.net_no;
2400}
2401
2402int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002403{
you.chen35020192022-05-06 11:30:57 +08002404 int net_no;
2405 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002406
you.chen35020192022-05-06 11:30:57 +08002407 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002408
qs.xiong9fbf74e2023-03-28 13:38:22 +08002409 if (net_no < 0)
2410 {
you.chen35020192022-05-06 11:30:57 +08002411 return -1;
2412 }
2413
2414 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002415}
2416
you.chen35020192022-05-06 11:30:57 +08002417int 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 -05002418{
you.chen35020192022-05-06 11:30:57 +08002419 int count, net_no, index;
2420 int net_no_list[128];
2421 lynq_wifi_auth_s net_auth;
qs.xiongf1b525b2022-03-31 00:58:23 -04002422
qs.xiong9fbf74e2023-03-28 13:38:22 +08002423 if (ssid == NULL || *ssid == '\0')
2424 {
2425 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002426 return -1;
2427 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002428
qs.xiong9fbf74e2023-03-28 13:38:22 +08002429 if (LYNQ_WIFI_AUTH_OPEN != auth)
2430 {
2431 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
2432 {
2433 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002434 return -1;
2435 }
2436 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002437
you.chen35020192022-05-06 11:30:57 +08002438 CHECK_IDX(idx, CTRL_STA);
2439
2440 net_no = -1;
2441 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2442
qs.xiong9fbf74e2023-03-28 13:38:22 +08002443 for (index=0; index < count; index++)
2444 {
you.chen35020192022-05-06 11:30:57 +08002445 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002446 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2447 {
you.chen35020192022-05-06 11:30:57 +08002448 net_no = net_no_list[index];
2449 break;
2450 }
2451 }
2452
qs.xiong9fbf74e2023-03-28 13:38:22 +08002453 if (net_no < 0)
2454 {
you.chen35020192022-05-06 11:30:57 +08002455 net_no = lynq_add_network(CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002456 if (net_no == -1)
2457 {
you.chen35020192022-05-06 11:30:57 +08002458 return -1;
2459 }
2460
qs.xiong9fbf74e2023-03-28 13:38:22 +08002461 RLOGD("net no is %d\n", net_no);
2462 if (0 != inner_set_sta_ssid(net_no, ssid))
2463 {
you.chen35020192022-05-06 11:30:57 +08002464 return -1;
2465 }
2466 }
2467
qs.xiong9fbf74e2023-03-28 13:38:22 +08002468 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2469 {
you.chen35020192022-05-06 11:30:57 +08002470 return -1;
2471 }
2472
2473 return inner_sta_start_stop(net_no, 1, 1);
qs.xiong7a105ce2022-03-02 09:43:11 -05002474}
2475
you.chen35020192022-05-06 11:30:57 +08002476int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002477{
you.chen35020192022-05-06 11:30:57 +08002478 ap_info_s ap;
2479 curr_status_info curr_state;
2480 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002481
qs.xiong9fbf74e2023-03-28 13:38:22 +08002482 if (ssid == NULL || *ssid == '\0')
2483 {
2484 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002485 return -1;
2486 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002487
you.chen35020192022-05-06 11:30:57 +08002488 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002489
you.chen35020192022-05-06 11:30:57 +08002490 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002491 curr_state.state = NULL;
2492
qs.xiong9fbf74e2023-03-28 13:38:22 +08002493 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2494 {
you.chen35020192022-05-06 11:30:57 +08002495 return 0;
2496 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002497
qs.xiong9fbf74e2023-03-28 13:38:22 +08002498 if (strcmp(ap.ap_ssid, ssid) != 0)
2499 {
you.chen35020192022-05-06 11:30:57 +08002500 return 0;
2501 }
2502
2503 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002504}
qs.xiong97fa59b2022-04-07 05:41:29 -04002505
you.chena6cd55a2022-05-08 12:20:18 +08002506int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2507{
qs.xiongad2f89d2023-01-18 13:17:41 +08002508// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2509// const char *lynq_reconnect_cmd = "RECONNECT";
2510 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2511 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2512// 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 -05002513
you.chen35020192022-05-06 11:30:57 +08002514 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08002515 CHECK_WPA_CTRL(CTRL_STA);
2516
2517 system("connmanctl enable wifi");
2518
qs.xiongad2f89d2023-01-18 13:17:41 +08002519 if (system("ifconfig | grep -q wlan0") != 0)
2520 {
you.chen35020192022-05-06 11:30:57 +08002521 return -1;
2522 }
qs.xiong9c99fa92022-03-15 08:03:26 -04002523
qs.xiongad2f89d2023-01-18 13:17:41 +08002524// DO_OK_FAIL_REQUEST(cmd_remove_all);
2525// system(lynq_first_sta_cmd);
2526// system(lynq_reconfigure_cmd);
2527// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
2528 system(lynq_enable_sta_cmd);
2529 system(lynq_reconnect_cmd);
2530// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002531 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002532}
2533
you.chen35020192022-05-06 11:30:57 +08002534int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04002535{
qs.xiongad2f89d2023-01-18 13:17:41 +08002536// char lynq_disable_network_cmd[MAX_CMD];
2537// curr_status_info curr_state;
2538// ap_info_s ap_info;
you.chen35020192022-05-06 11:30:57 +08002539
qs.xiongad2f89d2023-01-18 13:17:41 +08002540 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 +08002541 CHECK_IDX(idx, CTRL_STA);
2542 CHECK_WPA_CTRL(CTRL_STA);
2543
qs.xiongad2f89d2023-01-18 13:17:41 +08002544// curr_state.ap = &ap_info;
2545// curr_state.state = NULL;
you.chena6cd55a2022-05-08 12:20:18 +08002546
qs.xiongad2f89d2023-01-18 13:17:41 +08002547// if (0 != inner_get_status_info(CTRL_STA, &curr_state) || curr_state.net_no < 0) {
2548// return 0;
2549// }
you.chena6cd55a2022-05-08 12:20:18 +08002550
qs.xiongad2f89d2023-01-18 13:17:41 +08002551// sprintf(lynq_disable_network_cmd, "DISABLE_NETWORK %d", curr_state.net_no);
2552// DO_OK_FAIL_REQUEST(lynq_disable_network_cmd);
2553 system(lynq_disable_sta_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002554 DO_OK_FAIL_REQUEST(cmd_save_config);
2555
2556 return 0;
2557// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04002558}
qs.xiong7a105ce2022-03-02 09:43:11 -05002559
you.chen35020192022-05-06 11:30:57 +08002560//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
2561// int i, count;
2562// char *p;
2563// const char * FLAG_SSID = "ssid=";
2564// const char * FLAG_SBSID = "bssid=";
2565// const char * FLAG_KEY_MGMT = "key_mgmt=";
2566// const char * FLAG_FREQ = "freq=";
2567// char lynq_sta_cmd[MAX_CMD];
2568// char *split_lines[128] = {0};
2569
2570// CHECK_WPA_CTRL(CTRL_AP);
2571
2572// sprintf(lynq_sta_cmd, "STA %s", bssid);
2573
2574// DO_REQUEST(lynq_sta_cmd);
2575
2576// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2577
2578// for(i=0; i < count; i++) {
2579// p = strstr(split_lines[i], FLAG_SSID);
2580// if (p != NULL) {
2581// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
2582// continue;
2583// }
2584// }
2585
2586// lynq_get_interface_ip(idx, ap->ap_ip);
2587// lynq_ap_password_set(idx, ap->psw);
2588
2589// return 0;
2590//}
2591
2592static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
2593 curr_status_info curr_state;
2594 curr_state.ap = ap;
2595 curr_state.state = NULL;
2596 return inner_get_status_info(interface, &curr_state);
2597}
2598
2599int 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 -04002600{
you.chend2fef3f2023-02-13 10:50:35 +08002601 int index, line_count;
2602 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08002603 const char *lynq_first_sta_cmd = "STA-FIRST";
2604 char lynq_next_sta_cmd[MAX_CMD];
2605 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08002606 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002607
you.chen35020192022-05-06 11:30:57 +08002608 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002609
you.chen35020192022-05-06 11:30:57 +08002610 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002611
you.chen35020192022-05-06 11:30:57 +08002612// ap_info_s * tmp_ap;
2613// device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002614 if (ap == NULL || list == NULL || len == NULL)
2615 {
2616 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08002617 return -1;
2618 }
2619
2620// ap = &tmp_ap;
2621// list = &tmp_list;
2622 *ap = malloc(sizeof (ap_info_s));
2623
qs.xiong9fbf74e2023-03-28 13:38:22 +08002624 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0)
2625 {
2626 RLOGE("inner_get_status_info_ap !=0\n");
you.chen35020192022-05-06 11:30:57 +08002627 return -1;
2628 }
2629
2630 lynq_get_interface_ip(idx, (*ap)->ap_ip);
2631 lynq_ap_password_get(idx, (*ap)->psw);
2632
you.chen35020192022-05-06 11:30:57 +08002633 DO_REQUEST(lynq_first_sta_cmd);
2634
2635 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002636 while (reply_len > 0)
2637 {
2638 if (memcmp(cmd_reply, "FAIL", 4) == 0)
2639 {
you.chen35020192022-05-06 11:30:57 +08002640 break;
2641 }
2642 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2643 bssid[index] = malloc(strlen(split_lines[0]) + 1);
2644 strcpy(bssid[index], split_lines[0]);
2645 index++;
2646 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
2647 reply_len = MAX_RET;
2648 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08002649 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 +08002650 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
2651 {
2652 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08002653 break;
2654 }
2655 }
2656
2657 *len = index;
2658
2659 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08002660 for (index=0; index < *len; index++)
2661 {
you.chend2fef3f2023-02-13 10:50:35 +08002662 dev_info = &(*list)[index];
2663 memset(dev_info, 0, sizeof(device_info_s));
2664 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
2665 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
2666 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
2667 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08002668 free(bssid[index]);
2669 }
2670
2671 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002672}
2673
you.chen35020192022-05-06 11:30:57 +08002674int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04002675{
you.chen35020192022-05-06 11:30:57 +08002676 int i, count, index, count_words;
2677 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
2678 char *split_lines[128] = {0};
2679 char *split_words[128] = {0};
2680 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04002681
qs.xiong9fbf74e2023-03-28 13:38:22 +08002682 if (list == NULL || len == NULL)
2683 {
you.chen35020192022-05-06 11:30:57 +08002684 return -1;
2685 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002686
you.chen9ac66392022-08-06 17:01:16 +08002687 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
2688 {
2689 usleep(100 * 1000);
2690 }
2691
you.chen35020192022-05-06 11:30:57 +08002692 CHECK_IDX(idx, CTRL_STA);
2693
2694 CHECK_WPA_CTRL(CTRL_STA);
2695
2696 DO_REQUEST(lynq_scan_result_cmd);
2697
2698 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2699 *len = count - 1;
2700 *list = malloc(sizeof (scan_info_s) * *len);
2701
2702 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08002703 for (index=0; index <count_words; index++)
2704 {
2705 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08002706 }
2707
qs.xiong9fbf74e2023-03-28 13:38:22 +08002708 for(index = 1;index < count; index++)
2709 {
2710 RLOGD("---- %s\n",split_lines[index]);
you.chen35020192022-05-06 11:30:57 +08002711 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
2712 if (count_words < 4)
2713 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002714 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08002715 //bssid / frequency / signal level / flags / ssid
2716 p = (*list) + index - 1;
2717 strcpy(p->mac, split_words[0]);
2718 p->band = convert_band_from_freq(atoi(split_words[1]));
2719 p->rssi = -1 * atoi( split_words[2]);
2720 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chend2fef3f2023-02-13 10:50:35 +08002721 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
you.chen35020192022-05-06 11:30:57 +08002722 }
2723
2724 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002725}
qs.xiong97fa59b2022-04-07 05:41:29 -04002726
you.chen35020192022-05-06 11:30:57 +08002727int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
2728{
2729 int count, net_no, index;
2730 int net_no_list[128];
2731 lynq_wifi_auth_s net_auth;
2732 char lynq_remove_cmd[MAX_CMD];
2733
qs.xiong9fbf74e2023-03-28 13:38:22 +08002734 if (ssid == NULL || *ssid == '\0')
2735 {
2736 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002737 return -1;
2738 }
2739
2740 CHECK_IDX(idx, CTRL_STA);
2741
2742 CHECK_WPA_CTRL(CTRL_STA);
2743
2744 net_no = -1;
2745 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2746
qs.xiong9fbf74e2023-03-28 13:38:22 +08002747 for (index=0; index < count; index++)
2748 {
you.chen35020192022-05-06 11:30:57 +08002749 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002750 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2751 {
you.chen35020192022-05-06 11:30:57 +08002752 net_no = net_no_list[index];
2753 break;
2754 }
2755 }
2756
qs.xiong9fbf74e2023-03-28 13:38:22 +08002757 if (net_no < 0)
2758 {
you.chen35020192022-05-06 11:30:57 +08002759 return 0;
2760 }
2761
2762 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
2763
2764 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
2765 DO_OK_FAIL_REQUEST(cmd_save_config);
2766
2767 return 0;
2768}
2769
2770int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002771{
you.chend2fef3f2023-02-13 10:50:35 +08002772 int count, index;
you.chen35020192022-05-06 11:30:57 +08002773 int net_no_list[128];
2774 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002775 RLOGD("enter lynq_get_sta_saved_ap api\n");
2776 if (list == NULL || len == NULL)
2777 {
2778 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08002779 return -1;
2780 }
2781
2782 CHECK_IDX(idx, CTRL_STA);
2783
2784// CHECK_WPA_CTRL(CTRL_STA);
2785
2786 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002787 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08002788
2789 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08002790 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08002791 *len = count;
2792
qs.xiong9fbf74e2023-03-28 13:38:22 +08002793 for (index=0; index < count; index++)
2794 {
2795 RLOGD("[lynq_get_sta_saved_ap]to get ssid %d", index);
2796 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get ssid");
you.chen35020192022-05-06 11:30:57 +08002797 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002798 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get mac");
you.chen35020192022-05-06 11:30:57 +08002799 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002800 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get auth");
you.chen35020192022-05-06 11:30:57 +08002801 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002802 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get band");
2803 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
2804 {
you.chen35020192022-05-06 11:30:57 +08002805 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
2806 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002807 else
2808 {
you.chen35020192022-05-06 11:30:57 +08002809 (*list)[index].base_info.band = -1;
2810 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002811 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08002812 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002813 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002814 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08002815 return 0;
2816}
2817
2818int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
2819{
qs.xiongc8d92a62023-03-29 17:36:14 +08002820 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08002821 const char *lynq_scan_cmd = "SCAN";
2822
2823 CHECK_IDX(idx, CTRL_STA);
2824
2825 CHECK_WPA_CTRL(CTRL_STA);
2826
qs.xiongc8d92a62023-03-29 17:36:14 +08002827 system(clean_last_re);
you.chen9ac66392022-08-06 17:01:16 +08002828 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08002829 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002830 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
2831 {
qs.xiongb3f26af2023-02-17 18:41:07 +08002832 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002833 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
2834 {
qs.xiongb3f26af2023-02-17 18:41:07 +08002835 g_sta_scan_finish_flag = 1;
2836 return -1;
2837 }
you.chen35020192022-05-06 11:30:57 +08002838
2839 return 0;
2840}
2841
2842int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002843 if (cb == NULL)
2844 {
2845 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08002846 return -1;
2847 }
2848
2849 g_ap_callback_priv = priv;
2850 g_ap_callback_func = cb;
2851
2852 return 0;
2853}
2854
2855int lynq_unreg_ap_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002856 if (g_ap_callback_priv == priv)
2857 {
you.chen35020192022-05-06 11:30:57 +08002858 g_ap_callback_func = NULL;
2859 g_ap_callback_priv = NULL;
2860 return 0;
2861 }
2862 return -1;
2863}
2864
2865int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08002866 if (cb == NULL)
2867 {
2868 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08002869 return -1;
2870 }
2871
2872 g_sta_callback_priv = priv;
2873 g_sta_callback_func = cb;
2874
2875 return 0;
2876}
2877
2878int lynq_unreg_sta_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002879 if (g_sta_callback_priv == priv)
2880 {
you.chen35020192022-05-06 11:30:57 +08002881 g_sta_callback_func = NULL;
2882 g_sta_callback_priv = NULL;
2883 return 0;
2884 }
2885 return -1;
2886}
2887
2888
2889static int inner_get_status_info_state (int interface, char *state) {
2890 curr_status_info curr_state;
2891 curr_state.ap = NULL;
2892 curr_state.state = state;
2893 return inner_get_status_info(interface, &curr_state);
2894}
2895
2896int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
2897{
2898 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002899 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08002900 CHECK_IDX(idx, CTRL_AP);
2901
qs.xiong9fbf74e2023-03-28 13:38:22 +08002902 if (inner_get_status_info_state(CTRL_AP, state) != 0)
2903 {
you.chen35020192022-05-06 11:30:57 +08002904 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
2905 return 0;
2906 }
2907
qs.xiong9fbf74e2023-03-28 13:38:22 +08002908 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
2909 {
you.chen35020192022-05-06 11:30:57 +08002910 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
2911 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002912 else
2913 {
you.chen35020192022-05-06 11:30:57 +08002914 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
2915 }
2916
2917 return 0;
2918}
2919
2920int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
2921 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002922 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08002923 CHECK_IDX(idx, CTRL_STA);
2924
qs.xiong9fbf74e2023-03-28 13:38:22 +08002925 if (inner_get_status_info_state(CTRL_STA, state) != 0)
2926 {
you.chen35020192022-05-06 11:30:57 +08002927 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
2928 return 0;
2929 }
2930
qs.xiong9fbf74e2023-03-28 13:38:22 +08002931 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
2932 {
you.chen35020192022-05-06 11:30:57 +08002933 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
2934 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002935 else
2936 {
you.chen35020192022-05-06 11:30:57 +08002937 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
2938 }
2939
2940 return 0;
2941}
2942
2943int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
2944// CHECK_IDX(idx, CTRL_AP);
2945// int ret = 0;
2946// size_t reply_len = MAX_RET;
2947// char cmd_reply[MAX_RET]={0};
2948// const char * cmd_str = "GET country";
2949// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
2950// do{
2951// if (NULL == s_lynq_wpa_ctrl) {
2952// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
2953// if (NULL == s_lynq_wpa_ctrl ) {
2954// printf("wpa_ctrl_open fail\n");
2955// return -1;
2956// }
2957// }
2958// }while(0);
2959
2960// do {
2961// reply_len = MAX_RET;
2962// cmd_reply[0] = '\0';
2963// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08002964// 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 +08002965// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002966// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08002967// return ret;
2968// }
2969// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08002970// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08002971// }while(0);
2972
2973 FILE *fp;
2974 size_t i = 0;
2975 char lynq_cmd_ret[MAX_RET]={0};
2976
2977// CHECK_IDX(idx, CTRL_AP);
2978
2979 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002980 {
2981 perror("popen error!");
2982 return -1;
2983 }
you.chen35020192022-05-06 11:30:57 +08002984 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
2985 {
2986 perror("fread fail!");
2987 return -1;
2988 }
2989
qs.xiong9fbf74e2023-03-28 13:38:22 +08002990 for(i=0; i < strlen(lynq_cmd_ret); i++)
2991 {
2992 if (lynq_cmd_ret[i] == ' ')
2993 {
you.chen35020192022-05-06 11:30:57 +08002994 lynq_cmd_ret[i] = '\0';
2995 break;
2996 }
2997 }
2998
2999 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003000 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08003001
3002 int ret=pclose(fp);
3003 if(ret==-1)
3004 {
3005 perror("close file faild");
3006 }
3007
3008 return 0;
3009}
3010
3011int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
3012// const char * cmd_str = "GET country";
3013// CHECK_IDX(idx, CTRL_AP);
3014// CHECK_WPA_CTRL(CTRL_STA);
3015
3016// DO_REQUEST(cmd_str);
3017// printf("result %s\n", cmd_reply);
3018
qs.xiong9fbf74e2023-03-28 13:38:22 +08003019 if (country_code == NULL || *country_code == '\0')
3020 {
3021 RLOGD("bad country code\n");
you.chen35020192022-05-06 11:30:57 +08003022 return -1;
3023 }
3024
3025 char lynq_country_cmd[MAX_CMD];
3026 sprintf(lynq_country_cmd, "wl country %s", country_code);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003027 if (system(lynq_country_cmd) == 0)
3028 {
you.chen35020192022-05-06 11:30:57 +08003029 return 0;
3030 }
3031
3032 return -1;
3033}
3034
3035int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
3036{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003037 RLOGD("enter lynq_get_connect_ap_mac\n");
3038 if (mac == NULL)
3039 {
3040 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08003041 return -1;
3042 }
3043
3044 CHECK_IDX(idx, CTRL_STA);
3045 ap_info_s ap;
3046 ap.ap_mac[0] = '\0';
3047
qs.xiong9fbf74e2023-03-28 13:38:22 +08003048 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3049 {
you.chen35020192022-05-06 11:30:57 +08003050 return -1;
3051 }
3052 strcpy(mac, ap.ap_mac);
3053
3054 return 0;
3055}
3056
3057int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
3058{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003059 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08003060 struct ifaddrs *ifaddr_header, *ifaddr;
3061 struct in_addr * ifa;
3062 const char * ifaName = "wlan0";
3063 if (ip == NULL)
3064 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003065 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08003066 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003067 }
you.chenf58b3c92022-06-21 16:53:48 +08003068
qs.xiong9fbf74e2023-03-28 13:38:22 +08003069 if (idx == 1)
3070 {
you.chen6c2dd9c2022-05-16 17:55:28 +08003071 ifaName = "tether";
you.chen9ac66392022-08-06 17:01:16 +08003072 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003073 else if (idx != 0)
3074 {
you.chen35020192022-05-06 11:30:57 +08003075 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003076 }
you.chen35020192022-05-06 11:30:57 +08003077
you.chen9ac66392022-08-06 17:01:16 +08003078 if (getifaddrs(&ifaddr_header) == -1)
3079 {
you.chen35020192022-05-06 11:30:57 +08003080 perror("getifaddrs");
3081 return -1;
3082 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08003083 }
you.chen35020192022-05-06 11:30:57 +08003084
3085
you.chen9ac66392022-08-06 17:01:16 +08003086 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3087 {
3088 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08003089 continue;
you.chen9ac66392022-08-06 17:01:16 +08003090 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3091 {
3092 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3093 {
3094 // is a valid IP4 Address
3095 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3096 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003097 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08003098 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003099 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08003100 return 0;
3101 }
3102 }
3103 }
qs.xiongc4f007c2023-02-08 18:16:58 +08003104 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003105 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08003106 return -1;
you.chen35020192022-05-06 11:30:57 +08003107}
3108
3109int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3110{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003111 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08003112 int count;
3113 size_t i;
3114 char *split_words[128] = {0};
3115 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3116
3117 CHECK_WPA_CTRL(idx);
3118
3119 DO_REQUEST(lynq_get_mac_cmd);
3120
qs.xiong9fbf74e2023-03-28 13:38:22 +08003121 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3122 {
3123 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08003124 return -1;
3125 }
3126
3127 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3128
qs.xiong9fbf74e2023-03-28 13:38:22 +08003129 if (count < 2)
3130 {
you.chen35020192022-05-06 11:30:57 +08003131 return -1;
3132 }
3133
qs.xiong9fbf74e2023-03-28 13:38:22 +08003134 for (i=0; i < strlen(split_words[1]); i++ )
3135 {
3136 if (split_words[1][i] != ' ')
3137 {
you.chen35020192022-05-06 11:30:57 +08003138 break;
3139 }
3140 }
3141
3142 strcpy(mac, split_words[1] + i);
3143
3144 return 0;
3145}
3146
3147int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3148{
3149// int count;
3150// char *split_words[128] = {0};
3151// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3152
3153// if (rssi == NULL) {
3154// return -1;
3155// }
3156
3157// CHECK_IDX(idx, CTRL_STA);
3158
3159// CHECK_WPA_CTRL(CTRL_STA);
3160
3161// DO_REQUEST(lynq_get_rssi_cmd);
3162
3163// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3164// return -1;
3165// }
3166
3167// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3168
3169// if (count < 2) {
3170// return -1;
3171// }
3172
3173// *rssi = atoi(split_words[1]) * -1;
3174
you.chen35020192022-05-06 11:30:57 +08003175 char lynq_cmd_ret[MAX_RET]={0};
3176
qs.xiongff0ae0f2022-10-11 15:47:14 +08003177/*******change other cmd to get rssi*******
3178 *
3179 *wl rssi ---> wl -i wlan0 rssi
3180 *
3181 ***** change by qs.xiong 20221011*******/
you.chen23c4a5f2023-04-12 16:46:00 +08003182 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiong9fbf74e2023-03-28 13:38:22 +08003183 {
you.chen23c4a5f2023-04-12 16:46:00 +08003184 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen35020192022-05-06 11:30:57 +08003185 return -1;
3186 }
you.chen9f17e4d2022-06-06 17:18:18 +08003187 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003188/****** if got rssi is 0,means sta didn't connected any device****/
3189 if(*rssi == 0)
3190 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003191 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chen23c4a5f2023-04-12 16:46:00 +08003192 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003193 }
you.chen35020192022-05-06 11:30:57 +08003194
3195 return 0;
3196}
3197
3198int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3199{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003200 RLOGD("enter lynq_get_connect_ap_band\n");
3201 if (band == NULL)
3202 {
you.chen35020192022-05-06 11:30:57 +08003203 return -1;
3204 }
3205
3206 CHECK_IDX(idx, CTRL_STA);
3207 ap_info_s ap;
3208 ap.band = -1;
3209
qs.xiong9fbf74e2023-03-28 13:38:22 +08003210 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3211 {
you.chen35020192022-05-06 11:30:57 +08003212 return -1;
3213 }
3214 *band = ap.band;
3215
3216 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003217}
you.chenf58b3c92022-06-21 16:53:48 +08003218
3219int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3220{
qs.xionge4cbf1c2023-02-28 18:22:49 +08003221 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003222
3223 if (ip == NULL)
3224 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003225 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003226 return -1;
3227 }
3228
3229 CHECK_IDX(idx, CTRL_STA);
3230
qs.xionge4cbf1c2023-02-28 18:22:49 +08003231 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003232 {
3233 return -1;
3234 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003235
3236 return inner_get_ip_by_mac(bssid, ip, 32); //better input by user
you.chenf58b3c92022-06-21 16:53:48 +08003237}
3238
qs.xiong026c5c72022-10-17 11:15:45 +08003239int lynq_ap_connect_num(int sta_number)
3240{
3241 char lynq_limit_cmd[32]={0};
3242 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003243 if((sta_number < 1 ) && (sta_number > 15))
3244 {
3245 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003246 return -1;
3247 }
3248 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3249 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003250 if(ret != 0)
3251 {
3252 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003253 }
3254 return 0;
3255}
you.chenf58b3c92022-06-21 16:53:48 +08003256
qs.xiong77905552022-10-17 11:19:57 +08003257int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3258{
3259
3260 char lynq_wifi_acs_cmd[128]={0};
3261 char lynq_cmd_mode[128]={0};
3262 char lynq_cmd_slect[128]={0};
3263
qs.xiong9fbf74e2023-03-28 13:38:22 +08003264 if((acs_mode != 2) && (acs_mode != 5))
3265 {
qs.xiong77905552022-10-17 11:19:57 +08003266 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3267 }
3268
qs.xiong9fbf74e2023-03-28 13:38:22 +08003269 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3270 {
qs.xiong77905552022-10-17 11:19:57 +08003271 return -1;
3272 }
3273
3274 CHECK_IDX(idx, CTRL_AP);
3275
3276 CHECK_WPA_CTRL(CTRL_AP);
3277
3278 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3279 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3280 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3281
3282 DO_OK_FAIL_REQUEST(cmd_disconnect);
3283 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3284 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3285 DO_OK_FAIL_REQUEST(cmd_save_config);
3286 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3287
3288 return 0;
3289}
you.chen0f5c6432022-11-07 18:31:14 +08003290//you.chen add for tv-box start
3291static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3292 FILE *fp;
3293 //printf("to exec cmd:%s\n", str_cmd);
3294 if((fp=popen(str_cmd,"r"))==NULL)
3295 {
3296 perror("popen error!");
3297 return -1;
3298 }
3299 if((fread(str_cmd_ret,max_len,1,fp))<0)
3300 {
3301 perror("fread fail!");
3302 fclose(fp);
3303 return -1;
3304 }
3305 fclose(fp);
3306 return 0;
3307}
3308
3309static int get_netmask_length(const char* mask)
3310{
3311 int masklen=0, i=0;
3312 int netmask=0;
3313
3314 if(mask == NULL)
3315 {
3316 return 0;
3317 }
3318
3319 struct in_addr ip_addr;
3320 if( inet_aton(mask, &ip_addr) )
3321 {
3322 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003323 }else
3324 {
you.chen0f5c6432022-11-07 18:31:14 +08003325 netmask = 0;
3326 return 0;
3327 }
3328
3329 while(0 == (netmask & 0x01) && i<32)
3330 {
3331 i++;
3332 netmask = netmask>>1;
3333 }
3334 masklen = 32-i;
3335 return masklen;
3336}
3337
3338static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3339 int mask_len;
3340 char *p;
3341 char tmp[64] = {0};
3342 if (exec_cmd("ifconfig tether | grep Mask", str_cmd_ret, max_len) != 0)
3343 return -1;
3344 p = strstr(str_cmd_ret, "Mask:");
3345 if (p == NULL)
3346 return -1;
3347 mask_len = get_netmask_length(p + 5);
3348 if (mask_len == 0)
3349 return -1;
3350 p = strstr(str_cmd_ret, "inet addr:");
3351 if (p == NULL)
3352 return -1;
3353 strcpy(tmp, p + 10);
3354 p = strstr(tmp, " ");
3355 if (p != NULL)
3356 *p = '\0';
3357 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
3358 return 0;
3359}
3360
3361static void GBWWatchThreadProc() {
3362 int i,n, nloop, nmax, ncheckcount, nidlecount;
3363 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
3364 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
3365 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
3366 char *results[16] = {0};
3367 char str_cmd[256] = {0};
3368 char str_cmd_ret[128] = {0};
3369 char dest_ip[32] = {0};
3370 lastAP1Bytes = lastAP2Bytes = 0;
3371 lastAP1Drop = lastAP2Drop = 0;
3372 lastAP1Speed = lastAP2Speed = 0;
3373 setAP1Speed = 50;
3374 setAP2Speed = 80;
3375 nloop = 0;
3376 nmax = 6;
3377 ncheckcount = nidlecount = 0;
3378
qs.xiong9fbf74e2023-03-28 13:38:22 +08003379 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08003380 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
3381 while (dest_ip[0] == '\0') {
3382 sleep(1);
3383 str_cmd_ret[0] = '\0';
3384 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
3385 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
3386 if (str_cmd_ret[n] == '\n'){
3387 str_cmd_ret[n] = '\0';
3388 break;
3389 }
3390 }
3391 if (str_cmd_ret[0] != '\0')
3392 {
3393 strcpy(dest_ip, str_cmd_ret);
3394 }
3395 }
3396
3397 system("tc qdisc del dev tether root > /dev/null 2>&1");
3398 system("tc qdisc add dev tether root handle 1: htb r2q 1");
3399 system("tc class add dev tether parent 1: classid 1:1 htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000");
3400 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
3401 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003402 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08003403 return;
3404 }
3405 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);
3406 system(str_cmd);
3407 system("tc class add dev tether parent 1: classid 1:2 htb rate 80Mbit ceil 100Mbit prio 0 quantum 3000000");
3408 sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", dest_ip);
3409 //printf("----cmd:%s\n", str_cmd);
3410 system(str_cmd);
3411
3412 while (1) {
3413 sleep(1);
3414 memset(str_cmd, 0, sizeof(str_cmd));
3415 if (0 != exec_cmd("tc -s class show dev tether classid 1:1 | grep Sent", str_cmd, sizeof (str_cmd)))
3416 continue;
3417 //printf("ap1 --- %s\n", str_cmd);
3418 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3419 if (n > 9) {
3420 if (strcmp(results[1], "Sent") == 0) {
3421 currAP1Bytes = atoll(results[2]);
3422 }
3423 if (strcmp(results[6], "(dropped") == 0) {
3424 currAP1Drop = atoi(results[7]);
3425 }
3426 }
3427
3428 memset(str_cmd, 0, sizeof(str_cmd));
3429 if (0 != exec_cmd("tc -s class show dev tether classid 1:2 | grep Sent", str_cmd, sizeof (str_cmd)))
3430 continue;
3431 //printf("ap2 --- %s\n", str_cmd);
3432 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3433 if (n > 9) {
3434 if (strcmp(results[1], "Sent") == 0) {
3435 currAP2Bytes = atoll(results[2]);
3436 }
3437 if (strcmp(results[6], "(dropped") == 0) {
3438 currAP2Drop = atoi(results[7]);
3439 }
3440 }
3441
3442 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
3443 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
3444 lastAP1Bytes = currAP1Bytes;
3445 lastAP2Bytes = currAP2Bytes;
3446 continue;
3447 }
3448
3449 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
3450 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
3451 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
3452 lastAP1Speed = currAP1Speed;
3453 lastAP2Speed = currAP2Speed;
3454 lastAP1Bytes = currAP1Bytes;
3455 lastAP2Bytes = currAP2Bytes;
3456
3457 currSetAP1Speed = setAP1Speed;
3458 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
3459 ncheckcount++;
3460 if (ncheckcount > 3) {
3461 ncheckcount = 0;
3462 currSetAP1Speed = 5;
3463 }
3464 }
3465 else {
3466 ncheckcount = 0;
3467 if (currAP1Speed < 5)
3468 nidlecount++;
3469 else
3470 nidlecount = 0;
3471
3472 }
3473
3474 if (nidlecount > 60 ){
3475 currSetAP1Speed = 50;
3476 }
3477
3478 if (currSetAP1Speed != setAP1Speed) {
3479 setAP1Speed = currSetAP1Speed;
3480 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));
3481 //printf("------***change speed: %s\n", str_cmd);
3482 system(str_cmd);
3483 }
3484 }
3485}
3486
3487int enableGBW(const char* mac) {
3488 int i,len;
3489 char get_ipaddr_cmd[128]={0};
3490 ap_info_s *ap;
3491 device_info_s * list;
3492
3493 if (mac == NULL || g_gbw_enabled == 1)
3494 return -1;
3495 len = strlen(mac);
3496 g_gbw_mac = malloc(len + 1);
3497 for(i=0;i<len;i++) {
3498 if (mac[i] >= 'A' && mac[i] <= 'Z')
3499 {
3500 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
3501 }
3502 else
3503 g_gbw_mac[i] = mac[i];
3504 }
3505 g_gbw_mac[i] = '\0';
3506 g_gbw_enabled = 1;
3507
3508 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
3509 if (system(get_ipaddr_cmd) == 0) {
3510 //startGBW();
3511 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
3512 for (i=0;i<len;i++) {
3513 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
3514 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
3515 startGBW();
3516 }
3517 free(ap);
3518 free(list);
3519 }
3520 }
3521 return 0;
3522}
3523
3524int disableGBW() {
3525 stopGBW();
3526 free(g_gbw_mac);
3527 g_gbw_mac = NULL;
3528 g_gbw_enabled = 1;
3529 return 0;
3530}
3531
3532static int startGBW() {
3533 if (g_gbw_watcher_pid != 0) {
3534 stopGBW();
3535 }
3536 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
3537}
3538
3539static int stopGBW() {
3540 void* retval;
3541 pthread_cancel(g_gbw_watcher_pid);
3542 pthread_join(g_gbw_watcher_pid, &retval);
3543 g_gbw_watcher_pid = 0;
3544 system("tc qdisc del dev tether root");
3545}
3546//you.chen add for tv-box end