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