| #!/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 |