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 # |    | 2001:db8:1::1/64          |            | | 2001:db8:2::1/64          |
0008 # |    | default via 2001:db8:1::3 |            | | default via 2001:db8:2::3 |
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 2001:db8:3::1                        local 2001:db8:3::1     | |
0019 # | |    remote 2001:db8:3::2                       remote 2001:db8:3::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 # | |  | 2001:db8:1::2/64                               2001:db8:2::2/64 |  | |
0032 # | |  |                                                                 |  | |
0033 # | |  + vlan10-v (macvlan)                           vlan20-v (macvlan) +  | |
0034 # | |    2001:db8:1::3/64                               2001:db8:2::3/64    | |
0035 # | |    00:00:5e:00:01:01                             00:00:5e:00:01:01    | |
0036 # | |                               vrf-green                               | |
0037 # | +-----------------------------------------------------------------------+ |
0038 # |                                                                           |
0039 # |    + $rp1                                       +lo                       |
0040 # |    | 2001:db8:4::1/64                            2001:db8:3::1/128        |
0041 # +----|----------------------------------------------------------------------+
0042 #      |
0043 # +----|--------------------------------------------------------+
0044 # |    |                            vrf-spine                   |
0045 # |    + $rp2                                                   |
0046 # |      2001:db8:4::2/64                                       |
0047 # |                                                             |   (maybe) HW
0048 # =============================================================================
0049 # |                                                             |  (likely) SW
0050 # |                                                             |
0051 # |    + v1 (veth)                                              |
0052 # |    | 2001:db8:5::2/64                                       |
0053 # +----|--------------------------------------------------------+
0054 #      |
0055 # +----|----------------------------------------------------------------------+
0056 # |    + v2 (veth)                                  +lo           NS1 (netns) |
0057 # |      2001:db8:5::1/64                            2001:db8:3::2/128        |
0058 # |                                                                           |
0059 # | +-----------------------------------------------------------------------+ |
0060 # | |                               vrf-green                               | |
0061 # | |  + vlan10-v (macvlan)                           vlan20-v (macvlan) +  | |
0062 # | |  | 2001:db8:1::3/64                               2001:db8:2::3/64 |  | |
0063 # | |  | 00:00:5e:00:01:01                             00:00:5e:00:01:01 |  | |
0064 # | |  |                                                                 |  | |
0065 # | |  + vlan10                                                   vlan20 +  | |
0066 # | |  | 2001:db8:1::3/64                               2001:db8:2::3/64 |  | |
0067 # | |  |                                                                 |  | |
0068 # | |  +--------------------------------+--------------------------------+  | |
0069 # | |                                   |                                   | |
0070 # | +-----------------------------------|-----------------------------------+ |
0071 # |                                     |                                     |
0072 # | +-----------------------------------+-----------------------------------+ |
0073 # | |                                                                       | |
0074 # | |  + vx10                                     + vx20                    | |
0075 # | |    local 2001:db8:3::2                        local 2001:db8:3::2     | |
0076 # | |    remote 2001:db8:3::1                       remote 2001:db8:3::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 # | |    2001:db8:1::4/64     |                |    2001:db8:2::4/64        | |
0090 # | |    default via          |                |    default via             | |
0091 # | |    2001:db8:1::3/64     |                |    2001:db8:2::3/64        | |
0092 # | +-------------------------+                +----------------------------+ |
0093 # +---------------------------------------------------------------------------+
0094 
0095 ALL_TESTS="
0096         ping_ipv6
0097         arp_decap
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/64 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/64 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 2001:db8:1::1 2001:db8:1::3
0141 }
0142 
0143 h1_destroy()
0144 {
0145         hx_destroy "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3
0146 }
0147 
0148 h2_create()
0149 {
0150         hx_create "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3
0151 }
0152 
0153 h2_destroy()
0154 {
0155         hx_destroy "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3
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 2001:db8:4::1/64
0169         ip route add 2001:db8:3::2/128 nexthop via 2001:db8:4::2
0170 
0171         ip link add name vx10 type vxlan id 1000                \
0172                 local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789   \
0173                 nolearning udp6zerocsumrx udp6zerocsumtx 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 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789   \
0181                 nolearning udp6zerocsumrx udp6zerocsumtx 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 2001:db8:3::1/128 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 2001:db8:1::2/64 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 2001:db8:1::3/64 dev vlan10-v
0206 
0207         ip link add link br1 name vlan20 up master vrf-green type vlan id 20
0208         ip address add 2001:db8:2::2/64 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 2001:db8:2::3/64 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 }
0220 
0221 switch_destroy()
0222 {
0223         bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 20
0224         bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 10
0225 
0226         bridge vlan del vid 20 dev br1 self
0227         bridge vlan del vid 10 dev br1 self
0228 
0229         ip link del dev vlan20
0230 
0231         ip link del dev vlan10
0232 
0233         vrf_destroy "vrf-green"
0234 
0235         ip address del 2001:db8:3::1/128 dev lo
0236 
0237         bridge vlan del vid 20 dev $swp2
0238         ip link set dev $swp2 down
0239         ip link set dev $swp2 nomaster
0240 
0241         bridge vlan del vid 10 dev $swp1
0242         ip link set dev $swp1 down
0243         ip link set dev $swp1 nomaster
0244 
0245         bridge vlan del vid 20 dev vx20
0246         ip link set dev vx20 nomaster
0247 
0248         ip link set dev vx20 down
0249         ip link del dev vx20
0250 
0251         bridge vlan del vid 10 dev vx10
0252         ip link set dev vx10 nomaster
0253 
0254         ip link set dev vx10 down
0255         ip link del dev vx10
0256 
0257         ip route del 2001:db8:3::2 nexthop via 2001:db8:4::2
0258         ip address del dev $rp1 2001:db8:4::1/64
0259         ip link set dev $rp1 down
0260 
0261         ip link set dev br1 down
0262         ip link del dev br1
0263 }
0264 
0265 spine_create()
0266 {
0267         vrf_create "vrf-spine"
0268         ip link set dev $rp2 master vrf-spine
0269         ip link set dev v1 master vrf-spine
0270         ip link set dev vrf-spine up
0271         ip link set dev $rp2 up
0272         ip link set dev v1 up
0273 
0274         ip address add 2001:db8:4::2/64 dev $rp2
0275         ip address add 2001:db8:5::2/64 dev v1
0276 
0277         ip route add 2001:db8:3::1/128 vrf vrf-spine nexthop via \
0278                 2001:db8:4::1
0279         ip route add 2001:db8:3::2/128 vrf vrf-spine nexthop via \
0280                 2001:db8:5::1
0281 }
0282 
0283 spine_destroy()
0284 {
0285         ip route del 2001:db8:3::2/128 vrf vrf-spine nexthop via \
0286                 2001:db8:5::1
0287         ip route del 2001:db8:3::1/128 vrf vrf-spine nexthop via \
0288                 2001:db8:4::1
0289 
0290         ip address del 2001:db8:5::2/64 dev v1
0291         ip address del 2001:db8:4::2/64 dev $rp2
0292 
0293         ip link set dev v1 down
0294         ip link set dev $rp2 down
0295         vrf_destroy "vrf-spine"
0296 }
0297 
0298 ns_h1_create()
0299 {
0300         hx_create "vrf-h1" w2 2001:db8:1::4 2001:db8:1::3
0301 }
0302 export -f ns_h1_create
0303 
0304 ns_h2_create()
0305 {
0306         hx_create "vrf-h2" w4 2001:db8:2::4 2001:db8:2::3
0307 }
0308 export -f ns_h2_create
0309 
0310 ns_switch_create()
0311 {
0312         ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
0313                 mcast_snooping 0
0314         ip link set dev br1 up
0315 
0316         ip link set dev v2 up
0317         ip address add dev v2 2001:db8:5::1/64
0318         ip route add 2001:db8:3::1 nexthop via 2001:db8:5::2
0319 
0320         ip link add name vx10 type vxlan id 1000                \
0321                 local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789   \
0322                 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
0323         ip link set dev vx10 up
0324 
0325         ip link set dev vx10 master br1
0326         bridge vlan add vid 10 dev vx10 pvid untagged
0327 
0328         ip link add name vx20 type vxlan id 2000                \
0329                 local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789   \
0330                 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100
0331         ip link set dev vx20 up
0332 
0333         ip link set dev vx20 master br1
0334         bridge vlan add vid 20 dev vx20 pvid untagged
0335 
0336         ip link set dev w1 master br1
0337         ip link set dev w1 up
0338         bridge vlan add vid 10 dev w1 pvid untagged
0339 
0340         ip link set dev w3 master br1
0341         ip link set dev w3 up
0342         bridge vlan add vid 20 dev w3 pvid untagged
0343 
0344         ip address add 2001:db8:3::2/128 dev lo
0345 
0346         # Create SVIs
0347         vrf_create "vrf-green"
0348         ip link set dev vrf-green up
0349 
0350         ip link add link br1 name vlan10 up master vrf-green type vlan id 10
0351         ip address add 2001:db8:1::3/64 dev vlan10
0352         ip link add link vlan10 name vlan10-v up master vrf-green \
0353                 address 00:00:5e:00:01:01 type macvlan mode private
0354         ip address add 2001:db8:1::3/64 dev vlan10-v
0355 
0356         ip link add link br1 name vlan20 up master vrf-green type vlan id 20
0357         ip address add 2001:db8:2::3/64 dev vlan20
0358         ip link add link vlan20 name vlan20-v up master vrf-green \
0359                 address 00:00:5e:00:01:01 type macvlan mode private
0360         ip address add 2001:db8:2::3/64 dev vlan20-v
0361 
0362         bridge vlan add vid 10 dev br1 self
0363         bridge vlan add vid 20 dev br1 self
0364 
0365         bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10
0366         bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20
0367 }
0368 export -f ns_switch_create
0369 
0370 ns_init()
0371 {
0372         ip link add name w1 type veth peer name w2
0373         ip link add name w3 type veth peer name w4
0374 
0375         ip link set dev lo up
0376 
0377         ns_h1_create
0378         ns_h2_create
0379         ns_switch_create
0380 }
0381 export -f ns_init
0382 
0383 ns1_create()
0384 {
0385         ip netns add ns1
0386         ip link set dev v2 netns ns1
0387         in_ns ns1 ns_init
0388 }
0389 
0390 ns1_destroy()
0391 {
0392         ip netns exec ns1 ip link set dev v2 netns 1
0393         ip netns del ns1
0394 }
0395 
0396 macs_populate()
0397 {
0398         local mac1=$1; shift
0399         local mac2=$1; shift
0400         local ip1=$1; shift
0401         local ip2=$1; shift
0402         local dst=$1; shift
0403 
0404         bridge fdb add $mac1 dev vx10 self master extern_learn static \
0405                 dst $dst vlan 10
0406         bridge fdb add $mac2 dev vx20 self master extern_learn static \
0407                 dst $dst vlan 20
0408 
0409         ip neigh add $ip1 lladdr $mac1 nud noarp dev vlan10 \
0410                 extern_learn
0411         ip neigh add $ip2 lladdr $mac2 nud noarp dev vlan20 \
0412                 extern_learn
0413 }
0414 export -f macs_populate
0415 
0416 macs_initialize()
0417 {
0418         local h1_ns_mac=$(in_ns ns1 mac_get w2)
0419         local h2_ns_mac=$(in_ns ns1 mac_get w4)
0420         local h1_mac=$(mac_get $h1)
0421         local h2_mac=$(mac_get $h2)
0422 
0423         macs_populate $h1_ns_mac $h2_ns_mac 2001:db8:1::4 2001:db8:2::4 \
0424                 2001:db8:3::2
0425         in_ns ns1 macs_populate $h1_mac $h2_mac 2001:db8:1::1 2001:db8:2::1 \
0426                 2001:db8:3::1
0427 }
0428 
0429 setup_prepare()
0430 {
0431         h1=${NETIFS[p1]}
0432         swp1=${NETIFS[p2]}
0433 
0434         swp2=${NETIFS[p3]}
0435         h2=${NETIFS[p4]}
0436 
0437         rp1=${NETIFS[p5]}
0438         rp2=${NETIFS[p6]}
0439 
0440         vrf_prepare
0441         forwarding_enable
0442 
0443         h1_create
0444         h2_create
0445         switch_create
0446 
0447         ip link add name v1 type veth peer name v2
0448         spine_create
0449         ns1_create
0450         in_ns ns1 forwarding_enable
0451 
0452         macs_initialize
0453 }
0454 
0455 cleanup()
0456 {
0457         pre_cleanup
0458 
0459         ns1_destroy
0460         spine_destroy
0461         ip link del dev v1
0462 
0463         switch_destroy
0464         h2_destroy
0465         h1_destroy
0466 
0467         forwarding_restore
0468         vrf_cleanup
0469 }
0470 
0471 ping_ipv6()
0472 {
0473         ping6_test $h1 2001:db8:2::1 ": local->local vid 10->vid 20"
0474         ping6_test $h1 2001:db8:1::4 ": local->remote vid 10->vid 10"
0475         ping6_test $h2 2001:db8:2::4 ": local->remote vid 20->vid 20"
0476         ping6_test $h1 2001:db8:2::4 ": local->remote vid 10->vid 20"
0477         ping6_test $h2 2001:db8:1::4 ": local->remote vid 20->vid 10"
0478 }
0479 
0480 arp_decap()
0481 {
0482         # Repeat the ping tests, but without populating the neighbours. This
0483         # makes sure we correctly decapsulate ARP packets
0484         log_info "deleting neighbours from vlan interfaces"
0485 
0486         ip neigh del 2001:db8:1::4 dev vlan10
0487         ip neigh del 2001:db8:2::4 dev vlan20
0488 
0489         ping_ipv6
0490 
0491         ip neigh replace 2001:db8:1::4 lladdr $(in_ns ns1 mac_get w2) \
0492                 nud noarp dev vlan10 extern_learn
0493         ip neigh replace 2001:db8:2::4 lladdr $(in_ns ns1 mac_get w4) \
0494                 nud noarp dev vlan20 extern_learn
0495 }
0496 
0497 trap cleanup EXIT
0498 
0499 setup_prepare
0500 setup_wait
0501 
0502 tests_run
0503 
0504 exit $EXIT_STATUS