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