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