1 #!/bin/bash 2 # SPDX-License-Identifier: GPL-2.0 3 4 # Test VLAN classification after routing and verify that the order of 5 # configuration does not impact switch behavior. Verify that {RIF, Port}->VID 6 # mapping is added correctly for existing {Port, VID}->FID mapping and that 7 # {RIF, Port}->VID mapping is added correctly for new {Port, VID}->FID mapping. 8 9 # +-------------------+ +--------------------+ 10 # | H1 | | H2 | 11 # | | | | 12 # | $h1.10 + | | + $h2.10 | 13 # | 192.0.2.1/28 | | | | 192.0.2.3/28 | 14 # | | | | | | 15 # | $h1 + | | + $h2 | 16 # +----------------|--+ +--|-----------------+ 17 # | | 18 # +----------------|-------------------------|-----------------+ 19 # | SW $swp1 + + $swp2 | 20 # | | | | 21 # | +--------------|-------------------------|---------------+ | 22 # | | $swp1.10 + + $swp2.10 | | 23 # | | | | 24 # | | br0 | | 25 # | | 192.0.2.2/28 | | 26 # | +--------------------------------------------------------+ | 27 # | | 28 # | $swp3.20 + | 29 # | 192.0.2.17/28 | | 30 # | | | 31 # | $swp3 + | 32 # +---------------|--------------------------------------------+ 33 # | 34 # +---------------|--+ 35 # | $h3 + | 36 # | | | 37 # | $h3.20 + | 38 # | 192.0.2.18/28 | 39 # | | 40 # | H3 | 41 # +------------------+ 42 43 lib_dir=$(dirname $0)/../../../net/forwarding 44 45 ALL_TESTS=" 46 port_vid_map_rif 47 rif_port_vid_map 48 " 49 50 NUM_NETIFS=6 51 source $lib_dir/lib.sh 52 source $lib_dir/tc_common.sh 53 source $lib_dir/devlink_lib.sh 54 55 h1_create() 56 { 57 simple_if_init $h1 58 vlan_create $h1 10 v$h1 192.0.2.1/28 59 60 ip route add 192.0.2.16/28 vrf v$h1 nexthop via 192.0.2.2 61 } 62 63 h1_destroy() 64 { 65 ip route del 192.0.2.16/28 vrf v$h1 nexthop via 192.0.2.2 66 67 vlan_destroy $h1 10 68 simple_if_fini $h1 69 } 70 71 h2_create() 72 { 73 simple_if_init $h2 74 vlan_create $h2 10 v$h2 192.0.2.3/28 75 } 76 77 h2_destroy() 78 { 79 vlan_destroy $h2 10 80 simple_if_fini $h2 81 } 82 83 h3_create() 84 { 85 simple_if_init $h3 86 vlan_create $h3 20 v$h3 192.0.2.18/28 87 88 ip route add 192.0.2.0/28 vrf v$h3 nexthop via 192.0.2.17 89 } 90 91 h3_destroy() 92 { 93 ip route del 192.0.2.0/28 vrf v$h3 nexthop via 192.0.2.17 94 95 vlan_destroy $h3 20 96 simple_if_fini $h3 97 } 98 99 switch_create() 100 { 101 ip link set dev $swp1 up 102 tc qdisc add dev $swp1 clsact 103 104 ip link add dev br0 type bridge mcast_snooping 0 105 106 # By default, a link-local address is generated when netdevice becomes 107 # up. Adding an address to the bridge will cause creating a RIF for it. 108 # Prevent generating link-local address to be able to control when the 109 # RIF is added. 110 sysctl_set net.ipv6.conf.br0.addr_gen_mode 1 111 ip link set dev br0 up 112 113 ip link set dev $swp2 up 114 vlan_create $swp2 10 115 ip link set dev $swp2.10 master br0 116 117 ip link set dev $swp3 up 118 vlan_create $swp3 20 "" 192.0.2.17/28 119 120 # Replace neighbor to avoid 1 packet which is forwarded in software due 121 # to "unresolved neigh". 122 ip neigh replace dev $swp3.20 192.0.2.18 lladdr $(mac_get $h3.20) 123 } 124 125 switch_destroy() 126 { 127 vlan_destroy $swp3 20 128 ip link set dev $swp3 down 129 130 ip link set dev $swp2.10 nomaster 131 vlan_destroy $swp2 10 132 ip link set dev $swp2 down 133 134 ip link set dev br0 down 135 sysctl_restore net.ipv6.conf.br0.addr_gen_mode 136 ip link del dev br0 137 138 tc qdisc del dev $swp1 clsact 139 ip link set dev $swp1 down 140 } 141 142 setup_prepare() 143 { 144 h1=${NETIFS[p1]} 145 swp1=${NETIFS[p2]} 146 147 swp2=${NETIFS[p3]} 148 h2=${NETIFS[p4]} 149 150 swp3=${NETIFS[p5]} 151 h3=${NETIFS[p6]} 152 153 vrf_prepare 154 forwarding_enable 155 156 h1_create 157 h2_create 158 h3_create 159 160 switch_create 161 } 162 163 cleanup() 164 { 165 pre_cleanup 166 167 switch_destroy 168 169 h3_destroy 170 h2_destroy 171 h1_destroy 172 173 forwarding_restore 174 vrf_cleanup 175 } 176 177 bridge_rif_add() 178 { 179 rifs_occ_t0=$(devlink_resource_occ_get rifs) 180 __addr_add_del br0 add 192.0.2.2/28 181 rifs_occ_t1=$(devlink_resource_occ_get rifs) 182 183 expected_rifs=$((rifs_occ_t0 + 1)) 184 185 [[ $expected_rifs -eq $rifs_occ_t1 ]] 186 check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used" 187 188 sleep 1 189 } 190 191 bridge_rif_del() 192 { 193 __addr_add_del br0 del 192.0.2.2/28 194 } 195 196 port_vid_map_rif() 197 { 198 RET=0 199 200 # First add {port, VID}->FID for swp1.10, then add a RIF and verify that 201 # packets get the correct VID after routing. 202 vlan_create $swp1 10 203 ip link set dev $swp1.10 master br0 204 bridge_rif_add 205 206 # Replace neighbor to avoid 1 packet which is forwarded in software due 207 # to "unresolved neigh". 208 ip neigh replace dev br0 192.0.2.1 lladdr $(mac_get $h1.10) 209 210 # The hardware matches on the first ethertype which is not VLAN, 211 # so the protocol should be IP. 212 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \ 213 flower skip_sw dst_ip 192.0.2.1 action pass 214 215 ping_do $h1.10 192.0.2.18 216 check_err $? "Ping failed" 217 218 tc_check_at_least_x_packets "dev $swp1 egress" 101 10 219 check_err $? "Packets were not routed in hardware" 220 221 log_test "Add RIF for existing {port, VID}->FID mapping" 222 223 tc filter del dev $swp1 egress 224 225 bridge_rif_del 226 ip link set dev $swp1.10 nomaster 227 vlan_destroy $swp1 10 228 } 229 230 rif_port_vid_map() 231 { 232 RET=0 233 234 # First add an address to the bridge, which will create a RIF on top of 235 # it, then add a new {port, VID}->FID mapping and verify that packets 236 # get the correct VID after routing. 237 bridge_rif_add 238 vlan_create $swp1 10 239 ip link set dev $swp1.10 master br0 240 241 # Replace neighbor to avoid 1 packet which is forwarded in software due 242 # to "unresolved neigh". 243 ip neigh replace dev br0 192.0.2.1 lladdr $(mac_get $h1.10) 244 245 # The hardware matches on the first ethertype which is not VLAN, 246 # so the protocol should be IP. 247 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \ 248 flower skip_sw dst_ip 192.0.2.1 action pass 249 250 ping_do $h1.10 192.0.2.18 251 check_err $? "Ping failed" 252 253 tc_check_at_least_x_packets "dev $swp1 egress" 101 10 254 check_err $? "Packets were not routed in hardware" 255 256 log_test "Add {port, VID}->FID mapping for FID with a RIF" 257 258 tc filter del dev $swp1 egress 259 260 ip link set dev $swp1.10 nomaster 261 vlan_destroy $swp1 10 262 bridge_rif_del 263 } 264 265 trap cleanup EXIT 266 267 setup_prepare 268 setup_wait 269 270 tests_run 271 272 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.