15ef5c90eSJian Yang#!/bin/bash
25ef5c90eSJian Yang# SPDX-License-Identifier: GPL-2.0
35ef5c90eSJian Yang#
45ef5c90eSJian Yang# Send packets with transmit timestamps over loopback with netem
55ef5c90eSJian Yang# Verify that timestamps correspond to netem delay
65ef5c90eSJian Yang
75ef5c90eSJian Yangset -e
85ef5c90eSJian Yang
95ef5c90eSJian Yangsetup() {
105ef5c90eSJian Yang	# set 1ms delay on lo egress
115ef5c90eSJian Yang	tc qdisc add dev lo root netem delay 1ms
125ef5c90eSJian Yang
135ef5c90eSJian Yang	# set 2ms delay on ifb0 egress
145ef5c90eSJian Yang	modprobe ifb
155ef5c90eSJian Yang	ip link add ifb_netem0 type ifb
165ef5c90eSJian Yang	ip link set dev ifb_netem0 up
175ef5c90eSJian Yang	tc qdisc add dev ifb_netem0 root netem delay 2ms
185ef5c90eSJian Yang
195ef5c90eSJian Yang	# redirect lo ingress through ifb0 egress
205ef5c90eSJian Yang	tc qdisc add dev lo handle ffff: ingress
215ef5c90eSJian Yang	tc filter add dev lo parent ffff: \
225ef5c90eSJian Yang		u32 match mark 0 0xffff \
235ef5c90eSJian Yang		action mirred egress redirect dev ifb_netem0
245ef5c90eSJian Yang}
255ef5c90eSJian Yang
265ef5c90eSJian Yangrun_test_v4v6() {
275ef5c90eSJian Yang	# SND will be delayed 1000us
285ef5c90eSJian Yang	# ACK will be delayed 6000us: 1 + 2 ms round-trip
295ef5c90eSJian Yang	local -r args="$@ -v 1000 -V 6000"
305ef5c90eSJian Yang
315ef5c90eSJian Yang	./txtimestamp ${args} -4 -L 127.0.0.1
325ef5c90eSJian Yang	./txtimestamp ${args} -6 -L ::1
335ef5c90eSJian Yang}
345ef5c90eSJian Yang
355ef5c90eSJian Yangrun_test_tcpudpraw() {
365ef5c90eSJian Yang	local -r args=$@
375ef5c90eSJian Yang
385ef5c90eSJian Yang	run_test_v4v6 ${args}		# tcp
395ef5c90eSJian Yang	run_test_v4v6 ${args} -u	# udp
405ef5c90eSJian Yang	run_test_v4v6 ${args} -r	# raw
415ef5c90eSJian Yang	run_test_v4v6 ${args} -R	# raw (IPPROTO_RAW)
425ef5c90eSJian Yang	run_test_v4v6 ${args} -P	# pf_packet
435ef5c90eSJian Yang}
445ef5c90eSJian Yang
455ef5c90eSJian Yangrun_test_all() {
465ef5c90eSJian Yang	setup
475ef5c90eSJian Yang	run_test_tcpudpraw		# setsockopt
485ef5c90eSJian Yang	run_test_tcpudpraw -C		# cmsg
495ef5c90eSJian Yang	run_test_tcpudpraw -n		# timestamp w/o data
505ef5c90eSJian Yang	echo "OK. All tests passed"
515ef5c90eSJian Yang}
525ef5c90eSJian Yang
535ef5c90eSJian Yangrun_test_one() {
545ef5c90eSJian Yang	setup
555ef5c90eSJian Yang	./txtimestamp $@
565ef5c90eSJian Yang}
575ef5c90eSJian Yang
585ef5c90eSJian Yangusage() {
595ef5c90eSJian Yang	echo "Usage: $0 [ -r | --run ] <txtimestamp args> | [ -h | --help ]"
605ef5c90eSJian Yang	echo "  (no args)  Run all tests"
615ef5c90eSJian Yang	echo "  -r|--run  Run an individual test with arguments"
625ef5c90eSJian Yang	echo "  -h|--help Help"
635ef5c90eSJian Yang}
645ef5c90eSJian Yang
655ef5c90eSJian Yangmain() {
665ef5c90eSJian Yang	if [[ $# -eq 0 ]]; then
675ef5c90eSJian Yang		run_test_all
685ef5c90eSJian Yang	else
695ef5c90eSJian Yang		if [[ "$1" = "-r" || "$1" == "--run" ]]; then
705ef5c90eSJian Yang			shift
715ef5c90eSJian Yang			run_test_one $@
725ef5c90eSJian Yang		else
735ef5c90eSJian Yang			usage
745ef5c90eSJian Yang		fi
755ef5c90eSJian Yang	fi
765ef5c90eSJian Yang}
775ef5c90eSJian Yang
78b346c0c8SPaolo Pisatiif [[ -z "$(ip netns identify)" ]]; then
795ef5c90eSJian Yang	./in_netns.sh $0 $@
805ef5c90eSJian Yangelse
815ef5c90eSJian Yang	main $@
825ef5c90eSJian Yangfi
83