Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 # +--------------------+                               +----------------------+
0005 # | H1 (vrf)           |                               |             H2 (vrf) |
0006 # |    + h1.10         |                               |  + h2.20             |
0007 # |    | 192.0.2.1/28  |                               |  | 192.0.2.2/28      |
0008 # |    |               |                               |  |                   |
0009 # |    + $h1           |                               |  + $h2               |
0010 # |    |               |                               |  |                   |
0011 # +----|---------------+                               +--|-------------------+
0012 #      |                                                  |
0013 # +----|--------------------------------------------------|--------------------+
0014 # | SW |                                                  |                    |
0015 # | +--|-------------------------------+ +----------------|------------------+ |
0016 # | |  + $swp1         BR1 (802.1ad)   | | BR2 (802.1d)   + $swp2            | |
0017 # | |    vid 100 pvid untagged         | |                |                  | |
0018 # | |                                  | |                + $swp2.20         | |
0019 # | |                                  | |                                   | |
0020 # | |  + vx100 (vxlan)                 | |  + vx200 (vxlan)                  | |
0021 # | |    local 192.0.2.17              | |    local 192.0.2.17               | |
0022 # | |    remote 192.0.2.34             | |    remote 192.0.2.50              | |
0023 # | |    id 1000 dstport $VXPORT       | |    id 2000 dstport $VXPORT        | |
0024 # | |    vid 100 pvid untagged         | |                                   | |
0025 # | +--------------------------------- + +-----------------------------------+ |
0026 # |                                                                            |
0027 # |  192.0.2.32/28 via 192.0.2.18                                              |
0028 # |  192.0.2.48/28 via 192.0.2.18                                              |
0029 # |                                                                            |
0030 # |    + $rp1                                                                  |
0031 # |    | 192.0.2.17/28                                                         |
0032 # +----|-----------------------------------------------------------------------+
0033 #      |
0034 # +----|--------------------------------------------------------+
0035 # |    |                                             VRP2 (vrf) |
0036 # |    + $rp2                                                   |
0037 # |      192.0.2.18/28                                          |
0038 # |                                                             |   (maybe) HW
0039 # =============================================================================
0040 # |                                                             |  (likely) SW
0041 # |    + v1 (veth)                             + v3 (veth)      |
0042 # |    | 192.0.2.33/28                         | 192.0.2.49/28  |
0043 # +----|---------------------------------------|----------------+
0044 #      |                                       |
0045 # +----|------------------------------+   +----|------------------------------+
0046 # |    + v2 (veth)        NS1 (netns) |   |    + v4 (veth)        NS2 (netns) |
0047 # |      192.0.2.34/28                |   |      192.0.2.50/28                |
0048 # |                                   |   |                                   |
0049 # |   192.0.2.16/28 via 192.0.2.33    |   |   192.0.2.16/28 via 192.0.2.49    |
0050 # |   192.0.2.50/32 via 192.0.2.33    |   |   192.0.2.34/32 via 192.0.2.49    |
0051 # |                                   |   |                                   |
0052 # | +-------------------------------+ |   | +-------------------------------+ |
0053 # | |                 BR3 (802.1ad) | |   | |                  BR3 (802.1d) | |
0054 # | |  + vx100 (vxlan)              | |   | |  + vx200 (vxlan)              | |
0055 # | |    local 192.0.2.34           | |   | |    local 192.0.2.50           | |
0056 # | |    remote 192.0.2.17          | |   | |    remote 192.0.2.17          | |
0057 # | |    remote 192.0.2.50          | |   | |    remote 192.0.2.34          | |
0058 # | |    id 1000 dstport $VXPORT    | |   | |    id 2000 dstport $VXPORT    | |
0059 # | |    vid 100 pvid untagged      | |   | |                               | |
0060 # | |                               | |   | |  + w1.20                      | |
0061 # | |                               | |   | |  |                            | |
0062 # | |  + w1 (veth)                  | |   | |  + w1 (veth)                  | |
0063 # | |  | vid 100 pvid untagged      | |   | |  |                            | |
0064 # | +--|----------------------------+ |   | +--|----------------------------+ |
0065 # |    |                              |   |    |                              |
0066 # | +--|----------------------------+ |   | +--|----------------------------+ |
0067 # | |  |                  VW2 (vrf) | |   | |  |                  VW2 (vrf) | |
0068 # | |  + w2 (veth)                  | |   | |  + w2 (veth)                  | |
0069 # | |  |                            | |   | |  |                            | |
0070 # | |  |                            | |   | |  |                            | |
0071 # | |  + w2.10                      | |   | |  + w2.20                      | |
0072 # | |    192.0.2.3/28               | |   | |    192.0.2.4/28               | |
0073 # | +-------------------------------+ |   | +-------------------------------+ |
0074 # +-----------------------------------+   +-----------------------------------+
0075 
0076 : ${VXPORT:=4789}
0077 export VXPORT
0078 
0079 : ${ALL_TESTS:="
0080         ping_ipv4
0081     "}
0082 
0083 NUM_NETIFS=6
0084 source lib.sh
0085 
0086 h1_create()
0087 {
0088         simple_if_init $h1
0089         tc qdisc add dev $h1 clsact
0090         vlan_create $h1 10 v$h1 192.0.2.1/28
0091 }
0092 
0093 h1_destroy()
0094 {
0095         vlan_destroy $h1 10
0096         tc qdisc del dev $h1 clsact
0097         simple_if_fini $h1
0098 }
0099 
0100 h2_create()
0101 {
0102         simple_if_init $h2
0103         tc qdisc add dev $h2 clsact
0104         vlan_create $h2 20 v$h2 192.0.2.2/28
0105 }
0106 
0107 h2_destroy()
0108 {
0109         vlan_destroy $h2 20
0110         tc qdisc del dev $h2 clsact
0111         simple_if_fini $h2
0112 }
0113 
0114 rp1_set_addr()
0115 {
0116         ip address add dev $rp1 192.0.2.17/28
0117 
0118         ip route add 192.0.2.32/28 nexthop via 192.0.2.18
0119         ip route add 192.0.2.48/28 nexthop via 192.0.2.18
0120 }
0121 
0122 rp1_unset_addr()
0123 {
0124         ip route del 192.0.2.48/28 nexthop via 192.0.2.18
0125         ip route del 192.0.2.32/28 nexthop via 192.0.2.18
0126 
0127         ip address del dev $rp1 192.0.2.17/28
0128 }
0129 
0130 switch_create()
0131 {
0132         #### BR1 ####
0133         ip link add name br1 type bridge vlan_filtering 1 \
0134                 vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0
0135         # Make sure the bridge uses the MAC address of the local port and not
0136         # that of the VxLAN's device.
0137         ip link set dev br1 address $(mac_get $swp1)
0138         ip link set dev br1 up
0139 
0140         #### BR2 ####
0141         ip link add name br2 type bridge vlan_filtering 0 mcast_snooping 0
0142         # Make sure the bridge uses the MAC address of the local port and not
0143         # that of the VxLAN's device.
0144         ip link set dev br2 address $(mac_get $swp2)
0145         ip link set dev br2 up
0146 
0147         ip link set dev $rp1 up
0148         rp1_set_addr
0149 
0150         #### VX100 ####
0151         ip link add name vx100 type vxlan id 1000 local 192.0.2.17 \
0152                 dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100
0153         ip link set dev vx100 up
0154 
0155         ip link set dev vx100 master br1
0156         bridge vlan add vid 100 dev vx100 pvid untagged
0157 
0158         ip link set dev $swp1 master br1
0159         ip link set dev $swp1 up
0160         bridge vlan add vid 100 dev $swp1 pvid untagged
0161 
0162         #### VX200 ####
0163         ip link add name vx200 type vxlan id 2000 local 192.0.2.17 \
0164                 dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100
0165         ip link set dev vx200 up
0166 
0167         ip link set dev vx200 master br2
0168 
0169         ip link set dev $swp2 up
0170         ip link add name $swp2.20 link $swp2 type vlan id 20
0171         ip link set dev $swp2.20 master br2
0172         ip link set dev $swp2.20 up
0173 
0174         bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self
0175         bridge fdb append dev vx200 00:00:00:00:00:00 dst 192.0.2.50 self
0176 }
0177 
0178 switch_destroy()
0179 {
0180         bridge fdb del dev vx200 00:00:00:00:00:00 dst 192.0.2.50 self
0181         bridge fdb del dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self
0182 
0183         ip link set dev vx200 nomaster
0184         ip link set dev vx200 down
0185         ip link del dev vx200
0186 
0187         ip link del dev $swp2.20
0188         ip link set dev $swp2 down
0189         ip link set dev $swp2 nomaster
0190 
0191         bridge vlan del vid 100 dev $swp1
0192         ip link set dev $swp1 down
0193         ip link set dev $swp1 nomaster
0194 
0195         ip link set dev vx100 nomaster
0196         ip link set dev vx100 down
0197         ip link del dev vx100
0198 
0199         rp1_unset_addr
0200         ip link set dev $rp1 down
0201 
0202         ip link set dev br2 down
0203         ip link del dev br2
0204 
0205         ip link set dev br1 down
0206         ip link del dev br1
0207 }
0208 
0209 vrp2_create()
0210 {
0211         simple_if_init $rp2 192.0.2.18/28
0212         __simple_if_init v1 v$rp2 192.0.2.33/28
0213         __simple_if_init v3 v$rp2 192.0.2.49/28
0214         tc qdisc add dev v1 clsact
0215 }
0216 
0217 vrp2_destroy()
0218 {
0219         tc qdisc del dev v1 clsact
0220         __simple_if_fini v3 192.0.2.49/28
0221         __simple_if_fini v1 192.0.2.33/28
0222         simple_if_fini $rp2 192.0.2.18/28
0223 }
0224 
0225 ns_init_common()
0226 {
0227         local in_if=$1; shift
0228         local in_addr=$1; shift
0229         local other_in_addr=$1; shift
0230         local vxlan_name=$1; shift
0231         local vxlan_id=$1; shift
0232         local vlan_id=$1; shift
0233         local host_addr=$1; shift
0234         local nh_addr=$1; shift
0235 
0236         ip link set dev $in_if up
0237         ip address add dev $in_if $in_addr/28
0238         tc qdisc add dev $in_if clsact
0239 
0240         ip link add name br3 type bridge vlan_filtering 0
0241         ip link set dev br3 up
0242 
0243         ip link add name w1 type veth peer name w2
0244 
0245         ip link set dev w1 master br3
0246         ip link set dev w1 up
0247 
0248         ip link add name $vxlan_name type vxlan id $vxlan_id local $in_addr \
0249                 dstport "$VXPORT"
0250         ip link set dev $vxlan_name up
0251         bridge fdb append dev $vxlan_name 00:00:00:00:00:00 dst 192.0.2.17 self
0252         bridge fdb append dev $vxlan_name 00:00:00:00:00:00 dst $other_in_addr self
0253 
0254         ip link set dev $vxlan_name master br3
0255         tc qdisc add dev $vxlan_name clsact
0256 
0257         simple_if_init w2
0258         vlan_create w2 $vlan_id vw2 $host_addr/28
0259 
0260         ip route add 192.0.2.16/28 nexthop via $nh_addr
0261         ip route add $other_in_addr/32 nexthop via $nh_addr
0262 }
0263 export -f ns_init_common
0264 
0265 ns1_create()
0266 {
0267         ip netns add ns1
0268         ip link set dev v2 netns ns1
0269         in_ns ns1 \
0270               ns_init_common v2 192.0.2.34 192.0.2.50 vx100 1000 10 192.0.2.3 \
0271               192.0.2.33
0272 
0273         in_ns ns1 bridge vlan add vid 100 dev vx100 pvid untagged
0274 }
0275 
0276 ns1_destroy()
0277 {
0278         ip netns exec ns1 ip link set dev v2 netns 1
0279         ip netns del ns1
0280 }
0281 
0282 ns2_create()
0283 {
0284         ip netns add ns2
0285         ip link set dev v4 netns ns2
0286         in_ns ns2 \
0287               ns_init_common v4 192.0.2.50 192.0.2.34 vx200 2000 20 192.0.2.4 \
0288               192.0.2.49
0289 
0290         in_ns ns2 ip link add name w1.20 link w1 type vlan id 20
0291         in_ns ns2 ip link set dev w1.20 master br3
0292         in_ns ns2 ip link set dev w1.20 up
0293 }
0294 
0295 ns2_destroy()
0296 {
0297         ip netns exec ns2 ip link set dev v4 netns 1
0298         ip netns del ns2
0299 }
0300 
0301 setup_prepare()
0302 {
0303         h1=${NETIFS[p1]}
0304         swp1=${NETIFS[p2]}
0305 
0306         swp2=${NETIFS[p3]}
0307         h2=${NETIFS[p4]}
0308 
0309         rp1=${NETIFS[p5]}
0310         rp2=${NETIFS[p6]}
0311 
0312         vrf_prepare
0313         forwarding_enable
0314 
0315         h1_create
0316         h2_create
0317         switch_create
0318 
0319         ip link add name v1 type veth peer name v2
0320         ip link add name v3 type veth peer name v4
0321         vrp2_create
0322         ns1_create
0323         ns2_create
0324 
0325         r1_mac=$(in_ns ns1 mac_get w2)
0326         r2_mac=$(in_ns ns2 mac_get w2)
0327         h2_mac=$(mac_get $h2)
0328 }
0329 
0330 cleanup()
0331 {
0332         pre_cleanup
0333 
0334         ns2_destroy
0335         ns1_destroy
0336         vrp2_destroy
0337         ip link del dev v3
0338         ip link del dev v1
0339 
0340         switch_destroy
0341         h2_destroy
0342         h1_destroy
0343 
0344         forwarding_restore
0345         vrf_cleanup
0346 }
0347 
0348 ping_ipv4()
0349 {
0350         ping_test $h1 192.0.2.3 ": local->remote 1 through VxLAN with an 802.1ad bridge"
0351         ping_test $h2 192.0.2.4 ": local->remote 2 through VxLAN with an 802.1d bridge"
0352 }
0353 
0354 test_all()
0355 {
0356         echo "Running tests with UDP port $VXPORT"
0357         tests_run
0358 }
0359 
0360 trap cleanup EXIT
0361 
0362 setup_prepare
0363 setup_wait
0364 test_all
0365 
0366 exit $EXIT_STATUS