Skip to content

Commit fbd643e

Browse files
committed
[tests] address PR review comments for 1.4.3 default route test
This commit addresses unresolved review comments on PR openthread#3443: - Add 'iproute2' to border-router Dockerfile and use 'docker exec' instead of 'nsenter' to delete the default route inside the OTBR container. This removes the requirement for root privileges on the host VM/runner to run the tests. - Add 'procps' package to the test client image in test_dind_dns_sd.sh to ensure 'pgrep' and 'pkill' commands are available for radvd. - Include radvd and tcpdump logs from eth2-server in test_teardown. - Print radvd.log from eth2-server if Step 10 ping unexpectedly succeeded to ease debugging of routing issues. Note: The suggestion to use SIGHUP (pkill -HUP radvd) was evaluated but rejected because radvd does not immediately send a Router Lifetime 0 RA upon reload, causing the default route to remain active on the DUT and failing the verification in Step 10. The original kill/restart approach is maintained as it guarantees immediate route withdrawal.
1 parent af0ffb6 commit fbd643e

4 files changed

Lines changed: 37 additions & 24 deletions

File tree

etc/docker/border-router/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ RUN set -x \
134134
curl \
135135
ipset \
136136
iptables \
137+
iproute2 \
137138
libjsoncpp25 \
138139
xz-utils \
139140
&& PLATFORM_SPEC="${TARGETARCH}${TARGETVARIANT:+/$TARGETVARIANT}" \

tests/scripts/expect/dind_1_4_pic_tc_1.exp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ send_user "OMR prefix verified in Thread Network Data successfully.\n"
202202
send_user "Step 4b: Validating RA on adjacent infrastructure link...\n"
203203
set py_ra_sniffer {import sys
204204
import ipaddress
205+
import logging
206+
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
205207
from scapy.all import *
206208

207209
target_prefix = sys.argv[1]
@@ -258,7 +260,7 @@ def check_pkt(pkt):
258260
return False
259261

260262
# Sniff until check_pkt returns True, or timeout
261-
sniff(filter="icmp6 and ip6[40] == 134", stop_filter=check_pkt, timeout=20)
263+
sniff(filter="icmp6 and icmp6[0] == 134", stop_filter=check_pkt, timeout=20)
262264

263265
if not found_otbr_ra:
264266
print("FAIL: OTBR RA packet not captured")

tests/scripts/expect/dind_1_4_pic_tc_3.exp

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ exec docker run -d \
5252
# Wait for eth2-server eth0 to be ready
5353
sleep 2
5454

55-
# Add 2002:1234::1234 IP to loopback of eth2-server
55+
# Add 2002:1234::1234 IP to loopback and 2001:db8:1::1 to eth0 of eth2-server
5656
exec docker exec -i $eth2_server ip -6 addr add 2002:1234::1234/128 dev lo
57+
exec docker exec -i $eth2_server ip -6 addr add 2001:db8:1::1/64 dev eth0
5758

5859
# Configure and start Kea DHCPv6 PD server on eth2-server (delegating 2005:1234:abcd:0::/56)
5960
set kea_conf {{"Dhcp6": {"interfaces-config": {"interfaces": ["eth0"]}, "lease-database": {"type": "memfile", "persist": true, "name": "/var/lib/kea/kea-leases6.csv"}, "preferred-lifetime": 54000, "valid-lifetime": 86400, "subnet6": [{"subnet": "fd00:db8:1::/64", "interface": "eth0", "pd-pools": [{"prefix": "2005:1234:abcd:0::", "prefix-len": 56, "delegated-len": 64}], "rapid-commit": true}], "loggers": [{"name": "kea-dhcp6", "output_options": [{"output": "stdout"}], "severity": "DEBUG", "debuglevel": 99}]}}}
@@ -70,16 +71,7 @@ exec docker exec -i $eth2_server sysctl -w net.ipv6.conf.eth0.forwarding=1
7071
set radvd_conf "interface eth0\n{\n AdvSendAdvert on;\n MinRtrAdvInterval 3;\n MaxRtrAdvInterval 10;\n prefix 2001:db8:1::/64\n {\n AdvOnLink on;\n AdvAutonomous on;\n AdvRouterAddr on;\n };\n};"
7172
exec docker exec -i $eth2_server bash -c "echo '$radvd_conf' > /etc/radvd.conf"
7273
exec docker exec -i $eth2_server chmod 600 /etc/radvd.conf
73-
exec docker exec -d $eth2_server bash -c "radvd -C /etc/radvd.conf -u root -n -m stderr >/var/log/radvd.log 2>&1"
74-
sleep 1
75-
76-
if {[catch {exec docker exec -i $eth2_server pgrep radvd} radvd_pid]} {
77-
if {![catch {exec docker exec -i $eth2_server cat /var/log/radvd.log} radvd_log]} {
78-
send_user "\n=== radvd.log ===\n$radvd_log\n=== end of radvd.log ===\n"
79-
}
80-
fail "Failed to start radvd on eth2-server: $radvd_pid"
81-
}
82-
send_user "radvd started on eth2-server with PID: [string trim $radvd_pid]\n"
74+
start_radvd $eth2_server
8375

8476
# 2. Start Eth_1 container (Local Infrastructure Host)
8577
send_user "Starting Eth_1 container (Local Host)...\n"
@@ -127,9 +119,8 @@ exec docker exec -i $container sysctl -w net.ipv6.conf.all.accept_ra=2
127119
exec docker exec -i $container sysctl -w net.ipv6.conf.eth0.accept_ra=2
128120

129121
# Delete Docker's static default route so the DUT only relies on RAs
130-
set dut_pid [exec docker inspect -f {{{.State.Pid}}} $container]
131-
set dut_pid [string trim $dut_pid]
132-
exec nsenter -t $dut_pid -n ip -6 route del default dev eth0
122+
# We can run it via docker exec now that iproute2 package is added to the container
123+
catch { exec docker exec -i $container ip -6 route del default dev eth0 }
133124

134125
# Setup active dataset on OTBR via ot-ctl
135126
exec docker exec -i $container ot-ctl thread stop
@@ -170,6 +161,17 @@ if {!$prefix_acquired} {
170161
}
171162
send_user "Successfully Discovered Delegated Prefix: $delegated_prefix\n"
172163

164+
proc start_radvd {server} {
165+
exec docker exec -d $server bash -c "radvd -C /etc/radvd.conf -u root -n -m stderr >/var/log/radvd.log 2>&1"
166+
sleep 1
167+
if {[catch {exec docker exec -i $server pgrep radvd} radvd_pid]} {
168+
if {![catch {exec docker exec -i $server cat /var/log/radvd.log} radvd_log]} {
169+
send_user "\n=== radvd.log ===\n$radvd_log\n=== end of radvd.log ===\n"
170+
}
171+
fail "Failed to start radvd on $server: $radvd_pid"
172+
}
173+
send_user "radvd started on $server with PID: [string trim $radvd_pid]\n"
174+
}
173175

174176
# Verify OMR prefix properties in netdata (subprefix of 2005:1234:abcd:0::/56, /64, default route, med preference)
175177
# AND verify default route ::/0 with Route sub-TLV (NP=0)
@@ -333,8 +335,8 @@ send_user "Step 7: Reconfiguring radvd to stop advertising default route...\n"
333335
catch {exec docker exec -i $eth2_server pkill radvd}
334336
set radvd_conf_no_default "interface eth0\n{\n AdvSendAdvert on;\n MinRtrAdvInterval 3;\n MaxRtrAdvInterval 10;\n AdvDefaultLifetime 0;\n prefix 2001:db8:1::/64\n {\n AdvOnLink on;\n AdvAutonomous on;\n AdvRouterAddr on;\n };\n};"
335337
exec docker exec -i $eth2_server bash -c "echo '$radvd_conf_no_default' > /etc/radvd.conf"
336-
exec docker exec -d $eth2_server bash -c "radvd -C /etc/radvd.conf -u root -n -m stderr >/var/log/radvd.log 2>&1"
337-
sleep 5
338+
start_radvd $eth2_server
339+
sleep 4
338340

339341
# Step 8: Verify DUT *still* advertises default route in Thread Network Data
340342
send_user "Step 8: Verifying default route is still advertised in Thread Network Data...\n"
@@ -392,9 +394,9 @@ send_user "Ping to Local Host verified successfully.\n"
392394
# Step 10: Ping 2002:1234::1234 from ED_1. Ping response MUST NOT be received. Ping request MUST NOT be sent on AIL.
393395
send_user "Step 10: Verifying Ping to Internet Server does NOT work and is NOT forwarded...\n"
394396

395-
# Start tcpdump on eth2-server to detect any ICMPv6 echo requests
397+
# Start tcpdump on eth2-server to detect any ICMPv6 echo requests (line-buffered with -l)
396398
# Run in background via exec docker exec -d. Timeout in 8 seconds to allow ping tool to finish.
397-
exec docker exec -d $eth2_server bash -c "timeout 8 tcpdump -c 1 -i eth0 'icmp6 and ip6\[40\] == 128' > /var/log/tcpdump.log 2>&1"
399+
exec docker exec -d $eth2_server bash -c "timeout 8 tcpdump -l -c 1 -i eth0 'icmp6 and icmp6\[0\] == 128' > /var/log/tcpdump.log 2>&1"
398400
sleep 1
399401

400402
# Send ping from ED_1
@@ -415,11 +417,15 @@ expect {
415417
}
416418
}
417419
if {$ping_received} {
420+
catch {
421+
set radvd_log [exec docker exec -i $eth2_server cat /var/log/radvd.log]
422+
send_user "\n=== radvd.log ===\n$radvd_log\n=== end of radvd.log ===\n"
423+
}
418424
fail "Ping from ED_1 to Internet Server succeeded, but it was expected to fail"
419425
}
420426

421427
# Check if tcpdump captured any packet
422-
sleep 5
428+
sleep 9
423429
set tcpdump_log [exec docker exec -i $eth2_server cat /var/log/tcpdump.log]
424430
send_user "tcpdump log on eth2-server:\n$tcpdump_log\n"
425431
if {![string match "*listening on*" $tcpdump_log]} {
@@ -435,8 +441,8 @@ send_user "Step 11: Reconfiguring radvd to start advertising default route again
435441
catch {exec docker exec -i $eth2_server pkill radvd}
436442
set radvd_conf_with_default "interface eth0\n{\n AdvSendAdvert on;\n MinRtrAdvInterval 3;\n MaxRtrAdvInterval 10;\n AdvDefaultLifetime 875;\n prefix 2001:db8:1::/64\n {\n AdvOnLink on;\n AdvAutonomous on;\n AdvRouterAddr on;\n };\n};"
437443
exec docker exec -i $eth2_server bash -c "echo '$radvd_conf_with_default' > /etc/radvd.conf"
438-
exec docker exec -d $eth2_server bash -c "radvd -C /etc/radvd.conf -u root -n -m stderr >/var/log/radvd.log 2>&1"
439-
sleep 5
444+
start_radvd $eth2_server
445+
sleep 4
440446

441447
# Step 12: Verify default route is advertised in Thread Network Data
442448
send_user "Step 12: Verifying default route is advertised in Thread Network Data again...\n"

tests/scripts/test_dind_dns_sd.sh

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,14 @@ test_teardown()
7575
echo "Active and inactive containers:"
7676
docker ps -a || true
7777
echo "Container logs:"
78-
for c in "${CONTAINER_NAME}" "otbr-test-container-1" "otbr-test-container-2" "otbr-test-container-3" "otbr-test-container-web" "test-client" "dhcp6-server"; do
78+
for c in "${CONTAINER_NAME}" "otbr-test-container-1" "otbr-test-container-2" "otbr-test-container-3" "otbr-test-container-web" "test-client" "dhcp6-server" "eth1-server" "eth2-server"; do
7979
docker logs "$c" || true
8080
done
8181

82+
echo "Radvd/Tcpdump logs on eth2-server:"
83+
docker exec -i eth2-server cat /var/log/radvd.log || true
84+
docker exec -i eth2-server cat /var/log/tcpdump.log || true
85+
8286
echo "Agent logs:"
8387
for c in "${CONTAINER_NAME}" "otbr-test-container-1" "otbr-test-container-2" "otbr-test-container-3" "otbr-test-container-web"; do
8488
docker exec -i "$c" cat /var/log/otbr-agent.log || true
@@ -141,7 +145,7 @@ test_setup()
141145
echo "Building test client image with mdns-scan and ping/ndisc6 tools..."
142146
docker build -t "${TEST_CLIENT_IMAGE}" - <<EOF
143147
FROM ubuntu:24.04
144-
RUN apt-get update && apt-get install -y mdns-scan iputils-ping ndisc6 python3-zeroconf iproute2 kea-dhcp6-server dnsmasq python3-scapy radvd tcpdump --no-install-recommends && rm -rf /var/lib/apt/lists/*
148+
RUN apt-get update && apt-get install -y mdns-scan iputils-ping ndisc6 python3-zeroconf iproute2 kea-dhcp6-server dnsmasq python3-scapy radvd tcpdump procps --no-install-recommends && rm -rf /var/lib/apt/lists/*
145149
ENTRYPOINT ["mdns-scan"]
146150
EOF
147151

0 commit comments

Comments
 (0)