1 #!/bin/bash 2 # SPDX-License-Identifier: GPL-2.0 3 4 # Test routing after VXLAN decapsulation and verify that the order of 5 # configuration does not impact switch behavior. Verify that RIF is added 6 # 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 51 lib_dir=$(dirname $0)/../../../net/forwarding 52 53 ALL_TESTS=" 54 vni_fid_map_rif 55 rif_vni_fid_map 56 " 57 58 NUM_NETIFS=4 59 source $lib_dir/lib.sh 60 source $lib_dir/tc_common.sh 61 source $lib_dir/devlink_lib.sh 62 63 : ${VXPORT:=4789} 64 export VXPORT 65 66 h1_create() 67 { 68 simple_if_init $h1 192.0.2.1/28 69 } 70 71 h1_destroy() 72 { 73 simple_if_fini $h1 192.0.2.1/28 74 } 75 76 switch_create() 77 { 78 ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \ 79 mcast_snooping 0 80 # Make sure the bridge uses the MAC address of the local port and not 81 # that of the VxLAN's device. 82 ip link set dev br1 address $(mac_get $swp1) 83 ip link set dev br1 up 84 85 ip link set dev $rp1 up 86 ip address add dev $rp1 198.51.100.1/24 87 88 ip link set dev $swp1 master br1 89 ip link set dev $swp1 up 90 bridge vlan add vid 10 dev $swp1 pvid untagged 91 92 tc qdisc add dev $swp1 clsact 93 94 ip link add name vx4001 type vxlan id 104001 \ 95 local 192.0.2.17 dstport $VXPORT \ 96 nolearning noudpcsum tos inherit ttl 100 97 ip link set dev vx4001 up 98 99 ip link set dev vx4001 master br1 100 101 ip address add 192.0.2.17/32 dev lo 102 103 # Create SVIs. 104 vrf_create "vrf-green" 105 ip link set dev vrf-green up 106 107 ip link add link br1 name vlan10 up master vrf-green type vlan id 10 108 109 # Replace neighbor to avoid 1 packet which is forwarded in software due 110 # 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 vlan10 114 115 bridge vlan add vid 10 dev br1 self 116 bridge vlan add vid 4001 dev br1 self 117 118 sysctl_set net.ipv4.conf.all.rp_filter 0 119 } 120 121 switch_destroy() 122 { 123 sysctl_restore net.ipv4.conf.all.rp_filter 124 125 bridge vlan del vid 4001 dev br1 self 126 bridge vlan del vid 10 dev br1 self 127 128 ip link del dev vlan10 129 130 vrf_destroy "vrf-green" 131 132 ip address del 192.0.2.17/32 dev lo 133 134 tc qdisc del dev $swp1 clsact 135 136 bridge vlan del vid 10 dev $swp1 137 ip link set dev $swp1 down 138 ip link set dev $swp1 nomaster 139 140 ip link set dev vx4001 nomaster 141 142 ip link set dev vx4001 down 143 ip link del dev vx4001 144 145 ip address del dev $rp1 198.51.100.1/24 146 ip link set dev $rp1 down 147 148 ip link set dev br1 down 149 ip link del dev br1 150 } 151 152 vrp2_create() 153 { 154 simple_if_init $rp2 198.51.100.2/24 155 156 ip route add 192.0.2.17/32 vrf v$rp2 nexthop via 198.51.100.1 157 } 158 159 vrp2_destroy() 160 { 161 ip route del 192.0.2.17/32 vrf v$rp2 nexthop via 198.51.100.1 162 163 simple_if_fini $rp2 198.51.100.2/24 164 } 165 166 setup_prepare() 167 { 168 h1=${NETIFS[p1]} 169 swp1=${NETIFS[p2]} 170 171 rp1=${NETIFS[p3]} 172 rp2=${NETIFS[p4]} 173 174 vrf_prepare 175 forwarding_enable 176 177 h1_create 178 switch_create 179 180 vrp2_create 181 } 182 183 cleanup() 184 { 185 pre_cleanup 186 187 vrp2_destroy 188 189 switch_destroy 190 h1_destroy 191 192 forwarding_restore 193 vrf_cleanup 194 } 195 196 payload_get() 197 { 198 local dest_mac=$(mac_get vlan4001) 199 local src_mac=$(mac_get $rp1) 200 201 p=$(: 202 )"08:"$( : VXLAN flags 203 )"00:00:00:"$( : VXLAN reserved 204 )"01:96:41:"$( : VXLAN VNI : 104001 205 )"00:"$( : VXLAN reserved 206 )"$dest_mac:"$( : ETH daddr 207 )"$src_mac:"$( : ETH saddr 208 )"08:00:"$( : ETH type 209 )"45:"$( : IP version + IHL 210 )"00:"$( : IP TOS 211 )"00:54:"$( : IP total length 212 )"3f:49:"$( : IP identification 213 )"00:00:"$( : IP flags + frag off 214 )"3f:"$( : IP TTL 215 )"01:"$( : IP proto 216 )"50:21:"$( : IP header csum 217 )"c6:33:64:0a:"$( : IP saddr: 198.51.100.10 218 )"c0:00:02:01:"$( : IP daddr: 192.0.2.1 219 ) 220 echo $p 221 } 222 223 vlan_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 4001 229 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 237 vlan_rif_del() 238 { 239 ip link del dev vlan4001 240 } 241 242 vni_fid_map_rif() 243 { 244 local rp1_mac=$(mac_get $rp1) 245 246 RET=0 247 248 # First add VNI->FID mapping to the FID of VLAN 4001 249 bridge vlan add vid 4001 dev vx4001 pvid untagged 250 251 # Add a RIF to the FID with VNI->FID mapping 252 vlan_rif_add 253 254 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \ 255 flower skip_sw dst_ip 192.0.2.1 action pass 256 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 -q 261 262 tc_check_at_least_x_packets "dev $swp1 egress" 101 10 263 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 egress 268 269 bridge vlan del vid 4001 dev vx4001 pvid untagged 270 vlan_rif_del 271 } 272 273 rif_vni_fid_map() 274 { 275 local rp1_mac=$(mac_get $rp1) 276 277 RET=0 278 279 # First add a RIF to the FID of VLAN 4001 280 vlan_rif_add 281 282 # Add VNI->FID mapping to FID with a RIF 283 bridge vlan add vid 4001 dev vx4001 pvid untagged 284 285 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \ 286 flower skip_sw dst_ip 192.0.2.1 action pass 287 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 -q 292 293 tc_check_at_least_x_packets "dev $swp1 egress" 101 10 294 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 egress 299 300 bridge vlan del vid 4001 dev vx4001 pvid untagged 301 vlan_rif_del 302 } 303 304 trap cleanup EXIT 305 306 setup_prepare 307 setup_wait 308 309 tests_run 310 311 exit $EXIT_STATUS
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.