linux/tools/testing/selftests/net/forwarding/mirror_gre_changes.sh
<<
>>
Prefs
   1#!/bin/bash
   2# SPDX-License-Identifier: GPL-2.0
   3
   4# This test uses standard topology for testing gretap. See
   5# mirror_gre_topo_lib.sh for more details.
   6#
   7# Test how mirrors to gretap and ip6gretap react to changes to relevant
   8# configuration.
   9
  10ALL_TESTS="
  11        test_ttl
  12        test_tun_up
  13        test_egress_up
  14        test_remote_ip
  15        test_tun_del
  16        test_route_del
  17"
  18
  19NUM_NETIFS=6
  20source lib.sh
  21source mirror_lib.sh
  22source mirror_gre_lib.sh
  23source mirror_gre_topo_lib.sh
  24
  25setup_prepare()
  26{
  27        h1=${NETIFS[p1]}
  28        swp1=${NETIFS[p2]}
  29
  30        swp2=${NETIFS[p3]}
  31        h2=${NETIFS[p4]}
  32
  33        swp3=${NETIFS[p5]}
  34        h3=${NETIFS[p6]}
  35
  36        vrf_prepare
  37        mirror_gre_topo_create
  38
  39        # This test downs $swp3, which deletes the configured IPv6 address
  40        # unless this sysctl is set.
  41        sysctl_set net.ipv6.conf.$swp3.keep_addr_on_down 1
  42
  43        ip address add dev $swp3 192.0.2.129/28
  44        ip address add dev $h3 192.0.2.130/28
  45
  46        ip address add dev $swp3 2001:db8:2::1/64
  47        ip address add dev $h3 2001:db8:2::2/64
  48}
  49
  50cleanup()
  51{
  52        pre_cleanup
  53
  54        ip address del dev $h3 2001:db8:2::2/64
  55        ip address del dev $swp3 2001:db8:2::1/64
  56
  57        ip address del dev $h3 192.0.2.130/28
  58        ip address del dev $swp3 192.0.2.129/28
  59
  60        sysctl_restore net.ipv6.conf.$swp3.keep_addr_on_down
  61
  62        mirror_gre_topo_destroy
  63        vrf_cleanup
  64}
  65
  66test_span_gre_ttl()
  67{
  68        local tundev=$1; shift
  69        local type=$1; shift
  70        local prot=$1; shift
  71        local what=$1; shift
  72
  73        RET=0
  74
  75        mirror_install $swp1 ingress $tundev "matchall $tcflags"
  76        tc filter add dev $h3 ingress pref 77 prot $prot \
  77                flower ip_ttl 50 action pass
  78
  79        mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 0
  80
  81        ip link set dev $tundev type $type ttl 50
  82        sleep 2
  83        mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 10
  84
  85        ip link set dev $tundev type $type ttl 100
  86        tc filter del dev $h3 ingress pref 77
  87        mirror_uninstall $swp1 ingress
  88
  89        log_test "$what: TTL change ($tcflags)"
  90}
  91
  92test_span_gre_tun_up()
  93{
  94        local tundev=$1; shift
  95        local what=$1; shift
  96
  97        RET=0
  98
  99        ip link set dev $tundev down
 100        mirror_install $swp1 ingress $tundev "matchall $tcflags"
 101        fail_test_span_gre_dir $tundev ingress
 102
 103        ip link set dev $tundev up
 104
 105        quick_test_span_gre_dir $tundev ingress
 106        mirror_uninstall $swp1 ingress
 107
 108        log_test "$what: tunnel down/up ($tcflags)"
 109}
 110
 111test_span_gre_egress_up()
 112{
 113        local tundev=$1; shift
 114        local remote_ip=$1; shift
 115        local what=$1; shift
 116
 117        RET=0
 118
 119        ip link set dev $swp3 down
 120        mirror_install $swp1 ingress $tundev "matchall $tcflags"
 121        fail_test_span_gre_dir $tundev ingress
 122
 123        # After setting the device up, wait for neighbor to get resolved so that
 124        # we can expect mirroring to work.
 125        ip link set dev $swp3 up
 126        setup_wait_dev $swp3
 127        ping -c 1 -I $swp3 $remote_ip &>/dev/null
 128
 129        quick_test_span_gre_dir $tundev ingress
 130        mirror_uninstall $swp1 ingress
 131
 132        log_test "$what: egress down/up ($tcflags)"
 133}
 134
 135test_span_gre_remote_ip()
 136{
 137        local tundev=$1; shift
 138        local type=$1; shift
 139        local correct_ip=$1; shift
 140        local wrong_ip=$1; shift
 141        local what=$1; shift
 142
 143        RET=0
 144
 145        ip link set dev $tundev type $type remote $wrong_ip
 146        mirror_install $swp1 ingress $tundev "matchall $tcflags"
 147        fail_test_span_gre_dir $tundev ingress
 148
 149        ip link set dev $tundev type $type remote $correct_ip
 150        quick_test_span_gre_dir $tundev ingress
 151        mirror_uninstall $swp1 ingress
 152
 153        log_test "$what: remote address change ($tcflags)"
 154}
 155
 156test_span_gre_tun_del()
 157{
 158        local tundev=$1; shift
 159        local type=$1; shift
 160        local flags=$1; shift
 161        local local_ip=$1; shift
 162        local remote_ip=$1; shift
 163        local what=$1; shift
 164
 165        RET=0
 166
 167        mirror_install $swp1 ingress $tundev "matchall $tcflags"
 168        quick_test_span_gre_dir $tundev ingress
 169        ip link del dev $tundev
 170        fail_test_span_gre_dir $tundev ingress
 171
 172        tunnel_create $tundev $type $local_ip $remote_ip \
 173                      ttl 100 tos inherit $flags
 174
 175        # Recreating the tunnel doesn't reestablish mirroring, so reinstall it
 176        # and verify it works for the follow-up tests.
 177        mirror_uninstall $swp1 ingress
 178        mirror_install $swp1 ingress $tundev "matchall $tcflags"
 179        quick_test_span_gre_dir $tundev ingress
 180        mirror_uninstall $swp1 ingress
 181
 182        log_test "$what: tunnel deleted ($tcflags)"
 183}
 184
 185test_span_gre_route_del()
 186{
 187        local tundev=$1; shift
 188        local edev=$1; shift
 189        local route=$1; shift
 190        local what=$1; shift
 191
 192        RET=0
 193
 194        mirror_install $swp1 ingress $tundev "matchall $tcflags"
 195        quick_test_span_gre_dir $tundev ingress
 196
 197        ip route del $route dev $edev
 198        fail_test_span_gre_dir $tundev ingress
 199
 200        ip route add $route dev $edev
 201        quick_test_span_gre_dir $tundev ingress
 202
 203        mirror_uninstall $swp1 ingress
 204
 205        log_test "$what: underlay route removal ($tcflags)"
 206}
 207
 208test_ttl()
 209{
 210        test_span_gre_ttl gt4 gretap ip "mirror to gretap"
 211        test_span_gre_ttl gt6 ip6gretap ipv6 "mirror to ip6gretap"
 212}
 213
 214test_tun_up()
 215{
 216        test_span_gre_tun_up gt4 "mirror to gretap"
 217        test_span_gre_tun_up gt6 "mirror to ip6gretap"
 218}
 219
 220test_egress_up()
 221{
 222        test_span_gre_egress_up gt4 192.0.2.130 "mirror to gretap"
 223        test_span_gre_egress_up gt6 2001:db8:2::2 "mirror to ip6gretap"
 224}
 225
 226test_remote_ip()
 227{
 228        test_span_gre_remote_ip gt4 gretap 192.0.2.130 192.0.2.132 "mirror to gretap"
 229        test_span_gre_remote_ip gt6 ip6gretap 2001:db8:2::2 2001:db8:2::4 "mirror to ip6gretap"
 230}
 231
 232test_tun_del()
 233{
 234        test_span_gre_tun_del gt4 gretap "" \
 235                              192.0.2.129 192.0.2.130 "mirror to gretap"
 236        test_span_gre_tun_del gt6 ip6gretap allow-localremote \
 237                              2001:db8:2::1 2001:db8:2::2 "mirror to ip6gretap"
 238}
 239
 240test_route_del()
 241{
 242        test_span_gre_route_del gt4 $swp3 192.0.2.128/28 "mirror to gretap"
 243        test_span_gre_route_del gt6 $swp3 2001:db8:2::/64 "mirror to ip6gretap"
 244}
 245
 246test_all()
 247{
 248        slow_path_trap_install $swp1 ingress
 249        slow_path_trap_install $swp1 egress
 250
 251        tests_run
 252
 253        slow_path_trap_uninstall $swp1 egress
 254        slow_path_trap_uninstall $swp1 ingress
 255}
 256
 257trap cleanup EXIT
 258
 259setup_prepare
 260setup_wait
 261
 262tcflags="skip_hw"
 263test_all
 264
 265if ! tc_offload_check; then
 266        echo "WARN: Could not test offloaded functionality"
 267else
 268        tcflags="skip_sw"
 269        test_all
 270fi
 271
 272exit $EXIT_STATUS
 273