2929
3030source "tests/scripts/expect/_common.exp"
3131
32+ proc start_radvd {server} {
33+ exec docker exec -d $server bash -c "radvd -C /etc/radvd.conf -u root -n -m stderr >/var/log/radvd.log 2>&1"
34+ sleep 1
35+ if {[catch {exec docker exec -i $server pgrep radvd} radvd_pid]} {
36+ if {![catch {exec docker exec -i $server cat /var/log/radvd.log} radvd_log]} {
37+ send_user "\n=== radvd.log ===\n$radvd_log\n=== end of radvd.log ===\n"
38+ }
39+ fail "Failed to start radvd on $server: $radvd_pid"
40+ }
41+ send_user "radvd started on $server with PID: [string trim $radvd_pid]\n"
42+ }
43+
44+
3245set pty1 [create_socat_tcp 1 9000]
3346set container "otbr-test-container"
3447set eth2_server "eth2-server"
@@ -52,8 +65,9 @@ exec docker run -d \
5265# Wait for eth2-server eth0 to be ready
5366sleep 2
5467
55- # Add 2002:1234::1234 IP to loopback of eth2-server
68+ # Add 2002:1234::1234 IP to loopback and 2001:db8:1::1 to eth0 of eth2-server
5669exec docker exec -i $eth2_server ip -6 addr add 2002:1234::1234/128 dev lo
70+ exec docker exec -i $eth2_server ip -6 addr add 2001:db8:1::1/64 dev eth0
5771
5872# Configure and start Kea DHCPv6 PD server on eth2-server (delegating 2005:1234:abcd:0::/56)
5973set 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 +84,7 @@ exec docker exec -i $eth2_server sysctl -w net.ipv6.conf.eth0.forwarding=1
7084set 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};"
7185exec docker exec -i $eth2_server bash -c "echo '$radvd_conf' > /etc/radvd.conf"
7286exec 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"
87+ start_radvd $eth2_server
8388
8489# 2. Start Eth_1 container (Local Infrastructure Host)
8590send_user "Starting Eth_1 container (Local Host)...\n"
@@ -127,9 +132,8 @@ exec docker exec -i $container sysctl -w net.ipv6.conf.all.accept_ra=2
127132exec docker exec -i $container sysctl -w net.ipv6.conf.eth0.accept_ra=2
128133
129134# 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
135+ # We can run it via docker exec now that iproute2 package is added to the container
136+ catch { exec docker exec -i $container ip -6 route del default dev eth0 }
133137
134138# Setup active dataset on OTBR via ot-ctl
135139exec docker exec -i $container ot-ctl thread stop
@@ -170,7 +174,6 @@ if {!$prefix_acquired} {
170174}
171175send_user "Successfully Discovered Delegated Prefix: $delegated_prefix\n"
172176
173-
174177# Verify OMR prefix properties in netdata (subprefix of 2005:1234:abcd:0::/56, /64, default route, med preference)
175178# AND verify default route ::/0 with Route sub-TLV (NP=0)
176179proc verify_netdata {container} {
@@ -333,8 +336,8 @@ send_user "Step 7: Reconfiguring radvd to stop advertising default route...\n"
333336catch {exec docker exec -i $eth2_server pkill radvd}
334337set 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};"
335338exec 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
339+ start_radvd $eth2_server
340+ sleep 4
338341
339342# Step 8: Verify DUT *still* advertises default route in Thread Network Data
340343send_user "Step 8: Verifying default route is still advertised in Thread Network Data...\n"
@@ -392,9 +395,9 @@ send_user "Ping to Local Host verified successfully.\n"
392395# Step 10: Ping 2002:1234::1234 from ED_1. Ping response MUST NOT be received. Ping request MUST NOT be sent on AIL.
393396send_user "Step 10: Verifying Ping to Internet Server does NOT work and is NOT forwarded...\n"
394397
395- # Start tcpdump on eth2-server to detect any ICMPv6 echo requests
398+ # Start tcpdump on eth2-server to detect any ICMPv6 echo requests (line-buffered with -l)
396399# 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"
400+ 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"
398401sleep 1
399402
400403# Send ping from ED_1
@@ -415,11 +418,15 @@ expect {
415418 }
416419}
417420if {$ping_received} {
421+ catch {
422+ set radvd_log [exec docker exec -i $eth2_server cat /var/log/radvd.log]
423+ send_user "\n=== radvd.log ===\n$radvd_log\n=== end of radvd.log ===\n"
424+ }
418425 fail "Ping from ED_1 to Internet Server succeeded, but it was expected to fail"
419426}
420427
421428# Check if tcpdump captured any packet
422- sleep 5
429+ sleep 9
423430set tcpdump_log [exec docker exec -i $eth2_server cat /var/log/tcpdump.log]
424431send_user "tcpdump log on eth2-server:\n$tcpdump_log\n"
425432if {![string match "*listening on*" $tcpdump_log]} {
@@ -435,8 +442,8 @@ send_user "Step 11: Reconfiguring radvd to start advertising default route again
435442catch {exec docker exec -i $eth2_server pkill radvd}
436443set 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};"
437444exec 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
445+ start_radvd $eth2_server
446+ sleep 4
440447
441448# Step 12: Verify default route is advertised in Thread Network Data
442449send_user "Step 12: Verifying default route is advertised in Thread Network Data again...\n"
0 commit comments