blob: 6c4565459c3bc52b165281fb2917b00a31a3ed13 [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.chend2fef3f2023-02-13 10:50:35 +080066struct local_wpa_ctrl{
67 struct wpa_ctrl *ctrl;
68 pthread_mutex_t mutex;
69};
70
71static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
72
73static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
you.chen35020192022-05-06 11:30:57 +080074
you.chen0f5c6432022-11-07 18:31:14 +080075//you.chen add for tv-box start
76volatile int g_gbw_enabled = 0;
77char * g_gbw_mac = NULL;
78pthread_t g_gbw_watcher_pid = 0;
79static int startGBW();
80static int stopGBW();
81//you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +080082
83typedef struct __curr_status_info {
84 ap_info_s *ap;
85 char * state;
86 int net_no;
87}curr_status_info;
qs.xiong97fa59b2022-04-07 05:41:29 -040088
you.chend2fef3f2023-02-13 10:50:35 +080089static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
90 char *reply, size_t *reply_len,
91 void (*msg_cb)(char *msg, size_t len))
92{
93 int ret;
94 if (ctrl->ctrl == NULL) {
qs.xiong9fbf74e2023-03-28 13:38:22 +080095 RLOGE("local_wpa_ctrl_request ctrl is null\n");
you.chend2fef3f2023-02-13 10:50:35 +080096 return -1;
97 }
98 pthread_mutex_lock(&ctrl->mutex);
99 ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
100 pthread_mutex_unlock(&ctrl->mutex);
101 return ret;
102}
103
104static struct local_wpa_ctrl * inner_get_wpa_ctrl(int index) {
105 int repeat_cnt;
106 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
107 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800108 RLOGD("inner_get_wpa_ctrl\n");
you.chend2fef3f2023-02-13 10:50:35 +0800109 for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
110 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
111// printf("wait enable finish\n");
112 usleep(500 * 1000);
113 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
114 }
115 if (NULL == g_lynq_wpa_ctrl[index]) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800116 RLOGE("NULL == g_lynq_wpa_ctrl[index]");
you.chend2fef3f2023-02-13 10:50:35 +0800117 goto out_addr;
118 }
119 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
120 g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
121 if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800122 RLOGE("wpa_ctrl_open fail\n");
you.chend2fef3f2023-02-13 10:50:35 +0800123 goto out_addr;
124 }
125 pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
126 }
127 lynq_wpa_ctrl = g_lynq_wpa_ctrl[index];
128out_addr:
129 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
130 return lynq_wpa_ctrl;
131}
132
qs.xiong97fa59b2022-04-07 05:41:29 -0400133#define PRINT_AND_RETURN_VALUE(str,value) \
qs.xiong97fa59b2022-04-07 05:41:29 -0400134{\
you.chen35020192022-05-06 11:30:57 +0800135 perror((str));\
136 return (value);\
qs.xiong97fa59b2022-04-07 05:41:29 -0400137}
138
you.chen35020192022-05-06 11:30:57 +0800139#define CHECK_IDX(idx, type) do { \
140 if ( (idx == LYNQ_WIFI_INTERFACE_0 && type != CTRL_STA) || (idx == LYNQ_WIFI_INTERFACE_1 && type != CTRL_AP) \
141 || idx < LYNQ_WIFI_INTERFACE_0 || idx > LYNQ_WIFI_INTERFACE_1 ) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800142 RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
you.chen35020192022-05-06 11:30:57 +0800143 return -1; \
144 } \
145 }while (0)
146
147#define CHECK_WPA_CTRL(index) int ret = 0;\
148 size_t reply_len = MAX_RET; \
149 char cmd_reply[MAX_RET]={0}; \
you.chend2fef3f2023-02-13 10:50:35 +0800150 struct local_wpa_ctrl *lynq_wpa_ctrl = NULL; \
you.chen35020192022-05-06 11:30:57 +0800151 do{ \
you.chend2fef3f2023-02-13 10:50:35 +0800152 lynq_wpa_ctrl = inner_get_wpa_ctrl(index); \
153 if (NULL == lynq_wpa_ctrl) return -1; \
you.chen35020192022-05-06 11:30:57 +0800154 }while(0)
155
156#define DO_REQUEST(cmd_str) do { \
157 reply_len = MAX_RET;\
158 cmd_reply[0] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800159 RLOGD("to call [%s]\n", cmd_str); \
you.chend2fef3f2023-02-13 10:50:35 +0800160 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 +0800161 if (ret != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800162 RLOGE("call "#cmd_str" fail %d\n", ret); \
you.chen35020192022-05-06 11:30:57 +0800163 return ret; \
164 } \
165 cmd_reply[reply_len+1] = '\0'; \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800166 RLOGD("cmd replay [ %s ]\n", cmd_reply); \
you.chen35020192022-05-06 11:30:57 +0800167 }while(0)
168
169#define DO_OK_FAIL_REQUEST(cmd_str) do { \
170 DO_REQUEST(cmd_str); \
171 if (reply_len >=4 && memcmp(cmd_reply, "FAIL", 4) == 0 ) {\
qs.xiong9fbf74e2023-03-28 13:38:22 +0800172 RLOGE("cmd "#cmd_str" return FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800173 return -1; \
174 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
qs.xiong9fbf74e2023-03-28 13:38:22 +0800175 RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
you.chen35020192022-05-06 11:30:57 +0800176 return -1; \
177 } \
178 }while (0)
179
180
you.chend2fef3f2023-02-13 10:50:35 +0800181static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
you.chen35020192022-05-06 11:30:57 +0800182
183static void APWatcherThreadProc() {
184 size_t len = MAX_RET;
185 char msg_notify[MAX_RET];
186
you.chen6c2dd9c2022-05-16 17:55:28 +0800187 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800188 g_ap_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800189
qs.xiong9fbf74e2023-03-28 13:38:22 +0800190 while (g_ap_watcher_stop_flag == 0)
191 {
192 if (lynq_wpa_ctrl == NULL)
193 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800194 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[CTRL_AP]); //@todo temp change
qs.xiong9fbf74e2023-03-28 13:38:22 +0800195 if (lynq_wpa_ctrl == NULL)
196 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800197 usleep(100*1000);
198 continue;
199 }
200
201 wpa_ctrl_attach(lynq_wpa_ctrl);
you.chena6fa5b22022-05-18 10:28:19 +0800202 g_ap_watcher_started_flag = 1;
you.chen6c2dd9c2022-05-16 17:55:28 +0800203 }
204
qs.xiong9fbf74e2023-03-28 13:38:22 +0800205 if ( 0 == wpa_ctrl_pending(lynq_wpa_ctrl))
206 {
you.chen35020192022-05-06 11:30:57 +0800207 usleep(100*1000);
208 continue;
209 }
you.chen6c2dd9c2022-05-16 17:55:28 +0800210 memset(msg_notify, 0, MAX_RET);
211 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800212 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
213 {
you.chen35020192022-05-06 11:30:57 +0800214 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800215 RLOGD("STAWatcherThreadProc ap------> %s\n", msg_notify);
you.chen0f5c6432022-11-07 18:31:14 +0800216//you.chen change for tv-box start
qs.xiong9fbf74e2023-03-28 13:38:22 +0800217 if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
218 {
you.chen0f5c6432022-11-07 18:31:14 +0800219 if (g_ap_callback_func != NULL)
220 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_DISCONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800221 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
222 {
223 RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
224 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
225 {
you.chen0f5c6432022-11-07 18:31:14 +0800226 stopGBW();
227 }
228 }
you.chen35020192022-05-06 11:30:57 +0800229 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800230 else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
231 {
you.chen0f5c6432022-11-07 18:31:14 +0800232 if (g_ap_callback_func != NULL)
233 g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_CONNECT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800234 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
235 {
236 RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
237 if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
238 {
you.chen0f5c6432022-11-07 18:31:14 +0800239 startGBW();
240 }
241 }
you.chen35020192022-05-06 11:30:57 +0800242 }
you.chen0f5c6432022-11-07 18:31:14 +0800243//you.chen add for tv-box end
you.chen35020192022-05-06 11:30:57 +0800244 } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
245 } // end while (g_ap_watcher_stop_flag == 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800246 if (lynq_wpa_ctrl != NULL)
247 {
you.chen92fd5d32022-05-25 10:09:47 +0800248 wpa_ctrl_detach(lynq_wpa_ctrl);
249 wpa_ctrl_close(lynq_wpa_ctrl);
250 }
qs.xiong97fa59b2022-04-07 05:41:29 -0400251}
252
you.chen35020192022-05-06 11:30:57 +0800253static void STAWatcherThreadProc() {
254 size_t len = MAX_RET;
255 char msg_notify[MAX_RET];
256 char *pReason;
257 error_number_s error;
qs.xiongf1b525b2022-03-31 00:58:23 -0400258
you.chen6c2dd9c2022-05-16 17:55:28 +0800259 struct wpa_ctrl *lynq_wpa_ctrl = NULL;
you.chen92fd5d32022-05-25 10:09:47 +0800260 g_sta_watcher_stop_flag = 0;
you.chen35020192022-05-06 11:30:57 +0800261
qs.xiong9fbf74e2023-03-28 13:38:22 +0800262 while (g_sta_watcher_stop_flag == 0)
263 {
264 if (lynq_wpa_ctrl == NULL)
265 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800266 lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[CTRL_STA]);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800267 if (lynq_wpa_ctrl == NULL)
268 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800269 usleep(100*1000);
270 continue;
271 }
272
273 wpa_ctrl_attach(lynq_wpa_ctrl);
you.chena6fa5b22022-05-18 10:28:19 +0800274 g_sta_watcher_started_flag = 1;
you.chen6c2dd9c2022-05-16 17:55:28 +0800275 }
276
qs.xiong9fbf74e2023-03-28 13:38:22 +0800277 if ( 0 == wpa_ctrl_pending(lynq_wpa_ctrl))
278 {
you.chen35020192022-05-06 11:30:57 +0800279 usleep(100*1000);
280 continue;
281 }
you.chen6c2dd9c2022-05-16 17:55:28 +0800282 memset(msg_notify, 0, MAX_RET);
283 len = MAX_RET;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800284 if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
285 {
you.chen35020192022-05-06 11:30:57 +0800286 msg_notify[len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800287 RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
288 if (strstr(msg_notify, state_scan_result) != NULL)
289 {
you.chen35020192022-05-06 11:30:57 +0800290 g_sta_scan_finish_flag = 1;
291 }
292
qs.xiong9fbf74e2023-03-28 13:38:22 +0800293 if (g_sta_callback_func == NULL)
294 {
you.chen35020192022-05-06 11:30:57 +0800295 continue;
296 }
297 error = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800298 if (strstr(msg_notify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
299 {
you.chen35020192022-05-06 11:30:57 +0800300 g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_SCAN_RESULT, error);
301 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800302 else if (strstr(msg_notify, "CTRL-EVENT-CONNECTED") != NULL)
303 {
you.chen35020192022-05-06 11:30:57 +0800304 g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_CONNECT, error);
305 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800306 else if (strstr(msg_notify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
307 {
you.chen35020192022-05-06 11:30:57 +0800308 pReason = strstr(msg_notify, "reason=");
qs.xiong9fbf74e2023-03-28 13:38:22 +0800309 if (pReason != NULL)
310 {
you.chen35020192022-05-06 11:30:57 +0800311 pReason += strlen("reason=");
qs.xiong9fbf74e2023-03-28 13:38:22 +0800312 if (memcmp(pReason, "CONN_FAILED", 11) == 0)
313 {
you.chen35020192022-05-06 11:30:57 +0800314 error = LYNQ_TIME_OUT;
315 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800316 else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
317 {
you.chen35020192022-05-06 11:30:57 +0800318 error = LYNQ_PSW_ERROR;
319 }
320 g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_DISCONNECT, error);
321 }
322 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800323 else if (strstr(msg_notify, "CTRL-EVENT-DISCONNECTED") != NULL)
324 {
you.chen35020192022-05-06 11:30:57 +0800325 g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_DISCONNECT, error);
326 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800327 else if (strstr(msg_notify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
328 {
you.chen35020192022-05-06 11:30:57 +0800329 g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_DISCONNECT, LYNQ_NOT_FIND_AP);
330 }
331 }
332 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800333 if (lynq_wpa_ctrl != NULL)
334 {
you.chen92fd5d32022-05-25 10:09:47 +0800335 wpa_ctrl_detach(lynq_wpa_ctrl);
336 wpa_ctrl_close(lynq_wpa_ctrl);
337 }
qs.xiongf1b525b2022-03-31 00:58:23 -0400338}
339
qs.xiong1af5daf2022-03-14 09:12:12 -0400340int lynq_wifi_enable(void)
341{
you.chen35020192022-05-06 11:30:57 +0800342 int ret = 0;
you.chen6c2dd9c2022-05-16 17:55:28 +0800343 int i;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800344 RLOGD("enter lynq_wifi_enable");
you.chend2fef3f2023-02-13 10:50:35 +0800345 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
346
qs.xiong9fbf74e2023-03-28 13:38:22 +0800347 if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
348 {
you.chend2fef3f2023-02-13 10:50:35 +0800349 goto out_enable;
350 }
351
you.chen35020192022-05-06 11:30:57 +0800352 const char * cmd_check_service =
353 "state=`systemctl is-active wg870_drv_insmod.service`\n"
354 "[ \"\"$state == \"active\" ] && exit 0\n"
355 "[ \"\"$state == \"inactive\" ] && systemctl start wg870_drv_insmod.service\n";
356// if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL) {
357// return 0;
358// }
qs.xiong1af5daf2022-03-14 09:12:12 -0400359
you.chen35020192022-05-06 11:30:57 +0800360 ret = system(cmd_check_service);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800361 if (ret != 0)
362 {
363 //printf("service state %d\n", ret);
364 RLOGE("[wifi error]service state %d",ret);
you.chend2fef3f2023-02-13 10:50:35 +0800365 ret = -1;
366 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800367 }
lhfe8da902022-10-11 18:55:36 +0800368
qs.xiong9fbf74e2023-03-28 13:38:22 +0800369 RLOGD("check service state is OK");
370 for (i=0; i<10; i++)
371 {
you.chena6fa5b22022-05-18 10:28:19 +0800372 if (system("connmanctl technologies | grep -q \"/net/connman/technology/wifi\"") == 0) {
you.chen6c2dd9c2022-05-16 17:55:28 +0800373 break;
374 }
375 usleep(300*1000);
376 }
377
qs.xiong9fbf74e2023-03-28 13:38:22 +0800378 if (i >= 10)
379 {
380 RLOGE("[wifi error] check connman technologies no wifi");
you.chend2fef3f2023-02-13 10:50:35 +0800381 ret = -1;
382 goto out_enable;
you.chen6c2dd9c2022-05-16 17:55:28 +0800383 }
384
you.chen9f17e4d2022-06-06 17:18:18 +0800385 //@todo delete add temp check for socket avilable start (20220606)
386 for (i=0; i<60; i++)
387 {
388 if (system("netstat -an | grep -q DGRAM") == 0) {
389 break;
390 }
391 sleep(1);
392 }
393
394 if (i >= 60)
395 {
you.chend2fef3f2023-02-13 10:50:35 +0800396 ret = -1;
397 goto out_enable;
you.chen9f17e4d2022-06-06 17:18:18 +0800398 }
399 //@todo delete add temp check for socket avilable end (20220606)
400
qs.xiong9fbf74e2023-03-28 13:38:22 +0800401 if (0 != system("ifconfig | grep -q ap0"))
402 {
you.chen6c2dd9c2022-05-16 17:55:28 +0800403 system("connmanctl enable wifi");
you.chena6fa5b22022-05-18 10:28:19 +0800404 usleep(300*1000);
you.chen01bfac32022-06-07 10:36:00 +0800405 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disconnect");
you.chen6c2dd9c2022-05-16 17:55:28 +0800406 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 DRIVER interface_create ap0");
you.chena6fa5b22022-05-18 10:28:19 +0800407 usleep(300*1000);
you.chen6c2dd9c2022-05-16 17:55:28 +0800408 system("connmanctl tether wifi on lynq 1qaz@WSX#$%^");
you.chena6fa5b22022-05-18 10:28:19 +0800409 usleep(300*1000);
you.chen01bfac32022-06-07 10:36:00 +0800410 system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=ap0 disconnect");
you.chen6c2dd9c2022-05-16 17:55:28 +0800411 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800412 if (g_ap_watcher_pid == 0 )
qs.xiong55f32762023-02-16 15:59:45 +0800413 {
you.chen35020192022-05-06 11:30:57 +0800414 ret=pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800415 if(ret<0)
416 {
417 RLOGE("[wifi error]creat APWatcherThreadProc fail");
you.chend2fef3f2023-02-13 10:50:35 +0800418 ret = -1;
419 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800420 }
421 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800422
423 RLOGD("creat APWatcherTheradProc susccs");
you.chen35020192022-05-06 11:30:57 +0800424 if (g_sta_watcher_pid == 0 ) {
425 ret=pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800426 if(ret<0)
427 {
428 RLOGE("[wifi error]creat STAWatcherThreadProc fail");
you.chend2fef3f2023-02-13 10:50:35 +0800429 ret = -1;
430 goto out_enable;
you.chen35020192022-05-06 11:30:57 +0800431 }
432 }
433
qs.xiong9fbf74e2023-03-28 13:38:22 +0800434 RLOGD("creat STAWatcherTheradProc susccs");
435 for (i=0; i<10; i++)
436 {
you.chena6fa5b22022-05-18 10:28:19 +0800437 usleep(300*1000);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800438 if (g_ap_watcher_started_flag == 1 && g_sta_watcher_started_flag == 1)
439 {
you.chena6fa5b22022-05-18 10:28:19 +0800440 break;
441 }
442 }
443
you.chend2fef3f2023-02-13 10:50:35 +0800444 g_lynq_wpa_ctrl[0] = malloc(sizeof (struct local_wpa_ctrl));
445 g_lynq_wpa_ctrl[1] = malloc(sizeof (struct local_wpa_ctrl));
446 memset(g_lynq_wpa_ctrl[0], 0 , sizeof(struct local_wpa_ctrl));
447 memset(g_lynq_wpa_ctrl[1], 0 , sizeof(struct local_wpa_ctrl));
448out_enable:
449 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800450 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500451}
452
qs.xiong1af5daf2022-03-14 09:12:12 -0400453int lynq_wifi_disable(void)
454{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800455 RLOGD("enter lynq_wifi_disable");
you.chend2fef3f2023-02-13 10:50:35 +0800456 pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
you.chen35020192022-05-06 11:30:57 +0800457 g_ap_watcher_stop_flag = 1;
458 g_sta_watcher_stop_flag = 1;
459 if (g_ap_watcher_pid != 0)
460 pthread_join(g_ap_watcher_pid, NULL);
461 if (g_sta_watcher_pid != 0)
462 pthread_join(g_sta_watcher_pid, NULL);
463 if (g_lynq_wpa_ctrl[0] != NULL)
464 wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
465 if (g_lynq_wpa_ctrl[1] != NULL)
466 wpa_ctrl_close(g_lynq_wpa_ctrl[1]);
467 g_ap_watcher_pid = 0;
468 g_sta_watcher_pid = 0;
469 g_lynq_wpa_ctrl[0] = NULL;
470 g_lynq_wpa_ctrl[1] = NULL;
471 system("systemctl stop wg870_drv_insmod.service");
you.chend2fef3f2023-02-13 10:50:35 +0800472 pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
473 return 0;
474}
475
476static inline char inner_convert_char(char in)
477{
478 if (in >= '0' && in <= '9')
479 {
480 return in - '0';
481 }
482 else if (in >= 'a' && in <= 'f')
483 {
484 return in - 'a' + 10;
485 }
486 else if (in >= 'A' && in <= 'F')
487 {
488 return in - 'A' + 10;
489 }
490 else
491 {
492 return '\xff';
493 }
494}
495
496static inline void inner_copy_ssid(char * out_ssid, const char * ssid, size_t out_ssid_len)
497{
498 char *p;
499 size_t pos = 0;
500 if (NULL == out_ssid)
501 return;
502 //printf("input ssid=[%s]\n", ssid);
503 memset(out_ssid, 0, out_ssid_len);
504 if (NULL == ssid)
505 return;
506 p = strchr(ssid, '\\');
507 if (NULL == p)
508 {
509 strncpy(out_ssid, ssid, out_ssid_len);
510 //printf(" first %s\n", out_ssid);
511 }
512 else
513 {
514 pos = p - ssid;
515 memcpy(out_ssid, ssid, pos);
516 //printf("pos %lu -- %s\n", pos, out_ssid);
517 for(; pos < out_ssid_len; pos ++)
518 {
519 if (p[0] == '\0')
520 {
521 //printf(" out %s\n", out_ssid);
522 return;
523 }
524 else if (p[0] != '\\')
525 {
526 out_ssid[pos] = p[0];
527 p += 1;
528 }
529 else if (p[1] == 'x' || p[1] == 'X')
530 {
531 out_ssid[pos] = inner_convert_char(p[2]) << 4 | inner_convert_char(p[3]);
532 p += 4;
533 }
534 else if (p[1] == '\\')
535 {
536 out_ssid[pos] = '\\';
537 p += 2;
538 }
539 else if (p[1] == 't')
540 {
541 out_ssid[pos] = '\t';
542 p += 2;
543 }
544 else if (p[1] == 'r')
545 {
546 out_ssid[pos] = '\r';
547 p += 2;
548 }
549 else if (p[1] == 'n')
550 {
551 out_ssid[pos] = '\n';
552 p += 2;
553 }//todo find a better way to convert?
554 }
555 }
556 //printf(" out %s\n", out_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -0500557}
qs.xiong1af5daf2022-03-14 09:12:12 -0400558
you.chen35020192022-05-06 11:30:57 +0800559static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
you.chend2fef3f2023-02-13 10:50:35 +0800560 int i, ssid_len;
you.chen35020192022-05-06 11:30:57 +0800561 char lynq_cmd_get[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +0800562 RLOGD("enter inner_get_param");
563 if (out_put == NULL)
564 {
565 RLOGE("output ptr is null");
you.chen35020192022-05-06 11:30:57 +0800566 return -1;
567 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800568 if (param_name == NULL)
569 {
570 RLOGE("param ptr is null");
you.chen35020192022-05-06 11:30:57 +0800571 return -1;
572 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800573 if (param_name[0] == '\0')
574 {
575 RLOGE("param is empty");
you.chen35020192022-05-06 11:30:57 +0800576 return -1;
577 }
578
579 sprintf(lynq_cmd_get, "GET_NETWORK %d %s", net_no, param_name);
580
581 CHECK_WPA_CTRL(interface);
582
583 DO_REQUEST(lynq_cmd_get);
584
qs.xiong9fbf74e2023-03-28 13:38:22 +0800585 if (memcmp(cmd_reply, "FAIL", 4) == 0)
586 {
587 RLOGE("wpa_supplicant return cmd_reply is FAIL");
you.chen35020192022-05-06 11:30:57 +0800588 return -1;
589 }
590
you.chena6fa5b22022-05-18 10:28:19 +0800591// printf("reply len %d, %08x\n", reply_len, (int)out_put);
you.chend2fef3f2023-02-13 10:50:35 +0800592 if (strcmp(param_name, "ssid") == 0)
593 {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800594 if (cmd_reply[0] == '\"')
595 {
you.chend2fef3f2023-02-13 10:50:35 +0800596 ssid_len = reply_len - 1;
597 memcpy(out_put, cmd_reply + 1, ssid_len);
598 if (out_put[ssid_len-1] == '\"')
599 {
600 out_put[ssid_len-1] = '\0';
601 }
602 else
603 {
604 out_put[ssid_len] = '\0';
605 }
606 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800607 else
608 {
you.chend2fef3f2023-02-13 10:50:35 +0800609 ssid_len = reply_len / 2;
610 for(i=0; i<ssid_len; i++)
611 {
612 out_put[i] = inner_convert_char(cmd_reply[i*2]) << 4 | inner_convert_char(cmd_reply[i*2 + 1]);
613 }
614 out_put[ssid_len] = '\0';
615 }
616 }
617 else
618 {
619 memcpy(out_put, cmd_reply, reply_len + 1);
620 }
you.chen35020192022-05-06 11:30:57 +0800621 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -0500622}
qs.xiong1af5daf2022-03-14 09:12:12 -0400623
you.chen35020192022-05-06 11:30:57 +0800624static int lynq_split(char * str, int len, char delimiter, char * results[]) {
625 int ret = 0;
626 char * end = str + len - 1;
627 results[ret++] = str;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800628 while(str < end)
629 {
630 if (*str == delimiter)
631 {
you.chen35020192022-05-06 11:30:57 +0800632 *str++ = '\0';
633 results[ret++] = str;
634 continue;
635 }
636 str++;
637 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800638 if (*str == delimiter)
639 {
you.chen35020192022-05-06 11:30:57 +0800640 *str = '\0';
641 }
qs.xiong1af5daf2022-03-14 09:12:12 -0400642
you.chen35020192022-05-06 11:30:57 +0800643 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -0500644}
645
you.chend2fef3f2023-02-13 10:50:35 +0800646static int inner_get_ip_by_mac(const char * mac, char * ip, int ip_len)
647{
648 char * p;
649 int ret = 0;
650 char cmd[256]={0};
651 if (NULL == mac || NULL == ip)
you.chen35020192022-05-06 11:30:57 +0800652 return -1;
you.chend2fef3f2023-02-13 10:50:35 +0800653 memset(ip, 0, ip_len);
qs.xiong13673462023-02-21 19:12:54 +0800654 sprintf(cmd, "ip n s | grep \"lladdr\" | grep \"%s\" | head -1 | awk '{print $1}'", mac);
you.chend2fef3f2023-02-13 10:50:35 +0800655 ret = exec_cmd(cmd, ip, ip_len);
656 p = strchr(ip, '\n');
657 if (NULL != p)
658 {
659 *p = '\0';
you.chen35020192022-05-06 11:30:57 +0800660 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800661 RLOGD("inner_get_ip_by_mac %s\n", ip);
you.chen35020192022-05-06 11:30:57 +0800662 return ret;
663}
664
you.chend2fef3f2023-02-13 10:50:35 +0800665static int inner_get_hostname_by_ip(char *ip, char *hostname) {
you.chen35020192022-05-06 11:30:57 +0800666 struct in_addr addr ={0};
667 struct hostent *ht;
668
qs.xiong9fbf74e2023-03-28 13:38:22 +0800669 if (ip == NULL || *ip == '\0' || hostname == NULL)
670 {
671 RLOGE("ip == NULL or hostname == NULL");
672 return -1;
you.chen35020192022-05-06 11:30:57 +0800673 }
674
you.chend2fef3f2023-02-13 10:50:35 +0800675 *hostname = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +0800676 if (inet_aton(ip, &addr) == 0)
677 {
you.chen35020192022-05-06 11:30:57 +0800678 printf("---inet_aton fail\n");
679 return -1;
680 }
681
682 ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
683
qs.xiong9fbf74e2023-03-28 13:38:22 +0800684 if (ht == NULL)
685 {
686 RLOGE("---gethostbyaddr fail\n");
you.chen35020192022-05-06 11:30:57 +0800687 herror(NULL);
688 return -1;
689 }
690
691 strcpy(hostname, ht->h_name);
692
693 return 0;
694}
695
696static int lynq_get_network_number_list(lynq_wifi_index_e idx, int ap_sta, int net_no_list[], char * ssid)
697{
698 int count, index, words_count;
699 char * split_lines[128]= {0};
700 char * split_words[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +0800701 char local_ssid[128] = {0};
you.chen35020192022-05-06 11:30:57 +0800702 const char *lynq_wifi_list_networks = "LIST_NETWORKS";
qs.xiong9fbf74e2023-03-28 13:38:22 +0800703 RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
you.chen35020192022-05-06 11:30:57 +0800704
705 CHECK_WPA_CTRL(ap_sta);
706
707 DO_REQUEST(lynq_wifi_list_networks);
708
709 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
710
711 //@todo check ssid field to compatible
712
713 ret = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800714 for(index=1; index < count; index++)
715 {
you.chen35020192022-05-06 11:30:57 +0800716 words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800717 if (words_count > 2)
718 {
you.chend2fef3f2023-02-13 10:50:35 +0800719 inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
qs.xiong9fbf74e2023-03-28 13:38:22 +0800720 if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
721 {
you.chen35020192022-05-06 11:30:57 +0800722 net_no_list[ret++] = atoi(split_words[0]);
723 }
724 }
725 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800726 RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
you.chen35020192022-05-06 11:30:57 +0800727 return ret;
728}
729
730static int lynq_add_network(int ap_sta) {
you.chen6c2dd9c2022-05-16 17:55:28 +0800731 size_t i=0;
you.chen35020192022-05-06 11:30:57 +0800732 CHECK_WPA_CTRL(ap_sta);
733 const char *lynq_wifi_add_network = "ADD_NETWORK";
734
qs.xiong9fbf74e2023-03-28 13:38:22 +0800735 RLOGD("[lynq_add_network] enter lynq_add_network");
you.chen35020192022-05-06 11:30:57 +0800736 DO_REQUEST(lynq_wifi_add_network);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800737 if (memcmp(cmd_reply, "FAIL", 4) == 0)
738 {
739 RLOGE("[wifi error]lynq_add_network cmd_reply FAIL");
you.chen35020192022-05-06 11:30:57 +0800740 return -1;
741 }
742
qs.xiong9fbf74e2023-03-28 13:38:22 +0800743 for(i=0;i<reply_len;i++)
744 {
745 if(cmd_reply[i] == '\n')
746 {
you.chen35020192022-05-06 11:30:57 +0800747 cmd_reply[i] = '\0';
748 break;
749 }
750 }
751 return atoi(cmd_reply);
752}
you.chena6cd55a2022-05-08 12:20:18 +0800753
you.chen35020192022-05-06 11:30:57 +0800754static int lynq_check_network_number(lynq_wifi_index_e idx, int ap_sta, int net_no)
755{
756 int count, index;
757 int net_no_list[128];
758
qs.xiong9fbf74e2023-03-28 13:38:22 +0800759 RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
you.chen35020192022-05-06 11:30:57 +0800760 count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800761 for (index=0; index < count; index++)
762 {
763 if (net_no_list[index] == net_no)
764 {
you.chen35020192022-05-06 11:30:57 +0800765 return 0;
766 }
767 }
768
769 if (count >= 1)
770 index = net_no_list[count - 1];
771 else
772 index = -1;
773
qs.xiong9fbf74e2023-03-28 13:38:22 +0800774 while (index < net_no )
775 {
you.chen35020192022-05-06 11:30:57 +0800776 index = lynq_add_network(ap_sta);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800777 if (index >= net_no)
778 { // required network no created
779 RLOGD("required network no created\n");;
you.chen35020192022-05-06 11:30:57 +0800780 return 0;
781 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800782 else if( index < 0)
783 {
784 RLOGE("[lynq_check_network_number] add network fail");
you.chena6cd55a2022-05-08 12:20:18 +0800785 return -1;
786 }
you.chen35020192022-05-06 11:30:57 +0800787 }
788
789 if (index < 0)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800790 {
791 RLOGE("[lynq_check_network_number] network index < 0");
792 return -1;
793 }
794 RLOGD("[lynq_check_network_number] work finished &state is ok");
you.chen35020192022-05-06 11:30:57 +0800795 return 0;
796}
797
798static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
qs.xiong9fbf74e2023-03-28 13:38:22 +0800799 if (freq > 5000 && freq < 6000)
800 {
you.chen35020192022-05-06 11:30:57 +0800801 return LYNQ_WIFI_5G_band;
802 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800803 else if (freq > 2000 && freq < 3000)
804 {
you.chen35020192022-05-06 11:30:57 +0800805 return LYNQ_WIFI_2G_band;
806 }
807 return LYNQ_WIFI_2_and_5G_band;
808}
809
810static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800811 if (key_mgmt != NULL)
812 {
813 if (memcmp( key_mgmt, "NONE", 4) == 0)
814 {
you.chen35020192022-05-06 11:30:57 +0800815 return LYNQ_WIFI_AUTH_OPEN;
816 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800817 else if (memcmp( key_mgmt, "WEP", 3) == 0)
818 {
you.chen35020192022-05-06 11:30:57 +0800819 return LYNQ_WIFI_AUTH_WEP;
820 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800821 else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
822 {
you.chen35020192022-05-06 11:30:57 +0800823 return LYNQ_WIFI_AUTH_WPA_PSK;
824 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800825 else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
826 {
you.chen35020192022-05-06 11:30:57 +0800827 return LYNQ_WIFI_AUTH_WPA2_PSK;
828 }
829 }
830
831 return -1;
832}
833
834static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
qs.xiong9fbf74e2023-03-28 13:38:22 +0800835 if (flag != NULL)
836 {
qs.xiong3e506812023-04-06 11:08:48 +0800837 if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
838 {
839 return LYNQ_WIFI_AUTH_WPA3_PSK;
840 }else if ( strstr( flag,"SAE-CCMP") != NULL )
841 {
842 return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
843 }else if (strstr( flag, "WPA2-PSK") != NULL)
844 {
you.chen35020192022-05-06 11:30:57 +0800845 return LYNQ_WIFI_AUTH_WPA2_PSK;
846 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800847 else if (strstr( flag, "WPA-PSK") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +0800848 {
you.chen35020192022-05-06 11:30:57 +0800849 return LYNQ_WIFI_AUTH_WPA_PSK;
850 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800851 else if (strstr( flag, "WEP") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +0800852 {
you.chen35020192022-05-06 11:30:57 +0800853 return LYNQ_WIFI_AUTH_WEP;
854 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800855 else if (strstr( flag, "NONE") != NULL)
qs.xiong3e506812023-04-06 11:08:48 +0800856 {
you.chen35020192022-05-06 11:30:57 +0800857 return LYNQ_WIFI_AUTH_OPEN;
858 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800859 else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
qs.xiong3e506812023-04-06 11:08:48 +0800860 {
you.chend2fef3f2023-02-13 10:50:35 +0800861 return LYNQ_WIFI_AUTH_OPEN;
862 }
you.chen35020192022-05-06 11:30:57 +0800863 }
864
865 return -1;
866}
867
868static lynq_wifi_bandwidth_type_m convert_bandwidth_from_bw(int bw) {
869 switch (bw) {
870 case 10:
871 return LYNQ_WIFI_BANDWIDTH_HT10;
872 break;
873 case 20:
874 return LYNQ_WIFI_BANDWIDTH_HT20;
875 break;
876 case 40:
877 return LYNQ_WIFI_BANDWIDTH_HT40;
878 break;
879 case 80:
880 return LYNQ_WIFI_BANDWIDTH_HT80;
881 break;
882 default:
883 break;
884 }
885
886 return -1;
887}
888
889static int inner_get_status_info(int interface, curr_status_info *curr_state) {
890 int i, count;
891 char *p;
892 const char *lynq_status_cmd = "STATUS";
893 const char * FLAG_SSID = "ssid=";
894 const char * FLAG_SBSID = "bssid=";
895 const char * FLAG_KEY_MGMT = "key_mgmt=";
896 const char * FLAG_FREQ = "freq=";
897 const char * FLAG_STATE = "wpa_state=";
898 const char * FLAG_ID = "id=";
you.chend2fef3f2023-02-13 10:50:35 +0800899 const char * FLAG_IPADDR = "ip_address=";
you.chen35020192022-05-06 11:30:57 +0800900 char *split_lines[128] = {0};
901
902 CHECK_WPA_CTRL(interface);
903
qs.xiong9fbf74e2023-03-28 13:38:22 +0800904 if (curr_state == NULL)
905 {
906 RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
you.chen35020192022-05-06 11:30:57 +0800907 return -1;
908 }
909
910 DO_REQUEST(lynq_status_cmd);
911
912 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
913
914 curr_state->net_no = -1;
915 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +0800916 for(i=0; i < count; i++)
917 {
918 if (curr_state->ap != NULL)
919 {
you.chen35020192022-05-06 11:30:57 +0800920 p = strstr(split_lines[i], FLAG_SBSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800921 if (p != NULL)
922 {
you.chend2fef3f2023-02-13 10:50:35 +0800923 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
you.chen35020192022-05-06 11:30:57 +0800924 ret = 0;
925 continue;
926 }
you.chenf58b3c92022-06-21 16:53:48 +0800927 p = strstr(split_lines[i], FLAG_SSID);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800928 if (p != NULL)
929 {
you.chend2fef3f2023-02-13 10:50:35 +0800930 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 +0800931 ret = 0;
932 continue;
933 }
you.chen35020192022-05-06 11:30:57 +0800934 p = strstr(split_lines[i], FLAG_KEY_MGMT);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800935 if (p != NULL)
936 {
you.chen450d0172022-07-15 17:56:48 +0800937 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
qs.xiong9fbf74e2023-03-28 13:38:22 +0800938 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
you.chen35020192022-05-06 11:30:57 +0800939 ret = 0;
940 continue;
941 }
942 p = strstr(split_lines[i], FLAG_FREQ);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800943 if (p != NULL)
944 {
you.chen35020192022-05-06 11:30:57 +0800945 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
946 ret = 0;
947 continue;
948 }
you.chend2fef3f2023-02-13 10:50:35 +0800949 p = strstr(split_lines[i], FLAG_IPADDR);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800950 if (p != NULL)
951 {
you.chend2fef3f2023-02-13 10:50:35 +0800952 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
953 ret = 0;
954 continue;
955 }
you.chen35020192022-05-06 11:30:57 +0800956 } // end if (ap != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800957 if (curr_state->state != NULL)
958 {
you.chen35020192022-05-06 11:30:57 +0800959 p = strstr(split_lines[i], FLAG_STATE);
qs.xiong9fbf74e2023-03-28 13:38:22 +0800960 if (p != NULL)
961 {
you.chen35020192022-05-06 11:30:57 +0800962 strcpy(curr_state->state, p + strlen(FLAG_STATE));
963 ret = 0;
964 continue;
965 }
966
967 } //end else if (state != NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +0800968 if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
969 {
you.chen35020192022-05-06 11:30:57 +0800970 ret = 0;
you.chen450d0172022-07-15 17:56:48 +0800971 curr_state->net_no = atoi(p + strlen(FLAG_ID));
qs.xiong9fbf74e2023-03-28 13:38:22 +0800972 RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
you.chen35020192022-05-06 11:30:57 +0800973 }
974 }
975
976 return ret;
977}
978
979
qs.xiongf1b525b2022-03-31 00:58:23 -0400980int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -0500981{
qs.xiong9fbf74e2023-03-28 13:38:22 +0800982 RLOGD("enter lynq_wifi_ap_ssid_set");
you.chen35020192022-05-06 11:30:57 +0800983 char lynq_wifi_ssid_cmd[80]={0};
qs.xiong7a105ce2022-03-02 09:43:11 -0500984
qs.xiong9fbf74e2023-03-28 13:38:22 +0800985 if (ap_ssid == NULL)
986 {
987 RLOGE("Input ap_ssid is NULL");
you.chen35020192022-05-06 11:30:57 +0800988 return -1;
989 }
qs.xiong9fbf74e2023-03-28 13:38:22 +0800990 else
991 {
992 RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
you.chen35020192022-05-06 11:30:57 +0800993 }
qs.xiong1af5daf2022-03-14 09:12:12 -0400994
qs.xiong9fbf74e2023-03-28 13:38:22 +0800995 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
996 {
997 RLOGE("Do check ap network_number fail");
you.chen35020192022-05-06 11:30:57 +0800998 return -1;
999 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001000
you.chen35020192022-05-06 11:30:57 +08001001 CHECK_IDX(idx, CTRL_AP);
1002
1003 CHECK_WPA_CTRL(CTRL_AP);
1004
1005 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", AP_NETWORK_0, ap_ssid);
1006
1007 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1008 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001009 RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
1010 return 0;
you.chen35020192022-05-06 11:30:57 +08001011
qs.xiong7a105ce2022-03-02 09:43:11 -05001012}
1013
you.chen35020192022-05-06 11:30:57 +08001014int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05001015{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001016 RLOGD("enter lynq_wifi_ap_ssid_get");
you.chen35020192022-05-06 11:30:57 +08001017 CHECK_IDX(idx, CTRL_AP);
you.chend2fef3f2023-02-13 10:50:35 +08001018 return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
qs.xiong7a105ce2022-03-02 09:43:11 -05001019}
1020
qs.xiongc9c79f72022-10-17 15:27:18 +08001021/*****
1022 *frequency <------>channel
1023 *
1024 *frequency 1 2 3 4 5 6 7 8 9 10 11 12 13 36 40 44 48 149 153 157 161 165
1025 *
1026 *
1027 *channel 2412,2417,2422,2427,2532,2437,2442,2447,2452,2457,2462,2467,2472,5180,5200,5220,5240,5745,5765,5785,5805,5825
1028 *
1029 *
1030 * */
1031static int lynq_check_set_frequency(int input_frequency){
qs.xiongc00b6032022-11-29 16:28:03 +08001032 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};
1033 int i;
1034 int arr_len = sizeof(legitimate_frequency) / sizeof(int);
1035
qs.xiong69a332b2022-12-02 09:58:57 +08001036 for(i = 0; i < arr_len; i++)
qs.xiongc00b6032022-11-29 16:28:03 +08001037 {
1038 if(input_frequency == legitimate_frequency[i])
qs.xiongc9c79f72022-10-17 15:27:18 +08001039 break;
qs.xiongc9c79f72022-10-17 15:27:18 +08001040 }
qs.xiongc00b6032022-11-29 16:28:03 +08001041
1042 if(i == arr_len)
1043 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001044 RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001045 return -1;
1046 }
qs.xiongc00b6032022-11-29 16:28:03 +08001047
qs.xiongc9c79f72022-10-17 15:27:18 +08001048 return 0;
1049}
qs.xiong13673462023-02-21 19:12:54 +08001050
1051static int lynq_check_frequencyby_country_code(int input_frequency)
1052{
1053 char str_cnc[]="CN";
1054 char str_dest[20]="";
1055
1056 if( lynq_get_country_code(1,str_dest) != 0 )
1057 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001058 RLOGE("get country_code error\n");
qs.xiong13673462023-02-21 19:12:54 +08001059 return -1;
1060 }
1061 if( strncmp(str_dest,str_cnc,2) != 0 )
1062 {
1063 return 0;
1064 }else if( 2473 < input_frequency && input_frequency < 5744)
1065 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001066 RLOGE("input frequency is bad\n");
qs.xiong13673462023-02-21 19:12:54 +08001067 return -1;
1068 }
1069 return 0;
1070}
qs.xiongf1b525b2022-03-31 00:58:23 -04001071int lynq_wifi_ap_frequency_set(lynq_wifi_index_e idx,int lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001072{
qs.xiongc00b6032022-11-29 16:28:03 +08001073 int check;
qs.xiongc9c79f72022-10-17 15:27:18 +08001074 char lynq_wifi_frequency_cmd[128]={0};
1075 char lynq_cmd_mode[128]={0};
you.chen35020192022-05-06 11:30:57 +08001076 char lynq_cmd_slect[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001077 RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
qs.xiongc9c79f72022-10-17 15:27:18 +08001078 //@do check input frequency
qs.xiongc00b6032022-11-29 16:28:03 +08001079 check = lynq_check_set_frequency(lynq_wifi_frequency);
1080 if(check != 0)
1081 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001082 RLOGE("do check frequency error");
qs.xiongc9c79f72022-10-17 15:27:18 +08001083 return -1;
you.chen35020192022-05-06 11:30:57 +08001084 }
qs.xiong13673462023-02-21 19:12:54 +08001085 check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
1086 if(check != 0)
1087 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001088 RLOGE("do check frequency error");
qs.xiong13673462023-02-21 19:12:54 +08001089 return -1;
1090 }
1091
qs.xiongc00b6032022-11-29 16:28:03 +08001092 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1093 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001094 RLOGE("[set ap frequecny][lynq_check_network_number] error");
you.chen35020192022-05-06 11:30:57 +08001095 return -1;
1096 }
qs.xiong1af5daf2022-03-14 09:12:12 -04001097
you.chen35020192022-05-06 11:30:57 +08001098 CHECK_IDX(idx, CTRL_AP);
1099
1100 CHECK_WPA_CTRL(CTRL_AP);
1101
1102 sprintf(lynq_wifi_frequency_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, lynq_wifi_frequency);
1103 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
1104 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
1105
you.chen6c2dd9c2022-05-16 17:55:28 +08001106 DO_OK_FAIL_REQUEST(cmd_disconnect);
you.chen35020192022-05-06 11:30:57 +08001107 DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
1108 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
1109 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001110
qs.xiong9fbf74e2023-03-28 13:38:22 +08001111 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001112}
1113
qs.xiongf1b525b2022-03-31 00:58:23 -04001114int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
qs.xiong7a105ce2022-03-02 09:43:11 -05001115{
you.chen35020192022-05-06 11:30:57 +08001116 char lynq_frequency_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001117 RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
you.chen35020192022-05-06 11:30:57 +08001118 CHECK_IDX(idx, CTRL_AP);
qs.xiongf1b525b2022-03-31 00:58:23 -04001119
qs.xiong9fbf74e2023-03-28 13:38:22 +08001120 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
1121 {
1122 RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
you.chen35020192022-05-06 11:30:57 +08001123 return -1;
1124 }
1125 *lynq_wifi_frequency = atoi(lynq_frequency_str);
qs.xiongf1b525b2022-03-31 00:58:23 -04001126
qs.xiong9fbf74e2023-03-28 13:38:22 +08001127 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001128}
1129
qs.xiongf1b525b2022-03-31 00:58:23 -04001130int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
1131{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001132 RLOGD("enter lynq_wifi_ap_bandwidth_set");
you.chen35020192022-05-06 11:30:57 +08001133 CHECK_IDX(idx, CTRL_AP);
1134 switch(bandwidth){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001135 case LYNQ_WIFI_BANDWIDTH_HT10:
1136 {
1137 RLOGE("bandwith [%d] not support now\n", bandwidth);
1138 return -1;
1139 }
1140 case LYNQ_WIFI_BANDWIDTH_HT20:
you.chen35020192022-05-06 11:30:57 +08001141 {
1142 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
1143 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001144 if (system(lynq_cmd_bandwith) != 0 )
1145 {
1146 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001147 return -1;
1148 }
1149 system("wl up");
1150 break;
1151 }
1152 case LYNQ_WIFI_BANDWIDTH_HT40:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001153 {
qs.xiong10379192023-02-21 13:19:42 +08001154 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
you.chen35020192022-05-06 11:30:57 +08001155 sprintf(lynq_cmd_bandwith, "wl chanspec ");
1156 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001157 if (system(lynq_cmd_bandwith) != 0 )
1158 {
1159 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001160 return -1;
1161 }
1162 system("wl up");
1163 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001164 }
you.chen35020192022-05-06 11:30:57 +08001165 case LYNQ_WIFI_BANDWIDTH_HT80:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001166 {
qs.xiong10379192023-02-21 13:19:42 +08001167 char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
you.chen35020192022-05-06 11:30:57 +08001168 system("wl down");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001169 if (system(lynq_cmd_bandwith) != 0 )
1170 {
1171 RLOGE("lynq_wifi_ap_bandwidth_set erro");
you.chen35020192022-05-06 11:30:57 +08001172 return -1;
1173 }
1174 system("wl up");
1175 break;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001176 }
1177 default:
you.chen35020192022-05-06 11:30:57 +08001178 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001179 RLOGE("auth type [%d] not support now\n", bandwidth);
1180 return -1;
you.chen35020192022-05-06 11:30:57 +08001181 }
1182 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001183
1184
you.chen35020192022-05-06 11:30:57 +08001185 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001186}
you.chen35020192022-05-06 11:30:57 +08001187
qs.xiongf1b525b2022-03-31 00:58:23 -04001188int lynq_wifi_ap_bandwidth_get(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m* bandwidth)
1189{
you.chen35020192022-05-06 11:30:57 +08001190 int count = 0;
1191 int index = 0;
1192 char *split_words[128] = {0};
1193 const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001194 RLOGD("enter lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001195 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001196
you.chen35020192022-05-06 11:30:57 +08001197 CHECK_WPA_CTRL(CTRL_AP);
1198
1199 DO_REQUEST(lynq_chanspec_cmd);
1200
1201 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
1202 for(;index < count; index++) {
1203 if (strncmp(split_words[index], "bw", 2) != 0) {
1204 continue;
1205 }
1206
1207 index++;
1208 if (index >= count) {
1209 return -1;
1210 }
1211
qs.xiong9fbf74e2023-03-28 13:38:22 +08001212 RLOGD("bw %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001213 *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
1214 return 0;
1215 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001216 RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
you.chen35020192022-05-06 11:30:57 +08001217 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001218}
qs.xiong0fb469a2022-04-14 03:50:45 -04001219
qs.xiongf1b525b2022-03-31 00:58:23 -04001220int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001221{
you.chen35020192022-05-06 11:30:57 +08001222 char lynq_cmd_channel[MAX_CMD]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001223 RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
you.chen35020192022-05-06 11:30:57 +08001224 CHECK_IDX(idx, CTRL_AP);
qs.xiong1d58e9b2022-04-14 06:17:01 -04001225
you.chen35020192022-05-06 11:30:57 +08001226 sprintf(lynq_cmd_channel, "wl channel %d", channel);
qs.xiong1af5daf2022-03-14 09:12:12 -04001227
qs.xiong9fbf74e2023-03-28 13:38:22 +08001228 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
1229 {
you.chen35020192022-05-06 11:30:57 +08001230 return -1;
1231 }
1232
1233 system("wl down");
1234 if (system(lynq_cmd_channel) != 0 ){
qs.xiong9fbf74e2023-03-28 13:38:22 +08001235 RLOGE("lynq_wifi_ap_channel_set erro");
you.chen35020192022-05-06 11:30:57 +08001236 return -1;
1237 }
1238 system("wl up");
1239 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001240}
qs.xiong0fb469a2022-04-14 03:50:45 -04001241
qs.xiongf1b525b2022-03-31 00:58:23 -04001242int lynq_wifi_ap_channel_get( lynq_wifi_index_e idx,int* channel)
qs.xiong7a105ce2022-03-02 09:43:11 -05001243{
you.chen35020192022-05-06 11:30:57 +08001244 int count = 0;
1245 int index = 0;
1246 char *split_words[128] = {0};
1247 char lynq_chanspec_cmd[]="DRIVER chanspec\n";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001248 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001249 CHECK_IDX(idx, CTRL_AP);
qs.xiong1af5daf2022-03-14 09:12:12 -04001250
you.chen35020192022-05-06 11:30:57 +08001251 CHECK_WPA_CTRL(CTRL_AP);
1252
1253 DO_REQUEST(lynq_chanspec_cmd);
1254
1255 count = lynq_split(cmd_reply, reply_len, ' ', split_words);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001256 for(;index < count; index++)
1257 {
1258 RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
you.chen35020192022-05-06 11:30:57 +08001259 if (strncmp(split_words[index], "channel", 2) != 0) {
1260 continue;
1261 }
1262
1263 index++;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001264 if (index >= count)
1265 {
you.chen35020192022-05-06 11:30:57 +08001266 return -1;
1267 }
1268
1269 *channel = atoi(split_words[index]);
1270 return 0;
1271 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001272 RLOGE("[lynq_wifi_ap_channel_get] function fail");
you.chen35020192022-05-06 11:30:57 +08001273 return -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001274}
1275
1276
you.chen35020192022-05-06 11:30:57 +08001277int lynq_wifi_ap_auth_set(lynq_wifi_index_e idx, lynq_wifi_auth_s auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001278{
you.chen6c2dd9c2022-05-16 17:55:28 +08001279 char ssid[MAX_CMD] = {0};
1280 int freq = 0;
1281 char lynq_auth_cmd[64]={0};
1282 char lynq_auth_alg_cmd[64]={0};
1283 char lynq_psk_cmd[64]={0};
1284 char lynq_pairwise_cmd[64]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001285 char lynq_ieee80211_cmd[64]={0};
1286 RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001287 lynq_wifi_auth_s org_auth;
you.chen35020192022-05-06 11:30:57 +08001288 CHECK_IDX(idx, CTRL_AP);
1289
you.chen6c2dd9c2022-05-16 17:55:28 +08001290 CHECK_WPA_CTRL(CTRL_AP);
1291
qs.xiong9fbf74e2023-03-28 13:38:22 +08001292 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0)
1293 {
1294 RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
you.chen35020192022-05-06 11:30:57 +08001295 return -1;
1296 }
1297
you.chen92fd5d32022-05-25 10:09:47 +08001298 if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
you.chen6c2dd9c2022-05-16 17:55:28 +08001299 if (org_auth == auth) {
qs.xiongc8d92a62023-03-29 17:36:14 +08001300 RLOGD("org_auth --- is %d\n",org_auth);
you.chen6c2dd9c2022-05-16 17:55:28 +08001301 return 0;
1302 }
1303 else {
1304 if (0 != lynq_wifi_ap_ssid_get(idx, ssid)) {
1305 ssid[0] = '\0';
1306 }
1307 lynq_wifi_ap_frequency_get(idx, &freq);
1308
1309 DO_OK_FAIL_REQUEST(cmd_disconnect);
1310 DO_OK_FAIL_REQUEST(cmd_remove_all);
1311 if (ssid[0] != '\0') {
1312 lynq_wifi_ap_ssid_set(idx, ssid);
1313 }
1314 if (freq != 0) {
1315 lynq_wifi_ap_frequency_set(idx, freq);
1316 }
1317 }
1318 }
you.chen35020192022-05-06 11:30:57 +08001319
qs.xiong9fbf74e2023-03-28 13:38:22 +08001320 switch(auth){
1321 case LYNQ_WIFI_AUTH_OPEN:
you.chen6c2dd9c2022-05-16 17:55:28 +08001322 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001323 RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
you.chen35020192022-05-06 11:30:57 +08001324 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001325 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001326 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001327 break;
1328 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001329 case LYNQ_WIFI_AUTH_WEP:
1330 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001331 RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001332 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
you.chen92fd5d32022-05-25 10:09:47 +08001333 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
you.chen6c2dd9c2022-05-16 17:55:28 +08001334 sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg SHARED", AP_NETWORK_0);
1335
1336 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1337 DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
1338 break;
1339 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001340 case LYNQ_WIFI_AUTH_WPA_PSK:
qs.xiongc8d92a62023-03-29 17:36:14 +08001341 {
1342 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1343 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1344 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1345
1346 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1347 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1348 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1349 break;
1350
1351 }
you.chen35020192022-05-06 11:30:57 +08001352 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08001353 {
1354 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
1355 {
you.chen35020192022-05-06 11:30:57 +08001356 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
1357 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1358 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001359 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1360 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001361 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
you.chena6cd55a2022-05-08 12:20:18 +08001362 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
you.chen35020192022-05-06 11:30:57 +08001363 }
1364// sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1365// sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
1366 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
qs.xiong7a105ce2022-03-02 09:43:11 -05001367
you.chen35020192022-05-06 11:30:57 +08001368 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1369 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1370 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001371 break;
1372 }
1373 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
1374 {
1375 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1376 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
1377 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
1378 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1379
1380 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1381 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1382 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1383 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1384 break;
1385 }
1386 case LYNQ_WIFI_AUTH_WPA3_PSK:
1387 {
1388 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
1389 sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
qs.xiong3e506812023-04-06 11:08:48 +08001390 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001391 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
1392
1393 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
1394 DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
1395 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
1396 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
1397 break;
1398 }
1399 default:
you.chen35020192022-05-06 11:30:57 +08001400 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08001401 RLOGE("auth type [%d] not support now\n", auth);
1402 return -1;
you.chen35020192022-05-06 11:30:57 +08001403 }
1404 }
you.chen6c2dd9c2022-05-16 17:55:28 +08001405 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong7a105ce2022-03-02 09:43:11 -05001406
qs.xiong9fbf74e2023-03-28 13:38:22 +08001407 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001408}
1409
you.chen35020192022-05-06 11:30:57 +08001410int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05001411{
you.chen35020192022-05-06 11:30:57 +08001412 char lynq_auth_str[MAX_RET] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001413 char lynq_auth_alg_str[MAX_RET] = {0};
1414 char lynq_proto_str[MAX_RET] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001415 RLOGD("enter lynq_wifi_ap_auth_get");
you.chen35020192022-05-06 11:30:57 +08001416 CHECK_IDX(idx, CTRL_AP);
1417
qs.xiong9fbf74e2023-03-28 13:38:22 +08001418 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
1419 {
1420 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
you.chen35020192022-05-06 11:30:57 +08001421 return -1;
1422 }
1423
qs.xiong9fbf74e2023-03-28 13:38:22 +08001424 if (memcmp( lynq_auth_str, "NONE", 4) == 0)
1425 {
1426 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
1427 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001428 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001429 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001430 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001431 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001432 else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
1433 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001434 RLOGD("---auth is WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001435 *auth = LYNQ_WIFI_AUTH_WEP;
qs.xiongc8d92a62023-03-29 17:36:14 +08001436 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001437 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001438 else
1439 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001440 RLOGD("---auth is OPEN\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001441 *auth = LYNQ_WIFI_AUTH_OPEN;
qs.xiongc8d92a62023-03-29 17:36:14 +08001442 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001443 }
you.chen35020192022-05-06 11:30:57 +08001444 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001445 else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
1446 {
1447 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
1448 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001449 RLOGE("---auth is -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001450 *auth = -1;
you.chen6c2dd9c2022-05-16 17:55:28 +08001451 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001452 else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
1453 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001454 RLOGD("---auth WPA2_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001455 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001456 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001457 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001458 else
1459 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001460 RLOGD("---auth WPA_PSK\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001461 *auth = LYNQ_WIFI_AUTH_WPA_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001462 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001463 }
you.chen35020192022-05-06 11:30:57 +08001464 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001465
1466 if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
1467 {
1468 RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
1469 return -1;
1470 }
1471
1472 if (memcmp(lynq_auth_str,"1",1) == 0 )
1473 {
1474 RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
1475 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001476 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001477 }else if (memcmp(lynq_auth_str,"2",1) == 0 )
1478 {
1479 RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
1480 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001481 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001482 }
1483 else
1484 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001485 RLOGE("---auth -- -1\n");
you.chen92fd5d32022-05-25 10:09:47 +08001486 *auth = -1;
1487 }
qs.xiong7a105ce2022-03-02 09:43:11 -05001488
you.chen6c2dd9c2022-05-16 17:55:28 +08001489 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001490}
qs.xiong1af5daf2022-03-14 09:12:12 -04001491
qs.xiong1af5daf2022-03-14 09:12:12 -04001492
qs.xiongf1b525b2022-03-31 00:58:23 -04001493int lynq_wifi_ap_start(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001494{
you.chen35020192022-05-06 11:30:57 +08001495 char LYNQ_WIFI_CMD[128]={0};
1496 //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
1497 //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001498 RLOGD("enter lynq_wifi_ap_channel_get");
you.chen35020192022-05-06 11:30:57 +08001499 CHECK_IDX(idx, CTRL_AP);
1500
1501 CHECK_WPA_CTRL(CTRL_AP);
1502
1503// system("connmanctl enable wifi");
1504// system("connmanctl tether wifi on cy-test 12345678");
1505// system("ifconfig wlan0 down");
1506// system("ifconfig wlan0 up");
1507// system("ifconfig wlan0 up");
1508
1509 //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
1510 //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
1511
1512 sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
1513 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1514
qs.xiong9fbf74e2023-03-28 13:38:22 +08001515 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001516}
1517
qs.xiongf1b525b2022-03-31 00:58:23 -04001518int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001519{
you.chen35020192022-05-06 11:30:57 +08001520 return lynq_wifi_ap_stop(idx) == 0 ? lynq_wifi_ap_start(idx) : -1;
qs.xiong7a105ce2022-03-02 09:43:11 -05001521}
1522
qs.xiongf1b525b2022-03-31 00:58:23 -04001523int lynq_wifi_ap_stop(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001524{
you.chen35020192022-05-06 11:30:57 +08001525 char LYNQ_WIFI_CMD[128]={0};
qs.xiong1af5daf2022-03-14 09:12:12 -04001526
you.chen35020192022-05-06 11:30:57 +08001527 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001528
you.chen35020192022-05-06 11:30:57 +08001529 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001530
you.chen35020192022-05-06 11:30:57 +08001531 sprintf(LYNQ_WIFI_CMD,"DISABLE_NETWORK %d",AP_NETWORK_0);
1532
1533 DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
1534
you.chenb4b121c2022-05-06 17:50:16 +08001535// system("connmanctl tether wifi off");
you.chen35020192022-05-06 11:30:57 +08001536
qs.xiong9fbf74e2023-03-28 13:38:22 +08001537 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001538}
qs.xiong1af5daf2022-03-14 09:12:12 -04001539
qs.xiongf1b525b2022-03-31 00:58:23 -04001540int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001541{
you.chen35020192022-05-06 11:30:57 +08001542 char lynq_disable_cmd[128] = {0};
1543 char lynq_select_cmd[128] = {0};
1544 const char *lynq_hide_cmd = "SET HIDE_SSID 1";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001545 RLOGD("enter lynq_wifi_ap_hide_ssid");
you.chen35020192022-05-06 11:30:57 +08001546 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001547
you.chen35020192022-05-06 11:30:57 +08001548 CHECK_WPA_CTRL(CTRL_AP);
you.chen35020192022-05-06 11:30:57 +08001549 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1550 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1551
1552 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1553 DO_OK_FAIL_REQUEST(lynq_hide_cmd);
1554 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong1af5daf2022-03-14 09:12:12 -04001555
qs.xiong9fbf74e2023-03-28 13:38:22 +08001556 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001557}
1558
qs.xiongf1b525b2022-03-31 00:58:23 -04001559int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
qs.xiong7a105ce2022-03-02 09:43:11 -05001560{
you.chen35020192022-05-06 11:30:57 +08001561 char lynq_disable_cmd[128] = {0};
1562 char lynq_select_cmd[128] = {0};
1563 const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
qs.xiong9fbf74e2023-03-28 13:38:22 +08001564 RLOGD("enter lynq_wifi_ap_unhide_ssid");
you.chen35020192022-05-06 11:30:57 +08001565 CHECK_IDX(idx, CTRL_AP);
qs.xiong7a105ce2022-03-02 09:43:11 -05001566
you.chen35020192022-05-06 11:30:57 +08001567 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001568
you.chen35020192022-05-06 11:30:57 +08001569 sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
1570 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
1571
1572 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
1573 DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
1574 DO_OK_FAIL_REQUEST(lynq_select_cmd);
qs.xiong7a105ce2022-03-02 09:43:11 -05001575
qs.xiong9fbf74e2023-03-28 13:38:22 +08001576 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001577}
qs.xiongf1b525b2022-03-31 00:58:23 -04001578
you.chen35020192022-05-06 11:30:57 +08001579int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001580{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001581 int pass_len;
you.chen6c2dd9c2022-05-16 17:55:28 +08001582 char lynq_tmp_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001583 char lynq_wpa2_wpa3[64] = {0};
you.chen6c2dd9c2022-05-16 17:55:28 +08001584 char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001585 RLOGD("enter lynq_ap_password_set");
1586 if( password == NULL )
1587 {
1588 RLOGE("[lynq_ap_password_set]input password is NULL");
qs.xionge7074322022-06-27 11:34:53 +08001589 return -1;
1590 }
1591 pass_len=strlen(password);
you.chen6c2dd9c2022-05-16 17:55:28 +08001592 lynq_wifi_auth_s auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001593 if(pass_len < 8 || pass_len >= 64)
1594 {
1595 RLOGE("[lynq_ap_password_set]input password len not in rage");
1596 return -1;
you.chen35020192022-05-06 11:30:57 +08001597 }
qs.xiongf1b525b2022-03-31 00:58:23 -04001598
you.chen35020192022-05-06 11:30:57 +08001599 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001600
qs.xiong9fbf74e2023-03-28 13:38:22 +08001601 if (0 != lynq_wifi_ap_auth_get(idx, &auth))
1602 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001603 RLOGE("[lynq_ap_password_set] get ap auth info error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001604 return -1;
1605 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001606 else if (auth == LYNQ_WIFI_AUTH_OPEN)
1607 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001608 RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
1609 return 0;
you.chen6c2dd9c2022-05-16 17:55:28 +08001610 }
1611
you.chen35020192022-05-06 11:30:57 +08001612 CHECK_WPA_CTRL(CTRL_AP);
1613
qs.xiong9fbf74e2023-03-28 13:38:22 +08001614 if (auth == LYNQ_WIFI_AUTH_WEP)
1615 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001616 RLOGD("[lynq_ap_password_set]ap auth : LYNQ_WIFI_AUTH_WEP\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001617 sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
1618 sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
1619 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1620 DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
1621 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001622 else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
1623 {
qs.xiongc8d92a62023-03-29 17:36:14 +08001624 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 +08001625 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
1626 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1627 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001628 else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
1629 {
1630
qs.xiongc8d92a62023-03-29 17:36:14 +08001631 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 +08001632 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
qs.xiongfd771f42023-03-28 14:06:12 +08001633 sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001634 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1635 DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
1636
1637 }
1638 else
qs.xiongc8d92a62023-03-29 17:36:14 +08001639 {
1640 RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
you.chen6c2dd9c2022-05-16 17:55:28 +08001641 return -1;
1642 }
you.chen35020192022-05-06 11:30:57 +08001643
you.chen35020192022-05-06 11:30:57 +08001644 DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong97fa59b2022-04-07 05:41:29 -04001645
qs.xiong9fbf74e2023-03-28 13:38:22 +08001646 return 0;
qs.xiongf1b525b2022-03-31 00:58:23 -04001647}
1648
you.chen35020192022-05-06 11:30:57 +08001649int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
qs.xiongf1b525b2022-03-31 00:58:23 -04001650{
you.chen35020192022-05-06 11:30:57 +08001651 FILE * fp;
1652 int len, ret;
1653 int count, index;
1654 char *split_lines[128] = {0};
1655 char *buff, *p;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001656 RLOGD("enter lynq_ap_password_get");
qs.xiong97fa59b2022-04-07 05:41:29 -04001657
you.chen35020192022-05-06 11:30:57 +08001658 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04001659
you.chen35020192022-05-06 11:30:57 +08001660 fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
1661// fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001662 if (NULL == fp)
1663 {
1664 RLOGE("open file fail\n");
you.chen35020192022-05-06 11:30:57 +08001665 return -1;
1666 }
qs.xiong97fa59b2022-04-07 05:41:29 -04001667
you.chen35020192022-05-06 11:30:57 +08001668 buff = alloca(MAX_RET);
1669 fseek(fp, 0, SEEK_SET);
1670 len = fread(buff, 1, MAX_RET, fp);
1671 fclose(fp);
qs.xiong97fa59b2022-04-07 05:41:29 -04001672
qs.xiong9fbf74e2023-03-28 13:38:22 +08001673 for(index=0; index < len; index ++)
1674 {
1675 if (memcmp(buff + index, "network={", 9) != 0)
1676 {
you.chen35020192022-05-06 11:30:57 +08001677 continue;
1678 }
1679 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001680 for (; index < len; index ++ )
1681 {
1682 if (buff[index] != '}')
1683 {
you.chen35020192022-05-06 11:30:57 +08001684 continue;
1685 }
1686 buff[index] = '\0';
1687 break;
1688 }
1689 len = buff + index - p;
1690 }
1691
1692 count = lynq_split(p, len, '\n', split_lines);
1693
1694 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001695 for(index=0; index < count; index++)
1696 {
you.chen35020192022-05-06 11:30:57 +08001697 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001698 if (p != NULL)
1699 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001700 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001701 if (*p == '\"')
1702 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001703 p++;
1704 }
you.chen35020192022-05-06 11:30:57 +08001705 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001706 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
1707 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001708 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001709 if (*p == '\"')
1710 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001711 p++;
1712 }
1713 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001714 else
1715 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001716 continue;
you.chen35020192022-05-06 11:30:57 +08001717 }
1718
1719 strcpy(password, p);
1720
qs.xiong9fbf74e2023-03-28 13:38:22 +08001721 while(*password != '\0')
1722 {
1723 if (*password == '\"')
1724 {
you.chen35020192022-05-06 11:30:57 +08001725 *password = '\0';
1726 break;
1727 }
1728 password++;
1729 }
1730 ret = 0;
1731 break;
1732 } //end for(index=0; index < count; index++)
1733
1734 return ret;
qs.xiong7a105ce2022-03-02 09:43:11 -05001735}
1736
you.chen35020192022-05-06 11:30:57 +08001737static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth) {
1738 char lynq_auth_str[MAX_RET] = {0};
you.chena6cd55a2022-05-08 12:20:18 +08001739 char lynq_proto_str[MAX_RET] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04001740
qs.xiong9fbf74e2023-03-28 13:38:22 +08001741 if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
1742 {
you.chen35020192022-05-06 11:30:57 +08001743 return -1;
1744 }
1745
1746 *auth = convert_auth_from_key_mgmt(lynq_auth_str);
you.chena6cd55a2022-05-08 12:20:18 +08001747
qs.xiong9fbf74e2023-03-28 13:38:22 +08001748 if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
1749 {
1750 if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
1751 {
1752 if (strcmp(lynq_proto_str, "RSN") == 0)
1753 {
you.chena6cd55a2022-05-08 12:20:18 +08001754 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001755 return 0;
you.chena6cd55a2022-05-08 12:20:18 +08001756 }
1757 }
1758 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001759 if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
1760 {
1761 RLOGE("check ieee80211w error\n");
1762 return -1;
1763 }
1764 if ( strncmp(lynq_auth_str,"1",1) == 0 )
1765 {
1766
1767 *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001768 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001769 }else if( strncmp(lynq_auth_str,"2",1) == 0 )
1770 {
1771
1772 *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
qs.xiongc8d92a62023-03-29 17:36:14 +08001773 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001774 }else
1775 {
1776 *auth = -1;
1777 return -1;
1778 }
you.chen35020192022-05-06 11:30:57 +08001779 return 0;
1780}
1781
1782int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
qs.xiong7a105ce2022-03-02 09:43:11 -05001783{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001784 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08001785 int pass_len, net_no, count, index;
1786 char lynq_tmp_cmd[300]={0};
1787 int net_no_list[128];
1788 lynq_wifi_auth_s net_auth;
1789 pass_len=strlen(password);
qs.xiong9fbf74e2023-03-28 13:38:22 +08001790 if(pass_len < 8 || pass_len >= 64)
1791 {
1792 RLOGE("[lynq_sta_ssid_password_set]input psw error");
you.chen35020192022-05-06 11:30:57 +08001793 return -1;
1794 }
1795
1796 CHECK_IDX(idx, CTRL_STA);
1797
1798 net_no = -1;
1799 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
1800
qs.xiong9fbf74e2023-03-28 13:38:22 +08001801 for (index=0; index < count; index++)
1802 {
you.chen35020192022-05-06 11:30:57 +08001803 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001804 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
1805 {
you.chen35020192022-05-06 11:30:57 +08001806 net_no = net_no_list[index];
1807 break;
1808 }
1809 }
1810
qs.xiong9fbf74e2023-03-28 13:38:22 +08001811 if (net_no < 0)
1812 {
you.chen35020192022-05-06 11:30:57 +08001813 return -1;
1814 }
1815
1816 CHECK_WPA_CTRL(CTRL_STA);
1817
1818 sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",net_no, password);
1819
1820 DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
1821 DO_OK_FAIL_REQUEST(cmd_save_config);
1822
1823 return 0;
1824}
1825
1826int lynq_sta_ssid_password_get(lynq_wifi_index_e idx, ap_info_s *ap, char *password) { // @todo
1827
1828 FILE * fp;
you.chend2fef3f2023-02-13 10:50:35 +08001829 int len, ret, network_len, i, ssid_len;
you.chen35020192022-05-06 11:30:57 +08001830 int count, index;
1831 char *split_lines[128] = {0};
you.chend2fef3f2023-02-13 10:50:35 +08001832 char *buff, *p, *ssid, *ssid_end_flag;
1833 char tmp_ssid[128]={0};
qs.xiong9fbf74e2023-03-28 13:38:22 +08001834 RLOGD("enter lynq_sta_ssid_password_get");
you.chen35020192022-05-06 11:30:57 +08001835
you.chen755332b2022-08-06 16:59:10 +08001836 network_len = 0;
1837 p = NULL;
1838
you.chen35020192022-05-06 11:30:57 +08001839 CHECK_IDX(idx, CTRL_STA);
1840
qs.xiong9fbf74e2023-03-28 13:38:22 +08001841 if (NULL == password)
1842 {
1843 RLOGE("bad param\n");
you.chen755332b2022-08-06 16:59:10 +08001844 return -1;
1845 }
1846
you.chen35020192022-05-06 11:30:57 +08001847 fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001848 if (NULL == fp)
1849 {
1850 RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
you.chen35020192022-05-06 11:30:57 +08001851 return -1;
1852 }
1853
1854 buff = alloca(MAX_RET);
1855 fseek(fp, 0, SEEK_SET);
1856 len = fread(buff, 1, MAX_RET, fp);
1857 fclose(fp);
1858
qs.xiong9fbf74e2023-03-28 13:38:22 +08001859 for(index=0; index < len; index ++)
1860 {
1861 for(; index < len; index ++)
1862 {
1863 if (memcmp(buff + index, "network={", 9) != 0)
1864 {
you.chen35020192022-05-06 11:30:57 +08001865 continue;
1866 }
1867 p = buff + index + 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001868 for (; index < len; index ++ )
1869 {
1870 if (buff[index] != '}')
1871 {
you.chen35020192022-05-06 11:30:57 +08001872 continue;
1873 }
1874 buff[index] = '\0';
1875 break;
1876 }
you.chen755332b2022-08-06 16:59:10 +08001877 network_len = buff + index - p;
1878 break;
you.chen35020192022-05-06 11:30:57 +08001879 }
1880
qs.xiongb3f26af2023-02-17 18:41:07 +08001881 if (p == NULL)
1882 return -1;
1883
you.chend2fef3f2023-02-13 10:50:35 +08001884 ssid = strstr(p, "ssid=");
1885 if (ssid != NULL) {
1886 ssid += strlen("ssid=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001887 if (ssid[0] == '\"')
1888 {
you.chend2fef3f2023-02-13 10:50:35 +08001889 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
1890 break;
1891 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001892 else
1893 {
you.chend2fef3f2023-02-13 10:50:35 +08001894 ssid_end_flag = strstr(ssid, "\n");
1895 if (ssid_end_flag != NULL)
1896 {
1897 ssid_len = (ssid_end_flag - ssid) / 2;
1898 for(i=0; i<ssid_len; i++)
1899 {
1900 tmp_ssid[i] = inner_convert_char(ssid[i*2]) << 4 | inner_convert_char(ssid[i*2 + 1]);
1901 }
1902 if (memcmp(tmp_ssid, ap->ap_ssid, ssid_len) == 0)
1903 break;
1904 }
1905 }
you.chen35020192022-05-06 11:30:57 +08001906 }
you.chend2fef3f2023-02-13 10:50:35 +08001907
you.chen35020192022-05-06 11:30:57 +08001908 }
1909
qs.xiong9fbf74e2023-03-28 13:38:22 +08001910 if (index >= len || NULL == p || network_len <= 0)
1911 {
you.chen35020192022-05-06 11:30:57 +08001912 return -1;
1913 }
1914
you.chen755332b2022-08-06 16:59:10 +08001915 count = lynq_split(p, network_len, '\n', split_lines);
you.chen35020192022-05-06 11:30:57 +08001916
1917 ret = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001918 for(index=0; index < count; index++)
1919 {
you.chen35020192022-05-06 11:30:57 +08001920 p = strstr(split_lines[index], "psk=");
qs.xiong9fbf74e2023-03-28 13:38:22 +08001921 if (p != NULL)
1922 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001923 p += 4;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001924 if (*p == '\"')
1925 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001926 p++;
1927 }
you.chen35020192022-05-06 11:30:57 +08001928 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001929 else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
1930 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001931 p += 9;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001932 if (*p == '\"')
1933 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001934 p++;
1935 }
1936 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08001937 else
1938 {
you.chen6c2dd9c2022-05-16 17:55:28 +08001939 continue;
you.chen35020192022-05-06 11:30:57 +08001940 }
1941
qs.xiong13673462023-02-21 19:12:54 +08001942 if (*p == '\"')
1943 p++;
1944 strncpy(password, p, 64);
you.chen35020192022-05-06 11:30:57 +08001945
qs.xiong13673462023-02-21 19:12:54 +08001946 p = password;
qs.xiong9fbf74e2023-03-28 13:38:22 +08001947 while(password - p < 64 && *password != '\0')
1948 {
1949 if (*password == '\"')
1950 {
you.chen35020192022-05-06 11:30:57 +08001951 *password = '\0';
1952 break;
1953 }
1954 password++;
1955 }
1956 ret = 0;
1957 break;
1958 } //end for(index=0; index < count; index++)
1959
1960 return ret;
1961}
1962
1963static int inner_set_sta_ssid(int net_no, char *sta_ssid)
1964{
qs.xiong9fbf74e2023-03-28 13:38:22 +08001965 char lynq_wifi_ssid_cmd[80]={0};
qs.xiongf1b525b2022-03-31 00:58:23 -04001966
qs.xiong9fbf74e2023-03-28 13:38:22 +08001967 if (sta_ssid == NULL)
1968 {
1969 RLOGE("sta_ssid is null\n");
1970 return -1;
you.chen35020192022-05-06 11:30:57 +08001971 }
1972
qs.xiong9fbf74e2023-03-28 13:38:22 +08001973 CHECK_WPA_CTRL(CTRL_STA);
you.chen35020192022-05-06 11:30:57 +08001974
1975 sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
1976
1977 DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
1978// DO_OK_FAIL_REQUEST(cmd_save_config);
1979
qs.xiong9fbf74e2023-03-28 13:38:22 +08001980 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05001981
1982}
1983
you.chen35020192022-05-06 11:30:57 +08001984static int inner_sta_start_stop(int net_no, int start_flag, int save)
qs.xiong7a105ce2022-03-02 09:43:11 -05001985{
you.chen35020192022-05-06 11:30:57 +08001986 char lynq_disable_cmd[128]={0};
1987 char lynq_select_cmd[128]={0};
1988
1989 CHECK_WPA_CTRL(CTRL_STA);
1990
qs.xiong9fbf74e2023-03-28 13:38:22 +08001991 if (save != 0)
1992 {
you.chenc29444e2022-06-07 18:01:16 +08001993 if (start_flag != 0)
1994 {
1995 sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
1996 DO_OK_FAIL_REQUEST(lynq_select_cmd);
1997 }
1998 else
1999 {
2000 sprintf(lynq_select_cmd,"DISABLE_NETWORK %d", net_no);
2001 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2002 }
you.chen35020192022-05-06 11:30:57 +08002003 DO_OK_FAIL_REQUEST(cmd_save_config);
2004 }
2005
qs.xiong9fbf74e2023-03-28 13:38:22 +08002006 if (start_flag == 0)
2007 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002008 sprintf(lynq_disable_cmd,"DISCONNECT");
you.chen35020192022-05-06 11:30:57 +08002009 DO_OK_FAIL_REQUEST(lynq_disable_cmd);
2010 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002011 else
2012 {
you.chen35020192022-05-06 11:30:57 +08002013 sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
2014 DO_OK_FAIL_REQUEST(lynq_select_cmd);
2015 }
2016
2017 return 0;
2018}
2019
2020int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
2021{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002022 RLOGD("enter lynq_sta_ssid_password_set");
you.chen35020192022-05-06 11:30:57 +08002023 CHECK_IDX(idx, CTRL_STA);
2024
you.chen6c2dd9c2022-05-16 17:55:28 +08002025 curr_status_info curr_state;
2026 ap_info_s ap_info;
2027 curr_state.ap = &ap_info;
2028 curr_state.state = NULL;
2029
qs.xiong9fbf74e2023-03-28 13:38:22 +08002030 if (0 == inner_get_status_info(CTRL_STA, &curr_state))
2031 {
you.chend2fef3f2023-02-13 10:50:35 +08002032 strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
you.chen6c2dd9c2022-05-16 17:55:28 +08002033 return 0;
2034 }
2035
2036 return -1;
you.chen35020192022-05-06 11:30:57 +08002037}
2038
2039int lynq_wifi_get_sta_available_ap(lynq_wifi_index_e idx, ap_detail_info_s *info)
2040{
you.chen9ac66392022-08-06 17:01:16 +08002041 scan_info_s *scan_list = NULL;
2042 saved_ap_info_s *save_list = NULL;
you.chen35020192022-05-06 11:30:57 +08002043 int scan_len=0;
2044 int save_len=0;
2045 int best_index = -1;
2046 int best_scan_index = -1;
2047 int best_rssi = 0;
you.chen9ac66392022-08-06 17:01:16 +08002048 int i, j, ret;
2049
2050 ret = -1;
you.chen35020192022-05-06 11:30:57 +08002051
2052 CHECK_IDX(idx, CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002053 if (info == NULL)
2054 {
you.chen35020192022-05-06 11:30:57 +08002055 return -1;
2056 }
2057
2058 curr_status_info curr_state;
2059 ap_info_s ap_info;
you.chen9ac66392022-08-06 17:01:16 +08002060 char status[64];
you.chen35020192022-05-06 11:30:57 +08002061
you.chen9ac66392022-08-06 17:01:16 +08002062 memset(&ap_info, 0, sizeof (ap_info));
2063 memset(status, 0, sizeof (status));
2064
2065 curr_state.ap = &ap_info;
2066 curr_state.state = status;
2067
qs.xiong9fbf74e2023-03-28 13:38:22 +08002068 if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
2069 {
you.chen35020192022-05-06 11:30:57 +08002070 memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
you.chen9ac66392022-08-06 17:01:16 +08002071 if (strcmp(status, STATE_COMPLETED) == 0)
2072 {
2073 info->status = LYNQ_WIFI_AP_STATUS_ENABLE;
2074 }
2075 else
2076 {
2077 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2078 }
you.chen35020192022-05-06 11:30:57 +08002079 lynq_get_connect_ap_rssi(idx, &info->rssi);
you.chen9ac66392022-08-06 17:01:16 +08002080 lynq_sta_ssid_password_get(idx, & info->base_info, info->base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002081 return 0;
2082 }
2083
you.chen9ac66392022-08-06 17:01:16 +08002084 lynq_wifi_sta_start_scan(idx);
qs.xiong3e506812023-04-06 11:08:48 +08002085 sleep(2);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002086 if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
2087 {
you.chen9ac66392022-08-06 17:01:16 +08002088 if (NULL != scan_list)
2089 {
2090 free(scan_list);
2091 }
you.chen35020192022-05-06 11:30:57 +08002092 return -1;
2093 }
2094
qs.xiong9fbf74e2023-03-28 13:38:22 +08002095 if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
2096 {
you.chen9ac66392022-08-06 17:01:16 +08002097 if (NULL != scan_list)
2098 {
2099 free(scan_list);
2100 }
2101 if (NULL != save_list)
2102 {
2103 free(save_list);
2104 }
you.chen35020192022-05-06 11:30:57 +08002105 return -1;
2106 }
2107
qs.xiong9fbf74e2023-03-28 13:38:22 +08002108 for (i=0; i < save_len; i++)
2109 {
2110 for (j=0; j < scan_len; j++)
2111 {
you.chen35020192022-05-06 11:30:57 +08002112 if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
qs.xiong9fbf74e2023-03-28 13:38:22 +08002113 && save_list[i].base_info.auth == scan_list[j].auth)
2114 {
2115 if (best_rssi == 0)
2116 {
you.chen9ac66392022-08-06 17:01:16 +08002117 best_index = i;
you.chen35020192022-05-06 11:30:57 +08002118 best_rssi = scan_list[j].rssi;
2119 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002120 else if (best_rssi > scan_list[j].rssi)
2121 {
you.chen35020192022-05-06 11:30:57 +08002122 best_index = i;
2123 best_scan_index = j;
2124 best_rssi = scan_list[j].rssi;
2125 }
you.chend2fef3f2023-02-13 10:50:35 +08002126 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 +08002127 break;
2128 }
2129 }
2130 }
2131
qs.xiong9fbf74e2023-03-28 13:38:22 +08002132 if (best_index >= 0)
2133 {
you.chen35020192022-05-06 11:30:57 +08002134 memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
you.chend2fef3f2023-02-13 10:50:35 +08002135 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 +08002136 info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
2137 info->rssi = best_rssi;
you.chen9ac66392022-08-06 17:01:16 +08002138 ret = 0;
you.chen35020192022-05-06 11:30:57 +08002139 }
2140
you.chen9ac66392022-08-06 17:01:16 +08002141 if (NULL != scan_list)
2142 {
2143 free(scan_list);
2144 }
2145 if (NULL != save_list)
2146 {
2147 free(save_list);
2148 }
2149
2150 return ret;
you.chen35020192022-05-06 11:30:57 +08002151}
2152
2153static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
2154{
qs.xiongc8d92a62023-03-29 17:36:14 +08002155 char lynq_auth_cmd[128]={0};
you.chen35020192022-05-06 11:30:57 +08002156 char lynq_ket_mgmt_cmd[64]={0};
2157 char lynq_pairwise_cmd[64]={0};
2158 char lynq_psk_cmd[64]={0};
2159
2160 CHECK_WPA_CTRL(CTRL_STA);
2161
qs.xiong9fbf74e2023-03-28 13:38:22 +08002162 switch(auth)
2163 {
2164 case LYNQ_WIFI_AUTH_OPEN:
you.chen35020192022-05-06 11:30:57 +08002165 {
2166 sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002167
you.chen35020192022-05-06 11:30:57 +08002168 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002169// DO_OK_FAIL_REQUEST(cmd_save_config);
2170 break;
2171 }
2172 case LYNQ_WIFI_AUTH_WPA_PSK:
you.chen35020192022-05-06 11:30:57 +08002173 case LYNQ_WIFI_AUTH_WPA2_PSK:
qs.xiong9fbf74e2023-03-28 13:38:22 +08002174 {
2175 if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
2176 {
you.chen35020192022-05-06 11:30:57 +08002177 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
2178 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002179 else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
2180 {
you.chena6cd55a2022-05-08 12:20:18 +08002181 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
you.chen35020192022-05-06 11:30:57 +08002182 }
2183 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
2184 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
qs.xiong97fa59b2022-04-07 05:41:29 -04002185
you.chen35020192022-05-06 11:30:57 +08002186 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
2187 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2188 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
qs.xiong97fa59b2022-04-07 05:41:29 -04002189
qs.xiong9fbf74e2023-03-28 13:38:22 +08002190 if (password != NULL)
2191 {
you.chen35020192022-05-06 11:30:57 +08002192 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2193 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002194 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
you.chen35020192022-05-06 11:30:57 +08002195 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002196
you.chen35020192022-05-06 11:30:57 +08002197// DO_OK_FAIL_REQUEST(cmd_save_config);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002198 break;
2199 }
2200 case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
2201 {
qs.xiong3e506812023-04-06 11:08:48 +08002202 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002203 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002204 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2205 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2206
qs.xiong3e506812023-04-06 11:08:48 +08002207 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002208 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2209 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2210 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2211
2212 break;
2213 }
2214 case LYNQ_WIFI_AUTH_WPA3_PSK:
2215 {
qs.xiong3e506812023-04-06 11:08:48 +08002216 sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
qs.xiongc8d92a62023-03-29 17:36:14 +08002217 sprintf(lynq_ket_mgmt_cmd,"SET_NETWORk %d key_mgmt SAE",net_no);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002218 sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
2219 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
2220
qs.xiong3e506812023-04-06 11:08:48 +08002221 DO_OK_FAIL_REQUEST(lynq_auth_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002222 DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
2223 DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
2224 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
2225
2226 break;
2227 }
2228 default:
2229 return -1;
you.chen35020192022-05-06 11:30:57 +08002230 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002231
qs.xiong9fbf74e2023-03-28 13:38:22 +08002232 return 0;
qs.xiong1af5daf2022-03-14 09:12:12 -04002233}
qs.xiong7a105ce2022-03-02 09:43:11 -05002234
you.chen35020192022-05-06 11:30:57 +08002235static int inner_get_curr_net_no(int interface) {
2236 curr_status_info curr_state;
2237 curr_state.ap = NULL;
2238 curr_state.state = NULL;
2239
qs.xiong9fbf74e2023-03-28 13:38:22 +08002240 if (0 != inner_get_status_info(interface, &curr_state))
2241 {
you.chen35020192022-05-06 11:30:57 +08002242 return -1;
2243 }
2244
2245 return curr_state.net_no;
2246}
2247
2248int lynq_wifi_get_sta_auth(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
qs.xiong7a105ce2022-03-02 09:43:11 -05002249{
you.chen35020192022-05-06 11:30:57 +08002250 int net_no;
2251 CHECK_IDX(idx, CTRL_STA);
qs.xiongf1b525b2022-03-31 00:58:23 -04002252
you.chen35020192022-05-06 11:30:57 +08002253 net_no = inner_get_curr_net_no(CTRL_STA);
qs.xiong7a105ce2022-03-02 09:43:11 -05002254
qs.xiong9fbf74e2023-03-28 13:38:22 +08002255 if (net_no < 0)
2256 {
you.chen35020192022-05-06 11:30:57 +08002257 return -1;
2258 }
2259
2260 return inner_get_network_auth(CTRL_STA, net_no, auth);
qs.xiong7a105ce2022-03-02 09:43:11 -05002261}
2262
you.chen35020192022-05-06 11:30:57 +08002263int 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 -05002264{
you.chen35020192022-05-06 11:30:57 +08002265 int count, net_no, index;
2266 int net_no_list[128];
2267 lynq_wifi_auth_s net_auth;
qs.xiongf1b525b2022-03-31 00:58:23 -04002268
qs.xiong9fbf74e2023-03-28 13:38:22 +08002269 if (ssid == NULL || *ssid == '\0')
2270 {
2271 RLOGE("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002272 return -1;
2273 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002274
qs.xiong9fbf74e2023-03-28 13:38:22 +08002275 if (LYNQ_WIFI_AUTH_OPEN != auth)
2276 {
2277 if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
2278 {
2279 RLOGE("bad password\n");
you.chen35020192022-05-06 11:30:57 +08002280 return -1;
2281 }
2282 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002283
you.chen35020192022-05-06 11:30:57 +08002284 CHECK_IDX(idx, CTRL_STA);
2285
2286 net_no = -1;
2287 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2288
qs.xiong9fbf74e2023-03-28 13:38:22 +08002289 for (index=0; index < count; index++)
2290 {
you.chen35020192022-05-06 11:30:57 +08002291 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002292 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2293 {
you.chen35020192022-05-06 11:30:57 +08002294 net_no = net_no_list[index];
2295 break;
2296 }
2297 }
2298
qs.xiong9fbf74e2023-03-28 13:38:22 +08002299 if (net_no < 0)
2300 {
you.chen35020192022-05-06 11:30:57 +08002301 net_no = lynq_add_network(CTRL_STA);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002302 if (net_no == -1)
2303 {
you.chen35020192022-05-06 11:30:57 +08002304 return -1;
2305 }
2306
qs.xiong9fbf74e2023-03-28 13:38:22 +08002307 RLOGD("net no is %d\n", net_no);
2308 if (0 != inner_set_sta_ssid(net_no, ssid))
2309 {
you.chen35020192022-05-06 11:30:57 +08002310 return -1;
2311 }
2312 }
2313
qs.xiong9fbf74e2023-03-28 13:38:22 +08002314 if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
2315 {
you.chen35020192022-05-06 11:30:57 +08002316 return -1;
2317 }
2318
2319 return inner_sta_start_stop(net_no, 1, 1);
qs.xiong7a105ce2022-03-02 09:43:11 -05002320}
2321
you.chen35020192022-05-06 11:30:57 +08002322int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
qs.xiong7a105ce2022-03-02 09:43:11 -05002323{
you.chen35020192022-05-06 11:30:57 +08002324 ap_info_s ap;
2325 curr_status_info curr_state;
2326 ap.ap_ssid[0] = '\0';
qs.xiong97fa59b2022-04-07 05:41:29 -04002327
qs.xiong9fbf74e2023-03-28 13:38:22 +08002328 if (ssid == NULL || *ssid == '\0')
2329 {
2330 RLOGE("input ssid is NULL\n");
you.chen35020192022-05-06 11:30:57 +08002331 return -1;
2332 }
qs.xiong7a105ce2022-03-02 09:43:11 -05002333
you.chen35020192022-05-06 11:30:57 +08002334 CHECK_IDX(idx, CTRL_STA);
qs.xiong97fa59b2022-04-07 05:41:29 -04002335
you.chen35020192022-05-06 11:30:57 +08002336 curr_state.ap = &ap;
you.chenb4b121c2022-05-06 17:50:16 +08002337 curr_state.state = NULL;
2338
qs.xiong9fbf74e2023-03-28 13:38:22 +08002339 if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
2340 {
you.chen35020192022-05-06 11:30:57 +08002341 return 0;
2342 }
qs.xiong1af5daf2022-03-14 09:12:12 -04002343
qs.xiong9fbf74e2023-03-28 13:38:22 +08002344 if (strcmp(ap.ap_ssid, ssid) != 0)
2345 {
you.chen35020192022-05-06 11:30:57 +08002346 return 0;
2347 }
2348
2349 return inner_sta_start_stop(curr_state.net_no, 0, 0);
qs.xiong7a105ce2022-03-02 09:43:11 -05002350}
qs.xiong97fa59b2022-04-07 05:41:29 -04002351
you.chena6cd55a2022-05-08 12:20:18 +08002352int lynq_wifi_sta_start(lynq_wifi_index_e idx)
2353{
qs.xiongad2f89d2023-01-18 13:17:41 +08002354// const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
2355// const char *lynq_reconnect_cmd = "RECONNECT";
2356 const char *lynq_enable_sta_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 enable_net all";
2357 const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
2358// 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 -05002359
you.chen35020192022-05-06 11:30:57 +08002360 CHECK_IDX(idx, CTRL_STA);
you.chena6cd55a2022-05-08 12:20:18 +08002361 CHECK_WPA_CTRL(CTRL_STA);
2362
2363 system("connmanctl enable wifi");
2364
qs.xiongad2f89d2023-01-18 13:17:41 +08002365 if (system("ifconfig | grep -q wlan0") != 0)
2366 {
you.chen35020192022-05-06 11:30:57 +08002367 return -1;
2368 }
qs.xiong9c99fa92022-03-15 08:03:26 -04002369
qs.xiongad2f89d2023-01-18 13:17:41 +08002370// DO_OK_FAIL_REQUEST(cmd_remove_all);
2371// system(lynq_first_sta_cmd);
2372// system(lynq_reconfigure_cmd);
2373// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
2374 system(lynq_enable_sta_cmd);
2375 system(lynq_reconnect_cmd);
2376// DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002377 return 0;
qs.xiong7a105ce2022-03-02 09:43:11 -05002378}
2379
you.chen35020192022-05-06 11:30:57 +08002380int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
qs.xiong97fa59b2022-04-07 05:41:29 -04002381{
qs.xiongad2f89d2023-01-18 13:17:41 +08002382// char lynq_disable_network_cmd[MAX_CMD];
2383// curr_status_info curr_state;
2384// ap_info_s ap_info;
you.chen35020192022-05-06 11:30:57 +08002385
qs.xiongad2f89d2023-01-18 13:17:41 +08002386 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 +08002387 CHECK_IDX(idx, CTRL_STA);
2388 CHECK_WPA_CTRL(CTRL_STA);
2389
qs.xiongad2f89d2023-01-18 13:17:41 +08002390// curr_state.ap = &ap_info;
2391// curr_state.state = NULL;
you.chena6cd55a2022-05-08 12:20:18 +08002392
qs.xiongad2f89d2023-01-18 13:17:41 +08002393// if (0 != inner_get_status_info(CTRL_STA, &curr_state) || curr_state.net_no < 0) {
2394// return 0;
2395// }
you.chena6cd55a2022-05-08 12:20:18 +08002396
qs.xiongad2f89d2023-01-18 13:17:41 +08002397// sprintf(lynq_disable_network_cmd, "DISABLE_NETWORK %d", curr_state.net_no);
2398// DO_OK_FAIL_REQUEST(lynq_disable_network_cmd);
2399 system(lynq_disable_sta_cmd);
you.chena6cd55a2022-05-08 12:20:18 +08002400 DO_OK_FAIL_REQUEST(cmd_save_config);
2401
2402 return 0;
2403// return system("connmanctl disable wifi");
qs.xiongf1b525b2022-03-31 00:58:23 -04002404}
qs.xiong7a105ce2022-03-02 09:43:11 -05002405
you.chen35020192022-05-06 11:30:57 +08002406//static int inner_get_sta_info(lynq_wifi_index_e idx, const char * bssid, device_info_s *dev) {
2407// int i, count;
2408// char *p;
2409// const char * FLAG_SSID = "ssid=";
2410// const char * FLAG_SBSID = "bssid=";
2411// const char * FLAG_KEY_MGMT = "key_mgmt=";
2412// const char * FLAG_FREQ = "freq=";
2413// char lynq_sta_cmd[MAX_CMD];
2414// char *split_lines[128] = {0};
2415
2416// CHECK_WPA_CTRL(CTRL_AP);
2417
2418// sprintf(lynq_sta_cmd, "STA %s", bssid);
2419
2420// DO_REQUEST(lynq_sta_cmd);
2421
2422// count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2423
2424// for(i=0; i < count; i++) {
2425// p = strstr(split_lines[i], FLAG_SSID);
2426// if (p != NULL) {
2427// strcpy(ap->ap_ssid, p + strlen(FLAG_SSID));
2428// continue;
2429// }
2430// }
2431
2432// lynq_get_interface_ip(idx, ap->ap_ip);
2433// lynq_ap_password_set(idx, ap->psw);
2434
2435// return 0;
2436//}
2437
2438static int inner_get_status_info_ap (int interface, ap_info_s *ap) {
2439 curr_status_info curr_state;
2440 curr_state.ap = ap;
2441 curr_state.state = NULL;
2442 return inner_get_status_info(interface, &curr_state);
2443}
2444
2445int 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 -04002446{
you.chend2fef3f2023-02-13 10:50:35 +08002447 int index, line_count;
2448 device_info_s *dev_info;
you.chen35020192022-05-06 11:30:57 +08002449 const char *lynq_first_sta_cmd = "STA-FIRST";
2450 char lynq_next_sta_cmd[MAX_CMD];
2451 char *bssid[1024] = {0};
you.chen35020192022-05-06 11:30:57 +08002452 char *split_lines[128] = {0};
qs.xiong97fa59b2022-04-07 05:41:29 -04002453
you.chen35020192022-05-06 11:30:57 +08002454 CHECK_IDX(idx, CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002455
you.chen35020192022-05-06 11:30:57 +08002456 CHECK_WPA_CTRL(CTRL_AP);
qs.xiong97fa59b2022-04-07 05:41:29 -04002457
you.chen35020192022-05-06 11:30:57 +08002458// ap_info_s * tmp_ap;
2459// device_info_s * tmp_list;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002460 if (ap == NULL || list == NULL || len == NULL)
2461 {
2462 RLOGE("bad input param");
you.chen35020192022-05-06 11:30:57 +08002463 return -1;
2464 }
2465
2466// ap = &tmp_ap;
2467// list = &tmp_list;
2468 *ap = malloc(sizeof (ap_info_s));
2469
qs.xiong9fbf74e2023-03-28 13:38:22 +08002470 if (inner_get_status_info_ap (CTRL_AP, *ap) != 0)
2471 {
2472 RLOGE("inner_get_status_info_ap !=0\n");
you.chen35020192022-05-06 11:30:57 +08002473 return -1;
2474 }
2475
2476 lynq_get_interface_ip(idx, (*ap)->ap_ip);
2477 lynq_ap_password_get(idx, (*ap)->psw);
2478
you.chen35020192022-05-06 11:30:57 +08002479 DO_REQUEST(lynq_first_sta_cmd);
2480
2481 index = 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002482 while (reply_len > 0)
2483 {
2484 if (memcmp(cmd_reply, "FAIL", 4) == 0)
2485 {
you.chen35020192022-05-06 11:30:57 +08002486 break;
2487 }
2488 line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2489 bssid[index] = malloc(strlen(split_lines[0]) + 1);
2490 strcpy(bssid[index], split_lines[0]);
2491 index++;
2492 sprintf(lynq_next_sta_cmd, "STA-NEXT %s", split_lines[0]);
2493 reply_len = MAX_RET;
2494 cmd_reply[0] = '\0';
you.chend2fef3f2023-02-13 10:50:35 +08002495 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 +08002496 if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
2497 {
2498 RLOGD("run %s fail \n", lynq_next_sta_cmd);
you.chen35020192022-05-06 11:30:57 +08002499 break;
2500 }
2501 }
2502
2503 *len = index;
2504
2505 *list = malloc(sizeof(device_info_s) * (*len));
qs.xiong9fbf74e2023-03-28 13:38:22 +08002506 for (index=0; index < *len; index++)
2507 {
you.chend2fef3f2023-02-13 10:50:35 +08002508 dev_info = &(*list)[index];
2509 memset(dev_info, 0, sizeof(device_info_s));
2510 strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
2511 inner_get_ip_by_mac(dev_info->sta_mac, dev_info->sta_ip, sizeof (dev_info->sta_ip));
2512 inner_get_hostname_by_ip(dev_info->sta_ip, dev_info->hostname);
2513 dev_info->status = LYNQ_WIFI_STATUS_CONNECT;
you.chen35020192022-05-06 11:30:57 +08002514 free(bssid[index]);
2515 }
2516
2517 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002518}
2519
you.chen35020192022-05-06 11:30:57 +08002520int lynq_get_scan_list(lynq_wifi_index_e idx, scan_info_s ** list,int * len)
qs.xiong97fa59b2022-04-07 05:41:29 -04002521{
you.chen35020192022-05-06 11:30:57 +08002522 int i, count, index, count_words;
2523 const char *lynq_scan_result_cmd = "SCAN_RESULTS";
2524 char *split_lines[128] = {0};
2525 char *split_words[128] = {0};
2526 scan_info_s * p;
qs.xiong97fa59b2022-04-07 05:41:29 -04002527
qs.xiong9fbf74e2023-03-28 13:38:22 +08002528 if (list == NULL || len == NULL)
2529 {
you.chen35020192022-05-06 11:30:57 +08002530 return -1;
2531 }
qs.xiong97fa59b2022-04-07 05:41:29 -04002532
you.chen9ac66392022-08-06 17:01:16 +08002533 for (i =0; i < 50 && g_sta_scan_finish_flag == 0; i++)
2534 {
2535 usleep(100 * 1000);
2536 }
2537
you.chen35020192022-05-06 11:30:57 +08002538 CHECK_IDX(idx, CTRL_STA);
2539
2540 CHECK_WPA_CTRL(CTRL_STA);
2541
2542 DO_REQUEST(lynq_scan_result_cmd);
2543
2544 count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
2545 *len = count - 1;
2546 *list = malloc(sizeof (scan_info_s) * *len);
2547
2548 count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
qs.xiong9fbf74e2023-03-28 13:38:22 +08002549 for (index=0; index <count_words; index++)
2550 {
2551 RLOGD("----header: %s\n", split_words[index]);
you.chen35020192022-05-06 11:30:57 +08002552 }
2553
qs.xiong9fbf74e2023-03-28 13:38:22 +08002554 for(index = 1;index < count; index++)
2555 {
2556 RLOGD("---- %s\n",split_lines[index]);
you.chen35020192022-05-06 11:30:57 +08002557 count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
2558 if (count_words < 4)
2559 continue;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002560 RLOGD("count: %d, %s\n", count_words, split_words[0]);
you.chen35020192022-05-06 11:30:57 +08002561 //bssid / frequency / signal level / flags / ssid
2562 p = (*list) + index - 1;
2563 strcpy(p->mac, split_words[0]);
2564 p->band = convert_band_from_freq(atoi(split_words[1]));
2565 p->rssi = -1 * atoi( split_words[2]);
2566 p->auth = convert_max_auth_from_flag(split_words[3]);
you.chend2fef3f2023-02-13 10:50:35 +08002567 inner_copy_ssid(p->ssid, split_words[4], sizeof (p->ssid));
you.chen35020192022-05-06 11:30:57 +08002568 }
2569
2570 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04002571}
qs.xiong97fa59b2022-04-07 05:41:29 -04002572
you.chen35020192022-05-06 11:30:57 +08002573int lynq_sta_forget_ap(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth)
2574{
2575 int count, net_no, index;
2576 int net_no_list[128];
2577 lynq_wifi_auth_s net_auth;
2578 char lynq_remove_cmd[MAX_CMD];
2579
qs.xiong9fbf74e2023-03-28 13:38:22 +08002580 if (ssid == NULL || *ssid == '\0')
2581 {
2582 RLOGD("bad ssid\n");
you.chen35020192022-05-06 11:30:57 +08002583 return -1;
2584 }
2585
2586 CHECK_IDX(idx, CTRL_STA);
2587
2588 CHECK_WPA_CTRL(CTRL_STA);
2589
2590 net_no = -1;
2591 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
2592
qs.xiong9fbf74e2023-03-28 13:38:22 +08002593 for (index=0; index < count; index++)
2594 {
you.chen35020192022-05-06 11:30:57 +08002595 net_auth = -1;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002596 if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
2597 {
you.chen35020192022-05-06 11:30:57 +08002598 net_no = net_no_list[index];
2599 break;
2600 }
2601 }
2602
qs.xiong9fbf74e2023-03-28 13:38:22 +08002603 if (net_no < 0)
2604 {
you.chen35020192022-05-06 11:30:57 +08002605 return 0;
2606 }
2607
2608 sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
2609
2610 DO_OK_FAIL_REQUEST(lynq_remove_cmd);
2611 DO_OK_FAIL_REQUEST(cmd_save_config);
2612
2613 return 0;
2614}
2615
2616int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002617{
you.chend2fef3f2023-02-13 10:50:35 +08002618 int count, index;
you.chen35020192022-05-06 11:30:57 +08002619 int net_no_list[128];
2620 char freq[16];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002621 RLOGD("enter lynq_get_sta_saved_ap api\n");
2622 if (list == NULL || len == NULL)
2623 {
2624 RLOGE("bad param,please check!");
you.chen35020192022-05-06 11:30:57 +08002625 return -1;
2626 }
2627
2628 CHECK_IDX(idx, CTRL_STA);
2629
2630// CHECK_WPA_CTRL(CTRL_STA);
2631
2632 count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002633 RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
you.chen35020192022-05-06 11:30:57 +08002634
2635 *list = malloc(sizeof (saved_ap_info_s) * count);
you.chen755332b2022-08-06 16:59:10 +08002636 memset(*list, 0, sizeof (saved_ap_info_s) * count);
you.chen35020192022-05-06 11:30:57 +08002637 *len = count;
2638
qs.xiong9fbf74e2023-03-28 13:38:22 +08002639 for (index=0; index < count; index++)
2640 {
2641 RLOGD("[lynq_get_sta_saved_ap]to get ssid %d", index);
2642 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get ssid");
you.chen35020192022-05-06 11:30:57 +08002643 inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002644 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get mac");
you.chen35020192022-05-06 11:30:57 +08002645 inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002646 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get auth");
you.chen35020192022-05-06 11:30:57 +08002647 inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002648 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get band");
2649 if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
2650 {
you.chen35020192022-05-06 11:30:57 +08002651 (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
2652 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002653 else
2654 {
you.chen35020192022-05-06 11:30:57 +08002655 (*list)[index].base_info.band = -1;
2656 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002657 RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
you.chen755332b2022-08-06 16:59:10 +08002658 lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
you.chen35020192022-05-06 11:30:57 +08002659 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002660 RLOGD("[lynq_get_sta_saved_ap] return ok");
you.chen35020192022-05-06 11:30:57 +08002661 return 0;
2662}
2663
2664int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
2665{
qs.xiongc8d92a62023-03-29 17:36:14 +08002666 const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
you.chen35020192022-05-06 11:30:57 +08002667 const char *lynq_scan_cmd = "SCAN";
2668
2669 CHECK_IDX(idx, CTRL_STA);
2670
2671 CHECK_WPA_CTRL(CTRL_STA);
2672
qs.xiongc8d92a62023-03-29 17:36:14 +08002673 system(clean_last_re);
you.chen9ac66392022-08-06 17:01:16 +08002674 g_sta_scan_finish_flag = 0;
qs.xiongb3f26af2023-02-17 18:41:07 +08002675 DO_REQUEST(lynq_scan_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002676 if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
2677 {
qs.xiongb3f26af2023-02-17 18:41:07 +08002678 return 0;
qs.xiong9fbf74e2023-03-28 13:38:22 +08002679 } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
2680 {
qs.xiongb3f26af2023-02-17 18:41:07 +08002681 g_sta_scan_finish_flag = 1;
2682 return -1;
2683 }
you.chen35020192022-05-06 11:30:57 +08002684
2685 return 0;
2686}
2687
2688int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002689 if (cb == NULL)
2690 {
2691 RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08002692 return -1;
2693 }
2694
2695 g_ap_callback_priv = priv;
2696 g_ap_callback_func = cb;
2697
2698 return 0;
2699}
2700
2701int lynq_unreg_ap_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002702 if (g_ap_callback_priv == priv)
2703 {
you.chen35020192022-05-06 11:30:57 +08002704 g_ap_callback_func = NULL;
2705 g_ap_callback_priv = NULL;
2706 return 0;
2707 }
2708 return -1;
2709}
2710
2711int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
qs.xiong9fbf74e2023-03-28 13:38:22 +08002712 if (cb == NULL)
2713 {
2714 RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
you.chen35020192022-05-06 11:30:57 +08002715 return -1;
2716 }
2717
2718 g_sta_callback_priv = priv;
2719 g_sta_callback_func = cb;
2720
2721 return 0;
2722}
2723
2724int lynq_unreg_sta_event_callback(void * priv) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002725 if (g_sta_callback_priv == priv)
2726 {
you.chen35020192022-05-06 11:30:57 +08002727 g_sta_callback_func = NULL;
2728 g_sta_callback_priv = NULL;
2729 return 0;
2730 }
2731 return -1;
2732}
2733
2734
2735static int inner_get_status_info_state (int interface, char *state) {
2736 curr_status_info curr_state;
2737 curr_state.ap = NULL;
2738 curr_state.state = state;
2739 return inner_get_status_info(interface, &curr_state);
2740}
2741
2742int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
2743{
2744 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002745 RLOGD("enter lynq_get_ap_status\n");
you.chen35020192022-05-06 11:30:57 +08002746 CHECK_IDX(idx, CTRL_AP);
2747
qs.xiong9fbf74e2023-03-28 13:38:22 +08002748 if (inner_get_status_info_state(CTRL_AP, state) != 0)
2749 {
you.chen35020192022-05-06 11:30:57 +08002750 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
2751 return 0;
2752 }
2753
qs.xiong9fbf74e2023-03-28 13:38:22 +08002754 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
2755 {
you.chen35020192022-05-06 11:30:57 +08002756 *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
2757 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002758 else
2759 {
you.chen35020192022-05-06 11:30:57 +08002760 *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
2761 }
2762
2763 return 0;
2764}
2765
2766int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
2767 char state[MAX_CMD];
qs.xiong9fbf74e2023-03-28 13:38:22 +08002768 RLOGD("enter lynq_get_sta_status\n");
you.chen35020192022-05-06 11:30:57 +08002769 CHECK_IDX(idx, CTRL_STA);
2770
qs.xiong9fbf74e2023-03-28 13:38:22 +08002771 if (inner_get_status_info_state(CTRL_STA, state) != 0)
2772 {
you.chen35020192022-05-06 11:30:57 +08002773 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
2774 return 0;
2775 }
2776
qs.xiong9fbf74e2023-03-28 13:38:22 +08002777 if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
2778 {
you.chen35020192022-05-06 11:30:57 +08002779 *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
2780 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002781 else
2782 {
you.chen35020192022-05-06 11:30:57 +08002783 *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
2784 }
2785
2786 return 0;
2787}
2788
2789int lynq_get_country_code(lynq_wifi_index_e idx, char * country_code) {
2790// CHECK_IDX(idx, CTRL_AP);
2791// int ret = 0;
2792// size_t reply_len = MAX_RET;
2793// char cmd_reply[MAX_RET]={0};
2794// const char * cmd_str = "GET country";
2795// struct wpa_ctrl *s_lynq_wpa_ctrl = NULL;
2796// do{
2797// if (NULL == s_lynq_wpa_ctrl) {
2798// s_lynq_wpa_ctrl = wpa_ctrl_open("/var/run/wpa_wlan0_cmd");
2799// if (NULL == s_lynq_wpa_ctrl ) {
2800// printf("wpa_ctrl_open fail\n");
2801// return -1;
2802// }
2803// }
2804// }while(0);
2805
2806// do {
2807// reply_len = MAX_RET;
2808// cmd_reply[0] = '\0';
2809// printf("to call [%s]\n", cmd_str);
you.chend2fef3f2023-02-13 10:50:35 +08002810// 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 +08002811// if (ret != 0) {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002812// RLOGE("call ##cmd_str fail %d\n", ret);
you.chen35020192022-05-06 11:30:57 +08002813// return ret;
2814// }
2815// cmd_reply[reply_len+1] = '\0';
qs.xiong9fbf74e2023-03-28 13:38:22 +08002816// RLOGD("cmd replay [ %s ]\n", cmd_reply);
you.chen35020192022-05-06 11:30:57 +08002817// }while(0);
2818
2819 FILE *fp;
2820 size_t i = 0;
2821 char lynq_cmd_ret[MAX_RET]={0};
2822
2823// CHECK_IDX(idx, CTRL_AP);
2824
2825 if((fp=popen("wl country","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08002826 {
2827 perror("popen error!");
2828 return -1;
2829 }
you.chen35020192022-05-06 11:30:57 +08002830 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
2831 {
2832 perror("fread fail!");
2833 return -1;
2834 }
2835
qs.xiong9fbf74e2023-03-28 13:38:22 +08002836 for(i=0; i < strlen(lynq_cmd_ret); i++)
2837 {
2838 if (lynq_cmd_ret[i] == ' ')
2839 {
you.chen35020192022-05-06 11:30:57 +08002840 lynq_cmd_ret[i] = '\0';
2841 break;
2842 }
2843 }
2844
2845 strcpy(country_code,lynq_cmd_ret);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002846 RLOGD("---country code %s\n", country_code);
you.chen35020192022-05-06 11:30:57 +08002847
2848 int ret=pclose(fp);
2849 if(ret==-1)
2850 {
2851 perror("close file faild");
2852 }
2853
2854 return 0;
2855}
2856
2857int lynq_set_country_code(lynq_wifi_index_e idx, char * country_code) {
2858// const char * cmd_str = "GET country";
2859// CHECK_IDX(idx, CTRL_AP);
2860// CHECK_WPA_CTRL(CTRL_STA);
2861
2862// DO_REQUEST(cmd_str);
2863// printf("result %s\n", cmd_reply);
2864
qs.xiong9fbf74e2023-03-28 13:38:22 +08002865 if (country_code == NULL || *country_code == '\0')
2866 {
2867 RLOGD("bad country code\n");
you.chen35020192022-05-06 11:30:57 +08002868 return -1;
2869 }
2870
2871 char lynq_country_cmd[MAX_CMD];
2872 sprintf(lynq_country_cmd, "wl country %s", country_code);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002873 if (system(lynq_country_cmd) == 0)
2874 {
you.chen35020192022-05-06 11:30:57 +08002875 return 0;
2876 }
2877
2878 return -1;
2879}
2880
2881int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
2882{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002883 RLOGD("enter lynq_get_connect_ap_mac\n");
2884 if (mac == NULL)
2885 {
2886 RLOGE("input ptr is NULL,please check\n");
you.chen35020192022-05-06 11:30:57 +08002887 return -1;
2888 }
2889
2890 CHECK_IDX(idx, CTRL_STA);
2891 ap_info_s ap;
2892 ap.ap_mac[0] = '\0';
2893
qs.xiong9fbf74e2023-03-28 13:38:22 +08002894 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
2895 {
you.chen35020192022-05-06 11:30:57 +08002896 return -1;
2897 }
2898 strcpy(mac, ap.ap_mac);
2899
2900 return 0;
2901}
2902
2903int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
2904{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002905 RLOGD("enter lynq_get_interface_ip\n");
you.chen9ac66392022-08-06 17:01:16 +08002906 struct ifaddrs *ifaddr_header, *ifaddr;
2907 struct in_addr * ifa;
2908 const char * ifaName = "wlan0";
2909 if (ip == NULL)
2910 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08002911 RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
you.chenf58b3c92022-06-21 16:53:48 +08002912 return -1;
you.chen9ac66392022-08-06 17:01:16 +08002913 }
you.chenf58b3c92022-06-21 16:53:48 +08002914
qs.xiong9fbf74e2023-03-28 13:38:22 +08002915 if (idx == 1)
2916 {
you.chen6c2dd9c2022-05-16 17:55:28 +08002917 ifaName = "tether";
you.chen9ac66392022-08-06 17:01:16 +08002918 }
qs.xiong9fbf74e2023-03-28 13:38:22 +08002919 else if (idx != 0)
2920 {
you.chen35020192022-05-06 11:30:57 +08002921 return -1;
you.chen9ac66392022-08-06 17:01:16 +08002922 }
you.chen35020192022-05-06 11:30:57 +08002923
you.chen9ac66392022-08-06 17:01:16 +08002924 if (getifaddrs(&ifaddr_header) == -1)
2925 {
you.chen35020192022-05-06 11:30:57 +08002926 perror("getifaddrs");
2927 return -1;
2928 //exit(EXIT_FAILURE);
you.chen9ac66392022-08-06 17:01:16 +08002929 }
you.chen35020192022-05-06 11:30:57 +08002930
2931
you.chen9ac66392022-08-06 17:01:16 +08002932 for (ifaddr = ifaddr_header; ifaddr != NULL; ifaddr = ifaddr->ifa_next)
2933 {
2934 if (ifaddr->ifa_addr == NULL)
you.chen35020192022-05-06 11:30:57 +08002935 continue;
you.chen9ac66392022-08-06 17:01:16 +08002936 if((strcmp(ifaddr->ifa_name,ifaName)==0))
2937 {
2938 if (ifaddr->ifa_addr->sa_family==AF_INET) // check it is IP4
2939 {
2940 // is a valid IP4 Address
2941 ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
2942 inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002943 RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
you.chen9ac66392022-08-06 17:01:16 +08002944 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002945 RLOGD("ip %s\n", ip);
you.chen9ac66392022-08-06 17:01:16 +08002946 return 0;
2947 }
2948 }
2949 }
qs.xiongc4f007c2023-02-08 18:16:58 +08002950 freeifaddrs(ifaddr_header);
qs.xiong9fbf74e2023-03-28 13:38:22 +08002951 RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
you.chen9ac66392022-08-06 17:01:16 +08002952 return -1;
you.chen35020192022-05-06 11:30:57 +08002953}
2954
2955int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
2956{
qs.xiong9fbf74e2023-03-28 13:38:22 +08002957 RLOGD("enter lynq_get_interface_mac\n");
you.chen35020192022-05-06 11:30:57 +08002958 int count;
2959 size_t i;
2960 char *split_words[128] = {0};
2961 const char *lynq_get_mac_cmd = "DRIVER MACADDR";
2962
2963 CHECK_WPA_CTRL(idx);
2964
2965 DO_REQUEST(lynq_get_mac_cmd);
2966
qs.xiong9fbf74e2023-03-28 13:38:22 +08002967 if (memcmp(cmd_reply, "FAIL", 4) == 0)
2968 {
2969 RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
you.chen35020192022-05-06 11:30:57 +08002970 return -1;
2971 }
2972
2973 count = lynq_split(cmd_reply, reply_len, '=', split_words);
2974
qs.xiong9fbf74e2023-03-28 13:38:22 +08002975 if (count < 2)
2976 {
you.chen35020192022-05-06 11:30:57 +08002977 return -1;
2978 }
2979
qs.xiong9fbf74e2023-03-28 13:38:22 +08002980 for (i=0; i < strlen(split_words[1]); i++ )
2981 {
2982 if (split_words[1][i] != ' ')
2983 {
you.chen35020192022-05-06 11:30:57 +08002984 break;
2985 }
2986 }
2987
2988 strcpy(mac, split_words[1] + i);
2989
2990 return 0;
2991}
2992
2993int lynq_get_connect_ap_rssi(lynq_wifi_index_e idx,int * rssi)
2994{
2995// int count;
2996// char *split_words[128] = {0};
2997// const char *lynq_get_rssi_cmd = "DRIVER RSSI";
2998
2999// if (rssi == NULL) {
3000// return -1;
3001// }
3002
3003// CHECK_IDX(idx, CTRL_STA);
3004
3005// CHECK_WPA_CTRL(CTRL_STA);
3006
3007// DO_REQUEST(lynq_get_rssi_cmd);
3008
3009// if (memcmp(cmd_reply, "FAIL", 4) == 0) {
3010// return -1;
3011// }
3012
3013// count = lynq_split(cmd_reply, reply_len, ' ', split_words);
3014
3015// if (count < 2) {
3016// return -1;
3017// }
3018
3019// *rssi = atoi(split_words[1]) * -1;
3020
3021 FILE *fp;
3022 size_t i = 0;
3023 char lynq_cmd_ret[MAX_RET]={0};
3024
3025// CHECK_IDX(idx, CTRL_AP);
qs.xiongff0ae0f2022-10-11 15:47:14 +08003026/*******change other cmd to get rssi*******
3027 *
3028 *wl rssi ---> wl -i wlan0 rssi
3029 *
3030 ***** change by qs.xiong 20221011*******/
3031 if((fp=popen("wl -i wlan0 rssi","r"))==NULL)
qs.xiong9fbf74e2023-03-28 13:38:22 +08003032 {
3033 perror("popen error!");
3034 return -1;
3035 }
you.chen35020192022-05-06 11:30:57 +08003036 if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
3037 {
3038 perror("fread fail!");
3039 return -1;
3040 }
you.chen9f17e4d2022-06-06 17:18:18 +08003041 *rssi = atoi(lynq_cmd_ret) * -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003042/****** if got rssi is 0,means sta didn't connected any device****/
3043 if(*rssi == 0)
3044 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003045 RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
3046 return -1;
qs.xiongff0ae0f2022-10-11 15:47:14 +08003047 }
you.chen35020192022-05-06 11:30:57 +08003048
3049 return 0;
3050}
3051
3052int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
3053{
qs.xiong9fbf74e2023-03-28 13:38:22 +08003054 RLOGD("enter lynq_get_connect_ap_band\n");
3055 if (band == NULL)
3056 {
you.chen35020192022-05-06 11:30:57 +08003057 return -1;
3058 }
3059
3060 CHECK_IDX(idx, CTRL_STA);
3061 ap_info_s ap;
3062 ap.band = -1;
3063
qs.xiong9fbf74e2023-03-28 13:38:22 +08003064 if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
3065 {
you.chen35020192022-05-06 11:30:57 +08003066 return -1;
3067 }
3068 *band = ap.band;
3069
3070 return 0;
qs.xiong97fa59b2022-04-07 05:41:29 -04003071}
you.chenf58b3c92022-06-21 16:53:48 +08003072
3073int lynq_get_connect_ap_ip(lynq_wifi_index_e idx, char *ip)
3074{
qs.xionge4cbf1c2023-02-28 18:22:49 +08003075 char bssid[1024] = {0};
you.chenf58b3c92022-06-21 16:53:48 +08003076
3077 if (ip == NULL)
3078 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003079 RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
you.chenf58b3c92022-06-21 16:53:48 +08003080 return -1;
3081 }
3082
3083 CHECK_IDX(idx, CTRL_STA);
3084
qs.xionge4cbf1c2023-02-28 18:22:49 +08003085 if (lynq_get_connect_ap_mac(idx, bssid) != 0)
you.chenf58b3c92022-06-21 16:53:48 +08003086 {
3087 return -1;
3088 }
qs.xionge4cbf1c2023-02-28 18:22:49 +08003089
3090 return inner_get_ip_by_mac(bssid, ip, 32); //better input by user
you.chenf58b3c92022-06-21 16:53:48 +08003091}
3092
qs.xiong026c5c72022-10-17 11:15:45 +08003093int lynq_ap_connect_num(int sta_number)
3094{
3095 char lynq_limit_cmd[32]={0};
3096 int ret;
qs.xiong9fbf74e2023-03-28 13:38:22 +08003097 if((sta_number < 1 ) && (sta_number > 15))
3098 {
3099 RLOGE("sta_number: not in range\n",sta_number);
qs.xiong026c5c72022-10-17 11:15:45 +08003100 return -1;
3101 }
3102 sprintf(lynq_limit_cmd,"wl maxassoc %d", sta_number);
3103 ret = system(lynq_limit_cmd);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003104 if(ret != 0)
3105 {
3106 RLOGE("cmd of limit ap devices number error\n");
qs.xiong026c5c72022-10-17 11:15:45 +08003107 }
3108 return 0;
3109}
you.chenf58b3c92022-06-21 16:53:48 +08003110
qs.xiong77905552022-10-17 11:19:57 +08003111int lynq_enable_acs(lynq_wifi_index_e idx,int acs_mode)
3112{
3113
3114 char lynq_wifi_acs_cmd[128]={0};
3115 char lynq_cmd_mode[128]={0};
3116 char lynq_cmd_slect[128]={0};
3117
qs.xiong9fbf74e2023-03-28 13:38:22 +08003118 if((acs_mode != 2) && (acs_mode != 5))
3119 {
qs.xiong77905552022-10-17 11:19:57 +08003120 PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
3121 }
3122
qs.xiong9fbf74e2023-03-28 13:38:22 +08003123 if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
3124 {
qs.xiong77905552022-10-17 11:19:57 +08003125 return -1;
3126 }
3127
3128 CHECK_IDX(idx, CTRL_AP);
3129
3130 CHECK_WPA_CTRL(CTRL_AP);
3131
3132 sprintf(lynq_wifi_acs_cmd,"SET_NETWORK %d frequency %d", AP_NETWORK_0, acs_mode);
3133 sprintf(lynq_cmd_mode, "SET_NETWORK %d mode 2", AP_NETWORK_0);
3134 sprintf(lynq_cmd_slect, "SELECT_NETWORK %d", AP_NETWORK_0);
3135
3136 DO_OK_FAIL_REQUEST(cmd_disconnect);
3137 DO_OK_FAIL_REQUEST(lynq_wifi_acs_cmd);
3138 DO_OK_FAIL_REQUEST(lynq_cmd_mode);
3139 DO_OK_FAIL_REQUEST(cmd_save_config);
3140 DO_OK_FAIL_REQUEST(lynq_cmd_slect);
3141
3142 return 0;
3143}
you.chen0f5c6432022-11-07 18:31:14 +08003144//you.chen add for tv-box start
3145static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len) {
3146 FILE *fp;
3147 //printf("to exec cmd:%s\n", str_cmd);
3148 if((fp=popen(str_cmd,"r"))==NULL)
3149 {
3150 perror("popen error!");
3151 return -1;
3152 }
3153 if((fread(str_cmd_ret,max_len,1,fp))<0)
3154 {
3155 perror("fread fail!");
3156 fclose(fp);
3157 return -1;
3158 }
3159 fclose(fp);
3160 return 0;
3161}
3162
3163static int get_netmask_length(const char* mask)
3164{
3165 int masklen=0, i=0;
3166 int netmask=0;
3167
3168 if(mask == NULL)
3169 {
3170 return 0;
3171 }
3172
3173 struct in_addr ip_addr;
3174 if( inet_aton(mask, &ip_addr) )
3175 {
3176 netmask = ntohl(ip_addr.s_addr);
qs.xiong9fbf74e2023-03-28 13:38:22 +08003177 }else
3178 {
you.chen0f5c6432022-11-07 18:31:14 +08003179 netmask = 0;
3180 return 0;
3181 }
3182
3183 while(0 == (netmask & 0x01) && i<32)
3184 {
3185 i++;
3186 netmask = netmask>>1;
3187 }
3188 masklen = 32-i;
3189 return masklen;
3190}
3191
3192static int get_tether_route_str(char *str_cmd_ret, size_t max_len) {
3193 int mask_len;
3194 char *p;
3195 char tmp[64] = {0};
3196 if (exec_cmd("ifconfig tether | grep Mask", str_cmd_ret, max_len) != 0)
3197 return -1;
3198 p = strstr(str_cmd_ret, "Mask:");
3199 if (p == NULL)
3200 return -1;
3201 mask_len = get_netmask_length(p + 5);
3202 if (mask_len == 0)
3203 return -1;
3204 p = strstr(str_cmd_ret, "inet addr:");
3205 if (p == NULL)
3206 return -1;
3207 strcpy(tmp, p + 10);
3208 p = strstr(tmp, " ");
3209 if (p != NULL)
3210 *p = '\0';
3211 sprintf(str_cmd_ret, "%s/%d", tmp, mask_len);
3212 return 0;
3213}
3214
3215static void GBWWatchThreadProc() {
3216 int i,n, nloop, nmax, ncheckcount, nidlecount;
3217 unsigned long long lastAP1Bytes, lastAP2Bytes, currAP1Bytes, currAP2Bytes;
3218 unsigned int lastAP1Drop,lastAP2Drop, currAP1Drop, currAP2Drop;
3219 unsigned int setAP1Speed, setAP2Speed, lastAP1Speed, lastAP2Speed, currAP1Speed, currAP2Speed,currSetAP1Speed;
3220 char *results[16] = {0};
3221 char str_cmd[256] = {0};
3222 char str_cmd_ret[128] = {0};
3223 char dest_ip[32] = {0};
3224 lastAP1Bytes = lastAP2Bytes = 0;
3225 lastAP1Drop = lastAP2Drop = 0;
3226 lastAP1Speed = lastAP2Speed = 0;
3227 setAP1Speed = 50;
3228 setAP2Speed = 80;
3229 nloop = 0;
3230 nmax = 6;
3231 ncheckcount = nidlecount = 0;
3232
qs.xiong9fbf74e2023-03-28 13:38:22 +08003233 RLOGD("------gbw thread run\n");
you.chen0f5c6432022-11-07 18:31:14 +08003234 sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
3235 while (dest_ip[0] == '\0') {
3236 sleep(1);
3237 str_cmd_ret[0] = '\0';
3238 exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret));
3239 for(n = 0; n < (int)sizeof(str_cmd_ret) && str_cmd_ret[n] != '\0'; n++) {
3240 if (str_cmd_ret[n] == '\n'){
3241 str_cmd_ret[n] = '\0';
3242 break;
3243 }
3244 }
3245 if (str_cmd_ret[0] != '\0')
3246 {
3247 strcpy(dest_ip, str_cmd_ret);
3248 }
3249 }
3250
3251 system("tc qdisc del dev tether root > /dev/null 2>&1");
3252 system("tc qdisc add dev tether root handle 1: htb r2q 1");
3253 system("tc class add dev tether parent 1: classid 1:1 htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000");
3254 if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
3255 {
qs.xiong9fbf74e2023-03-28 13:38:22 +08003256 RLOGD("not get tether info\n");
you.chen0f5c6432022-11-07 18:31:14 +08003257 return;
3258 }
3259 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);
3260 system(str_cmd);
3261 system("tc class add dev tether parent 1: classid 1:2 htb rate 80Mbit ceil 100Mbit prio 0 quantum 3000000");
3262 sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", dest_ip);
3263 //printf("----cmd:%s\n", str_cmd);
3264 system(str_cmd);
3265
3266 while (1) {
3267 sleep(1);
3268 memset(str_cmd, 0, sizeof(str_cmd));
3269 if (0 != exec_cmd("tc -s class show dev tether classid 1:1 | grep Sent", str_cmd, sizeof (str_cmd)))
3270 continue;
3271 //printf("ap1 --- %s\n", str_cmd);
3272 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3273 if (n > 9) {
3274 if (strcmp(results[1], "Sent") == 0) {
3275 currAP1Bytes = atoll(results[2]);
3276 }
3277 if (strcmp(results[6], "(dropped") == 0) {
3278 currAP1Drop = atoi(results[7]);
3279 }
3280 }
3281
3282 memset(str_cmd, 0, sizeof(str_cmd));
3283 if (0 != exec_cmd("tc -s class show dev tether classid 1:2 | grep Sent", str_cmd, sizeof (str_cmd)))
3284 continue;
3285 //printf("ap2 --- %s\n", str_cmd);
3286 n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
3287 if (n > 9) {
3288 if (strcmp(results[1], "Sent") == 0) {
3289 currAP2Bytes = atoll(results[2]);
3290 }
3291 if (strcmp(results[6], "(dropped") == 0) {
3292 currAP2Drop = atoi(results[7]);
3293 }
3294 }
3295
3296 //printf("ap1 %llu- %u, ap2 %llu-%u\n", currAP1Bytes, currAP1Drop, currAP2Bytes, currAP2Drop);
3297 if (currAP1Bytes < lastAP1Bytes || currAP2Bytes < lastAP2Bytes) {
3298 lastAP1Bytes = currAP1Bytes;
3299 lastAP2Bytes = currAP2Bytes;
3300 continue;
3301 }
3302
3303 currAP1Speed = (currAP1Bytes - lastAP1Bytes) / 128 / 1024;
3304 currAP2Speed = (currAP2Bytes - lastAP2Bytes) / 128 / 1024;
3305 //printf("ap1 speed %d mb, ap2 speed %d mb\n", currAP1Speed, currAP2Speed);
3306 lastAP1Speed = currAP1Speed;
3307 lastAP2Speed = currAP2Speed;
3308 lastAP1Bytes = currAP1Bytes;
3309 lastAP2Bytes = currAP2Bytes;
3310
3311 currSetAP1Speed = setAP1Speed;
3312 if ((currAP2Speed < 30 && currAP2Speed > 5) && currAP1Speed > 5) {
3313 ncheckcount++;
3314 if (ncheckcount > 3) {
3315 ncheckcount = 0;
3316 currSetAP1Speed = 5;
3317 }
3318 }
3319 else {
3320 ncheckcount = 0;
3321 if (currAP1Speed < 5)
3322 nidlecount++;
3323 else
3324 nidlecount = 0;
3325
3326 }
3327
3328 if (nidlecount > 60 ){
3329 currSetAP1Speed = 50;
3330 }
3331
3332 if (currSetAP1Speed != setAP1Speed) {
3333 setAP1Speed = currSetAP1Speed;
3334 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));
3335 //printf("------***change speed: %s\n", str_cmd);
3336 system(str_cmd);
3337 }
3338 }
3339}
3340
3341int enableGBW(const char* mac) {
3342 int i,len;
3343 char get_ipaddr_cmd[128]={0};
3344 ap_info_s *ap;
3345 device_info_s * list;
3346
3347 if (mac == NULL || g_gbw_enabled == 1)
3348 return -1;
3349 len = strlen(mac);
3350 g_gbw_mac = malloc(len + 1);
3351 for(i=0;i<len;i++) {
3352 if (mac[i] >= 'A' && mac[i] <= 'Z')
3353 {
3354 g_gbw_mac[i] = 'a' + (mac[i] - 'A');
3355 }
3356 else
3357 g_gbw_mac[i] = mac[i];
3358 }
3359 g_gbw_mac[i] = '\0';
3360 g_gbw_enabled = 1;
3361
3362 sprintf(get_ipaddr_cmd, "ip neigh | grep %s", g_gbw_mac);
3363 if (system(get_ipaddr_cmd) == 0) {
3364 //startGBW();
3365 if ( 0 ==lynq_get_ap_device_list(1, &ap, &list,&len) ) {
3366 for (i=0;i<len;i++) {
3367 //printf("--mac:%s, name:%s\n",list[i].sta_mac, list[i].hostname);
3368 if (strcmp(g_gbw_mac, list[i].sta_mac) == 0)
3369 startGBW();
3370 }
3371 free(ap);
3372 free(list);
3373 }
3374 }
3375 return 0;
3376}
3377
3378int disableGBW() {
3379 stopGBW();
3380 free(g_gbw_mac);
3381 g_gbw_mac = NULL;
3382 g_gbw_enabled = 1;
3383 return 0;
3384}
3385
3386static int startGBW() {
3387 if (g_gbw_watcher_pid != 0) {
3388 stopGBW();
3389 }
3390 pthread_create(&g_gbw_watcher_pid,NULL,GBWWatchThreadProc,NULL);
3391}
3392
3393static int stopGBW() {
3394 void* retval;
3395 pthread_cancel(g_gbw_watcher_pid);
3396 pthread_join(g_gbw_watcher_pid, &retval);
3397 g_gbw_watcher_pid = 0;
3398 system("tc qdisc del dev tether root");
3399}
3400//you.chen add for tv-box end