diff --git a/.gitlab/ci/rules.yml b/.gitlab/ci/rules.yml index 91c1db6769..e5606273c7 100644 --- a/.gitlab/ci/rules.yml +++ b/.gitlab/ci/rules.yml @@ -201,8 +201,9 @@ - "examples/common_components/**/*" - "examples/protocols/**/*" - "examples/system/ota/**/*" - + - "examples/ethernet/iperf/**/*" - "components/esp_eth/**/*" + - "components/esp_netif/esp_netif_handlers.c" # for jobs: example_test_002, example_test*wifi* .patterns-example_test-wifi: &patterns-example_test-wifi diff --git a/examples/ethernet/iperf/iperf_test.py b/examples/ethernet/iperf/iperf_test.py index 1233369257..5bd30bd2f3 100644 --- a/examples/ethernet/iperf/iperf_test.py +++ b/examples/ethernet/iperf/iperf_test.py @@ -12,11 +12,9 @@ from __future__ import division, unicode_literals import os import re import subprocess -import time -import netifaces import ttfw_idf -from common_test_methods import get_env_config_variable, get_host_ip_by_interface +from common_test_methods import get_host_ip4_by_dest_ip from idf_iperf_test_util import IperfUtility from tiny_test_fw import TinyFW @@ -46,11 +44,10 @@ class IperfTestUtilityEth(IperfUtility.IperfTestUtility): except subprocess.CalledProcessError: pass self.dut.write('restart') + self.dut.expect("Type 'help' to get the list of commands.") self.dut.expect_any('iperf>', 'esp32>') self.dut.write('ethernet start') - time.sleep(10) - self.dut.write('ethernet info') - dut_ip = self.dut.expect(re.compile(r'ETHIP: (\d+[.]\d+[.]\d+[.]\d+)\r'))[0] + dut_ip = self.dut.expect(re.compile(r'esp_netif_handlers: .+ ip: (\d+\.\d+\.\d+\.\d+),'))[0] rssi = 0 return dut_ip, rssi @@ -62,8 +59,6 @@ def test_ethernet_throughput_basic(env, _): # type: (Any, Any) -> None 1. test TCP tx rx and UDP tx rx throughput 2. compare with the pre-defined pass standard """ - pc_nic = get_env_config_variable('wifi_router', 'pc_nic', default='eth1') - pc_nic_ip = get_host_ip_by_interface(pc_nic, netifaces.AF_INET) pc_iperf_log_file = os.path.join(env.log_path, 'pc_iperf_log.md') # 1. get DUT @@ -72,6 +67,10 @@ def test_ethernet_throughput_basic(env, _): # type: (Any, Any) -> None dut.expect_any('iperf>', 'esp32>') # 2. preparing + dut.write('ethernet start') + dut_ip = dut.expect(re.compile(r'esp_netif_handlers: .+ ip: (\d+\.\d+\.\d+\.\d+),'))[0] + pc_nic_ip = get_host_ip4_by_dest_ip(dut_ip) + test_result = { 'tcp_tx': IperfUtility.TestResult('tcp', 'tx', 'ethernet'), 'tcp_rx': IperfUtility.TestResult('tcp', 'rx', 'ethernet'), diff --git a/examples/protocols/sockets/tcp_client/example_test.py b/examples/protocols/sockets/tcp_client/example_test.py index 3427296b5b..2109907c31 100644 --- a/examples/protocols/sockets/tcp_client/example_test.py +++ b/examples/protocols/sockets/tcp_client/example_test.py @@ -15,9 +15,9 @@ import sys from builtins import input from threading import Event, Thread -import netifaces import ttfw_idf -from common_test_methods import get_env_config_variable, get_host_ip_by_interface, get_my_interface_by_dest_ip +from common_test_methods import (get_env_config_variable, get_host_ip4_by_dest_ip, get_host_ip6_by_dest_ip, + get_my_interface_by_dest_ip) # ----------- Config ---------- PORT = 3333 @@ -111,13 +111,13 @@ def test_examples_protocol_socket_tcpclient(env, extra_data): my_interface = get_my_interface_by_dest_ip(ipv4) # test IPv4 with TcpServer(PORT, socket.AF_INET): - server_ip = get_host_ip_by_interface(my_interface, netifaces.AF_INET) + server_ip = get_host_ip4_by_dest_ip(ipv4) print('Connect tcp client to server IP={}'.format(server_ip)) dut1.write(server_ip) dut1.expect(re.compile(r'OK: Message from ESP32')) # test IPv6 with TcpServer(PORT, socket.AF_INET6): - server_ip = get_host_ip_by_interface(my_interface, netifaces.AF_INET6) + server_ip = get_host_ip6_by_dest_ip(ipv6, my_interface) print('Connect tcp client to server IP={}'.format(server_ip)) dut1.write(server_ip) dut1.expect(re.compile(r'OK: Message from ESP32')) diff --git a/examples/protocols/sockets/udp_client/example_test.py b/examples/protocols/sockets/udp_client/example_test.py index a5425b8614..ba21038878 100644 --- a/examples/protocols/sockets/udp_client/example_test.py +++ b/examples/protocols/sockets/udp_client/example_test.py @@ -15,9 +15,9 @@ import sys from builtins import input from threading import Event, Thread -import netifaces import ttfw_idf -from common_test_methods import get_env_config_variable, get_host_ip_by_interface, get_my_interface_by_dest_ip +from common_test_methods import (get_env_config_variable, get_host_ip4_by_dest_ip, get_host_ip6_by_dest_ip, + get_my_interface_by_dest_ip) from tiny_test_fw.DUT import ExpectTimeout # ----------- Config ---------- @@ -106,7 +106,7 @@ def test_examples_protocol_socket_udpclient(env, extra_data): my_interface = get_my_interface_by_dest_ip(ipv4) # test IPv4 with UdpServer(PORT, socket.AF_INET): - server_ip = get_host_ip_by_interface(my_interface, netifaces.AF_INET) + server_ip = get_host_ip4_by_dest_ip(ipv4) print('Connect udp client to server IP={}'.format(server_ip)) for _ in range(3): try: @@ -119,7 +119,7 @@ def test_examples_protocol_socket_udpclient(env, extra_data): raise ValueError('Failed to send/recv udp packets.') # test IPv6 with UdpServer(PORT, socket.AF_INET6): - server_ip = get_host_ip_by_interface(my_interface, netifaces.AF_INET6) + server_ip = get_host_ip6_by_dest_ip(ipv6, my_interface) print('Connect udp client to server IP={}'.format(server_ip)) for _ in range(3): try: diff --git a/tools/ci/python_packages/common_test_methods.py b/tools/ci/python_packages/common_test_methods.py index 85ace23373..80392fbc27 100644 --- a/tools/ci/python_packages/common_test_methods.py +++ b/tools/ci/python_packages/common_test_methods.py @@ -4,7 +4,7 @@ import logging import os import socket -from typing import Any +from typing import Any, List import netifaces import yaml @@ -26,10 +26,23 @@ $IDF_PATH/EnvConfig.yml: def get_host_ip_by_interface(interface_name: str, ip_type: int = netifaces.AF_INET) -> str: - for _addr in netifaces.ifaddresses(interface_name)[ip_type]: - host_ip = _addr['addr'].replace('%{}'.format(interface_name), '') - assert isinstance(host_ip, str) - return host_ip + if ip_type == netifaces.AF_INET: + for _addr in netifaces.ifaddresses(interface_name)[ip_type]: + host_ip = _addr['addr'].replace('%{}'.format(interface_name), '') + assert isinstance(host_ip, str) + return host_ip + elif ip_type == netifaces.AF_INET6: + ip6_addrs: List[str] = [] + for _addr in netifaces.ifaddresses(interface_name)[ip_type]: + host_ip = _addr['addr'].replace('%{}'.format(interface_name), '') + assert isinstance(host_ip, str) + # prefer to use link local address due to example settings + if host_ip.startswith('FE80::'): + ip6_addrs.insert(0, host_ip) + else: + ip6_addrs.append(host_ip) + if ip6_addrs: + return ip6_addrs[0] return '' @@ -45,6 +58,17 @@ def get_host_ip4_by_dest_ip(dest_ip: str = '') -> str: return host_ip +def get_host_ip6_by_dest_ip(dest_ip: str, interface: str) -> str: + addr_info = socket.getaddrinfo(f'{dest_ip}%{interface}', 80, socket.AF_INET6, socket.SOCK_DGRAM) + s1 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) + s1.connect(addr_info[0][-1]) + host_ip = s1.getsockname()[0] + s1.close() + assert isinstance(host_ip, str) + print(f'Using host ip: {host_ip}') + return host_ip + + def get_my_interface_by_dest_ip(dest_ip: str = '') -> str: my_ip = get_host_ip4_by_dest_ip(dest_ip) interfaces = netifaces.interfaces()