#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # # Test IPv6 force_forwarding interface property # # This test verifies that the force_forwarding property works correctly: # - When global forwarding is disabled, packets are not forwarded normally # - When force_forwarding is enabled on an interface, packets are forwarded # regardless of the global forwarding setting source lib.sh cleanup() { cleanup_ns $ns1 $ns2 $ns3 } trap cleanup EXIT setup_test() { # Create three namespaces: sender, router, receiver setup_ns ns1 ns2 ns3 # Create veth pairs: ns1 <-> ns2 <-> ns3 ip link add name veth12 type veth peer name veth21 ip link add name veth23 type veth peer name veth32 # Move interfaces to namespaces ip link set veth12 netns $ns1 ip link set veth21 netns $ns2 ip link set veth23 netns $ns2 ip link set veth32 netns $ns3 # Configure interfaces ip -n $ns1 addr add 2001:db8:1::1/64 dev veth12 nodad ip -n $ns2 addr add 2001:db8:1::2/64 dev veth21 nodad ip -n $ns2 addr add 2001:db8:2::1/64 dev veth23 nodad ip -n $ns3 addr add 2001:db8:2::2/64 dev veth32 nodad # Bring up interfaces ip -n $ns1 link set veth12 up ip -n $ns2 link set veth21 up ip -n $ns2 link set veth23 up ip -n $ns3 link set veth32 up # Add routes ip -n $ns1 route add 2001:db8:2::/64 via 2001:db8:1::2 ip -n $ns3 route add 2001:db8:1::/64 via 2001:db8:2::1 # Disable global forwarding ip netns exec $ns2 sysctl -qw net.ipv6.conf.all.forwarding=0 } test_force_forwarding() { local ret=0 echo "TEST: force_forwarding functionality" # Check if force_forwarding sysctl exists if ! ip netns exec $ns2 test -f /proc/sys/net/ipv6/conf/veth21/force_forwarding; then echo "SKIP: force_forwarding not available" return $ksft_skip fi # Test 1: Without force_forwarding, ping should fail ip netns exec $ns2 sysctl -qw net.ipv6.conf.veth21.force_forwarding=0 ip netns exec $ns2 sysctl -qw net.ipv6.conf.veth23.force_forwarding=0 if ip netns exec $ns1 ping -6 -c 1 -W 2 2001:db8:2::2 &>/dev/null; then echo "FAIL: ping succeeded when forwarding disabled" ret=1 else echo "PASS: forwarding disabled correctly" fi # Test 2: With force_forwarding enabled, ping should succeed ip netns exec $ns2 sysctl -qw net.ipv6.conf.veth21.force_forwarding=1 ip netns exec $ns2 sysctl -qw net.ipv6.conf.veth23.force_forwarding=1 if ip netns exec $ns1 ping -6 -c 1 -W 2 2001:db8:2::2 &>/dev/null; then echo "PASS: force_forwarding enabled forwarding" else echo "FAIL: ping failed with force_forwarding enabled" ret=1 fi return $ret } echo "IPv6 force_forwarding test" echo "==========================" setup_test test_force_forwarding ret=$? if [ $ret -eq 0 ]; then echo "OK" exit 0 elif [ $ret -eq $ksft_skip ]; then echo "SKIP" exit $ksft_skip else echo "FAIL" exit 1 fi