1#!/bin/ksh 2# $Id: vxlan_2.sh,v 1.2 2016/11/30 22:21:20 vgross Exp $ 3 4 5CAPFILE=$(mktemp -t regress_vxlan.XXXXXXX) 6 7 8CURDIR=$(cd $(dirname $0); pwd) 9 10 11cleanup() { 12 for ifname in $CLEANUP_IFS; do 13 $SUDO ifconfig $ifname down 14 done 15 for ifname in $CLEANUP_IFS; do 16 $SUDO ifconfig $ifname destroy 17 done 18 rm $CAPFILE 19} 20 21do_ping() 22{ 23 local source="$1" 24 local dest="${VXLAN_NETID}${2}" 25 $PING -q -c 3 -w 1 -V "$source" "$dest" | grep -q ' 0.0% packet loss' && return 26 echo "Failed to ping $dest from vstack $source" 27 STATUS=1 28} 29 30cross_ping() { 31 local tcpdump_expr='udp src port 4789 and dst port 4789 and (ether multicast or ip multicast)' 32 local nomcast= 33 [[ $1 == nomcast ]] && nomcast=1 && shift 34 echo "cross_ping: vstacks=$@, ping=$PING, nomcast=$nomcast" 35 while [[ $# -gt 1 ]]; do 36 local source=$1 ; shift 37 :> $CAPFILE 38 if [[ -n $nomcast ]]; then 39 $SUDO tcpdump -i pair${source}0 -n -s 512 -w $CAPFILE "$tcpdump_expr" 2> /dev/null & 40 while ! [[ -s $CAPFILE ]]; do :; done 41 fi 42 for target in $@ ; do 43 do_ping $source $target 44 done 45 sleep 1 46 if [[ -n $nomcast ]]; then 47 $SUDO pkill -f "tcpdump -i pair${source}0 -n" 48 wait 49 if $SUDO tcpdump -s 512 -nr $CAPFILE | grep '.'; then 50 echo "Multicast traffic detected when pinging from rdomain $1" 51 STATUS=1 52 fi 53 fi 54 done 55} 56 57test_inet6() 58{ 59 VXLAN_NETID="fd42::" 60 PING=ping6 61 for vstack in "$@"; do 62 $SUDO ifconfig "vxlan$vstack" inet6 "${VXLAN_NETID}${vstack}/64" 63 done 64 sleep 2 # sleep off DAD 65 cross_ping "$@" 66 [[ -n $DYNAMIC ]] && cross_ping ${DYNAMIC:+nomcast} "$@" 67 for vstack in "$@"; do 68 $SUDO ifconfig "vxlan$vstack" inet6 "${VXLAN_NETID}${vstack}/64" delete 69 done 70} 71 72test_inet() 73{ 74 VXLAN_NETID="10.42.0." 75 PING=ping 76 for vstack in "$@"; do 77 $SUDO ifconfig "vxlan$vstack" inet "${VXLAN_NETID}${vstack}/24" 78 done 79 cross_ping "$@" 80 [[ -n $DYNAMIC ]] && cross_ping ${DYNAMIC:+nomcast} "$@" 81 for vstack in "$@"; do 82 $SUDO ifconfig "vxlan$vstack" inet "${VXLAN_NETID}${vstack}/24" delete 83 done 84} 85 86vstack_add() { 87 local vstack=$1 88 local vstack_pairname="pair${vstack}0" 89 local vstack_tunsrc="${PAIR_NETID}${vstack}" 90 [[ $AF == inet6 ]] && tundst_sufx="%${vstack_pairname}" 91 92 for ifname in "$vstack_pairname" "vxlan$vstack" "bridge$vstack"; do 93 iface_exists $ifname && abort_test "interface $ifname already exists" 94 CLEANUP_IFS="$ifname $CLEANUP_IFS" 95 done 96 $SUDO ifconfig "$vstack_pairname" rdomain "$vstack" $IFCONFIG_OPTS 97 $SUDO ifconfig "$vstack_pairname" "$AF" "${vstack_tunsrc}${PAIR_PREFX}" up 98 $SUDO ifconfig "vxlan$vstack" rdomain "$vstack" tunneldomain "$vstack" $IFCONFIG_OPTS 99 $SUDO ifconfig "vxlan$vstack" vnetid "$VNETID" tunnel "$vstack_tunsrc" "${VXLAN_TUNDST}${tundst_sufx}" up 100 [[ -n $DYNAMIC ]] && $SUDO ifconfig "bridge$vstack" rdomain "$vstack" add "vxlan$vstack" $IFCONFIG_OPTS up 101} 102 103 104. ${CURDIR}/vxlan_subr 105 106VNETID=0 107for rdom in $RDOMAINS; do 108 rdomain_is_used $rdom || abort_test "rdomain $rdom already in use" 109 [[ $rdom -ge $VNETID ]] && VNETID=$(( rdom + 1 )) 110done 111 112rdomain_is_used $VNETID || abort_test "rdomain $rdom already in use" 113iface_exists "bridge$VNETID" && abort_test "interface bridge${VNETID} already exists" 114$SUDO ifconfig "bridge$VNETID" rdomain "$VNETID" $IFCONFIG_OPTS up 115 116case $AF in 117 inet) 118 PAIR_NETID="10.23.0." 119 PAIR_PREFX="/24" 120 VXLAN_TUNDST="224.0.2.$VNETID" 121 ;; 122 inet6) 123 PAIR_NETID="fd23::" 124 PAIR_PREFX="/64" 125 VXLAN_TUNDST="ff02::$VNETID" 126 ;; 127 *) 128 echo "Unknown AF $AF !" 129 exit 1 130esac 131 132trap cleanup 0 1 2 3 15 133 134for id in $RDOMAINS; do 135 vstack_add $id 136 iface_exists "pair${id}1" && abort_test "interface pair${id}1 already exists" 137 $SUDO ifconfig "pair${id}1" rdomain $VNETID $IFCONFIG_OPTS up 138 CLEANUP_IFS="pair${id}1 $CLEANUP_IFS" 139 $SUDO ifconfig "pair${id}1" patch "pair${id}0" 140 $SUDO ifconfig "bridge$VNETID" add "pair${id}1" 141done 142 143CLEANUP_IFS="bridge$VNETID $CLEANUP_IFS" 144 145STATUS=0 146 147test_inet $RDOMAINS 148 149test_inet6 $RDOMAINS 150 151exit $STATUS 152