xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/net/txtimestamp.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 Worker# Send packets with transmit timestamps over loopback with netem
5*053f45beSAndroid Build Coastguard Worker# Verify that timestamps correspond to netem delay
6*053f45beSAndroid Build Coastguard Worker
7*053f45beSAndroid Build Coastguard Workerset -e
8*053f45beSAndroid Build Coastguard Worker
9*053f45beSAndroid Build Coastguard Workersetup() {
10*053f45beSAndroid Build Coastguard Worker	# set 1ms delay on lo egress
11*053f45beSAndroid Build Coastguard Worker	tc qdisc add dev lo root netem delay 1ms
12*053f45beSAndroid Build Coastguard Worker
13*053f45beSAndroid Build Coastguard Worker	# set 2ms delay on ifb0 egress
14*053f45beSAndroid Build Coastguard Worker	modprobe ifb
15*053f45beSAndroid Build Coastguard Worker	ip link add ifb_netem0 type ifb
16*053f45beSAndroid Build Coastguard Worker	ip link set dev ifb_netem0 up
17*053f45beSAndroid Build Coastguard Worker	tc qdisc add dev ifb_netem0 root netem delay 2ms
18*053f45beSAndroid Build Coastguard Worker
19*053f45beSAndroid Build Coastguard Worker	# redirect lo ingress through ifb0 egress
20*053f45beSAndroid Build Coastguard Worker	tc qdisc add dev lo handle ffff: ingress
21*053f45beSAndroid Build Coastguard Worker	tc filter add dev lo parent ffff: \
22*053f45beSAndroid Build Coastguard Worker		u32 match mark 0 0xffff \
23*053f45beSAndroid Build Coastguard Worker		action mirred egress redirect dev ifb_netem0
24*053f45beSAndroid Build Coastguard Worker}
25*053f45beSAndroid Build Coastguard Worker
26*053f45beSAndroid Build Coastguard Workerrun_test_v4v6() {
27*053f45beSAndroid Build Coastguard Worker	# SND will be delayed 1000us
28*053f45beSAndroid Build Coastguard Worker	# ACK will be delayed 6000us: 1 + 2 ms round-trip
29*053f45beSAndroid Build Coastguard Worker	local -r args="$@ -v 1000 -V 6000"
30*053f45beSAndroid Build Coastguard Worker
31*053f45beSAndroid Build Coastguard Worker	./txtimestamp ${args} -4 -L 127.0.0.1
32*053f45beSAndroid Build Coastguard Worker	./txtimestamp ${args} -6 -L ::1
33*053f45beSAndroid Build Coastguard Worker}
34*053f45beSAndroid Build Coastguard Worker
35*053f45beSAndroid Build Coastguard Workerrun_test_tcpudpraw() {
36*053f45beSAndroid Build Coastguard Worker	local -r args=$@
37*053f45beSAndroid Build Coastguard Worker
38*053f45beSAndroid Build Coastguard Worker	run_test_v4v6 ${args}		# tcp
39*053f45beSAndroid Build Coastguard Worker	run_test_v4v6 ${args} -u	# udp
40*053f45beSAndroid Build Coastguard Worker	run_test_v4v6 ${args} -r	# raw
41*053f45beSAndroid Build Coastguard Worker	run_test_v4v6 ${args} -R	# raw (IPPROTO_RAW)
42*053f45beSAndroid Build Coastguard Worker	run_test_v4v6 ${args} -P	# pf_packet
43*053f45beSAndroid Build Coastguard Worker}
44*053f45beSAndroid Build Coastguard Worker
45*053f45beSAndroid Build Coastguard Workerrun_test_all() {
46*053f45beSAndroid Build Coastguard Worker	setup
47*053f45beSAndroid Build Coastguard Worker	run_test_tcpudpraw		# setsockopt
48*053f45beSAndroid Build Coastguard Worker	run_test_tcpudpraw -C		# cmsg
49*053f45beSAndroid Build Coastguard Worker	run_test_tcpudpraw -n		# timestamp w/o data
50*053f45beSAndroid Build Coastguard Worker	echo "OK. All tests passed"
51*053f45beSAndroid Build Coastguard Worker}
52*053f45beSAndroid Build Coastguard Worker
53*053f45beSAndroid Build Coastguard Workerrun_test_one() {
54*053f45beSAndroid Build Coastguard Worker	setup
55*053f45beSAndroid Build Coastguard Worker	./txtimestamp $@
56*053f45beSAndroid Build Coastguard Worker}
57*053f45beSAndroid Build Coastguard Worker
58*053f45beSAndroid Build Coastguard Workerusage() {
59*053f45beSAndroid Build Coastguard Worker	echo "Usage: $0 [ -r | --run ] <txtimestamp args> | [ -h | --help ]"
60*053f45beSAndroid Build Coastguard Worker	echo "  (no args)  Run all tests"
61*053f45beSAndroid Build Coastguard Worker	echo "  -r|--run  Run an individual test with arguments"
62*053f45beSAndroid Build Coastguard Worker	echo "  -h|--help Help"
63*053f45beSAndroid Build Coastguard Worker}
64*053f45beSAndroid Build Coastguard Worker
65*053f45beSAndroid Build Coastguard Workermain() {
66*053f45beSAndroid Build Coastguard Worker	if [[ $# -eq 0 ]]; then
67*053f45beSAndroid Build Coastguard Worker		run_test_all
68*053f45beSAndroid Build Coastguard Worker	else
69*053f45beSAndroid Build Coastguard Worker		if [[ "$1" = "-r" || "$1" == "--run" ]]; then
70*053f45beSAndroid Build Coastguard Worker			shift
71*053f45beSAndroid Build Coastguard Worker			run_test_one $@
72*053f45beSAndroid Build Coastguard Worker		else
73*053f45beSAndroid Build Coastguard Worker			usage
74*053f45beSAndroid Build Coastguard Worker		fi
75*053f45beSAndroid Build Coastguard Worker	fi
76*053f45beSAndroid Build Coastguard Worker}
77*053f45beSAndroid Build Coastguard Worker
78*053f45beSAndroid Build Coastguard Workerif [[ -z "$(ip netns identify)" ]]; then
79*053f45beSAndroid Build Coastguard Worker	./in_netns.sh $0 $@
80*053f45beSAndroid Build Coastguard Workerelse
81*053f45beSAndroid Build Coastguard Worker	main $@
82*053f45beSAndroid Build Coastguard Workerfi
83