1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4ipv6=true 5 6source ./hsr_common.sh 7 8optstring="h4" 9usage() { 10 echo "Usage: $0 [OPTION]" 11 echo -e "\t-4: IPv4 only: disable IPv6 tests (default: test both IPv4 and IPv6)" 12} 13 14while getopts "$optstring" option;do 15 case "$option" in 16 "h") 17 usage "$0" 18 exit 0 19 ;; 20 "4") 21 ipv6=false 22 ;; 23 "?") 24 usage "$0" 25 exit 1 26 ;; 27esac 28done 29 30setup_prp_interfaces() 31{ 32 echo "INFO: Preparing interfaces for PRP" 33# Two PRP nodes, connected by two links (treated as LAN A and LAN B). 34# 35# vethA ----- vethA 36# prp1 prp2 37# vethB ----- vethB 38# 39# node1 node2 40 41 # Interfaces 42 # shellcheck disable=SC2154 # variables assigned by setup_ns 43 ip link add vethA netns "$node1" type veth peer name vethA netns "$node2" 44 ip link add vethB netns "$node1" type veth peer name vethB netns "$node2" 45 46 # MAC addresses will be copied from LAN A interface 47 ip -net "$node1" link set address 00:11:22:00:00:01 dev vethA 48 ip -net "$node2" link set address 00:11:22:00:00:02 dev vethA 49 50 # PRP 51 ip -net "$node1" link add name prp1 type hsr \ 52 slave1 vethA slave2 vethB supervision 45 proto 1 53 ip -net "$node2" link add name prp2 type hsr \ 54 slave1 vethA slave2 vethB supervision 45 proto 1 55 56 # IP addresses 57 ip -net "$node1" addr add 100.64.0.1/24 dev prp1 58 ip -net "$node1" addr add dead:beef:0::1/64 dev prp1 nodad 59 ip -net "$node2" addr add 100.64.0.2/24 dev prp2 60 ip -net "$node2" addr add dead:beef:0::2/64 dev prp2 nodad 61 62 # All links up 63 ip -net "$node1" link set vethA up 64 ip -net "$node1" link set vethB up 65 ip -net "$node1" link set prp1 up 66 67 ip -net "$node2" link set vethA up 68 ip -net "$node2" link set vethB up 69 ip -net "$node2" link set prp2 up 70} 71 72setup_vlan_interfaces() 73{ 74 # Interfaces 75 ip -net "$node1" link add link prp1 name prp1.2 type vlan id 2 76 ip -net "$node2" link add link prp2 name prp2.2 type vlan id 2 77 78 # IP addresses 79 ip -net "$node1" addr add 100.64.2.1/24 dev prp1.2 80 ip -net "$node1" addr add dead:beef:2::1/64 dev prp1.2 nodad 81 82 ip -net "$node2" addr add 100.64.2.2/24 dev prp2.2 83 ip -net "$node2" addr add dead:beef:2::2/64 dev prp2.2 nodad 84 85 # All links up 86 ip -net "$node1" link set prp1.2 up 87 ip -net "$node2" link set prp2.2 up 88} 89 90do_ping_tests() 91{ 92 local netid="$1" 93 94 echo "INFO: Initial validation ping" 95 96 do_ping "$node1" "100.64.$netid.2" 97 do_ping "$node2" "100.64.$netid.1" 98 stop_if_error "Initial validation failed on IPv4" 99 100 do_ping "$node1" "dead:beef:$netid::2" 101 do_ping "$node2" "dead:beef:$netid::1" 102 stop_if_error "Initial validation failed on IPv6" 103 104 echo "INFO: Longer ping test." 105 106 do_ping_long "$node1" "100.64.$netid.2" 107 do_ping_long "$node2" "100.64.$netid.1" 108 stop_if_error "Longer ping test failed on IPv4." 109 110 do_ping_long "$node1" "dead:beef:$netid::2" 111 do_ping_long "$node2" "dead:beef:$netid::1" 112 stop_if_error "Longer ping test failed on IPv6." 113} 114 115run_ping_tests() 116{ 117 echo "INFO: Running ping tests" 118 do_ping_tests 0 119} 120 121run_vlan_ping_tests() 122{ 123 vlan_challenged_prp1=$(ip net exec "$node1" ethtool -k prp1 | \ 124 grep "vlan-challenged" | awk '{print $2}') 125 vlan_challenged_prp2=$(ip net exec "$node2" ethtool -k prp2 | \ 126 grep "vlan-challenged" | awk '{print $2}') 127 128 if [[ "$vlan_challenged_prp1" = "off" || \ 129 "$vlan_challenged_prp2" = "off" ]]; then 130 echo "INFO: Running VLAN ping tests" 131 setup_vlan_interfaces 132 do_ping_tests 2 133 else 134 echo "INFO: Not Running VLAN tests as the device does not support VLAN" 135 fi 136} 137 138check_prerequisites 139trap cleanup_all_ns EXIT 140 141setup_ns node1 node2 142setup_prp_interfaces 143 144run_ping_tests 145run_vlan_ping_tests 146 147exit $ret 148