Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 #
0003 # Send data between two processes across namespaces
0004 # Run twice: once without and once with zerocopy
0005 
0006 set -e
0007 
0008 readonly DEV="veth0"
0009 readonly DEV_MTU=65535
0010 readonly BIN_TX="./io_uring_zerocopy_tx"
0011 readonly BIN_RX="./msg_zerocopy"
0012 
0013 readonly RAND="$(mktemp -u XXXXXX)"
0014 readonly NSPREFIX="ns-${RAND}"
0015 readonly NS1="${NSPREFIX}1"
0016 readonly NS2="${NSPREFIX}2"
0017 
0018 readonly SADDR4='192.168.1.1'
0019 readonly DADDR4='192.168.1.2'
0020 readonly SADDR6='fd::1'
0021 readonly DADDR6='fd::2'
0022 
0023 readonly path_sysctl_mem="net.core.optmem_max"
0024 
0025 # No arguments: automated test
0026 if [[ "$#" -eq "0" ]]; then
0027         IPs=( "4" "6" )
0028 
0029         for IP in "${IPs[@]}"; do
0030                 for mode in $(seq 1 3); do
0031                         $0 "$IP" udp -m "$mode" -t 1 -n 32
0032                         $0 "$IP" tcp -m "$mode" -t 1 -n 32
0033                 done
0034         done
0035 
0036         echo "OK. All tests passed"
0037         exit 0
0038 fi
0039 
0040 # Argument parsing
0041 if [[ "$#" -lt "2" ]]; then
0042         echo "Usage: $0 [4|6] [tcp|udp|raw|raw_hdrincl|packet|packet_dgram] <args>"
0043         exit 1
0044 fi
0045 
0046 readonly IP="$1"
0047 shift
0048 readonly TXMODE="$1"
0049 shift
0050 readonly EXTRA_ARGS="$@"
0051 
0052 # Argument parsing: configure addresses
0053 if [[ "${IP}" == "4" ]]; then
0054         readonly SADDR="${SADDR4}"
0055         readonly DADDR="${DADDR4}"
0056 elif [[ "${IP}" == "6" ]]; then
0057         readonly SADDR="${SADDR6}"
0058         readonly DADDR="${DADDR6}"
0059 else
0060         echo "Invalid IP version ${IP}"
0061         exit 1
0062 fi
0063 
0064 # Argument parsing: select receive mode
0065 #
0066 # This differs from send mode for
0067 # - packet:     use raw recv, because packet receives skb clones
0068 # - raw_hdrinc: use raw recv, because hdrincl is a tx-only option
0069 case "${TXMODE}" in
0070 'packet' | 'packet_dgram' | 'raw_hdrincl')
0071         RXMODE='raw'
0072         ;;
0073 *)
0074         RXMODE="${TXMODE}"
0075         ;;
0076 esac
0077 
0078 # Start of state changes: install cleanup handler
0079 save_sysctl_mem="$(sysctl -n ${path_sysctl_mem})"
0080 
0081 cleanup() {
0082         ip netns del "${NS2}"
0083         ip netns del "${NS1}"
0084         sysctl -w -q "${path_sysctl_mem}=${save_sysctl_mem}"
0085 }
0086 
0087 trap cleanup EXIT
0088 
0089 # Configure system settings
0090 sysctl -w -q "${path_sysctl_mem}=1000000"
0091 
0092 # Create virtual ethernet pair between network namespaces
0093 ip netns add "${NS1}"
0094 ip netns add "${NS2}"
0095 
0096 ip link add "${DEV}" mtu "${DEV_MTU}" netns "${NS1}" type veth \
0097   peer name "${DEV}" mtu "${DEV_MTU}" netns "${NS2}"
0098 
0099 # Bring the devices up
0100 ip -netns "${NS1}" link set "${DEV}" up
0101 ip -netns "${NS2}" link set "${DEV}" up
0102 
0103 # Set fixed MAC addresses on the devices
0104 ip -netns "${NS1}" link set dev "${DEV}" address 02:02:02:02:02:02
0105 ip -netns "${NS2}" link set dev "${DEV}" address 06:06:06:06:06:06
0106 
0107 # Add fixed IP addresses to the devices
0108 ip -netns "${NS1}" addr add 192.168.1.1/24 dev "${DEV}"
0109 ip -netns "${NS2}" addr add 192.168.1.2/24 dev "${DEV}"
0110 ip -netns "${NS1}" addr add       fd::1/64 dev "${DEV}" nodad
0111 ip -netns "${NS2}" addr add       fd::2/64 dev "${DEV}" nodad
0112 
0113 # Optionally disable sg or csum offload to test edge cases
0114 # ip netns exec "${NS1}" ethtool -K "${DEV}" sg off
0115 
0116 do_test() {
0117         local readonly ARGS="$1"
0118 
0119         echo "ipv${IP} ${TXMODE} ${ARGS}"
0120         ip netns exec "${NS2}" "${BIN_RX}" "-${IP}" -t 2 -C 2 -S "${SADDR}" -D "${DADDR}" -r "${RXMODE}" &
0121         sleep 0.2
0122         ip netns exec "${NS1}" "${BIN_TX}" "-${IP}" -t 1 -D "${DADDR}" ${ARGS} "${TXMODE}"
0123         wait
0124 }
0125 
0126 do_test "${EXTRA_ARGS}"
0127 echo ok