312 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# Test routing after VXLAN decapsulation and verify that the order of5# configuration does not impact switch behavior. Verify that RIF is added6# correctly for existing mapping and that new mapping uses the correct RIF.7 8# +---------------------------+9# | H1 |10# | + $h1 |11# | | 192.0.2.1/28 |12# +----|----------------------+13# |14# +----|----------------------------------------------------------------------+15# | SW | |16# | +--|--------------------------------------------------------------------+ |17# | | + $swp1 br1 | |18# | | vid 10 pvid untagged | |19# | | | |20# | | | |21# | | + vx4001 | |22# | | local 192.0.2.17 | |23# | | remote 192.0.2.18 | |24# | | id 104001 | |25# | | dstport $VXPORT | |26# | | vid 4001 pvid untagged | |27# | | | |28# | +----------------------------------+------------------------------------+ |29# | | |30# | +----------------------------------|------------------------------------+ |31# | | | | |32# | | +-------------------------------+---------------------------------+ | |33# | | | | | |34# | | + vlan10 vlan4001 + | |35# | | 192.0.2.2/28 | |36# | | | |37# | | vrf-green | |38# | +-----------------------------------------------------------------------+ |39# | |40# | + $rp1 +lo |41# | | 198.51.100.1/24 192.0.2.17/32 |42# +----|----------------------------------------------------------------------+43# |44# +----|--------------------------------------------------------+45# | | v$rp2 |46# | + $rp2 |47# | 198.51.100.2/24 |48# | |49# +-------------------------------------------------------------+50 51lib_dir=$(dirname $0)/../../../net/forwarding52 53ALL_TESTS="54 vni_fid_map_rif55 rif_vni_fid_map56"57 58NUM_NETIFS=459source $lib_dir/lib.sh60source $lib_dir/tc_common.sh61source $lib_dir/devlink_lib.sh62 63: ${VXPORT:=4789}64export VXPORT65 66h1_create()67{68 simple_if_init $h1 192.0.2.1/2869}70 71h1_destroy()72{73 simple_if_fini $h1 192.0.2.1/2874}75 76switch_create()77{78 ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \79 mcast_snooping 080 # Make sure the bridge uses the MAC address of the local port and not81 # that of the VxLAN's device.82 ip link set dev br1 address $(mac_get $swp1)83 ip link set dev br1 up84 85 ip link set dev $rp1 up86 ip address add dev $rp1 198.51.100.1/2487 88 ip link set dev $swp1 master br189 ip link set dev $swp1 up90 bridge vlan add vid 10 dev $swp1 pvid untagged91 92 tc qdisc add dev $swp1 clsact93 94 ip link add name vx4001 type vxlan id 104001 \95 local 192.0.2.17 dstport $VXPORT \96 nolearning noudpcsum tos inherit ttl 10097 ip link set dev vx4001 up98 99 ip link set dev vx4001 master br1100 101 ip address add 192.0.2.17/32 dev lo102 103 # Create SVIs.104 vrf_create "vrf-green"105 ip link set dev vrf-green up106 107 ip link add link br1 name vlan10 up master vrf-green type vlan id 10108 109 # Replace neighbor to avoid 1 packet which is forwarded in software due110 # to "unresolved neigh".111 ip neigh replace dev vlan10 192.0.2.1 lladdr $(mac_get $h1)112 113 ip address add 192.0.2.2/28 dev vlan10114 115 bridge vlan add vid 10 dev br1 self116 bridge vlan add vid 4001 dev br1 self117 118 sysctl_set net.ipv4.conf.all.rp_filter 0119}120 121switch_destroy()122{123 sysctl_restore net.ipv4.conf.all.rp_filter124 125 bridge vlan del vid 4001 dev br1 self126 bridge vlan del vid 10 dev br1 self127 128 ip link del dev vlan10129 130 vrf_destroy "vrf-green"131 132 ip address del 192.0.2.17/32 dev lo133 134 tc qdisc del dev $swp1 clsact135 136 bridge vlan del vid 10 dev $swp1137 ip link set dev $swp1 down138 ip link set dev $swp1 nomaster139 140 ip link set dev vx4001 nomaster141 142 ip link set dev vx4001 down143 ip link del dev vx4001144 145 ip address del dev $rp1 198.51.100.1/24146 ip link set dev $rp1 down147 148 ip link set dev br1 down149 ip link del dev br1150}151 152vrp2_create()153{154 simple_if_init $rp2 198.51.100.2/24155 156 ip route add 192.0.2.17/32 vrf v$rp2 nexthop via 198.51.100.1157}158 159vrp2_destroy()160{161 ip route del 192.0.2.17/32 vrf v$rp2 nexthop via 198.51.100.1162 163 simple_if_fini $rp2 198.51.100.2/24164}165 166setup_prepare()167{168 h1=${NETIFS[p1]}169 swp1=${NETIFS[p2]}170 171 rp1=${NETIFS[p3]}172 rp2=${NETIFS[p4]}173 174 vrf_prepare175 forwarding_enable176 177 h1_create178 switch_create179 180 vrp2_create181}182 183cleanup()184{185 pre_cleanup186 187 vrp2_destroy188 189 switch_destroy190 h1_destroy191 192 forwarding_restore193 vrf_cleanup194}195 196payload_get()197{198 local dest_mac=$(mac_get vlan4001)199 local src_mac=$(mac_get $rp1)200 201 p=$(:202 )"08:"$( : VXLAN flags203 )"00:00:00:"$( : VXLAN reserved204 )"01:96:41:"$( : VXLAN VNI : 104001205 )"00:"$( : VXLAN reserved206 )"$dest_mac:"$( : ETH daddr207 )"$src_mac:"$( : ETH saddr208 )"08:00:"$( : ETH type209 )"45:"$( : IP version + IHL210 )"00:"$( : IP TOS211 )"00:54:"$( : IP total length212 )"3f:49:"$( : IP identification213 )"00:00:"$( : IP flags + frag off214 )"3f:"$( : IP TTL215 )"01:"$( : IP proto216 )"50:21:"$( : IP header csum217 )"c6:33:64:0a:"$( : IP saddr: 198.51.100.10218 )"c0:00:02:01:"$( : IP daddr: 192.0.2.1219 )220 echo $p221}222 223vlan_rif_add()224{225 rifs_occ_t0=$(devlink_resource_occ_get rifs)226 227 ip link add link br1 name vlan4001 up master vrf-green \228 type vlan id 4001229 230 rifs_occ_t1=$(devlink_resource_occ_get rifs)231 expected_rifs=$((rifs_occ_t0 + 1))232 233 [[ $expected_rifs -eq $rifs_occ_t1 ]]234 check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"235}236 237vlan_rif_del()238{239 ip link del dev vlan4001240}241 242vni_fid_map_rif()243{244 local rp1_mac=$(mac_get $rp1)245 246 RET=0247 248 # First add VNI->FID mapping to the FID of VLAN 4001249 bridge vlan add vid 4001 dev vx4001 pvid untagged250 251 # Add a RIF to the FID with VNI->FID mapping252 vlan_rif_add253 254 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \255 flower skip_sw dst_ip 192.0.2.1 action pass256 257 payload=$(payload_get)258 ip vrf exec v$rp2 $MZ $rp2 -c 10 -d 1msec -b $rp1_mac \259 -B 192.0.2.17 -A 192.0.2.18 \260 -t udp sp=12345,dp=$VXPORT,p=$payload -q261 262 tc_check_at_least_x_packets "dev $swp1 egress" 101 10263 check_err $? "Packets were not routed in hardware"264 265 log_test "Add RIF for existing VNI->FID mapping"266 267 tc filter del dev $swp1 egress268 269 bridge vlan del vid 4001 dev vx4001 pvid untagged270 vlan_rif_del271}272 273rif_vni_fid_map()274{275 local rp1_mac=$(mac_get $rp1)276 277 RET=0278 279 # First add a RIF to the FID of VLAN 4001280 vlan_rif_add281 282 # Add VNI->FID mapping to FID with a RIF283 bridge vlan add vid 4001 dev vx4001 pvid untagged284 285 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \286 flower skip_sw dst_ip 192.0.2.1 action pass287 288 payload=$(payload_get)289 ip vrf exec v$rp2 $MZ $rp2 -c 10 -d 1msec -b $rp1_mac \290 -B 192.0.2.17 -A 192.0.2.18 \291 -t udp sp=12345,dp=$VXPORT,p=$payload -q292 293 tc_check_at_least_x_packets "dev $swp1 egress" 101 10294 check_err $? "Packets were not routed in hardware"295 296 log_test "Add VNI->FID mapping for FID with a RIF"297 298 tc filter del dev $swp1 egress299 300 bridge vlan del vid 4001 dev vx4001 pvid untagged301 vlan_rif_del302}303 304trap cleanup EXIT305 306setup_prepare307setup_wait308 309tests_run310 311exit $EXIT_STATUS312