xref: /linux/tools/testing/selftests/net/msg_zerocopy.sh (revision 8b87f67b4c87452e21721887fa8dec1f4c6b2b7c)
107b65c5bSWillem de Bruijn#!/bin/bash
207b65c5bSWillem de Bruijn#
307b65c5bSWillem de Bruijn# Send data between two processes across namespaces
407b65c5bSWillem de Bruijn# Run twice: once without and once with zerocopy
507b65c5bSWillem de Bruijn
607b65c5bSWillem de Bruijnset -e
707b65c5bSWillem de Bruijn
807b65c5bSWillem de Bruijnreadonly DEV="veth0"
9*81d572a5SWillem de Bruijnreadonly DUMMY_DEV="dummy0"
1007b65c5bSWillem de Bruijnreadonly DEV_MTU=65535
1107b65c5bSWillem de Bruijnreadonly BIN="./msg_zerocopy"
1207b65c5bSWillem de Bruijn
1307b65c5bSWillem de Bruijnreadonly RAND="$(mktemp -u XXXXXX)"
1407b65c5bSWillem de Bruijnreadonly NSPREFIX="ns-${RAND}"
1507b65c5bSWillem de Bruijnreadonly NS1="${NSPREFIX}1"
1607b65c5bSWillem de Bruijnreadonly NS2="${NSPREFIX}2"
1707b65c5bSWillem de Bruijn
18*81d572a5SWillem de Bruijnreadonly LPREFIX4='192.168.1'
19*81d572a5SWillem de Bruijnreadonly RPREFIX4='192.168.2'
20*81d572a5SWillem de Bruijnreadonly LPREFIX6='fd'
21*81d572a5SWillem de Bruijnreadonly RPREFIX6='fc'
22*81d572a5SWillem de Bruijn
2307b65c5bSWillem de Bruijn
2407b65c5bSWillem de Bruijnreadonly path_sysctl_mem="net.core.optmem_max"
2507b65c5bSWillem de Bruijn
26830669e6SWillem de Bruijn# No arguments: automated test
27830669e6SWillem de Bruijnif [[ "$#" -eq "0" ]]; then
28*81d572a5SWillem de Bruijn	ret=0
29*81d572a5SWillem de Bruijn
30*81d572a5SWillem de Bruijn	$0 4 tcp -t 1 || ret=1
31*81d572a5SWillem de Bruijn	$0 6 tcp -t 1 || ret=1
32*81d572a5SWillem de Bruijn	$0 4 udp -t 1 || ret=1
33*81d572a5SWillem de Bruijn	$0 6 udp -t 1 || ret=1
34*81d572a5SWillem de Bruijn
35*81d572a5SWillem de Bruijn	[[ "$ret" == "0" ]] && echo "OK. All tests passed"
36*81d572a5SWillem de Bruijn	exit $ret
37830669e6SWillem de Bruijnfi
38830669e6SWillem de Bruijn
3907b65c5bSWillem de Bruijn# Argument parsing
4007b65c5bSWillem de Bruijnif [[ "$#" -lt "2" ]]; then
4107b65c5bSWillem de Bruijn	echo "Usage: $0 [4|6] [tcp|udp|raw|raw_hdrincl|packet|packet_dgram] <args>"
4207b65c5bSWillem de Bruijn	exit 1
4307b65c5bSWillem de Bruijnfi
4407b65c5bSWillem de Bruijn
4507b65c5bSWillem de Bruijnreadonly IP="$1"
4607b65c5bSWillem de Bruijnshift
4707b65c5bSWillem de Bruijnreadonly TXMODE="$1"
4807b65c5bSWillem de Bruijnshift
4907b65c5bSWillem de Bruijnreadonly EXTRA_ARGS="$@"
5007b65c5bSWillem de Bruijn
5107b65c5bSWillem de Bruijn# Argument parsing: configure addresses
5207b65c5bSWillem de Bruijnif [[ "${IP}" == "4" ]]; then
53*81d572a5SWillem de Bruijn	readonly SADDR="${LPREFIX4}.1"
54*81d572a5SWillem de Bruijn	readonly DADDR="${LPREFIX4}.2"
55*81d572a5SWillem de Bruijn	readonly DUMMY_ADDR="${RPREFIX4}.1"
56*81d572a5SWillem de Bruijn	readonly DADDR_TXONLY="${RPREFIX4}.2"
57*81d572a5SWillem de Bruijn	readonly MASK="24"
5807b65c5bSWillem de Bruijnelif [[ "${IP}" == "6" ]]; then
59*81d572a5SWillem de Bruijn	readonly SADDR="${LPREFIX6}::1"
60*81d572a5SWillem de Bruijn	readonly DADDR="${LPREFIX6}::2"
61*81d572a5SWillem de Bruijn	readonly DUMMY_ADDR="${RPREFIX6}::1"
62*81d572a5SWillem de Bruijn	readonly DADDR_TXONLY="${RPREFIX6}::2"
63*81d572a5SWillem de Bruijn	readonly MASK="64"
64*81d572a5SWillem de Bruijn	readonly NODAD="nodad"
6507b65c5bSWillem de Bruijnelse
6607b65c5bSWillem de Bruijn	echo "Invalid IP version ${IP}"
6707b65c5bSWillem de Bruijn	exit 1
6807b65c5bSWillem de Bruijnfi
6907b65c5bSWillem de Bruijn
7007b65c5bSWillem de Bruijn# Argument parsing: select receive mode
7107b65c5bSWillem de Bruijn#
7207b65c5bSWillem de Bruijn# This differs from send mode for
7307b65c5bSWillem de Bruijn# - packet:	use raw recv, because packet receives skb clones
7407b65c5bSWillem de Bruijn# - raw_hdrinc: use raw recv, because hdrincl is a tx-only option
7507b65c5bSWillem de Bruijncase "${TXMODE}" in
7607b65c5bSWillem de Bruijn'packet' | 'packet_dgram' | 'raw_hdrincl')
7707b65c5bSWillem de Bruijn	RXMODE='raw'
7807b65c5bSWillem de Bruijn	;;
7907b65c5bSWillem de Bruijn*)
8007b65c5bSWillem de Bruijn	RXMODE="${TXMODE}"
8107b65c5bSWillem de Bruijn	;;
8207b65c5bSWillem de Bruijnesac
8307b65c5bSWillem de Bruijn
8407b65c5bSWillem de Bruijn# Start of state changes: install cleanup handler
8507b65c5bSWillem de Bruijn
8607b65c5bSWillem de Bruijncleanup() {
8707b65c5bSWillem de Bruijn	ip netns del "${NS2}"
8807b65c5bSWillem de Bruijn	ip netns del "${NS1}"
8907b65c5bSWillem de Bruijn}
9007b65c5bSWillem de Bruijn
9107b65c5bSWillem de Bruijntrap cleanup EXIT
9207b65c5bSWillem de Bruijn
9307b65c5bSWillem de Bruijn# Create virtual ethernet pair between network namespaces
9407b65c5bSWillem de Bruijnip netns add "${NS1}"
9507b65c5bSWillem de Bruijnip netns add "${NS2}"
9607b65c5bSWillem de Bruijn
9718872ba8SEric Dumazet# Configure system settings
9818872ba8SEric Dumazetip netns exec "${NS1}" sysctl -w -q "${path_sysctl_mem}=1000000"
9918872ba8SEric Dumazetip netns exec "${NS2}" sysctl -w -q "${path_sysctl_mem}=1000000"
10018872ba8SEric Dumazet
10107b65c5bSWillem de Bruijnip link add "${DEV}" mtu "${DEV_MTU}" netns "${NS1}" type veth \
10207b65c5bSWillem de Bruijn  peer name "${DEV}" mtu "${DEV_MTU}" netns "${NS2}"
10307b65c5bSWillem de Bruijn
104*81d572a5SWillem de Bruijnip link add "${DUMMY_DEV}" mtu "${DEV_MTU}" netns "${NS2}" type dummy
105*81d572a5SWillem de Bruijn
10607b65c5bSWillem de Bruijn# Bring the devices up
10707b65c5bSWillem de Bruijnip -netns "${NS1}" link set "${DEV}" up
10807b65c5bSWillem de Bruijnip -netns "${NS2}" link set "${DEV}" up
109*81d572a5SWillem de Bruijnip -netns "${NS2}" link set "${DUMMY_DEV}" up
11007b65c5bSWillem de Bruijn
11107b65c5bSWillem de Bruijn# Set fixed MAC addresses on the devices
11207b65c5bSWillem de Bruijnip -netns "${NS1}" link set dev "${DEV}" address 02:02:02:02:02:02
11307b65c5bSWillem de Bruijnip -netns "${NS2}" link set dev "${DEV}" address 06:06:06:06:06:06
11407b65c5bSWillem de Bruijn
11507b65c5bSWillem de Bruijn# Add fixed IP addresses to the devices
116*81d572a5SWillem de Bruijnip -netns "${NS1}" addr add "${SADDR}/${MASK}" dev "${DEV}" ${NODAD}
117*81d572a5SWillem de Bruijnip -netns "${NS2}" addr add "${DADDR}/${MASK}" dev "${DEV}" ${NODAD}
118*81d572a5SWillem de Bruijnip -netns "${NS2}" addr add "${DUMMY_ADDR}/${MASK}" dev "${DUMMY_DEV}" ${NODAD}
119*81d572a5SWillem de Bruijn
120*81d572a5SWillem de Bruijnip -netns "${NS1}" route add default via "${DADDR}" dev "${DEV}"
121*81d572a5SWillem de Bruijnip -netns "${NS2}" route add default via "${DADDR_TXONLY}" dev "${DUMMY_DEV}"
122*81d572a5SWillem de Bruijn
123*81d572a5SWillem de Bruijnip netns exec "${NS2}" sysctl -wq net.ipv4.ip_forward=1
124*81d572a5SWillem de Bruijnip netns exec "${NS2}" sysctl -wq net.ipv6.conf.all.forwarding=1
12507b65c5bSWillem de Bruijn
12607b65c5bSWillem de Bruijn# Optionally disable sg or csum offload to test edge cases
12707b65c5bSWillem de Bruijn# ip netns exec "${NS1}" ethtool -K "${DEV}" sg off
12807b65c5bSWillem de Bruijn
129*81d572a5SWillem de Bruijnret=0
130*81d572a5SWillem de Bruijn
13107b65c5bSWillem de Bruijndo_test() {
13207b65c5bSWillem de Bruijn	local readonly ARGS="$1"
13307b65c5bSWillem de Bruijn
134*81d572a5SWillem de Bruijn	# tx-rx test
135*81d572a5SWillem de Bruijn	# packets queued to a local socket are copied,
136*81d572a5SWillem de Bruijn	# sender notification has SO_EE_CODE_ZEROCOPY_COPIED.
137*81d572a5SWillem de Bruijn
138*81d572a5SWillem de Bruijn	echo -e "\nipv${IP} ${TXMODE} ${ARGS} tx-rx\n"
139*81d572a5SWillem de Bruijn	ip netns exec "${NS2}" "${BIN}" "-${IP}" -i "${DEV}" -t 2 -C 2 \
140*81d572a5SWillem de Bruijn		-S "${SADDR}" -D "${DADDR}" ${ARGS} -r "${RXMODE}" &
14107b65c5bSWillem de Bruijn	sleep 0.2
142*81d572a5SWillem de Bruijn	ip netns exec "${NS1}" "${BIN}" "-${IP}" -i "${DEV}" -t 1 -C 3 \
143*81d572a5SWillem de Bruijn		-S "${SADDR}" -D "${DADDR}" ${ARGS} "${TXMODE}" -Z 0 || ret=1
14407b65c5bSWillem de Bruijn	wait
145*81d572a5SWillem de Bruijn
146*81d572a5SWillem de Bruijn	# next test is unconnected tx to dummy0, cannot exercise with tcp
147*81d572a5SWillem de Bruijn	[[ "${TXMODE}" == "tcp" ]] && return
148*81d572a5SWillem de Bruijn
149*81d572a5SWillem de Bruijn	# tx-only test: send out dummy0
150*81d572a5SWillem de Bruijn	# packets leaving the host are not copied,
151*81d572a5SWillem de Bruijn	# sender notification does not have SO_EE_CODE_ZEROCOPY_COPIED.
152*81d572a5SWillem de Bruijn
153*81d572a5SWillem de Bruijn	echo -e "\nipv${IP} ${TXMODE} ${ARGS} tx-only\n"
154*81d572a5SWillem de Bruijn	ip netns exec "${NS1}" "${BIN}" "-${IP}" -i "${DEV}" -t 1 -C 3 \
155*81d572a5SWillem de Bruijn		-S "${SADDR}" -D "${DADDR_TXONLY}" ${ARGS} "${TXMODE}" -Z 1 || ret=1
15607b65c5bSWillem de Bruijn}
15707b65c5bSWillem de Bruijn
15807b65c5bSWillem de Bruijndo_test "${EXTRA_ARGS}"
15907b65c5bSWillem de Bruijndo_test "-z ${EXTRA_ARGS}"
160*81d572a5SWillem de Bruijn
161*81d572a5SWillem de Bruijn[[ "$ret" == "0" ]] && echo "OK"
162