Skip to content

Commit 548a0ef

Browse files
author
Jiang Jiang Jian
committed
Merge branch 'feature/add_test_for_wifi_with_external_bss_support_enabled' into 'master'
Add unit test for wifi+external bss support Closes WIFI-6387 See merge request espressif/esp-idf!30514
2 parents b88b1ce + cb7e2f1 commit 548a0ef

File tree

6 files changed

+232
-4
lines changed

6 files changed

+232
-4
lines changed

components/wpa_supplicant/test_apps/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,8 @@ list(PREPEND SDKCONFIG_DEFAULTS
66
"$ENV{IDF_PATH}/tools/test_apps/configs/sdkconfig.debug_helpers"
77
"sdkconfig.defaults")
88

9+
if($ENV{CI_PIPELINE_ID})
10+
idf_build_set_property(COMPILE_DEFINITIONS TEST_SUFFIX_STR="_$ENV{CI_PIPELINE_ID}" APPEND)
11+
endif()
12+
913
project(wpa_supplicant_test)

components/wpa_supplicant/test_apps/main/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ idf_component_register(SRCS
66
"test_offchannel.c"
77
"test_sae.c"
88
"test_wpa_supplicant_main.c"
9+
"test_wifi_external_bss.c"
910
PRIV_INCLUDE_DIRS "."
10-
PRIV_REQUIRES wpa_supplicant mbedtls esp_wifi esp_event unity
11+
PRIV_REQUIRES wpa_supplicant mbedtls esp_wifi esp_event unity esp_psram
1112
WHOLE_ARCHIVE)
1213

1314
idf_component_get_property(esp_supplicant_dir wpa_supplicant COMPONENT_DIR)
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <string.h>
8+
#include <inttypes.h>
9+
#include "esp_system.h"
10+
#include "esp_log.h"
11+
#include "esp_system.h"
12+
#include "esp_event.h"
13+
#include "freertos/FreeRTOS.h"
14+
#include "freertos/event_groups.h"
15+
#include "unity.h"
16+
#include "utils/common.h"
17+
#include "esp_wifi_types.h"
18+
#include "esp_wifi_driver.h"
19+
#include "memory_checks.h"
20+
#include "common/ieee802_11_defs.h"
21+
#include "test_utils.h"
22+
#include "test_wpa_supplicant_common.h"
23+
#include "sdkconfig.h"
24+
25+
#if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY
26+
#define WIFI_CONNECTED_BIT BIT0
27+
#define WIFI_FAIL_BIT BIT1
28+
#define WIFI_AP_STA_CONNECTED BIT2
29+
#define CONNECT_TIMEOUT_MS (10000)
30+
31+
#ifndef TEST_SUFFIX_STR
32+
#define TEST_SUFFIX_STR "_0000"
33+
#endif
34+
#define TEST_DEFAULT_SSID "SSID_" CONFIG_IDF_TARGET TEST_SUFFIX_STR
35+
#define TEST_DEFAULT_PWD "PASS_" CONFIG_IDF_TARGET TEST_SUFFIX_STR
36+
#define TEST_DEFAULT_CHANNEL (6)
37+
38+
static const char *TAG = "test_ext_bss";
39+
static esp_netif_t* s_ap_netif = NULL;
40+
static esp_netif_t* s_sta_netif = NULL;
41+
static EventGroupHandle_t wifi_event;
42+
static int retry_count = 0;
43+
44+
static void wifi_event_handler(void *arg, esp_event_base_t event_base,
45+
int32_t event_id, void *event_data)
46+
{
47+
switch (event_id) {
48+
case WIFI_EVENT_STA_START:
49+
ESP_LOGI(TAG, "WIFI Started");
50+
break;
51+
case WIFI_EVENT_STA_DISCONNECTED:
52+
if (retry_count < 5) {
53+
ESP_LOGI(TAG, "retry connection");
54+
esp_wifi_connect();
55+
retry_count++;
56+
} else {
57+
xEventGroupSetBits(wifi_event, WIFI_FAIL_BIT);
58+
}
59+
break;
60+
case WIFI_EVENT_STA_CONNECTED:
61+
retry_count = 0;
62+
xEventGroupSetBits(wifi_event, WIFI_CONNECTED_BIT);
63+
break;
64+
case WIFI_EVENT_AP_STACONNECTED:
65+
wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
66+
ESP_LOGI(TAG, "station "MACSTR" join, AID=%d",
67+
MAC2STR(event->mac), event->aid);
68+
xEventGroupSetBits(wifi_event, WIFI_AP_STA_CONNECTED);
69+
break;
70+
case WIFI_EVENT_AP_STADISCONNECTED:
71+
ESP_LOGI(TAG, "station leave");
72+
break;
73+
default:
74+
break;
75+
}
76+
return;
77+
}
78+
79+
static esp_err_t event_init(void)
80+
{
81+
ESP_ERROR_CHECK(esp_event_loop_create_default());
82+
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));
83+
s_sta_netif = esp_netif_create_default_wifi_sta();
84+
s_ap_netif = esp_netif_create_default_wifi_ap();
85+
86+
return ESP_OK;
87+
}
88+
89+
static esp_err_t event_deinit(void)
90+
{
91+
ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler));
92+
esp_netif_destroy_default_wifi(s_sta_netif);
93+
esp_netif_destroy_default_wifi(s_ap_netif);
94+
ESP_ERROR_CHECK(esp_event_loop_delete_default());
95+
return ESP_OK;
96+
}
97+
98+
static void stop_wifi(void)
99+
{
100+
TEST_ESP_OK(esp_wifi_stop());
101+
event_deinit();
102+
if (wifi_event) {
103+
vEventGroupDelete(wifi_event);
104+
wifi_event = NULL;
105+
}
106+
vTaskDelay(500 / portTICK_PERIOD_MS);
107+
TEST_ESP_OK(esp_wifi_deinit());
108+
}
109+
110+
static void start_wifi_as_sta(void)
111+
{
112+
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
113+
cfg.nvs_enable = false;
114+
set_leak_threshold(2000);
115+
116+
event_init();
117+
118+
if (wifi_event == NULL) {
119+
wifi_event = xEventGroupCreate();
120+
} else {
121+
xEventGroupClearBits(wifi_event, 0x00ffffff);
122+
}
123+
// Test wifi init
124+
TEST_ESP_OK(esp_wifi_init(&cfg));
125+
126+
wifi_config_t wifi_config = {
127+
.sta = {
128+
.ssid = TEST_DEFAULT_SSID,
129+
.password = TEST_DEFAULT_PWD,
130+
},
131+
};
132+
133+
// Test wifi set mode and wifi start
134+
TEST_ESP_OK(esp_wifi_set_mode(WIFI_MODE_STA));
135+
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
136+
TEST_ESP_OK(esp_wifi_start());
137+
}
138+
139+
static void test_station_connection(void)
140+
{
141+
EventBits_t bits;
142+
start_wifi_as_sta();
143+
144+
// wait for softap to start
145+
vTaskDelay(1000 / portTICK_PERIOD_MS);
146+
147+
TEST_ESP_OK(esp_wifi_connect());
148+
ESP_LOGI(TAG, "start esp_wifi_connect: %s", TEST_DEFAULT_SSID);
149+
150+
bits = xEventGroupWaitBits(wifi_event, WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
151+
pdTRUE, pdFALSE, portMAX_DELAY);
152+
TEST_ASSERT(bits & WIFI_CONNECTED_BIT);
153+
stop_wifi();
154+
}
155+
156+
static void start_wifi_as_softap(void)
157+
{
158+
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
159+
cfg.nvs_enable = false;
160+
set_leak_threshold(2000);
161+
162+
event_init();
163+
164+
if (wifi_event == NULL) {
165+
wifi_event = xEventGroupCreate();
166+
} else {
167+
xEventGroupClearBits(wifi_event, 0x00ffffff);
168+
}
169+
// Test wifi init
170+
TEST_ESP_OK(esp_wifi_init(&cfg));
171+
172+
wifi_config_t wifi_config = {
173+
.ap = {
174+
.ssid = TEST_DEFAULT_SSID,
175+
.password = TEST_DEFAULT_PWD,
176+
.channel = TEST_DEFAULT_CHANNEL,
177+
.authmode = WIFI_AUTH_WPA2_PSK,
178+
.max_connection = 5,
179+
},
180+
};
181+
182+
TEST_ESP_OK(esp_wifi_set_mode(WIFI_MODE_AP));
183+
TEST_ESP_OK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));
184+
TEST_ESP_OK(esp_wifi_start());
185+
ESP_LOGI(TAG, "start wifi softap: %s", TEST_DEFAULT_SSID);
186+
}
187+
188+
static void test_softap_connection(void)
189+
{
190+
EventBits_t bits;
191+
start_wifi_as_softap();
192+
193+
// wait for station to be connected
194+
bits = xEventGroupWaitBits(wifi_event, WIFI_AP_STA_CONNECTED, 1, 0, CONNECT_TIMEOUT_MS / portTICK_PERIOD_MS);
195+
TEST_ASSERT(bits & WIFI_AP_STA_CONNECTED);
196+
197+
stop_wifi();
198+
}
199+
200+
/* Test that wifi starts, scans and stops normally when .bss segment is allowed to move to external memory */
201+
TEST_CASE_MULTIPLE_DEVICES("test wifi connection for sta and softap when ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY is enabled", "[esp_wifi][test_env=wifi_two_dut]", test_station_connection, test_softap_connection);
202+
203+
#endif // CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY

components/wpa_supplicant/test_apps/pytest_wpa_supplicant_ut.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
1+
# SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
22
# SPDX-License-Identifier: CC0-1.0
33
import pytest
44
from pytest_embedded import Dut
@@ -31,3 +31,19 @@ def test_wpa_supplicant_ut_offchan(case_tester: CaseTester) -> None:
3131
for case in case_tester.test_menu:
3232
if case.attributes.get('test_env') == 'wifi_two_dut':
3333
case_tester.run_multi_dev_case(case=case, reset=True)
34+
35+
36+
# test when external bss segment is enabled
37+
@pytest.mark.esp32s3
38+
@pytest.mark.wifi_two_dut
39+
@pytest.mark.parametrize(
40+
'count, config',
41+
[
42+
(2, 'ext_esp32s3',),
43+
],
44+
indirect=True
45+
)
46+
def test_wpa_supplicant_ut_psram(case_tester: CaseTester) -> None:
47+
for case in case_tester.test_menu:
48+
if case.attributes.get('test_env') == 'wifi_two_dut':
49+
case_tester.run_multi_dev_case(case=case, reset=True)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# For EXT_RAM_BSS_ATTR
2+
CONFIG_IDF_TARGET="esp32s3"
3+
CONFIG_SPIRAM=y
4+
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192
2-
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=n
2+
CONFIG_ESP_TASK_WDT=n
33
CONFIG_ESP_WIFI_TESTING_OPTIONS=y
44
CONFIG_ESP_WIFI_DPP_SUPPORT=y
5-
CONFIG_WPA3_SAE=y
5+
CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y

0 commit comments

Comments
 (0)