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