Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 # +---------------------------+                +------------------------------+
0005 # |                    vrf-h1 |                |                       vrf-h2 |
0006 # |    + $h1                  |                |    + $h2                     |
0007 # |    | 10.1.1.101/24        |                |    | 10.1.2.101/24           |
0008 # |    | default via 10.1.1.1 |                |    | default via 10.1.2.1    |
0009 # +----|----------------------+                +----|-------------------------+
0010 #      |                                            |
0011 # +----|--------------------------------------------|-------------------------+
0012 # | SW |                                            |                         |
0013 # | +--|--------------------------------------------|-----------------------+ |
0014 # | |  + $swp1                         br1          + $swp2                 | |
0015 # | |     vid 10 pvid untagged                         vid 20 pvid untagged | |
0016 # | |                                                                       | |
0017 # | |  + vx10                                       + vx20                  | |
0018 # | |    local 10.0.0.1                               local 10.0.0.1        | |
0019 # | |    remote 10.0.0.2                              remote 10.0.0.2       | |
0020 # | |    id 1000                                      id 2000               | |
0021 # | |    dstport 4789                                 dstport 4789          | |
0022 # | |    vid 10 pvid untagged                         vid 20 pvid untagged  | |
0023 # | |                                                                       | |
0024 # | +-----------------------------------+-----------------------------------+ |
0025 # |                                     |                                     |
0026 # | +-----------------------------------|-----------------------------------+ |
0027 # | |                                   |                                   | |
0028 # | |  +--------------------------------+--------------------------------+  | |
0029 # | |  |                                                                 |  | |
0030 # | |  + vlan10                                                   vlan20 +  | |
0031 # | |  | 10.1.1.11/24                                       10.1.2.11/24 |  | |
0032 # | |  |                                                                 |  | |
0033 # | |  + vlan10-v (macvlan)                           vlan20-v (macvlan) +  | |
0034 # | |    10.1.1.1/24                                         10.1.2.1/24    | |
0035 # | |    00:00:5e:00:01:01                             00:00:5e:00:01:01    | |
0036 # | |                               vrf-green                               | |
0037 # | +-----------------------------------------------------------------------+ |
0038 # |                                                                           |
0039 # |    + $rp1                                       +lo                       |
0040 # |    | 192.0.2.1/24                                10.0.0.1/32              |
0041 # +----|----------------------------------------------------------------------+
0042 #      |
0043 # +----|--------------------------------------------------------+
0044 # |    |                            vrf-spine                   |
0045 # |    + $rp2                                                   |
0046 # |      192.0.2.2/24                                           |
0047 # |                                                             |   (maybe) HW
0048 # =============================================================================
0049 # |                                                             |  (likely) SW
0050 # |                                                             |
0051 # |    + v1 (veth)                                              |
0052 # |    | 192.0.3.2/24                                           |
0053 # +----|--------------------------------------------------------+
0054 #      |
0055 # +----|----------------------------------------------------------------------+
0056 # |    + v2 (veth)                                  +lo           NS1 (netns) |
0057 # |      192.0.3.1/24                                10.0.0.2/32              |
0058 # |                                                                           |
0059 # | +-----------------------------------------------------------------------+ |
0060 # | |                               vrf-green                               | |
0061 # | |  + vlan10-v (macvlan)                           vlan20-v (macvlan) +  | |
0062 # | |  | 10.1.1.1/24                                         10.1.2.1/24 |  | |
0063 # | |  | 00:00:5e:00:01:01                             00:00:5e:00:01:01 |  | |
0064 # | |  |                                                                 |  | |
0065 # | |  + vlan10                                                   vlan20 +  | |
0066 # | |  | 10.1.1.12/24                                       10.1.2.12/24 |  | |
0067 # | |  |                                                                 |  | |
0068 # | |  +--------------------------------+--------------------------------+  | |
0069 # | |                                   |                                   | |
0070 # | +-----------------------------------|-----------------------------------+ |
0071 # |                                     |                                     |
0072 # | +-----------------------------------+-----------------------------------+ |
0073 # | |                                                                       | |
0074 # | |  + vx10                                     + vx20                    | |
0075 # | |    local 10.0.0.2                             local 10.0.0.2          | |
0076 # | |    remote 10.0.0.1                            remote 10.0.0.1         | |
0077 # | |    id 1000                                    id 2000                 | |
0078 # | |    dstport 4789                               dstport 4789            | |
0079 # | |    vid 10 pvid untagged                       vid 20 pvid untagged    | |
0080 # | |                                                                       | |
0081 # | |  + w1 (veth)                                + w3 (veth)               | |
0082 # | |  | vid 10 pvid untagged          br1        | vid 20 pvid untagged    | |
0083 # | +--|------------------------------------------|-------------------------+ |
0084 # |    |                                          |                           |
0085 # |    |                                          |                           |
0086 # | +--|----------------------+                +--|-------------------------+ |
0087 # | |  |               vrf-h1 |                |  |                  vrf-h2 | |
0088 # | |  + w2 (veth)            |                |  + w4 (veth)               | |
0089 # | |    10.1.1.102/24        |                |    10.1.2.102/24           | |
0090 # | |    default via 10.1.1.1 |                |    default via 10.1.2.1    | |
0091 # | +-------------------------+                +----------------------------+ |
0092 # +---------------------------------------------------------------------------+
0093 
0094 ALL_TESTS="
0095         ping_ipv4
0096         arp_decap
0097         arp_suppression
0098 "
0099 NUM_NETIFS=6
0100 source lib.sh
0101 
0102 require_command $ARPING
0103 
0104 hx_create()
0105 {
0106         local vrf_name=$1; shift
0107         local if_name=$1; shift
0108         local ip_addr=$1; shift
0109         local gw_ip=$1; shift
0110 
0111         vrf_create $vrf_name
0112         ip link set dev $if_name master $vrf_name
0113         ip link set dev $vrf_name up
0114         ip link set dev $if_name up
0115 
0116         ip address add $ip_addr/24 dev $if_name
0117         ip neigh replace $gw_ip lladdr 00:00:5e:00:01:01 nud permanent \
0118                 dev $if_name
0119         ip route add default vrf $vrf_name nexthop via $gw_ip
0120 }
0121 export -f hx_create
0122 
0123 hx_destroy()
0124 {
0125         local vrf_name=$1; shift
0126         local if_name=$1; shift
0127         local ip_addr=$1; shift
0128         local gw_ip=$1; shift
0129 
0130         ip route del default vrf $vrf_name nexthop via $gw_ip
0131         ip neigh del $gw_ip dev $if_name
0132         ip address del $ip_addr/24 dev $if_name
0133 
0134         ip link set dev $if_name down
0135         vrf_destroy $vrf_name
0136 }
0137 
0138 h1_create()
0139 {
0140         hx_create "vrf-h1" $h1 10.1.1.101 10.1.1.1
0141 }
0142 
0143 h1_destroy()
0144 {
0145         hx_destroy "vrf-h1" $h1 10.1.1.101 10.1.1.1
0146 }
0147 
0148 h2_create()
0149 {
0150         hx_create "vrf-h2" $h2 10.1.2.101 10.1.2.1
0151 }
0152 
0153 h2_destroy()
0154 {
0155         hx_destroy "vrf-h2" $h2 10.1.2.101 10.1.2.1
0156 }
0157 
0158 switch_create()
0159 {
0160         ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
0161                 mcast_snooping 0
0162         # Make sure the bridge uses the MAC address of the local port and not
0163         # that of the VxLAN's device.
0164         ip link set dev br1 address $(mac_get $swp1)
0165         ip link set dev br1 up
0166 
0167         ip link set dev $rp1 up
0168         ip address add dev $rp1 192.0.2.1/24
0169         ip route add 10.0.0.2/32 nexthop via 192.0.2.2
0170 
0171         ip link add name vx10 type vxlan id 1000                \
0172                 local 10.0.0.1 remote 10.0.0.2 dstport 4789     \
0173                 nolearning noudpcsum tos inherit ttl 100
0174         ip link set dev vx10 up
0175 
0176         ip link set dev vx10 master br1
0177         bridge vlan add vid 10 dev vx10 pvid untagged
0178 
0179         ip link add name vx20 type vxlan id 2000                \
0180                 local 10.0.0.1 remote 10.0.0.2 dstport 4789     \
0181                 nolearning noudpcsum tos inherit ttl 100
0182         ip link set dev vx20 up
0183 
0184         ip link set dev vx20 master br1
0185         bridge vlan add vid 20 dev vx20 pvid untagged
0186 
0187         ip link set dev $swp1 master br1
0188         ip link set dev $swp1 up
0189         bridge vlan add vid 10 dev $swp1 pvid untagged
0190 
0191         ip link set dev $swp2 master br1
0192         ip link set dev $swp2 up
0193         bridge vlan add vid 20 dev $swp2 pvid untagged
0194 
0195         ip address add 10.0.0.1/32 dev lo
0196 
0197         # Create SVIs
0198         vrf_create "vrf-green"
0199         ip link set dev vrf-green up
0200 
0201         ip link add link br1 name vlan10 up master vrf-green type vlan id 10
0202         ip address add 10.1.1.11/24 dev vlan10
0203         ip link add link vlan10 name vlan10-v up master vrf-green \
0204                 address 00:00:5e:00:01:01 type macvlan mode private
0205         ip address add 10.1.1.1/24 dev vlan10-v
0206 
0207         ip link add link br1 name vlan20 up master vrf-green type vlan id 20
0208         ip address add 10.1.2.11/24 dev vlan20
0209         ip link add link vlan20 name vlan20-v up master vrf-green \
0210                 address 00:00:5e:00:01:01 type macvlan mode private
0211         ip address add 10.1.2.1/24 dev vlan20-v
0212 
0213         bridge vlan add vid 10 dev br1 self
0214         bridge vlan add vid 20 dev br1 self
0215 
0216         bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10
0217         bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20
0218 
0219         sysctl_set net.ipv4.conf.all.rp_filter 0
0220         sysctl_set net.ipv4.conf.vlan10-v.rp_filter 0
0221         sysctl_set net.ipv4.conf.vlan20-v.rp_filter 0
0222 }
0223 
0224 switch_destroy()
0225 {
0226         sysctl_restore net.ipv4.conf.all.rp_filter
0227 
0228         bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 20
0229         bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 10
0230 
0231         bridge vlan del vid 20 dev br1 self
0232         bridge vlan del vid 10 dev br1 self
0233 
0234         ip link del dev vlan20
0235 
0236         ip link del dev vlan10
0237 
0238         vrf_destroy "vrf-green"
0239 
0240         ip address del 10.0.0.1/32 dev lo
0241 
0242         bridge vlan del vid 20 dev $swp2
0243         ip link set dev $swp2 down
0244         ip link set dev $swp2 nomaster
0245 
0246         bridge vlan del vid 10 dev $swp1
0247         ip link set dev $swp1 down
0248         ip link set dev $swp1 nomaster
0249 
0250         bridge vlan del vid 20 dev vx20
0251         ip link set dev vx20 nomaster
0252 
0253         ip link set dev vx20 down
0254         ip link del dev vx20
0255 
0256         bridge vlan del vid 10 dev vx10
0257         ip link set dev vx10 nomaster
0258 
0259         ip link set dev vx10 down
0260         ip link del dev vx10
0261 
0262         ip route del 10.0.0.2/32 nexthop via 192.0.2.2
0263         ip address del dev $rp1 192.0.2.1/24
0264         ip link set dev $rp1 down
0265 
0266         ip link set dev br1 down
0267         ip link del dev br1
0268 }
0269 
0270 spine_create()
0271 {
0272         vrf_create "vrf-spine"
0273         ip link set dev $rp2 master vrf-spine
0274         ip link set dev v1 master vrf-spine
0275         ip link set dev vrf-spine up
0276         ip link set dev $rp2 up
0277         ip link set dev v1 up
0278 
0279         ip address add 192.0.2.2/24 dev $rp2
0280         ip address add 192.0.3.2/24 dev v1
0281 
0282         ip route add 10.0.0.1/32 vrf vrf-spine nexthop via 192.0.2.1
0283         ip route add 10.0.0.2/32 vrf vrf-spine nexthop via 192.0.3.1
0284 }
0285 
0286 spine_destroy()
0287 {
0288         ip route del 10.0.0.2/32 vrf vrf-spine nexthop via 192.0.3.1
0289         ip route del 10.0.0.1/32 vrf vrf-spine nexthop via 192.0.2.1
0290 
0291         ip address del 192.0.3.2/24 dev v1
0292         ip address del 192.0.2.2/24 dev $rp2
0293 
0294         ip link set dev v1 down
0295         ip link set dev $rp2 down
0296         vrf_destroy "vrf-spine"
0297 }
0298 
0299 ns_h1_create()
0300 {
0301         hx_create "vrf-h1" w2 10.1.1.102 10.1.1.1
0302 }
0303 export -f ns_h1_create
0304 
0305 ns_h2_create()
0306 {
0307         hx_create "vrf-h2" w4 10.1.2.102 10.1.2.1
0308 }
0309 export -f ns_h2_create
0310 
0311 ns_switch_create()
0312 {
0313         ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
0314                 mcast_snooping 0
0315         ip link set dev br1 up
0316 
0317         ip link set dev v2 up
0318         ip address add dev v2 192.0.3.1/24
0319         ip route add 10.0.0.1/32 nexthop via 192.0.3.2
0320 
0321         ip link add name vx10 type vxlan id 1000                \
0322                 local 10.0.0.2 remote 10.0.0.1 dstport 4789     \
0323                 nolearning noudpcsum tos inherit ttl 100
0324         ip link set dev vx10 up
0325 
0326         ip link set dev vx10 master br1
0327         bridge vlan add vid 10 dev vx10 pvid untagged
0328 
0329         ip link add name vx20 type vxlan id 2000                \
0330                 local 10.0.0.2 remote 10.0.0.1 dstport 4789     \
0331                 nolearning noudpcsum tos inherit ttl 100
0332         ip link set dev vx20 up
0333 
0334         ip link set dev vx20 master br1
0335         bridge vlan add vid 20 dev vx20 pvid untagged
0336 
0337         ip link set dev w1 master br1
0338         ip link set dev w1 up
0339         bridge vlan add vid 10 dev w1 pvid untagged
0340 
0341         ip link set dev w3 master br1
0342         ip link set dev w3 up
0343         bridge vlan add vid 20 dev w3 pvid untagged
0344 
0345         ip address add 10.0.0.2/32 dev lo
0346 
0347         # Create SVIs
0348         vrf_create "vrf-green"
0349         ip link set dev vrf-green up
0350 
0351         ip link add link br1 name vlan10 up master vrf-green type vlan id 10
0352         ip address add 10.1.1.12/24 dev vlan10
0353         ip link add link vlan10 name vlan10-v up master vrf-green \
0354                 address 00:00:5e:00:01:01 type macvlan mode private
0355         ip address add 10.1.1.1/24 dev vlan10-v
0356 
0357         ip link add link br1 name vlan20 up master vrf-green type vlan id 20
0358         ip address add 10.1.2.12/24 dev vlan20
0359         ip link add link vlan20 name vlan20-v up master vrf-green \
0360                 address 00:00:5e:00:01:01 type macvlan mode private
0361         ip address add 10.1.2.1/24 dev vlan20-v
0362 
0363         bridge vlan add vid 10 dev br1 self
0364         bridge vlan add vid 20 dev br1 self
0365 
0366         bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10
0367         bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20
0368 
0369         sysctl_set net.ipv4.conf.all.rp_filter 0
0370         sysctl_set net.ipv4.conf.vlan10-v.rp_filter 0
0371         sysctl_set net.ipv4.conf.vlan20-v.rp_filter 0
0372 }
0373 export -f ns_switch_create
0374 
0375 ns_init()
0376 {
0377         ip link add name w1 type veth peer name w2
0378         ip link add name w3 type veth peer name w4
0379 
0380         ip link set dev lo up
0381 
0382         ns_h1_create
0383         ns_h2_create
0384         ns_switch_create
0385 }
0386 export -f ns_init
0387 
0388 ns1_create()
0389 {
0390         ip netns add ns1
0391         ip link set dev v2 netns ns1
0392         in_ns ns1 ns_init
0393 }
0394 
0395 ns1_destroy()
0396 {
0397         ip netns exec ns1 ip link set dev v2 netns 1
0398         ip netns del ns1
0399 }
0400 
0401 macs_populate()
0402 {
0403         local mac1=$1; shift
0404         local mac2=$1; shift
0405         local ip1=$1; shift
0406         local ip2=$1; shift
0407         local dst=$1; shift
0408 
0409         bridge fdb add $mac1 dev vx10 self master extern_learn static \
0410                 dst $dst vlan 10
0411         bridge fdb add $mac2 dev vx20 self master extern_learn static \
0412                 dst $dst vlan 20
0413 
0414         ip neigh add $ip1 lladdr $mac1 nud noarp dev vlan10 \
0415                 extern_learn
0416         ip neigh add $ip2 lladdr $mac2 nud noarp dev vlan20 \
0417                 extern_learn
0418 }
0419 export -f macs_populate
0420 
0421 macs_initialize()
0422 {
0423         local h1_ns_mac=$(in_ns ns1 mac_get w2)
0424         local h2_ns_mac=$(in_ns ns1 mac_get w4)
0425         local h1_mac=$(mac_get $h1)
0426         local h2_mac=$(mac_get $h2)
0427 
0428         macs_populate $h1_ns_mac $h2_ns_mac 10.1.1.102 10.1.2.102 10.0.0.2
0429         in_ns ns1 macs_populate $h1_mac $h2_mac 10.1.1.101 10.1.2.101 10.0.0.1
0430 }
0431 
0432 setup_prepare()
0433 {
0434         h1=${NETIFS[p1]}
0435         swp1=${NETIFS[p2]}
0436 
0437         swp2=${NETIFS[p3]}
0438         h2=${NETIFS[p4]}
0439 
0440         rp1=${NETIFS[p5]}
0441         rp2=${NETIFS[p6]}
0442 
0443         vrf_prepare
0444         forwarding_enable
0445 
0446         h1_create
0447         h2_create
0448         switch_create
0449 
0450         ip link add name v1 type veth peer name v2
0451         spine_create
0452         ns1_create
0453 
0454         macs_initialize
0455 }
0456 
0457 cleanup()
0458 {
0459         pre_cleanup
0460 
0461         ns1_destroy
0462         spine_destroy
0463         ip link del dev v1
0464 
0465         switch_destroy
0466         h2_destroy
0467         h1_destroy
0468 
0469         forwarding_restore
0470         vrf_cleanup
0471 }
0472 
0473 ping_ipv4()
0474 {
0475         ping_test $h1 10.1.2.101 ": local->local vid 10->vid 20"
0476         ping_test $h1 10.1.1.102 ": local->remote vid 10->vid 10"
0477         ping_test $h2 10.1.2.102 ": local->remote vid 20->vid 20"
0478         ping_test $h1 10.1.2.102 ": local->remote vid 10->vid 20"
0479         ping_test $h2 10.1.1.102 ": local->remote vid 20->vid 10"
0480 }
0481 
0482 arp_decap()
0483 {
0484         # Repeat the ping tests, but without populating the neighbours. This
0485         # makes sure we correctly decapsulate ARP packets
0486         log_info "deleting neighbours from vlan interfaces"
0487 
0488         ip neigh del 10.1.1.102 dev vlan10
0489         ip neigh del 10.1.2.102 dev vlan20
0490 
0491         ping_ipv4
0492 
0493         ip neigh replace 10.1.1.102 lladdr $(in_ns ns1 mac_get w2) nud noarp \
0494                 dev vlan10 extern_learn
0495         ip neigh replace 10.1.2.102 lladdr $(in_ns ns1 mac_get w4) nud noarp \
0496                 dev vlan20 extern_learn
0497 }
0498 
0499 arp_suppression_compare()
0500 {
0501         local expect=$1; shift
0502         local actual=$(in_ns ns1 tc_rule_stats_get vx10 1 ingress)
0503 
0504         (( expect == actual ))
0505         check_err $? "expected $expect arps got $actual"
0506 }
0507 
0508 arp_suppression()
0509 {
0510         ip link set dev vx10 type bridge_slave neigh_suppress on
0511 
0512         in_ns ns1 tc qdisc add dev vx10 clsact
0513         in_ns ns1 tc filter add dev vx10 ingress proto arp pref 1 handle 101 \
0514                 flower dst_mac ff:ff:ff:ff:ff:ff arp_tip 10.1.1.102 arp_op \
0515                 request action pass
0516 
0517         # The neighbour is configured on the SVI and ARP suppression is on, so
0518         # the ARP request should be suppressed
0519         RET=0
0520 
0521         $ARPING -I $h1 -fqb -c 1 -w 1 10.1.1.102
0522         check_err $? "arping failed"
0523 
0524         arp_suppression_compare 0
0525 
0526         log_test "neigh_suppress: on / neigh exists: yes"
0527 
0528         # Delete the neighbour from the SVI. A single ARP request should be
0529         # received by the remote VTEP
0530         RET=0
0531 
0532         ip neigh del 10.1.1.102 dev vlan10
0533 
0534         $ARPING -I $h1 -fqb -c 1 -w 1 10.1.1.102
0535         check_err $? "arping failed"
0536 
0537         arp_suppression_compare 1
0538 
0539         log_test "neigh_suppress: on / neigh exists: no"
0540 
0541         # Turn off ARP suppression and make sure ARP is not suppressed,
0542         # regardless of neighbour existence on the SVI
0543         RET=0
0544 
0545         ip neigh del 10.1.1.102 dev vlan10 &> /dev/null
0546         ip link set dev vx10 type bridge_slave neigh_suppress off
0547 
0548         $ARPING -I $h1 -fqb -c 1 -w 1 10.1.1.102
0549         check_err $? "arping failed"
0550 
0551         arp_suppression_compare 2
0552 
0553         log_test "neigh_suppress: off / neigh exists: no"
0554 
0555         RET=0
0556 
0557         ip neigh add 10.1.1.102 lladdr $(in_ns ns1 mac_get w2) nud noarp \
0558                 dev vlan10 extern_learn
0559 
0560         $ARPING -I $h1 -fqb -c 1 -w 1 10.1.1.102
0561         check_err $? "arping failed"
0562 
0563         arp_suppression_compare 3
0564 
0565         log_test "neigh_suppress: off / neigh exists: yes"
0566 
0567         in_ns ns1 tc qdisc del dev vx10 clsact
0568 }
0569 
0570 trap cleanup EXIT
0571 
0572 setup_prepare
0573 setup_wait
0574 
0575 tests_run
0576 
0577 exit $EXIT_STATUS