1#!/bin/ksh
2#	$OpenBSD: ixp.sh,v 1.2 2024/01/28 12:36:21 anton Exp $
3
4set -e
5
6BGPD=$1
7BGPDCONFIGDIR=$2
8RDOMAIN1=$3
9RDOMAIN2=$4
10PAIR1=$5
11PAIR2=$6
12
13RDOMAINS="${RDOMAIN1} ${RDOMAIN2}"
14PAIRS="${PAIR1} ${PAIR2}"
15PAIR1IP=192.0.2.2
16PAIR2IP=192.0.2.11
17PAIR2IP2=192.0.2.21
18PAIR2IP3=192.0.2.31
19PAIR2IP4=192.0.2.41
20
21error_notify() {
22	echo cleanup
23	pfctl -q -t bgpd_integ_test -T kill
24	pkill -T ${RDOMAIN1} bgpd || true
25	pkill -T ${RDOMAIN2} bgpd || true
26	sleep 1
27	ifconfig ${PAIR2} destroy || true
28	ifconfig ${PAIR1} destroy || true
29	route -qn -T ${RDOMAIN1} flush || true
30	route -qn -T ${RDOMAIN2} flush || true
31	ifconfig lo${RDOMAIN1} destroy || true
32	ifconfig lo${RDOMAIN2} destroy || true
33	if [ $1 -ne 0 ]; then
34		echo FAILED
35		exit 1
36	else
37		echo SUCCESS
38	fi
39}
40
41if [ "$(id -u)" -ne 0 ]; then
42	echo need root privileges >&2
43	exit 1
44fi
45
46. "${BGPDCONFIGDIR}/util.sh"
47
48trap 'error_notify $?' EXIT
49
50echo check if rdomains are busy
51for n in ${RDOMAINS}; do
52	if /sbin/ifconfig | grep -v "^lo${n}:" | grep " rdomain ${n} "; then
53		echo routing domain ${n} is already used >&2
54		exit 1
55	fi
56done
57
58echo check if interfaces are busy
59for n in ${PAIRS}; do
60	/sbin/ifconfig "${n}" >/dev/null 2>&1 && \
61	    ( echo interface ${n} is already used >&2; exit 1 )
62done
63
64set -x
65
66echo setup
67ifconfig ${PAIR1} rdomain ${RDOMAIN1} ${PAIR1IP}/24 up
68ifconfig ${PAIR2} rdomain ${RDOMAIN2} ${PAIR2IP}/24 up
69ifconfig ${PAIR2} alias ${PAIR2IP2}/32
70ifconfig ${PAIR2} alias ${PAIR2IP3}/32
71ifconfig ${PAIR2} alias ${PAIR2IP4}/32
72ifconfig ${PAIR1} patch ${PAIR2}
73ifconfig lo${RDOMAIN1} inet 127.0.0.1/8
74ifconfig lo${RDOMAIN2} inet 127.0.0.1/8
75
76echo run bgpds
77route -T ${RDOMAIN1} exec ${BGPD} \
78	-v -f ${BGPDCONFIGDIR}/bgpd.ixp.rdomain1.conf
79sleep 2
80route -T ${RDOMAIN2} exec ${BGPD} \
81	-v -f ${BGPDCONFIGDIR}/bgpd.ixp.rdomain2_1.conf
82route -T ${RDOMAIN2} exec ${BGPD} \
83	-v -f ${BGPDCONFIGDIR}/bgpd.ixp.rdomain2_2.conf
84route -T ${RDOMAIN2} exec ${BGPD} \
85	-v -f ${BGPDCONFIGDIR}/bgpd.ixp.rdomain2_3.conf
86route -T ${RDOMAIN2} exec ${BGPD} \
87	-v -f ${BGPDCONFIGDIR}/bgpd.ixp.rdomain2_4.conf
88
89wait_until "route -T ${RDOMAIN1} exec bgpctl show rib detail | ! cmp /dev/null -"
90route -T ${RDOMAIN1} exec bgpctl show rib detail | grep -v 'Last update:' | \
91	tee ixp.rdomain1.out
92diff -u ${BGPDCONFIGDIR}/ixp.rdomain1.ok ixp.rdomain1.out
93echo OK
94
95wait_until "route -T ${RDOMAIN2} exec bgpctl show rib detail | ! cmp /dev/null -"
96route -T ${RDOMAIN2} exec bgpctl show rib detail | grep -v 'Last update:' | \
97	tee ixp.rdomain2.out
98diff -u ${BGPDCONFIGDIR}/ixp.rdomain2.ok ixp.rdomain2.out
99echo OK
100
101exit 0
102