From 498989ea10fa5b05ea6d86293e24aa84751698dd Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Thu, 11 Dec 2025 13:24:31 +0100 Subject: [PATCH] fix(ci): re-enabled ESP32P4 tests on different HW vers --- .../esp_eth/test_apps/.build-test-rules.yml | 2 +- components/esp_eth/test_apps/README.md | 4 +- .../esp_eth/test_apps/pytest_esp_eth.py | 30 +++++------ .../sdkconfig.ci.default_ip101_esp32p4v1 | 12 +++++ .../sdkconfig.ci.rmii_clko_esp32p4v1 | 18 +++++++ .../esp_netif/test_apps/.build-test-rules.yml | 2 +- .../test_apps/test_app_vfs_l2tap/README.md | 4 +- .../pytest_esp_vfs_l2tap.py | 24 ++------- .../sdkconfig.ci.default_esp32 | 1 + .../sdkconfig.ci.default_esp32p4 | 1 + ...kconfig.ci.defaults => sdkconfig.defaults} | 0 examples/ethernet/.build-test-rules.yml | 10 ++-- examples/ethernet/basic/README.md | 4 +- examples/ethernet/basic/pytest_eth_basic.py | 14 +++--- .../basic/sdkconfig.ci.defaults_esp32p4 | 4 ++ .../basic/sdkconfig.ci.defaults_esp32p4v1 | 5 ++ examples/ethernet/iperf/README.md | 4 +- examples/ethernet/iperf/pytest_eth_iperf.py | 10 ++-- .../sdkconfig.ci.default_ip101_esp32p4v1 | 50 +++++++++++++++++++ .../udp_multicast/pytest_udp_multicast.py | 11 ++-- 20 files changed, 139 insertions(+), 71 deletions(-) create mode 100644 components/esp_eth/test_apps/sdkconfig.ci.default_ip101_esp32p4v1 create mode 100644 components/esp_eth/test_apps/sdkconfig.ci.rmii_clko_esp32p4v1 create mode 100644 components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.ci.default_esp32 create mode 100644 components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.ci.default_esp32p4 rename components/esp_netif/test_apps/test_app_vfs_l2tap/{sdkconfig.ci.defaults => sdkconfig.defaults} (100%) create mode 100644 examples/ethernet/basic/sdkconfig.ci.defaults_esp32p4 create mode 100644 examples/ethernet/basic/sdkconfig.ci.defaults_esp32p4v1 create mode 100644 examples/ethernet/iperf/sdkconfig.ci.default_ip101_esp32p4v1 diff --git a/components/esp_eth/test_apps/.build-test-rules.yml b/components/esp_eth/test_apps/.build-test-rules.yml index 3d07cc18a3..dc4d00c17b 100644 --- a/components/esp_eth/test_apps/.build-test-rules.yml +++ b/components/esp_eth/test_apps/.build-test-rules.yml @@ -2,7 +2,7 @@ components/esp_eth/test_apps: enable: - - if: IDF_TARGET in ["esp32"] # TODO: IDF-14365 + - if: IDF_TARGET in ["esp32", "esp32p4"] reason: ESP32 and ESP32P4 have internal EMAC. SPI Ethernet runners are based on ESP32. depends_components: - esp_eth diff --git a/components/esp_eth/test_apps/README.md b/components/esp_eth/test_apps/README.md index 0e2cf8cb13..9747c000db 100644 --- a/components/esp_eth/test_apps/README.md +++ b/components/esp_eth/test_apps/README.md @@ -1,6 +1,6 @@ # EMAC Test -| Supported Targets | ESP32 | -| ----------------- | ----- | +| Supported Targets | ESP32 | ESP32-P4 | +| ----------------- | ----- | -------- | This test app is used to test Ethernet MAC behavior with different chips. diff --git a/components/esp_eth/test_apps/pytest_esp_eth.py b/components/esp_eth/test_apps/pytest_esp_eth.py index f32e5cf7ae..cd29d3cfd6 100644 --- a/components/esp_eth/test_apps/pytest_esp_eth.py +++ b/components/esp_eth/test_apps/pytest_esp_eth.py @@ -288,48 +288,42 @@ def test_esp_eth_ip101(dut: IdfDut) -> None: # ----------- IP101 ESP32P4 ----------- -@pytest.mark.eth_ip101 -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='p4 rev3 migration, IDF-14365') @pytest.mark.parametrize( - 'config', + 'config, target', [ - 'default_ip101_esp32p4', + pytest.param('default_ip101_esp32p4', 'esp32p4', marks=[pytest.mark.eth_ip101]), + pytest.param('default_ip101_esp32p4v1', 'esp32p4', marks=[pytest.mark.eth_ip101, pytest.mark.esp32p4_eco4]), ], - indirect=True, + indirect=['target'], ) -@idf_parametrize('target', ['esp32p4'], indirect=['target']) def test_esp32p4_ethernet(dut: IdfDut) -> None: ethernet_test(dut) dut.serial.hard_reset() ethernet_l2_test(dut) -@pytest.mark.eth_ip101 -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='p4 rev3 migration, IDF-14365') @pytest.mark.parametrize( - 'config', + 'config, target', [ - 'default_ip101_esp32p4', + pytest.param('default_ip101_esp32p4', 'esp32p4', marks=[pytest.mark.eth_ip101]), + pytest.param('default_ip101_esp32p4v1', 'esp32p4', marks=[pytest.mark.eth_ip101, pytest.mark.esp32p4_eco4]), ], - indirect=True, + indirect=['target'], ) -@idf_parametrize('target', ['esp32p4'], indirect=['target']) def test_esp32p4_emac(dut: IdfDut) -> None: ethernet_int_emac_test(dut) dut.serial.hard_reset() ethernet_heap_alloc_test(dut) -@pytest.mark.eth_ip101 -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='p4 rev3 migration, IDF-14365') @pytest.mark.parametrize( - 'config', + 'config, target', [ - 'rmii_clko_esp32p4', + pytest.param('rmii_clko_esp32p4', 'esp32p4', marks=[pytest.mark.eth_ip101]), + pytest.param('rmii_clko_esp32p4v1', 'esp32p4', marks=[pytest.mark.eth_ip101, pytest.mark.esp32p4_eco4]), ], - indirect=True, + indirect=['target'], ) -@idf_parametrize('target', ['esp32p4'], indirect=['target']) def test_esp32p4_emac_clko(dut: IdfDut) -> None: dut.run_all_single_board_cases(group='esp_emac_clk_out') diff --git a/components/esp_eth/test_apps/sdkconfig.ci.default_ip101_esp32p4v1 b/components/esp_eth/test_apps/sdkconfig.ci.default_ip101_esp32p4v1 new file mode 100644 index 0000000000..73e634ed33 --- /dev/null +++ b/components/esp_eth/test_apps/sdkconfig.ci.default_ip101_esp32p4v1 @@ -0,0 +1,12 @@ +CONFIG_IDF_TARGET="esp32p4" +CONFIG_ESP32P4_SELECTS_REV_LESS_V3=y + +CONFIG_UNITY_ENABLE_FIXTURE=y +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +CONFIG_ETH_USE_ESP32_EMAC=y +CONFIG_ESP_TASK_WDT_EN=n + +CONFIG_TARGET_USE_INTERNAL_ETHERNET=y +CONFIG_TARGET_ETH_PHY_DEVICE_IP101=y + +CONFIG_TARGET_USE_DEFAULT_EMAC_CONFIG=y diff --git a/components/esp_eth/test_apps/sdkconfig.ci.rmii_clko_esp32p4v1 b/components/esp_eth/test_apps/sdkconfig.ci.rmii_clko_esp32p4v1 new file mode 100644 index 0000000000..f5b3550e85 --- /dev/null +++ b/components/esp_eth/test_apps/sdkconfig.ci.rmii_clko_esp32p4v1 @@ -0,0 +1,18 @@ +CONFIG_IDF_TARGET="esp32p4" +CONFIG_ESP32P4_SELECTS_REV_LESS_V3=y + +CONFIG_UNITY_ENABLE_FIXTURE=y +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +CONFIG_ETH_USE_ESP32_EMAC=y +CONFIG_ESP_TASK_WDT_EN=n + +CONFIG_TARGET_USE_INTERNAL_ETHERNET=y +CONFIG_TARGET_ETH_PHY_DEVICE_IP101=y + +CONFIG_TARGET_USE_DEFAULT_EMAC_CONFIG=y + +CONFIG_TARGET_RMII_CLK_OUT=y +# Test board needs to be modified! +# Connect GPIO23 to GPIO32 via wire. +CONFIG_TARGET_RMII_CLK_OUT_GPIO=23 +CONFIG_TARGET_RMII_CLK_IN_GPIO=32 diff --git a/components/esp_netif/test_apps/.build-test-rules.yml b/components/esp_netif/test_apps/.build-test-rules.yml index 9e37eaeb54..7baad88301 100644 --- a/components/esp_netif/test_apps/.build-test-rules.yml +++ b/components/esp_netif/test_apps/.build-test-rules.yml @@ -13,7 +13,7 @@ components/esp_netif/test_apps/test_app_esp_netif: components/esp_netif/test_apps/test_app_vfs_l2tap: disable: - - if: IDF_TARGET not in ["esp32"] # TODO: IDF-14365 + - if: IDF_TARGET not in ["esp32", "esp32p4"] temporary: true reason: Not needed to test on all targets (chosen two, one for each architecture plus P4 tests time stamping) depends_components: diff --git a/components/esp_netif/test_apps/test_app_vfs_l2tap/README.md b/components/esp_netif/test_apps/test_app_vfs_l2tap/README.md index f708a1985a..4873c15b15 100644 --- a/components/esp_netif/test_apps/test_app_vfs_l2tap/README.md +++ b/components/esp_netif/test_apps/test_app_vfs_l2tap/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32 | -| ----------------- | ----- | +| Supported Targets | ESP32 | ESP32-P4 | +| ----------------- | ----- | -------- | diff --git a/components/esp_netif/test_apps/test_app_vfs_l2tap/pytest_esp_vfs_l2tap.py b/components/esp_netif/test_apps/test_app_vfs_l2tap/pytest_esp_vfs_l2tap.py index fb14d5ce59..237510d992 100644 --- a/components/esp_netif/test_apps/test_app_vfs_l2tap/pytest_esp_vfs_l2tap.py +++ b/components/esp_netif/test_apps/test_app_vfs_l2tap/pytest_esp_vfs_l2tap.py @@ -2,31 +2,15 @@ # SPDX-License-Identifier: CC0-1.0 import pytest from pytest_embedded import Dut -from pytest_embedded_idf.utils import idf_parametrize -@pytest.mark.ethernet @pytest.mark.parametrize( - 'config', + 'config, target', [ - 'defaults', + pytest.param('default_esp32', 'esp32', marks=[pytest.mark.eth_ip101]), + pytest.param('default_esp32p4', 'esp32p4', marks=[pytest.mark.eth_ip101]), ], - indirect=True, + indirect=['target'], ) -@idf_parametrize('target', ['esp32'], indirect=['target']) def test_esp_netif_vfs_l2tp(dut: Dut) -> None: dut.run_all_single_board_cases() - - -@pytest.mark.eth_ip101 -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='p4 rev3 migration, IDF-14365') -@pytest.mark.parametrize( - 'config', - [ - 'defaults', - ], - indirect=True, -) -@idf_parametrize('target', ['esp32p4'], indirect=['target']) -def test_esp_netif_vfs_l2tp_p4(dut: Dut) -> None: - dut.run_all_single_board_cases() diff --git a/components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.ci.default_esp32 b/components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.ci.default_esp32 new file mode 100644 index 0000000000..2a43df1a39 --- /dev/null +++ b/components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.ci.default_esp32 @@ -0,0 +1 @@ +CONFIG_IDF_TARGET="esp32" diff --git a/components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.ci.default_esp32p4 b/components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.ci.default_esp32p4 new file mode 100644 index 0000000000..bd81009ac8 --- /dev/null +++ b/components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.ci.default_esp32p4 @@ -0,0 +1 @@ +CONFIG_IDF_TARGET="esp32p4" diff --git a/components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.ci.defaults b/components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.defaults similarity index 100% rename from components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.ci.defaults rename to components/esp_netif/test_apps/test_app_vfs_l2tap/sdkconfig.defaults diff --git a/examples/ethernet/.build-test-rules.yml b/examples/ethernet/.build-test-rules.yml index c73718e096..db876fc715 100644 --- a/examples/ethernet/.build-test-rules.yml +++ b/examples/ethernet/.build-test-rules.yml @@ -4,11 +4,11 @@ examples/ethernet/basic: enable: - if: INCLUDE_DEFAULT == 1 disable: - - if: IDF_TARGET in ["esp32h21", "esp32h4", "esp32p4"] + - if: IDF_TARGET in ["esp32h21", "esp32h4"] temporary: true - reason: not supported yet # TODO: [ESP32H21] IDF-11581 [ESP32H4] IDF-12360, IDF-14365 + reason: not supported yet # TODO: [ESP32H21] IDF-11581 [ESP32H4] IDF-12360 disable_test: - - if: IDF_TARGET not in ["esp32"] + - if: IDF_TARGET not in ["esp32", "esp32p4"] temporary: true reason: lack of runners depends_components: @@ -21,9 +21,9 @@ examples/ethernet/basic: examples/ethernet/iperf: disable: - - if: IDF_TARGET in ["esp32h21", "esp32h4", "esp32p4"] + - if: IDF_TARGET in ["esp32h21", "esp32h4"] temporary: true - reason: not supported yet # TODO: [ESP32H21] IDF-11581 [ESP32H4] IDF-12360, IDF-14365 + reason: not supported yet # TODO: [ESP32H21] IDF-11581 [ESP32H4] IDF-12360 disable_test: - if: IDF_TARGET not in ["esp32", "esp32p4"] temporary: true diff --git a/examples/ethernet/basic/README.md b/examples/ethernet/basic/README.md index 2a25d912c2..76ef20af00 100644 --- a/examples/ethernet/basic/README.md +++ b/examples/ethernet/basic/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Ethernet Example (See the README.md file in the upper level 'examples' directory for more information about examples.) diff --git a/examples/ethernet/basic/pytest_eth_basic.py b/examples/ethernet/basic/pytest_eth_basic.py index d9109007ac..50cd18a296 100644 --- a/examples/ethernet/basic/pytest_eth_basic.py +++ b/examples/ethernet/basic/pytest_eth_basic.py @@ -5,19 +5,19 @@ import subprocess import pytest from pytest_embedded import Dut -from pytest_embedded_idf.utils import idf_parametrize @pytest.mark.parametrize( - 'config', + 'config, target', [ - pytest.param('default_ip101', marks=[pytest.mark.ethernet_router]), - pytest.param('default_generic', marks=[pytest.mark.ethernet_router]), - pytest.param('default_dm9051', marks=[pytest.mark.eth_dm9051]), + pytest.param('default_ip101', 'esp32', marks=[pytest.mark.ethernet_router]), + pytest.param('default_generic', 'esp32', marks=[pytest.mark.ethernet_router]), + pytest.param('default_dm9051', 'esp32', marks=[pytest.mark.eth_dm9051]), + pytest.param('defaults_esp32p4', 'esp32p4', marks=[pytest.mark.eth_ip101]), + pytest.param('defaults_esp32p4v1', 'esp32p4', marks=[pytest.mark.eth_ip101, pytest.mark.esp32p4_eco4]), ], - indirect=True, + indirect=['target'], ) -@idf_parametrize('target', ['esp32'], indirect=['target']) def test_esp_eth_basic(dut: Dut) -> None: # wait for ip received dut_ip = dut.expect(r'esp_netif_handlers: .+ ip: (\d+\.\d+\.\d+\.\d+),').group(1) diff --git a/examples/ethernet/basic/sdkconfig.ci.defaults_esp32p4 b/examples/ethernet/basic/sdkconfig.ci.defaults_esp32p4 new file mode 100644 index 0000000000..3cf3a371a1 --- /dev/null +++ b/examples/ethernet/basic/sdkconfig.ci.defaults_esp32p4 @@ -0,0 +1,4 @@ +CONFIG_IDF_TARGET="esp32p4" + +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_ESP32_EMAC=y diff --git a/examples/ethernet/basic/sdkconfig.ci.defaults_esp32p4v1 b/examples/ethernet/basic/sdkconfig.ci.defaults_esp32p4v1 new file mode 100644 index 0000000000..5548711301 --- /dev/null +++ b/examples/ethernet/basic/sdkconfig.ci.defaults_esp32p4v1 @@ -0,0 +1,5 @@ +CONFIG_IDF_TARGET="esp32p4" +CONFIG_ESP32P4_SELECTS_REV_LESS_V3=y + +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_ESP32_EMAC=y diff --git a/examples/ethernet/iperf/README.md b/examples/ethernet/iperf/README.md index 806c86337d..4f609030b2 100644 --- a/examples/ethernet/iperf/README.md +++ b/examples/ethernet/iperf/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | # Ethernet iperf Example diff --git a/examples/ethernet/iperf/pytest_eth_iperf.py b/examples/ethernet/iperf/pytest_eth_iperf.py index 0d5b758be6..36fcc53b35 100644 --- a/examples/ethernet/iperf/pytest_eth_iperf.py +++ b/examples/ethernet/iperf/pytest_eth_iperf.py @@ -134,16 +134,14 @@ def test_esp_eth_iperf_ip101( test_esp_eth_iperf(dut, log_performance, check_performance, udp_tx_bw_lim=90) -@pytest.mark.eth_ip101 -@pytest.mark.temp_skip_ci(targets=['esp32p4'], reason='p4 rev3 migration, IDF-14365') @pytest.mark.parametrize( - 'config', + 'config, target', [ - 'default_ip101_esp32p4', + pytest.param('default_ip101_esp32p4', 'esp32p4', marks=[pytest.mark.eth_ip101]), + pytest.param('default_ip101_esp32p4v1', 'esp32p4', marks=[pytest.mark.eth_ip101, pytest.mark.esp32p4_eco4]), ], - indirect=True, + indirect=['target'], ) -@idf_parametrize('target', ['esp32p4'], indirect=['target']) def test_esp_eth_iperf_ip101_esp32p4( dut: Dut, log_performance: Callable[[str, object], None], diff --git a/examples/ethernet/iperf/sdkconfig.ci.default_ip101_esp32p4v1 b/examples/ethernet/iperf/sdkconfig.ci.default_ip101_esp32p4v1 new file mode 100644 index 0000000000..d41a943f92 --- /dev/null +++ b/examples/ethernet/iperf/sdkconfig.ci.default_ip101_esp32p4v1 @@ -0,0 +1,50 @@ +CONFIG_IDF_TARGET="esp32p4" +CONFIG_ESP32P4_SELECTS_REV_LESS_V3=y + +# Increase main task stack size +CONFIG_ESP_MAIN_TASK_STACK_SIZE=7168 + +# Enable filesystem for console commands history storage +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_example.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv" + +# Enable FreeRTOS stats formatting functions, needed for 'tasks' command +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y + +# -------------------------------- +# Performance optimization options +# -------------------------------- +# The lwIP and iperf tasks have a serial dependency (i.e., iperf must wait for lwIP to process packets), +# meaning that running in multi-core mode does not significantly improve performance. Additionally, +# IRAM optimizations have a more noticeable effect in single-core mode. +# However, while a single-core configuration can enhance iperf performance in controlled or isolated +# testing scenarios, it may not be optimal for real-world applications where the system also needs to +# handle additional, non-network-related tasks. In such cases, multi-core configurations might be better +# suited for balancing workloads and ensuring overall system responsiveness. + +# Run FreeRTOS only on the first core +CONFIG_FREERTOS_UNICORE=y + +# Disable watch dog +CONFIG_ESP_INT_WDT=n +CONFIG_ESP_TASK_WDT_EN=n + +# Enable lwIP IRAM optimization +CONFIG_LWIP_IRAM_OPTIMIZATION=y + +# Enable Ethernet IRAM optimization +CONFIG_ETH_IRAM_OPTIMIZATION=y + +CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y +CONFIG_EXAMPLE_ETH_PHY_IP101=y +CONFIG_EXAMPLE_ETH_MDC_GPIO=31 +CONFIG_EXAMPLE_ETH_MDIO_GPIO=52 +CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=51 +CONFIG_EXAMPLE_ETH_PHY_ADDR=1 + +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_ESP32_EMAC=y +CONFIG_ETH_PHY_INTERFACE_RMII=y diff --git a/examples/protocols/sockets/udp_multicast/pytest_udp_multicast.py b/examples/protocols/sockets/udp_multicast/pytest_udp_multicast.py index 2f7a14bdf1..cc7fe4f53e 100644 --- a/examples/protocols/sockets/udp_multicast/pytest_udp_multicast.py +++ b/examples/protocols/sockets/udp_multicast/pytest_udp_multicast.py @@ -11,7 +11,6 @@ import netifaces import pytest from common_test_methods import get_host_ip4_by_dest_ip from pytest_embedded import Dut -from pytest_embedded_idf.utils import idf_parametrize PORT = 3333 IPV6_REGEX = ( @@ -156,10 +155,12 @@ def test_examples_udp_multicast_proto(dut: Dut, ip_version: str = 'ipv4', nic: s sock.close() -@pytest.mark.eth_ip101 -@idf_parametrize( - 'target', - ['esp32', 'esp32p4'], +@pytest.mark.parametrize( + 'config, target', + [ + pytest.param('default_ip101', 'esp32', marks=[pytest.mark.eth_ip101]), + pytest.param('default_ip101_esp32p4', 'esp32p4', marks=[pytest.mark.eth_ip101]), + ], indirect=['target'], ) def test_examples_udp_multicast(dut: Dut) -> None: