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