#!/bin/bash # SPDX-License-Identifier: GPL-2.0 ipv6=true source ./hsr_common.sh optstring="h4" usage() { echo "Usage: $0 [OPTION]" echo -e "\t-4: IPv4 only: disable IPv6 tests (default: test both IPv4 and IPv6)" } while getopts "$optstring" option;do case "$option" in "h") usage "$0" exit 0 ;; "4") ipv6=false ;; "?") usage "$0" exit 1 ;; esac done setup_prp_interfaces() { echo "INFO: Preparing interfaces for PRP" # Two PRP nodes, connected by two links (treated as LAN A and LAN B). # # vethA ----- vethA # prp1 prp2 # vethB ----- vethB # # node1 node2 # Interfaces # shellcheck disable=SC2154 # variables assigned by setup_ns ip link add vethA netns "$node1" type veth peer name vethA netns "$node2" ip link add vethB netns "$node1" type veth peer name vethB netns "$node2" # MAC addresses will be copied from LAN A interface ip -net "$node1" link set address 00:11:22:00:00:01 dev vethA ip -net "$node2" link set address 00:11:22:00:00:02 dev vethA # PRP ip -net "$node1" link add name prp1 type hsr \ slave1 vethA slave2 vethB supervision 45 proto 1 ip -net "$node2" link add name prp2 type hsr \ slave1 vethA slave2 vethB supervision 45 proto 1 # IP addresses ip -net "$node1" addr add 100.64.0.1/24 dev prp1 ip -net "$node1" addr add dead:beef:0::1/64 dev prp1 nodad ip -net "$node2" addr add 100.64.0.2/24 dev prp2 ip -net "$node2" addr add dead:beef:0::2/64 dev prp2 nodad # All links up ip -net "$node1" link set vethA up ip -net "$node1" link set vethB up ip -net "$node1" link set prp1 up ip -net "$node2" link set vethA up ip -net "$node2" link set vethB up ip -net "$node2" link set prp2 up } setup_vlan_interfaces() { # Interfaces ip -net "$node1" link add link prp1 name prp1.2 type vlan id 2 ip -net "$node2" link add link prp2 name prp2.2 type vlan id 2 # IP addresses ip -net "$node1" addr add 100.64.2.1/24 dev prp1.2 ip -net "$node1" addr add dead:beef:2::1/64 dev prp1.2 nodad ip -net "$node2" addr add 100.64.2.2/24 dev prp2.2 ip -net "$node2" addr add dead:beef:2::2/64 dev prp2.2 nodad # All links up ip -net "$node1" link set prp1.2 up ip -net "$node2" link set prp2.2 up } do_ping_tests() { local netid="$1" echo "INFO: Initial validation ping" do_ping "$node1" "100.64.$netid.2" do_ping "$node2" "100.64.$netid.1" stop_if_error "Initial validation failed on IPv4" do_ping "$node1" "dead:beef:$netid::2" do_ping "$node2" "dead:beef:$netid::1" stop_if_error "Initial validation failed on IPv6" echo "INFO: Longer ping test." do_ping_long "$node1" "100.64.$netid.2" do_ping_long "$node2" "100.64.$netid.1" stop_if_error "Longer ping test failed on IPv4." do_ping_long "$node1" "dead:beef:$netid::2" do_ping_long "$node2" "dead:beef:$netid::1" stop_if_error "Longer ping test failed on IPv6." } run_ping_tests() { echo "INFO: Running ping tests" do_ping_tests 0 } run_vlan_ping_tests() { vlan_challenged_prp1=$(ip net exec "$node1" ethtool -k prp1 | \ grep "vlan-challenged" | awk '{print $2}') vlan_challenged_prp2=$(ip net exec "$node2" ethtool -k prp2 | \ grep "vlan-challenged" | awk '{print $2}') if [[ "$vlan_challenged_prp1" = "off" || \ "$vlan_challenged_prp2" = "off" ]]; then echo "INFO: Running VLAN ping tests" setup_vlan_interfaces do_ping_tests 2 else echo "INFO: Not Running VLAN tests as the device does not support VLAN" fi } check_prerequisites trap cleanup_all_ns EXIT setup_ns node1 node2 setup_prp_interfaces run_ping_tests run_vlan_ping_tests exit $ret