xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/net/gro.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/bash
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker
4*053f45beSAndroid Build Coastguard Workerreadonly SERVER_MAC="aa:00:00:00:00:02"
5*053f45beSAndroid Build Coastguard Workerreadonly CLIENT_MAC="aa:00:00:00:00:01"
6*053f45beSAndroid Build Coastguard Workerreadonly TESTS=("data" "ack" "flags" "tcp" "ip" "large")
7*053f45beSAndroid Build Coastguard Workerreadonly PROTOS=("ipv4" "ipv6")
8*053f45beSAndroid Build Coastguard Workerdev=""
9*053f45beSAndroid Build Coastguard Workertest="all"
10*053f45beSAndroid Build Coastguard Workerproto="ipv4"
11*053f45beSAndroid Build Coastguard Worker
12*053f45beSAndroid Build Coastguard Workerrun_test() {
13*053f45beSAndroid Build Coastguard Worker  local server_pid=0
14*053f45beSAndroid Build Coastguard Worker  local exit_code=0
15*053f45beSAndroid Build Coastguard Worker  local protocol=$1
16*053f45beSAndroid Build Coastguard Worker  local test=$2
17*053f45beSAndroid Build Coastguard Worker  local ARGS=( "--${protocol}" "--dmac" "${SERVER_MAC}" \
18*053f45beSAndroid Build Coastguard Worker  "--smac" "${CLIENT_MAC}" "--test" "${test}" "--verbose" )
19*053f45beSAndroid Build Coastguard Worker
20*053f45beSAndroid Build Coastguard Worker  setup_ns
21*053f45beSAndroid Build Coastguard Worker  # Each test is run 3 times to deflake, because given the receive timing,
22*053f45beSAndroid Build Coastguard Worker  # not all packets that should coalesce will be considered in the same flow
23*053f45beSAndroid Build Coastguard Worker  # on every try.
24*053f45beSAndroid Build Coastguard Worker  for tries in {1..3}; do
25*053f45beSAndroid Build Coastguard Worker    # Actual test starts here
26*053f45beSAndroid Build Coastguard Worker    ip netns exec server_ns ./gro "${ARGS[@]}" "--rx" "--iface" "server" \
27*053f45beSAndroid Build Coastguard Worker      1>>log.txt &
28*053f45beSAndroid Build Coastguard Worker    server_pid=$!
29*053f45beSAndroid Build Coastguard Worker    sleep 0.5  # to allow for socket init
30*053f45beSAndroid Build Coastguard Worker    ip netns exec client_ns ./gro "${ARGS[@]}" "--iface" "client" \
31*053f45beSAndroid Build Coastguard Worker      1>>log.txt
32*053f45beSAndroid Build Coastguard Worker    wait "${server_pid}"
33*053f45beSAndroid Build Coastguard Worker    exit_code=$?
34*053f45beSAndroid Build Coastguard Worker    if [[ "${exit_code}" -eq 0 ]]; then
35*053f45beSAndroid Build Coastguard Worker        break;
36*053f45beSAndroid Build Coastguard Worker    fi
37*053f45beSAndroid Build Coastguard Worker  done
38*053f45beSAndroid Build Coastguard Worker  cleanup_ns
39*053f45beSAndroid Build Coastguard Worker  echo ${exit_code}
40*053f45beSAndroid Build Coastguard Worker}
41*053f45beSAndroid Build Coastguard Worker
42*053f45beSAndroid Build Coastguard Workerrun_all_tests() {
43*053f45beSAndroid Build Coastguard Worker  local failed_tests=()
44*053f45beSAndroid Build Coastguard Worker  for proto in "${PROTOS[@]}"; do
45*053f45beSAndroid Build Coastguard Worker    for test in "${TESTS[@]}"; do
46*053f45beSAndroid Build Coastguard Worker      echo "running test ${proto} ${test}" >&2
47*053f45beSAndroid Build Coastguard Worker      exit_code=$(run_test $proto $test)
48*053f45beSAndroid Build Coastguard Worker      if [[ "${exit_code}" -ne 0 ]]; then
49*053f45beSAndroid Build Coastguard Worker        failed_tests+=("${proto}_${test}")
50*053f45beSAndroid Build Coastguard Worker      fi;
51*053f45beSAndroid Build Coastguard Worker    done;
52*053f45beSAndroid Build Coastguard Worker  done
53*053f45beSAndroid Build Coastguard Worker  if [[ ${#failed_tests[@]} -ne 0 ]]; then
54*053f45beSAndroid Build Coastguard Worker    echo "failed tests: ${failed_tests[*]}. \
55*053f45beSAndroid Build Coastguard Worker    Please see log.txt for more logs"
56*053f45beSAndroid Build Coastguard Worker    exit 1
57*053f45beSAndroid Build Coastguard Worker  else
58*053f45beSAndroid Build Coastguard Worker    echo "All Tests Succeeded!"
59*053f45beSAndroid Build Coastguard Worker  fi;
60*053f45beSAndroid Build Coastguard Worker}
61*053f45beSAndroid Build Coastguard Worker
62*053f45beSAndroid Build Coastguard Workerusage() {
63*053f45beSAndroid Build Coastguard Worker  echo "Usage: $0 \
64*053f45beSAndroid Build Coastguard Worker  [-i <DEV>] \
65*053f45beSAndroid Build Coastguard Worker  [-t data|ack|flags|tcp|ip|large] \
66*053f45beSAndroid Build Coastguard Worker  [-p <ipv4|ipv6>]" 1>&2;
67*053f45beSAndroid Build Coastguard Worker  exit 1;
68*053f45beSAndroid Build Coastguard Worker}
69*053f45beSAndroid Build Coastguard Worker
70*053f45beSAndroid Build Coastguard Workerwhile getopts "i:t:p:" opt; do
71*053f45beSAndroid Build Coastguard Worker  case "${opt}" in
72*053f45beSAndroid Build Coastguard Worker    i)
73*053f45beSAndroid Build Coastguard Worker      dev="${OPTARG}"
74*053f45beSAndroid Build Coastguard Worker      ;;
75*053f45beSAndroid Build Coastguard Worker    t)
76*053f45beSAndroid Build Coastguard Worker      test="${OPTARG}"
77*053f45beSAndroid Build Coastguard Worker      ;;
78*053f45beSAndroid Build Coastguard Worker    p)
79*053f45beSAndroid Build Coastguard Worker      proto="${OPTARG}"
80*053f45beSAndroid Build Coastguard Worker      ;;
81*053f45beSAndroid Build Coastguard Worker    *)
82*053f45beSAndroid Build Coastguard Worker      usage
83*053f45beSAndroid Build Coastguard Worker      ;;
84*053f45beSAndroid Build Coastguard Worker  esac
85*053f45beSAndroid Build Coastguard Workerdone
86*053f45beSAndroid Build Coastguard Worker
87*053f45beSAndroid Build Coastguard Workerif [ -n "$dev" ]; then
88*053f45beSAndroid Build Coastguard Worker	source setup_loopback.sh
89*053f45beSAndroid Build Coastguard Workerelse
90*053f45beSAndroid Build Coastguard Worker	source setup_veth.sh
91*053f45beSAndroid Build Coastguard Workerfi
92*053f45beSAndroid Build Coastguard Worker
93*053f45beSAndroid Build Coastguard Workersetup
94*053f45beSAndroid Build Coastguard Workertrap cleanup EXIT
95*053f45beSAndroid Build Coastguard Workerif [[ "${test}" == "all" ]]; then
96*053f45beSAndroid Build Coastguard Worker  run_all_tests
97*053f45beSAndroid Build Coastguard Workerelse
98*053f45beSAndroid Build Coastguard Worker  run_test "${proto}" "${test}"
99*053f45beSAndroid Build Coastguard Workerfi;
100