1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Regression tests for the SO_TXTIME interface
5
6set -e
7
8readonly DEV="veth0"
9readonly BIN="./so_txtime"
10
11readonly RAND="$(mktemp -u XXXXXX)"
12readonly NSPREFIX="ns-${RAND}"
13readonly NS1="${NSPREFIX}1"
14readonly NS2="${NSPREFIX}2"
15
16readonly SADDR4='192.168.1.1'
17readonly DADDR4='192.168.1.2'
18readonly SADDR6='fd::1'
19readonly DADDR6='fd::2'
20
21cleanup() {
22	ip netns del "${NS2}"
23	ip netns del "${NS1}"
24}
25
26trap cleanup EXIT
27
28# Create virtual ethernet pair between network namespaces
29ip netns add "${NS1}"
30ip netns add "${NS2}"
31
32ip link add "${DEV}" netns "${NS1}" type veth \
33  peer name "${DEV}" netns "${NS2}"
34
35# Bring the devices up
36ip -netns "${NS1}" link set "${DEV}" up
37ip -netns "${NS2}" link set "${DEV}" up
38
39# Set fixed MAC addresses on the devices
40ip -netns "${NS1}" link set dev "${DEV}" address 02:02:02:02:02:02
41ip -netns "${NS2}" link set dev "${DEV}" address 06:06:06:06:06:06
42
43# Add fixed IP addresses to the devices
44ip -netns "${NS1}" addr add 192.168.1.1/24 dev "${DEV}"
45ip -netns "${NS2}" addr add 192.168.1.2/24 dev "${DEV}"
46ip -netns "${NS1}" addr add       fd::1/64 dev "${DEV}" nodad
47ip -netns "${NS2}" addr add       fd::2/64 dev "${DEV}" nodad
48
49do_test() {
50	local readonly IP="$1"
51	local readonly CLOCK="$2"
52	local readonly TXARGS="$3"
53	local readonly RXARGS="$4"
54
55	if [[ "${IP}" == "4" ]]; then
56		local readonly SADDR="${SADDR4}"
57		local readonly DADDR="${DADDR4}"
58	elif [[ "${IP}" == "6" ]]; then
59		local readonly SADDR="${SADDR6}"
60		local readonly DADDR="${DADDR6}"
61	else
62		echo "Invalid IP version ${IP}"
63		exit 1
64	fi
65
66	local readonly START="$(date +%s%N --date="+ 0.1 seconds")"
67	ip netns exec "${NS2}" "${BIN}" -"${IP}" -c "${CLOCK}" -t "${START}" -S "${SADDR}" -D "${DADDR}" "${RXARGS}" -r &
68	ip netns exec "${NS1}" "${BIN}" -"${IP}" -c "${CLOCK}" -t "${START}" -S "${SADDR}" -D "${DADDR}" "${TXARGS}"
69	wait "$!"
70}
71
72ip netns exec "${NS1}" tc qdisc add dev "${DEV}" root fq
73do_test 4 mono a,-1 a,-1
74do_test 6 mono a,0 a,0
75do_test 6 mono a,10 a,10
76do_test 4 mono a,10,b,20 a,10,b,20
77do_test 6 mono a,20,b,10 b,20,a,20
78
79if ip netns exec "${NS1}" tc qdisc replace dev "${DEV}" root etf clockid CLOCK_TAI delta 400000; then
80	! do_test 4 tai a,-1 a,-1
81	! do_test 6 tai a,0 a,0
82	do_test 6 tai a,10 a,10
83	do_test 4 tai a,10,b,20 a,10,b,20
84	do_test 6 tai a,20,b,10 b,10,a,20
85else
86	echo "tc ($(tc -V)) does not support qdisc etf. skipping"
87fi
88
89echo OK. All tests passed
90