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