xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/net/pmtu.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/sh
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker#
4*053f45beSAndroid Build Coastguard Worker# Check that route PMTU values match expectations, and that initial device MTU
5*053f45beSAndroid Build Coastguard Worker# values are assigned correctly
6*053f45beSAndroid Build Coastguard Worker#
7*053f45beSAndroid Build Coastguard Worker# Tests currently implemented:
8*053f45beSAndroid Build Coastguard Worker#
9*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv4
10*053f45beSAndroid Build Coastguard Worker#	Set up two namespaces, A and B, with two paths between them over routers
11*053f45beSAndroid Build Coastguard Worker#	R1 and R2 (also implemented with namespaces), with different MTUs:
12*053f45beSAndroid Build Coastguard Worker#
13*053f45beSAndroid Build Coastguard Worker#	  segment a_r1    segment b_r1		a_r1: 2000
14*053f45beSAndroid Build Coastguard Worker#	.--------------R1--------------.	b_r1: 1400
15*053f45beSAndroid Build Coastguard Worker#	A                               B	a_r2: 2000
16*053f45beSAndroid Build Coastguard Worker#	'--------------R2--------------'	b_r2: 1500
17*053f45beSAndroid Build Coastguard Worker#	  segment a_r2    segment b_r2
18*053f45beSAndroid Build Coastguard Worker#
19*053f45beSAndroid Build Coastguard Worker#	Check that PMTU exceptions with the correct PMTU are created. Then
20*053f45beSAndroid Build Coastguard Worker#	decrease and increase the MTU of the local link for one of the paths,
21*053f45beSAndroid Build Coastguard Worker#	A to R1, checking that route exception PMTU changes accordingly over
22*053f45beSAndroid Build Coastguard Worker#	this path. Also check that locked exceptions are created when an ICMP
23*053f45beSAndroid Build Coastguard Worker#	message advertising a PMTU smaller than net.ipv4.route.min_pmtu is
24*053f45beSAndroid Build Coastguard Worker#	received
25*053f45beSAndroid Build Coastguard Worker#
26*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv6
27*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv4, except for locked PMTU tests, using IPv6
28*053f45beSAndroid Build Coastguard Worker#
29*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv4_dscp_icmp_exception
30*053f45beSAndroid Build Coastguard Worker#	Set up the same network topology as pmtu_ipv4, but use non-default
31*053f45beSAndroid Build Coastguard Worker#	routing table in A. A fib-rule is used to jump to this routing table
32*053f45beSAndroid Build Coastguard Worker#	based on DSCP. Send ICMPv4 packets with the expected DSCP value and
33*053f45beSAndroid Build Coastguard Worker#	verify that ECN doesn't interfere with the creation of PMTU exceptions.
34*053f45beSAndroid Build Coastguard Worker#
35*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv4_dscp_udp_exception
36*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv4_dscp_icmp_exception, but use UDP instead of ICMP.
37*053f45beSAndroid Build Coastguard Worker#
38*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv4_vxlan4_exception
39*053f45beSAndroid Build Coastguard Worker#	Set up the same network topology as pmtu_ipv4, create a VXLAN tunnel
40*053f45beSAndroid Build Coastguard Worker#	over IPv4 between A and B, routed via R1. On the link between R1 and B,
41*053f45beSAndroid Build Coastguard Worker#	set a MTU lower than the VXLAN MTU and the MTU on the link between A and
42*053f45beSAndroid Build Coastguard Worker#	R1. Send IPv4 packets, exceeding the MTU between R1 and B, over VXLAN
43*053f45beSAndroid Build Coastguard Worker#	from A to B and check that the PMTU exception is created with the right
44*053f45beSAndroid Build Coastguard Worker#	value on A
45*053f45beSAndroid Build Coastguard Worker#
46*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv6_vxlan4_exception
47*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv4_vxlan4_exception, but send IPv6 packets from A to B
48*053f45beSAndroid Build Coastguard Worker#
49*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv4_vxlan6_exception
50*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv4_vxlan4_exception, but use IPv6 transport from A to B
51*053f45beSAndroid Build Coastguard Worker#
52*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv6_vxlan6_exception
53*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv4_vxlan6_exception, but send IPv6 packets from A to B
54*053f45beSAndroid Build Coastguard Worker#
55*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv4_geneve4_exception
56*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv4_vxlan4_exception, but using a GENEVE tunnel instead of
57*053f45beSAndroid Build Coastguard Worker#	VXLAN
58*053f45beSAndroid Build Coastguard Worker#
59*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv6_geneve4_exception
60*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv6_vxlan4_exception, but using a GENEVE tunnel instead of
61*053f45beSAndroid Build Coastguard Worker#	VXLAN
62*053f45beSAndroid Build Coastguard Worker#
63*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv4_geneve6_exception
64*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv4_vxlan6_exception, but using a GENEVE tunnel instead of
65*053f45beSAndroid Build Coastguard Worker#	VXLAN
66*053f45beSAndroid Build Coastguard Worker#
67*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv6_geneve6_exception
68*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv6_vxlan6_exception, but using a GENEVE tunnel instead of
69*053f45beSAndroid Build Coastguard Worker#	VXLAN
70*053f45beSAndroid Build Coastguard Worker#
71*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv{4,6}_br_vxlan{4,6}_exception
72*053f45beSAndroid Build Coastguard Worker#	Set up three namespaces, A, B, and C, with routing between A and B over
73*053f45beSAndroid Build Coastguard Worker#	R1. R2 is unused in these tests. A has a veth connection to C, and is
74*053f45beSAndroid Build Coastguard Worker#	connected to B via a VXLAN endpoint, which is directly bridged to C.
75*053f45beSAndroid Build Coastguard Worker#	MTU on the B-R1 link is lower than other MTUs.
76*053f45beSAndroid Build Coastguard Worker#
77*053f45beSAndroid Build Coastguard Worker#	Check that both C and A are able to communicate with B over the VXLAN
78*053f45beSAndroid Build Coastguard Worker#	tunnel, and that PMTU exceptions with the correct values are created.
79*053f45beSAndroid Build Coastguard Worker#
80*053f45beSAndroid Build Coastguard Worker#	                  segment a_r1    segment b_r1            b_r1: 4000
81*053f45beSAndroid Build Coastguard Worker#	                .--------------R1--------------.    everything
82*053f45beSAndroid Build Coastguard Worker#	   C---veth     A                               B         else: 5000
83*053f45beSAndroid Build Coastguard Worker#	        ' bridge                                |
84*053f45beSAndroid Build Coastguard Worker#	            '---- - - - - - VXLAN - - - - - - - '
85*053f45beSAndroid Build Coastguard Worker#
86*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv{4,6}_br_geneve{4,6}_exception
87*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv{4,6}_br_vxlan{4,6}_exception, with a GENEVE tunnel
88*053f45beSAndroid Build Coastguard Worker#	instead.
89*053f45beSAndroid Build Coastguard Worker#
90*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv{4,6}_ovs_vxlan{4,6}_exception
91*053f45beSAndroid Build Coastguard Worker#	Set up two namespaces, B, and C, with routing between the init namespace
92*053f45beSAndroid Build Coastguard Worker#	and B over R1. A and R2 are unused in these tests. The init namespace
93*053f45beSAndroid Build Coastguard Worker#	has a veth connection to C, and is connected to B via a VXLAN endpoint,
94*053f45beSAndroid Build Coastguard Worker#	which is handled by Open vSwitch and bridged to C. MTU on the B-R1 link
95*053f45beSAndroid Build Coastguard Worker#	is lower than other MTUs.
96*053f45beSAndroid Build Coastguard Worker#
97*053f45beSAndroid Build Coastguard Worker#	Check that C is able to communicate with B over the VXLAN tunnel, and
98*053f45beSAndroid Build Coastguard Worker#	that PMTU exceptions with the correct values are created.
99*053f45beSAndroid Build Coastguard Worker#
100*053f45beSAndroid Build Coastguard Worker#	                  segment a_r1    segment b_r1            b_r1: 4000
101*053f45beSAndroid Build Coastguard Worker#	                .--------------R1--------------.    everything
102*053f45beSAndroid Build Coastguard Worker#	   C---veth    init                             B         else: 5000
103*053f45beSAndroid Build Coastguard Worker#	        '- ovs                                  |
104*053f45beSAndroid Build Coastguard Worker#	            '---- - - - - - VXLAN - - - - - - - '
105*053f45beSAndroid Build Coastguard Worker#
106*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv{4,6}_ovs_geneve{4,6}_exception
107*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv{4,6}_ovs_vxlan{4,6}_exception, with a GENEVE tunnel
108*053f45beSAndroid Build Coastguard Worker#	instead.
109*053f45beSAndroid Build Coastguard Worker#
110*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv{4,6}_fou{4,6}_exception
111*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv4_vxlan4, but using a direct IPv4/IPv6 encapsulation
112*053f45beSAndroid Build Coastguard Worker#	(FoU) over IPv4/IPv6, instead of VXLAN
113*053f45beSAndroid Build Coastguard Worker#
114*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv{4,6}_fou{4,6}_exception
115*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv4_vxlan4, but using a generic UDP IPv4/IPv6
116*053f45beSAndroid Build Coastguard Worker#	encapsulation (GUE) over IPv4/IPv6, instead of VXLAN
117*053f45beSAndroid Build Coastguard Worker#
118*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv{4,6}_ipv{4,6}_exception
119*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_ipv4_vxlan4, but using a IPv4/IPv6 tunnel over IPv4/IPv6,
120*053f45beSAndroid Build Coastguard Worker#	instead of VXLAN
121*053f45beSAndroid Build Coastguard Worker#
122*053f45beSAndroid Build Coastguard Worker# - pmtu_vti4_exception
123*053f45beSAndroid Build Coastguard Worker#	Set up vti tunnel on top of veth, with xfrm states and policies, in two
124*053f45beSAndroid Build Coastguard Worker#	namespaces with matching endpoints. Check that route exception is not
125*053f45beSAndroid Build Coastguard Worker#	created if link layer MTU is not exceeded, then exceed it and check that
126*053f45beSAndroid Build Coastguard Worker#	exception is created with the expected PMTU. The approach described
127*053f45beSAndroid Build Coastguard Worker#	below for IPv6 doesn't apply here, because, on IPv4, administrative MTU
128*053f45beSAndroid Build Coastguard Worker#	changes alone won't affect PMTU
129*053f45beSAndroid Build Coastguard Worker#
130*053f45beSAndroid Build Coastguard Worker# - pmtu_vti4_udp_exception
131*053f45beSAndroid Build Coastguard Worker#       Same as pmtu_vti4_exception, but using ESP-in-UDP
132*053f45beSAndroid Build Coastguard Worker#
133*053f45beSAndroid Build Coastguard Worker# - pmtu_vti4_udp_routed_exception
134*053f45beSAndroid Build Coastguard Worker#       Set up vti tunnel on top of veth connected through routing namespace and
135*053f45beSAndroid Build Coastguard Worker#	add xfrm states and policies with ESP-in-UDP encapsulation. Check that
136*053f45beSAndroid Build Coastguard Worker#	route exception is not created if link layer MTU is not exceeded, then
137*053f45beSAndroid Build Coastguard Worker#	lower MTU on second part of routed environment and check that exception
138*053f45beSAndroid Build Coastguard Worker#	is created with the expected PMTU.
139*053f45beSAndroid Build Coastguard Worker#
140*053f45beSAndroid Build Coastguard Worker# - pmtu_vti6_exception
141*053f45beSAndroid Build Coastguard Worker#	Set up vti6 tunnel on top of veth, with xfrm states and policies, in two
142*053f45beSAndroid Build Coastguard Worker#	namespaces with matching endpoints. Check that route exception is
143*053f45beSAndroid Build Coastguard Worker#	created by exceeding link layer MTU with ping to other endpoint. Then
144*053f45beSAndroid Build Coastguard Worker#	decrease and increase MTU of tunnel, checking that route exception PMTU
145*053f45beSAndroid Build Coastguard Worker#	changes accordingly
146*053f45beSAndroid Build Coastguard Worker#
147*053f45beSAndroid Build Coastguard Worker# - pmtu_vti6_udp_exception
148*053f45beSAndroid Build Coastguard Worker#       Same as pmtu_vti6_exception, but using ESP-in-UDP
149*053f45beSAndroid Build Coastguard Worker#
150*053f45beSAndroid Build Coastguard Worker# - pmtu_vti6_udp_routed_exception
151*053f45beSAndroid Build Coastguard Worker#	Same as pmtu_vti6_udp_routed_exception but with routing between vti
152*053f45beSAndroid Build Coastguard Worker#	endpoints
153*053f45beSAndroid Build Coastguard Worker#
154*053f45beSAndroid Build Coastguard Worker# - pmtu_vti4_default_mtu
155*053f45beSAndroid Build Coastguard Worker#	Set up vti4 tunnel on top of veth, in two namespaces with matching
156*053f45beSAndroid Build Coastguard Worker#	endpoints. Check that MTU assigned to vti interface is the MTU of the
157*053f45beSAndroid Build Coastguard Worker#	lower layer (veth) minus additional lower layer headers (zero, for veth)
158*053f45beSAndroid Build Coastguard Worker#	minus IPv4 header length
159*053f45beSAndroid Build Coastguard Worker#
160*053f45beSAndroid Build Coastguard Worker# - pmtu_vti6_default_mtu
161*053f45beSAndroid Build Coastguard Worker#	Same as above, for IPv6
162*053f45beSAndroid Build Coastguard Worker#
163*053f45beSAndroid Build Coastguard Worker# - pmtu_vti4_link_add_mtu
164*053f45beSAndroid Build Coastguard Worker#	Set up vti4 interface passing MTU value at link creation, check MTU is
165*053f45beSAndroid Build Coastguard Worker#	configured, and that link is not created with invalid MTU values
166*053f45beSAndroid Build Coastguard Worker#
167*053f45beSAndroid Build Coastguard Worker# - pmtu_vti6_link_add_mtu
168*053f45beSAndroid Build Coastguard Worker#	Same as above, for IPv6
169*053f45beSAndroid Build Coastguard Worker#
170*053f45beSAndroid Build Coastguard Worker# - pmtu_vti6_link_change_mtu
171*053f45beSAndroid Build Coastguard Worker#	Set up two dummy interfaces with different MTUs, create a vti6 tunnel
172*053f45beSAndroid Build Coastguard Worker#	and check that configured MTU is used on link creation and changes, and
173*053f45beSAndroid Build Coastguard Worker#	that MTU is properly calculated instead when MTU is not configured from
174*053f45beSAndroid Build Coastguard Worker#	userspace
175*053f45beSAndroid Build Coastguard Worker#
176*053f45beSAndroid Build Coastguard Worker# - cleanup_ipv4_exception
177*053f45beSAndroid Build Coastguard Worker#	Similar to pmtu_ipv4_vxlan4_exception, but explicitly generate PMTU
178*053f45beSAndroid Build Coastguard Worker#	exceptions on multiple CPUs and check that the veth device tear-down
179*053f45beSAndroid Build Coastguard Worker# 	happens in a timely manner
180*053f45beSAndroid Build Coastguard Worker#
181*053f45beSAndroid Build Coastguard Worker# - cleanup_ipv6_exception
182*053f45beSAndroid Build Coastguard Worker#	Same as above, but use IPv6 transport from A to B
183*053f45beSAndroid Build Coastguard Worker#
184*053f45beSAndroid Build Coastguard Worker# - list_flush_ipv4_exception
185*053f45beSAndroid Build Coastguard Worker#	Using the same topology as in pmtu_ipv4, create exceptions, and check
186*053f45beSAndroid Build Coastguard Worker#	they are shown when listing exception caches, gone after flushing them
187*053f45beSAndroid Build Coastguard Worker#
188*053f45beSAndroid Build Coastguard Worker# - list_flush_ipv6_exception
189*053f45beSAndroid Build Coastguard Worker#	Using the same topology as in pmtu_ipv6, create exceptions, and check
190*053f45beSAndroid Build Coastguard Worker#	they are shown when listing exception caches, gone after flushing them
191*053f45beSAndroid Build Coastguard Worker#
192*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv4_route_change
193*053f45beSAndroid Build Coastguard Worker#	Use the same topology as in pmtu_ipv4, but issue a route replacement
194*053f45beSAndroid Build Coastguard Worker#	command and delete the corresponding device afterward. This tests for
195*053f45beSAndroid Build Coastguard Worker#	proper cleanup of the PMTU exceptions by the route replacement path.
196*053f45beSAndroid Build Coastguard Worker#	Device unregistration should complete successfully
197*053f45beSAndroid Build Coastguard Worker#
198*053f45beSAndroid Build Coastguard Worker# - pmtu_ipv6_route_change
199*053f45beSAndroid Build Coastguard Worker#	Same as above but with IPv6
200*053f45beSAndroid Build Coastguard Worker
201*053f45beSAndroid Build Coastguard Worker# Kselftest framework requirement - SKIP code is 4.
202*053f45beSAndroid Build Coastguard Workerksft_skip=4
203*053f45beSAndroid Build Coastguard Worker
204*053f45beSAndroid Build Coastguard WorkerPAUSE_ON_FAIL=no
205*053f45beSAndroid Build Coastguard WorkerVERBOSE=0
206*053f45beSAndroid Build Coastguard WorkerTRACING=0
207*053f45beSAndroid Build Coastguard Worker
208*053f45beSAndroid Build Coastguard Worker# Some systems don't have a ping6 binary anymore
209*053f45beSAndroid Build Coastguard Workerwhich ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping)
210*053f45beSAndroid Build Coastguard Worker
211*053f45beSAndroid Build Coastguard Worker#               Name                          Description                  re-run with nh
212*053f45beSAndroid Build Coastguard Workertests="
213*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_exception		ipv4: PMTU exceptions			1
214*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_exception		ipv6: PMTU exceptions			1
215*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_dscp_icmp_exception	ICMPv4 with DSCP and ECN: PMTU exceptions	1
216*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_dscp_udp_exception	UDPv4 with DSCP and ECN: PMTU exceptions	1
217*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_vxlan4_exception	IPv4 over vxlan4: PMTU exceptions	1
218*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_vxlan4_exception	IPv6 over vxlan4: PMTU exceptions	1
219*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_vxlan6_exception	IPv4 over vxlan6: PMTU exceptions	1
220*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_vxlan6_exception	IPv6 over vxlan6: PMTU exceptions	1
221*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_geneve4_exception	IPv4 over geneve4: PMTU exceptions	1
222*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_geneve4_exception	IPv6 over geneve4: PMTU exceptions	1
223*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_geneve6_exception	IPv4 over geneve6: PMTU exceptions	1
224*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_geneve6_exception	IPv6 over geneve6: PMTU exceptions	1
225*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_br_vxlan4_exception	IPv4, bridged vxlan4: PMTU exceptions	1
226*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_br_vxlan4_exception	IPv6, bridged vxlan4: PMTU exceptions	1
227*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_br_vxlan6_exception	IPv4, bridged vxlan6: PMTU exceptions	1
228*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_br_vxlan6_exception	IPv6, bridged vxlan6: PMTU exceptions	1
229*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_br_geneve4_exception	IPv4, bridged geneve4: PMTU exceptions	1
230*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_br_geneve4_exception	IPv6, bridged geneve4: PMTU exceptions	1
231*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_br_geneve6_exception	IPv4, bridged geneve6: PMTU exceptions	1
232*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_br_geneve6_exception	IPv6, bridged geneve6: PMTU exceptions	1
233*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_ovs_vxlan4_exception	IPv4, OVS vxlan4: PMTU exceptions	1
234*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_ovs_vxlan4_exception	IPv6, OVS vxlan4: PMTU exceptions	1
235*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_ovs_vxlan6_exception	IPv4, OVS vxlan6: PMTU exceptions	1
236*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_ovs_vxlan6_exception	IPv6, OVS vxlan6: PMTU exceptions	1
237*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_ovs_geneve4_exception	IPv4, OVS geneve4: PMTU exceptions	1
238*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_ovs_geneve4_exception	IPv6, OVS geneve4: PMTU exceptions	1
239*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_ovs_geneve6_exception	IPv4, OVS geneve6: PMTU exceptions	1
240*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_ovs_geneve6_exception	IPv6, OVS geneve6: PMTU exceptions	1
241*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_fou4_exception	IPv4 over fou4: PMTU exceptions		1
242*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_fou4_exception	IPv6 over fou4: PMTU exceptions		1
243*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_fou6_exception	IPv4 over fou6: PMTU exceptions		1
244*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_fou6_exception	IPv6 over fou6: PMTU exceptions		1
245*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_gue4_exception	IPv4 over gue4: PMTU exceptions		1
246*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_gue4_exception	IPv6 over gue4: PMTU exceptions		1
247*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_gue6_exception	IPv4 over gue6: PMTU exceptions		1
248*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_gue6_exception	IPv6 over gue6: PMTU exceptions		1
249*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_ipv4_exception	IPv4 over IPv4: PMTU exceptions		1
250*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_ipv4_exception	IPv6 over IPv4: PMTU exceptions		1
251*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_ipv6_exception	IPv4 over IPv6: PMTU exceptions		1
252*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_ipv6_exception	IPv6 over IPv6: PMTU exceptions		1
253*053f45beSAndroid Build Coastguard Worker	pmtu_vti6_exception		vti6: PMTU exceptions			0
254*053f45beSAndroid Build Coastguard Worker	pmtu_vti4_exception		vti4: PMTU exceptions			0
255*053f45beSAndroid Build Coastguard Worker	pmtu_vti6_udp_exception		vti6: PMTU exceptions (ESP-in-UDP)	0
256*053f45beSAndroid Build Coastguard Worker	pmtu_vti4_udp_exception		vti4: PMTU exceptions (ESP-in-UDP)	0
257*053f45beSAndroid Build Coastguard Worker	pmtu_vti6_udp_routed_exception	vti6: PMTU exceptions, routed (ESP-in-UDP)	0
258*053f45beSAndroid Build Coastguard Worker	pmtu_vti4_udp_routed_exception	vti4: PMTU exceptions, routed (ESP-in-UDP)	0
259*053f45beSAndroid Build Coastguard Worker	pmtu_vti4_default_mtu		vti4: default MTU assignment		0
260*053f45beSAndroid Build Coastguard Worker	pmtu_vti6_default_mtu		vti6: default MTU assignment		0
261*053f45beSAndroid Build Coastguard Worker	pmtu_vti4_link_add_mtu		vti4: MTU setting on link creation	0
262*053f45beSAndroid Build Coastguard Worker	pmtu_vti6_link_add_mtu		vti6: MTU setting on link creation	0
263*053f45beSAndroid Build Coastguard Worker	pmtu_vti6_link_change_mtu	vti6: MTU changes on link changes	0
264*053f45beSAndroid Build Coastguard Worker	cleanup_ipv4_exception		ipv4: cleanup of cached exceptions	1
265*053f45beSAndroid Build Coastguard Worker	cleanup_ipv6_exception		ipv6: cleanup of cached exceptions	1
266*053f45beSAndroid Build Coastguard Worker	list_flush_ipv4_exception	ipv4: list and flush cached exceptions	1
267*053f45beSAndroid Build Coastguard Worker	list_flush_ipv6_exception	ipv6: list and flush cached exceptions	1
268*053f45beSAndroid Build Coastguard Worker	pmtu_ipv4_route_change		ipv4: PMTU exception w/route replace	1
269*053f45beSAndroid Build Coastguard Worker	pmtu_ipv6_route_change		ipv6: PMTU exception w/route replace	1"
270*053f45beSAndroid Build Coastguard Worker
271*053f45beSAndroid Build Coastguard WorkerNS_A="ns-A"
272*053f45beSAndroid Build Coastguard WorkerNS_B="ns-B"
273*053f45beSAndroid Build Coastguard WorkerNS_C="ns-C"
274*053f45beSAndroid Build Coastguard WorkerNS_R1="ns-R1"
275*053f45beSAndroid Build Coastguard WorkerNS_R2="ns-R2"
276*053f45beSAndroid Build Coastguard Workerns_a="ip netns exec ${NS_A}"
277*053f45beSAndroid Build Coastguard Workerns_b="ip netns exec ${NS_B}"
278*053f45beSAndroid Build Coastguard Workerns_c="ip netns exec ${NS_C}"
279*053f45beSAndroid Build Coastguard Workerns_r1="ip netns exec ${NS_R1}"
280*053f45beSAndroid Build Coastguard Workerns_r2="ip netns exec ${NS_R2}"
281*053f45beSAndroid Build Coastguard Worker# Addressing and routing for tests with routers: four network segments, with
282*053f45beSAndroid Build Coastguard Worker# index SEGMENT between 1 and 4, a common prefix (PREFIX4 or PREFIX6) and an
283*053f45beSAndroid Build Coastguard Worker# identifier ID, which is 1 for hosts (A and B), 2 for routers (R1 and R2).
284*053f45beSAndroid Build Coastguard Worker# Addresses are:
285*053f45beSAndroid Build Coastguard Worker# - IPv4: PREFIX4.SEGMENT.ID (/24)
286*053f45beSAndroid Build Coastguard Worker# - IPv6: PREFIX6:SEGMENT::ID (/64)
287*053f45beSAndroid Build Coastguard Workerprefix4="10.0"
288*053f45beSAndroid Build Coastguard Workerprefix6="fc00"
289*053f45beSAndroid Build Coastguard Workera_r1=1
290*053f45beSAndroid Build Coastguard Workera_r2=2
291*053f45beSAndroid Build Coastguard Workerb_r1=3
292*053f45beSAndroid Build Coastguard Workerb_r2=4
293*053f45beSAndroid Build Coastguard Worker#	ns	peer	segment
294*053f45beSAndroid Build Coastguard Workerrouting_addrs="
295*053f45beSAndroid Build Coastguard Worker	A	R1	${a_r1}
296*053f45beSAndroid Build Coastguard Worker	A	R2	${a_r2}
297*053f45beSAndroid Build Coastguard Worker	B	R1	${b_r1}
298*053f45beSAndroid Build Coastguard Worker	B	R2	${b_r2}
299*053f45beSAndroid Build Coastguard Worker"
300*053f45beSAndroid Build Coastguard Worker# Traffic from A to B goes through R1 by default, and through R2, if destined to
301*053f45beSAndroid Build Coastguard Worker# B's address on the b_r2 segment.
302*053f45beSAndroid Build Coastguard Worker# Traffic from B to A goes through R1.
303*053f45beSAndroid Build Coastguard Worker#	ns	destination		gateway
304*053f45beSAndroid Build Coastguard Workerroutes="
305*053f45beSAndroid Build Coastguard Worker	A	default			${prefix4}.${a_r1}.2
306*053f45beSAndroid Build Coastguard Worker	A	${prefix4}.${b_r2}.1	${prefix4}.${a_r2}.2
307*053f45beSAndroid Build Coastguard Worker	B	default			${prefix4}.${b_r1}.2
308*053f45beSAndroid Build Coastguard Worker
309*053f45beSAndroid Build Coastguard Worker	A	default			${prefix6}:${a_r1}::2
310*053f45beSAndroid Build Coastguard Worker	A	${prefix6}:${b_r2}::1	${prefix6}:${a_r2}::2
311*053f45beSAndroid Build Coastguard Worker	B	default			${prefix6}:${b_r1}::2
312*053f45beSAndroid Build Coastguard Worker"
313*053f45beSAndroid Build Coastguard WorkerUSE_NH="no"
314*053f45beSAndroid Build Coastguard Worker#	ns	family	nh id	   destination		gateway
315*053f45beSAndroid Build Coastguard Workernexthops="
316*053f45beSAndroid Build Coastguard Worker	A	4	41	${prefix4}.${a_r1}.2	veth_A-R1
317*053f45beSAndroid Build Coastguard Worker	A	4	42	${prefix4}.${a_r2}.2	veth_A-R2
318*053f45beSAndroid Build Coastguard Worker	B	4	41	${prefix4}.${b_r1}.2	veth_B-R1
319*053f45beSAndroid Build Coastguard Worker
320*053f45beSAndroid Build Coastguard Worker	A	6	61	${prefix6}:${a_r1}::2	veth_A-R1
321*053f45beSAndroid Build Coastguard Worker	A	6	62	${prefix6}:${a_r2}::2	veth_A-R2
322*053f45beSAndroid Build Coastguard Worker	B	6	61	${prefix6}:${b_r1}::2	veth_B-R1
323*053f45beSAndroid Build Coastguard Worker"
324*053f45beSAndroid Build Coastguard Worker
325*053f45beSAndroid Build Coastguard Worker# nexthop id correlates to id in nexthops config above
326*053f45beSAndroid Build Coastguard Worker#	ns    family	prefix			nh id
327*053f45beSAndroid Build Coastguard Workerroutes_nh="
328*053f45beSAndroid Build Coastguard Worker	A	4	default			41
329*053f45beSAndroid Build Coastguard Worker	A	4	${prefix4}.${b_r2}.1	42
330*053f45beSAndroid Build Coastguard Worker	B	4	default			41
331*053f45beSAndroid Build Coastguard Worker
332*053f45beSAndroid Build Coastguard Worker	A	6	default			61
333*053f45beSAndroid Build Coastguard Worker	A	6	${prefix6}:${b_r2}::1	62
334*053f45beSAndroid Build Coastguard Worker	B	6	default			61
335*053f45beSAndroid Build Coastguard Worker"
336*053f45beSAndroid Build Coastguard Worker
337*053f45beSAndroid Build Coastguard Workerpolicy_mark=0x04
338*053f45beSAndroid Build Coastguard Workerrt_table=main
339*053f45beSAndroid Build Coastguard Worker
340*053f45beSAndroid Build Coastguard Workerveth4_a_addr="192.168.1.1"
341*053f45beSAndroid Build Coastguard Workerveth4_b_addr="192.168.1.2"
342*053f45beSAndroid Build Coastguard Workerveth4_c_addr="192.168.2.10"
343*053f45beSAndroid Build Coastguard Workerveth4_mask="24"
344*053f45beSAndroid Build Coastguard Workerveth6_a_addr="fd00:1::a"
345*053f45beSAndroid Build Coastguard Workerveth6_b_addr="fd00:1::b"
346*053f45beSAndroid Build Coastguard Workerveth6_c_addr="fd00:2::c"
347*053f45beSAndroid Build Coastguard Workerveth6_mask="64"
348*053f45beSAndroid Build Coastguard Worker
349*053f45beSAndroid Build Coastguard Workertunnel4_a_addr="192.168.2.1"
350*053f45beSAndroid Build Coastguard Workertunnel4_b_addr="192.168.2.2"
351*053f45beSAndroid Build Coastguard Workertunnel4_mask="24"
352*053f45beSAndroid Build Coastguard Workertunnel6_a_addr="fd00:2::a"
353*053f45beSAndroid Build Coastguard Workertunnel6_b_addr="fd00:2::b"
354*053f45beSAndroid Build Coastguard Workertunnel6_mask="64"
355*053f45beSAndroid Build Coastguard Worker
356*053f45beSAndroid Build Coastguard Workerdummy6_0_prefix="fc00:1000::"
357*053f45beSAndroid Build Coastguard Workerdummy6_1_prefix="fc00:1001::"
358*053f45beSAndroid Build Coastguard Workerdummy6_mask="64"
359*053f45beSAndroid Build Coastguard Worker
360*053f45beSAndroid Build Coastguard Workererr_buf=
361*053f45beSAndroid Build Coastguard Workertcpdump_pids=
362*053f45beSAndroid Build Coastguard Workernettest_pids=
363*053f45beSAndroid Build Coastguard Workersocat_pids=
364*053f45beSAndroid Build Coastguard Worker
365*053f45beSAndroid Build Coastguard Workererr() {
366*053f45beSAndroid Build Coastguard Worker	err_buf="${err_buf}${1}
367*053f45beSAndroid Build Coastguard Worker"
368*053f45beSAndroid Build Coastguard Worker}
369*053f45beSAndroid Build Coastguard Worker
370*053f45beSAndroid Build Coastguard Workererr_flush() {
371*053f45beSAndroid Build Coastguard Worker	echo -n "${err_buf}"
372*053f45beSAndroid Build Coastguard Worker	err_buf=
373*053f45beSAndroid Build Coastguard Worker}
374*053f45beSAndroid Build Coastguard Worker
375*053f45beSAndroid Build Coastguard Workerrun_cmd() {
376*053f45beSAndroid Build Coastguard Worker	cmd="$*"
377*053f45beSAndroid Build Coastguard Worker
378*053f45beSAndroid Build Coastguard Worker	if [ "$VERBOSE" = "1" ]; then
379*053f45beSAndroid Build Coastguard Worker		printf "    COMMAND: $cmd\n"
380*053f45beSAndroid Build Coastguard Worker	fi
381*053f45beSAndroid Build Coastguard Worker
382*053f45beSAndroid Build Coastguard Worker	out="$($cmd 2>&1)"
383*053f45beSAndroid Build Coastguard Worker	rc=$?
384*053f45beSAndroid Build Coastguard Worker	if [ "$VERBOSE" = "1" -a -n "$out" ]; then
385*053f45beSAndroid Build Coastguard Worker		echo "    $out"
386*053f45beSAndroid Build Coastguard Worker		echo
387*053f45beSAndroid Build Coastguard Worker	fi
388*053f45beSAndroid Build Coastguard Worker
389*053f45beSAndroid Build Coastguard Worker	return $rc
390*053f45beSAndroid Build Coastguard Worker}
391*053f45beSAndroid Build Coastguard Worker
392*053f45beSAndroid Build Coastguard Workerrun_cmd_bg() {
393*053f45beSAndroid Build Coastguard Worker	cmd="$*"
394*053f45beSAndroid Build Coastguard Worker
395*053f45beSAndroid Build Coastguard Worker	if [ "$VERBOSE" = "1" ]; then
396*053f45beSAndroid Build Coastguard Worker		printf "    COMMAND: %s &\n" "${cmd}"
397*053f45beSAndroid Build Coastguard Worker	fi
398*053f45beSAndroid Build Coastguard Worker
399*053f45beSAndroid Build Coastguard Worker	$cmd 2>&1 &
400*053f45beSAndroid Build Coastguard Worker}
401*053f45beSAndroid Build Coastguard Worker
402*053f45beSAndroid Build Coastguard Worker# Find the auto-generated name for this namespace
403*053f45beSAndroid Build Coastguard Workernsname() {
404*053f45beSAndroid Build Coastguard Worker	eval echo \$NS_$1
405*053f45beSAndroid Build Coastguard Worker}
406*053f45beSAndroid Build Coastguard Worker
407*053f45beSAndroid Build Coastguard Workersetup_fou_or_gue() {
408*053f45beSAndroid Build Coastguard Worker	outer="${1}"
409*053f45beSAndroid Build Coastguard Worker	inner="${2}"
410*053f45beSAndroid Build Coastguard Worker	encap="${3}"
411*053f45beSAndroid Build Coastguard Worker
412*053f45beSAndroid Build Coastguard Worker	if [ "${outer}" = "4" ]; then
413*053f45beSAndroid Build Coastguard Worker		modprobe fou || return $ksft_skip
414*053f45beSAndroid Build Coastguard Worker		a_addr="${prefix4}.${a_r1}.1"
415*053f45beSAndroid Build Coastguard Worker		b_addr="${prefix4}.${b_r1}.1"
416*053f45beSAndroid Build Coastguard Worker		if [ "${inner}" = "4" ]; then
417*053f45beSAndroid Build Coastguard Worker			type="ipip"
418*053f45beSAndroid Build Coastguard Worker			ipproto="4"
419*053f45beSAndroid Build Coastguard Worker		else
420*053f45beSAndroid Build Coastguard Worker			type="sit"
421*053f45beSAndroid Build Coastguard Worker			ipproto="41"
422*053f45beSAndroid Build Coastguard Worker		fi
423*053f45beSAndroid Build Coastguard Worker	else
424*053f45beSAndroid Build Coastguard Worker		modprobe fou6 || return $ksft_skip
425*053f45beSAndroid Build Coastguard Worker		a_addr="${prefix6}:${a_r1}::1"
426*053f45beSAndroid Build Coastguard Worker		b_addr="${prefix6}:${b_r1}::1"
427*053f45beSAndroid Build Coastguard Worker		if [ "${inner}" = "4" ]; then
428*053f45beSAndroid Build Coastguard Worker			type="ip6tnl"
429*053f45beSAndroid Build Coastguard Worker			mode="mode ipip6"
430*053f45beSAndroid Build Coastguard Worker			ipproto="4 -6"
431*053f45beSAndroid Build Coastguard Worker		else
432*053f45beSAndroid Build Coastguard Worker			type="ip6tnl"
433*053f45beSAndroid Build Coastguard Worker			mode="mode ip6ip6"
434*053f45beSAndroid Build Coastguard Worker			ipproto="41 -6"
435*053f45beSAndroid Build Coastguard Worker		fi
436*053f45beSAndroid Build Coastguard Worker	fi
437*053f45beSAndroid Build Coastguard Worker
438*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip fou add port 5555 ipproto ${ipproto} || return $ksft_skip
439*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add ${encap}_a type ${type} ${mode} local ${a_addr} remote ${b_addr} encap ${encap} encap-sport auto encap-dport 5556 || return $ksft_skip
440*053f45beSAndroid Build Coastguard Worker
441*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip fou add port 5556 ipproto ${ipproto}
442*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link add ${encap}_b type ${type} ${mode} local ${b_addr} remote ${a_addr} encap ${encap} encap-sport auto encap-dport 5555
443*053f45beSAndroid Build Coastguard Worker
444*053f45beSAndroid Build Coastguard Worker	if [ "${inner}" = "4" ]; then
445*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip addr add ${tunnel4_a_addr}/${tunnel4_mask} dev ${encap}_a
446*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_b} ip addr add ${tunnel4_b_addr}/${tunnel4_mask} dev ${encap}_b
447*053f45beSAndroid Build Coastguard Worker	else
448*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip addr add ${tunnel6_a_addr}/${tunnel6_mask} dev ${encap}_a
449*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_b} ip addr add ${tunnel6_b_addr}/${tunnel6_mask} dev ${encap}_b
450*053f45beSAndroid Build Coastguard Worker	fi
451*053f45beSAndroid Build Coastguard Worker
452*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set ${encap}_a up
453*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link set ${encap}_b up
454*053f45beSAndroid Build Coastguard Worker}
455*053f45beSAndroid Build Coastguard Worker
456*053f45beSAndroid Build Coastguard Workersetup_fou44() {
457*053f45beSAndroid Build Coastguard Worker	setup_fou_or_gue 4 4 fou
458*053f45beSAndroid Build Coastguard Worker}
459*053f45beSAndroid Build Coastguard Worker
460*053f45beSAndroid Build Coastguard Workersetup_fou46() {
461*053f45beSAndroid Build Coastguard Worker	setup_fou_or_gue 4 6 fou
462*053f45beSAndroid Build Coastguard Worker}
463*053f45beSAndroid Build Coastguard Worker
464*053f45beSAndroid Build Coastguard Workersetup_fou64() {
465*053f45beSAndroid Build Coastguard Worker	setup_fou_or_gue 6 4 fou
466*053f45beSAndroid Build Coastguard Worker}
467*053f45beSAndroid Build Coastguard Worker
468*053f45beSAndroid Build Coastguard Workersetup_fou66() {
469*053f45beSAndroid Build Coastguard Worker	setup_fou_or_gue 6 6 fou
470*053f45beSAndroid Build Coastguard Worker}
471*053f45beSAndroid Build Coastguard Worker
472*053f45beSAndroid Build Coastguard Workersetup_gue44() {
473*053f45beSAndroid Build Coastguard Worker	setup_fou_or_gue 4 4 gue
474*053f45beSAndroid Build Coastguard Worker}
475*053f45beSAndroid Build Coastguard Worker
476*053f45beSAndroid Build Coastguard Workersetup_gue46() {
477*053f45beSAndroid Build Coastguard Worker	setup_fou_or_gue 4 6 gue
478*053f45beSAndroid Build Coastguard Worker}
479*053f45beSAndroid Build Coastguard Worker
480*053f45beSAndroid Build Coastguard Workersetup_gue64() {
481*053f45beSAndroid Build Coastguard Worker	setup_fou_or_gue 6 4 gue
482*053f45beSAndroid Build Coastguard Worker}
483*053f45beSAndroid Build Coastguard Worker
484*053f45beSAndroid Build Coastguard Workersetup_gue66() {
485*053f45beSAndroid Build Coastguard Worker	setup_fou_or_gue 6 6 gue
486*053f45beSAndroid Build Coastguard Worker}
487*053f45beSAndroid Build Coastguard Worker
488*053f45beSAndroid Build Coastguard Workersetup_ipvX_over_ipvY() {
489*053f45beSAndroid Build Coastguard Worker	inner=${1}
490*053f45beSAndroid Build Coastguard Worker	outer=${2}
491*053f45beSAndroid Build Coastguard Worker
492*053f45beSAndroid Build Coastguard Worker	if [ "${outer}" -eq 4 ]; then
493*053f45beSAndroid Build Coastguard Worker		a_addr="${prefix4}.${a_r1}.1"
494*053f45beSAndroid Build Coastguard Worker		b_addr="${prefix4}.${b_r1}.1"
495*053f45beSAndroid Build Coastguard Worker		if [ "${inner}" -eq 4 ]; then
496*053f45beSAndroid Build Coastguard Worker			type="ipip"
497*053f45beSAndroid Build Coastguard Worker			mode="ipip"
498*053f45beSAndroid Build Coastguard Worker		else
499*053f45beSAndroid Build Coastguard Worker			type="sit"
500*053f45beSAndroid Build Coastguard Worker			mode="ip6ip"
501*053f45beSAndroid Build Coastguard Worker		fi
502*053f45beSAndroid Build Coastguard Worker	else
503*053f45beSAndroid Build Coastguard Worker		a_addr="${prefix6}:${a_r1}::1"
504*053f45beSAndroid Build Coastguard Worker		b_addr="${prefix6}:${b_r1}::1"
505*053f45beSAndroid Build Coastguard Worker		type="ip6tnl"
506*053f45beSAndroid Build Coastguard Worker		if [ "${inner}" -eq 4 ]; then
507*053f45beSAndroid Build Coastguard Worker			mode="ipip6"
508*053f45beSAndroid Build Coastguard Worker		else
509*053f45beSAndroid Build Coastguard Worker			mode="ip6ip6"
510*053f45beSAndroid Build Coastguard Worker		fi
511*053f45beSAndroid Build Coastguard Worker	fi
512*053f45beSAndroid Build Coastguard Worker
513*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add ip_a type ${type} local ${a_addr} remote ${b_addr} mode ${mode} || return $ksft_skip
514*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link add ip_b type ${type} local ${b_addr} remote ${a_addr} mode ${mode}
515*053f45beSAndroid Build Coastguard Worker
516*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set ip_a up
517*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link set ip_b up
518*053f45beSAndroid Build Coastguard Worker
519*053f45beSAndroid Build Coastguard Worker	if [ "${inner}" = "4" ]; then
520*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip addr add ${tunnel4_a_addr}/${tunnel4_mask} dev ip_a
521*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_b} ip addr add ${tunnel4_b_addr}/${tunnel4_mask} dev ip_b
522*053f45beSAndroid Build Coastguard Worker	else
523*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip addr add ${tunnel6_a_addr}/${tunnel6_mask} dev ip_a
524*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_b} ip addr add ${tunnel6_b_addr}/${tunnel6_mask} dev ip_b
525*053f45beSAndroid Build Coastguard Worker	fi
526*053f45beSAndroid Build Coastguard Worker}
527*053f45beSAndroid Build Coastguard Worker
528*053f45beSAndroid Build Coastguard Workersetup_ip4ip4() {
529*053f45beSAndroid Build Coastguard Worker	setup_ipvX_over_ipvY 4 4
530*053f45beSAndroid Build Coastguard Worker}
531*053f45beSAndroid Build Coastguard Worker
532*053f45beSAndroid Build Coastguard Workersetup_ip6ip4() {
533*053f45beSAndroid Build Coastguard Worker	setup_ipvX_over_ipvY 6 4
534*053f45beSAndroid Build Coastguard Worker}
535*053f45beSAndroid Build Coastguard Worker
536*053f45beSAndroid Build Coastguard Workersetup_ip4ip6() {
537*053f45beSAndroid Build Coastguard Worker	setup_ipvX_over_ipvY 4 6
538*053f45beSAndroid Build Coastguard Worker}
539*053f45beSAndroid Build Coastguard Worker
540*053f45beSAndroid Build Coastguard Workersetup_ip6ip6() {
541*053f45beSAndroid Build Coastguard Worker	setup_ipvX_over_ipvY 6 6
542*053f45beSAndroid Build Coastguard Worker}
543*053f45beSAndroid Build Coastguard Worker
544*053f45beSAndroid Build Coastguard Workersetup_namespaces() {
545*053f45beSAndroid Build Coastguard Worker	for n in ${NS_A} ${NS_B} ${NS_C} ${NS_R1} ${NS_R2}; do
546*053f45beSAndroid Build Coastguard Worker		ip netns add ${n} || return 1
547*053f45beSAndroid Build Coastguard Worker
548*053f45beSAndroid Build Coastguard Worker		# Disable DAD, so that we don't have to wait to use the
549*053f45beSAndroid Build Coastguard Worker		# configured IPv6 addresses
550*053f45beSAndroid Build Coastguard Worker		ip netns exec ${n} sysctl -q net/ipv6/conf/default/accept_dad=0
551*053f45beSAndroid Build Coastguard Worker	done
552*053f45beSAndroid Build Coastguard Worker}
553*053f45beSAndroid Build Coastguard Worker
554*053f45beSAndroid Build Coastguard Workersetup_veth() {
555*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add veth_a type veth peer name veth_b || return 1
556*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set veth_b netns ${NS_B}
557*053f45beSAndroid Build Coastguard Worker
558*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip addr add ${veth4_a_addr}/${veth4_mask} dev veth_a
559*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip addr add ${veth4_b_addr}/${veth4_mask} dev veth_b
560*053f45beSAndroid Build Coastguard Worker
561*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip addr add ${veth6_a_addr}/${veth6_mask} dev veth_a
562*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip addr add ${veth6_b_addr}/${veth6_mask} dev veth_b
563*053f45beSAndroid Build Coastguard Worker
564*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set veth_a up
565*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link set veth_b up
566*053f45beSAndroid Build Coastguard Worker}
567*053f45beSAndroid Build Coastguard Worker
568*053f45beSAndroid Build Coastguard Workersetup_vti() {
569*053f45beSAndroid Build Coastguard Worker	proto=${1}
570*053f45beSAndroid Build Coastguard Worker	veth_a_addr="${2}"
571*053f45beSAndroid Build Coastguard Worker	veth_b_addr="${3}"
572*053f45beSAndroid Build Coastguard Worker	vti_a_addr="${4}"
573*053f45beSAndroid Build Coastguard Worker	vti_b_addr="${5}"
574*053f45beSAndroid Build Coastguard Worker	vti_mask=${6}
575*053f45beSAndroid Build Coastguard Worker
576*053f45beSAndroid Build Coastguard Worker	[ ${proto} -eq 6 ] && vti_type="vti6" || vti_type="vti"
577*053f45beSAndroid Build Coastguard Worker
578*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add vti${proto}_a type ${vti_type} local ${veth_a_addr} remote ${veth_b_addr} key 10 || return 1
579*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link add vti${proto}_b type ${vti_type} local ${veth_b_addr} remote ${veth_a_addr} key 10
580*053f45beSAndroid Build Coastguard Worker
581*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip addr add ${vti_a_addr}/${vti_mask} dev vti${proto}_a
582*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip addr add ${vti_b_addr}/${vti_mask} dev vti${proto}_b
583*053f45beSAndroid Build Coastguard Worker
584*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set vti${proto}_a up
585*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link set vti${proto}_b up
586*053f45beSAndroid Build Coastguard Worker}
587*053f45beSAndroid Build Coastguard Worker
588*053f45beSAndroid Build Coastguard Workersetup_vti4() {
589*053f45beSAndroid Build Coastguard Worker	setup_vti 4 ${veth4_a_addr} ${veth4_b_addr} ${tunnel4_a_addr} ${tunnel4_b_addr} ${tunnel4_mask}
590*053f45beSAndroid Build Coastguard Worker}
591*053f45beSAndroid Build Coastguard Worker
592*053f45beSAndroid Build Coastguard Workersetup_vti6() {
593*053f45beSAndroid Build Coastguard Worker	setup_vti 6 ${veth6_a_addr} ${veth6_b_addr} ${tunnel6_a_addr} ${tunnel6_b_addr} ${tunnel6_mask}
594*053f45beSAndroid Build Coastguard Worker}
595*053f45beSAndroid Build Coastguard Worker
596*053f45beSAndroid Build Coastguard Workersetup_vti4routed() {
597*053f45beSAndroid Build Coastguard Worker	setup_vti 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 ${tunnel4_a_addr} ${tunnel4_b_addr} ${tunnel4_mask}
598*053f45beSAndroid Build Coastguard Worker}
599*053f45beSAndroid Build Coastguard Worker
600*053f45beSAndroid Build Coastguard Workersetup_vti6routed() {
601*053f45beSAndroid Build Coastguard Worker	setup_vti 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 ${tunnel6_a_addr} ${tunnel6_b_addr} ${tunnel6_mask}
602*053f45beSAndroid Build Coastguard Worker}
603*053f45beSAndroid Build Coastguard Worker
604*053f45beSAndroid Build Coastguard Workersetup_vxlan_or_geneve() {
605*053f45beSAndroid Build Coastguard Worker	type="${1}"
606*053f45beSAndroid Build Coastguard Worker	a_addr="${2}"
607*053f45beSAndroid Build Coastguard Worker	b_addr="${3}"
608*053f45beSAndroid Build Coastguard Worker	opts="${4}"
609*053f45beSAndroid Build Coastguard Worker	br_if_a="${5}"
610*053f45beSAndroid Build Coastguard Worker
611*053f45beSAndroid Build Coastguard Worker	if [ "${type}" = "vxlan" ]; then
612*053f45beSAndroid Build Coastguard Worker		opts="${opts} ttl 64 dstport 4789"
613*053f45beSAndroid Build Coastguard Worker		opts_a="local ${a_addr}"
614*053f45beSAndroid Build Coastguard Worker		opts_b="local ${b_addr}"
615*053f45beSAndroid Build Coastguard Worker	else
616*053f45beSAndroid Build Coastguard Worker		opts_a=""
617*053f45beSAndroid Build Coastguard Worker		opts_b=""
618*053f45beSAndroid Build Coastguard Worker	fi
619*053f45beSAndroid Build Coastguard Worker
620*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add ${type}_a type ${type} id 1 ${opts_a} remote ${b_addr} ${opts} || return 1
621*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link add ${type}_b type ${type} id 1 ${opts_b} remote ${a_addr} ${opts}
622*053f45beSAndroid Build Coastguard Worker
623*053f45beSAndroid Build Coastguard Worker	if [ -n "${br_if_a}" ]; then
624*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip addr add ${tunnel4_a_addr}/${tunnel4_mask} dev ${br_if_a}
625*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip addr add ${tunnel6_a_addr}/${tunnel6_mask} dev ${br_if_a}
626*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip link set ${type}_a master ${br_if_a}
627*053f45beSAndroid Build Coastguard Worker	else
628*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip addr add ${tunnel4_a_addr}/${tunnel4_mask} dev ${type}_a
629*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip addr add ${tunnel6_a_addr}/${tunnel6_mask} dev ${type}_a
630*053f45beSAndroid Build Coastguard Worker	fi
631*053f45beSAndroid Build Coastguard Worker
632*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip addr add ${tunnel4_b_addr}/${tunnel4_mask} dev ${type}_b
633*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip addr add ${tunnel6_b_addr}/${tunnel6_mask} dev ${type}_b
634*053f45beSAndroid Build Coastguard Worker
635*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set ${type}_a up
636*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link set ${type}_b up
637*053f45beSAndroid Build Coastguard Worker}
638*053f45beSAndroid Build Coastguard Worker
639*053f45beSAndroid Build Coastguard Workersetup_geneve4() {
640*053f45beSAndroid Build Coastguard Worker	setup_vxlan_or_geneve geneve ${prefix4}.${a_r1}.1  ${prefix4}.${b_r1}.1  "df set"
641*053f45beSAndroid Build Coastguard Worker}
642*053f45beSAndroid Build Coastguard Worker
643*053f45beSAndroid Build Coastguard Workersetup_vxlan4() {
644*053f45beSAndroid Build Coastguard Worker	setup_vxlan_or_geneve vxlan  ${prefix4}.${a_r1}.1  ${prefix4}.${b_r1}.1  "df set"
645*053f45beSAndroid Build Coastguard Worker}
646*053f45beSAndroid Build Coastguard Worker
647*053f45beSAndroid Build Coastguard Workersetup_geneve6() {
648*053f45beSAndroid Build Coastguard Worker	setup_vxlan_or_geneve geneve ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 ""
649*053f45beSAndroid Build Coastguard Worker}
650*053f45beSAndroid Build Coastguard Worker
651*053f45beSAndroid Build Coastguard Workersetup_vxlan6() {
652*053f45beSAndroid Build Coastguard Worker	setup_vxlan_or_geneve vxlan  ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 ""
653*053f45beSAndroid Build Coastguard Worker}
654*053f45beSAndroid Build Coastguard Worker
655*053f45beSAndroid Build Coastguard Workersetup_bridged_geneve4() {
656*053f45beSAndroid Build Coastguard Worker	setup_vxlan_or_geneve geneve ${prefix4}.${a_r1}.1  ${prefix4}.${b_r1}.1  "df set" "br0"
657*053f45beSAndroid Build Coastguard Worker}
658*053f45beSAndroid Build Coastguard Worker
659*053f45beSAndroid Build Coastguard Workersetup_bridged_vxlan4() {
660*053f45beSAndroid Build Coastguard Worker	setup_vxlan_or_geneve vxlan  ${prefix4}.${a_r1}.1  ${prefix4}.${b_r1}.1  "df set" "br0"
661*053f45beSAndroid Build Coastguard Worker}
662*053f45beSAndroid Build Coastguard Worker
663*053f45beSAndroid Build Coastguard Workersetup_bridged_geneve6() {
664*053f45beSAndroid Build Coastguard Worker	setup_vxlan_or_geneve geneve ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "" "br0"
665*053f45beSAndroid Build Coastguard Worker}
666*053f45beSAndroid Build Coastguard Worker
667*053f45beSAndroid Build Coastguard Workersetup_bridged_vxlan6() {
668*053f45beSAndroid Build Coastguard Worker	setup_vxlan_or_geneve vxlan  ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "" "br0"
669*053f45beSAndroid Build Coastguard Worker}
670*053f45beSAndroid Build Coastguard Worker
671*053f45beSAndroid Build Coastguard Workersetup_xfrm() {
672*053f45beSAndroid Build Coastguard Worker	proto=${1}
673*053f45beSAndroid Build Coastguard Worker	veth_a_addr="${2}"
674*053f45beSAndroid Build Coastguard Worker	veth_b_addr="${3}"
675*053f45beSAndroid Build Coastguard Worker	encap=${4}
676*053f45beSAndroid Build Coastguard Worker
677*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip -${proto} xfrm state add src ${veth_a_addr} dst ${veth_b_addr} spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel ${encap} || return 1
678*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip -${proto} xfrm state add src ${veth_b_addr} dst ${veth_a_addr} spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel ${encap}
679*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip -${proto} xfrm policy add dir out mark 10 tmpl src ${veth_a_addr} dst ${veth_b_addr} proto esp mode tunnel
680*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip -${proto} xfrm policy add dir in mark 10 tmpl src ${veth_b_addr} dst ${veth_a_addr} proto esp mode tunnel
681*053f45beSAndroid Build Coastguard Worker
682*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip -${proto} xfrm state add src ${veth_a_addr} dst ${veth_b_addr} spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel ${encap}
683*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip -${proto} xfrm state add src ${veth_b_addr} dst ${veth_a_addr} spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel ${encap}
684*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip -${proto} xfrm policy add dir out mark 10 tmpl src ${veth_b_addr} dst ${veth_a_addr} proto esp mode tunnel
685*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip -${proto} xfrm policy add dir in mark 10 tmpl src ${veth_a_addr} dst ${veth_b_addr} proto esp mode tunnel
686*053f45beSAndroid Build Coastguard Worker}
687*053f45beSAndroid Build Coastguard Worker
688*053f45beSAndroid Build Coastguard Workersetup_nettest_xfrm() {
689*053f45beSAndroid Build Coastguard Worker	if ! which nettest >/dev/null; then
690*053f45beSAndroid Build Coastguard Worker		PATH=$PWD:$PATH
691*053f45beSAndroid Build Coastguard Worker		if ! which nettest >/dev/null; then
692*053f45beSAndroid Build Coastguard Worker			echo "'nettest' command not found; skipping tests"
693*053f45beSAndroid Build Coastguard Worker			return 1
694*053f45beSAndroid Build Coastguard Worker		fi
695*053f45beSAndroid Build Coastguard Worker	fi
696*053f45beSAndroid Build Coastguard Worker
697*053f45beSAndroid Build Coastguard Worker	[ ${1} -eq 6 ] && proto="-6" || proto=""
698*053f45beSAndroid Build Coastguard Worker	port=${2}
699*053f45beSAndroid Build Coastguard Worker
700*053f45beSAndroid Build Coastguard Worker	run_cmd_bg "${ns_a}" nettest "${proto}" -q -D -s -x -p "${port}" -t 5
701*053f45beSAndroid Build Coastguard Worker	nettest_pids="${nettest_pids} $!"
702*053f45beSAndroid Build Coastguard Worker
703*053f45beSAndroid Build Coastguard Worker	run_cmd_bg "${ns_b}" nettest "${proto}" -q -D -s -x -p "${port}" -t 5
704*053f45beSAndroid Build Coastguard Worker	nettest_pids="${nettest_pids} $!"
705*053f45beSAndroid Build Coastguard Worker}
706*053f45beSAndroid Build Coastguard Worker
707*053f45beSAndroid Build Coastguard Workersetup_xfrm4() {
708*053f45beSAndroid Build Coastguard Worker	setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr}
709*053f45beSAndroid Build Coastguard Worker}
710*053f45beSAndroid Build Coastguard Worker
711*053f45beSAndroid Build Coastguard Workersetup_xfrm6() {
712*053f45beSAndroid Build Coastguard Worker	setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr}
713*053f45beSAndroid Build Coastguard Worker}
714*053f45beSAndroid Build Coastguard Worker
715*053f45beSAndroid Build Coastguard Workersetup_xfrm4udp() {
716*053f45beSAndroid Build Coastguard Worker	setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0"
717*053f45beSAndroid Build Coastguard Worker	setup_nettest_xfrm 4 4500
718*053f45beSAndroid Build Coastguard Worker}
719*053f45beSAndroid Build Coastguard Worker
720*053f45beSAndroid Build Coastguard Workersetup_xfrm6udp() {
721*053f45beSAndroid Build Coastguard Worker	setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0"
722*053f45beSAndroid Build Coastguard Worker	setup_nettest_xfrm 6 4500
723*053f45beSAndroid Build Coastguard Worker}
724*053f45beSAndroid Build Coastguard Worker
725*053f45beSAndroid Build Coastguard Workersetup_xfrm4udprouted() {
726*053f45beSAndroid Build Coastguard Worker	setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0"
727*053f45beSAndroid Build Coastguard Worker	setup_nettest_xfrm 4 4500
728*053f45beSAndroid Build Coastguard Worker}
729*053f45beSAndroid Build Coastguard Worker
730*053f45beSAndroid Build Coastguard Workersetup_xfrm6udprouted() {
731*053f45beSAndroid Build Coastguard Worker	setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0"
732*053f45beSAndroid Build Coastguard Worker	setup_nettest_xfrm 6 4500
733*053f45beSAndroid Build Coastguard Worker}
734*053f45beSAndroid Build Coastguard Worker
735*053f45beSAndroid Build Coastguard Workersetup_routing_old() {
736*053f45beSAndroid Build Coastguard Worker	for i in ${routes}; do
737*053f45beSAndroid Build Coastguard Worker		[ "${ns}" = "" ]	&& ns="${i}"		&& continue
738*053f45beSAndroid Build Coastguard Worker		[ "${addr}" = "" ]	&& addr="${i}"		&& continue
739*053f45beSAndroid Build Coastguard Worker		[ "${gw}" = "" ]	&& gw="${i}"
740*053f45beSAndroid Build Coastguard Worker
741*053f45beSAndroid Build Coastguard Worker		ns_name="$(nsname ${ns})"
742*053f45beSAndroid Build Coastguard Worker
743*053f45beSAndroid Build Coastguard Worker		ip -n "${ns_name}" route add "${addr}" table "${rt_table}" via "${gw}"
744*053f45beSAndroid Build Coastguard Worker
745*053f45beSAndroid Build Coastguard Worker		ns=""; addr=""; gw=""
746*053f45beSAndroid Build Coastguard Worker	done
747*053f45beSAndroid Build Coastguard Worker}
748*053f45beSAndroid Build Coastguard Worker
749*053f45beSAndroid Build Coastguard Workersetup_routing_new() {
750*053f45beSAndroid Build Coastguard Worker	for i in ${nexthops}; do
751*053f45beSAndroid Build Coastguard Worker		[ "${ns}" = "" ]	&& ns="${i}"		&& continue
752*053f45beSAndroid Build Coastguard Worker		[ "${fam}" = "" ]	&& fam="${i}"		&& continue
753*053f45beSAndroid Build Coastguard Worker		[ "${nhid}" = "" ]	&& nhid="${i}"		&& continue
754*053f45beSAndroid Build Coastguard Worker		[ "${gw}" = "" ]	&& gw="${i}"		&& continue
755*053f45beSAndroid Build Coastguard Worker		[ "${dev}" = "" ]	&& dev="${i}"
756*053f45beSAndroid Build Coastguard Worker
757*053f45beSAndroid Build Coastguard Worker		ns_name="$(nsname ${ns})"
758*053f45beSAndroid Build Coastguard Worker
759*053f45beSAndroid Build Coastguard Worker		ip -n ${ns_name} -${fam} nexthop add id ${nhid} via ${gw} dev ${dev}
760*053f45beSAndroid Build Coastguard Worker
761*053f45beSAndroid Build Coastguard Worker		ns=""; fam=""; nhid=""; gw=""; dev=""
762*053f45beSAndroid Build Coastguard Worker
763*053f45beSAndroid Build Coastguard Worker	done
764*053f45beSAndroid Build Coastguard Worker
765*053f45beSAndroid Build Coastguard Worker	for i in ${routes_nh}; do
766*053f45beSAndroid Build Coastguard Worker		[ "${ns}" = "" ]	&& ns="${i}"		&& continue
767*053f45beSAndroid Build Coastguard Worker		[ "${fam}" = "" ]	&& fam="${i}"		&& continue
768*053f45beSAndroid Build Coastguard Worker		[ "${addr}" = "" ]	&& addr="${i}"		&& continue
769*053f45beSAndroid Build Coastguard Worker		[ "${nhid}" = "" ]	&& nhid="${i}"
770*053f45beSAndroid Build Coastguard Worker
771*053f45beSAndroid Build Coastguard Worker		ns_name="$(nsname ${ns})"
772*053f45beSAndroid Build Coastguard Worker
773*053f45beSAndroid Build Coastguard Worker		ip -n "${ns_name}" -"${fam}" route add "${addr}" table "${rt_table}" nhid "${nhid}"
774*053f45beSAndroid Build Coastguard Worker
775*053f45beSAndroid Build Coastguard Worker		ns=""; fam=""; addr=""; nhid=""
776*053f45beSAndroid Build Coastguard Worker	done
777*053f45beSAndroid Build Coastguard Worker}
778*053f45beSAndroid Build Coastguard Worker
779*053f45beSAndroid Build Coastguard Workersetup_routing() {
780*053f45beSAndroid Build Coastguard Worker	for i in ${NS_R1} ${NS_R2}; do
781*053f45beSAndroid Build Coastguard Worker		ip netns exec ${i} sysctl -q net/ipv4/ip_forward=1
782*053f45beSAndroid Build Coastguard Worker		ip netns exec ${i} sysctl -q net/ipv6/conf/all/forwarding=1
783*053f45beSAndroid Build Coastguard Worker	done
784*053f45beSAndroid Build Coastguard Worker
785*053f45beSAndroid Build Coastguard Worker	for i in ${routing_addrs}; do
786*053f45beSAndroid Build Coastguard Worker		[ "${ns}" = "" ]	&& ns="${i}"		&& continue
787*053f45beSAndroid Build Coastguard Worker		[ "${peer}" = "" ]	&& peer="${i}"		&& continue
788*053f45beSAndroid Build Coastguard Worker		[ "${segment}" = "" ]	&& segment="${i}"
789*053f45beSAndroid Build Coastguard Worker
790*053f45beSAndroid Build Coastguard Worker		ns_name="$(nsname ${ns})"
791*053f45beSAndroid Build Coastguard Worker		peer_name="$(nsname ${peer})"
792*053f45beSAndroid Build Coastguard Worker		if="veth_${ns}-${peer}"
793*053f45beSAndroid Build Coastguard Worker		ifpeer="veth_${peer}-${ns}"
794*053f45beSAndroid Build Coastguard Worker
795*053f45beSAndroid Build Coastguard Worker		# Create veth links
796*053f45beSAndroid Build Coastguard Worker		ip link add ${if} up netns ${ns_name} type veth peer name ${ifpeer} netns ${peer_name} || return 1
797*053f45beSAndroid Build Coastguard Worker		ip -n ${peer_name} link set dev ${ifpeer} up
798*053f45beSAndroid Build Coastguard Worker
799*053f45beSAndroid Build Coastguard Worker		# Add addresses
800*053f45beSAndroid Build Coastguard Worker		ip -n ${ns_name}   addr add ${prefix4}.${segment}.1/24  dev ${if}
801*053f45beSAndroid Build Coastguard Worker		ip -n ${ns_name}   addr add ${prefix6}:${segment}::1/64 dev ${if}
802*053f45beSAndroid Build Coastguard Worker
803*053f45beSAndroid Build Coastguard Worker		ip -n ${peer_name} addr add ${prefix4}.${segment}.2/24  dev ${ifpeer}
804*053f45beSAndroid Build Coastguard Worker		ip -n ${peer_name} addr add ${prefix6}:${segment}::2/64 dev ${ifpeer}
805*053f45beSAndroid Build Coastguard Worker
806*053f45beSAndroid Build Coastguard Worker		ns=""; peer=""; segment=""
807*053f45beSAndroid Build Coastguard Worker	done
808*053f45beSAndroid Build Coastguard Worker
809*053f45beSAndroid Build Coastguard Worker	if [ "$USE_NH" = "yes" ]; then
810*053f45beSAndroid Build Coastguard Worker		setup_routing_new
811*053f45beSAndroid Build Coastguard Worker	else
812*053f45beSAndroid Build Coastguard Worker		setup_routing_old
813*053f45beSAndroid Build Coastguard Worker	fi
814*053f45beSAndroid Build Coastguard Worker
815*053f45beSAndroid Build Coastguard Worker	return 0
816*053f45beSAndroid Build Coastguard Worker}
817*053f45beSAndroid Build Coastguard Worker
818*053f45beSAndroid Build Coastguard Workersetup_policy_routing() {
819*053f45beSAndroid Build Coastguard Worker	setup_routing
820*053f45beSAndroid Build Coastguard Worker
821*053f45beSAndroid Build Coastguard Worker	ip -netns "${NS_A}" -4 rule add dsfield "${policy_mark}" \
822*053f45beSAndroid Build Coastguard Worker		table "${rt_table}"
823*053f45beSAndroid Build Coastguard Worker
824*053f45beSAndroid Build Coastguard Worker	# Set the IPv4 Don't Fragment bit with tc, since socat doesn't seem to
825*053f45beSAndroid Build Coastguard Worker	# have an option do to it.
826*053f45beSAndroid Build Coastguard Worker	tc -netns "${NS_A}" qdisc replace dev veth_A-R1 root prio
827*053f45beSAndroid Build Coastguard Worker	tc -netns "${NS_A}" qdisc replace dev veth_A-R2 root prio
828*053f45beSAndroid Build Coastguard Worker	tc -netns "${NS_A}" filter add dev veth_A-R1                      \
829*053f45beSAndroid Build Coastguard Worker		protocol ipv4 flower ip_proto udp                         \
830*053f45beSAndroid Build Coastguard Worker		action pedit ex munge ip df set 0x40 pipe csum ip and udp
831*053f45beSAndroid Build Coastguard Worker	tc -netns "${NS_A}" filter add dev veth_A-R2                      \
832*053f45beSAndroid Build Coastguard Worker		protocol ipv4 flower ip_proto udp                         \
833*053f45beSAndroid Build Coastguard Worker		action pedit ex munge ip df set 0x40 pipe csum ip and udp
834*053f45beSAndroid Build Coastguard Worker}
835*053f45beSAndroid Build Coastguard Worker
836*053f45beSAndroid Build Coastguard Workersetup_bridge() {
837*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add br0 type bridge || return $ksft_skip
838*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set br0 up
839*053f45beSAndroid Build Coastguard Worker
840*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ip link add veth_C-A type veth peer name veth_A-C
841*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ip link set veth_A-C netns ns-A
842*053f45beSAndroid Build Coastguard Worker
843*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set veth_A-C up
844*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ip link set veth_C-A up
845*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ip addr add ${veth4_c_addr}/${veth4_mask} dev veth_C-A
846*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ip addr add ${veth6_c_addr}/${veth6_mask} dev veth_C-A
847*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set veth_A-C master br0
848*053f45beSAndroid Build Coastguard Worker}
849*053f45beSAndroid Build Coastguard Worker
850*053f45beSAndroid Build Coastguard Workersetup_ovs_vxlan_or_geneve() {
851*053f45beSAndroid Build Coastguard Worker	type="${1}"
852*053f45beSAndroid Build Coastguard Worker	a_addr="${2}"
853*053f45beSAndroid Build Coastguard Worker	b_addr="${3}"
854*053f45beSAndroid Build Coastguard Worker
855*053f45beSAndroid Build Coastguard Worker	if [ "${type}" = "vxlan" ]; then
856*053f45beSAndroid Build Coastguard Worker		opts="${opts} ttl 64 dstport 4789"
857*053f45beSAndroid Build Coastguard Worker		opts_b="local ${b_addr}"
858*053f45beSAndroid Build Coastguard Worker	fi
859*053f45beSAndroid Build Coastguard Worker
860*053f45beSAndroid Build Coastguard Worker	run_cmd ovs-vsctl add-port ovs_br0 ${type}_a -- \
861*053f45beSAndroid Build Coastguard Worker		set interface ${type}_a type=${type} \
862*053f45beSAndroid Build Coastguard Worker		options:remote_ip=${b_addr} options:key=1 options:csum=true || return 1
863*053f45beSAndroid Build Coastguard Worker
864*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link add ${type}_b type ${type} id 1 ${opts_b} remote ${a_addr} ${opts} || return 1
865*053f45beSAndroid Build Coastguard Worker
866*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip addr add ${tunnel4_b_addr}/${tunnel4_mask} dev ${type}_b
867*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip addr add ${tunnel6_b_addr}/${tunnel6_mask} dev ${type}_b
868*053f45beSAndroid Build Coastguard Worker
869*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_b} ip link set ${type}_b up
870*053f45beSAndroid Build Coastguard Worker}
871*053f45beSAndroid Build Coastguard Worker
872*053f45beSAndroid Build Coastguard Workersetup_ovs_geneve4() {
873*053f45beSAndroid Build Coastguard Worker	setup_ovs_vxlan_or_geneve geneve ${prefix4}.${a_r1}.1  ${prefix4}.${b_r1}.1
874*053f45beSAndroid Build Coastguard Worker}
875*053f45beSAndroid Build Coastguard Worker
876*053f45beSAndroid Build Coastguard Workersetup_ovs_vxlan4() {
877*053f45beSAndroid Build Coastguard Worker	setup_ovs_vxlan_or_geneve vxlan  ${prefix4}.${a_r1}.1  ${prefix4}.${b_r1}.1
878*053f45beSAndroid Build Coastguard Worker}
879*053f45beSAndroid Build Coastguard Worker
880*053f45beSAndroid Build Coastguard Workersetup_ovs_geneve6() {
881*053f45beSAndroid Build Coastguard Worker	setup_ovs_vxlan_or_geneve geneve ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1
882*053f45beSAndroid Build Coastguard Worker}
883*053f45beSAndroid Build Coastguard Worker
884*053f45beSAndroid Build Coastguard Workersetup_ovs_vxlan6() {
885*053f45beSAndroid Build Coastguard Worker	setup_ovs_vxlan_or_geneve vxlan  ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1
886*053f45beSAndroid Build Coastguard Worker}
887*053f45beSAndroid Build Coastguard Worker
888*053f45beSAndroid Build Coastguard Workersetup_ovs_bridge() {
889*053f45beSAndroid Build Coastguard Worker	run_cmd ovs-vsctl add-br ovs_br0 || return $ksft_skip
890*053f45beSAndroid Build Coastguard Worker	run_cmd ip link set ovs_br0 up
891*053f45beSAndroid Build Coastguard Worker
892*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ip link add veth_C-A type veth peer name veth_A-C
893*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ip link set veth_A-C netns 1
894*053f45beSAndroid Build Coastguard Worker
895*053f45beSAndroid Build Coastguard Worker	run_cmd         ip link set veth_A-C up
896*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ip link set veth_C-A up
897*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ip addr add ${veth4_c_addr}/${veth4_mask} dev veth_C-A
898*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ip addr add ${veth6_c_addr}/${veth6_mask} dev veth_C-A
899*053f45beSAndroid Build Coastguard Worker	run_cmd ovs-vsctl add-port ovs_br0 veth_A-C
900*053f45beSAndroid Build Coastguard Worker
901*053f45beSAndroid Build Coastguard Worker	# Move veth_A-R1 to init
902*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set veth_A-R1 netns 1
903*053f45beSAndroid Build Coastguard Worker	run_cmd ip addr add ${prefix4}.${a_r1}.1/${veth4_mask} dev veth_A-R1
904*053f45beSAndroid Build Coastguard Worker	run_cmd ip addr add ${prefix6}:${a_r1}::1/${veth6_mask} dev veth_A-R1
905*053f45beSAndroid Build Coastguard Worker	run_cmd ip link set veth_A-R1 up
906*053f45beSAndroid Build Coastguard Worker	run_cmd ip route add ${prefix4}.${b_r1}.1 via ${prefix4}.${a_r1}.2
907*053f45beSAndroid Build Coastguard Worker	run_cmd ip route add ${prefix6}:${b_r1}::1 via ${prefix6}:${a_r1}::2
908*053f45beSAndroid Build Coastguard Worker}
909*053f45beSAndroid Build Coastguard Worker
910*053f45beSAndroid Build Coastguard Workersetup() {
911*053f45beSAndroid Build Coastguard Worker	[ "$(id -u)" -ne 0 ] && echo "  need to run as root" && return $ksft_skip
912*053f45beSAndroid Build Coastguard Worker
913*053f45beSAndroid Build Coastguard Worker	for arg do
914*053f45beSAndroid Build Coastguard Worker		eval setup_${arg} || { echo "  ${arg} not supported"; return 1; }
915*053f45beSAndroid Build Coastguard Worker	done
916*053f45beSAndroid Build Coastguard Worker}
917*053f45beSAndroid Build Coastguard Worker
918*053f45beSAndroid Build Coastguard Workertrace() {
919*053f45beSAndroid Build Coastguard Worker	[ $TRACING -eq 0 ] && return
920*053f45beSAndroid Build Coastguard Worker
921*053f45beSAndroid Build Coastguard Worker	for arg do
922*053f45beSAndroid Build Coastguard Worker		[ "${ns_cmd}" = "" ] && ns_cmd="${arg}" && continue
923*053f45beSAndroid Build Coastguard Worker		${ns_cmd} tcpdump --immediate-mode -s 0 -i "${arg}" -w "${name}_${arg}.pcap" 2> /dev/null &
924*053f45beSAndroid Build Coastguard Worker		tcpdump_pids="${tcpdump_pids} $!"
925*053f45beSAndroid Build Coastguard Worker		ns_cmd=
926*053f45beSAndroid Build Coastguard Worker	done
927*053f45beSAndroid Build Coastguard Worker	sleep 1
928*053f45beSAndroid Build Coastguard Worker}
929*053f45beSAndroid Build Coastguard Worker
930*053f45beSAndroid Build Coastguard Workercleanup() {
931*053f45beSAndroid Build Coastguard Worker	for pid in ${tcpdump_pids}; do
932*053f45beSAndroid Build Coastguard Worker		kill ${pid}
933*053f45beSAndroid Build Coastguard Worker	done
934*053f45beSAndroid Build Coastguard Worker	tcpdump_pids=
935*053f45beSAndroid Build Coastguard Worker
936*053f45beSAndroid Build Coastguard Worker	for pid in ${nettest_pids}; do
937*053f45beSAndroid Build Coastguard Worker		kill ${pid}
938*053f45beSAndroid Build Coastguard Worker	done
939*053f45beSAndroid Build Coastguard Worker	nettest_pids=
940*053f45beSAndroid Build Coastguard Worker
941*053f45beSAndroid Build Coastguard Worker	for pid in ${socat_pids}; do
942*053f45beSAndroid Build Coastguard Worker		kill "${pid}"
943*053f45beSAndroid Build Coastguard Worker	done
944*053f45beSAndroid Build Coastguard Worker	socat_pids=
945*053f45beSAndroid Build Coastguard Worker
946*053f45beSAndroid Build Coastguard Worker	for n in ${NS_A} ${NS_B} ${NS_C} ${NS_R1} ${NS_R2}; do
947*053f45beSAndroid Build Coastguard Worker		ip netns del ${n} 2> /dev/null
948*053f45beSAndroid Build Coastguard Worker	done
949*053f45beSAndroid Build Coastguard Worker
950*053f45beSAndroid Build Coastguard Worker	ip link del veth_A-C			2>/dev/null
951*053f45beSAndroid Build Coastguard Worker	ip link del veth_A-R1			2>/dev/null
952*053f45beSAndroid Build Coastguard Worker	ovs-vsctl --if-exists del-port vxlan_a	2>/dev/null
953*053f45beSAndroid Build Coastguard Worker	ovs-vsctl --if-exists del-br ovs_br0	2>/dev/null
954*053f45beSAndroid Build Coastguard Worker}
955*053f45beSAndroid Build Coastguard Worker
956*053f45beSAndroid Build Coastguard Workermtu() {
957*053f45beSAndroid Build Coastguard Worker	ns_cmd="${1}"
958*053f45beSAndroid Build Coastguard Worker	dev="${2}"
959*053f45beSAndroid Build Coastguard Worker	mtu="${3}"
960*053f45beSAndroid Build Coastguard Worker
961*053f45beSAndroid Build Coastguard Worker	${ns_cmd} ip link set dev ${dev} mtu ${mtu}
962*053f45beSAndroid Build Coastguard Worker}
963*053f45beSAndroid Build Coastguard Worker
964*053f45beSAndroid Build Coastguard Workermtu_parse() {
965*053f45beSAndroid Build Coastguard Worker	input="${1}"
966*053f45beSAndroid Build Coastguard Worker
967*053f45beSAndroid Build Coastguard Worker	next=0
968*053f45beSAndroid Build Coastguard Worker	for i in ${input}; do
969*053f45beSAndroid Build Coastguard Worker		[ ${next} -eq 1 -a "${i}" = "lock" ] && next=2 && continue
970*053f45beSAndroid Build Coastguard Worker		[ ${next} -eq 1 ] && echo "${i}" && return
971*053f45beSAndroid Build Coastguard Worker		[ ${next} -eq 2 ] && echo "lock ${i}" && return
972*053f45beSAndroid Build Coastguard Worker		[ "${i}" = "mtu" ] && next=1
973*053f45beSAndroid Build Coastguard Worker	done
974*053f45beSAndroid Build Coastguard Worker}
975*053f45beSAndroid Build Coastguard Worker
976*053f45beSAndroid Build Coastguard Workerlink_get() {
977*053f45beSAndroid Build Coastguard Worker	ns_cmd="${1}"
978*053f45beSAndroid Build Coastguard Worker	name="${2}"
979*053f45beSAndroid Build Coastguard Worker
980*053f45beSAndroid Build Coastguard Worker	${ns_cmd} ip link show dev "${name}"
981*053f45beSAndroid Build Coastguard Worker}
982*053f45beSAndroid Build Coastguard Worker
983*053f45beSAndroid Build Coastguard Workerlink_get_mtu() {
984*053f45beSAndroid Build Coastguard Worker	ns_cmd="${1}"
985*053f45beSAndroid Build Coastguard Worker	name="${2}"
986*053f45beSAndroid Build Coastguard Worker
987*053f45beSAndroid Build Coastguard Worker	mtu_parse "$(link_get "${ns_cmd}" ${name})"
988*053f45beSAndroid Build Coastguard Worker}
989*053f45beSAndroid Build Coastguard Worker
990*053f45beSAndroid Build Coastguard Workerroute_get_dst_exception() {
991*053f45beSAndroid Build Coastguard Worker	ns_cmd="${1}"
992*053f45beSAndroid Build Coastguard Worker	dst="${2}"
993*053f45beSAndroid Build Coastguard Worker	dsfield="${3}"
994*053f45beSAndroid Build Coastguard Worker
995*053f45beSAndroid Build Coastguard Worker	if [ -z "${dsfield}" ]; then
996*053f45beSAndroid Build Coastguard Worker		dsfield=0
997*053f45beSAndroid Build Coastguard Worker	fi
998*053f45beSAndroid Build Coastguard Worker
999*053f45beSAndroid Build Coastguard Worker	${ns_cmd} ip route get "${dst}" dsfield "${dsfield}"
1000*053f45beSAndroid Build Coastguard Worker}
1001*053f45beSAndroid Build Coastguard Worker
1002*053f45beSAndroid Build Coastguard Workerroute_get_dst_pmtu_from_exception() {
1003*053f45beSAndroid Build Coastguard Worker	ns_cmd="${1}"
1004*053f45beSAndroid Build Coastguard Worker	dst="${2}"
1005*053f45beSAndroid Build Coastguard Worker	dsfield="${3}"
1006*053f45beSAndroid Build Coastguard Worker
1007*053f45beSAndroid Build Coastguard Worker	mtu_parse "$(route_get_dst_exception "${ns_cmd}" "${dst}" "${dsfield}")"
1008*053f45beSAndroid Build Coastguard Worker}
1009*053f45beSAndroid Build Coastguard Worker
1010*053f45beSAndroid Build Coastguard Workercheck_pmtu_value() {
1011*053f45beSAndroid Build Coastguard Worker	expected="${1}"
1012*053f45beSAndroid Build Coastguard Worker	value="${2}"
1013*053f45beSAndroid Build Coastguard Worker	event="${3}"
1014*053f45beSAndroid Build Coastguard Worker
1015*053f45beSAndroid Build Coastguard Worker	[ "${expected}" = "any" ] && [ -n "${value}" ] && return 0
1016*053f45beSAndroid Build Coastguard Worker	[ "${value}" = "${expected}" ] && return 0
1017*053f45beSAndroid Build Coastguard Worker	[ -z "${value}" ] &&    err "  PMTU exception wasn't created after ${event}" && return 1
1018*053f45beSAndroid Build Coastguard Worker	[ -z "${expected}" ] && err "  PMTU exception shouldn't exist after ${event}" && return 1
1019*053f45beSAndroid Build Coastguard Worker	err "  found PMTU exception with incorrect MTU ${value}, expected ${expected}, after ${event}"
1020*053f45beSAndroid Build Coastguard Worker	return 1
1021*053f45beSAndroid Build Coastguard Worker}
1022*053f45beSAndroid Build Coastguard Worker
1023*053f45beSAndroid Build Coastguard Workertest_pmtu_ipvX() {
1024*053f45beSAndroid Build Coastguard Worker	family=${1}
1025*053f45beSAndroid Build Coastguard Worker
1026*053f45beSAndroid Build Coastguard Worker	setup namespaces routing || return $ksft_skip
1027*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}"  veth_A-R1    "${ns_r1}" veth_R1-A \
1028*053f45beSAndroid Build Coastguard Worker	      "${ns_r1}" veth_R1-B    "${ns_b}"  veth_B-R1 \
1029*053f45beSAndroid Build Coastguard Worker	      "${ns_a}"  veth_A-R2    "${ns_r2}" veth_R2-A \
1030*053f45beSAndroid Build Coastguard Worker	      "${ns_r2}" veth_R2-B    "${ns_b}"  veth_B-R2
1031*053f45beSAndroid Build Coastguard Worker
1032*053f45beSAndroid Build Coastguard Worker	if [ ${family} -eq 4 ]; then
1033*053f45beSAndroid Build Coastguard Worker		ping=ping
1034*053f45beSAndroid Build Coastguard Worker		dst1="${prefix4}.${b_r1}.1"
1035*053f45beSAndroid Build Coastguard Worker		dst2="${prefix4}.${b_r2}.1"
1036*053f45beSAndroid Build Coastguard Worker	else
1037*053f45beSAndroid Build Coastguard Worker		ping=${ping6}
1038*053f45beSAndroid Build Coastguard Worker		dst1="${prefix6}:${b_r1}::1"
1039*053f45beSAndroid Build Coastguard Worker		dst2="${prefix6}:${b_r2}::1"
1040*053f45beSAndroid Build Coastguard Worker	fi
1041*053f45beSAndroid Build Coastguard Worker
1042*053f45beSAndroid Build Coastguard Worker	# Set up initial MTU values
1043*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 2000
1044*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A 2000
1045*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B 1400
1046*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 1400
1047*053f45beSAndroid Build Coastguard Worker
1048*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R2 2000
1049*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-A 2000
1050*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-B 1500
1051*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R2 1500
1052*053f45beSAndroid Build Coastguard Worker
1053*053f45beSAndroid Build Coastguard Worker	# Create route exceptions
1054*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1 -s 1800 ${dst1}
1055*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1 -s 1800 ${dst2}
1056*053f45beSAndroid Build Coastguard Worker
1057*053f45beSAndroid Build Coastguard Worker	# Check that exceptions have been created with the correct PMTU
1058*053f45beSAndroid Build Coastguard Worker	pmtu_1="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst1})"
1059*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1400" "${pmtu_1}" "exceeding MTU" || return 1
1060*053f45beSAndroid Build Coastguard Worker	pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2})"
1061*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1500" "${pmtu_2}" "exceeding MTU" || return 1
1062*053f45beSAndroid Build Coastguard Worker
1063*053f45beSAndroid Build Coastguard Worker	# Decrease local MTU below PMTU, check for PMTU decrease in route exception
1064*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 1300
1065*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A 1300
1066*053f45beSAndroid Build Coastguard Worker	pmtu_1="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst1})"
1067*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1300" "${pmtu_1}" "decreasing local MTU" || return 1
1068*053f45beSAndroid Build Coastguard Worker	# Second exception shouldn't be modified
1069*053f45beSAndroid Build Coastguard Worker	pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2})"
1070*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1500" "${pmtu_2}" "changing local MTU on a link not on this path" || return 1
1071*053f45beSAndroid Build Coastguard Worker
1072*053f45beSAndroid Build Coastguard Worker	# Increase MTU, check for PMTU increase in route exception
1073*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 1700
1074*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A 1700
1075*053f45beSAndroid Build Coastguard Worker	pmtu_1="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst1})"
1076*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1700" "${pmtu_1}" "increasing local MTU" || return 1
1077*053f45beSAndroid Build Coastguard Worker	# Second exception shouldn't be modified
1078*053f45beSAndroid Build Coastguard Worker	pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2})"
1079*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1500" "${pmtu_2}" "changing local MTU on a link not on this path" || return 1
1080*053f45beSAndroid Build Coastguard Worker
1081*053f45beSAndroid Build Coastguard Worker	# Skip PMTU locking tests for IPv6
1082*053f45beSAndroid Build Coastguard Worker	[ $family -eq 6 ] && return 0
1083*053f45beSAndroid Build Coastguard Worker
1084*053f45beSAndroid Build Coastguard Worker	# Decrease remote MTU on path via R2, get new exception
1085*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-B 400
1086*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R2 400
1087*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1 -s 1400 ${dst2}
1088*053f45beSAndroid Build Coastguard Worker	pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2})"
1089*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "lock 552" "${pmtu_2}" "exceeding MTU, with MTU < min_pmtu" || return 1
1090*053f45beSAndroid Build Coastguard Worker
1091*053f45beSAndroid Build Coastguard Worker	# Decrease local MTU below PMTU
1092*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R2 500
1093*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-A 500
1094*053f45beSAndroid Build Coastguard Worker	pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2})"
1095*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "500" "${pmtu_2}" "decreasing local MTU" || return 1
1096*053f45beSAndroid Build Coastguard Worker
1097*053f45beSAndroid Build Coastguard Worker	# Increase local MTU
1098*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R2 1500
1099*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-A 1500
1100*053f45beSAndroid Build Coastguard Worker	pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2})"
1101*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1500" "${pmtu_2}" "increasing local MTU" || return 1
1102*053f45beSAndroid Build Coastguard Worker
1103*053f45beSAndroid Build Coastguard Worker	# Get new exception
1104*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1 -s 1400 ${dst2}
1105*053f45beSAndroid Build Coastguard Worker	pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2})"
1106*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "lock 552" "${pmtu_2}" "exceeding MTU, with MTU < min_pmtu" || return 1
1107*053f45beSAndroid Build Coastguard Worker}
1108*053f45beSAndroid Build Coastguard Worker
1109*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_exception() {
1110*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX 4
1111*053f45beSAndroid Build Coastguard Worker}
1112*053f45beSAndroid Build Coastguard Worker
1113*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_exception() {
1114*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX 6
1115*053f45beSAndroid Build Coastguard Worker}
1116*053f45beSAndroid Build Coastguard Worker
1117*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_dscp_icmp_exception() {
1118*053f45beSAndroid Build Coastguard Worker	rt_table=100
1119*053f45beSAndroid Build Coastguard Worker
1120*053f45beSAndroid Build Coastguard Worker	setup namespaces policy_routing || return $ksft_skip
1121*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}"  veth_A-R1    "${ns_r1}" veth_R1-A \
1122*053f45beSAndroid Build Coastguard Worker	      "${ns_r1}" veth_R1-B    "${ns_b}"  veth_B-R1 \
1123*053f45beSAndroid Build Coastguard Worker	      "${ns_a}"  veth_A-R2    "${ns_r2}" veth_R2-A \
1124*053f45beSAndroid Build Coastguard Worker	      "${ns_r2}" veth_R2-B    "${ns_b}"  veth_B-R2
1125*053f45beSAndroid Build Coastguard Worker
1126*053f45beSAndroid Build Coastguard Worker	# Set up initial MTU values
1127*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 2000
1128*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A 2000
1129*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B 1400
1130*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 1400
1131*053f45beSAndroid Build Coastguard Worker
1132*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R2 2000
1133*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-A 2000
1134*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-B 1500
1135*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R2 1500
1136*053f45beSAndroid Build Coastguard Worker
1137*053f45beSAndroid Build Coastguard Worker	len=$((2000 - 20 - 8)) # Fills MTU of veth_A-R1
1138*053f45beSAndroid Build Coastguard Worker
1139*053f45beSAndroid Build Coastguard Worker	dst1="${prefix4}.${b_r1}.1"
1140*053f45beSAndroid Build Coastguard Worker	dst2="${prefix4}.${b_r2}.1"
1141*053f45beSAndroid Build Coastguard Worker
1142*053f45beSAndroid Build Coastguard Worker	# Create route exceptions
1143*053f45beSAndroid Build Coastguard Worker	dsfield=${policy_mark} # No ECN bit set (Not-ECT)
1144*053f45beSAndroid Build Coastguard Worker	run_cmd "${ns_a}" ping -q -M want -Q "${dsfield}" -c 1 -w 1 -s "${len}" "${dst1}"
1145*053f45beSAndroid Build Coastguard Worker
1146*053f45beSAndroid Build Coastguard Worker	dsfield=$(printf "%#x" $((policy_mark + 0x02))) # ECN=2 (ECT(0))
1147*053f45beSAndroid Build Coastguard Worker	run_cmd "${ns_a}" ping -q -M want -Q "${dsfield}" -c 1 -w 1 -s "${len}" "${dst2}"
1148*053f45beSAndroid Build Coastguard Worker
1149*053f45beSAndroid Build Coastguard Worker	# Check that exceptions have been created with the correct PMTU
1150*053f45beSAndroid Build Coastguard Worker	pmtu_1="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst1}" "${policy_mark}")"
1151*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1400" "${pmtu_1}" "exceeding MTU" || return 1
1152*053f45beSAndroid Build Coastguard Worker
1153*053f45beSAndroid Build Coastguard Worker	pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst2}" "${policy_mark}")"
1154*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1500" "${pmtu_2}" "exceeding MTU" || return 1
1155*053f45beSAndroid Build Coastguard Worker}
1156*053f45beSAndroid Build Coastguard Worker
1157*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_dscp_udp_exception() {
1158*053f45beSAndroid Build Coastguard Worker	rt_table=100
1159*053f45beSAndroid Build Coastguard Worker
1160*053f45beSAndroid Build Coastguard Worker	if ! which socat > /dev/null 2>&1; then
1161*053f45beSAndroid Build Coastguard Worker		echo "'socat' command not found; skipping tests"
1162*053f45beSAndroid Build Coastguard Worker		return $ksft_skip
1163*053f45beSAndroid Build Coastguard Worker	fi
1164*053f45beSAndroid Build Coastguard Worker
1165*053f45beSAndroid Build Coastguard Worker	setup namespaces policy_routing || return $ksft_skip
1166*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}"  veth_A-R1    "${ns_r1}" veth_R1-A \
1167*053f45beSAndroid Build Coastguard Worker	      "${ns_r1}" veth_R1-B    "${ns_b}"  veth_B-R1 \
1168*053f45beSAndroid Build Coastguard Worker	      "${ns_a}"  veth_A-R2    "${ns_r2}" veth_R2-A \
1169*053f45beSAndroid Build Coastguard Worker	      "${ns_r2}" veth_R2-B    "${ns_b}"  veth_B-R2
1170*053f45beSAndroid Build Coastguard Worker
1171*053f45beSAndroid Build Coastguard Worker	# Set up initial MTU values
1172*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 2000
1173*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A 2000
1174*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B 1400
1175*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 1400
1176*053f45beSAndroid Build Coastguard Worker
1177*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R2 2000
1178*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-A 2000
1179*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-B 1500
1180*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R2 1500
1181*053f45beSAndroid Build Coastguard Worker
1182*053f45beSAndroid Build Coastguard Worker	len=$((2000 - 20 - 8)) # Fills MTU of veth_A-R1
1183*053f45beSAndroid Build Coastguard Worker
1184*053f45beSAndroid Build Coastguard Worker	dst1="${prefix4}.${b_r1}.1"
1185*053f45beSAndroid Build Coastguard Worker	dst2="${prefix4}.${b_r2}.1"
1186*053f45beSAndroid Build Coastguard Worker
1187*053f45beSAndroid Build Coastguard Worker	# Create route exceptions
1188*053f45beSAndroid Build Coastguard Worker	run_cmd_bg "${ns_b}" socat UDP-LISTEN:50000 OPEN:/dev/null,wronly=1
1189*053f45beSAndroid Build Coastguard Worker	socat_pids="${socat_pids} $!"
1190*053f45beSAndroid Build Coastguard Worker
1191*053f45beSAndroid Build Coastguard Worker	dsfield=${policy_mark} # No ECN bit set (Not-ECT)
1192*053f45beSAndroid Build Coastguard Worker	run_cmd "${ns_a}" socat OPEN:/dev/zero,rdonly=1,readbytes="${len}" \
1193*053f45beSAndroid Build Coastguard Worker		UDP:"${dst1}":50000,tos="${dsfield}"
1194*053f45beSAndroid Build Coastguard Worker
1195*053f45beSAndroid Build Coastguard Worker	dsfield=$(printf "%#x" $((policy_mark + 0x02))) # ECN=2 (ECT(0))
1196*053f45beSAndroid Build Coastguard Worker	run_cmd "${ns_a}" socat OPEN:/dev/zero,rdonly=1,readbytes="${len}" \
1197*053f45beSAndroid Build Coastguard Worker		UDP:"${dst2}":50000,tos="${dsfield}"
1198*053f45beSAndroid Build Coastguard Worker
1199*053f45beSAndroid Build Coastguard Worker	# Check that exceptions have been created with the correct PMTU
1200*053f45beSAndroid Build Coastguard Worker	pmtu_1="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst1}" "${policy_mark}")"
1201*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1400" "${pmtu_1}" "exceeding MTU" || return 1
1202*053f45beSAndroid Build Coastguard Worker	pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst2}" "${policy_mark}")"
1203*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1500" "${pmtu_2}" "exceeding MTU" || return 1
1204*053f45beSAndroid Build Coastguard Worker}
1205*053f45beSAndroid Build Coastguard Worker
1206*053f45beSAndroid Build Coastguard Workertest_pmtu_ipvX_over_vxlanY_or_geneveY_exception() {
1207*053f45beSAndroid Build Coastguard Worker	type=${1}
1208*053f45beSAndroid Build Coastguard Worker	family=${2}
1209*053f45beSAndroid Build Coastguard Worker	outer_family=${3}
1210*053f45beSAndroid Build Coastguard Worker	ll_mtu=4000
1211*053f45beSAndroid Build Coastguard Worker
1212*053f45beSAndroid Build Coastguard Worker	if [ ${outer_family} -eq 4 ]; then
1213*053f45beSAndroid Build Coastguard Worker		setup namespaces routing ${type}4 || return $ksft_skip
1214*053f45beSAndroid Build Coastguard Worker		#                      IPv4 header   UDP header   VXLAN/GENEVE header   Ethernet header
1215*053f45beSAndroid Build Coastguard Worker		exp_mtu=$((${ll_mtu} - 20          - 8          - 8                   - 14))
1216*053f45beSAndroid Build Coastguard Worker	else
1217*053f45beSAndroid Build Coastguard Worker		setup namespaces routing ${type}6 || return $ksft_skip
1218*053f45beSAndroid Build Coastguard Worker		#                      IPv6 header   UDP header   VXLAN/GENEVE header   Ethernet header
1219*053f45beSAndroid Build Coastguard Worker		exp_mtu=$((${ll_mtu} - 40          - 8          - 8                   - 14))
1220*053f45beSAndroid Build Coastguard Worker	fi
1221*053f45beSAndroid Build Coastguard Worker
1222*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" ${type}_a    "${ns_b}"  ${type}_b \
1223*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" veth_A-R1    "${ns_r1}" veth_R1-A \
1224*053f45beSAndroid Build Coastguard Worker	      "${ns_b}" veth_B-R1    "${ns_r1}" veth_R1-B
1225*053f45beSAndroid Build Coastguard Worker
1226*053f45beSAndroid Build Coastguard Worker	if [ ${family} -eq 4 ]; then
1227*053f45beSAndroid Build Coastguard Worker		ping=ping
1228*053f45beSAndroid Build Coastguard Worker		dst=${tunnel4_b_addr}
1229*053f45beSAndroid Build Coastguard Worker	else
1230*053f45beSAndroid Build Coastguard Worker		ping=${ping6}
1231*053f45beSAndroid Build Coastguard Worker		dst=${tunnel6_b_addr}
1232*053f45beSAndroid Build Coastguard Worker	fi
1233*053f45beSAndroid Build Coastguard Worker
1234*053f45beSAndroid Build Coastguard Worker	# Create route exception by exceeding link layer MTU
1235*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 $((${ll_mtu} + 1000))
1236*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A $((${ll_mtu} + 1000))
1237*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 ${ll_mtu}
1238*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B ${ll_mtu}
1239*053f45beSAndroid Build Coastguard Worker
1240*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" ${type}_a $((${ll_mtu} + 1000))
1241*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" ${type}_b $((${ll_mtu} + 1000))
1242*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1 -s $((${ll_mtu} + 500)) ${dst}
1243*053f45beSAndroid Build Coastguard Worker
1244*053f45beSAndroid Build Coastguard Worker	# Check that exception was created
1245*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst})"
1246*053f45beSAndroid Build Coastguard Worker	check_pmtu_value ${exp_mtu} "${pmtu}" "exceeding link layer MTU on ${type} interface"
1247*053f45beSAndroid Build Coastguard Worker}
1248*053f45beSAndroid Build Coastguard Worker
1249*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_vxlan4_exception() {
1250*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_vxlanY_or_geneveY_exception vxlan  4 4
1251*053f45beSAndroid Build Coastguard Worker}
1252*053f45beSAndroid Build Coastguard Worker
1253*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_vxlan4_exception() {
1254*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_vxlanY_or_geneveY_exception vxlan  6 4
1255*053f45beSAndroid Build Coastguard Worker}
1256*053f45beSAndroid Build Coastguard Worker
1257*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_geneve4_exception() {
1258*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_vxlanY_or_geneveY_exception geneve 4 4
1259*053f45beSAndroid Build Coastguard Worker}
1260*053f45beSAndroid Build Coastguard Worker
1261*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_geneve4_exception() {
1262*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_vxlanY_or_geneveY_exception geneve 6 4
1263*053f45beSAndroid Build Coastguard Worker}
1264*053f45beSAndroid Build Coastguard Worker
1265*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_vxlan6_exception() {
1266*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_vxlanY_or_geneveY_exception vxlan  4 6
1267*053f45beSAndroid Build Coastguard Worker}
1268*053f45beSAndroid Build Coastguard Worker
1269*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_vxlan6_exception() {
1270*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_vxlanY_or_geneveY_exception vxlan  6 6
1271*053f45beSAndroid Build Coastguard Worker}
1272*053f45beSAndroid Build Coastguard Worker
1273*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_geneve6_exception() {
1274*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_vxlanY_or_geneveY_exception geneve 4 6
1275*053f45beSAndroid Build Coastguard Worker}
1276*053f45beSAndroid Build Coastguard Worker
1277*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_geneve6_exception() {
1278*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_vxlanY_or_geneveY_exception geneve 6 6
1279*053f45beSAndroid Build Coastguard Worker}
1280*053f45beSAndroid Build Coastguard Worker
1281*053f45beSAndroid Build Coastguard Workertest_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception() {
1282*053f45beSAndroid Build Coastguard Worker	type=${1}
1283*053f45beSAndroid Build Coastguard Worker	family=${2}
1284*053f45beSAndroid Build Coastguard Worker	outer_family=${3}
1285*053f45beSAndroid Build Coastguard Worker	ll_mtu=4000
1286*053f45beSAndroid Build Coastguard Worker
1287*053f45beSAndroid Build Coastguard Worker	if [ ${outer_family} -eq 4 ]; then
1288*053f45beSAndroid Build Coastguard Worker		setup namespaces routing bridge bridged_${type}4 || return $ksft_skip
1289*053f45beSAndroid Build Coastguard Worker		#                      IPv4 header   UDP header   VXLAN/GENEVE header   Ethernet header
1290*053f45beSAndroid Build Coastguard Worker		exp_mtu=$((${ll_mtu} - 20          - 8          - 8                   - 14))
1291*053f45beSAndroid Build Coastguard Worker	else
1292*053f45beSAndroid Build Coastguard Worker		setup namespaces routing bridge bridged_${type}6 || return $ksft_skip
1293*053f45beSAndroid Build Coastguard Worker		#                      IPv6 header   UDP header   VXLAN/GENEVE header   Ethernet header
1294*053f45beSAndroid Build Coastguard Worker		exp_mtu=$((${ll_mtu} - 40          - 8          - 8                   - 14))
1295*053f45beSAndroid Build Coastguard Worker	fi
1296*053f45beSAndroid Build Coastguard Worker
1297*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" ${type}_a    "${ns_b}"  ${type}_b \
1298*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" veth_A-R1    "${ns_r1}" veth_R1-A \
1299*053f45beSAndroid Build Coastguard Worker	      "${ns_b}" veth_B-R1    "${ns_r1}" veth_R1-B \
1300*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" br0          "${ns_a}"  veth-A-C  \
1301*053f45beSAndroid Build Coastguard Worker	      "${ns_c}" veth_C-A
1302*053f45beSAndroid Build Coastguard Worker
1303*053f45beSAndroid Build Coastguard Worker	if [ ${family} -eq 4 ]; then
1304*053f45beSAndroid Build Coastguard Worker		ping=ping
1305*053f45beSAndroid Build Coastguard Worker		dst=${tunnel4_b_addr}
1306*053f45beSAndroid Build Coastguard Worker	else
1307*053f45beSAndroid Build Coastguard Worker		ping=${ping6}
1308*053f45beSAndroid Build Coastguard Worker		dst=${tunnel6_b_addr}
1309*053f45beSAndroid Build Coastguard Worker	fi
1310*053f45beSAndroid Build Coastguard Worker
1311*053f45beSAndroid Build Coastguard Worker	# Create route exception by exceeding link layer MTU
1312*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 $((${ll_mtu} + 1000))
1313*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  br0       $((${ll_mtu} + 1000))
1314*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-C  $((${ll_mtu} + 1000))
1315*053f45beSAndroid Build Coastguard Worker	mtu "${ns_c}"  veth_C-A  $((${ll_mtu} + 1000))
1316*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A $((${ll_mtu} + 1000))
1317*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 ${ll_mtu}
1318*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B ${ll_mtu}
1319*053f45beSAndroid Build Coastguard Worker
1320*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" ${type}_a $((${ll_mtu} + 1000))
1321*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" ${type}_b $((${ll_mtu} + 1000))
1322*053f45beSAndroid Build Coastguard Worker
1323*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ${ping} -q -M want -i 0.1 -c 10 -s $((${ll_mtu} + 500)) ${dst} || return 1
1324*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1  -s $((${ll_mtu} + 500)) ${dst} || return 1
1325*053f45beSAndroid Build Coastguard Worker
1326*053f45beSAndroid Build Coastguard Worker	# Check that exceptions were created
1327*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_c}" ${dst})"
1328*053f45beSAndroid Build Coastguard Worker	check_pmtu_value ${exp_mtu} "${pmtu}" "exceeding link layer MTU on bridged ${type} interface"
1329*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst})"
1330*053f45beSAndroid Build Coastguard Worker	check_pmtu_value ${exp_mtu} "${pmtu}" "exceeding link layer MTU on locally bridged ${type} interface"
1331*053f45beSAndroid Build Coastguard Worker}
1332*053f45beSAndroid Build Coastguard Worker
1333*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_br_vxlan4_exception() {
1334*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception vxlan  4 4
1335*053f45beSAndroid Build Coastguard Worker}
1336*053f45beSAndroid Build Coastguard Worker
1337*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_br_vxlan4_exception() {
1338*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception vxlan  6 4
1339*053f45beSAndroid Build Coastguard Worker}
1340*053f45beSAndroid Build Coastguard Worker
1341*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_br_geneve4_exception() {
1342*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception geneve 4 4
1343*053f45beSAndroid Build Coastguard Worker}
1344*053f45beSAndroid Build Coastguard Worker
1345*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_br_geneve4_exception() {
1346*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception geneve 6 4
1347*053f45beSAndroid Build Coastguard Worker}
1348*053f45beSAndroid Build Coastguard Worker
1349*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_br_vxlan6_exception() {
1350*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception vxlan  4 6
1351*053f45beSAndroid Build Coastguard Worker}
1352*053f45beSAndroid Build Coastguard Worker
1353*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_br_vxlan6_exception() {
1354*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception vxlan  6 6
1355*053f45beSAndroid Build Coastguard Worker}
1356*053f45beSAndroid Build Coastguard Worker
1357*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_br_geneve6_exception() {
1358*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception geneve 4 6
1359*053f45beSAndroid Build Coastguard Worker}
1360*053f45beSAndroid Build Coastguard Worker
1361*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_br_geneve6_exception() {
1362*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception geneve 6 6
1363*053f45beSAndroid Build Coastguard Worker}
1364*053f45beSAndroid Build Coastguard Worker
1365*053f45beSAndroid Build Coastguard Workertest_pmtu_ipvX_over_ovs_vxlanY_or_geneveY_exception() {
1366*053f45beSAndroid Build Coastguard Worker	type=${1}
1367*053f45beSAndroid Build Coastguard Worker	family=${2}
1368*053f45beSAndroid Build Coastguard Worker	outer_family=${3}
1369*053f45beSAndroid Build Coastguard Worker	ll_mtu=4000
1370*053f45beSAndroid Build Coastguard Worker
1371*053f45beSAndroid Build Coastguard Worker	if [ ${outer_family} -eq 4 ]; then
1372*053f45beSAndroid Build Coastguard Worker		setup namespaces routing ovs_bridge ovs_${type}4 || return $ksft_skip
1373*053f45beSAndroid Build Coastguard Worker		#                      IPv4 header   UDP header   VXLAN/GENEVE header   Ethernet header
1374*053f45beSAndroid Build Coastguard Worker		exp_mtu=$((${ll_mtu} - 20          - 8          - 8                   - 14))
1375*053f45beSAndroid Build Coastguard Worker	else
1376*053f45beSAndroid Build Coastguard Worker		setup namespaces routing ovs_bridge ovs_${type}6 || return $ksft_skip
1377*053f45beSAndroid Build Coastguard Worker		#                      IPv6 header   UDP header   VXLAN/GENEVE header   Ethernet header
1378*053f45beSAndroid Build Coastguard Worker		exp_mtu=$((${ll_mtu} - 40          - 8          - 8                   - 14))
1379*053f45beSAndroid Build Coastguard Worker	fi
1380*053f45beSAndroid Build Coastguard Worker
1381*053f45beSAndroid Build Coastguard Worker	if [ "${type}" = "vxlan" ]; then
1382*053f45beSAndroid Build Coastguard Worker		tun_a="vxlan_sys_4789"
1383*053f45beSAndroid Build Coastguard Worker	elif [ "${type}" = "geneve" ]; then
1384*053f45beSAndroid Build Coastguard Worker		tun_a="genev_sys_6081"
1385*053f45beSAndroid Build Coastguard Worker	fi
1386*053f45beSAndroid Build Coastguard Worker
1387*053f45beSAndroid Build Coastguard Worker	trace ""        "${tun_a}"  "${ns_b}"  ${type}_b \
1388*053f45beSAndroid Build Coastguard Worker	      ""        veth_A-R1   "${ns_r1}" veth_R1-A \
1389*053f45beSAndroid Build Coastguard Worker	      "${ns_b}" veth_B-R1   "${ns_r1}" veth_R1-B \
1390*053f45beSAndroid Build Coastguard Worker	      ""        ovs_br0     ""         veth-A-C  \
1391*053f45beSAndroid Build Coastguard Worker	      "${ns_c}" veth_C-A
1392*053f45beSAndroid Build Coastguard Worker
1393*053f45beSAndroid Build Coastguard Worker	if [ ${family} -eq 4 ]; then
1394*053f45beSAndroid Build Coastguard Worker		ping=ping
1395*053f45beSAndroid Build Coastguard Worker		dst=${tunnel4_b_addr}
1396*053f45beSAndroid Build Coastguard Worker	else
1397*053f45beSAndroid Build Coastguard Worker		ping=${ping6}
1398*053f45beSAndroid Build Coastguard Worker		dst=${tunnel6_b_addr}
1399*053f45beSAndroid Build Coastguard Worker	fi
1400*053f45beSAndroid Build Coastguard Worker
1401*053f45beSAndroid Build Coastguard Worker	# Create route exception by exceeding link layer MTU
1402*053f45beSAndroid Build Coastguard Worker	mtu ""         veth_A-R1 $((${ll_mtu} + 1000))
1403*053f45beSAndroid Build Coastguard Worker	mtu ""         ovs_br0   $((${ll_mtu} + 1000))
1404*053f45beSAndroid Build Coastguard Worker	mtu ""         veth_A-C  $((${ll_mtu} + 1000))
1405*053f45beSAndroid Build Coastguard Worker	mtu "${ns_c}"  veth_C-A  $((${ll_mtu} + 1000))
1406*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A $((${ll_mtu} + 1000))
1407*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 ${ll_mtu}
1408*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B ${ll_mtu}
1409*053f45beSAndroid Build Coastguard Worker
1410*053f45beSAndroid Build Coastguard Worker	mtu ""        ${tun_a}  $((${ll_mtu} + 1000))
1411*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" ${type}_b $((${ll_mtu} + 1000))
1412*053f45beSAndroid Build Coastguard Worker
1413*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_c} ${ping} -q -M want -i 0.1 -c 20 -s $((${ll_mtu} + 500)) ${dst} || return 1
1414*053f45beSAndroid Build Coastguard Worker
1415*053f45beSAndroid Build Coastguard Worker	# Check that exceptions were created
1416*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_c}" ${dst})"
1417*053f45beSAndroid Build Coastguard Worker	check_pmtu_value ${exp_mtu} "${pmtu}" "exceeding link layer MTU on Open vSwitch ${type} interface"
1418*053f45beSAndroid Build Coastguard Worker}
1419*053f45beSAndroid Build Coastguard Worker
1420*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_ovs_vxlan4_exception() {
1421*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ovs_vxlanY_or_geneveY_exception vxlan  4 4
1422*053f45beSAndroid Build Coastguard Worker}
1423*053f45beSAndroid Build Coastguard Worker
1424*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_ovs_vxlan4_exception() {
1425*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ovs_vxlanY_or_geneveY_exception vxlan  6 4
1426*053f45beSAndroid Build Coastguard Worker}
1427*053f45beSAndroid Build Coastguard Worker
1428*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_ovs_geneve4_exception() {
1429*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ovs_vxlanY_or_geneveY_exception geneve 4 4
1430*053f45beSAndroid Build Coastguard Worker}
1431*053f45beSAndroid Build Coastguard Worker
1432*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_ovs_geneve4_exception() {
1433*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ovs_vxlanY_or_geneveY_exception geneve 6 4
1434*053f45beSAndroid Build Coastguard Worker}
1435*053f45beSAndroid Build Coastguard Worker
1436*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_ovs_vxlan6_exception() {
1437*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ovs_vxlanY_or_geneveY_exception vxlan  4 6
1438*053f45beSAndroid Build Coastguard Worker}
1439*053f45beSAndroid Build Coastguard Worker
1440*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_ovs_vxlan6_exception() {
1441*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ovs_vxlanY_or_geneveY_exception vxlan  6 6
1442*053f45beSAndroid Build Coastguard Worker}
1443*053f45beSAndroid Build Coastguard Worker
1444*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_ovs_geneve6_exception() {
1445*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ovs_vxlanY_or_geneveY_exception geneve 4 6
1446*053f45beSAndroid Build Coastguard Worker}
1447*053f45beSAndroid Build Coastguard Worker
1448*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_ovs_geneve6_exception() {
1449*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ovs_vxlanY_or_geneveY_exception geneve 6 6
1450*053f45beSAndroid Build Coastguard Worker}
1451*053f45beSAndroid Build Coastguard Worker
1452*053f45beSAndroid Build Coastguard Workertest_pmtu_ipvX_over_fouY_or_gueY() {
1453*053f45beSAndroid Build Coastguard Worker	inner_family=${1}
1454*053f45beSAndroid Build Coastguard Worker	outer_family=${2}
1455*053f45beSAndroid Build Coastguard Worker	encap=${3}
1456*053f45beSAndroid Build Coastguard Worker	ll_mtu=4000
1457*053f45beSAndroid Build Coastguard Worker
1458*053f45beSAndroid Build Coastguard Worker	setup namespaces routing ${encap}${outer_family}${inner_family} || return $ksft_skip
1459*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" ${encap}_a   "${ns_b}"  ${encap}_b \
1460*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" veth_A-R1    "${ns_r1}" veth_R1-A \
1461*053f45beSAndroid Build Coastguard Worker	      "${ns_b}" veth_B-R1    "${ns_r1}" veth_R1-B
1462*053f45beSAndroid Build Coastguard Worker
1463*053f45beSAndroid Build Coastguard Worker	if [ ${inner_family} -eq 4 ]; then
1464*053f45beSAndroid Build Coastguard Worker		ping=ping
1465*053f45beSAndroid Build Coastguard Worker		dst=${tunnel4_b_addr}
1466*053f45beSAndroid Build Coastguard Worker	else
1467*053f45beSAndroid Build Coastguard Worker		ping=${ping6}
1468*053f45beSAndroid Build Coastguard Worker		dst=${tunnel6_b_addr}
1469*053f45beSAndroid Build Coastguard Worker	fi
1470*053f45beSAndroid Build Coastguard Worker
1471*053f45beSAndroid Build Coastguard Worker	if [ "${encap}" = "gue" ]; then
1472*053f45beSAndroid Build Coastguard Worker		encap_overhead=4
1473*053f45beSAndroid Build Coastguard Worker	else
1474*053f45beSAndroid Build Coastguard Worker		encap_overhead=0
1475*053f45beSAndroid Build Coastguard Worker	fi
1476*053f45beSAndroid Build Coastguard Worker
1477*053f45beSAndroid Build Coastguard Worker	if [ ${outer_family} -eq 4 ]; then
1478*053f45beSAndroid Build Coastguard Worker		#                      IPv4 header   UDP header
1479*053f45beSAndroid Build Coastguard Worker		exp_mtu=$((${ll_mtu} - 20          - 8         - ${encap_overhead}))
1480*053f45beSAndroid Build Coastguard Worker	else
1481*053f45beSAndroid Build Coastguard Worker		#                      IPv6 header   Option 4   UDP header
1482*053f45beSAndroid Build Coastguard Worker		exp_mtu=$((${ll_mtu} - 40          - 8        - 8       - ${encap_overhead}))
1483*053f45beSAndroid Build Coastguard Worker	fi
1484*053f45beSAndroid Build Coastguard Worker
1485*053f45beSAndroid Build Coastguard Worker	# Create route exception by exceeding link layer MTU
1486*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 $((${ll_mtu} + 1000))
1487*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A $((${ll_mtu} + 1000))
1488*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 ${ll_mtu}
1489*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B ${ll_mtu}
1490*053f45beSAndroid Build Coastguard Worker
1491*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" ${encap}_a $((${ll_mtu} + 1000))
1492*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" ${encap}_b $((${ll_mtu} + 1000))
1493*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1 -s $((${ll_mtu} + 500)) ${dst}
1494*053f45beSAndroid Build Coastguard Worker
1495*053f45beSAndroid Build Coastguard Worker	# Check that exception was created
1496*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst})"
1497*053f45beSAndroid Build Coastguard Worker	check_pmtu_value ${exp_mtu} "${pmtu}" "exceeding link layer MTU on ${encap} interface"
1498*053f45beSAndroid Build Coastguard Worker}
1499*053f45beSAndroid Build Coastguard Worker
1500*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_fou4_exception() {
1501*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_fouY_or_gueY 4 4 fou
1502*053f45beSAndroid Build Coastguard Worker}
1503*053f45beSAndroid Build Coastguard Worker
1504*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_fou4_exception() {
1505*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_fouY_or_gueY 6 4 fou
1506*053f45beSAndroid Build Coastguard Worker}
1507*053f45beSAndroid Build Coastguard Worker
1508*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_fou6_exception() {
1509*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_fouY_or_gueY 4 6 fou
1510*053f45beSAndroid Build Coastguard Worker}
1511*053f45beSAndroid Build Coastguard Worker
1512*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_fou6_exception() {
1513*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_fouY_or_gueY 6 6 fou
1514*053f45beSAndroid Build Coastguard Worker}
1515*053f45beSAndroid Build Coastguard Worker
1516*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_gue4_exception() {
1517*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_fouY_or_gueY 4 4 gue
1518*053f45beSAndroid Build Coastguard Worker}
1519*053f45beSAndroid Build Coastguard Worker
1520*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_gue4_exception() {
1521*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_fouY_or_gueY 6 4 gue
1522*053f45beSAndroid Build Coastguard Worker}
1523*053f45beSAndroid Build Coastguard Worker
1524*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_gue6_exception() {
1525*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_fouY_or_gueY 4 6 gue
1526*053f45beSAndroid Build Coastguard Worker}
1527*053f45beSAndroid Build Coastguard Worker
1528*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_gue6_exception() {
1529*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_fouY_or_gueY 6 6 gue
1530*053f45beSAndroid Build Coastguard Worker}
1531*053f45beSAndroid Build Coastguard Worker
1532*053f45beSAndroid Build Coastguard Workertest_pmtu_ipvX_over_ipvY_exception() {
1533*053f45beSAndroid Build Coastguard Worker	inner=${1}
1534*053f45beSAndroid Build Coastguard Worker	outer=${2}
1535*053f45beSAndroid Build Coastguard Worker	ll_mtu=4000
1536*053f45beSAndroid Build Coastguard Worker
1537*053f45beSAndroid Build Coastguard Worker	setup namespaces routing ip${inner}ip${outer} || return $ksft_skip
1538*053f45beSAndroid Build Coastguard Worker
1539*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" ip_a         "${ns_b}"  ip_b  \
1540*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" veth_A-R1    "${ns_r1}" veth_R1-A \
1541*053f45beSAndroid Build Coastguard Worker	      "${ns_b}" veth_B-R1    "${ns_r1}" veth_R1-B
1542*053f45beSAndroid Build Coastguard Worker
1543*053f45beSAndroid Build Coastguard Worker	if [ ${inner} -eq 4 ]; then
1544*053f45beSAndroid Build Coastguard Worker		ping=ping
1545*053f45beSAndroid Build Coastguard Worker		dst=${tunnel4_b_addr}
1546*053f45beSAndroid Build Coastguard Worker	else
1547*053f45beSAndroid Build Coastguard Worker		ping=${ping6}
1548*053f45beSAndroid Build Coastguard Worker		dst=${tunnel6_b_addr}
1549*053f45beSAndroid Build Coastguard Worker	fi
1550*053f45beSAndroid Build Coastguard Worker
1551*053f45beSAndroid Build Coastguard Worker	if [ ${outer} -eq 4 ]; then
1552*053f45beSAndroid Build Coastguard Worker		#                      IPv4 header
1553*053f45beSAndroid Build Coastguard Worker		exp_mtu=$((${ll_mtu} - 20))
1554*053f45beSAndroid Build Coastguard Worker	else
1555*053f45beSAndroid Build Coastguard Worker		#                      IPv6 header   Option 4
1556*053f45beSAndroid Build Coastguard Worker		exp_mtu=$((${ll_mtu} - 40          - 8))
1557*053f45beSAndroid Build Coastguard Worker	fi
1558*053f45beSAndroid Build Coastguard Worker
1559*053f45beSAndroid Build Coastguard Worker	# Create route exception by exceeding link layer MTU
1560*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 $((${ll_mtu} + 1000))
1561*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A $((${ll_mtu} + 1000))
1562*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 ${ll_mtu}
1563*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B ${ll_mtu}
1564*053f45beSAndroid Build Coastguard Worker
1565*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" ip_a $((${ll_mtu} + 1000)) || return
1566*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" ip_b $((${ll_mtu} + 1000)) || return
1567*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1 -s $((${ll_mtu} + 500)) ${dst}
1568*053f45beSAndroid Build Coastguard Worker
1569*053f45beSAndroid Build Coastguard Worker	# Check that exception was created
1570*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst})"
1571*053f45beSAndroid Build Coastguard Worker	check_pmtu_value ${exp_mtu} "${pmtu}" "exceeding link layer MTU on ip${inner}ip${outer} interface"
1572*053f45beSAndroid Build Coastguard Worker}
1573*053f45beSAndroid Build Coastguard Worker
1574*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_ipv4_exception() {
1575*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ipvY_exception 4 4
1576*053f45beSAndroid Build Coastguard Worker}
1577*053f45beSAndroid Build Coastguard Worker
1578*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_ipv4_exception() {
1579*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ipvY_exception 6 4
1580*053f45beSAndroid Build Coastguard Worker}
1581*053f45beSAndroid Build Coastguard Worker
1582*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_ipv6_exception() {
1583*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ipvY_exception 4 6
1584*053f45beSAndroid Build Coastguard Worker}
1585*053f45beSAndroid Build Coastguard Worker
1586*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_ipv6_exception() {
1587*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_over_ipvY_exception 6 6
1588*053f45beSAndroid Build Coastguard Worker}
1589*053f45beSAndroid Build Coastguard Worker
1590*053f45beSAndroid Build Coastguard Workertest_pmtu_vti4_exception() {
1591*053f45beSAndroid Build Coastguard Worker	setup namespaces veth vti4 xfrm4 || return $ksft_skip
1592*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" veth_a    "${ns_b}" veth_b \
1593*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" vti4_a    "${ns_b}" vti4_b
1594*053f45beSAndroid Build Coastguard Worker
1595*053f45beSAndroid Build Coastguard Worker	veth_mtu=1500
1596*053f45beSAndroid Build Coastguard Worker	vti_mtu=$((veth_mtu - 20))
1597*053f45beSAndroid Build Coastguard Worker
1598*053f45beSAndroid Build Coastguard Worker	#                                SPI   SN   IV  ICV   pad length   next header
1599*053f45beSAndroid Build Coastguard Worker	esp_payload_rfc4106=$((vti_mtu - 4   - 4  - 8 - 16  - 1          - 1))
1600*053f45beSAndroid Build Coastguard Worker	ping_payload=$((esp_payload_rfc4106 - 28))
1601*053f45beSAndroid Build Coastguard Worker
1602*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" veth_a ${veth_mtu}
1603*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" veth_b ${veth_mtu}
1604*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" vti4_a ${vti_mtu}
1605*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" vti4_b ${vti_mtu}
1606*053f45beSAndroid Build Coastguard Worker
1607*053f45beSAndroid Build Coastguard Worker	# Send DF packet without exceeding link layer MTU, check that no
1608*053f45beSAndroid Build Coastguard Worker	# exception is created
1609*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ping -q -M want -i 0.1 -w 1 -s ${ping_payload} ${tunnel4_b_addr}
1610*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel4_b_addr})"
1611*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "" "${pmtu}" "sending packet smaller than PMTU (IP payload length ${esp_payload_rfc4106})" || return 1
1612*053f45beSAndroid Build Coastguard Worker
1613*053f45beSAndroid Build Coastguard Worker	# Now exceed link layer MTU by one byte, check that exception is created
1614*053f45beSAndroid Build Coastguard Worker	# with the right PMTU value
1615*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ping -q -M want -i 0.1 -w 1 -s $((ping_payload + 1)) ${tunnel4_b_addr}
1616*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel4_b_addr})"
1617*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "${esp_payload_rfc4106}" "${pmtu}" "exceeding PMTU (IP payload length $((esp_payload_rfc4106 + 1)))"
1618*053f45beSAndroid Build Coastguard Worker}
1619*053f45beSAndroid Build Coastguard Worker
1620*053f45beSAndroid Build Coastguard Workertest_pmtu_vti6_exception() {
1621*053f45beSAndroid Build Coastguard Worker	setup namespaces veth vti6 xfrm6 || return $ksft_skip
1622*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" veth_a    "${ns_b}" veth_b \
1623*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" vti6_a    "${ns_b}" vti6_b
1624*053f45beSAndroid Build Coastguard Worker	fail=0
1625*053f45beSAndroid Build Coastguard Worker
1626*053f45beSAndroid Build Coastguard Worker	# Create route exception by exceeding link layer MTU
1627*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" veth_a 4000
1628*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" veth_b 4000
1629*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" vti6_a 5000
1630*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" vti6_b 5000
1631*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping6} -q -i 0.1 -w 1 -s 60000 ${tunnel6_b_addr}
1632*053f45beSAndroid Build Coastguard Worker
1633*053f45beSAndroid Build Coastguard Worker	# Check that exception was created
1634*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel6_b_addr})"
1635*053f45beSAndroid Build Coastguard Worker	check_pmtu_value any "${pmtu}" "creating tunnel exceeding link layer MTU" || return 1
1636*053f45beSAndroid Build Coastguard Worker
1637*053f45beSAndroid Build Coastguard Worker	# Decrease tunnel MTU, check for PMTU decrease in route exception
1638*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" vti6_a 3000
1639*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel6_b_addr})"
1640*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "3000" "${pmtu}" "decreasing tunnel MTU" || fail=1
1641*053f45beSAndroid Build Coastguard Worker
1642*053f45beSAndroid Build Coastguard Worker	# Increase tunnel MTU, check for PMTU increase in route exception
1643*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" vti6_a 9000
1644*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel6_b_addr})"
1645*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "9000" "${pmtu}" "increasing tunnel MTU" || fail=1
1646*053f45beSAndroid Build Coastguard Worker
1647*053f45beSAndroid Build Coastguard Worker	return ${fail}
1648*053f45beSAndroid Build Coastguard Worker}
1649*053f45beSAndroid Build Coastguard Worker
1650*053f45beSAndroid Build Coastguard Workertest_pmtu_vti4_udp_exception() {
1651*053f45beSAndroid Build Coastguard Worker	setup namespaces veth vti4 xfrm4udp || return $ksft_skip
1652*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" veth_a    "${ns_b}" veth_b \
1653*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" vti4_a    "${ns_b}" vti4_b
1654*053f45beSAndroid Build Coastguard Worker
1655*053f45beSAndroid Build Coastguard Worker	veth_mtu=1500
1656*053f45beSAndroid Build Coastguard Worker	vti_mtu=$((veth_mtu - 20))
1657*053f45beSAndroid Build Coastguard Worker
1658*053f45beSAndroid Build Coastguard Worker	#                                UDP   SPI   SN   IV  ICV   pad length   next header
1659*053f45beSAndroid Build Coastguard Worker	esp_payload_rfc4106=$((vti_mtu - 8   - 4   - 4  - 8 - 16  - 1          - 1))
1660*053f45beSAndroid Build Coastguard Worker	ping_payload=$((esp_payload_rfc4106 - 28))
1661*053f45beSAndroid Build Coastguard Worker
1662*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" veth_a ${veth_mtu}
1663*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" veth_b ${veth_mtu}
1664*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" vti4_a ${vti_mtu}
1665*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" vti4_b ${vti_mtu}
1666*053f45beSAndroid Build Coastguard Worker
1667*053f45beSAndroid Build Coastguard Worker	# Send DF packet without exceeding link layer MTU, check that no
1668*053f45beSAndroid Build Coastguard Worker	# exception is created
1669*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ping -q -M want -i 0.1 -w 1 -s ${ping_payload} ${tunnel4_b_addr}
1670*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel4_b_addr})"
1671*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "" "${pmtu}" "sending packet smaller than PMTU (IP payload length ${esp_payload_rfc4106})" || return 1
1672*053f45beSAndroid Build Coastguard Worker
1673*053f45beSAndroid Build Coastguard Worker	# Now exceed link layer MTU by one byte, check that exception is created
1674*053f45beSAndroid Build Coastguard Worker	# with the right PMTU value
1675*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ping -q -M want -i 0.1 -w 1 -s $((ping_payload + 1)) ${tunnel4_b_addr}
1676*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel4_b_addr})"
1677*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "${esp_payload_rfc4106}" "${pmtu}" "exceeding PMTU (IP payload length $((esp_payload_rfc4106 + 1)))"
1678*053f45beSAndroid Build Coastguard Worker}
1679*053f45beSAndroid Build Coastguard Worker
1680*053f45beSAndroid Build Coastguard Workertest_pmtu_vti6_udp_exception() {
1681*053f45beSAndroid Build Coastguard Worker	setup namespaces veth vti6 xfrm6udp || return $ksft_skip
1682*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" veth_a    "${ns_b}" veth_b \
1683*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" vti6_a    "${ns_b}" vti6_b
1684*053f45beSAndroid Build Coastguard Worker	fail=0
1685*053f45beSAndroid Build Coastguard Worker
1686*053f45beSAndroid Build Coastguard Worker	# Create route exception by exceeding link layer MTU
1687*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" veth_a 4000
1688*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" veth_b 4000
1689*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" vti6_a 5000
1690*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" vti6_b 5000
1691*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping6} -q -i 0.1 -w 1 -s 60000 ${tunnel6_b_addr}
1692*053f45beSAndroid Build Coastguard Worker
1693*053f45beSAndroid Build Coastguard Worker	# Check that exception was created
1694*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel6_b_addr})"
1695*053f45beSAndroid Build Coastguard Worker	check_pmtu_value any "${pmtu}" "creating tunnel exceeding link layer MTU" || return 1
1696*053f45beSAndroid Build Coastguard Worker
1697*053f45beSAndroid Build Coastguard Worker	# Decrease tunnel MTU, check for PMTU decrease in route exception
1698*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" vti6_a 3000
1699*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel6_b_addr})"
1700*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "3000" "${pmtu}" "decreasing tunnel MTU" || fail=1
1701*053f45beSAndroid Build Coastguard Worker
1702*053f45beSAndroid Build Coastguard Worker	# Increase tunnel MTU, check for PMTU increase in route exception
1703*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" vti6_a 9000
1704*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel6_b_addr})"
1705*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "9000" "${pmtu}" "increasing tunnel MTU" || fail=1
1706*053f45beSAndroid Build Coastguard Worker
1707*053f45beSAndroid Build Coastguard Worker	return ${fail}
1708*053f45beSAndroid Build Coastguard Worker}
1709*053f45beSAndroid Build Coastguard Worker
1710*053f45beSAndroid Build Coastguard Workertest_pmtu_vti4_udp_routed_exception() {
1711*053f45beSAndroid Build Coastguard Worker	setup namespaces routing vti4routed xfrm4udprouted || return $ksft_skip
1712*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" veth_A-R1    "${ns_b}" veth_B-R1 \
1713*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" vti4_a       "${ns_b}" vti4_b
1714*053f45beSAndroid Build Coastguard Worker
1715*053f45beSAndroid Build Coastguard Worker	veth_mtu=1500
1716*053f45beSAndroid Build Coastguard Worker	vti_mtu=$((veth_mtu - 20))
1717*053f45beSAndroid Build Coastguard Worker
1718*053f45beSAndroid Build Coastguard Worker	#                                UDP   SPI   SN   IV  ICV   pad length   next header
1719*053f45beSAndroid Build Coastguard Worker	esp_payload_rfc4106=$((vti_mtu - 8   - 4   - 4  - 8 - 16  - 1          - 1))
1720*053f45beSAndroid Build Coastguard Worker	ping_payload=$((esp_payload_rfc4106 - 28))
1721*053f45beSAndroid Build Coastguard Worker
1722*053f45beSAndroid Build Coastguard Worker        mtu "${ns_a}"  veth_A-R1 ${veth_mtu}
1723*053f45beSAndroid Build Coastguard Worker        mtu "${ns_r1}" veth_R1-A ${veth_mtu}
1724*053f45beSAndroid Build Coastguard Worker        mtu "${ns_b}"  veth_B-R1 ${veth_mtu}
1725*053f45beSAndroid Build Coastguard Worker        mtu "${ns_r1}" veth_R1-B ${veth_mtu}
1726*053f45beSAndroid Build Coastguard Worker
1727*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" vti4_a ${vti_mtu}
1728*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" vti4_b ${vti_mtu}
1729*053f45beSAndroid Build Coastguard Worker
1730*053f45beSAndroid Build Coastguard Worker	# Send DF packet without exceeding link layer MTU, check that no
1731*053f45beSAndroid Build Coastguard Worker	# exception is created
1732*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ping -q -M want -i 0.1 -w 1 -s ${ping_payload} ${tunnel4_b_addr}
1733*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel4_b_addr})"
1734*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "" "${pmtu}" "sending packet smaller than PMTU (IP payload length ${esp_payload_rfc4106})" || return 1
1735*053f45beSAndroid Build Coastguard Worker
1736*053f45beSAndroid Build Coastguard Worker	# Now decrease link layer MTU by 8 bytes on R1, check that exception is created
1737*053f45beSAndroid Build Coastguard Worker	# with the right PMTU value
1738*053f45beSAndroid Build Coastguard Worker        mtu "${ns_r1}" veth_R1-B $((veth_mtu - 8))
1739*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ping -q -M want -i 0.1 -w 1 -s $((ping_payload)) ${tunnel4_b_addr}
1740*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel4_b_addr})"
1741*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "$((esp_payload_rfc4106 - 8))" "${pmtu}" "exceeding PMTU (IP payload length $((esp_payload_rfc4106)))"
1742*053f45beSAndroid Build Coastguard Worker}
1743*053f45beSAndroid Build Coastguard Worker
1744*053f45beSAndroid Build Coastguard Workertest_pmtu_vti6_udp_routed_exception() {
1745*053f45beSAndroid Build Coastguard Worker	setup namespaces routing vti6routed xfrm6udprouted || return $ksft_skip
1746*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" veth_A-R1    "${ns_b}" veth_B-R1 \
1747*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" vti6_a       "${ns_b}" vti6_b
1748*053f45beSAndroid Build Coastguard Worker
1749*053f45beSAndroid Build Coastguard Worker	veth_mtu=1500
1750*053f45beSAndroid Build Coastguard Worker	vti_mtu=$((veth_mtu - 40))
1751*053f45beSAndroid Build Coastguard Worker
1752*053f45beSAndroid Build Coastguard Worker	#                                UDP   SPI   SN   IV  ICV   pad length   next header
1753*053f45beSAndroid Build Coastguard Worker	esp_payload_rfc4106=$((vti_mtu - 8   - 4   - 4  - 8 - 16  - 1          - 1))
1754*053f45beSAndroid Build Coastguard Worker	ping_payload=$((esp_payload_rfc4106 - 48))
1755*053f45beSAndroid Build Coastguard Worker
1756*053f45beSAndroid Build Coastguard Worker        mtu "${ns_a}"  veth_A-R1 ${veth_mtu}
1757*053f45beSAndroid Build Coastguard Worker        mtu "${ns_r1}" veth_R1-A ${veth_mtu}
1758*053f45beSAndroid Build Coastguard Worker        mtu "${ns_b}"  veth_B-R1 ${veth_mtu}
1759*053f45beSAndroid Build Coastguard Worker        mtu "${ns_r1}" veth_R1-B ${veth_mtu}
1760*053f45beSAndroid Build Coastguard Worker
1761*053f45beSAndroid Build Coastguard Worker	# mtu "${ns_a}" vti6_a ${vti_mtu}
1762*053f45beSAndroid Build Coastguard Worker	# mtu "${ns_b}" vti6_b ${vti_mtu}
1763*053f45beSAndroid Build Coastguard Worker
1764*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping6} -q -M want -i 0.1 -w 1 -s ${ping_payload} ${tunnel6_b_addr}
1765*053f45beSAndroid Build Coastguard Worker
1766*053f45beSAndroid Build Coastguard Worker	# Check that exception was not created
1767*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel6_b_addr})"
1768*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "" "${pmtu}" "sending packet smaller than PMTU (IP payload length ${esp_payload_rfc4106})" || return 1
1769*053f45beSAndroid Build Coastguard Worker
1770*053f45beSAndroid Build Coastguard Worker	# Now decrease link layer MTU by 8 bytes on R1, check that exception is created
1771*053f45beSAndroid Build Coastguard Worker	# with the right PMTU value
1772*053f45beSAndroid Build Coastguard Worker        mtu "${ns_r1}" veth_R1-B $((veth_mtu - 8))
1773*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping6} -q -M want -i 0.1 -w 1 -s $((ping_payload)) ${tunnel6_b_addr}
1774*053f45beSAndroid Build Coastguard Worker	pmtu="$(route_get_dst_pmtu_from_exception "${ns_a}" ${tunnel6_b_addr})"
1775*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "$((esp_payload_rfc4106 - 8))" "${pmtu}" "exceeding PMTU (IP payload length $((esp_payload_rfc4106)))"
1776*053f45beSAndroid Build Coastguard Worker
1777*053f45beSAndroid Build Coastguard Worker}
1778*053f45beSAndroid Build Coastguard Worker
1779*053f45beSAndroid Build Coastguard Workertest_pmtu_vti4_default_mtu() {
1780*053f45beSAndroid Build Coastguard Worker	setup namespaces veth vti4 || return $ksft_skip
1781*053f45beSAndroid Build Coastguard Worker
1782*053f45beSAndroid Build Coastguard Worker	# Check that MTU of vti device is MTU of veth minus IPv4 header length
1783*053f45beSAndroid Build Coastguard Worker	veth_mtu="$(link_get_mtu "${ns_a}" veth_a)"
1784*053f45beSAndroid Build Coastguard Worker	vti4_mtu="$(link_get_mtu "${ns_a}" vti4_a)"
1785*053f45beSAndroid Build Coastguard Worker	if [ $((veth_mtu - vti4_mtu)) -ne 20 ]; then
1786*053f45beSAndroid Build Coastguard Worker		err "  vti MTU ${vti4_mtu} is not veth MTU ${veth_mtu} minus IPv4 header length"
1787*053f45beSAndroid Build Coastguard Worker		return 1
1788*053f45beSAndroid Build Coastguard Worker	fi
1789*053f45beSAndroid Build Coastguard Worker}
1790*053f45beSAndroid Build Coastguard Worker
1791*053f45beSAndroid Build Coastguard Workertest_pmtu_vti6_default_mtu() {
1792*053f45beSAndroid Build Coastguard Worker	setup namespaces veth vti6 || return $ksft_skip
1793*053f45beSAndroid Build Coastguard Worker
1794*053f45beSAndroid Build Coastguard Worker	# Check that MTU of vti device is MTU of veth minus IPv6 header length
1795*053f45beSAndroid Build Coastguard Worker	veth_mtu="$(link_get_mtu "${ns_a}" veth_a)"
1796*053f45beSAndroid Build Coastguard Worker	vti6_mtu="$(link_get_mtu "${ns_a}" vti6_a)"
1797*053f45beSAndroid Build Coastguard Worker	if [ $((veth_mtu - vti6_mtu)) -ne 40 ]; then
1798*053f45beSAndroid Build Coastguard Worker		err "  vti MTU ${vti6_mtu} is not veth MTU ${veth_mtu} minus IPv6 header length"
1799*053f45beSAndroid Build Coastguard Worker		return 1
1800*053f45beSAndroid Build Coastguard Worker	fi
1801*053f45beSAndroid Build Coastguard Worker}
1802*053f45beSAndroid Build Coastguard Worker
1803*053f45beSAndroid Build Coastguard Workertest_pmtu_vti4_link_add_mtu() {
1804*053f45beSAndroid Build Coastguard Worker	setup namespaces || return $ksft_skip
1805*053f45beSAndroid Build Coastguard Worker
1806*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add vti4_a type vti local ${veth4_a_addr} remote ${veth4_b_addr} key 10
1807*053f45beSAndroid Build Coastguard Worker	[ $? -ne 0 ] && err "  vti not supported" && return $ksft_skip
1808*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link del vti4_a
1809*053f45beSAndroid Build Coastguard Worker
1810*053f45beSAndroid Build Coastguard Worker	fail=0
1811*053f45beSAndroid Build Coastguard Worker
1812*053f45beSAndroid Build Coastguard Worker	min=68
1813*053f45beSAndroid Build Coastguard Worker	max=$((65535 - 20))
1814*053f45beSAndroid Build Coastguard Worker	# Check invalid values first
1815*053f45beSAndroid Build Coastguard Worker	for v in $((min - 1)) $((max + 1)); do
1816*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip link add vti4_a mtu ${v} type vti local ${veth4_a_addr} remote ${veth4_b_addr} key 10
1817*053f45beSAndroid Build Coastguard Worker		# This can fail, or MTU can be adjusted to a proper value
1818*053f45beSAndroid Build Coastguard Worker		[ $? -ne 0 ] && continue
1819*053f45beSAndroid Build Coastguard Worker		mtu="$(link_get_mtu "${ns_a}" vti4_a)"
1820*053f45beSAndroid Build Coastguard Worker		if [ ${mtu} -lt ${min} -o ${mtu} -gt ${max} ]; then
1821*053f45beSAndroid Build Coastguard Worker			err "  vti tunnel created with invalid MTU ${mtu}"
1822*053f45beSAndroid Build Coastguard Worker			fail=1
1823*053f45beSAndroid Build Coastguard Worker		fi
1824*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip link del vti4_a
1825*053f45beSAndroid Build Coastguard Worker	done
1826*053f45beSAndroid Build Coastguard Worker
1827*053f45beSAndroid Build Coastguard Worker	# Now check valid values
1828*053f45beSAndroid Build Coastguard Worker	for v in ${min} 1300 ${max}; do
1829*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip link add vti4_a mtu ${v} type vti local ${veth4_a_addr} remote ${veth4_b_addr} key 10
1830*053f45beSAndroid Build Coastguard Worker		mtu="$(link_get_mtu "${ns_a}" vti4_a)"
1831*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip link del vti4_a
1832*053f45beSAndroid Build Coastguard Worker		if [ "${mtu}" != "${v}" ]; then
1833*053f45beSAndroid Build Coastguard Worker			err "  vti MTU ${mtu} doesn't match configured value ${v}"
1834*053f45beSAndroid Build Coastguard Worker			fail=1
1835*053f45beSAndroid Build Coastguard Worker		fi
1836*053f45beSAndroid Build Coastguard Worker	done
1837*053f45beSAndroid Build Coastguard Worker
1838*053f45beSAndroid Build Coastguard Worker	return ${fail}
1839*053f45beSAndroid Build Coastguard Worker}
1840*053f45beSAndroid Build Coastguard Worker
1841*053f45beSAndroid Build Coastguard Workertest_pmtu_vti6_link_add_mtu() {
1842*053f45beSAndroid Build Coastguard Worker	setup namespaces || return $ksft_skip
1843*053f45beSAndroid Build Coastguard Worker
1844*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add vti6_a type vti6 local ${veth6_a_addr} remote ${veth6_b_addr} key 10
1845*053f45beSAndroid Build Coastguard Worker	[ $? -ne 0 ] && err "  vti6 not supported" && return $ksft_skip
1846*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link del vti6_a
1847*053f45beSAndroid Build Coastguard Worker
1848*053f45beSAndroid Build Coastguard Worker	fail=0
1849*053f45beSAndroid Build Coastguard Worker
1850*053f45beSAndroid Build Coastguard Worker	min=68			# vti6 can carry IPv4 packets too
1851*053f45beSAndroid Build Coastguard Worker	max=$((65535 - 40))
1852*053f45beSAndroid Build Coastguard Worker	# Check invalid values first
1853*053f45beSAndroid Build Coastguard Worker	for v in $((min - 1)) $((max + 1)); do
1854*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip link add vti6_a mtu ${v} type vti6 local ${veth6_a_addr} remote ${veth6_b_addr} key 10
1855*053f45beSAndroid Build Coastguard Worker		# This can fail, or MTU can be adjusted to a proper value
1856*053f45beSAndroid Build Coastguard Worker		[ $? -ne 0 ] && continue
1857*053f45beSAndroid Build Coastguard Worker		mtu="$(link_get_mtu "${ns_a}" vti6_a)"
1858*053f45beSAndroid Build Coastguard Worker		if [ ${mtu} -lt ${min} -o ${mtu} -gt ${max} ]; then
1859*053f45beSAndroid Build Coastguard Worker			err "  vti6 tunnel created with invalid MTU ${v}"
1860*053f45beSAndroid Build Coastguard Worker			fail=1
1861*053f45beSAndroid Build Coastguard Worker		fi
1862*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip link del vti6_a
1863*053f45beSAndroid Build Coastguard Worker	done
1864*053f45beSAndroid Build Coastguard Worker
1865*053f45beSAndroid Build Coastguard Worker	# Now check valid values
1866*053f45beSAndroid Build Coastguard Worker	for v in 68 1280 1300 $((65535 - 40)); do
1867*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip link add vti6_a mtu ${v} type vti6 local ${veth6_a_addr} remote ${veth6_b_addr} key 10
1868*053f45beSAndroid Build Coastguard Worker		mtu="$(link_get_mtu "${ns_a}" vti6_a)"
1869*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ip link del vti6_a
1870*053f45beSAndroid Build Coastguard Worker		if [ "${mtu}" != "${v}" ]; then
1871*053f45beSAndroid Build Coastguard Worker			err "  vti6 MTU ${mtu} doesn't match configured value ${v}"
1872*053f45beSAndroid Build Coastguard Worker			fail=1
1873*053f45beSAndroid Build Coastguard Worker		fi
1874*053f45beSAndroid Build Coastguard Worker	done
1875*053f45beSAndroid Build Coastguard Worker
1876*053f45beSAndroid Build Coastguard Worker	return ${fail}
1877*053f45beSAndroid Build Coastguard Worker}
1878*053f45beSAndroid Build Coastguard Worker
1879*053f45beSAndroid Build Coastguard Workertest_pmtu_vti6_link_change_mtu() {
1880*053f45beSAndroid Build Coastguard Worker	setup namespaces || return $ksft_skip
1881*053f45beSAndroid Build Coastguard Worker
1882*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add dummy0 mtu 1500 type dummy
1883*053f45beSAndroid Build Coastguard Worker	[ $? -ne 0 ] && err "  dummy not supported" && return $ksft_skip
1884*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add dummy1 mtu 3000 type dummy
1885*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set dummy0 up
1886*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set dummy1 up
1887*053f45beSAndroid Build Coastguard Worker
1888*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip addr add ${dummy6_0_prefix}1/${dummy6_mask} dev dummy0
1889*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip addr add ${dummy6_1_prefix}1/${dummy6_mask} dev dummy1
1890*053f45beSAndroid Build Coastguard Worker
1891*053f45beSAndroid Build Coastguard Worker	fail=0
1892*053f45beSAndroid Build Coastguard Worker
1893*053f45beSAndroid Build Coastguard Worker	# Create vti6 interface bound to device, passing MTU, check it
1894*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link add vti6_a mtu 1300 type vti6 remote ${dummy6_0_prefix}2 local ${dummy6_0_prefix}1
1895*053f45beSAndroid Build Coastguard Worker	mtu="$(link_get_mtu "${ns_a}" vti6_a)"
1896*053f45beSAndroid Build Coastguard Worker	if [ ${mtu} -ne 1300 ]; then
1897*053f45beSAndroid Build Coastguard Worker		err "  vti6 MTU ${mtu} doesn't match configured value 1300"
1898*053f45beSAndroid Build Coastguard Worker		fail=1
1899*053f45beSAndroid Build Coastguard Worker	fi
1900*053f45beSAndroid Build Coastguard Worker
1901*053f45beSAndroid Build Coastguard Worker	# Move to another device with different MTU, without passing MTU, check
1902*053f45beSAndroid Build Coastguard Worker	# MTU is adjusted
1903*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set vti6_a type vti6 remote ${dummy6_1_prefix}2 local ${dummy6_1_prefix}1
1904*053f45beSAndroid Build Coastguard Worker	mtu="$(link_get_mtu "${ns_a}" vti6_a)"
1905*053f45beSAndroid Build Coastguard Worker	if [ ${mtu} -ne $((3000 - 40)) ]; then
1906*053f45beSAndroid Build Coastguard Worker		err "  vti MTU ${mtu} is not dummy MTU 3000 minus IPv6 header length"
1907*053f45beSAndroid Build Coastguard Worker		fail=1
1908*053f45beSAndroid Build Coastguard Worker	fi
1909*053f45beSAndroid Build Coastguard Worker
1910*053f45beSAndroid Build Coastguard Worker	# Move it back, passing MTU, check MTU is not overridden
1911*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link set vti6_a mtu 1280 type vti6 remote ${dummy6_0_prefix}2 local ${dummy6_0_prefix}1
1912*053f45beSAndroid Build Coastguard Worker	mtu="$(link_get_mtu "${ns_a}" vti6_a)"
1913*053f45beSAndroid Build Coastguard Worker	if [ ${mtu} -ne 1280 ]; then
1914*053f45beSAndroid Build Coastguard Worker		err "  vti6 MTU ${mtu} doesn't match configured value 1280"
1915*053f45beSAndroid Build Coastguard Worker		fail=1
1916*053f45beSAndroid Build Coastguard Worker	fi
1917*053f45beSAndroid Build Coastguard Worker
1918*053f45beSAndroid Build Coastguard Worker	return ${fail}
1919*053f45beSAndroid Build Coastguard Worker}
1920*053f45beSAndroid Build Coastguard Worker
1921*053f45beSAndroid Build Coastguard Workercheck_command() {
1922*053f45beSAndroid Build Coastguard Worker	cmd=${1}
1923*053f45beSAndroid Build Coastguard Worker
1924*053f45beSAndroid Build Coastguard Worker	if ! which ${cmd} > /dev/null 2>&1; then
1925*053f45beSAndroid Build Coastguard Worker		err "  missing required command: '${cmd}'"
1926*053f45beSAndroid Build Coastguard Worker		return 1
1927*053f45beSAndroid Build Coastguard Worker	fi
1928*053f45beSAndroid Build Coastguard Worker	return 0
1929*053f45beSAndroid Build Coastguard Worker}
1930*053f45beSAndroid Build Coastguard Worker
1931*053f45beSAndroid Build Coastguard Workertest_cleanup_vxlanX_exception() {
1932*053f45beSAndroid Build Coastguard Worker	outer="${1}"
1933*053f45beSAndroid Build Coastguard Worker	encap="vxlan"
1934*053f45beSAndroid Build Coastguard Worker	ll_mtu=4000
1935*053f45beSAndroid Build Coastguard Worker
1936*053f45beSAndroid Build Coastguard Worker	check_command taskset || return $ksft_skip
1937*053f45beSAndroid Build Coastguard Worker	cpu_list=$(grep -m 2 processor /proc/cpuinfo | cut -d ' ' -f 2)
1938*053f45beSAndroid Build Coastguard Worker
1939*053f45beSAndroid Build Coastguard Worker	setup namespaces routing ${encap}${outer} || return $ksft_skip
1940*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}" ${encap}_a   "${ns_b}"  ${encap}_b \
1941*053f45beSAndroid Build Coastguard Worker	      "${ns_a}" veth_A-R1    "${ns_r1}" veth_R1-A \
1942*053f45beSAndroid Build Coastguard Worker	      "${ns_b}" veth_B-R1    "${ns_r1}" veth_R1-B
1943*053f45beSAndroid Build Coastguard Worker
1944*053f45beSAndroid Build Coastguard Worker	# Create route exception by exceeding link layer MTU
1945*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 $((${ll_mtu} + 1000))
1946*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A $((${ll_mtu} + 1000))
1947*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 ${ll_mtu}
1948*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B ${ll_mtu}
1949*053f45beSAndroid Build Coastguard Worker
1950*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}" ${encap}_a $((${ll_mtu} + 1000))
1951*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}" ${encap}_b $((${ll_mtu} + 1000))
1952*053f45beSAndroid Build Coastguard Worker
1953*053f45beSAndroid Build Coastguard Worker	# Fill exception cache for multiple CPUs (2)
1954*053f45beSAndroid Build Coastguard Worker	# we can always use inner IPv4 for that
1955*053f45beSAndroid Build Coastguard Worker	for cpu in ${cpu_list}; do
1956*053f45beSAndroid Build Coastguard Worker		run_cmd taskset --cpu-list ${cpu} ${ns_a} ping -q -M want -i 0.1 -w 1 -s $((${ll_mtu} + 500)) ${tunnel4_b_addr}
1957*053f45beSAndroid Build Coastguard Worker	done
1958*053f45beSAndroid Build Coastguard Worker
1959*053f45beSAndroid Build Coastguard Worker	${ns_a} ip link del dev veth_A-R1 &
1960*053f45beSAndroid Build Coastguard Worker	iplink_pid=$!
1961*053f45beSAndroid Build Coastguard Worker	sleep 1
1962*053f45beSAndroid Build Coastguard Worker	if [ "$(cat /proc/${iplink_pid}/cmdline 2>/dev/null | tr -d '\0')" = "iplinkdeldevveth_A-R1" ]; then
1963*053f45beSAndroid Build Coastguard Worker		err "  can't delete veth device in a timely manner, PMTU dst likely leaked"
1964*053f45beSAndroid Build Coastguard Worker		return 1
1965*053f45beSAndroid Build Coastguard Worker	fi
1966*053f45beSAndroid Build Coastguard Worker}
1967*053f45beSAndroid Build Coastguard Worker
1968*053f45beSAndroid Build Coastguard Workertest_cleanup_ipv6_exception() {
1969*053f45beSAndroid Build Coastguard Worker	test_cleanup_vxlanX_exception 6
1970*053f45beSAndroid Build Coastguard Worker}
1971*053f45beSAndroid Build Coastguard Worker
1972*053f45beSAndroid Build Coastguard Workertest_cleanup_ipv4_exception() {
1973*053f45beSAndroid Build Coastguard Worker	test_cleanup_vxlanX_exception 4
1974*053f45beSAndroid Build Coastguard Worker}
1975*053f45beSAndroid Build Coastguard Worker
1976*053f45beSAndroid Build Coastguard Workerrun_test() {
1977*053f45beSAndroid Build Coastguard Worker	(
1978*053f45beSAndroid Build Coastguard Worker	tname="$1"
1979*053f45beSAndroid Build Coastguard Worker	tdesc="$2"
1980*053f45beSAndroid Build Coastguard Worker
1981*053f45beSAndroid Build Coastguard Worker	unset IFS
1982*053f45beSAndroid Build Coastguard Worker
1983*053f45beSAndroid Build Coastguard Worker	# Since cleanup() relies on variables modified by this subshell, it
1984*053f45beSAndroid Build Coastguard Worker	# has to run in this context.
1985*053f45beSAndroid Build Coastguard Worker	trap cleanup EXIT
1986*053f45beSAndroid Build Coastguard Worker
1987*053f45beSAndroid Build Coastguard Worker	if [ "$VERBOSE" = "1" ]; then
1988*053f45beSAndroid Build Coastguard Worker		printf "\n##########################################################################\n\n"
1989*053f45beSAndroid Build Coastguard Worker	fi
1990*053f45beSAndroid Build Coastguard Worker
1991*053f45beSAndroid Build Coastguard Worker	eval test_${tname}
1992*053f45beSAndroid Build Coastguard Worker	ret=$?
1993*053f45beSAndroid Build Coastguard Worker
1994*053f45beSAndroid Build Coastguard Worker	if [ $ret -eq 0 ]; then
1995*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [ OK ]\n" "${tdesc}"
1996*053f45beSAndroid Build Coastguard Worker	elif [ $ret -eq 1 ]; then
1997*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [FAIL]\n" "${tdesc}"
1998*053f45beSAndroid Build Coastguard Worker		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
1999*053f45beSAndroid Build Coastguard Worker			echo
2000*053f45beSAndroid Build Coastguard Worker			echo "Pausing. Hit enter to continue"
2001*053f45beSAndroid Build Coastguard Worker			read a
2002*053f45beSAndroid Build Coastguard Worker		fi
2003*053f45beSAndroid Build Coastguard Worker		err_flush
2004*053f45beSAndroid Build Coastguard Worker		exit 1
2005*053f45beSAndroid Build Coastguard Worker	elif [ $ret -eq $ksft_skip ]; then
2006*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [SKIP]\n" "${tdesc}"
2007*053f45beSAndroid Build Coastguard Worker		err_flush
2008*053f45beSAndroid Build Coastguard Worker	fi
2009*053f45beSAndroid Build Coastguard Worker
2010*053f45beSAndroid Build Coastguard Worker	return $ret
2011*053f45beSAndroid Build Coastguard Worker	)
2012*053f45beSAndroid Build Coastguard Worker	ret=$?
2013*053f45beSAndroid Build Coastguard Worker	case $ret in
2014*053f45beSAndroid Build Coastguard Worker		0)
2015*053f45beSAndroid Build Coastguard Worker			all_skipped=false
2016*053f45beSAndroid Build Coastguard Worker			[ $exitcode=$ksft_skip ] && exitcode=0
2017*053f45beSAndroid Build Coastguard Worker		;;
2018*053f45beSAndroid Build Coastguard Worker		$ksft_skip)
2019*053f45beSAndroid Build Coastguard Worker			[ $all_skipped = true ] && exitcode=$ksft_skip
2020*053f45beSAndroid Build Coastguard Worker		;;
2021*053f45beSAndroid Build Coastguard Worker		*)
2022*053f45beSAndroid Build Coastguard Worker			all_skipped=false
2023*053f45beSAndroid Build Coastguard Worker			exitcode=1
2024*053f45beSAndroid Build Coastguard Worker		;;
2025*053f45beSAndroid Build Coastguard Worker	esac
2026*053f45beSAndroid Build Coastguard Worker
2027*053f45beSAndroid Build Coastguard Worker	return $ret
2028*053f45beSAndroid Build Coastguard Worker}
2029*053f45beSAndroid Build Coastguard Worker
2030*053f45beSAndroid Build Coastguard Workerrun_test_nh() {
2031*053f45beSAndroid Build Coastguard Worker	tname="$1"
2032*053f45beSAndroid Build Coastguard Worker	tdesc="$2"
2033*053f45beSAndroid Build Coastguard Worker
2034*053f45beSAndroid Build Coastguard Worker	USE_NH=yes
2035*053f45beSAndroid Build Coastguard Worker	run_test "${tname}" "${tdesc} - nexthop objects"
2036*053f45beSAndroid Build Coastguard Worker	USE_NH=no
2037*053f45beSAndroid Build Coastguard Worker}
2038*053f45beSAndroid Build Coastguard Worker
2039*053f45beSAndroid Build Coastguard Workertest_list_flush_ipv4_exception() {
2040*053f45beSAndroid Build Coastguard Worker	setup namespaces routing || return $ksft_skip
2041*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}"  veth_A-R1    "${ns_r1}" veth_R1-A \
2042*053f45beSAndroid Build Coastguard Worker	      "${ns_r1}" veth_R1-B    "${ns_b}"  veth_B-R1 \
2043*053f45beSAndroid Build Coastguard Worker	      "${ns_a}"  veth_A-R2    "${ns_r2}" veth_R2-A \
2044*053f45beSAndroid Build Coastguard Worker	      "${ns_r2}" veth_R2-B    "${ns_b}"  veth_B-R2
2045*053f45beSAndroid Build Coastguard Worker
2046*053f45beSAndroid Build Coastguard Worker	dst_prefix1="${prefix4}.${b_r1}."
2047*053f45beSAndroid Build Coastguard Worker	dst2="${prefix4}.${b_r2}.1"
2048*053f45beSAndroid Build Coastguard Worker
2049*053f45beSAndroid Build Coastguard Worker	# Set up initial MTU values
2050*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 2000
2051*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A 2000
2052*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B 1500
2053*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 1500
2054*053f45beSAndroid Build Coastguard Worker
2055*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R2 2000
2056*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-A 2000
2057*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-B 1500
2058*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R2 1500
2059*053f45beSAndroid Build Coastguard Worker
2060*053f45beSAndroid Build Coastguard Worker	fail=0
2061*053f45beSAndroid Build Coastguard Worker
2062*053f45beSAndroid Build Coastguard Worker	# Add 100 addresses for veth endpoint on B reached by default A route
2063*053f45beSAndroid Build Coastguard Worker	for i in $(seq 100 199); do
2064*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_b} ip addr add "${dst_prefix1}${i}" dev veth_B-R1
2065*053f45beSAndroid Build Coastguard Worker	done
2066*053f45beSAndroid Build Coastguard Worker
2067*053f45beSAndroid Build Coastguard Worker	# Create 100 cached route exceptions for path via R1, one via R2. Note
2068*053f45beSAndroid Build Coastguard Worker	# that with IPv4 we need to actually cause a route lookup that matches
2069*053f45beSAndroid Build Coastguard Worker	# the exception caused by ICMP, in order to actually have a cached
2070*053f45beSAndroid Build Coastguard Worker	# route, so we need to ping each destination twice
2071*053f45beSAndroid Build Coastguard Worker	for i in $(seq 100 199); do
2072*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ping -q -M want -i 0.1 -c 2 -s 1800 "${dst_prefix1}${i}"
2073*053f45beSAndroid Build Coastguard Worker	done
2074*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ping -q -M want -i 0.1 -c 2 -s 1800 "${dst2}"
2075*053f45beSAndroid Build Coastguard Worker
2076*053f45beSAndroid Build Coastguard Worker	if [ "$(${ns_a} ip -oneline route list cache | wc -l)" -ne 101 ]; then
2077*053f45beSAndroid Build Coastguard Worker		err "  can't list cached exceptions"
2078*053f45beSAndroid Build Coastguard Worker		fail=1
2079*053f45beSAndroid Build Coastguard Worker	fi
2080*053f45beSAndroid Build Coastguard Worker
2081*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip route flush cache
2082*053f45beSAndroid Build Coastguard Worker	pmtu1="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst_prefix}1)"
2083*053f45beSAndroid Build Coastguard Worker	pmtu2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst_prefix}2)"
2084*053f45beSAndroid Build Coastguard Worker	if [ -n "${pmtu1}" ] || [ -n "${pmtu2}" ] || \
2085*053f45beSAndroid Build Coastguard Worker	   [ -n "$(${ns_a} ip route list cache)" ]; then
2086*053f45beSAndroid Build Coastguard Worker		err "  can't flush cached exceptions"
2087*053f45beSAndroid Build Coastguard Worker		fail=1
2088*053f45beSAndroid Build Coastguard Worker	fi
2089*053f45beSAndroid Build Coastguard Worker
2090*053f45beSAndroid Build Coastguard Worker	return ${fail}
2091*053f45beSAndroid Build Coastguard Worker}
2092*053f45beSAndroid Build Coastguard Worker
2093*053f45beSAndroid Build Coastguard Workertest_list_flush_ipv6_exception() {
2094*053f45beSAndroid Build Coastguard Worker	setup namespaces routing || return $ksft_skip
2095*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}"  veth_A-R1    "${ns_r1}" veth_R1-A \
2096*053f45beSAndroid Build Coastguard Worker	      "${ns_r1}" veth_R1-B    "${ns_b}"  veth_B-R1 \
2097*053f45beSAndroid Build Coastguard Worker	      "${ns_a}"  veth_A-R2    "${ns_r2}" veth_R2-A \
2098*053f45beSAndroid Build Coastguard Worker	      "${ns_r2}" veth_R2-B    "${ns_b}"  veth_B-R2
2099*053f45beSAndroid Build Coastguard Worker
2100*053f45beSAndroid Build Coastguard Worker	dst_prefix1="${prefix6}:${b_r1}::"
2101*053f45beSAndroid Build Coastguard Worker	dst2="${prefix6}:${b_r2}::1"
2102*053f45beSAndroid Build Coastguard Worker
2103*053f45beSAndroid Build Coastguard Worker	# Set up initial MTU values
2104*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 2000
2105*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A 2000
2106*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B 1500
2107*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 1500
2108*053f45beSAndroid Build Coastguard Worker
2109*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R2 2000
2110*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-A 2000
2111*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-B 1500
2112*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R2 1500
2113*053f45beSAndroid Build Coastguard Worker
2114*053f45beSAndroid Build Coastguard Worker	fail=0
2115*053f45beSAndroid Build Coastguard Worker
2116*053f45beSAndroid Build Coastguard Worker	# Add 100 addresses for veth endpoint on B reached by default A route
2117*053f45beSAndroid Build Coastguard Worker	for i in $(seq 100 199); do
2118*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_b} ip addr add "${dst_prefix1}${i}" dev veth_B-R1
2119*053f45beSAndroid Build Coastguard Worker	done
2120*053f45beSAndroid Build Coastguard Worker
2121*053f45beSAndroid Build Coastguard Worker	# Create 100 cached route exceptions for path via R1, one via R2
2122*053f45beSAndroid Build Coastguard Worker	for i in $(seq 100 199); do
2123*053f45beSAndroid Build Coastguard Worker		run_cmd ${ns_a} ping -q -M want -i 0.1 -w 1 -s 1800 "${dst_prefix1}${i}"
2124*053f45beSAndroid Build Coastguard Worker	done
2125*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ping -q -M want -i 0.1 -w 1 -s 1800 "${dst2}"
2126*053f45beSAndroid Build Coastguard Worker	if [ "$(${ns_a} ip -oneline -6 route list cache | wc -l)" -ne 101 ]; then
2127*053f45beSAndroid Build Coastguard Worker		err "  can't list cached exceptions"
2128*053f45beSAndroid Build Coastguard Worker		fail=1
2129*053f45beSAndroid Build Coastguard Worker	fi
2130*053f45beSAndroid Build Coastguard Worker
2131*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip -6 route flush cache
2132*053f45beSAndroid Build Coastguard Worker	pmtu1="$(route_get_dst_pmtu_from_exception "${ns_a}" "${dst_prefix1}100")"
2133*053f45beSAndroid Build Coastguard Worker	pmtu2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2})"
2134*053f45beSAndroid Build Coastguard Worker	if [ -n "${pmtu1}" ] || [ -n "${pmtu2}" ] || \
2135*053f45beSAndroid Build Coastguard Worker	   [ -n "$(${ns_a} ip -6 route list cache)" ]; then
2136*053f45beSAndroid Build Coastguard Worker		err "  can't flush cached exceptions"
2137*053f45beSAndroid Build Coastguard Worker		fail=1
2138*053f45beSAndroid Build Coastguard Worker	fi
2139*053f45beSAndroid Build Coastguard Worker
2140*053f45beSAndroid Build Coastguard Worker	return ${fail}
2141*053f45beSAndroid Build Coastguard Worker}
2142*053f45beSAndroid Build Coastguard Worker
2143*053f45beSAndroid Build Coastguard Workertest_pmtu_ipvX_route_change() {
2144*053f45beSAndroid Build Coastguard Worker	family=${1}
2145*053f45beSAndroid Build Coastguard Worker
2146*053f45beSAndroid Build Coastguard Worker	setup namespaces routing || return 2
2147*053f45beSAndroid Build Coastguard Worker	trace "${ns_a}"  veth_A-R1    "${ns_r1}" veth_R1-A \
2148*053f45beSAndroid Build Coastguard Worker	      "${ns_r1}" veth_R1-B    "${ns_b}"  veth_B-R1 \
2149*053f45beSAndroid Build Coastguard Worker	      "${ns_a}"  veth_A-R2    "${ns_r2}" veth_R2-A \
2150*053f45beSAndroid Build Coastguard Worker	      "${ns_r2}" veth_R2-B    "${ns_b}"  veth_B-R2
2151*053f45beSAndroid Build Coastguard Worker
2152*053f45beSAndroid Build Coastguard Worker	if [ ${family} -eq 4 ]; then
2153*053f45beSAndroid Build Coastguard Worker		ping=ping
2154*053f45beSAndroid Build Coastguard Worker		dst1="${prefix4}.${b_r1}.1"
2155*053f45beSAndroid Build Coastguard Worker		dst2="${prefix4}.${b_r2}.1"
2156*053f45beSAndroid Build Coastguard Worker		gw="${prefix4}.${a_r1}.2"
2157*053f45beSAndroid Build Coastguard Worker	else
2158*053f45beSAndroid Build Coastguard Worker		ping=${ping6}
2159*053f45beSAndroid Build Coastguard Worker		dst1="${prefix6}:${b_r1}::1"
2160*053f45beSAndroid Build Coastguard Worker		dst2="${prefix6}:${b_r2}::1"
2161*053f45beSAndroid Build Coastguard Worker		gw="${prefix6}:${a_r1}::2"
2162*053f45beSAndroid Build Coastguard Worker	fi
2163*053f45beSAndroid Build Coastguard Worker
2164*053f45beSAndroid Build Coastguard Worker	# Set up initial MTU values
2165*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R1 2000
2166*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-A 2000
2167*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r1}" veth_R1-B 1400
2168*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R1 1400
2169*053f45beSAndroid Build Coastguard Worker
2170*053f45beSAndroid Build Coastguard Worker	mtu "${ns_a}"  veth_A-R2 2000
2171*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-A 2000
2172*053f45beSAndroid Build Coastguard Worker	mtu "${ns_r2}" veth_R2-B 1500
2173*053f45beSAndroid Build Coastguard Worker	mtu "${ns_b}"  veth_B-R2 1500
2174*053f45beSAndroid Build Coastguard Worker
2175*053f45beSAndroid Build Coastguard Worker	# Create route exceptions
2176*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1 -s 1800 ${dst1}
2177*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ${ping} -q -M want -i 0.1 -w 1 -s 1800 ${dst2}
2178*053f45beSAndroid Build Coastguard Worker
2179*053f45beSAndroid Build Coastguard Worker	# Check that exceptions have been created with the correct PMTU
2180*053f45beSAndroid Build Coastguard Worker	pmtu_1="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst1})"
2181*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1400" "${pmtu_1}" "exceeding MTU" || return 1
2182*053f45beSAndroid Build Coastguard Worker	pmtu_2="$(route_get_dst_pmtu_from_exception "${ns_a}" ${dst2})"
2183*053f45beSAndroid Build Coastguard Worker	check_pmtu_value "1500" "${pmtu_2}" "exceeding MTU" || return 1
2184*053f45beSAndroid Build Coastguard Worker
2185*053f45beSAndroid Build Coastguard Worker	# Replace the route from A to R1
2186*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip route change default via ${gw}
2187*053f45beSAndroid Build Coastguard Worker
2188*053f45beSAndroid Build Coastguard Worker	# Delete the device in A
2189*053f45beSAndroid Build Coastguard Worker	run_cmd ${ns_a} ip link del "veth_A-R1"
2190*053f45beSAndroid Build Coastguard Worker}
2191*053f45beSAndroid Build Coastguard Worker
2192*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv4_route_change() {
2193*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_route_change 4
2194*053f45beSAndroid Build Coastguard Worker}
2195*053f45beSAndroid Build Coastguard Worker
2196*053f45beSAndroid Build Coastguard Workertest_pmtu_ipv6_route_change() {
2197*053f45beSAndroid Build Coastguard Worker	test_pmtu_ipvX_route_change 6
2198*053f45beSAndroid Build Coastguard Worker}
2199*053f45beSAndroid Build Coastguard Worker
2200*053f45beSAndroid Build Coastguard Workerusage() {
2201*053f45beSAndroid Build Coastguard Worker	echo
2202*053f45beSAndroid Build Coastguard Worker	echo "$0 [OPTIONS] [TEST]..."
2203*053f45beSAndroid Build Coastguard Worker	echo "If no TEST argument is given, all tests will be run."
2204*053f45beSAndroid Build Coastguard Worker	echo
2205*053f45beSAndroid Build Coastguard Worker	echo "Options"
2206*053f45beSAndroid Build Coastguard Worker	echo "  --trace: capture traffic to TEST_INTERFACE.pcap"
2207*053f45beSAndroid Build Coastguard Worker	echo
2208*053f45beSAndroid Build Coastguard Worker	echo "Available tests${tests}"
2209*053f45beSAndroid Build Coastguard Worker	exit 1
2210*053f45beSAndroid Build Coastguard Worker}
2211*053f45beSAndroid Build Coastguard Worker
2212*053f45beSAndroid Build Coastguard Worker################################################################################
2213*053f45beSAndroid Build Coastguard Worker#
2214*053f45beSAndroid Build Coastguard Workerexitcode=0
2215*053f45beSAndroid Build Coastguard Workerdesc=0
2216*053f45beSAndroid Build Coastguard Workerall_skipped=true
2217*053f45beSAndroid Build Coastguard Worker
2218*053f45beSAndroid Build Coastguard Workerwhile getopts :ptv o
2219*053f45beSAndroid Build Coastguard Workerdo
2220*053f45beSAndroid Build Coastguard Worker	case $o in
2221*053f45beSAndroid Build Coastguard Worker	p) PAUSE_ON_FAIL=yes;;
2222*053f45beSAndroid Build Coastguard Worker	v) VERBOSE=1;;
2223*053f45beSAndroid Build Coastguard Worker	t) if which tcpdump > /dev/null 2>&1; then
2224*053f45beSAndroid Build Coastguard Worker		TRACING=1
2225*053f45beSAndroid Build Coastguard Worker	   else
2226*053f45beSAndroid Build Coastguard Worker		echo "=== tcpdump not available, tracing disabled"
2227*053f45beSAndroid Build Coastguard Worker	   fi
2228*053f45beSAndroid Build Coastguard Worker	   ;;
2229*053f45beSAndroid Build Coastguard Worker	*) usage;;
2230*053f45beSAndroid Build Coastguard Worker	esac
2231*053f45beSAndroid Build Coastguard Workerdone
2232*053f45beSAndroid Build Coastguard Workershift $(($OPTIND-1))
2233*053f45beSAndroid Build Coastguard Worker
2234*053f45beSAndroid Build Coastguard WorkerIFS="
2235*053f45beSAndroid Build Coastguard Worker"
2236*053f45beSAndroid Build Coastguard Worker
2237*053f45beSAndroid Build Coastguard Workerfor arg do
2238*053f45beSAndroid Build Coastguard Worker	# Check first that all requested tests are available before running any
2239*053f45beSAndroid Build Coastguard Worker	command -v > /dev/null "test_${arg}" || { echo "=== Test ${arg} not found"; usage; }
2240*053f45beSAndroid Build Coastguard Workerdone
2241*053f45beSAndroid Build Coastguard Worker
2242*053f45beSAndroid Build Coastguard Workertrap cleanup EXIT
2243*053f45beSAndroid Build Coastguard Worker
2244*053f45beSAndroid Build Coastguard Worker# start clean
2245*053f45beSAndroid Build Coastguard Workercleanup
2246*053f45beSAndroid Build Coastguard Worker
2247*053f45beSAndroid Build Coastguard WorkerHAVE_NH=no
2248*053f45beSAndroid Build Coastguard Workerip nexthop ls >/dev/null 2>&1
2249*053f45beSAndroid Build Coastguard Worker[ $? -eq 0 ] && HAVE_NH=yes
2250*053f45beSAndroid Build Coastguard Worker
2251*053f45beSAndroid Build Coastguard Workername=""
2252*053f45beSAndroid Build Coastguard Workerdesc=""
2253*053f45beSAndroid Build Coastguard Workerrerun_nh=0
2254*053f45beSAndroid Build Coastguard Workerfor t in ${tests}; do
2255*053f45beSAndroid Build Coastguard Worker	[ "${name}" = "" ]	&& name="${t}"	&& continue
2256*053f45beSAndroid Build Coastguard Worker	[ "${desc}" = "" ]	&& desc="${t}"	&& continue
2257*053f45beSAndroid Build Coastguard Worker
2258*053f45beSAndroid Build Coastguard Worker	if [ "${HAVE_NH}" = "yes" ]; then
2259*053f45beSAndroid Build Coastguard Worker		rerun_nh="${t}"
2260*053f45beSAndroid Build Coastguard Worker	fi
2261*053f45beSAndroid Build Coastguard Worker
2262*053f45beSAndroid Build Coastguard Worker	run_this=1
2263*053f45beSAndroid Build Coastguard Worker	for arg do
2264*053f45beSAndroid Build Coastguard Worker		[ "${arg}" != "${arg#--*}" ] && continue
2265*053f45beSAndroid Build Coastguard Worker		[ "${arg}" = "${name}" ] && run_this=1 && break
2266*053f45beSAndroid Build Coastguard Worker		run_this=0
2267*053f45beSAndroid Build Coastguard Worker	done
2268*053f45beSAndroid Build Coastguard Worker	if [ $run_this -eq 1 ]; then
2269*053f45beSAndroid Build Coastguard Worker		run_test "${name}" "${desc}"
2270*053f45beSAndroid Build Coastguard Worker		# if test was skipped no need to retry with nexthop objects
2271*053f45beSAndroid Build Coastguard Worker		[ $? -eq $ksft_skip ] && rerun_nh=0
2272*053f45beSAndroid Build Coastguard Worker
2273*053f45beSAndroid Build Coastguard Worker		if [ "${rerun_nh}" = "1" ]; then
2274*053f45beSAndroid Build Coastguard Worker			run_test_nh "${name}" "${desc}"
2275*053f45beSAndroid Build Coastguard Worker		fi
2276*053f45beSAndroid Build Coastguard Worker	fi
2277*053f45beSAndroid Build Coastguard Worker	name=""
2278*053f45beSAndroid Build Coastguard Worker	desc=""
2279*053f45beSAndroid Build Coastguard Worker	rerun_nh=0
2280*053f45beSAndroid Build Coastguard Workerdone
2281*053f45beSAndroid Build Coastguard Worker
2282*053f45beSAndroid Build Coastguard Workerexit ${exitcode}
2283