blob: d2df2913b50102c8e2eec8bef22b39a52cb4e9f0 [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
you.chen32cb31e2023-04-13 14:05:45 +0800440 RLOGD("EVENT : %s\n", modify);
qs.xiong455c30b2023-04-12 11:40:02 +0800441 *error = LYNQ_UNSPECIFIED_REASON;
you.chen32cb31e2023-04-13 14:05:45 +0800442 *state = LYNQ_WIFI_STATUS_EGNORE;
qs.xiong455c30b2023-04-12 11:40:02 +0800443 RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
444 return;
445
446}
447
you.chen35020192022-05-06 11:30:57 +0800448static void STAWatcherThreadProc() {
449 size_t len = MAX_RET;
450 char msg_notify[MAX_RET];
you.chen35020192022-05-06 11:30:57 +0800451 error_number_s error;
qs.xiong455c30b2023-04-12 11:40:02 +0800452 lynq_wifi_sta_status_s state;
you.chenf711c8a2023-04-13 13:49:45 +0800453 int idle_count = 0;
qs.xiongf1b525b2022-03-31 00:58:23 -0400454
you.chen6c2dd9c2022-05-16 17:55:28 +0800455 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800456 g_sta_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800457
qs.xiong9fbf74e2023-03-28 13:38:22 +0800458 while (g_sta_watcher_stop_flag == 0)
459 {
you.chenf711c8a2023-04-13 13:49:45 +0800460 if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
qs.xiong455c30b2023-04-12 11:40:02 +0800461 {
you.chen35020192022-05-06 11:30:57 +0800462 continue;
463 }
you.chenf711c8a2023-04-13 13:49:45 +0800464
you.chen6c2dd9c2022-05-16 17:55:28 +0800465 memset(msg_notify, 0, MAX_RET);
466 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800467 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
qs.xiong455c30b2023-04-12 11:40:02 +0800468 {
you.chen35020192022-05-06 11:30:57 +0800469 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800470 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
471 if (strstr(msg_notify, state_scan_result) != NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800472 {
you.chen35020192022-05-06 11:30:57 +0800473 g_sta_scan_finish_flag = 1;
474 }
475
qs.xiong9fbf74e2023-03-28 13:38:22 +0800476 if (g_sta_callback_func == NULL)
qs.xiong455c30b2023-04-12 11:40:02 +0800477 {
you.chen35020192022-05-06 11:30:57 +0800478 continue;
479 }
qs.xiong455c30b2023-04-12 11:40:02 +0800480 get_state_error(msg_notify,&state,&error);
you.chen32cb31e2023-04-13 14:05:45 +0800481 if (state != LYNQ_WIFI_STATUS_EGNORE)
482 {
483 RLOGD("STAWatcherThreadProc callback begin ------> %d %d\n", state, error);
484 g_sta_callback_func(g_sta_callback_priv, state, error);
485 RLOGD("STAWatcherThreadProc callback end ------> %d %d\n", state, error);
486 }
you.chen35020192022-05-06 11:30:57 +0800487 }
488 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800489 if (lynq_wpa_ctrl != NULL)
490 {
you.chen92fd5d32022-05-25 10:09:47 +0800491 wpa_ctrl_detach(lynq_wpa_ctrl);
492 wpa_ctrl_close(lynq_wpa_ctrl);
493 }
qs.xiongf1b525b2022-03-31 00:58:23 -0400494}
495
qs.xiong1af5daf2022-03-14 09:12:12 -0400496int lynq_wifi_enable(void)
497{
you.chen35020192022-05-06 11:30:57 +0800498 int ret = 0;
you.chen6c2dd9c2022-05-16 17:55:28 +0800499 int i;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800500 RLOGD("enter lynq_wifi_enable");
you.chend2fef3f2023-02-13 10:50:35 +0800501 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
502
qs.xiong9fbf74e2023-03-28 13:38:22 +0800503 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
504 {
you.chend2fef3f2023-02-13 10:50:35 +0800505 goto out_enable;
506 }
507
you.chen35020192022-05-06 11:30:57 +0800508 const char * cmd_check_service =
509 "state=`systemctl is-active wg870_drv_insmod.service`\n"
510 "[ \"\"$state == \"active\" ] && exit 0\n"
511 "[ \"\"$state == \"inactive\" ] && systemctl start wg870_drv_insmod.service\n";
512// if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL) {
513// return 0;
514// }
qs.xiong1af5daf2022-03-14 09:12:12 -0400515
you.chen35020192022-05-06 11:30:57 +0800516 ret = system(cmd_check_service);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800517 if (ret != 0)
518 {
519 //printf("service state %d\n", ret);
520 RLOGE("[wifi error]service state %d",ret);
you.chend2fef3f2023-02-13 10:50:35 +0800521 ret = -1;
522 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800523 }
lhfe8da902022-10-11 18:55:36 +0800524
qs.xiong9fbf74e2023-03-28 13:38:22 +0800525 RLOGD("check service state is OK");
526 for (i=0; i<10; i++)
527 {
you.chena6fa5b22022-05-18 10:28:19 +0800528 if (system("connmanctl technologies | grep -q \"/net/connman/technology/wifi\"") == 0) {
you.chen6c2dd9c2022-05-16 17:55:28 +0800529 break;
530 }
531 usleep(300*1000);
532 }
533
qs.xiong9fbf74e2023-03-28 13:38:22 +0800534 if (i >= 10)
535 {
536 RLOGE("[wifi error] check connman technologies no wifi");
you.chend2fef3f2023-02-13 10:50:35 +0800537 ret = -1;
538 goto out_enable;
you.chen6c2dd9c2022-05-16 17:55:28 +0800539 }
540
you.chen9f17e4d2022-06-06 17:18:18 +0800541 //@todo delete add temp check for socket avilable start (20220606)
542 for (i=0; i<60; i++)
543 {
544 if (system("netstat -an | grep -q DGRAM") == 0) {
545 break;
546 }
547 sleep(1);
548 }
549
550 if (i >= 60)
551 {
you.chend2fef3f2023-02-13 10:50:35 +0800552 ret = -1;
553 goto out_enable;
you.chen9f17e4d2022-06-06 17:18:18 +0800554 }
555 //@todo delete add temp check for socket avilable end (20220606)
556
qs.xiong9fbf74e2023-03-28 13:38:22 +0800557 if (0 != system("ifconfig | grep -q ap0"))
558 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800559 system("connmanctl enable wifi");
you.chena6fa5b22022-05-18 10:28:19 +0800560 usleep(300*1000);
you.chen01bfac32022-06-07 10:36:00 +0800561 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disconnect");
you.chen6c2dd9c2022-05-16 17:55:28 +0800562 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 DRIVER interface_create ap0");
you.chena6fa5b22022-05-18 10:28:19 +0800563 usleep(300*1000);
you.chen6c2dd9c2022-05-16 17:55:28 +0800564 system("connmanctl tether wifi on lynq 1qaz@WSX#$%^");
you.chena6fa5b22022-05-18 10:28:19 +0800565 usleep(300*1000);
you.chen01bfac32022-06-07 10:36:00 +0800566 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=ap0 disconnect");
you.chen6c2dd9c2022-05-16 17:55:28 +0800567 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800568 if (g_ap_watcher_pid == 0 )
qs.xiong55f32762023-02-16 15:59:45 +0800569 {
you.chen35020192022-05-06 11:30:57 +0800570 ret=pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800571 if(ret<0)
572 {
573 RLOGE("[wifi error]creat APWatcherThreadProc fail");
you.chend2fef3f2023-02-13 10:50:35 +0800574 ret = -1;
575 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800576 }
577 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800578
579 RLOGD("creat APWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +0800580 if (g_sta_watcher_pid == 0 ) {
581 ret=pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800582 if(ret<0)
583 {
584 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
you.chend2fef3f2023-02-13 10:50:35 +0800585 ret = -1;
586 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800587 }
588 }
589
qs.xiong9fbf74e2023-03-28 13:38:22 +0800590 RLOGD("creat STAWatcherTheradProc susccs");
591 for (i=0; i<10; i++)
592 {
you.chena6fa5b22022-05-18 10:28:19 +0800593 usleep(300*1000);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800594 if (g_ap_watcher_started_flag == 1 && g_sta_watcher_started_flag == 1)
595 {
you.chena6fa5b22022-05-18 10:28:19 +0800596 break;
597 }
598 }
599
you.chend2fef3f2023-02-13 10:50:35 +0800600 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
601 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
602 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
603 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
604out_enable:
605 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800606 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500607}
608
qs.xiong1af5daf2022-03-14 09:12:12 -0400609int lynq_wifi_disable(void)
610{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800611 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800612 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800613 g_ap_watcher_stop_flag = 1;
614 g_sta_watcher_stop_flag = 1;
615 if (g_ap_watcher_pid != 0)
616 pthread_join(g_ap_watcher_pid, NULL);
617 if (g_sta_watcher_pid != 0)
618 pthread_join(g_sta_watcher_pid, NULL);
619 if (g_lynq_wpa_ctrl[0] != NULL)
620 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
621 if (g_lynq_wpa_ctrl[1] != NULL)
622 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
623 g_ap_watcher_pid = 0;
624 g_sta_watcher_pid = 0;
625 g_lynq_wpa_ctrl[0] = NULL;
626 g_lynq_wpa_ctrl[1] = NULL;
627 system("systemctl stop wg870_drv_insmod.service");
you.chend2fef3f2023-02-13 10:50:35 +0800628 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
629 return 0;
630}
631
632static inline char inner_convert_char(char in)
633{
634 if (in >= '0' && in <= '9')
635 {
636 return in - '0';
637 }
638 else if (in >= 'a' && in <= 'f')
639 {
640 return in - 'a' + 10;
641 }
642 else if (in >= 'A' && in <= 'F')
643 {
644 return in - 'A' + 10;
645 }
646 else
647 {
648 return '\xff';
649 }
650}
651
652static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
653{
654 char *p;
655 size_t pos = 0;
656 if (NULL == out_ssid)
657 return;
658 //printf("input ssid=[%s]\n", ssid);
659 memset(out_ssid, 0, out_ssid_len);
660 if (NULL == ssid)
661 return;
662 p = strchr(ssid, '\\');
663 if (NULL == p)
664 {
665 strncpy(out_ssid, ssid, out_ssid_len);
666 //printf(" first %s\n", out_ssid);
667 }
668 else
669 {
670 pos = p - ssid;
671 memcpy(out_ssid, ssid, pos);
672 //printf("pos %lu -- %s\n", pos, out_ssid);
673 for(; pos < out_ssid_len; pos ++)
674 {
675 if (p[0] == '\0')
676 {
677 //printf(" out %s\n", out_ssid);
678 return;
679 }
680 else if (p[0] != '\\')
681 {
682 out_ssid[pos] = p[0];
683 p += 1;
684 }
685 else if (p[1] == 'x' || p[1] == 'X')
686 {
687 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
688 p += 4;
689 }
690 else if (p[1] == '\\')
691 {
692 out_ssid[pos] = '\\';
693 p += 2;
694 }
695 else if (p[1] == 't')
696 {
697 out_ssid[pos] = '\t';
698 p += 2;
699 }
700 else if (p[1] == 'r')
701 {
702 out_ssid[pos] = '\r';
703 p += 2;
704 }
705 else if (p[1] == 'n')
706 {
707 out_ssid[pos] = '\n';
708 p += 2;
709 }//todo find a better way to convert?
710 }
711 }
712 //printf(" out %s\n", out_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -0500713}
qs.xiong1af5daf2022-03-14 09:12:12 -0400714
you.chen35020192022-05-06 11:30:57 +0800715static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +0800716 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +0800717 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +0800718 RLOGD("enter inner_get_param");
719 if (out_put == NULL)
720 {
721 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +0800722 return -1;
723 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800724 if (param_name == NULL)
725 {
726 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +0800727 return -1;
728 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800729 if (param_name[0] == '\0')
730 {
731 RLOGE("param is empty");
you.chen35020192022-05-06 11:30:57 +0800732 return -1;
733 }
734
735 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
736
737 CHECK_WPA_CTRL(interface);
738
739 DO_REQUEST(lynq_cmd_get);
740
qs.xiong9fbf74e2023-03-28 13:38:22 +0800741 if (memcmp(cmd_reply, "FAIL", 4) == 0)
742 {
743 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +0800744 return -1;
745 }
746
you.chena6fa5b22022-05-18 10:28:19 +0800747// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +0800748 if (strcmp(param_name, "ssid") == 0)
749 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800750 if (cmd_reply[0] == '\"')
751 {
you.chend2fef3f2023-02-13 10:50:35 +0800752 ssid_len = reply_len - 1;
753 memcpy(out_put, cmd_reply + 1, ssid_len);
754 if (out_put[ssid_len-1] == '\"')
755 {
756 out_put[ssid_len-1] = '\0';
757 }
758 else
759 {
760 out_put[ssid_len] = '\0';
761 }
762 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800763 else
764 {
you.chend2fef3f2023-02-13 10:50:35 +0800765 ssid_len = reply_len / 2;
766 for(i=0; i<ssid_len; i++)
767 {
768 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
769 }
770 out_put[ssid_len] = '\0';
771 }
772 }
773 else
774 {
775 memcpy(out_put, cmd_reply, reply_len + 1);
776 }
you.chen35020192022-05-06 11:30:57 +0800777 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -0500778}
qs.xiong1af5daf2022-03-14 09:12:12 -0400779
you.chen35020192022-05-06 11:30:57 +0800780static int lynq_split(char * str, int len, char delimiter, char * results[]) {
781 int ret = 0;
782 char * end = str + len - 1;
783 results[ret++] = str;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800784 while(str < end)
785 {
786 if (*str == delimiter)
787 {
you.chen35020192022-05-06 11:30:57 +0800788 *str++ = '\0';
789 results[ret++] = str;
790 continue;
791 }
792 str++;
793 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800794 if (*str == delimiter)
795 {
you.chen35020192022-05-06 11:30:57 +0800796 *str = '\0';
797 }
qs.xiong1af5daf2022-03-14 09:12:12 -0400798
you.chen35020192022-05-06 11:30:57 +0800799 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500800}
801
you.chend2fef3f2023-02-13 10:50:35 +0800802static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
803{
804 char * p;
805 int ret = 0;
806 char cmd[256]={0};
807 if (NULL == mac || NULL == ip)
you.chen35020192022-05-06 11:30:57 +0800808 return -1;
you.chend2fef3f2023-02-13 10:50:35 +0800809 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +0800810 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-02-13 10:50:35 +0800811 ret = exec_cmd(cmd, ip, ip_len);
812 p = strchr(ip, '\n');
813 if (NULL != p)
814 {
815 *p = '\0';
you.chen35020192022-05-06 11:30:57 +0800816 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800817 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +0800818 return ret;
819}
820
you.chend2fef3f2023-02-13 10:50:35 +0800821static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +0800822 struct in_addr addr ={0};
823 struct hostent *ht;
824
qs.xiong9fbf74e2023-03-28 13:38:22 +0800825 if (ip == NULL || *ip == '\0' || hostname == NULL)
826 {
827 RLOGE("ip == NULL or hostname == NULL");
828 return -1;
you.chen35020192022-05-06 11:30:57 +0800829 }
830
you.chend2fef3f2023-02-13 10:50:35 +0800831 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800832 if (inet_aton(ip, &addr) == 0)
833 {
you.chen35020192022-05-06 11:30:57 +0800834 printf("---inet_aton fail\n");
835 return -1;
836 }
837
838 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
839
qs.xiong9fbf74e2023-03-28 13:38:22 +0800840 if (ht == NULL)
841 {
842 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-05-06 11:30:57 +0800843 herror(NULL);
844 return -1;
845 }
846
847 strcpy(hostname, ht->h_name);
848
849 return 0;
850}
851
852static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
853{
854 int count, index, words_count;
855 char * split_lines[128]= {0};
856 char * split_words[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +0800857 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +0800858 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +0800859 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-05-06 11:30:57 +0800860
861 CHECK_WPA_CTRL(ap_sta);
862
863 DO_REQUEST(lynq_wifi_list_networks);
864
865 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
866
867 //@todo check ssid field to compatible
868
869 ret = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800870 for(index=1; index < count; index++)
871 {
you.chen35020192022-05-06 11:30:57 +0800872 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800873 if (words_count > 2)
874 {
you.chend2fef3f2023-02-13 10:50:35 +0800875 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +0800876 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
877 {
you.chen35020192022-05-06 11:30:57 +0800878 net_no_list[ret++] = atoi(split_words[0]);
879 }
880 }
881 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800882 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +0800883 return ret;
884}
885
886static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +0800887 size_t i=0;
you.chen35020192022-05-06 11:30:57 +0800888 CHECK_WPA_CTRL(ap_sta);
889 const char *lynq_wifi_add_network = "ADD_NETWORK";
890
qs.xiong9fbf74e2023-03-28 13:38:22 +0800891 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +0800892 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800893 if (memcmp(cmd_reply, "FAIL", 4) == 0)
894 {
895 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen35020192022-05-06 11:30:57 +0800896 return -1;
897 }
898
qs.xiong9fbf74e2023-03-28 13:38:22 +0800899 for(i=0;i<reply_len;i++)
900 {
901 if(cmd_reply[i] == '\n')
902 {
you.chen35020192022-05-06 11:30:57 +0800903 cmd_reply[i] = '\0';
904 break;
905 }
906 }
907 return atoi(cmd_reply);
908}
you.chena6cd55a2022-05-08 12:20:18 +0800909
you.chen35020192022-05-06 11:30:57 +0800910static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
911{
912 int count, index;
913 int net_no_list[128];
914
qs.xiong9fbf74e2023-03-28 13:38:22 +0800915 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +0800916 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800917 for (index=0; index < count; index++)
918 {
919 if (net_no_list[index] == net_no)
920 {
you.chen35020192022-05-06 11:30:57 +0800921 return 0;
922 }
923 }
924
925 if (count >= 1)
926 index = net_no_list[count - 1];
927 else
928 index = -1;
929
qs.xiong9fbf74e2023-03-28 13:38:22 +0800930 while (index < net_no )
931 {
you.chen35020192022-05-06 11:30:57 +0800932 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800933 if (index >= net_no)
934 { // required network no created
935 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +0800936 return 0;
937 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800938 else if( index < 0)
939 {
940 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +0800941 return -1;
942 }
you.chen35020192022-05-06 11:30:57 +0800943 }
944
945 if (index < 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800946 {
947 RLOGE("[lynq_check_network_number] network index < 0");
948 return -1;
949 }
950 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen35020192022-05-06 11:30:57 +0800951 return 0;
952}
953
954static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +0800955 if (freq > 5000 && freq < 6000)
956 {
you.chen35020192022-05-06 11:30:57 +0800957 return LYNQ_WIFI_5G_band;
958 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800959 else if (freq > 2000 && freq < 3000)
960 {
you.chen35020192022-05-06 11:30:57 +0800961 return LYNQ_WIFI_2G_band;
962 }
963 return LYNQ_WIFI_2_and_5G_band;
964}
965
966static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800967 if (key_mgmt != NULL)
968 {
969 if (memcmp( key_mgmt, "NONE", 4) == 0)
970 {
you.chen35020192022-05-06 11:30:57 +0800971 return LYNQ_WIFI_AUTH_OPEN;
972 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800973 else if (memcmp( key_mgmt, "WEP", 3) == 0)
974 {
you.chen35020192022-05-06 11:30:57 +0800975 return LYNQ_WIFI_AUTH_WEP;
976 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800977 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
978 {
you.chen35020192022-05-06 11:30:57 +0800979 return LYNQ_WIFI_AUTH_WPA_PSK;
980 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800981 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
982 {
you.chen35020192022-05-06 11:30:57 +0800983 return LYNQ_WIFI_AUTH_WPA2_PSK;
984 }
985 }
986
987 return -1;
988}
989
990static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800991 if (flag != NULL)
992 {
qs.xiong3e506812023-04-06 11:08:48 +0800993 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
994 {
995 return LYNQ_WIFI_AUTH_WPA3_PSK;
996 }else if ( strstr( flag,"SAE-CCMP") != NULL )
997 {
998 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
999 }else if (strstr( flag, "WPA2-PSK") != NULL)
1000 {
you.chen35020192022-05-06 11:30:57 +08001001 return LYNQ_WIFI_AUTH_WPA2_PSK;
1002 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001003 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001004 {
you.chen35020192022-05-06 11:30:57 +08001005 return LYNQ_WIFI_AUTH_WPA_PSK;
1006 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001007 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001008 {
you.chen35020192022-05-06 11:30:57 +08001009 return LYNQ_WIFI_AUTH_WEP;
1010 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001011 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +08001012 {
you.chen35020192022-05-06 11:30:57 +08001013 return LYNQ_WIFI_AUTH_OPEN;
1014 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001015 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +08001016 {
you.chend2fef3f2023-02-13 10:50:35 +08001017 return LYNQ_WIFI_AUTH_OPEN;
1018 }
you.chen35020192022-05-06 11:30:57 +08001019 }
1020
1021 return -1;
1022}
1023
1024static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
1025 switch (bw) {
1026 case 10:
1027 return LYNQ_WIFI_BANDWIDTH_HT10;
1028 break;
1029 case 20:
1030 return LYNQ_WIFI_BANDWIDTH_HT20;
1031 break;
1032 case 40:
1033 return LYNQ_WIFI_BANDWIDTH_HT40;
1034 break;
1035 case 80:
1036 return LYNQ_WIFI_BANDWIDTH_HT80;
1037 break;
1038 default:
1039 break;
1040 }
1041
1042 return -1;
1043}
1044
1045static int inner_get_status_info(int interface, curr_status_info *curr_state) {
1046 int i, count;
1047 char *p;
1048 const char *lynq_status_cmd = "STATUS";
1049 const char * FLAG_SSID = "ssid=";
1050 const char * FLAG_SBSID = "bssid=";
1051 const char * FLAG_KEY_MGMT = "key_mgmt=";
1052 const char * FLAG_FREQ = "freq=";
1053 const char * FLAG_STATE = "wpa_state=";
1054 const char * FLAG_ID = "id=";
you.chend2fef3f2023-02-13 10:50:35 +08001055 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +08001056 char *split_lines[128] = {0};
1057
1058 CHECK_WPA_CTRL(interface);
1059
qs.xiong9fbf74e2023-03-28 13:38:22 +08001060 if (curr_state == NULL)
1061 {
1062 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-05-06 11:30:57 +08001063 return -1;
1064 }
1065
1066 DO_REQUEST(lynq_status_cmd);
1067
1068 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
1069
1070 curr_state->net_no = -1;
1071 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001072 for(i=0; i < count; i++)
1073 {
1074 if (curr_state->ap != NULL)
1075 {
you.chen35020192022-05-06 11:30:57 +08001076 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001077 if (p != NULL)
1078 {
you.chend2fef3f2023-02-13 10:50:35 +08001079 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +08001080 ret = 0;
1081 continue;
1082 }
you.chenf58b3c92022-06-21 16:53:48 +08001083 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001084 if (p != NULL)
1085 {
you.chend2fef3f2023-02-13 10:50:35 +08001086 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 +08001087 ret = 0;
1088 continue;
1089 }
you.chen35020192022-05-06 11:30:57 +08001090 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001091 if (p != NULL)
1092 {
you.chen450d0172022-07-15 17:56:48 +08001093 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001094 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +08001095 ret = 0;
1096 continue;
1097 }
1098 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001099 if (p != NULL)
1100 {
you.chen35020192022-05-06 11:30:57 +08001101 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
1102 ret = 0;
1103 continue;
1104 }
you.chend2fef3f2023-02-13 10:50:35 +08001105 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001106 if (p != NULL)
1107 {
you.chend2fef3f2023-02-13 10:50:35 +08001108 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
1109 ret = 0;
1110 continue;
1111 }
you.chen35020192022-05-06 11:30:57 +08001112 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001113 if (curr_state->state != NULL)
1114 {
you.chen35020192022-05-06 11:30:57 +08001115 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001116 if (p != NULL)
1117 {
you.chen35020192022-05-06 11:30:57 +08001118 strcpy(curr_state->state, p + strlen(FLAG_STATE));
1119 ret = 0;
1120 continue;
1121 }
1122
1123 } //end else if (state != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08001124 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
1125 {
you.chen35020192022-05-06 11:30:57 +08001126 ret = 0;
you.chen450d0172022-07-15 17:56:48 +08001127 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +08001128 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +08001129 }
1130 }
1131
1132 return ret;
1133}
1134
1135
qs.xiongf1b525b2022-03-31 00:58:23 -04001136int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001137{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001138 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +08001139 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -05001140
qs.xiong9fbf74e2023-03-28 13:38:22 +08001141 if (ap_ssid == NULL)
1142 {
1143 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +08001144 return -1;
1145 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001146 else
1147 {
1148 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen35020192022-05-06 11:30:57 +08001149 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001150
qs.xiong9fbf74e2023-03-28 13:38:22 +08001151 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1152 {
1153 RLOGE("Do check ap network_number fail");
you.chen35020192022-05-06 11:30:57 +08001154 return -1;
1155 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001156
you.chen35020192022-05-06 11:30:57 +08001157 CHECK_IDX(idx, CTRL_AP);
1158
1159 CHECK_WPA_CTRL(CTRL_AP);
1160
1161 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1162
1163 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1164 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001165 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1166 return 0;
you.chen35020192022-05-06 11:30:57 +08001167
qs.xiong7a105ce2022-03-02 09:43:11 -05001168}
1169
you.chen35020192022-05-06 11:30:57 +08001170int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001171{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001172 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001173 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001174 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001175}
1176
qs.xiongc9c79f72022-10-17 15:27:18 +08001177/*****
1178 *frequency <------>channel
1179 *
1180 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1181 *
1182 *
1183 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1184 *
1185 *
1186 * */
1187static int lynq_check_set_frequency(int input_frequency){
qs.xiongc00b6032022-11-29 16:28:03 +08001188 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};
1189 int i;
1190 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1191
qs.xiong69a332b2022-12-02 09:58:57 +08001192 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001193 {
1194 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001195 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001196 }
qs.xiongc00b6032022-11-29 16:28:03 +08001197
1198 if(i == arr_len)
1199 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001200 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001201 return -1;
1202 }
qs.xiongc00b6032022-11-29 16:28:03 +08001203
qs.xiongc9c79f72022-10-17 15:27:18 +08001204 return 0;
1205}
qs.xiong13673462023-02-21 19:12:54 +08001206
1207static int lynq_check_frequencyby_country_code(int input_frequency)
1208{
1209 char str_cnc[]="CN";
1210 char str_dest[20]="";
1211
1212 if( lynq_get_country_code(1,str_dest) != 0 )
1213 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001214 RLOGE("get country_code error\n");
qs.xiong13673462023-02-21 19:12:54 +08001215 return -1;
1216 }
1217 if( strncmp(str_dest,str_cnc,2) != 0 )
1218 {
1219 return 0;
1220 }else if( 2473 < input_frequency && input_frequency < 5744)
1221 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001222 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001223 return -1;
1224 }
1225 return 0;
1226}
qs.xiongf1b525b2022-03-31 00:58:23 -04001227int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001228{
qs.xiongc00b6032022-11-29 16:28:03 +08001229 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001230 char lynq_wifi_frequency_cmd[128]={0};
1231 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001232 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001233 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001234 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001235 check = lynq_check_set_frequency(lynq_wifi_frequency);
1236 if(check != 0)
1237 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001238 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001239 return -1;
you.chen35020192022-05-06 11:30:57 +08001240 }
qs.xiong13673462023-02-21 19:12:54 +08001241 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1242 if(check != 0)
1243 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001244 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001245 return -1;
1246 }
1247
qs.xiongc00b6032022-11-29 16:28:03 +08001248 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1249 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001250 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001251 return -1;
1252 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001253
you.chen35020192022-05-06 11:30:57 +08001254 CHECK_IDX(idx, CTRL_AP);
1255
1256 CHECK_WPA_CTRL(CTRL_AP);
1257
1258 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1259 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1260 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1261
you.chen6c2dd9c2022-05-16 17:55:28 +08001262 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-05-06 11:30:57 +08001263 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1264 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1265 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001266
qs.xiong9fbf74e2023-03-28 13:38:22 +08001267 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001268}
1269
qs.xiongf1b525b2022-03-31 00:58:23 -04001270int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001271{
you.chen35020192022-05-06 11:30:57 +08001272 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001273 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001274 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001275
qs.xiong9fbf74e2023-03-28 13:38:22 +08001276 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1277 {
1278 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen35020192022-05-06 11:30:57 +08001279 return -1;
1280 }
1281 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001282
qs.xiong9fbf74e2023-03-28 13:38:22 +08001283 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001284}
1285
qs.xiongf1b525b2022-03-31 00:58:23 -04001286int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1287{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001288 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001289 CHECK_IDX(idx, CTRL_AP);
1290 switch(bandwidth){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001291 case LYNQ_WIFI_BANDWIDTH_HT10:
1292 {
1293 RLOGE("bandwith [%d] not support now\n", bandwidth);
1294 return -1;
1295 }
1296 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen35020192022-05-06 11:30:57 +08001297 {
1298 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1299 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001300 if (system(lynq_cmd_bandwith) != 0 )
1301 {
1302 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001303 return -1;
1304 }
1305 system("wl up");
1306 break;
1307 }
1308 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001309 {
qs.xiong10379192023-02-21 13:19:42 +08001310 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001311 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1312 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001313 if (system(lynq_cmd_bandwith) != 0 )
1314 {
1315 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001316 return -1;
1317 }
1318 system("wl up");
1319 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001320 }
you.chen35020192022-05-06 11:30:57 +08001321 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001322 {
qs.xiong10379192023-02-21 13:19:42 +08001323 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001324 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001325 if (system(lynq_cmd_bandwith) != 0 )
1326 {
1327 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001328 return -1;
1329 }
1330 system("wl up");
1331 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001332 }
1333 default:
you.chen35020192022-05-06 11:30:57 +08001334 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001335 RLOGE("auth type [%d] not support now\n", bandwidth);
1336 return -1;
you.chen35020192022-05-06 11:30:57 +08001337 }
1338 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001339
1340
you.chen35020192022-05-06 11:30:57 +08001341 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001342}
you.chen35020192022-05-06 11:30:57 +08001343
qs.xiongf1b525b2022-03-31 00:58:23 -04001344int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1345{
you.chen35020192022-05-06 11:30:57 +08001346 int count = 0;
1347 int index = 0;
1348 char *split_words[128] = {0};
1349 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001350 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001351 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001352
you.chen35020192022-05-06 11:30:57 +08001353 CHECK_WPA_CTRL(CTRL_AP);
1354
1355 DO_REQUEST(lynq_chanspec_cmd);
1356
1357 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1358 for(;index < count; index++) {
1359 if (strncmp(split_words[index], "bw", 2) != 0) {
1360 continue;
1361 }
1362
1363 index++;
1364 if (index >= count) {
1365 return -1;
1366 }
1367
qs.xiong9fbf74e2023-03-28 13:38:22 +08001368 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001369 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1370 return 0;
1371 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001372 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001373 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001374}
qs.xiong0fb469a2022-04-14 03:50:45 -04001375
qs.xiongf1b525b2022-03-31 00:58:23 -04001376int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001377{
you.chen35020192022-05-06 11:30:57 +08001378 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001379 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001380 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001381
you.chen35020192022-05-06 11:30:57 +08001382 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001383
qs.xiong9fbf74e2023-03-28 13:38:22 +08001384 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1385 {
you.chen35020192022-05-06 11:30:57 +08001386 return -1;
1387 }
1388
1389 system("wl down");
1390 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001391 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001392 return -1;
1393 }
1394 system("wl up");
1395 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001396}
qs.xiong0fb469a2022-04-14 03:50:45 -04001397
qs.xiongf1b525b2022-03-31 00:58:23 -04001398int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001399{
you.chen35020192022-05-06 11:30:57 +08001400 int count = 0;
1401 int index = 0;
1402 char *split_words[128] = {0};
1403 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001404 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001405 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001406
you.chen35020192022-05-06 11:30:57 +08001407 CHECK_WPA_CTRL(CTRL_AP);
1408
1409 DO_REQUEST(lynq_chanspec_cmd);
1410
1411 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001412 for(;index < count; index++)
1413 {
1414 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001415 if (strncmp(split_words[index], "channel", 2) != 0) {
1416 continue;
1417 }
1418
1419 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001420 if (index >= count)
1421 {
you.chen35020192022-05-06 11:30:57 +08001422 return -1;
1423 }
1424
1425 *channel = atoi(split_words[index]);
1426 return 0;
1427 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001428 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001429 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001430}
1431
1432
you.chen35020192022-05-06 11:30:57 +08001433int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001434{
you.chen6c2dd9c2022-05-16 17:55:28 +08001435 char ssid[MAX_CMD] = {0};
1436 int freq = 0;
1437 char lynq_auth_cmd[64]={0};
1438 char lynq_auth_alg_cmd[64]={0};
1439 char lynq_psk_cmd[64]={0};
1440 char lynq_pairwise_cmd[64]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001441 char lynq_ieee80211_cmd[64]={0};
1442 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001443 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001444 CHECK_IDX(idx, CTRL_AP);
1445
you.chen6c2dd9c2022-05-16 17:55:28 +08001446 CHECK_WPA_CTRL(CTRL_AP);
1447
qs.xiong9fbf74e2023-03-28 13:38:22 +08001448 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1449 {
1450 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen35020192022-05-06 11:30:57 +08001451 return -1;
1452 }
1453
you.chen92fd5d32022-05-25 10:09:47 +08001454 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001455 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001456 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001457 return 0;
1458 }
1459 else {
1460 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1461 ssid[0] = '\0';
1462 }
1463 lynq_wifi_ap_frequency_get(idx, &freq);
1464
1465 DO_OK_FAIL_REQUEST(cmd_disconnect);
1466 DO_OK_FAIL_REQUEST(cmd_remove_all);
1467 if (ssid[0] != '\0') {
1468 lynq_wifi_ap_ssid_set(idx, ssid);
1469 }
1470 if (freq != 0) {
1471 lynq_wifi_ap_frequency_set(idx, freq);
1472 }
1473 }
1474 }
you.chen35020192022-05-06 11:30:57 +08001475
qs.xiong9fbf74e2023-03-28 13:38:22 +08001476 switch(auth){
1477 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001478 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001479 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001480 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001481 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001482 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001483 break;
1484 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001485 case LYNQ_WIFI_AUTH_WEP:
1486 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001487 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001488 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001489 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-05-16 17:55:28 +08001490 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1491
1492 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1493 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1494 break;
1495 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001496 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-03-29 17:36:14 +08001497 {
1498 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1499 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1500 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1501
1502 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1503 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1504 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1505 break;
1506
1507 }
you.chen35020192022-05-06 11:30:57 +08001508 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001509 {
1510 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1511 {
you.chen35020192022-05-06 11:30:57 +08001512 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1513 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1514 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001515 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1516 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001517 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001518 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001519 }
1520// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1521// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1522 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong7a105ce2022-03-02 09:43:11 -05001523
you.chen35020192022-05-06 11:30:57 +08001524 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1525 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1526 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001527 break;
1528 }
1529 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1530 {
1531 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1532 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1533 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1534 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1535
1536 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1537 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1538 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1539 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1540 break;
1541 }
1542 case LYNQ_WIFI_AUTH_WPA3_PSK:
1543 {
1544 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1545 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xiong3e506812023-04-06 11:08:48 +08001546 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001547 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1548
1549 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1550 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1551 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1552 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1553 break;
1554 }
1555 default:
you.chen35020192022-05-06 11:30:57 +08001556 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001557 RLOGE("auth type [%d] not support now\n", auth);
1558 return -1;
you.chen35020192022-05-06 11:30:57 +08001559 }
1560 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001561 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001562
qs.xiong9fbf74e2023-03-28 13:38:22 +08001563 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001564}
1565
you.chen35020192022-05-06 11:30:57 +08001566int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001567{
you.chen35020192022-05-06 11:30:57 +08001568 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001569 char lynq_auth_alg_str[MAX_RET] = {0};
1570 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001571 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001572 CHECK_IDX(idx, CTRL_AP);
1573
qs.xiong9fbf74e2023-03-28 13:38:22 +08001574 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1575 {
1576 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen35020192022-05-06 11:30:57 +08001577 return -1;
1578 }
1579
qs.xiong9fbf74e2023-03-28 13:38:22 +08001580 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1581 {
1582 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1583 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001584 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001585 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001586 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001587 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001588 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1589 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001590 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001591 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001592 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001593 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001594 else
1595 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001596 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001597 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001598 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001599 }
you.chen35020192022-05-06 11:30:57 +08001600 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001601 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1602 {
1603 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1604 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001605 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001606 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001607 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001608 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1609 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001610 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001611 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001612 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001613 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001614 else
1615 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001616 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001617 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001618 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001619 }
you.chen35020192022-05-06 11:30:57 +08001620 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001621
1622 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1623 {
1624 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1625 return -1;
1626 }
1627
1628 if (memcmp(lynq_auth_str,"1",1) == 0 )
1629 {
1630 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1631 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001632 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001633 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1634 {
1635 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1636 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001637 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001638 }
1639 else
1640 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001641 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001642 *auth = -1;
1643 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001644
you.chen6c2dd9c2022-05-16 17:55:28 +08001645 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001646}
qs.xiong1af5daf2022-03-14 09:12:12 -04001647
qs.xiong1af5daf2022-03-14 09:12:12 -04001648
qs.xiongf1b525b2022-03-31 00:58:23 -04001649int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001650{
you.chen35020192022-05-06 11:30:57 +08001651 char LYNQ_WIFI_CMD[128]={0};
1652 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1653 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001654 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001655 CHECK_IDX(idx, CTRL_AP);
1656
1657 CHECK_WPA_CTRL(CTRL_AP);
1658
1659// system("connmanctl enable wifi");
1660// system("connmanctl tether wifi on cy-test 12345678");
1661// system("ifconfig wlan0 down");
1662// system("ifconfig wlan0 up");
1663// system("ifconfig wlan0 up");
1664
1665 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1666 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1667
1668 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1669 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1670
qs.xiong9fbf74e2023-03-28 13:38:22 +08001671 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001672}
1673
qs.xiongf1b525b2022-03-31 00:58:23 -04001674int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001675{
you.chen35020192022-05-06 11:30:57 +08001676 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001677}
1678
qs.xiongf1b525b2022-03-31 00:58:23 -04001679int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001680{
you.chen35020192022-05-06 11:30:57 +08001681 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04001682
you.chen35020192022-05-06 11:30:57 +08001683 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001684
you.chen35020192022-05-06 11:30:57 +08001685 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001686
you.chen35020192022-05-06 11:30:57 +08001687 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
1688
1689 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1690
you.chenb4b121c2022-05-06 17:50:16 +08001691// system("connmanctl tether wifi off");
you.chen35020192022-05-06 11:30:57 +08001692
qs.xiong9fbf74e2023-03-28 13:38:22 +08001693 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001694}
qs.xiong1af5daf2022-03-14 09:12:12 -04001695
qs.xiongf1b525b2022-03-31 00:58:23 -04001696int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001697{
you.chen35020192022-05-06 11:30:57 +08001698 char lynq_disable_cmd[128] = {0};
1699 char lynq_select_cmd[128] = {0};
1700 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001701 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08001702 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001703
you.chen35020192022-05-06 11:30:57 +08001704 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08001705 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1706 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1707
1708 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1709 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
1710 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04001711
qs.xiong9fbf74e2023-03-28 13:38:22 +08001712 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001713}
1714
qs.xiongf1b525b2022-03-31 00:58:23 -04001715int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001716{
you.chen35020192022-05-06 11:30:57 +08001717 char lynq_disable_cmd[128] = {0};
1718 char lynq_select_cmd[128] = {0};
1719 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001720 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08001721 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001722
you.chen35020192022-05-06 11:30:57 +08001723 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001724
you.chen35020192022-05-06 11:30:57 +08001725 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1726 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1727
1728 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1729 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
1730 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05001731
qs.xiong9fbf74e2023-03-28 13:38:22 +08001732 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001733}
qs.xiongf1b525b2022-03-31 00:58:23 -04001734
you.chen35020192022-05-06 11:30:57 +08001735int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001736{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001737 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08001738 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001739 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001740 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001741 RLOGD("enter lynq_ap_password_set");
1742 if( password == NULL )
1743 {
1744 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08001745 return -1;
1746 }
1747 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08001748 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001749 if(pass_len < 8 || pass_len >= 64)
1750 {
1751 RLOGE("[lynq_ap_password_set]input password len not in rage");
1752 return -1;
you.chen35020192022-05-06 11:30:57 +08001753 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001754
you.chen35020192022-05-06 11:30:57 +08001755 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001756
qs.xiong9fbf74e2023-03-28 13:38:22 +08001757 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
1758 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001759 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001760 return -1;
1761 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001762 else if (auth == LYNQ_WIFI_AUTH_OPEN)
1763 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001764 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
1765 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001766 }
1767
you.chen35020192022-05-06 11:30:57 +08001768 CHECK_WPA_CTRL(CTRL_AP);
1769
qs.xiong9fbf74e2023-03-28 13:38:22 +08001770 if (auth == LYNQ_WIFI_AUTH_WEP)
1771 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001772 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001773 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
1774 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
1775 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1776 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
1777 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001778 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1779 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001780 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 +08001781 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
1782 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1783 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001784 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
1785 {
1786
qs.xiongc8d92a62023-03-29 17:36:14 +08001787 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 +08001788 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08001789 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001790 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1791 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
1792
1793 }
1794 else
qs.xiongc8d92a62023-03-29 17:36:14 +08001795 {
1796 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001797 return -1;
1798 }
you.chen35020192022-05-06 11:30:57 +08001799
you.chen35020192022-05-06 11:30:57 +08001800 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04001801
qs.xiong9fbf74e2023-03-28 13:38:22 +08001802 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001803}
1804
you.chen35020192022-05-06 11:30:57 +08001805int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04001806{
you.chen35020192022-05-06 11:30:57 +08001807 FILE * fp;
1808 int len, ret;
1809 int count, index;
1810 char *split_lines[128] = {0};
1811 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001812 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04001813
you.chen35020192022-05-06 11:30:57 +08001814 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001815
you.chen35020192022-05-06 11:30:57 +08001816 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
1817// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001818 if (NULL == fp)
1819 {
1820 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08001821 return -1;
1822 }
qs.xiong97fa59b2022-04-07 05:41:29 -04001823
you.chen35020192022-05-06 11:30:57 +08001824 buff = alloca(MAX_RET);
1825 fseek(fp, 0, SEEK_SET);
1826 len = fread(buff, 1, MAX_RET, fp);
1827 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04001828
qs.xiong9fbf74e2023-03-28 13:38:22 +08001829 for(index=0; index < len; index ++)
1830 {
1831 if (memcmp(buff + index, "network={", 9) != 0)
1832 {
you.chen35020192022-05-06 11:30:57 +08001833 continue;
1834 }
1835 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001836 for (; index < len; index ++ )
1837 {
1838 if (buff[index] != '}')
1839 {
you.chen35020192022-05-06 11:30:57 +08001840 continue;
1841 }
1842 buff[index] = '\0';
1843 break;
1844 }
1845 len = buff + index - p;
1846 }
1847
1848 count = lynq_split(p, len, '\n', split_lines);
1849
1850 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001851 for(index=0; index < count; index++)
1852 {
you.chen35020192022-05-06 11:30:57 +08001853 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001854 if (p != NULL)
1855 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001856 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001857 if (*p == '\"')
1858 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001859 p++;
1860 }
you.chen35020192022-05-06 11:30:57 +08001861 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001862 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
1863 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001864 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001865 if (*p == '\"')
1866 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001867 p++;
1868 }
1869 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001870 else
1871 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001872 continue;
you.chen35020192022-05-06 11:30:57 +08001873 }
1874
1875 strcpy(password, p);
1876
qs.xiong9fbf74e2023-03-28 13:38:22 +08001877 while(*password != '\0')
1878 {
1879 if (*password == '\"')
1880 {
you.chen35020192022-05-06 11:30:57 +08001881 *password = '\0';
1882 break;
1883 }
1884 password++;
1885 }
1886 ret = 0;
1887 break;
1888 } //end for(index=0; index < count; index++)
1889
1890 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001891}
1892
you.chen35020192022-05-06 11:30:57 +08001893static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
1894 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08001895 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04001896
qs.xiong9fbf74e2023-03-28 13:38:22 +08001897 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
1898 {
you.chen35020192022-05-06 11:30:57 +08001899 return -1;
1900 }
1901
1902 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08001903
qs.xiong9fbf74e2023-03-28 13:38:22 +08001904 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
1905 {
1906 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
1907 {
1908 if (strcmp(lynq_proto_str, "RSN") == 0)
1909 {
you.chena6cd55a2022-05-08 12:20:18 +08001910 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001911 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08001912 }
1913 }
1914 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001915 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
1916 {
1917 RLOGE("check ieee80211w error\n");
1918 return -1;
1919 }
1920 if ( strncmp(lynq_auth_str,"1",1) == 0 )
1921 {
1922
1923 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001924 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001925 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
1926 {
1927
1928 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001929 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001930 }else
1931 {
1932 *auth = -1;
1933 return -1;
1934 }
you.chen35020192022-05-06 11:30:57 +08001935 return 0;
1936}
1937
1938int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001939{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001940 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08001941 int pass_len, net_no, count, index;
1942 char lynq_tmp_cmd[300]={0};
1943 int net_no_list[128];
1944 lynq_wifi_auth_s net_auth;
1945 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001946 if(pass_len < 8 || pass_len >= 64)
1947 {
1948 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08001949 return -1;
1950 }
1951
1952 CHECK_IDX(idx, CTRL_STA);
1953
1954 net_no = -1;
1955 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
1956
qs.xiong9fbf74e2023-03-28 13:38:22 +08001957 for (index=0; index < count; index++)
1958 {
you.chen35020192022-05-06 11:30:57 +08001959 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001960 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
1961 {
you.chen35020192022-05-06 11:30:57 +08001962 net_no = net_no_list[index];
1963 break;
1964 }
1965 }
1966
qs.xiong9fbf74e2023-03-28 13:38:22 +08001967 if (net_no < 0)
1968 {
you.chen35020192022-05-06 11:30:57 +08001969 return -1;
1970 }
1971
1972 CHECK_WPA_CTRL(CTRL_STA);
1973
1974 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
1975
1976 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1977 DO_OK_FAIL_REQUEST(cmd_save_config);
1978
1979 return 0;
1980}
1981
1982int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
1983
1984 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08001985 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08001986 int count, index;
1987 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08001988 char *buff, *p, *ssid, *ssid_end_flag;
1989 char tmp_ssid[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001990 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08001991
you.chen755332b2022-08-06 16:59:10 +08001992 network_len = 0;
1993 p = NULL;
1994
you.chen35020192022-05-06 11:30:57 +08001995 CHECK_IDX(idx, CTRL_STA);
1996
qs.xiong9fbf74e2023-03-28 13:38:22 +08001997 if (NULL == password)
1998 {
1999 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08002000 return -1;
2001 }
2002
you.chen35020192022-05-06 11:30:57 +08002003 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002004 if (NULL == fp)
2005 {
2006 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08002007 return -1;
2008 }
2009
2010 buff = alloca(MAX_RET);
2011 fseek(fp, 0, SEEK_SET);
2012 len = fread(buff, 1, MAX_RET, fp);
2013 fclose(fp);
2014
qs.xiong9fbf74e2023-03-28 13:38:22 +08002015 for(index=0; index < len; index ++)
2016 {
2017 for(; index < len; index ++)
2018 {
2019 if (memcmp(buff + index, "network={", 9) != 0)
2020 {
you.chen35020192022-05-06 11:30:57 +08002021 continue;
2022 }
2023 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002024 for (; index < len; index ++ )
2025 {
2026 if (buff[index] != '}')
2027 {
you.chen35020192022-05-06 11:30:57 +08002028 continue;
2029 }
2030 buff[index] = '\0';
2031 break;
2032 }
you.chen755332b2022-08-06 16:59:10 +08002033 network_len = buff + index - p;
2034 break;
you.chen35020192022-05-06 11:30:57 +08002035 }
2036
qs.xiongb3f26af2023-02-17 18:41:07 +08002037 if (p == NULL)
2038 return -1;
2039
you.chend2fef3f2023-02-13 10:50:35 +08002040 ssid = strstr(p, "ssid=");
2041 if (ssid != NULL) {
2042 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002043 if (ssid[0] == '\"')
2044 {
you.chend2fef3f2023-02-13 10:50:35 +08002045 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
2046 break;
2047 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002048 else
2049 {
you.chend2fef3f2023-02-13 10:50:35 +08002050 ssid_end_flag = strstr(ssid, "\n");
2051 if (ssid_end_flag != NULL)
2052 {
2053 ssid_len = (ssid_end_flag - ssid) / 2;
2054 for(i=0; i<ssid_len; i++)
2055 {
2056 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
2057 }
2058 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
2059 break;
2060 }
2061 }
you.chen35020192022-05-06 11:30:57 +08002062 }
you.chend2fef3f2023-02-13 10:50:35 +08002063
you.chen35020192022-05-06 11:30:57 +08002064 }
2065
qs.xiong9fbf74e2023-03-28 13:38:22 +08002066 if (index >= len || NULL == p || network_len <= 0)
2067 {
you.chen35020192022-05-06 11:30:57 +08002068 return -1;
2069 }
2070
you.chen755332b2022-08-06 16:59:10 +08002071 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08002072
2073 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002074 for(index=0; index < count; index++)
2075 {
you.chen35020192022-05-06 11:30:57 +08002076 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002077 if (p != NULL)
2078 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002079 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002080 if (*p == '\"')
2081 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002082 p++;
2083 }
you.chen35020192022-05-06 11:30:57 +08002084 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002085 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
2086 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002087 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002088 if (*p == '\"')
2089 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002090 p++;
2091 }
2092 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002093 else
2094 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002095 continue;
you.chen35020192022-05-06 11:30:57 +08002096 }
2097
qs.xiong13673462023-02-21 19:12:54 +08002098 if (*p == '\"')
2099 p++;
2100 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08002101
qs.xiong13673462023-02-21 19:12:54 +08002102 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002103 while(password - p < 64 && *password != '\0')
2104 {
2105 if (*password == '\"')
2106 {
you.chen35020192022-05-06 11:30:57 +08002107 *password = '\0';
2108 break;
2109 }
2110 password++;
2111 }
2112 ret = 0;
2113 break;
2114 } //end for(index=0; index < count; index++)
2115
2116 return ret;
2117}
2118
2119static int inner_set_sta_ssid(int net_no, char *sta_ssid)
2120{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002121 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04002122
qs.xiong9fbf74e2023-03-28 13:38:22 +08002123 if (sta_ssid == NULL)
2124 {
2125 RLOGE("sta_ssid is null\n");
2126 return -1;
you.chen35020192022-05-06 11:30:57 +08002127 }
2128
qs.xiong9fbf74e2023-03-28 13:38:22 +08002129 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08002130
2131 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
2132
2133 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
2134// DO_OK_FAIL_REQUEST(cmd_save_config);
2135
qs.xiong9fbf74e2023-03-28 13:38:22 +08002136 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002137
2138}
2139
you.chen35020192022-05-06 11:30:57 +08002140static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05002141{
you.chen35020192022-05-06 11:30:57 +08002142 char lynq_disable_cmd[128]={0};
2143 char lynq_select_cmd[128]={0};
2144
2145 CHECK_WPA_CTRL(CTRL_STA);
2146
qs.xiong9fbf74e2023-03-28 13:38:22 +08002147 if (save != 0)
2148 {
you.chenc29444e2022-06-07 18:01:16 +08002149 if (start_flag != 0)
2150 {
2151 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
2152 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2153 }
2154 else
2155 {
2156 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2157 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2158 }
you.chen35020192022-05-06 11:30:57 +08002159 DO_OK_FAIL_REQUEST(cmd_save_config);
2160 }
2161
qs.xiong9fbf74e2023-03-28 13:38:22 +08002162 if (start_flag == 0)
2163 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002164 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002165 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2166 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002167 else
2168 {
you.chen35020192022-05-06 11:30:57 +08002169 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2170 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2171 }
2172
2173 return 0;
2174}
2175
2176int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2177{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002178 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002179 CHECK_IDX(idx, CTRL_STA);
2180
you.chen6c2dd9c2022-05-16 17:55:28 +08002181 curr_status_info curr_state;
2182 ap_info_s ap_info;
2183 curr_state.ap = &ap_info;
2184 curr_state.state = NULL;
2185
qs.xiong9fbf74e2023-03-28 13:38:22 +08002186 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2187 {
you.chend2fef3f2023-02-13 10:50:35 +08002188 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002189 return 0;
2190 }
2191
2192 return -1;
you.chen35020192022-05-06 11:30:57 +08002193}
2194
2195int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2196{
you.chen9ac66392022-08-06 17:01:16 +08002197 scan_info_s *scan_list = NULL;
2198 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002199 int scan_len=0;
2200 int save_len=0;
2201 int best_index = -1;
2202 int best_scan_index = -1;
2203 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002204 int i, j, ret;
2205
2206 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002207
2208 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002209 if (info == NULL)
2210 {
you.chen35020192022-05-06 11:30:57 +08002211 return -1;
2212 }
2213
2214 curr_status_info curr_state;
2215 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002216 char status[64];
you.chen35020192022-05-06 11:30:57 +08002217
you.chen9ac66392022-08-06 17:01:16 +08002218 memset(&ap_info, 0, sizeof (ap_info));
2219 memset(status, 0, sizeof (status));
2220
2221 curr_state.ap = &ap_info;
2222 curr_state.state = status;
2223
qs.xiong9fbf74e2023-03-28 13:38:22 +08002224 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2225 {
you.chen35020192022-05-06 11:30:57 +08002226 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002227 if (strcmp(status, STATE_COMPLETED) == 0)
2228 {
2229 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2230 }
2231 else
2232 {
2233 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2234 }
you.chen35020192022-05-06 11:30:57 +08002235 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002236 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002237 return 0;
2238 }
2239
you.chen9ac66392022-08-06 17:01:16 +08002240 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002241 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002242 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2243 {
you.chen9ac66392022-08-06 17:01:16 +08002244 if (NULL != scan_list)
2245 {
2246 free(scan_list);
2247 }
you.chen35020192022-05-06 11:30:57 +08002248 return -1;
2249 }
2250
qs.xiong9fbf74e2023-03-28 13:38:22 +08002251 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2252 {
you.chen9ac66392022-08-06 17:01:16 +08002253 if (NULL != scan_list)
2254 {
2255 free(scan_list);
2256 }
2257 if (NULL != save_list)
2258 {
2259 free(save_list);
2260 }
you.chen35020192022-05-06 11:30:57 +08002261 return -1;
2262 }
2263
qs.xiong9fbf74e2023-03-28 13:38:22 +08002264 for (i=0; i < save_len; i++)
2265 {
2266 for (j=0; j < scan_len; j++)
2267 {
you.chen35020192022-05-06 11:30:57 +08002268 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002269 && save_list[i].base_info.auth == scan_list[j].auth)
2270 {
2271 if (best_rssi == 0)
2272 {
you.chen9ac66392022-08-06 17:01:16 +08002273 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002274 best_rssi = scan_list[j].rssi;
2275 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002276 else if (best_rssi > scan_list[j].rssi)
2277 {
you.chen35020192022-05-06 11:30:57 +08002278 best_index = i;
2279 best_scan_index = j;
2280 best_rssi = scan_list[j].rssi;
2281 }
you.chend2fef3f2023-02-13 10:50:35 +08002282 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 +08002283 break;
2284 }
2285 }
2286 }
2287
qs.xiong9fbf74e2023-03-28 13:38:22 +08002288 if (best_index >= 0)
2289 {
you.chen35020192022-05-06 11:30:57 +08002290 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002291 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 +08002292 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2293 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002294 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002295 }
2296
you.chen9ac66392022-08-06 17:01:16 +08002297 if (NULL != scan_list)
2298 {
2299 free(scan_list);
2300 }
2301 if (NULL != save_list)
2302 {
2303 free(save_list);
2304 }
2305
2306 return ret;
you.chen35020192022-05-06 11:30:57 +08002307}
2308
2309static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2310{
qs.xiongc8d92a62023-03-29 17:36:14 +08002311 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002312 char lynq_ket_mgmt_cmd[64]={0};
2313 char lynq_pairwise_cmd[64]={0};
2314 char lynq_psk_cmd[64]={0};
2315
2316 CHECK_WPA_CTRL(CTRL_STA);
2317
qs.xiong9fbf74e2023-03-28 13:38:22 +08002318 switch(auth)
2319 {
2320 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002321 {
2322 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002323
you.chen35020192022-05-06 11:30:57 +08002324 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002325// DO_OK_FAIL_REQUEST(cmd_save_config);
2326 break;
2327 }
2328 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002329 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002330 {
2331 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2332 {
you.chen35020192022-05-06 11:30:57 +08002333 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2334 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002335 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2336 {
you.chena6cd55a2022-05-08 12:20:18 +08002337 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002338 }
2339 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2340 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002341
you.chen35020192022-05-06 11:30:57 +08002342 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2343 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2344 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002345
qs.xiong9fbf74e2023-03-28 13:38:22 +08002346 if (password != NULL)
2347 {
you.chen35020192022-05-06 11:30:57 +08002348 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2349 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002350 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002351 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002352
you.chen35020192022-05-06 11:30:57 +08002353// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002354 break;
2355 }
2356 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2357 {
qs.xiong3e506812023-04-06 11:08:48 +08002358 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002359 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002360 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2361 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2362
qs.xiong3e506812023-04-06 11:08:48 +08002363 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002364 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2365 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2366 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2367
2368 break;
2369 }
2370 case LYNQ_WIFI_AUTH_WPA3_PSK:
2371 {
qs.xiong3e506812023-04-06 11:08:48 +08002372 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002373 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORk %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002374 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2375 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2376
qs.xiong3e506812023-04-06 11:08:48 +08002377 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong455c30b2023-04-12 11:40:02 +08002378 RLOGD("inner_set_sta_auth_psw before set SAE CMD");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002379 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
qs.xiong455c30b2023-04-12 11:40:02 +08002380 RLOGD("inner_set_sta_auth_psw after set SAE CMD");
qs.xiong9fbf74e2023-03-28 13:38:22 +08002381 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2382 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2383
2384 break;
2385 }
2386 default:
2387 return -1;
you.chen35020192022-05-06 11:30:57 +08002388 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002389
qs.xiong9fbf74e2023-03-28 13:38:22 +08002390 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002391}
qs.xiong7a105ce2022-03-02 09:43:11 -05002392
you.chen35020192022-05-06 11:30:57 +08002393static int inner_get_curr_net_no(int interface) {
2394 curr_status_info curr_state;
2395 curr_state.ap = NULL;
2396 curr_state.state = NULL;
2397
qs.xiong9fbf74e2023-03-28 13:38:22 +08002398 if (0 != inner_get_status_info(interface, &curr_state))
2399 {
you.chen35020192022-05-06 11:30:57 +08002400 return -1;
2401 }
2402
2403 return curr_state.net_no;
2404}
2405
2406int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002407{
you.chen35020192022-05-06 11:30:57 +08002408 int net_no;
2409 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002410
you.chen35020192022-05-06 11:30:57 +08002411 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002412
qs.xiong9fbf74e2023-03-28 13:38:22 +08002413 if (net_no < 0)
2414 {
you.chen35020192022-05-06 11:30:57 +08002415 return -1;
2416 }
2417
2418 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002419}
2420
you.chen35020192022-05-06 11:30:57 +08002421int 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 -05002422{
you.chen35020192022-05-06 11:30:57 +08002423 int count, net_no, index;
2424 int net_no_list[128];
2425 lynq_wifi_auth_s net_auth;
qs.xiongf1b525b2022-03-31 00:58:23 -04002426
qs.xiong9fbf74e2023-03-28 13:38:22 +08002427 if (ssid == NULL || *ssid == '\0')
2428 {
2429 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002430 return -1;
2431 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002432
qs.xiong9fbf74e2023-03-28 13:38:22 +08002433 if (LYNQ_WIFI_AUTH_OPEN != auth)
2434 {
2435 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
2436 {
2437 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002438 return -1;
2439 }
2440 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002441
you.chen35020192022-05-06 11:30:57 +08002442 CHECK_IDX(idx, CTRL_STA);
2443
2444 net_no = -1;
2445 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2446
qs.xiong9fbf74e2023-03-28 13:38:22 +08002447 for (index=0; index < count; index++)
2448 {
you.chen35020192022-05-06 11:30:57 +08002449 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002450 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2451 {
you.chen35020192022-05-06 11:30:57 +08002452 net_no = net_no_list[index];
2453 break;
2454 }
2455 }
2456
qs.xiong9fbf74e2023-03-28 13:38:22 +08002457 if (net_no < 0)
2458 {
you.chen35020192022-05-06 11:30:57 +08002459 net_no = lynq_add_network(CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002460 if (net_no == -1)
2461 {
you.chen35020192022-05-06 11:30:57 +08002462 return -1;
2463 }
2464
qs.xiong9fbf74e2023-03-28 13:38:22 +08002465 RLOGD("net no is %d\n", net_no);
2466 if (0 != inner_set_sta_ssid(net_no, ssid))
2467 {
you.chen35020192022-05-06 11:30:57 +08002468 return -1;
2469 }
2470 }
2471
qs.xiong9fbf74e2023-03-28 13:38:22 +08002472 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2473 {
you.chen35020192022-05-06 11:30:57 +08002474 return -1;
2475 }
2476
2477 return inner_sta_start_stop(net_no, 1, 1);
qs.xiong7a105ce2022-03-02 09:43:11 -05002478}
2479
you.chen35020192022-05-06 11:30:57 +08002480int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002481{
you.chen35020192022-05-06 11:30:57 +08002482 ap_info_s ap;
2483 curr_status_info curr_state;
2484 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002485
qs.xiong9fbf74e2023-03-28 13:38:22 +08002486 if (ssid == NULL || *ssid == '\0')
2487 {
2488 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002489 return -1;
2490 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002491
you.chen35020192022-05-06 11:30:57 +08002492 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002493
you.chen35020192022-05-06 11:30:57 +08002494 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002495 curr_state.state = NULL;
2496
qs.xiong9fbf74e2023-03-28 13:38:22 +08002497 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2498 {
you.chen35020192022-05-06 11:30:57 +08002499 return 0;
2500 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002501
qs.xiong9fbf74e2023-03-28 13:38:22 +08002502 if (strcmp(ap.ap_ssid, ssid) != 0)
2503 {
you.chen35020192022-05-06 11:30:57 +08002504 return 0;
2505 }
2506
2507 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002508}
qs.xiong97fa59b2022-04-07 05:41:29 -04002509
you.chena6cd55a2022-05-08 12:20:18 +08002510int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2511{
qs.xiongad2f89d2023-01-18 13:17:41 +08002512// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2513// const char *lynq_reconnect_cmd = "RECONNECT";
2514 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2515 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2516// 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 -05002517
you.chen35020192022-05-06 11:30:57 +08002518 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08002519 CHECK_WPA_CTRL(CTRL_STA);
2520
2521 system("connmanctl enable wifi");
2522
qs.xiongad2f89d2023-01-18 13:17:41 +08002523 if (system("ifconfig | grep -q wlan0") != 0)
2524 {
you.chen35020192022-05-06 11:30:57 +08002525 return -1;
2526 }
qs.xiong9c99fa92022-03-15 08:03:26 -04002527
qs.xiongad2f89d2023-01-18 13:17:41 +08002528// DO_OK_FAIL_REQUEST(cmd_remove_all);
2529// system(lynq_first_sta_cmd);
2530// system(lynq_reconfigure_cmd);
2531// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
2532 system(lynq_enable_sta_cmd);
2533 system(lynq_reconnect_cmd);
2534// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002535 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002536}
2537
you.chen35020192022-05-06 11:30:57 +08002538int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04002539{
qs.xiongad2f89d2023-01-18 13:17:41 +08002540// char lynq_disable_network_cmd[MAX_CMD];
2541// curr_status_info curr_state;
2542// ap_info_s ap_info;
you.chen35020192022-05-06 11:30:57 +08002543
qs.xiongad2f89d2023-01-18 13:17:41 +08002544 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 +08002545 CHECK_IDX(idx, CTRL_STA);
2546 CHECK_WPA_CTRL(CTRL_STA);
2547
qs.xiongad2f89d2023-01-18 13:17:41 +08002548// curr_state.ap = &ap_info;
2549// curr_state.state = NULL;
you.chena6cd55a2022-05-08 12:20:18 +08002550
qs.xiongad2f89d2023-01-18 13:17:41 +08002551// if (0 != inner_get_status_info(CTRL_STA, &curr_state) || curr_state.net_no < 0) {
2552// return 0;
2553// }
you.chena6cd55a2022-05-08 12:20:18 +08002554
qs.xiongad2f89d2023-01-18 13:17:41 +08002555// sprintf(lynq_disable_network_cmd, "DISABLE_NETWORK %d", curr_state.net_no);
2556// DO_OK_FAIL_REQUEST(lynq_disable_network_cmd);
2557 system(lynq_disable_sta_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002558 DO_OK_FAIL_REQUEST(cmd_save_config);
2559
2560 return 0;
2561// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04002562}
qs.xiong7a105ce2022-03-02 09:43:11 -05002563
you.chen35020192022-05-06 11:30:57 +08002564//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
2565// int i, count;
2566// char *p;
2567// const char * FLAG_SSID = "ssid=";
2568// const char * FLAG_SBSID = "bssid=";
2569// const char * FLAG_KEY_MGMT = "key_mgmt=";
2570// const char * FLAG_FREQ = "freq=";
2571// char lynq_sta_cmd[MAX_CMD];
2572// char *split_lines[128] = {0};
2573
2574// CHECK_WPA_CTRL(CTRL_AP);
2575
2576// sprintf(lynq_sta_cmd, "STA %s", bssid);
2577
2578// DO_REQUEST(lynq_sta_cmd);
2579
2580// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2581
2582// for(i=0; i < count; i++) {
2583// p = strstr(split_lines[i], FLAG_SSID);
2584// if (p != NULL) {
2585// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
2586// continue;
2587// }
2588// }
2589
2590// lynq_get_interface_ip(idx, ap->ap_ip);
2591// lynq_ap_password_set(idx, ap->psw);
2592
2593// return 0;
2594//}
2595
2596static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
2597 curr_status_info curr_state;
2598 curr_state.ap = ap;
2599 curr_state.state = NULL;
2600 return inner_get_status_info(interface, &curr_state);
2601}
2602
2603int 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 -04002604{
you.chend2fef3f2023-02-13 10:50:35 +08002605 int index, line_count;
2606 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08002607 const char *lynq_first_sta_cmd = "STA-FIRST";
2608 char lynq_next_sta_cmd[MAX_CMD];
2609 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08002610 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002611
you.chen35020192022-05-06 11:30:57 +08002612 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002613
you.chen35020192022-05-06 11:30:57 +08002614 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002615
you.chen35020192022-05-06 11:30:57 +08002616// ap_info_s * tmp_ap;
2617// device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002618 if (ap == NULL || list == NULL || len == NULL)
2619 {
2620 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08002621 return -1;
2622 }
2623
2624// ap = &tmp_ap;
2625// list = &tmp_list;
2626 *ap = malloc(sizeof (ap_info_s));
2627
qs.xiong9fbf74e2023-03-28 13:38:22 +08002628 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0)
2629 {
2630 RLOGE("inner_get_status_info_ap !=0\n");
you.chen35020192022-05-06 11:30:57 +08002631 return -1;
2632 }
2633
2634 lynq_get_interface_ip(idx, (*ap)->ap_ip);
2635 lynq_ap_password_get(idx, (*ap)->psw);
2636
you.chen35020192022-05-06 11:30:57 +08002637 DO_REQUEST(lynq_first_sta_cmd);
2638
2639 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002640 while (reply_len > 0)
2641 {
2642 if (memcmp(cmd_reply, "FAIL", 4) == 0)
2643 {
you.chen35020192022-05-06 11:30:57 +08002644 break;
2645 }
2646 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2647 bssid[index] = malloc(strlen(split_lines[0]) + 1);
2648 strcpy(bssid[index], split_lines[0]);
2649 index++;
2650 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
2651 reply_len = MAX_RET;
2652 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08002653 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 +08002654 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
2655 {
2656 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08002657 break;
2658 }
2659 }
2660
2661 *len = index;
2662
2663 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08002664 for (index=0; index < *len; index++)
2665 {
you.chend2fef3f2023-02-13 10:50:35 +08002666 dev_info = &(*list)[index];
2667 memset(dev_info, 0, sizeof(device_info_s));
2668 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
2669 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
2670 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
2671 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08002672 free(bssid[index]);
2673 }
2674
2675 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002676}
2677
you.chen35020192022-05-06 11:30:57 +08002678int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04002679{
you.chen35020192022-05-06 11:30:57 +08002680 int i, count, index, count_words;
2681 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
2682 char *split_lines[128] = {0};
2683 char *split_words[128] = {0};
2684 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04002685
qs.xiong9fbf74e2023-03-28 13:38:22 +08002686 if (list == NULL || len == NULL)
2687 {
you.chen35020192022-05-06 11:30:57 +08002688 return -1;
2689 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002690
you.chen9ac66392022-08-06 17:01:16 +08002691 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
2692 {
2693 usleep(100 * 1000);
2694 }
2695
you.chen35020192022-05-06 11:30:57 +08002696 CHECK_IDX(idx, CTRL_STA);
2697
2698 CHECK_WPA_CTRL(CTRL_STA);
2699
2700 DO_REQUEST(lynq_scan_result_cmd);
2701
2702 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2703 *len = count - 1;
2704 *list = malloc(sizeof (scan_info_s) * *len);
2705
2706 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08002707 for (index=0; index <count_words; index++)
2708 {
2709 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08002710 }
2711
qs.xiong9fbf74e2023-03-28 13:38:22 +08002712 for(index = 1;index < count; index++)
2713 {
2714 RLOGD("---- %s\n",split_lines[index]);
you.chen35020192022-05-06 11:30:57 +08002715 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
2716 if (count_words < 4)
2717 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002718 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08002719 //bssid / frequency / signal level / flags / ssid
2720 p = (*list) + index - 1;
2721 strcpy(p->mac, split_words[0]);
2722 p->band = convert_band_from_freq(atoi(split_words[1]));
2723 p->rssi = -1 * atoi( split_words[2]);
2724 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chend2fef3f2023-02-13 10:50:35 +08002725 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
you.chen35020192022-05-06 11:30:57 +08002726 }
2727
2728 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002729}
qs.xiong97fa59b2022-04-07 05:41:29 -04002730
you.chen35020192022-05-06 11:30:57 +08002731int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
2732{
2733 int count, net_no, index;
2734 int net_no_list[128];
2735 lynq_wifi_auth_s net_auth;
2736 char lynq_remove_cmd[MAX_CMD];
2737
qs.xiong9fbf74e2023-03-28 13:38:22 +08002738 if (ssid == NULL || *ssid == '\0')
2739 {
2740 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002741 return -1;
2742 }
2743
2744 CHECK_IDX(idx, CTRL_STA);
2745
2746 CHECK_WPA_CTRL(CTRL_STA);
2747
2748 net_no = -1;
2749 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2750
qs.xiong9fbf74e2023-03-28 13:38:22 +08002751 for (index=0; index < count; index++)
2752 {
you.chen35020192022-05-06 11:30:57 +08002753 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002754 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2755 {
you.chen35020192022-05-06 11:30:57 +08002756 net_no = net_no_list[index];
2757 break;
2758 }
2759 }
2760
qs.xiong9fbf74e2023-03-28 13:38:22 +08002761 if (net_no < 0)
2762 {
you.chen35020192022-05-06 11:30:57 +08002763 return 0;
2764 }
2765
2766 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
2767
2768 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
2769 DO_OK_FAIL_REQUEST(cmd_save_config);
2770
2771 return 0;
2772}
2773
2774int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002775{
you.chend2fef3f2023-02-13 10:50:35 +08002776 int count, index;
you.chen35020192022-05-06 11:30:57 +08002777 int net_no_list[128];
2778 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002779 RLOGD("enter lynq_get_sta_saved_ap api\n");
2780 if (list == NULL || len == NULL)
2781 {
2782 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08002783 return -1;
2784 }
2785
2786 CHECK_IDX(idx, CTRL_STA);
2787
2788// CHECK_WPA_CTRL(CTRL_STA);
2789
2790 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002791 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08002792
you.chen057aac42023-04-13 14:06:58 +08002793 if (count < 0)
2794 {
2795 RLOGE("list network fail");
2796 return count;
2797 }
2798 else if (count == 0)
2799 {
2800 *list = NULL;
2801 *len = 0;
2802 return 0;
2803 }
2804
you.chen35020192022-05-06 11:30:57 +08002805 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08002806 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08002807 *len = count;
2808
qs.xiong9fbf74e2023-03-28 13:38:22 +08002809 for (index=0; index < count; index++)
2810 {
you.chen35020192022-05-06 11:30:57 +08002811 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
you.chen35020192022-05-06 11:30:57 +08002812 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
you.chen35020192022-05-06 11:30:57 +08002813 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002814 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
you.chen057aac42023-04-13 14:06:58 +08002815 {
you.chen35020192022-05-06 11:30:57 +08002816 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
2817 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002818 else
you.chen057aac42023-04-13 14:06:58 +08002819 {
you.chen35020192022-05-06 11:30:57 +08002820 (*list)[index].base_info.band = -1;
2821 }
you.chen057aac42023-04-13 14:06:58 +08002822 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08002823 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002824 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002825 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08002826 return 0;
2827}
2828
2829int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
2830{
qs.xiongc8d92a62023-03-29 17:36:14 +08002831 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08002832 const char *lynq_scan_cmd = "SCAN";
2833
2834 CHECK_IDX(idx, CTRL_STA);
2835
2836 CHECK_WPA_CTRL(CTRL_STA);
2837
qs.xiongc8d92a62023-03-29 17:36:14 +08002838 system(clean_last_re);
you.chen9ac66392022-08-06 17:01:16 +08002839 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08002840 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002841 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
2842 {
qs.xiongb3f26af2023-02-17 18:41:07 +08002843 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002844 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
2845 {
qs.xiongb3f26af2023-02-17 18:41:07 +08002846 g_sta_scan_finish_flag = 1;
2847 return -1;
2848 }
you.chen35020192022-05-06 11:30:57 +08002849
2850 return 0;
2851}
2852
2853int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002854 if (cb == NULL)
2855 {
2856 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08002857 return -1;
2858 }
2859
2860 g_ap_callback_priv = priv;
2861 g_ap_callback_func = cb;
2862
2863 return 0;
2864}
2865
2866int lynq_unreg_ap_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002867 if (g_ap_callback_priv == priv)
2868 {
you.chen35020192022-05-06 11:30:57 +08002869 g_ap_callback_func = NULL;
2870 g_ap_callback_priv = NULL;
2871 return 0;
2872 }
2873 return -1;
2874}
2875
2876int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08002877 if (cb == NULL)
2878 {
2879 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08002880 return -1;
2881 }
2882
2883 g_sta_callback_priv = priv;
2884 g_sta_callback_func = cb;
2885
2886 return 0;
2887}
2888
2889int lynq_unreg_sta_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002890 if (g_sta_callback_priv == priv)
2891 {
you.chen35020192022-05-06 11:30:57 +08002892 g_sta_callback_func = NULL;
2893 g_sta_callback_priv = NULL;
2894 return 0;
2895 }
2896 return -1;
2897}
2898
2899
2900static int inner_get_status_info_state (int interface, char *state) {
2901 curr_status_info curr_state;
2902 curr_state.ap = NULL;
2903 curr_state.state = state;
2904 return inner_get_status_info(interface, &curr_state);
2905}
2906
2907int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
2908{
2909 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002910 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08002911 CHECK_IDX(idx, CTRL_AP);
2912
qs.xiong9fbf74e2023-03-28 13:38:22 +08002913 if (inner_get_status_info_state(CTRL_AP, state) != 0)
2914 {
you.chen35020192022-05-06 11:30:57 +08002915 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
2916 return 0;
2917 }
2918
qs.xiong9fbf74e2023-03-28 13:38:22 +08002919 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
2920 {
you.chen35020192022-05-06 11:30:57 +08002921 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
2922 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002923 else
2924 {
you.chen35020192022-05-06 11:30:57 +08002925 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
2926 }
2927
2928 return 0;
2929}
2930
2931int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
2932 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002933 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08002934 CHECK_IDX(idx, CTRL_STA);
2935
qs.xiong9fbf74e2023-03-28 13:38:22 +08002936 if (inner_get_status_info_state(CTRL_STA, state) != 0)
2937 {
you.chen35020192022-05-06 11:30:57 +08002938 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
2939 return 0;
2940 }
2941
qs.xiong9fbf74e2023-03-28 13:38:22 +08002942 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
2943 {
you.chen35020192022-05-06 11:30:57 +08002944 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
2945 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002946 else
2947 {
you.chen35020192022-05-06 11:30:57 +08002948 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
2949 }
2950
2951 return 0;
2952}
2953
2954int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
2955// CHECK_IDX(idx, CTRL_AP);
2956// int ret = 0;
2957// size_t reply_len = MAX_RET;
2958// char cmd_reply[MAX_RET]={0};
2959// const char * cmd_str = "GET country";
2960// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
2961// do{
2962// if (NULL == s_lynq_wpa_ctrl) {
2963// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
2964// if (NULL == s_lynq_wpa_ctrl ) {
2965// printf("wpa_ctrl_open fail\n");
2966// return -1;
2967// }
2968// }
2969// }while(0);
2970
2971// do {
2972// reply_len = MAX_RET;
2973// cmd_reply[0] = '\0';
2974// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08002975// 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 +08002976// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002977// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08002978// return ret;
2979// }
2980// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08002981// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08002982// }while(0);
2983
2984 FILE *fp;
2985 size_t i = 0;
2986 char lynq_cmd_ret[MAX_RET]={0};
2987
2988// CHECK_IDX(idx, CTRL_AP);
2989
2990 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002991 {
2992 perror("popen error!");
2993 return -1;
2994 }
you.chen35020192022-05-06 11:30:57 +08002995 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
2996 {
2997 perror("fread fail!");
2998 return -1;
2999 }
3000
qs.xiong9fbf74e2023-03-28 13:38:22 +08003001 for(i=0; i < strlen(lynq_cmd_ret); i++)
3002 {
3003 if (lynq_cmd_ret[i] == ' ')
3004 {
you.chen35020192022-05-06 11:30:57 +08003005 lynq_cmd_ret[i] = '\0';
3006 break;
3007 }
3008 }
3009
3010 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003011 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08003012
3013 int ret=pclose(fp);
3014 if(ret==-1)
3015 {
3016 perror("close file faild");
3017 }
3018
3019 return 0;
3020}
3021
3022int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
3023// const char * cmd_str = "GET country";
3024// CHECK_IDX(idx, CTRL_AP);
3025// CHECK_WPA_CTRL(CTRL_STA);
3026
3027// DO_REQUEST(cmd_str);
3028// printf("result %s\n", cmd_reply);
3029
qs.xiong9fbf74e2023-03-28 13:38:22 +08003030 if (country_code == NULL || *country_code == '\0')
3031 {
3032 RLOGD("bad country code\n");
you.chen35020192022-05-06 11:30:57 +08003033 return -1;
3034 }
3035
3036 char lynq_country_cmd[MAX_CMD];
3037 sprintf(lynq_country_cmd, "wl country %s", country_code);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003038 if (system(lynq_country_cmd) == 0)
3039 {
you.chen35020192022-05-06 11:30:57 +08003040 return 0;
3041 }
3042
3043 return -1;
3044}
3045
3046int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
3047{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003048 RLOGD("enter lynq_get_connect_ap_mac\n");
3049 if (mac == NULL)
3050 {
3051 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08003052 return -1;
3053 }
3054
3055 CHECK_IDX(idx, CTRL_STA);
3056 ap_info_s ap;
3057 ap.ap_mac[0] = '\0';
3058
qs.xiong9fbf74e2023-03-28 13:38:22 +08003059 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3060 {
you.chen35020192022-05-06 11:30:57 +08003061 return -1;
3062 }
3063 strcpy(mac, ap.ap_mac);
3064
3065 return 0;
3066}
3067
3068int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
3069{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003070 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08003071 struct ifaddrs *ifaddr_header, *ifaddr;
3072 struct in_addr * ifa;
3073 const char * ifaName = "wlan0";
3074 if (ip == NULL)
3075 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003076 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08003077 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003078 }
you.chenf58b3c92022-06-21 16:53:48 +08003079
qs.xiong9fbf74e2023-03-28 13:38:22 +08003080 if (idx == 1)
3081 {
you.chen6c2dd9c2022-05-16 17:55:28 +08003082 ifaName = "tether";
you.chen9ac66392022-08-06 17:01:16 +08003083 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08003084 else if (idx != 0)
3085 {
you.chen35020192022-05-06 11:30:57 +08003086 return -1;
you.chen9ac66392022-08-06 17:01:16 +08003087 }
you.chen35020192022-05-06 11:30:57 +08003088
you.chen9ac66392022-08-06 17:01:16 +08003089 if (getifaddrs(&ifaddr_header) == -1)
3090 {
you.chen35020192022-05-06 11:30:57 +08003091 perror("getifaddrs");
3092 return -1;
3093 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08003094 }
you.chen35020192022-05-06 11:30:57 +08003095
3096
you.chen9ac66392022-08-06 17:01:16 +08003097 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
3098 {
3099 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08003100 continue;
you.chen9ac66392022-08-06 17:01:16 +08003101 if((strcmp(ifaddr->ifa_name,ifaName)==0))
3102 {
3103 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
3104 {
3105 // is a valid IP4 Address
3106 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
3107 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003108 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08003109 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003110 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08003111 return 0;
3112 }
3113 }
3114 }
qs.xiongc4f007c2023-02-08 18:16:58 +08003115 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003116 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08003117 return -1;
you.chen35020192022-05-06 11:30:57 +08003118}
3119
3120int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
3121{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003122 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08003123 int count;
3124 size_t i;
3125 char *split_words[128] = {0};
3126 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
3127
3128 CHECK_WPA_CTRL(idx);
3129
3130 DO_REQUEST(lynq_get_mac_cmd);
3131
qs.xiong9fbf74e2023-03-28 13:38:22 +08003132 if (memcmp(cmd_reply, "FAIL", 4) == 0)
3133 {
3134 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08003135 return -1;
3136 }
3137
3138 count = lynq_split(cmd_reply, reply_len, '=', split_words);
3139
qs.xiong9fbf74e2023-03-28 13:38:22 +08003140 if (count < 2)
3141 {
you.chen35020192022-05-06 11:30:57 +08003142 return -1;
3143 }
3144
qs.xiong9fbf74e2023-03-28 13:38:22 +08003145 for (i=0; i < strlen(split_words[1]); i++ )
3146 {
3147 if (split_words[1][i] != ' ')
3148 {
you.chen35020192022-05-06 11:30:57 +08003149 break;
3150 }
3151 }
3152
3153 strcpy(mac, split_words[1] + i);
3154
3155 return 0;
3156}
3157
3158int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
3159{
3160// int count;
3161// char *split_words[128] = {0};
3162// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
3163
3164// if (rssi == NULL) {
3165// return -1;
3166// }
3167
3168// CHECK_IDX(idx, CTRL_STA);
3169
3170// CHECK_WPA_CTRL(CTRL_STA);
3171
3172// DO_REQUEST(lynq_get_rssi_cmd);
3173
3174// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3175// return -1;
3176// }
3177
3178// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3179
3180// if (count < 2) {
3181// return -1;
3182// }
3183
3184// *rssi = atoi(split_words[1]) * -1;
3185
you.chen35020192022-05-06 11:30:57 +08003186 char lynq_cmd_ret[MAX_RET]={0};
3187
qs.xiongff0ae0f2022-10-11 15:47:14 +08003188/*******change other cmd to get rssi*******
3189 *
3190 *wl rssi ---> wl -i wlan0 rssi
3191 *
3192 ***** change by qs.xiong 20221011*******/
you.chen23c4a5f2023-04-12 16:46:00 +08003193 if (0 != exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
qs.xiong9fbf74e2023-03-28 13:38:22 +08003194 {
you.chen23c4a5f2023-04-12 16:46:00 +08003195 RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
you.chen35020192022-05-06 11:30:57 +08003196 return -1;
3197 }
you.chen9f17e4d2022-06-06 17:18:18 +08003198 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003199/****** if got rssi is 0,means sta didn't connected any device****/
3200 if(*rssi == 0)
3201 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003202 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
you.chen23c4a5f2023-04-12 16:46:00 +08003203 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003204 }
you.chen35020192022-05-06 11:30:57 +08003205
3206 return 0;
3207}
3208
3209int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3210{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003211 RLOGD("enter lynq_get_connect_ap_band\n");
3212 if (band == NULL)
3213 {
you.chen35020192022-05-06 11:30:57 +08003214 return -1;
3215 }
3216
3217 CHECK_IDX(idx, CTRL_STA);
3218 ap_info_s ap;
3219 ap.band = -1;
3220
qs.xiong9fbf74e2023-03-28 13:38:22 +08003221 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3222 {
you.chen35020192022-05-06 11:30:57 +08003223 return -1;
3224 }
3225 *band = ap.band;
3226
3227 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003228}
you.chenf58b3c92022-06-21 16:53:48 +08003229
3230int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3231{
qs.xionge4cbf1c2023-02-28 18:22:49 +08003232 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003233
3234 if (ip == NULL)
3235 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003236 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003237 return -1;
3238 }
3239
3240 CHECK_IDX(idx, CTRL_STA);
3241
qs.xionge4cbf1c2023-02-28 18:22:49 +08003242 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003243 {
3244 return -1;
3245 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003246
3247 return inner_get_ip_by_mac(bssid, ip, 32); //better input by user
you.chenf58b3c92022-06-21 16:53:48 +08003248}
3249
qs.xiong026c5c72022-10-17 11:15:45 +08003250int lynq_ap_connect_num(int sta_number)
3251{
3252 char lynq_limit_cmd[32]={0};
3253 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003254 if((sta_number < 1 ) && (sta_number > 15))
3255 {
3256 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003257 return -1;
3258 }
3259 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3260 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003261 if(ret != 0)
3262 {
3263 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003264 }
3265 return 0;
3266}
you.chenf58b3c92022-06-21 16:53:48 +08003267
qs.xiong77905552022-10-17 11:19:57 +08003268int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3269{
3270
3271 char lynq_wifi_acs_cmd[128]={0};
3272 char lynq_cmd_mode[128]={0};
3273 char lynq_cmd_slect[128]={0};
3274
qs.xiong9fbf74e2023-03-28 13:38:22 +08003275 if((acs_mode != 2) && (acs_mode != 5))
3276 {
qs.xiong77905552022-10-17 11:19:57 +08003277 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3278 }
3279
qs.xiong9fbf74e2023-03-28 13:38:22 +08003280 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3281 {
qs.xiong77905552022-10-17 11:19:57 +08003282 return -1;
3283 }
3284
3285 CHECK_IDX(idx, CTRL_AP);
3286
3287 CHECK_WPA_CTRL(CTRL_AP);
3288
3289 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3290 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3291 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3292
3293 DO_OK_FAIL_REQUEST(cmd_disconnect);
3294 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3295 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3296 DO_OK_FAIL_REQUEST(cmd_save_config);
3297 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3298
3299 return 0;
3300}
you.chen0f5c6432022-11-07 18:31:14 +08003301//you.chen add for tv-box start
3302static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3303 FILE *fp;
3304 //printf("to exec cmd:%s\n", str_cmd);
3305 if((fp=popen(str_cmd,"r"))==NULL)
3306 {
3307 perror("popen error!");
3308 return -1;
3309 }
3310 if((fread(str_cmd_ret,max_len,1,fp))<0)
3311 {
3312 perror("fread fail!");
3313 fclose(fp);
3314 return -1;
3315 }
3316 fclose(fp);
3317 return 0;
3318}
3319
3320static int get_netmask_length(const char* mask)
3321{
3322 int masklen=0, i=0;
3323 int netmask=0;
3324
3325 if(mask == NULL)
3326 {
3327 return 0;
3328 }
3329
3330 struct in_addr ip_addr;
3331 if( inet_aton(mask, &ip_addr) )
3332 {
3333 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003334 }else
3335 {
you.chen0f5c6432022-11-07 18:31:14 +08003336 netmask = 0;
3337 return 0;
3338 }
3339
3340 while(0 == (netmask & 0x01) && i<32)
3341 {
3342 i++;
3343 netmask = netmask>>1;
3344 }
3345 masklen = 32-i;
3346 return masklen;
3347}
3348
3349static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3350 int mask_len;
3351 char *p;
3352 char tmp[64] = {0};
3353 if (exec_cmd("ifconfig tether | grep Mask", str_cmd_ret, max_len) != 0)
3354 return -1;
3355 p = strstr(str_cmd_ret, "Mask:");
3356 if (p == NULL)
3357 return -1;
3358 mask_len = get_netmask_length(p + 5);
3359 if (mask_len == 0)
3360 return -1;
3361 p = strstr(str_cmd_ret, "inet addr:");
3362 if (p == NULL)
3363 return -1;
3364 strcpy(tmp, p + 10);
3365 p = strstr(tmp, " ");
3366 if (p != NULL)
3367 *p = '\0';
3368 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
3369 return 0;
3370}
3371
3372static void GBWWatchThreadProc() {
3373 int i,n, nloop, nmax, ncheckcount, nidlecount;
3374 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
3375 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
3376 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
3377 char *results[16] = {0};
3378 char str_cmd[256] = {0};
3379 char str_cmd_ret[128] = {0};
3380 char dest_ip[32] = {0};
3381 lastAP1Bytes = lastAP2Bytes = 0;
3382 lastAP1Drop = lastAP2Drop = 0;
3383 lastAP1Speed = lastAP2Speed = 0;
3384 setAP1Speed = 50;
3385 setAP2Speed = 80;
3386 nloop = 0;
3387 nmax = 6;
3388 ncheckcount = nidlecount = 0;
3389
qs.xiong9fbf74e2023-03-28 13:38:22 +08003390 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08003391 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
3392 while (dest_ip[0] == '\0') {
3393 sleep(1);
3394 str_cmd_ret[0] = '\0';
3395 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
3396 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
3397 if (str_cmd_ret[n] == '\n'){
3398 str_cmd_ret[n] = '\0';
3399 break;
3400 }
3401 }
3402 if (str_cmd_ret[0] != '\0')
3403 {
3404 strcpy(dest_ip, str_cmd_ret);
3405 }
3406 }
3407
3408 system("tc qdisc del dev tether root > /dev/null 2>&1");
3409 system("tc qdisc add dev tether root handle 1: htb r2q 1");
3410 system("tc class add dev tether parent 1: classid 1:1 htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000");
3411 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
3412 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003413 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08003414 return;
3415 }
3416 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);
3417 system(str_cmd);
3418 system("tc class add dev tether parent 1: classid 1:2 htb rate 80Mbit ceil 100Mbit prio 0 quantum 3000000");
3419 sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", dest_ip);
3420 //printf("----cmd:%s\n", str_cmd);
3421 system(str_cmd);
3422
3423 while (1) {
3424 sleep(1);
3425 memset(str_cmd, 0, sizeof(str_cmd));
3426 if (0 != exec_cmd("tc -s class show dev tether classid 1:1 | grep Sent", str_cmd, sizeof (str_cmd)))
3427 continue;
3428 //printf("ap1 --- %s\n", str_cmd);
3429 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3430 if (n > 9) {
3431 if (strcmp(results[1], "Sent") == 0) {
3432 currAP1Bytes = atoll(results[2]);
3433 }
3434 if (strcmp(results[6], "(dropped") == 0) {
3435 currAP1Drop = atoi(results[7]);
3436 }
3437 }
3438
3439 memset(str_cmd, 0, sizeof(str_cmd));
3440 if (0 != exec_cmd("tc -s class show dev tether classid 1:2 | grep Sent", str_cmd, sizeof (str_cmd)))
3441 continue;
3442 //printf("ap2 --- %s\n", str_cmd);
3443 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3444 if (n > 9) {
3445 if (strcmp(results[1], "Sent") == 0) {
3446 currAP2Bytes = atoll(results[2]);
3447 }
3448 if (strcmp(results[6], "(dropped") == 0) {
3449 currAP2Drop = atoi(results[7]);
3450 }
3451 }
3452
3453 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
3454 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
3455 lastAP1Bytes = currAP1Bytes;
3456 lastAP2Bytes = currAP2Bytes;
3457 continue;
3458 }
3459
3460 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
3461 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
3462 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
3463 lastAP1Speed = currAP1Speed;
3464 lastAP2Speed = currAP2Speed;
3465 lastAP1Bytes = currAP1Bytes;
3466 lastAP2Bytes = currAP2Bytes;
3467
3468 currSetAP1Speed = setAP1Speed;
3469 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
3470 ncheckcount++;
3471 if (ncheckcount > 3) {
3472 ncheckcount = 0;
3473 currSetAP1Speed = 5;
3474 }
3475 }
3476 else {
3477 ncheckcount = 0;
3478 if (currAP1Speed < 5)
3479 nidlecount++;
3480 else
3481 nidlecount = 0;
3482
3483 }
3484
3485 if (nidlecount > 60 ){
3486 currSetAP1Speed = 50;
3487 }
3488
3489 if (currSetAP1Speed != setAP1Speed) {
3490 setAP1Speed = currSetAP1Speed;
3491 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));
3492 //printf("------***change speed: %s\n", str_cmd);
3493 system(str_cmd);
3494 }
3495 }
3496}
3497
3498int enableGBW(const char* mac) {
3499 int i,len;
3500 char get_ipaddr_cmd[128]={0};
3501 ap_info_s *ap;
3502 device_info_s * list;
3503
3504 if (mac == NULL || g_gbw_enabled == 1)
3505 return -1;
3506 len = strlen(mac);
3507 g_gbw_mac = malloc(len + 1);
3508 for(i=0;i<len;i++) {
3509 if (mac[i] >= 'A' && mac[i] <= 'Z')
3510 {
3511 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
3512 }
3513 else
3514 g_gbw_mac[i] = mac[i];
3515 }
3516 g_gbw_mac[i] = '\0';
3517 g_gbw_enabled = 1;
3518
3519 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
3520 if (system(get_ipaddr_cmd) == 0) {
3521 //startGBW();
3522 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
3523 for (i=0;i<len;i++) {
3524 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
3525 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
3526 startGBW();
3527 }
3528 free(ap);
3529 free(list);
3530 }
3531 }
3532 return 0;
3533}
3534
3535int disableGBW() {
3536 stopGBW();
3537 free(g_gbw_mac);
3538 g_gbw_mac = NULL;
3539 g_gbw_enabled = 1;
3540 return 0;
3541}
3542
3543static int startGBW() {
3544 if (g_gbw_watcher_pid != 0) {
3545 stopGBW();
3546 }
3547 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
3548}
3549
3550static int stopGBW() {
3551 void* retval;
3552 pthread_cancel(g_gbw_watcher_pid);
3553 pthread_join(g_gbw_watcher_pid, &retval);
3554 g_gbw_watcher_pid = 0;
3555 system("tc qdisc del dev tether root");
3556}
3557//you.chen add for tv-box end