| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # |
| # Regression tests for the SO_TXTIME interface |
| |
| set -e |
| |
| readonly ksft_skip=4 |
| readonly DEV="veth0" |
| readonly BIN="./so_txtime" |
| |
| readonly RAND="$(mktemp -u XXXXXX)" |
| readonly NSPREFIX="ns-${RAND}" |
| readonly NS1="${NSPREFIX}1" |
| readonly NS2="${NSPREFIX}2" |
| |
| readonly SADDR4='192.168.1.1' |
| readonly DADDR4='192.168.1.2' |
| readonly SADDR6='fd::1' |
| readonly DADDR6='fd::2' |
| |
| cleanup() { |
| ip netns del "${NS2}" |
| ip netns del "${NS1}" |
| } |
| |
| trap cleanup EXIT |
| |
| # Create virtual ethernet pair between network namespaces |
| ip netns add "${NS1}" |
| ip netns add "${NS2}" |
| |
| ip link add "${DEV}" netns "${NS1}" type veth \ |
| peer name "${DEV}" netns "${NS2}" |
| |
| # Bring the devices up |
| ip -netns "${NS1}" link set "${DEV}" up |
| ip -netns "${NS2}" link set "${DEV}" up |
| |
| # Set fixed MAC addresses on the devices |
| ip -netns "${NS1}" link set dev "${DEV}" address 02:02:02:02:02:02 |
| ip -netns "${NS2}" link set dev "${DEV}" address 06:06:06:06:06:06 |
| |
| # Add fixed IP addresses to the devices |
| ip -netns "${NS1}" addr add 192.168.1.1/24 dev "${DEV}" |
| ip -netns "${NS2}" addr add 192.168.1.2/24 dev "${DEV}" |
| ip -netns "${NS1}" addr add fd::1/64 dev "${DEV}" nodad |
| ip -netns "${NS2}" addr add fd::2/64 dev "${DEV}" nodad |
| |
| run_test() { |
| local readonly IP="$1" |
| local readonly CLOCK="$2" |
| local readonly TXARGS="$3" |
| local readonly RXARGS="$4" |
| |
| if [[ "${IP}" == "4" ]]; then |
| local readonly SADDR="${SADDR4}" |
| local readonly DADDR="${DADDR4}" |
| elif [[ "${IP}" == "6" ]]; then |
| local readonly SADDR="${SADDR6}" |
| local readonly DADDR="${DADDR6}" |
| else |
| echo "Invalid IP version ${IP}" |
| exit 1 |
| fi |
| |
| local readonly START="$(date +%s%N --date="+ 0.1 seconds")" |
| |
| ip netns exec "${NS2}" "${BIN}" -"${IP}" -c "${CLOCK}" -t "${START}" -S "${SADDR}" -D "${DADDR}" "${RXARGS}" -r & |
| ip netns exec "${NS1}" "${BIN}" -"${IP}" -c "${CLOCK}" -t "${START}" -S "${SADDR}" -D "${DADDR}" "${TXARGS}" |
| wait "$!" |
| } |
| |
| do_test() { |
| run_test $@ |
| [ $? -ne 0 ] && ret=1 |
| } |
| |
| do_fail_test() { |
| run_test $@ |
| [ $? -eq 0 ] && ret=1 |
| } |
| |
| ip netns exec "${NS1}" tc qdisc add dev "${DEV}" root fq |
| set +e |
| ret=0 |
| do_test 4 mono a,-1 a,-1 |
| do_test 6 mono a,0 a,0 |
| do_test 6 mono a,10 a,10 |
| do_test 4 mono a,10,b,20 a,10,b,20 |
| do_test 6 mono a,20,b,10 b,20,a,20 |
| |
| if ip netns exec "${NS1}" tc qdisc replace dev "${DEV}" root etf clockid CLOCK_TAI delta 400000; then |
| do_fail_test 4 tai a,-1 a,-1 |
| do_fail_test 6 tai a,0 a,0 |
| do_test 6 tai a,10 a,10 |
| do_test 4 tai a,10,b,20 a,10,b,20 |
| do_test 6 tai a,20,b,10 b,10,a,20 |
| else |
| echo "tc ($(tc -V)) does not support qdisc etf. skipping" |
| [ $ret -eq 0 ] && ret=$ksft_skip |
| fi |
| |
| if [ $ret -eq 0 ]; then |
| echo OK. All tests passed |
| elif [[ $ret -ne $ksft_skip && -n "$KSFT_MACHINE_SLOW" ]]; then |
| echo "Ignoring errors due to slow environment" 1>&2 |
| ret=0 |
| fi |
| exit $ret |