From f2859f9501f4b3e9a285a8db5a2fe3dfaa7409f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jani=20Hirsim=C3=A4ki?= Date: Wed, 8 Sep 2021 14:45:02 +0300 Subject: [PATCH] drivers: wifi: esp_at: changes to scanning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If CONFIG_WIFI_ESP_AT_SCAN_MAC_ADDRESS: mac addr included in scanning results. if CONFIG_WIFI_ESP_AT_SCAN_PASSIVE: passive scanning is used instead of default active scanning. If CONFIG_WIFI_ESP_AT_SCAN_RESULT_RSSI_ORDERED: scanning response ordered by RSSI. Signed-off-by: Jani Hirsimäki --- drivers/wifi/esp_at/Kconfig.esp_at | 15 +++++++++++++++ drivers/wifi/esp_at/esp.c | 31 ++++++++++++++++++++++++++---- drivers/wifi/esp_at/esp.h | 22 +++++++++++++++++++++ 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/drivers/wifi/esp_at/Kconfig.esp_at b/drivers/wifi/esp_at/Kconfig.esp_at index 73cdadb4f81..ed3024cc42a 100644 --- a/drivers/wifi/esp_at/Kconfig.esp_at +++ b/drivers/wifi/esp_at/Kconfig.esp_at @@ -16,6 +16,21 @@ menuconfig WIFI_ESP_AT if WIFI_ESP_AT +config WIFI_ESP_AT_SCAN_PASSIVE + bool "Passive scan" + help + Use passive scanning. + +config WIFI_ESP_AT_SCAN_MAC_ADDRESS + bool "MAC address in scan response" + help + Get mac address in scan response. + +config WIFI_ESP_AT_SCAN_RESULT_RSSI_ORDERED + bool "Scan result ordering based on RSSI" + help + Order based on RSSI. + config WIFI_ESP_AT_RX_STACK_SIZE int "Stack size for the Espressif esp wifi driver RX thread" default 1024 diff --git a/drivers/wifi/esp_at/esp.c b/drivers/wifi/esp_at/esp.c index aeef5ab4531..b35ec8c46da 100644 --- a/drivers/wifi/esp_at/esp.c +++ b/drivers/wifi/esp_at/esp.c @@ -253,6 +253,7 @@ MODEM_CMD_DEFINE(on_cmd_cipstamac) } /* +CWLAP:(sec,ssid,rssi,channel) */ +/* with: CONFIG_WIFI_ESP_AT_SCAN_MAC_ADDRESS: +CWLAP:,,,,*/ MODEM_CMD_DEFINE(on_cmd_cwlap) { struct esp_data *dev = CONTAINER_OF(data, struct esp_data, @@ -276,7 +277,18 @@ MODEM_CMD_DEFINE(on_cmd_cwlap) memcpy(res.ssid, argv[1], i); res.ssid_length = i; res.rssi = strtol(argv[2], NULL, 10); - res.channel = strtol(argv[3], NULL, 10); + + if (IS_ENABLED(CONFIG_WIFI_ESP_AT_SCAN_MAC_ADDRESS)) { + argv[3] = str_unquote(argv[3]); + res.mac_length = WIFI_MAC_ADDR_LEN; + if (net_bytes_from_str(res.mac, sizeof(res.mac), argv[3]) < 0) { + LOG_ERR("Invalid MAC address"); + res.mac_length = 0; + } + res.channel = (argc > 4) ? strtol(argv[4], NULL, 10) : -1; + } else { + res.channel = strtol(argv[3], NULL, 10); + } if (dev->scan_cb) { dev->scan_cb(dev->net_iface, 0, &res); @@ -717,7 +729,11 @@ static void esp_mgmt_scan_work(struct k_work *work) struct esp_data *dev; int ret; static const struct modem_cmd cmds[] = { +#if defined(CONFIG_WIFI_ESP_AT_SCAN_MAC_ADDRESS) + MODEM_CMD("+CWLAP:", on_cmd_cwlap, 5U, ","), +#else MODEM_CMD("+CWLAP:", on_cmd_cwlap, 4U, ","), +#endif }; dev = CONTAINER_OF(work, struct esp_data, scan_work); @@ -726,9 +742,13 @@ static void esp_mgmt_scan_work(struct k_work *work) if (ret < 0) { goto out; } - ret = esp_cmd_send(dev, cmds, ARRAY_SIZE(cmds), "AT+CWLAP", + ret = esp_cmd_send(dev, + cmds, ARRAY_SIZE(cmds), + ESP_CMD_CWLAP, ESP_SCAN_TIMEOUT); esp_mode_flags_clear(dev, EDF_STA_LOCK); + LOG_DBG("ESP Wi-Fi scan: cmd = %s", ESP_CMD_CWLAP); + if (ret < 0) { LOG_ERR("Failed to scan: ret %d", ret); } @@ -926,8 +946,11 @@ static void esp_init_work(struct k_work *work) #endif /* enable multiple socket support */ SETUP_CMD_NOHANDLE("AT+CIPMUX=1"), - /* only need ecn,ssid,rssi,channel */ - SETUP_CMD_NOHANDLE("AT+CWLAPOPT=0,23"), + + SETUP_CMD_NOHANDLE( + ESP_CMD_CWLAPOPT(ESP_CMD_CWLAPOPT_ORDERED, ESP_CMD_CWLAPOPT_MASK)), + SETUP_CMD_NOHANDLE(ESP_CMD_CWLAP), + #if defined(CONFIG_WIFI_ESP_AT_VERSION_2_0) SETUP_CMD_NOHANDLE(ESP_CMD_CWMODE(STA)), SETUP_CMD_NOHANDLE("AT+CWAUTOCONN=0"), diff --git a/drivers/wifi/esp_at/esp.h b/drivers/wifi/esp_at/esp.h index bbdf339da0b..3a1b7315bf5 100644 --- a/drivers/wifi/esp_at/esp.h +++ b/drivers/wifi/esp_at/esp.h @@ -131,6 +131,28 @@ extern "C" { #define ESP_CMD_SET_IP(ip, gateway, mask) "AT+"_CIPSTA"=\"" \ ip "\",\"" gateway "\",\"" mask "\"" +#if defined(CONFIG_WIFI_ESP_AT_SCAN_PASSIVE) +#define ESP_CMD_CWLAP "AT+CWLAP=,,,1,," +#else +#define ESP_CMD_CWLAP "AT+CWLAP" +#endif + +#if defined(CONFIG_WIFI_ESP_AT_SCAN_RESULT_RSSI_ORDERED) +#define ESP_CMD_CWLAPOPT_ORDERED "1" +#else +#define ESP_CMD_CWLAPOPT_ORDERED "0" +#endif + +#if defined(CONFIG_WIFI_ESP_AT_SCAN_MAC_ADDRESS) +/* We need ecn,ssid,rssi,mac,channel */ +#define ESP_CMD_CWLAPOPT_MASK "31" +#else +/* no mac: only need ecn,ssid,rssi,channel */ +#define ESP_CMD_CWLAPOPT_MASK "23" +#endif + +#define ESP_CMD_CWLAPOPT(sort, mask) "AT+CWLAPOPT=" sort "," mask + extern struct esp_data esp_driver_data; enum esp_socket_flags {