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