1#!/bin/ksh
2#	$OpenBSD: lladdr.sh,v 1.2 2023/10/16 12:49:15 claudio Exp $
3
4set -e
5
6BGPD=$1
7BGPDCONFIGDIR=$2
8RDOMAIN1=$3
9RDOMAIN2=$4
10PAIR1=$5
11PAIR2=$6
12GIF1=gif${RDOMAIN1}
13GIF2=gif${RDOMAIN2}
14
15RDOMAINS="${RDOMAIN1} ${RDOMAIN2}"
16IFACES="${PAIR1} ${PAIR2} ${GIF1} ${GIF2}"
17PAIR1IP6=fe80::c0fe:1
18PAIR2IP6=fe80::c0fe:2
19GIF1IP6=fe80::beef:1
20GIF2IP6=fe80::beef:2
21
22error_notify() {
23	set -x
24	echo cleanup
25	pfctl -q -t bgpd_integ_test -T kill
26	pkill -T ${RDOMAIN1} bgpd || true
27	pkill -T ${RDOMAIN2} bgpd || true
28	sleep 1
29	ifconfig ${GIF1} destroy || true
30	ifconfig ${GIF2} destroy || true
31	ifconfig ${PAIR1} destroy || true
32	ifconfig ${PAIR2} destroy || true
33	route -qn -T ${RDOMAIN1} flush || true
34	route -qn -T ${RDOMAIN2} flush || true
35	ifconfig lo${RDOMAIN1} destroy || true
36	ifconfig lo${RDOMAIN2} destroy || true
37	if [ $1 -ne 0 ]; then
38		echo FAILED
39		exit 1
40	else
41		echo SUCCESS
42	fi
43}
44
45if [ "$(id -u)" -ne 0 ]; then 
46	echo need root privileges >&2
47	exit 1
48fi
49
50trap 'error_notify $?' EXIT
51
52echo check if rdomains are busy
53for n in ${RDOMAINS}; do
54	if /sbin/ifconfig | grep -v "^lo${n}:" | grep " rdomain ${n} "; then
55		echo routing domain ${n} is already used >&2
56		exit 1
57	fi
58done
59
60echo check if interfaces are busy
61for n in ${IFACES}; do
62	/sbin/ifconfig "${n}" >/dev/null 2>&1 && \
63	    ( echo interface ${n} is already used >&2; exit 1 )
64done
65
66set -x
67
68echo setup
69ifconfig ${PAIR1} rdomain ${RDOMAIN1} up
70ifconfig ${PAIR2} rdomain ${RDOMAIN2} up
71ifconfig ${PAIR1} inet6 ${PAIR1IP6}/64
72ifconfig ${PAIR2} inet6 ${PAIR2IP6}/64
73ifconfig ${PAIR1} patch ${PAIR2}
74ifconfig ${GIF1} rdomain ${RDOMAIN1} tunneldomain ${RDOMAIN1}
75ifconfig ${GIF2} rdomain ${RDOMAIN2} tunneldomain ${RDOMAIN2}
76ifconfig ${GIF1} tunnel ${PAIR1IP6}%${PAIR1} ${PAIR2IP6}%${PAIR1}
77ifconfig ${GIF2} tunnel ${PAIR2IP6}%${PAIR2} ${PAIR1IP6}%${PAIR2}
78ifconfig ${GIF1} inet6 ${GIF1IP6}/128 ${GIF2IP6}
79ifconfig ${GIF2} inet6 ${GIF2IP6}/128 ${GIF1IP6}
80
81echo run bgpds
82route -T ${RDOMAIN1} exec ${BGPD} \
83	-v -f ${BGPDCONFIGDIR}/bgpd.lladdr.rdomain1.conf
84route -T ${RDOMAIN2} exec ${BGPD} \
85	-v -f ${BGPDCONFIGDIR}/bgpd.lladdr.rdomain2.conf
86
87sleep 1
88
89route -T12 exec bgpctl nei RDOMAIN1 up
90route -T12 exec bgpctl nei RDOMAIN1_2 up
91
92sleep 2
93
94route -T11 exec bgpctl show rib | tee lladdr.rdomain1.out
95route -T11 exec bgpctl show fib | grep -v 'link#' | tee -a lladdr.rdomain1.out
96route -T11 get 2001:db8:2::/48 | grep -v "if address" | tee -a lladdr.rdomain1.out
97route -T11 get 2001:db8:12::/48 | grep -v "if address" | tee -a lladdr.rdomain1.out
98
99route -T12 exec bgpctl show rib | tee lladdr.rdomain2.out
100route -T12 exec bgpctl show fib | grep -v 'link#' | tee -a lladdr.rdomain2.out
101route -T12 get 2001:db8:1::/48 | grep -v "if address" | tee -a lladdr.rdomain2.out
102route -T12 get 2001:db8:11::/48 | grep -v "if address" | tee -a lladdr.rdomain2.out
103
104sleep .2
105diff -u ${BGPDCONFIGDIR}/lladdr.rdomain1.ok lladdr.rdomain1.out
106diff -u ${BGPDCONFIGDIR}/lladdr.rdomain2.ok lladdr.rdomain2.out
107echo OK
108
109exit 0
110