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