Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: forwarding: Add IPv6 GRE flat tests

Add tests that check IPv6-in-IPv6, IPv4-in-IPv6 and MTU change of GRE
tunnel. The tests use flat model - overlay and underlay share the same VRF.

These tests can be run with TC_FLAG=skip_sw, so then they will verify
that packets go through hardware as part of enacp and decap phases.

Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Amit Cohen and committed by
David S. Miller
7df29960 c08d2272

+465
+65
tools/testing/selftests/net/forwarding/ip6gre_flat.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + # Test IP-in-IP GRE tunnel without key. 5 + # This test uses flat topology for IP tunneling tests. See ip6gre_lib.sh for 6 + # more details. 7 + 8 + ALL_TESTS=" 9 + gre_flat 10 + gre_mtu_change 11 + " 12 + 13 + NUM_NETIFS=6 14 + source lib.sh 15 + source ip6gre_lib.sh 16 + 17 + setup_prepare() 18 + { 19 + h1=${NETIFS[p1]} 20 + ol1=${NETIFS[p2]} 21 + 22 + ul1=${NETIFS[p3]} 23 + ul2=${NETIFS[p4]} 24 + 25 + ol2=${NETIFS[p5]} 26 + h2=${NETIFS[p6]} 27 + 28 + forwarding_enable 29 + vrf_prepare 30 + h1_create 31 + h2_create 32 + sw1_flat_create $ol1 $ul1 33 + sw2_flat_create $ol2 $ul2 34 + } 35 + 36 + gre_flat() 37 + { 38 + test_traffic_ip4ip6 "GRE flat IPv4-in-IPv6" 39 + test_traffic_ip6ip6 "GRE flat IPv6-in-IPv6" 40 + } 41 + 42 + gre_mtu_change() 43 + { 44 + test_mtu_change 45 + } 46 + 47 + cleanup() 48 + { 49 + pre_cleanup 50 + 51 + sw2_flat_destroy $ol2 $ul2 52 + sw1_flat_destroy $ol1 $ul1 53 + h2_destroy 54 + h1_destroy 55 + vrf_cleanup 56 + forwarding_restore 57 + } 58 + 59 + trap cleanup EXIT 60 + 61 + setup_prepare 62 + setup_wait 63 + tests_run 64 + 65 + exit $EXIT_STATUS
+65
tools/testing/selftests/net/forwarding/ip6gre_flat_key.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + # Test IP-in-IP GRE tunnel with key. 5 + # This test uses flat topology for IP tunneling tests. See ip6gre_lib.sh for 6 + # more details. 7 + 8 + ALL_TESTS=" 9 + gre_flat 10 + gre_mtu_change 11 + " 12 + 13 + NUM_NETIFS=6 14 + source lib.sh 15 + source ip6gre_lib.sh 16 + 17 + setup_prepare() 18 + { 19 + h1=${NETIFS[p1]} 20 + ol1=${NETIFS[p2]} 21 + 22 + ul1=${NETIFS[p3]} 23 + ul2=${NETIFS[p4]} 24 + 25 + ol2=${NETIFS[p5]} 26 + h2=${NETIFS[p6]} 27 + 28 + forwarding_enable 29 + vrf_prepare 30 + h1_create 31 + h2_create 32 + sw1_flat_create $ol1 $ul1 key 233 33 + sw2_flat_create $ol2 $ul2 key 233 34 + } 35 + 36 + gre_flat() 37 + { 38 + test_traffic_ip4ip6 "GRE flat IPv4-in-IPv6 with key" 39 + test_traffic_ip6ip6 "GRE flat IPv6-in-IPv6 with key" 40 + } 41 + 42 + gre_mtu_change() 43 + { 44 + test_mtu_change 45 + } 46 + 47 + cleanup() 48 + { 49 + pre_cleanup 50 + 51 + sw2_flat_destroy $ol2 $ul2 52 + sw1_flat_destroy $ol1 $ul1 53 + h2_destroy 54 + h1_destroy 55 + vrf_cleanup 56 + forwarding_restore 57 + } 58 + 59 + trap cleanup EXIT 60 + 61 + setup_prepare 62 + setup_wait 63 + tests_run 64 + 65 + exit $EXIT_STATUS
+65
tools/testing/selftests/net/forwarding/ip6gre_flat_keys.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + # Test IP-in-IP GRE tunnel with keys. 5 + # This test uses flat topology for IP tunneling tests. See ip6gre_lib.sh for 6 + # more details. 7 + 8 + ALL_TESTS=" 9 + gre_flat 10 + gre_mtu_change 11 + " 12 + 13 + NUM_NETIFS=6 14 + source lib.sh 15 + source ip6gre_lib.sh 16 + 17 + setup_prepare() 18 + { 19 + h1=${NETIFS[p1]} 20 + ol1=${NETIFS[p2]} 21 + 22 + ul1=${NETIFS[p3]} 23 + ul2=${NETIFS[p4]} 24 + 25 + ol2=${NETIFS[p5]} 26 + h2=${NETIFS[p6]} 27 + 28 + forwarding_enable 29 + vrf_prepare 30 + h1_create 31 + h2_create 32 + sw1_flat_create $ol1 $ul1 ikey 111 okey 222 33 + sw2_flat_create $ol2 $ul2 ikey 222 okey 111 34 + } 35 + 36 + gre_flat() 37 + { 38 + test_traffic_ip4ip6 "GRE flat IPv4-in-IPv6 with ikey/okey" 39 + test_traffic_ip6ip6 "GRE flat IPv6-in-IPv6 with ikey/okey" 40 + } 41 + 42 + gre_mtu_change() 43 + { 44 + test_mtu_change gre 45 + } 46 + 47 + cleanup() 48 + { 49 + pre_cleanup 50 + 51 + sw2_flat_destroy $ol2 $ul2 52 + sw1_flat_destroy $ol1 $ul1 53 + h2_destroy 54 + h1_destroy 55 + vrf_cleanup 56 + forwarding_restore 57 + } 58 + 59 + trap cleanup EXIT 60 + 61 + setup_prepare 62 + setup_wait 63 + tests_run 64 + 65 + exit $EXIT_STATUS
+270
tools/testing/selftests/net/forwarding/ip6gre_lib.sh
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + #!/bin/bash 3 + 4 + # Handles creation and destruction of IP-in-IP or GRE tunnels over the given 5 + # topology. 6 + # 7 + # Flat Model: 8 + # Overlay and underlay share the same VRF. 9 + # SW1 uses default VRF so tunnel has no bound dev. 10 + # SW2 uses non-default VRF tunnel has a bound dev. 11 + # +--------------------------------+ 12 + # | H1 | 13 + # | $h1 + | 14 + # | 198.51.100.1/24 | | 15 + # | 2001:db8:1::1/64 | | 16 + # +-------------------------|------+ 17 + # | 18 + # +-------------------------|-------------------+ 19 + # | SW1 | | 20 + # | $ol1 + | 21 + # | 198.51.100.2/24 | 22 + # | 2001:db8:1::2/64 | 23 + # | | 24 + # | + g1a (ip6gre) | 25 + # | loc=2001:db8:3::1 | 26 + # | rem=2001:db8:3::2 --. | 27 + # | tos=inherit | | 28 + # | . | 29 + # | .--------------------- | 30 + # | | | 31 + # | v | 32 + # | + $ul1.111 (vlan) | 33 + # | | 2001:db8:10::1/64 | 34 + # | \ | 35 + # | \____________ | 36 + # | | | 37 + # | VRF default + $ul1 | 38 + # +---------------------|-----------------------+ 39 + # | 40 + # +---------------------|-----------------------+ 41 + # | SW2 | | 42 + # | $ul2 + | 43 + # | ___________| | 44 + # | / | 45 + # | / | 46 + # | + $ul2.111 (vlan) | 47 + # | ^ 2001:db8:10::2/64 | 48 + # | | | 49 + # | | | 50 + # | '----------------------. | 51 + # | + g2a (ip6gre) | | 52 + # | loc=2001:db8:3::2 | | 53 + # | rem=2001:db8:3::1 --' | 54 + # | tos=inherit | 55 + # | | 56 + # | + $ol2 | 57 + # | | 203.0.113.2/24 | 58 + # | VRF v$ol2 | 2001:db8:2::2/64 | 59 + # +---------------------|-----------------------+ 60 + # +---------------------|----------+ 61 + # | H2 | | 62 + # | $h2 + | 63 + # | 203.0.113.1/24 | 64 + # | 2001:db8:2::1/64 | 65 + # +--------------------------------+ 66 + 67 + source lib.sh 68 + source tc_common.sh 69 + 70 + h1_create() 71 + { 72 + simple_if_init $h1 198.51.100.1/24 2001:db8:1::1/64 73 + ip route add vrf v$h1 203.0.113.0/24 via 198.51.100.2 74 + ip -6 route add vrf v$h1 2001:db8:2::/64 via 2001:db8:1::2 75 + } 76 + 77 + h1_destroy() 78 + { 79 + ip -6 route del vrf v$h1 2001:db8:2::/64 via 2001:db8:1::2 80 + ip route del vrf v$h1 203.0.113.0/24 via 198.51.100.2 81 + simple_if_fini $h1 198.51.100.1/24 2001:db8:1::1/64 82 + } 83 + 84 + h2_create() 85 + { 86 + simple_if_init $h2 203.0.113.1/24 2001:db8:2::1/64 87 + ip route add vrf v$h2 198.51.100.0/24 via 203.0.113.2 88 + ip -6 route add vrf v$h2 2001:db8:1::/64 via 2001:db8:2::2 89 + } 90 + 91 + h2_destroy() 92 + { 93 + ip -6 route del vrf v$h2 2001:db8:1::/64 via 2001:db8:2::2 94 + ip route del vrf v$h2 198.51.100.0/24 via 203.0.113.2 95 + simple_if_fini $h2 203.0.113.1/24 2001:db8:2::1/64 96 + } 97 + 98 + sw1_flat_create() 99 + { 100 + local ol1=$1; shift 101 + local ul1=$1; shift 102 + 103 + ip link set dev $ol1 up 104 + __addr_add_del $ol1 add 198.51.100.2/24 2001:db8:1::2/64 105 + 106 + ip link set dev $ul1 up 107 + vlan_create $ul1 111 "" 2001:db8:10::1/64 108 + 109 + tunnel_create g1a ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \ 110 + ttl inherit "$@" 111 + ip link set dev g1a up 112 + __addr_add_del g1a add "2001:db8:3::1/128" 113 + 114 + ip -6 route add 2001:db8:3::2/128 via 2001:db8:10::2 115 + ip route add 203.0.113.0/24 dev g1a 116 + ip -6 route add 2001:db8:2::/64 dev g1a 117 + } 118 + 119 + sw1_flat_destroy() 120 + { 121 + local ol1=$1; shift 122 + local ul1=$1; shift 123 + 124 + ip -6 route del 2001:db8:2::/64 125 + ip route del 203.0.113.0/24 126 + ip -6 route del 2001:db8:3::2/128 via 2001:db8:10::2 127 + 128 + __simple_if_fini g1a 2001:db8:3::1/128 129 + tunnel_destroy g1a 130 + 131 + vlan_destroy $ul1 111 132 + __simple_if_fini $ul1 133 + __simple_if_fini $ol1 198.51.100.2/24 2001:db8:1::2/64 134 + } 135 + 136 + sw2_flat_create() 137 + { 138 + local ol2=$1; shift 139 + local ul2=$1; shift 140 + 141 + simple_if_init $ol2 203.0.113.2/24 2001:db8:2::2/64 142 + __simple_if_init $ul2 v$ol2 143 + vlan_create $ul2 111 v$ol2 2001:db8:10::2/64 144 + 145 + tunnel_create g2a ip6gre 2001:db8:3::2 2001:db8:3::1 tos inherit \ 146 + ttl inherit dev v$ol2 "$@" 147 + __simple_if_init g2a v$ol2 2001:db8:3::2/128 148 + 149 + # Replace neighbor to avoid 1 dropped packet due to "unresolved neigh" 150 + ip neigh replace dev $ol2 203.0.113.1 lladdr $(mac_get $h2) 151 + ip -6 neigh replace dev $ol2 2001:db8:2::1 lladdr $(mac_get $h2) 152 + 153 + ip -6 route add vrf v$ol2 2001:db8:3::1/128 via 2001:db8:10::1 154 + ip route add vrf v$ol2 198.51.100.0/24 dev g2a 155 + ip -6 route add vrf v$ol2 2001:db8:1::/64 dev g2a 156 + } 157 + 158 + sw2_flat_destroy() 159 + { 160 + local ol2=$1; shift 161 + local ul2=$1; shift 162 + 163 + ip -6 route del vrf v$ol2 2001:db8:2::/64 164 + ip route del vrf v$ol2 198.51.100.0/24 165 + ip -6 route del vrf v$ol2 2001:db8:3::1/128 via 2001:db8:10::1 166 + 167 + __simple_if_fini g2a 2001:db8:3::2/128 168 + tunnel_destroy g2a 169 + 170 + vlan_destroy $ul2 111 171 + __simple_if_fini $ul2 172 + simple_if_fini $ol2 203.0.113.2/24 2001:db8:2::2/64 173 + } 174 + 175 + test_traffic_ip4ip6() 176 + { 177 + RET=0 178 + 179 + h1mac=$(mac_get $h1) 180 + ol1mac=$(mac_get $ol1) 181 + 182 + tc qdisc add dev $ul1 clsact 183 + tc filter add dev $ul1 egress proto all pref 1 handle 101 \ 184 + flower $TC_FLAG action pass 185 + 186 + tc qdisc add dev $ol2 clsact 187 + tc filter add dev $ol2 egress protocol ipv4 pref 1 handle 101 \ 188 + flower $TC_FLAG dst_ip 203.0.113.1 action pass 189 + 190 + $MZ $h1 -c 1000 -p 64 -a $h1mac -b $ol1mac -A 198.51.100.1 \ 191 + -B 203.0.113.1 -t ip -q -d 1msec 192 + 193 + # Check ports after encap and after decap. 194 + tc_check_at_least_x_packets "dev $ul1 egress" 101 1000 195 + check_err $? "Packets did not go through $ul1, tc_flag = $TC_FLAG" 196 + 197 + tc_check_at_least_x_packets "dev $ol2 egress" 101 1000 198 + check_err $? "Packets did not go through $ol2, tc_flag = $TC_FLAG" 199 + 200 + log_test "$@" 201 + 202 + tc filter del dev $ol2 egress protocol ipv4 pref 1 handle 101 flower 203 + tc qdisc del dev $ol2 clsact 204 + tc filter del dev $ul1 egress proto all pref 1 handle 101 flower 205 + tc qdisc del dev $ul1 clsact 206 + } 207 + 208 + test_traffic_ip6ip6() 209 + { 210 + RET=0 211 + 212 + h1mac=$(mac_get $h1) 213 + ol1mac=$(mac_get $ol1) 214 + 215 + tc qdisc add dev $ul1 clsact 216 + tc filter add dev $ul1 egress proto all pref 1 handle 101 \ 217 + flower $TC_FLAG action pass 218 + 219 + tc qdisc add dev $ol2 clsact 220 + tc filter add dev $ol2 egress protocol ipv6 pref 1 handle 101 \ 221 + flower $TC_FLAG dst_ip 2001:db8:2::1 action pass 222 + 223 + $MZ -6 $h1 -c 1000 -p 64 -a $h1mac -b $ol1mac -A 2001:db8:1::1 \ 224 + -B 2001:db8:2::1 -t ip -q -d 1msec 225 + 226 + # Check ports after encap and after decap. 227 + tc_check_at_least_x_packets "dev $ul1 egress" 101 1000 228 + check_err $? "Packets did not go through $ul1, tc_flag = $TC_FLAG" 229 + 230 + tc_check_at_least_x_packets "dev $ol2 egress" 101 1000 231 + check_err $? "Packets did not go through $ol2, tc_flag = $TC_FLAG" 232 + 233 + log_test "$@" 234 + 235 + tc filter del dev $ol2 egress protocol ipv6 pref 1 handle 101 flower 236 + tc qdisc del dev $ol2 clsact 237 + tc filter del dev $ul1 egress proto all pref 1 handle 101 flower 238 + tc qdisc del dev $ul1 clsact 239 + } 240 + 241 + topo_mtu_change() 242 + { 243 + local mtu=$1 244 + 245 + ip link set mtu $mtu dev $h1 246 + ip link set mtu $mtu dev $ol1 247 + ip link set mtu $mtu dev g1a 248 + ip link set mtu $mtu dev $ul1 249 + ip link set mtu $mtu dev $ul1.111 250 + ip link set mtu $mtu dev $h2 251 + ip link set mtu $mtu dev $ol2 252 + ip link set mtu $mtu dev g2a 253 + ip link set mtu $mtu dev $ul2 254 + ip link set mtu $mtu dev $ul2.111 255 + } 256 + 257 + test_mtu_change() 258 + { 259 + RET=0 260 + 261 + ping6_do $h1 2001:db8:2::1 "-s 1800 -w 3" 262 + check_fail $? "ping GRE IPv6 should not pass with packet size 1800" 263 + 264 + RET=0 265 + 266 + topo_mtu_change 2000 267 + ping6_do $h1 2001:db8:2::1 "-s 1800 -w 3" 268 + check_err $? 269 + log_test "ping GRE IPv6, packet size 1800 after MTU change" 270 + }