1*8becfe16SDmitry Skorodumov#!/bin/bash 2*8becfe16SDmitry Skorodumov# SPDX-License-Identifier: GPL-2.0 3*8becfe16SDmitry Skorodumov# 4*8becfe16SDmitry Skorodumov# Simple tests for ipvtap 5*8becfe16SDmitry Skorodumov 6*8becfe16SDmitry Skorodumov 7*8becfe16SDmitry Skorodumov# 8*8becfe16SDmitry Skorodumov# The testing environment looks this way: 9*8becfe16SDmitry Skorodumov# 10*8becfe16SDmitry Skorodumov# |------HNS-------| |------PHY-------| 11*8becfe16SDmitry Skorodumov# | veth<----------------->veth | 12*8becfe16SDmitry Skorodumov# |------|--|------| |----------------| 13*8becfe16SDmitry Skorodumov# | | 14*8becfe16SDmitry Skorodumov# | | |-----TST0-------| 15*8becfe16SDmitry Skorodumov# | |------------|----ipvlan | 16*8becfe16SDmitry Skorodumov# | |----------------| 17*8becfe16SDmitry Skorodumov# | 18*8becfe16SDmitry Skorodumov# | |-----TST1-------| 19*8becfe16SDmitry Skorodumov# |---------------|----ipvlan | 20*8becfe16SDmitry Skorodumov# |----------------| 21*8becfe16SDmitry Skorodumov# 22*8becfe16SDmitry Skorodumov 23*8becfe16SDmitry SkorodumovALL_TESTS=" 24*8becfe16SDmitry Skorodumov test_ip_set 25*8becfe16SDmitry Skorodumov" 26*8becfe16SDmitry Skorodumov 27*8becfe16SDmitry Skorodumovsource lib.sh 28*8becfe16SDmitry Skorodumov 29*8becfe16SDmitry SkorodumovDEBUG=0 30*8becfe16SDmitry Skorodumov 31*8becfe16SDmitry SkorodumovVETH_HOST=vethtst.h 32*8becfe16SDmitry SkorodumovVETH_PHY=vethtst.p 33*8becfe16SDmitry Skorodumov 34*8becfe16SDmitry SkorodumovNS_COUNT=32 35*8becfe16SDmitry SkorodumovIP_ITERATIONS=1024 36*8becfe16SDmitry SkorodumovIPSET_TIMEOUT="60s" 37*8becfe16SDmitry Skorodumov 38*8becfe16SDmitry Skorodumovns_run() { 39*8becfe16SDmitry Skorodumov ns=$1 40*8becfe16SDmitry Skorodumov shift 41*8becfe16SDmitry Skorodumov if [[ "$ns" == "global" ]]; then 42*8becfe16SDmitry Skorodumov "$@" >/dev/null 43*8becfe16SDmitry Skorodumov else 44*8becfe16SDmitry Skorodumov ip netns exec "$ns" "$@" >/dev/null 45*8becfe16SDmitry Skorodumov fi 46*8becfe16SDmitry Skorodumov} 47*8becfe16SDmitry Skorodumov 48*8becfe16SDmitry Skorodumovtest_ip_setup_env() { 49*8becfe16SDmitry Skorodumov setup_ns NS_PHY 50*8becfe16SDmitry Skorodumov setup_ns HST_NS 51*8becfe16SDmitry Skorodumov 52*8becfe16SDmitry Skorodumov # setup simulated other-host (phy) and host itself 53*8becfe16SDmitry Skorodumov ns_run "$HST_NS" ip link add $VETH_HOST type veth peer name $VETH_PHY \ 54*8becfe16SDmitry Skorodumov netns "$NS_PHY" >/dev/null 55*8becfe16SDmitry Skorodumov ns_run "$HST_NS" ip link set $VETH_HOST up 56*8becfe16SDmitry Skorodumov ns_run "$NS_PHY" ip link set $VETH_PHY up 57*8becfe16SDmitry Skorodumov 58*8becfe16SDmitry Skorodumov for ((i=0; i<NS_COUNT; i++)); do 59*8becfe16SDmitry Skorodumov setup_ns ipvlan_ns_$i 60*8becfe16SDmitry Skorodumov ns="ipvlan_ns_$i" 61*8becfe16SDmitry Skorodumov if [ "$DEBUG" = "1" ]; then 62*8becfe16SDmitry Skorodumov echo "created NS ${!ns}" 63*8becfe16SDmitry Skorodumov fi 64*8becfe16SDmitry Skorodumov if ! ns_run "$HST_NS" ip link add netns ${!ns} ipvlan0 \ 65*8becfe16SDmitry Skorodumov link $VETH_HOST \ 66*8becfe16SDmitry Skorodumov type ipvtap mode l2 bridge; then 67*8becfe16SDmitry Skorodumov exit_error "FAIL: Failed to configure ipvlan link." 68*8becfe16SDmitry Skorodumov fi 69*8becfe16SDmitry Skorodumov done 70*8becfe16SDmitry Skorodumov} 71*8becfe16SDmitry Skorodumov 72*8becfe16SDmitry Skorodumovtest_ip_cleanup_env() { 73*8becfe16SDmitry Skorodumov ns_run "$HST_NS" ip link del $VETH_HOST 74*8becfe16SDmitry Skorodumov cleanup_all_ns 75*8becfe16SDmitry Skorodumov} 76*8becfe16SDmitry Skorodumov 77*8becfe16SDmitry Skorodumovexit_error() { 78*8becfe16SDmitry Skorodumov echo "$1" 79*8becfe16SDmitry Skorodumov exit $ksft_fail 80*8becfe16SDmitry Skorodumov} 81*8becfe16SDmitry Skorodumov 82*8becfe16SDmitry Skorodumovrnd() { 83*8becfe16SDmitry Skorodumov echo $(( RANDOM % 32 + 16 )) 84*8becfe16SDmitry Skorodumov} 85*8becfe16SDmitry Skorodumov 86*8becfe16SDmitry Skorodumovtest_ip_set_thread() { 87*8becfe16SDmitry Skorodumov # Here we are trying to create some IP conflicts between namespaces. 88*8becfe16SDmitry Skorodumov # If just add/remove IP, nothing interesting will happen. 89*8becfe16SDmitry Skorodumov # But if add random IP and then remove random IP, 90*8becfe16SDmitry Skorodumov # eventually conflicts start to apear. 91*8becfe16SDmitry Skorodumov ip link set ipvlan0 up 92*8becfe16SDmitry Skorodumov for ((i=0; i<IP_ITERATIONS; i++)); do 93*8becfe16SDmitry Skorodumov v=$(rnd) 94*8becfe16SDmitry Skorodumov ip a a "172.25.0.$v/24" dev ipvlan0 2>/dev/null 95*8becfe16SDmitry Skorodumov ip a a "fc00::$v/64" dev ipvlan0 2>/dev/null 96*8becfe16SDmitry Skorodumov v=$(rnd) 97*8becfe16SDmitry Skorodumov ip a d "172.25.0.$v/24" dev ipvlan0 2>/dev/null 98*8becfe16SDmitry Skorodumov ip a d "fc00::$v/64" dev ipvlan0 2>/dev/null 99*8becfe16SDmitry Skorodumov done 100*8becfe16SDmitry Skorodumov} 101*8becfe16SDmitry Skorodumov 102*8becfe16SDmitry Skorodumovtest_ip_set() { 103*8becfe16SDmitry Skorodumov RET=0 104*8becfe16SDmitry Skorodumov 105*8becfe16SDmitry Skorodumov trap test_ip_cleanup_env EXIT 106*8becfe16SDmitry Skorodumov 107*8becfe16SDmitry Skorodumov test_ip_setup_env 108*8becfe16SDmitry Skorodumov 109*8becfe16SDmitry Skorodumov declare -A ns_pids 110*8becfe16SDmitry Skorodumov for ((i=0; i<NS_COUNT; i++)); do 111*8becfe16SDmitry Skorodumov ns="ipvlan_ns_$i" 112*8becfe16SDmitry Skorodumov ns_run ${!ns} timeout "$IPSET_TIMEOUT" \ 113*8becfe16SDmitry Skorodumov bash -c "$0 test_ip_set_thread"& 114*8becfe16SDmitry Skorodumov ns_pids[$i]=$! 115*8becfe16SDmitry Skorodumov done 116*8becfe16SDmitry Skorodumov 117*8becfe16SDmitry Skorodumov for ((i=0; i<NS_COUNT; i++)); do 118*8becfe16SDmitry Skorodumov wait "${ns_pids[$i]}" 119*8becfe16SDmitry Skorodumov done 120*8becfe16SDmitry Skorodumov 121*8becfe16SDmitry Skorodumov declare -A all_ips 122*8becfe16SDmitry Skorodumov for ((i=0; i<NS_COUNT; i++)); do 123*8becfe16SDmitry Skorodumov ns="ipvlan_ns_$i" 124*8becfe16SDmitry Skorodumov ip_output=$(ip netns exec ${!ns} ip a l dev ipvlan0 | grep inet) 125*8becfe16SDmitry Skorodumov while IFS= read -r nsip_out; do 126*8becfe16SDmitry Skorodumov if [[ -z $nsip_out ]]; then 127*8becfe16SDmitry Skorodumov continue; 128*8becfe16SDmitry Skorodumov fi 129*8becfe16SDmitry Skorodumov nsip=$(awk '{print $2}' <<< "$nsip_out") 130*8becfe16SDmitry Skorodumov if [[ -v all_ips[$nsip] ]]; then 131*8becfe16SDmitry Skorodumov RET=$ksft_fail 132*8becfe16SDmitry Skorodumov log_test "conflict for $nsip" 133*8becfe16SDmitry Skorodumov return "$RET" 134*8becfe16SDmitry Skorodumov else 135*8becfe16SDmitry Skorodumov all_ips[$nsip]=$i 136*8becfe16SDmitry Skorodumov fi 137*8becfe16SDmitry Skorodumov done <<< "$ip_output" 138*8becfe16SDmitry Skorodumov done 139*8becfe16SDmitry Skorodumov 140*8becfe16SDmitry Skorodumov if [ "$DEBUG" = "1" ]; then 141*8becfe16SDmitry Skorodumov for key in "${!all_ips[@]}"; do 142*8becfe16SDmitry Skorodumov echo "$key: ${all_ips[$key]}" 143*8becfe16SDmitry Skorodumov done 144*8becfe16SDmitry Skorodumov fi 145*8becfe16SDmitry Skorodumov 146*8becfe16SDmitry Skorodumov trap - EXIT 147*8becfe16SDmitry Skorodumov test_ip_cleanup_env 148*8becfe16SDmitry Skorodumov 149*8becfe16SDmitry Skorodumov log_test "test multithreaded ip set" 150*8becfe16SDmitry Skorodumov} 151*8becfe16SDmitry Skorodumov 152*8becfe16SDmitry Skorodumovif [[ "$1" == "-d" ]]; then 153*8becfe16SDmitry Skorodumov DEBUG=1 154*8becfe16SDmitry Skorodumov shift 155*8becfe16SDmitry Skorodumovfi 156*8becfe16SDmitry Skorodumov 157*8becfe16SDmitry Skorodumovif [[ "$1" == "-t" ]]; then 158*8becfe16SDmitry Skorodumov shift 159*8becfe16SDmitry Skorodumov TESTS="$*" 160*8becfe16SDmitry Skorodumovfi 161*8becfe16SDmitry Skorodumov 162*8becfe16SDmitry Skorodumovif [[ "$1" == "test_ip_set_thread" ]]; then 163*8becfe16SDmitry Skorodumov test_ip_set_thread 164*8becfe16SDmitry Skorodumovelse 165*8becfe16SDmitry Skorodumov require_command ip 166*8becfe16SDmitry Skorodumov 167*8becfe16SDmitry Skorodumov tests_run 168*8becfe16SDmitry Skorodumovfi 169