1e8db04c3SNick Hibma#!/bin/sh
2e8db04c3SNick Hibma#
3e8db04c3SNick Hibma# Copyright (c) 2018-2020 Retina b.v.
4e8db04c3SNick Hibma# All rights reserved.
5e8db04c3SNick Hibma#
6e8db04c3SNick Hibma# Redistribution and use in source and binary forms, with or without
7e8db04c3SNick Hibma# modification, are permitted provided that the following conditions
8e8db04c3SNick Hibma# are met:
9e8db04c3SNick Hibma# 1. Redistributions of source code must retain the above copyright
10e8db04c3SNick Hibma#    notice, this list of conditions and the following disclaimer.
11e8db04c3SNick Hibma# 2. Redistributions in binary form must reproduce the above copyright
12e8db04c3SNick Hibma#    notice, this list of conditions and the following disclaimer in the
13e8db04c3SNick Hibma#    documentation and/or other materials provided with the distribution.
14e8db04c3SNick Hibma# 3. Neither the name of the University nor the names of its contributors
15e8db04c3SNick Hibma#    may be used to endorse or promote products derived from this software
16e8db04c3SNick Hibma#    without specific prior written permission.
17e8db04c3SNick Hibma#
18e8db04c3SNick Hibma# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19e8db04c3SNick Hibma# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20e8db04c3SNick Hibma# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21e8db04c3SNick Hibma# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22e8db04c3SNick Hibma# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23e8db04c3SNick Hibma# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24e8db04c3SNick Hibma# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25e8db04c3SNick Hibma# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26e8db04c3SNick Hibma# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27e8db04c3SNick Hibma# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28e8db04c3SNick Hibma# SUCH DAMAGE.
29e8db04c3SNick Hibma#
30e8db04c3SNick Hibma
317dd1f932SAlex Richardsonset -e
327dd1f932SAlex Richardson
33e8db04c3SNick Hibmaprogname="$(basename $0 .sh)"
34e8db04c3SNick Hibmaentries_lst="/tmp/$progname.entries.lst"
35e8db04c3SNick Hibmaentries2_lst="/tmp/$progname.entries2.lst"
36e8db04c3SNick Hibma
37e8db04c3SNick HibmaHOOKS=3
38e8db04c3SNick HibmaHOOKSADD=42
39e8db04c3SNick HibmaITERATIONS=7
40e8db04c3SNick HibmaSUBITERATIONS=71
41e8db04c3SNick Hibma
42e8db04c3SNick Hibmafind_iface () {
43e8db04c3SNick Hibma	# Figure out the first ethernet interface
44e8db04c3SNick Hibma	ifconfig -u -l ether | awk '{print $1}'
45e8db04c3SNick Hibma}
46e8db04c3SNick Hibma
47e8db04c3SNick Hibmaloaded_modules=''
48e8db04c3SNick Hibmaload_modules () {
4965f4ff4eSAlex Richardson	for kmod in "$@"; do
50e8db04c3SNick Hibma		if ! kldstat -q -m $kmod; then
51e8db04c3SNick Hibma			test_comment "Loading $kmod..."
52e8db04c3SNick Hibma			kldload $kmod
53e8db04c3SNick Hibma			loaded_modules="$loaded_modules $kmod"
54e8db04c3SNick Hibma		fi
55e8db04c3SNick Hibma	done
56e8db04c3SNick Hibma}
57e8db04c3SNick Hibmaunload_modules () {
58e8db04c3SNick Hibma	for kmod in $loaded_modules; do
59e8db04c3SNick Hibma		# These cannot be unloaded
60e8db04c3SNick Hibma		test $kmod = 'ng_ether' -o $kmod = 'ng_socket' \
61e8db04c3SNick Hibma			&& continue
62e8db04c3SNick Hibma
63e8db04c3SNick Hibma		test_comment "Unloading $kmod..."
64e8db04c3SNick Hibma		kldunload $kmod
65e8db04c3SNick Hibma	done
66e8db04c3SNick Hibma	loaded_modules=''
67e8db04c3SNick Hibma}
68e8db04c3SNick Hibma
69e8db04c3SNick Hibmaconfigure_nodes () {
70e8db04c3SNick Hibma	ngctl mkpeer $eth: macfilter lower ether					# Connect the lower hook of the ether instance $eth to the ether hook of a new macfilter instance
71e8db04c3SNick Hibma	ngctl name $eth:lower MF							# Give the macfilter instance a name
72e8db04c3SNick Hibma	ngctl mkpeer $eth: one2many upper one						# Connect the upper hook of the ether instance $eth to the one hook of a new one2many instance
73e8db04c3SNick Hibma	ngctl name $eth:upper O2M							# Give the one2many instance a name
74e8db04c3SNick Hibma	ngctl msg O2M: setconfig "{ xmitAlg=3 failAlg=1 enabledLinks=[ 1 1 ] }"		# XMIT_FAILOVER -> send replies always out many0
75e8db04c3SNick Hibma
76e8db04c3SNick Hibma	ngctl connect MF: O2M: default many0						# Connect macfilter:default to the many0 hook of a one2many instance
77e8db04c3SNick Hibma	for i in $(seq 1 1 $HOOKS); do
78e8db04c3SNick Hibma		ngctl connect MF: O2M: out$i many$i
79e8db04c3SNick Hibma	done
80e8db04c3SNick Hibma}
81e8db04c3SNick Hibma
82e8db04c3SNick Hibmadeconfigure_nodes () {
83e8db04c3SNick Hibma	ngctl shutdown MF:
84e8db04c3SNick Hibma	ngctl shutdown O2M:
85e8db04c3SNick Hibma}
86e8db04c3SNick Hibma
87e8db04c3SNick Hibmacleanup () {
88e8db04c3SNick Hibma	test_title "Cleaning up"
89e8db04c3SNick Hibma
90e8db04c3SNick Hibma	deconfigure_nodes
91e8db04c3SNick Hibma	unload_modules
92e8db04c3SNick Hibma
93e8db04c3SNick Hibma	rm -f $entries_lst $entries2_lst
94e8db04c3SNick Hibma}
95e8db04c3SNick Hibma
96e8db04c3SNick HibmaTSTNR=0
97e8db04c3SNick HibmaTSTFAILS=0
98e8db04c3SNick HibmaTSTSUCCS=0
99e8db04c3SNick Hibma
10065f4ff4eSAlex Richardson_test_next () { TSTNR=$((TSTNR + 1)); }
10165f4ff4eSAlex Richardson_test_succ () { TSTSUCCS=$((TSTSUCCS + 1)); }
10265f4ff4eSAlex Richardson_test_fail () { TSTFAILS=$((TSTFAILS + 1)); }
103e8db04c3SNick Hibma
104e8db04c3SNick Hibmatest_cnt () { echo "1..${1:-$TSTNR}"; }
105e8db04c3SNick Hibmatest_title () {
106e8db04c3SNick Hibma	local msg="$1"
107e8db04c3SNick Hibma
108e8db04c3SNick Hibma	printf '### %s ' "$msg"
10965f4ff4eSAlex Richardson	printf '#%.0s' $(seq $((80 - ${#msg} - 5)))
110e8db04c3SNick Hibma	printf "\n"
111e8db04c3SNick Hibma}
112e8db04c3SNick Hibmatest_comment () { echo "# $1"; }
113e8db04c3SNick Hibmatest_bailout () { echo "Bail out!${1+:- $1}"; exit 1; }
114e8db04c3SNick Hibmatest_bail_on_fail () { test $TSTFAILS -eq 0 || test_bailout $1; }
115e8db04c3SNick Hibmatest_ok () {
116e8db04c3SNick Hibma	local msg="$1"
117e8db04c3SNick Hibma
118e8db04c3SNick Hibma	_test_next
119e8db04c3SNick Hibma	_test_succ
120e8db04c3SNick Hibma	echo "ok $TSTNR - $msg"
121e8db04c3SNick Hibma
122e8db04c3SNick Hibma	return 0
123e8db04c3SNick Hibma}
124e8db04c3SNick Hibmatest_not_ok () {
125e8db04c3SNick Hibma	local msg="$1"
126e8db04c3SNick Hibma
127e8db04c3SNick Hibma	_test_next
1287dd1f932SAlex Richardson	_test_fail
129e8db04c3SNick Hibma	echo "not ok $TSTNR - $msg"
130e8db04c3SNick Hibma
131e8db04c3SNick Hibma	return 1
132e8db04c3SNick Hibma}
133e8db04c3SNick Hibmatest_eq () {
134e8db04c3SNick Hibma	local v1="$1" v2="$2" msg="$3"
135e8db04c3SNick Hibma
136e8db04c3SNick Hibma	if [ "$v1" = "$v2" ]; then
137e8db04c3SNick Hibma		test_ok "$v1 $msg"
138e8db04c3SNick Hibma	else
139e8db04c3SNick Hibma		test_not_ok "$v1 vs $v2 $msg"
140e8db04c3SNick Hibma	fi
141e8db04c3SNick Hibma}
142e8db04c3SNick Hibmatest_ne () {
143e8db04c3SNick Hibma	local v1="$1" v2="$2" msg="$3"
144e8db04c3SNick Hibma
145e8db04c3SNick Hibma	if [ "$v1" != "$v2" ]; then
146e8db04c3SNick Hibma		test_ok "$v1 $msg"
147e8db04c3SNick Hibma	else
148e8db04c3SNick Hibma		test_not_ok "$v1 vs $v2 $msg"
149e8db04c3SNick Hibma	fi
150e8db04c3SNick Hibma}
151e8db04c3SNick Hibmatest_lt () {
152e8db04c3SNick Hibma	local v1=$1 v2=$2 msg="$3"
153e8db04c3SNick Hibma
154e8db04c3SNick Hibma	if [ "$v1" -lt "$v2" ]; then
155e8db04c3SNick Hibma		test_ok "$v1 $msg"
156e8db04c3SNick Hibma	else
157e8db04c3SNick Hibma		test_not_ok "$v1 >= $v2 $msg"
158e8db04c3SNick Hibma	fi
159e8db04c3SNick Hibma}
160e8db04c3SNick Hibmatest_le () {
161e8db04c3SNick Hibma	local v1=$1 v2=$2 msg="$3"
162e8db04c3SNick Hibma
163e8db04c3SNick Hibma	if [ "$v1" -le "$v2" ]; then
164e8db04c3SNick Hibma		test_ok "$v1 $msg"
165e8db04c3SNick Hibma	else
166e8db04c3SNick Hibma		test_not_ok "$v1 >= $v2 $msg"
167e8db04c3SNick Hibma	fi
168e8db04c3SNick Hibma}
169e8db04c3SNick Hibmatest_gt () {
170e8db04c3SNick Hibma	local v1=$1 v2=$2 msg="$3"
171e8db04c3SNick Hibma
172e8db04c3SNick Hibma	if [ "$v1" -gt "$v2" ]; then
173e8db04c3SNick Hibma		test_ok "$v1 $msg"
174e8db04c3SNick Hibma	else
175e8db04c3SNick Hibma		test_not_ok "$v1 <= $v2 $msg"
176e8db04c3SNick Hibma	fi
177e8db04c3SNick Hibma}
178e8db04c3SNick Hibmatest_ge () {
179e8db04c3SNick Hibma	local v1=$1 v2=$2 msg="$3"
180e8db04c3SNick Hibma
181e8db04c3SNick Hibma	if [ "$v1" -ge "$v2" ]; then
182e8db04c3SNick Hibma		test_ok "$v1 $msg"
183e8db04c3SNick Hibma	else
184e8db04c3SNick Hibma		test_not_ok "$v1 <= $v2 $msg"
185e8db04c3SNick Hibma	fi
186e8db04c3SNick Hibma}
1877dd1f932SAlex Richardsontest_failure () {
1887dd1f932SAlex Richardson	msg=$1
1897dd1f932SAlex Richardson	shift
1907dd1f932SAlex Richardson	if ! "$@"; then
1917dd1f932SAlex Richardson		test_ok "$msg - \"$@\" failed as expected"
1927dd1f932SAlex Richardson	else
1937dd1f932SAlex Richardson		test_not_ok "$msg - expected \"$@\" to fail but succeeded"
1947dd1f932SAlex Richardson	fi
1957dd1f932SAlex Richardson}
1967dd1f932SAlex Richardsontest_success () {
1977dd1f932SAlex Richardson	msg=$1
1987dd1f932SAlex Richardson	shift
1997dd1f932SAlex Richardson	if ! "$@"; then
2007dd1f932SAlex Richardson		test_not_ok "$msg - \"$@\" failed unexpectedly"
2017dd1f932SAlex Richardson	else
2027dd1f932SAlex Richardson		test_ok "$msg - \"$@\" succeeded"
2037dd1f932SAlex Richardson	fi
2047dd1f932SAlex Richardson}
205e8db04c3SNick Hibma
206e8db04c3SNick Hibmagethooks () {
207e8db04c3SNick Hibma	ngctl msg MF: 'gethooks' \
208e8db04c3SNick Hibma		| perl -ne '$h{$1}=1 while s/hookname="(.*?)"//; sub END {print join(":", sort keys %h)."\n"}'
209e8db04c3SNick Hibma}
210e8db04c3SNick Hibma
211e8db04c3SNick Hibmacountmacs () {
212e8db04c3SNick Hibma	local hookname=${1:-'[^"]*'}
213e8db04c3SNick Hibma
214e8db04c3SNick Hibma	ngctl msg MF: 'gethooks' \
215e8db04c3SNick Hibma		| perl -ne 'sub BEGIN {$c=0} $c += $1 while s/hookname="'$hookname'" hookid=\d+ maccnt=(\d+)//; sub END {print "$c\n"}'
216e8db04c3SNick Hibma}
217e8db04c3SNick Hibmarandomedge () {
218e8db04c3SNick Hibma	local edge="out$(seq 0 1 $HOOKS | sort -R | head -1)"
219e8db04c3SNick Hibma	test $edge = 'out0' \
220e8db04c3SNick Hibma		&& echo default \
221e8db04c3SNick Hibma		|| echo $edge
222e8db04c3SNick Hibma}
223e8db04c3SNick Hibmagenmac () {
224e8db04c3SNick Hibma	echo "00:00:00:00:$(printf "%02x" $1):$(printf "%02x" $2)"
225e8db04c3SNick Hibma}
226e8db04c3SNick Hibma
227e8db04c3SNick Hibma
228e8db04c3SNick Hibma
229e8db04c3SNick Hibma################################################################################
230e8db04c3SNick Hibma### Start ######################################################################
231e8db04c3SNick Hibma################################################################################
232e8db04c3SNick Hibma
233e8db04c3SNick Hibmatest_title "Setting up system..."
234e8db04c3SNick Hibmaload_modules netgraph ng_socket ng_ether ng_macfilter ng_one2many
235e8db04c3SNick Hibmaeth=$(find_iface)
2367dd1f932SAlex Richardsonif [ -z "$eth" ]; then
2376f30d1c8SAlex Richardson	echo "1..0 # SKIP could not find a valid interface"
2387dd1f932SAlex Richardson	echo "Available interfaces:"
2397dd1f932SAlex Richardson	ifconfig
2407dd1f932SAlex Richardson	exit 1
2417dd1f932SAlex Richardsonfi
242e8db04c3SNick Hibmatest_comment "Using $eth..."
243e8db04c3SNick Hibma
244e8db04c3SNick Hibma
245e8db04c3SNick Hibmatest_title "Configuring netgraph nodes..."
246e8db04c3SNick Hibmaconfigure_nodes
247e8db04c3SNick Hibma
248e8db04c3SNick Hibmatrap 'exit 99' 1 2 3 13 14 15
249e8db04c3SNick Hibmatrap 'cleanup' EXIT
250e8db04c3SNick Hibma
251e8db04c3SNick Hibmacreated_hooks=$(gethooks)
252e8db04c3SNick Hibmarc=0
253e8db04c3SNick Hibma
25465f4ff4eSAlex Richardson# Update this number when adding new tests
25565f4ff4eSAlex Richardsontest_cnt 46
256e8db04c3SNick Hibma
257e8db04c3SNick Hibma
258e8db04c3SNick Hibma################################################################################
259e8db04c3SNick Hibma### Tests ######################################################################
260e8db04c3SNick Hibma################################################################################
261e8db04c3SNick Hibma
262e8db04c3SNick Hibma################################################################################
263e8db04c3SNick Hibmatest_title "Test: Duplicate default hook"
2647dd1f932SAlex Richardsontest_failure "duplicate connect of default hook" ngctl connect MF: O2M: default many99
265e8db04c3SNick Hibma
266e8db04c3SNick Hibma################################################################################
267e8db04c3SNick Hibmatest_title "Test: Add and remove hooks"
2687dd1f932SAlex Richardsontest_success "connect MF:xxx1 to O2M:many$((HOOKS + 1))" ngctl connect MF: O2M: xxx1 many$((HOOKS + 1))
2697dd1f932SAlex Richardsontest_success "connect MF:xxx2 to O2M:many$((HOOKS + 2))" ngctl connect MF: O2M: xxx2 many$((HOOKS + 2))
2707dd1f932SAlex Richardsontest_success "connect MF:xxx3 to O2M:many$((HOOKS + 3))" ngctl connect MF: O2M: xxx3 many$((HOOKS + 3))
271e8db04c3SNick Hibmahooks=$(gethooks)
272e8db04c3SNick Hibmatest_eq $created_hooks:xxx1:xxx2:xxx3 $hooks 'hooks after adding xxx1-3'
273e8db04c3SNick Hibma
2747dd1f932SAlex Richardsontest_success "rmhook MF:xxx$i" ngctl rmhook MF: xxx1
275e8db04c3SNick Hibmahooks=$(gethooks)
276e8db04c3SNick Hibmatest_eq $created_hooks:xxx2:xxx3 $hooks 'hooks after removing xxx1'
2777dd1f932SAlex Richardsontest_success "rmhook MF:xxx$i" ngctl rmhook MF: xxx2
278e8db04c3SNick Hibmahooks=$(gethooks)
279e8db04c3SNick Hibmatest_eq $created_hooks:xxx3 $hooks 'hooks after removing xxx2'
2807dd1f932SAlex Richardsontest_success "rmhook MF:xxx$i" ngctl rmhook MF: xxx3
281e8db04c3SNick Hibmahooks=$(gethooks)
282e8db04c3SNick Hibmatest_eq $created_hooks $hooks 'hooks after removing xxx3'
283e8db04c3SNick Hibma
284e8db04c3SNick Hibmatest_bail_on_fail
285e8db04c3SNick Hibma
286e8db04c3SNick Hibma################################################################################
287e8db04c3SNick Hibmatest_title "Test: Add many hooks"
288e8db04c3SNick Hibmaadded_hooks=""
289e8db04c3SNick Hibmafor i in $(seq 10 1 $HOOKSADD); do
290e8db04c3SNick Hibma	added_hooks="$added_hooks:xxx$i"
29165f4ff4eSAlex Richardson	ngctl connect MF: O2M: xxx$i many$((HOOKS + i))
292e8db04c3SNick Hibmadone
293e8db04c3SNick Hibmahooks=$(gethooks)
294e8db04c3SNick Hibmatest_eq $created_hooks$added_hooks $hooks 'hooks after adding many hooks'
295e8db04c3SNick Hibma
296e8db04c3SNick Hibmafor h in $(echo $added_hooks | perl -ne 'chomp; %h=map { $_=>1 } split /:/; print "$_\n" for grep {$_} keys %h'); do
297e8db04c3SNick Hibma	ngctl rmhook MF: $h
298e8db04c3SNick Hibmadone
299e8db04c3SNick Hibmahooks=$(gethooks)
300e8db04c3SNick Hibmatest_eq $created_hooks $hooks 'hooks after adding many hooks'
301e8db04c3SNick Hibma
302e8db04c3SNick Hibmatest_bail_on_fail
303e8db04c3SNick Hibma
304e8db04c3SNick Hibma
305e8db04c3SNick Hibma################################################################################
306e8db04c3SNick Hibmatest_title "Test: Adding many MACs..."
307e8db04c3SNick HibmaI=1
308e8db04c3SNick Hibmafor i in $(seq $ITERATIONS | sort -R); do
30965f4ff4eSAlex Richardson	test_comment "Iteration $I/$ITERATIONS..."
310e8db04c3SNick Hibma	for j in $(seq 0 1 $SUBITERATIONS); do
311e8db04c3SNick Hibma		test $i = 2 && edge='out2' || edge='out1'
312e8db04c3SNick Hibma		ether=$(genmac $j $i)
313e8db04c3SNick Hibma
314e8db04c3SNick Hibma		ngctl msg MF: 'direct' "{ hookname=\"$edge\" ether=$ether }"
315e8db04c3SNick Hibma	done
31665f4ff4eSAlex Richardson	I=$((I + 1))
317e8db04c3SNick Hibmadone
318e8db04c3SNick Hibma
319e8db04c3SNick Hibman=$(countmacs out1)
32065f4ff4eSAlex Richardsonn2=$(( ( ITERATIONS - 1 ) * ( SUBITERATIONS + 1 ) ))
321e8db04c3SNick Hibmatest_eq $n $n2 'MACs in table for out1'
322e8db04c3SNick Hibman=$(countmacs out2)
32365f4ff4eSAlex Richardsonn2=$(( 1 * ( SUBITERATIONS + 1 ) ))
324e8db04c3SNick Hibmatest_eq $n $n2 'MACs in table for out2'
325e8db04c3SNick Hibman=$(countmacs out3)
326e8db04c3SNick Hibman2=0
327e8db04c3SNick Hibmatest_eq $n $n2 'MACs in table for out3'
328e8db04c3SNick Hibma
329e8db04c3SNick Hibmatest_bail_on_fail
330e8db04c3SNick Hibma
331e8db04c3SNick Hibma
332e8db04c3SNick Hibma################################################################################
333e8db04c3SNick Hibmatest_title "Test: Changing hooks for MACs..."
334e8db04c3SNick Hibmafor i in $(seq $ITERATIONS); do
335e8db04c3SNick Hibma	edge='out3'
336e8db04c3SNick Hibma	ether=$(genmac 0 $i)
337e8db04c3SNick Hibma
338e8db04c3SNick Hibma	ngctl msg MF: 'direct' "{ hookname=\"$edge\" ether=$ether }"
339e8db04c3SNick Hibmadone
340e8db04c3SNick Hibma
341e8db04c3SNick Hibman=$(countmacs out1)
34265f4ff4eSAlex Richardsonn2=$(( ( ITERATIONS - 1 ) * ( SUBITERATIONS + 1 - 1 ) ))
343e8db04c3SNick Hibmatest_eq $n $n2 'MACs in table for out1'
344e8db04c3SNick Hibman=$(countmacs out2)
34565f4ff4eSAlex Richardsonn2=$(( 1 * ( SUBITERATIONS + 1 - 1 ) ))
346e8db04c3SNick Hibmatest_eq $n $n2 'MACs in table for out2'
347e8db04c3SNick Hibman=$(countmacs out3)
348e8db04c3SNick Hibman2=$ITERATIONS
349e8db04c3SNick Hibmatest_eq $n $n2 'MACs in table for out3'
350e8db04c3SNick Hibma
351e8db04c3SNick Hibmatest_bail_on_fail
352e8db04c3SNick Hibma
353e8db04c3SNick Hibma
354e8db04c3SNick Hibma################################################################################
355e8db04c3SNick Hibmatest_title "Test: Removing all MACs one by one..."
356e8db04c3SNick HibmaI=1
357e8db04c3SNick Hibmafor i in $(seq $ITERATIONS | sort -R); do
35865f4ff4eSAlex Richardson	test_comment "Iteration $I/$ITERATIONS..."
359e8db04c3SNick Hibma	for j in $(seq 0 1 $SUBITERATIONS | sort -R); do
360e8db04c3SNick Hibma		edge="default"
361e8db04c3SNick Hibma		ether=$(genmac $j $i)
362e8db04c3SNick Hibma
363e8db04c3SNick Hibma		ngctl msg MF: 'direct' "{ hookname=\"$edge\" ether=$ether }"
364e8db04c3SNick Hibma	done
365e8db04c3SNick Hibma	I=$(($I + 1))
366e8db04c3SNick Hibmadone
367e8db04c3SNick Hibman=$(countmacs)
368e8db04c3SNick Hibman2=0
369e8db04c3SNick Hibmatest_eq $n $n2 'MACs in table'
370e8db04c3SNick Hibma
371e8db04c3SNick Hibmatest_bail_on_fail
372e8db04c3SNick Hibma
373e8db04c3SNick Hibma
374e8db04c3SNick Hibma################################################################################
375e8db04c3SNick Hibmatest_title "Test: Randomly adding MACs on random hooks..."
376e8db04c3SNick Hibmarm -f $entries_lst
377e8db04c3SNick Hibmafor i in $(seq $ITERATIONS); do
37865f4ff4eSAlex Richardson	test_comment "Iteration $i/$ITERATIONS..."
379e8db04c3SNick Hibma	for j in $(seq 0 1 $SUBITERATIONS | sort -R); do
380e8db04c3SNick Hibma		edge=$(randomedge)
381e8db04c3SNick Hibma		ether=$(genmac $j $i)
382e8db04c3SNick Hibma
383e8db04c3SNick Hibma		ngctl msg MF: 'direct' "{ hookname=\"$edge\" ether=$ether }"
384e8db04c3SNick Hibma
385e8db04c3SNick Hibma		echo $ether $edge >> $entries_lst
386e8db04c3SNick Hibma	done
387e8db04c3SNick Hibma
388e8db04c3SNick Hibma	n=$(countmacs)
389e8db04c3SNick Hibmadone
390e8db04c3SNick Hibma
391e8db04c3SNick Hibman=$(countmacs out1)
392e8db04c3SNick Hibman2=$(grep -c ' out1' $entries_lst)
393e8db04c3SNick Hibmatest_eq $n $n2 'MACs in table for out1'
394e8db04c3SNick Hibman=$(countmacs out2)
395e8db04c3SNick Hibman2=$(grep -c ' out2' $entries_lst)
396e8db04c3SNick Hibmatest_eq $n $n2 'MACs in table for out2'
397e8db04c3SNick Hibman=$(countmacs out3)
398e8db04c3SNick Hibman2=$(grep -c ' out3' $entries_lst)
399e8db04c3SNick Hibmatest_eq $n $n2 'MACs in table for out3'
400e8db04c3SNick Hibma
401e8db04c3SNick Hibmatest_bail_on_fail
402e8db04c3SNick Hibma
403e8db04c3SNick Hibma
404e8db04c3SNick Hibma################################################################################
405e8db04c3SNick Hibmatest_title "Test: Randomly changing MAC assignments..."
406e8db04c3SNick Hibmarm -f $entries2_lst
407e8db04c3SNick Hibmafor i in $(seq $ITERATIONS); do
40865f4ff4eSAlex Richardson	test_comment "Iteration $i/$ITERATIONS..."
409e8db04c3SNick Hibma	cat $entries_lst | while read ether edge; do
410e8db04c3SNick Hibma		edge2=$(randomedge)
411e8db04c3SNick Hibma
412e8db04c3SNick Hibma		ngctl msg MF: 'direct' "{ hookname=\"$edge2\" ether=$ether }"
413e8db04c3SNick Hibma
414e8db04c3SNick Hibma		echo $ether $edge2 >> $entries2_lst
415e8db04c3SNick Hibma	done
416e8db04c3SNick Hibma
417e8db04c3SNick Hibma	n=$(countmacs out1)
418e8db04c3SNick Hibma	n2=$(grep -c ' out1' $entries2_lst)
419e8db04c3SNick Hibma	test_eq $n $n2 'MACs in table for out1'
420e8db04c3SNick Hibma	n=$(countmacs out2)
421e8db04c3SNick Hibma	n2=$(grep -c ' out2' $entries2_lst)
422e8db04c3SNick Hibma	test_eq $n $n2 'MACs in table for out2'
423e8db04c3SNick Hibma	n=$(countmacs out3)
424e8db04c3SNick Hibma	n2=$(grep -c ' out3' $entries2_lst)
425e8db04c3SNick Hibma	test_eq $n $n2 'MACs in table for out3'
426e8db04c3SNick Hibma
427e8db04c3SNick Hibma	test_bail_on_fail
428e8db04c3SNick Hibma
429e8db04c3SNick Hibma	mv $entries2_lst $entries_lst
430e8db04c3SNick Hibmadone
431e8db04c3SNick Hibma
432e8db04c3SNick Hibma
433e8db04c3SNick Hibma################################################################################
434e8db04c3SNick Hibmatest_title "Test: Resetting macfilter..."
4357dd1f932SAlex Richardsontest_success "**** reset failed" ngctl msg MF: reset
436e8db04c3SNick Hibmatest_eq $(countmacs) 0 'MACs in table'
437e8db04c3SNick Hibma
438e8db04c3SNick Hibmatest_bail_on_fail
439e8db04c3SNick Hibma
440e8db04c3SNick Hibma
441e8db04c3SNick Hibma################################################################################
442e8db04c3SNick Hibma
443e8db04c3SNick Hibmaexit 0
444