aboutsummaryrefslogtreecommitdiff
path: root/broccoli/script/measure-packets.sh
blob: af38624bc0de787e878c9754133693715503fed5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash

function measure_packets {
	TCPREPLAY_SPEED=$1
	TCPREPLAY_COUNT=$2

	bro -i "${BRO_INTERFACE}" -C -b Log::default_writer=Log::WRITER_NONE "${BRO_SCRIPT}" 2> bro-err.txt &
	BRO_PID=$!

	tcpreplay -i "${BRO_INTERFACE}" -M "${TCPREPLAY_SPEED}" -L "${TCPREPLAY_COUNT}" "${TCPREPLAY_DUMP}" > /dev/null 2> /dev/null

	PCPU="100.0"
	while [[ $(echo "${PCPU}>50" | bc) -eq 1 ]]
	do
		sleep 1
		PCPU=$(ps -q ${BRO_PID} -o pcpu --no-headers)
	done

	kill -SIGINT "${BRO_PID}"
	sleep 1

	tail -1 bro-err.txt | awk -F' ' '{print $5}'
}

if [[ $# -ne 3 ]]
then
	echo "Executes Bro and tcpreplay and measures the number of packages"
	echo "received and handled by Bro."
	echo
	echo "Usage:"
	echo "    $0 SCRIPT IFACE DUMP"
	echo "Arguments:"
	echo "    SCRIPT  the Bro script to execute"
	echo "    IFACE   the interface for Bro to listen on"
	echo "    DUMP    the network dump to replay"
	exit 1
fi

if [[ $(id -u) -ne 0 ]]
then
	echo "Must be run as root. Aborting."
	exit 1
fi

BRO_SCRIPT=$1
BRO_INTERFACE=$2
TCPREPLAY_DUMP=$3

SPEEDS=(400 200 100 50 25)
COUNTS=($(seq 400000 100000 2600000))

if [[ ! -r "${BRO_SCRIPT}" ]]
then
	echo "The Bro script '${BRO_SCRIPT}' does not exist. Aborting."
	exit 1
fi

if [[ ! -r "${TCPREPLAY_DUMP}" ]]
then
	echo "The network dump '${TCPREPLAY_DUMP}' does not exist. Aborting."
	exit 1
fi

BRO_SCRIPT=$(realpath "${BRO_SCRIPT}")
TCPREPLAY_DUMP=$(realpath "${TCPREPLAY_DUMP}")

BRO_DIR=$(mktemp --directory --tmpdir bro.XXX)

cd "${BRO_DIR}"

echo -ne "sent\t"
for SPEED in ${SPEEDS[@]}
do
	echo -ne "${SPEED}\t"
done
echo

for COUNT in ${COUNTS[@]}
do
	echo -ne "${COUNT}\t"
	for SPEED in ${SPEEDS[@]}
	do
		COUNT_RECEIVED=$(measure_packets ${SPEED} ${COUNT})
		echo -ne "${COUNT_RECEIVED}\t"
	done
	echo
done

rm -rf "${BRO_DIR}"