Back to home page

OSCL-LXR

 
 

    


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