Back to home page

OSCL-LXR

 
 

    


0001 # SPDX-License-Identifier: GPL-2.0
0002 #!/bin/bash
0003 
0004 # Handles creation and destruction of IP-in-IP or GRE tunnels over the given
0005 # topology. Supports both flat and hierarchical models.
0006 #
0007 # Flat Model:
0008 # Overlay and underlay share the same VRF.
0009 # SW1 uses default VRF so tunnel has no bound dev.
0010 # SW2 uses non-default VRF tunnel has a bound dev.
0011 # +--------------------------------+
0012 # | H1                             |
0013 # |                     $h1 +      |
0014 # |        198.51.100.1/24  |      |
0015 # |        2001:db8:1::1/64 |      |
0016 # +-------------------------|------+
0017 #                           |
0018 # +-------------------------|-------------------+
0019 # | SW1                     |                   |
0020 # |                    $ol1 +                   |
0021 # |        198.51.100.2/24                      |
0022 # |        2001:db8:1::2/64                     |
0023 # |                                             |
0024 # |      + g1a (ip6gre)                         |
0025 # |        loc=2001:db8:3::1                    |
0026 # |        rem=2001:db8:3::2 --.                |
0027 # |        tos=inherit         |                |
0028 # |                            .                |
0029 # |      .---------------------                 |
0030 # |      |                                      |
0031 # |      v                                      |
0032 # |      + $ul1.111 (vlan)                      |
0033 # |      | 2001:db8:10::1/64                    |
0034 # |       \                                     |
0035 # |        \____________                        |
0036 # |                     |                       |
0037 # | VRF default         + $ul1                  |
0038 # +---------------------|-----------------------+
0039 #                       |
0040 # +---------------------|-----------------------+
0041 # | SW2                 |                       |
0042 # |                $ul2 +                       |
0043 # |          ___________|                       |
0044 # |         /                                   |
0045 # |        /                                    |
0046 # |       + $ul2.111 (vlan)                     |
0047 # |       ^ 2001:db8:10::2/64                   |
0048 # |       |                                     |
0049 # |       |                                     |
0050 # |       '----------------------.              |
0051 # |       + g2a (ip6gre)         |              |
0052 # |         loc=2001:db8:3::2    |              |
0053 # |         rem=2001:db8:3::1  --'              |
0054 # |         tos=inherit                         |
0055 # |                                             |
0056 # |                     + $ol2                  |
0057 # |                     | 203.0.113.2/24        |
0058 # | VRF v$ol2           | 2001:db8:2::2/64      |
0059 # +---------------------|-----------------------+
0060 # +---------------------|----------+
0061 # | H2                  |          |
0062 # |                 $h2 +          |
0063 # |    203.0.113.1/24              |
0064 # |    2001:db8:2::1/64            |
0065 # +--------------------------------+
0066 #
0067 # Hierarchical model:
0068 # The tunnel is bound to a device in a different VRF
0069 #
0070 # +--------------------------------+
0071 # | H1                             |
0072 # |                     $h1 +      |
0073 # |        198.51.100.1/24  |      |
0074 # |        2001:db8:1::1/64 |      |
0075 # +-------------------------|------+
0076 #                           |
0077 # +-------------------------|-------------------+
0078 # | SW1                     |                   |
0079 # | +-----------------------|-----------------+ |
0080 # | |                  $ol1 +                 | |
0081 # | |      198.51.100.2/24                    | |
0082 # | |      2001:db8:1::2/64                   | |
0083 # | |                                         | |
0084 # | |              + g1a (ip6gre)             | |
0085 # | |                loc=2001:db8:3::1        | |
0086 # | |                rem=2001:db8:3::2        | |
0087 # | |                tos=inherit              | |
0088 # | |                    ^                    | |
0089 # | |   VRF v$ol1        |                    | |
0090 # | +--------------------|--------------------+ |
0091 # |                      |                      |
0092 # | +--------------------|--------------------+ |
0093 # | |   VRF v$ul1        |                    | |
0094 # | |                    |                    | |
0095 # | |                    v                    | |
0096 # | |             dummy1 +                    | |
0097 # | |       2001:db8:3::1/64                  | |
0098 # | |         .-----------'                   | |
0099 # | |         |                               | |
0100 # | |         v                               | |
0101 # | |         + $ul1.111 (vlan)               | |
0102 # | |         | 2001:db8:10::1/64             | |
0103 # | |         \                               | |
0104 # | |          \__________                    | |
0105 # | |                     |                   | |
0106 # | |                     + $ul1              | |
0107 # | +---------------------|-------------------+ |
0108 # +-----------------------|---------------------+
0109 #                         |
0110 # +-----------------------|---------------------+
0111 # | SW2                   |                     |
0112 # | +---------------------|-------------------+ |
0113 # | |                     + $ul2              | |
0114 # | |                _____|                   | |
0115 # | |               /                         | |
0116 # | |              /                          | |
0117 # | |              | $ul2.111 (vlan)          | |
0118 # | |              + 2001:db8:10::2/64        | |
0119 # | |              ^                          | |
0120 # | |              |                          | |
0121 # | |              '------.                   | |
0122 # | |              dummy2 +                   | |
0123 # | |              2001:db8:3::2/64           | |
0124 # | |                     ^                   | |
0125 # | |                     |                   | |
0126 # | |                     |                   | |
0127 # | | VRF v$ul2           |                   | |
0128 # | +---------------------|-------------------+ |
0129 # |                       |                     |
0130 # | +---------------------|-------------------+ |
0131 # | | VRF v$ol2           |                   | |
0132 # | |                     |                   | |
0133 # | |                     v                   | |
0134 # | |        g2a (ip6gre) +                   | |
0135 # | |        loc=2001:db8:3::2                | |
0136 # | |        rem=2001:db8:3::1                | |
0137 # | |        tos=inherit                      | |
0138 # | |                                         | |
0139 # | |                $ol2 +                   | |
0140 # | |    203.0.113.2/24   |                   | |
0141 # | |    2001:db8:2::2/64 |                   | |
0142 # | +---------------------|-------------------+ |
0143 # +-----------------------|---------------------+
0144 #                         |
0145 # +-----------------------|--------+
0146 # | H2                    |        |
0147 # |                   $h2 +        |
0148 # |      203.0.113.1/24            |
0149 # |      2001:db8:2::1/64          |
0150 # +--------------------------------+
0151 
0152 source lib.sh
0153 source tc_common.sh
0154 
0155 h1_create()
0156 {
0157         simple_if_init $h1 198.51.100.1/24 2001:db8:1::1/64
0158         ip route add vrf v$h1 203.0.113.0/24 via 198.51.100.2
0159         ip -6 route add vrf v$h1 2001:db8:2::/64 via 2001:db8:1::2
0160 }
0161 
0162 h1_destroy()
0163 {
0164         ip -6 route del vrf v$h1 2001:db8:2::/64 via 2001:db8:1::2
0165         ip route del vrf v$h1 203.0.113.0/24 via 198.51.100.2
0166         simple_if_fini $h1 198.51.100.1/24 2001:db8:1::1/64
0167 }
0168 
0169 h2_create()
0170 {
0171         simple_if_init $h2 203.0.113.1/24 2001:db8:2::1/64
0172         ip route add vrf v$h2 198.51.100.0/24 via 203.0.113.2
0173         ip -6 route add vrf v$h2 2001:db8:1::/64 via 2001:db8:2::2
0174 }
0175 
0176 h2_destroy()
0177 {
0178         ip -6 route del vrf v$h2 2001:db8:1::/64 via 2001:db8:2::2
0179         ip route del vrf v$h2 198.51.100.0/24 via 203.0.113.2
0180         simple_if_fini $h2 203.0.113.1/24 2001:db8:2::1/64
0181 }
0182 
0183 sw1_flat_create()
0184 {
0185         local ol1=$1; shift
0186         local ul1=$1; shift
0187 
0188         ip link set dev $ol1 up
0189         __addr_add_del $ol1 add 198.51.100.2/24 2001:db8:1::2/64
0190 
0191         ip link set dev $ul1 up
0192         vlan_create $ul1 111 "" 2001:db8:10::1/64
0193 
0194         tunnel_create g1a ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \
0195                 ttl inherit "$@"
0196         ip link set dev g1a up
0197         __addr_add_del g1a add "2001:db8:3::1/128"
0198 
0199         ip -6 route add 2001:db8:3::2/128 via 2001:db8:10::2
0200         ip route add 203.0.113.0/24 dev g1a
0201         ip -6 route add 2001:db8:2::/64 dev g1a
0202 }
0203 
0204 sw1_flat_destroy()
0205 {
0206         local ol1=$1; shift
0207         local ul1=$1; shift
0208 
0209         ip -6 route del 2001:db8:2::/64
0210         ip route del 203.0.113.0/24
0211         ip -6 route del 2001:db8:3::2/128 via 2001:db8:10::2
0212 
0213         __simple_if_fini g1a 2001:db8:3::1/128
0214         tunnel_destroy g1a
0215 
0216         vlan_destroy $ul1 111
0217         __simple_if_fini $ul1
0218         __simple_if_fini $ol1 198.51.100.2/24 2001:db8:1::2/64
0219 }
0220 
0221 sw2_flat_create()
0222 {
0223         local ol2=$1; shift
0224         local ul2=$1; shift
0225 
0226         simple_if_init $ol2 203.0.113.2/24 2001:db8:2::2/64
0227         __simple_if_init $ul2 v$ol2
0228         vlan_create $ul2 111 v$ol2 2001:db8:10::2/64
0229 
0230         tunnel_create g2a ip6gre 2001:db8:3::2 2001:db8:3::1 tos inherit \
0231                 ttl inherit dev v$ol2 "$@"
0232         __simple_if_init g2a v$ol2 2001:db8:3::2/128
0233 
0234         # Replace neighbor to avoid 1 dropped packet due to "unresolved neigh"
0235         ip neigh replace dev $ol2 203.0.113.1 lladdr $(mac_get $h2)
0236         ip -6 neigh replace dev $ol2 2001:db8:2::1 lladdr $(mac_get $h2)
0237 
0238         ip -6 route add vrf v$ol2 2001:db8:3::1/128 via 2001:db8:10::1
0239         ip route add vrf v$ol2 198.51.100.0/24 dev g2a
0240         ip -6 route add vrf v$ol2 2001:db8:1::/64 dev g2a
0241 }
0242 
0243 sw2_flat_destroy()
0244 {
0245         local ol2=$1; shift
0246         local ul2=$1; shift
0247 
0248         ip -6 route del vrf v$ol2 2001:db8:2::/64
0249         ip route del vrf v$ol2 198.51.100.0/24
0250         ip -6 route del vrf v$ol2 2001:db8:3::1/128 via 2001:db8:10::1
0251 
0252         __simple_if_fini g2a 2001:db8:3::2/128
0253         tunnel_destroy g2a
0254 
0255         vlan_destroy $ul2 111
0256         __simple_if_fini $ul2
0257         simple_if_fini $ol2 203.0.113.2/24 2001:db8:2::2/64
0258 }
0259 
0260 sw1_hierarchical_create()
0261 {
0262         local ol1=$1; shift
0263         local ul1=$1; shift
0264 
0265         simple_if_init $ol1 198.51.100.2/24 2001:db8:1::2/64
0266         simple_if_init $ul1
0267         ip link add name dummy1 type dummy
0268         __simple_if_init dummy1 v$ul1 2001:db8:3::1/64
0269 
0270         vlan_create $ul1 111 v$ul1 2001:db8:10::1/64
0271         tunnel_create g1a ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \
0272                 ttl inherit dev dummy1 "$@"
0273         ip link set dev g1a master v$ol1
0274 
0275         ip -6 route add vrf v$ul1 2001:db8:3::2/128 via 2001:db8:10::2
0276         ip route add vrf v$ol1 203.0.113.0/24 dev g1a
0277         ip -6 route add vrf v$ol1 2001:db8:2::/64 dev g1a
0278 }
0279 
0280 sw1_hierarchical_destroy()
0281 {
0282         local ol1=$1; shift
0283         local ul1=$1; shift
0284 
0285         ip -6 route del vrf v$ol1 2001:db8:2::/64
0286         ip route del vrf v$ol1 203.0.113.0/24
0287         ip -6 route del vrf v$ul1 2001:db8:3::2/128
0288 
0289         tunnel_destroy g1a
0290         vlan_destroy $ul1 111
0291 
0292         __simple_if_fini dummy1 2001:db8:3::1/64
0293         ip link del dev dummy1
0294 
0295         simple_if_fini $ul1
0296         simple_if_fini $ol1 198.51.100.2/24 2001:db8:1::2/64
0297 }
0298 
0299 sw2_hierarchical_create()
0300 {
0301         local ol2=$1; shift
0302         local ul2=$1; shift
0303 
0304         simple_if_init $ol2 203.0.113.2/24 2001:db8:2::2/64
0305         simple_if_init $ul2
0306 
0307         ip link add name dummy2 type dummy
0308         __simple_if_init dummy2 v$ul2 2001:db8:3::2/64
0309 
0310         vlan_create $ul2 111 v$ul2 2001:db8:10::2/64
0311         tunnel_create g2a ip6gre 2001:db8:3::2 2001:db8:3::1 tos inherit \
0312                 ttl inherit dev dummy2 "$@"
0313         ip link set dev g2a master v$ol2
0314 
0315         # Replace neighbor to avoid 1 dropped packet due to "unresolved neigh"
0316         ip neigh replace dev $ol2 203.0.113.1 lladdr $(mac_get $h2)
0317         ip -6 neigh replace dev $ol2 2001:db8:2::1 lladdr $(mac_get $h2)
0318 
0319         ip -6 route add vrf v$ul2 2001:db8:3::1/128 via 2001:db8:10::1
0320         ip route add vrf v$ol2 198.51.100.0/24 dev g2a
0321         ip -6 route add vrf v$ol2 2001:db8:1::/64 dev g2a
0322 }
0323 
0324 sw2_hierarchical_destroy()
0325 {
0326         local ol2=$1; shift
0327         local ul2=$1; shift
0328 
0329         ip -6 route del vrf v$ol2 2001:db8:2::/64
0330         ip route del vrf v$ol2 198.51.100.0/24
0331         ip -6 route del vrf v$ul2 2001:db8:3::1/128
0332 
0333         tunnel_destroy g2a
0334         vlan_destroy $ul2 111
0335 
0336         __simple_if_fini dummy2 2001:db8:3::2/64
0337         ip link del dev dummy2
0338 
0339         simple_if_fini $ul2
0340         simple_if_fini $ol2 203.0.113.2/24 2001:db8:2::2/64
0341 }
0342 
0343 test_traffic_ip4ip6()
0344 {
0345         RET=0
0346 
0347         h1mac=$(mac_get $h1)
0348         ol1mac=$(mac_get $ol1)
0349 
0350         tc qdisc add dev $ul1 clsact
0351         tc filter add dev $ul1 egress proto all pref 1 handle 101 \
0352                 flower $TC_FLAG action pass
0353 
0354         tc qdisc add dev $ol2 clsact
0355         tc filter add dev $ol2 egress protocol ipv4 pref 1 handle 101 \
0356                 flower $TC_FLAG dst_ip 203.0.113.1 action pass
0357 
0358         $MZ $h1 -c 1000 -p 64 -a $h1mac -b $ol1mac -A 198.51.100.1 \
0359                 -B 203.0.113.1 -t ip -q -d 1msec
0360 
0361         # Check ports after encap and after decap.
0362         tc_check_at_least_x_packets "dev $ul1 egress" 101 1000
0363         check_err $? "Packets did not go through $ul1, tc_flag = $TC_FLAG"
0364 
0365         tc_check_at_least_x_packets "dev $ol2 egress" 101 1000
0366         check_err $? "Packets did not go through $ol2, tc_flag = $TC_FLAG"
0367 
0368         log_test "$@"
0369 
0370         tc filter del dev $ol2 egress protocol ipv4 pref 1 handle 101 flower
0371         tc qdisc del dev $ol2 clsact
0372         tc filter del dev $ul1 egress proto all pref 1 handle 101 flower
0373         tc qdisc del dev $ul1 clsact
0374 }
0375 
0376 test_traffic_ip6ip6()
0377 {
0378         RET=0
0379 
0380         h1mac=$(mac_get $h1)
0381         ol1mac=$(mac_get $ol1)
0382 
0383         tc qdisc add dev $ul1 clsact
0384         tc filter add dev $ul1 egress proto all pref 1 handle 101 \
0385                 flower $TC_FLAG action pass
0386 
0387         tc qdisc add dev $ol2 clsact
0388         tc filter add dev $ol2 egress protocol ipv6 pref 1 handle 101 \
0389                 flower $TC_FLAG dst_ip 2001:db8:2::1 action pass
0390 
0391         $MZ -6 $h1 -c 1000 -p 64 -a $h1mac -b $ol1mac -A 2001:db8:1::1 \
0392                 -B 2001:db8:2::1 -t ip -q -d 1msec
0393 
0394         # Check ports after encap and after decap.
0395         tc_check_at_least_x_packets "dev $ul1 egress" 101 1000
0396         check_err $? "Packets did not go through $ul1, tc_flag = $TC_FLAG"
0397 
0398         tc_check_at_least_x_packets "dev $ol2 egress" 101 1000
0399         check_err $? "Packets did not go through $ol2, tc_flag = $TC_FLAG"
0400 
0401         log_test "$@"
0402 
0403         tc filter del dev $ol2 egress protocol ipv6 pref 1 handle 101 flower
0404         tc qdisc del dev $ol2 clsact
0405         tc filter del dev $ul1 egress proto all pref 1 handle 101 flower
0406         tc qdisc del dev $ul1 clsact
0407 }
0408 
0409 topo_mtu_change()
0410 {
0411         local mtu=$1
0412 
0413         ip link set mtu $mtu dev $h1
0414         ip link set mtu $mtu dev $ol1
0415         ip link set mtu $mtu dev g1a
0416         ip link set mtu $mtu dev $ul1
0417         ip link set mtu $mtu dev $ul1.111
0418         ip link set mtu $mtu dev $h2
0419         ip link set mtu $mtu dev $ol2
0420         ip link set mtu $mtu dev g2a
0421         ip link set mtu $mtu dev $ul2
0422         ip link set mtu $mtu dev $ul2.111
0423 }
0424 
0425 test_mtu_change()
0426 {
0427         RET=0
0428 
0429         ping6_do $h1 2001:db8:2::1 "-s 1800 -w 3"
0430         check_fail $? "ping GRE IPv6 should not pass with packet size 1800"
0431 
0432         RET=0
0433 
0434         topo_mtu_change 2000
0435         ping6_do $h1 2001:db8:2::1 "-s 1800 -w 3"
0436         check_err $?
0437         log_test "ping GRE IPv6, packet size 1800 after MTU change"
0438 }