1#!/bin/ksh 2# $OpenBSD: maxprefixout.sh,v 1.3 2024/08/28 13:14:39 claudio 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=10.12.57.1 16PAIR2IP=10.12.57.2 17 18error_notify() { 19 echo cleanup 20 pkill -T ${RDOMAIN1} bgpd || true 21 pkill -T ${RDOMAIN2} bgpd || true 22 sleep 1 23 ifconfig ${PAIR2} destroy || true 24 ifconfig ${PAIR1} destroy || true 25 route -qn -T ${RDOMAIN1} flush || true 26 route -qn -T ${RDOMAIN2} flush || true 27 ifconfig lo${RDOMAIN1} destroy || true 28 ifconfig lo${RDOMAIN2} destroy || true 29 if [ $1 -ne 0 ]; then 30 echo FAILED 31 exit 1 32 else 33 echo SUCCESS 34 fi 35} 36 37if [ "$(id -u)" -ne 0 ]; then 38 echo need root privileges >&2 39 exit 1 40fi 41 42trap 'error_notify $?' EXIT 43 44echo check if rdomains are busy 45for n in ${RDOMAINS}; do 46 if /sbin/ifconfig | grep -v "^lo${n}:" | grep " rdomain ${n} "; then 47 echo routing domain ${n} is already used >&2 48 exit 1 49 fi 50done 51 52echo check if interfaces are busy 53for n in ${PAIRS}; do 54 /sbin/ifconfig "${n}" >/dev/null 2>&1 && \ 55 ( echo interface ${n} is already used >&2; exit 1 ) 56done 57 58set -x 59 60echo setup 61ifconfig ${PAIR1} rdomain ${RDOMAIN1} ${PAIR1IP}/30 up 62ifconfig ${PAIR2} rdomain ${RDOMAIN2} ${PAIR2IP}/30 up 63ifconfig ${PAIR1} patch ${PAIR2} 64ifconfig lo${RDOMAIN1} inet 127.0.0.1/8 65ifconfig lo${RDOMAIN2} inet 127.0.0.1/8 66 67echo test1: run bgpds 68sed -e 's/#MAX-PREFIX#/max-prefix 2 out/' \ 69 ${BGPDCONFIGDIR}/bgpd.maxprefixout.rdomain1.conf > \ 70 ./bgpd.maxprefixout.rdomain1.conf 71route -T ${RDOMAIN1} exec ${BGPD} \ 72 -v -f ./bgpd.maxprefixout.rdomain1.conf 73route -T ${RDOMAIN2} exec ${BGPD} \ 74 -v -f ${BGPDCONFIGDIR}/bgpd.maxprefixout.rdomain2.conf 75 76sleep 1 77route -T ${RDOMAIN1} exec bgpctl nei RDOMAIN2 up 78sleep 1 79 80echo test1: add two networks 81route -T ${RDOMAIN1} exec bgpctl network add 10.12.58.0/24 82route -T ${RDOMAIN1} exec bgpctl network add 10.12.59.0/24 83sleep 1 84route -T ${RDOMAIN1} exec bgpctl show nei | \ 85 awk '/^ Prefixes/ { if ($2 == "2") { print "ok"; ok=1; exit 0; } } 86 END { if (ok != 1) { print "bad bgpctl output"; exit 2; } }' 87 88echo test1: add another network 89route -T ${RDOMAIN1} exec bgpctl network add 10.12.60.0/24 90sleep 1 91route -T ${RDOMAIN1} exec bgpctl show nei | \ 92 grep '^ Last error sent: Cease, sent max-prefix exceeded' 93 94echo test1: cleanup 95pkill -T ${RDOMAIN1} bgpd || true 96pkill -T ${RDOMAIN2} bgpd || true 97sleep 1 98 99echo test2: run bgpds 100sed -e 's/#MAX-PREFIX#/max-prefix 20 out/' \ 101 ${BGPDCONFIGDIR}/bgpd.maxprefixout.rdomain1.conf > \ 102 ./bgpd.maxprefixout.rdomain1.conf 103route -T ${RDOMAIN1} exec ${BGPD} \ 104 -v -f ./bgpd.maxprefixout.rdomain1.conf 105route -T ${RDOMAIN2} exec ${BGPD} \ 106 -v -f ${BGPDCONFIGDIR}/bgpd.maxprefixout.rdomain2.conf 107 108sleep 1 109route -T ${RDOMAIN1} exec bgpctl nei RDOMAIN2 up 110sleep 1 111 112echo test2: add three networks 113route -T ${RDOMAIN1} exec bgpctl network add 10.12.58.0/24 114route -T ${RDOMAIN1} exec bgpctl network add 10.12.59.0/24 115route -T ${RDOMAIN1} exec bgpctl network add 10.12.60.0/24 116sleep 1 117route -T ${RDOMAIN1} exec bgpctl show nei | \ 118 awk '/^ Prefixes/ { if ($2 == "3") { print "ok"; ok=1; exit 0; } } 119 END { if (ok != 1) { print "bad bgpctl output"; exit 2; } }' 120 121echo test2: reload config 122sed -e 's/#MAX-PREFIX#/max-prefix 2 out/' \ 123 ${BGPDCONFIGDIR}/bgpd.maxprefixout.rdomain1.conf > \ 124 ./bgpd.maxprefixout.rdomain1.conf 125route -T ${RDOMAIN1} exec bgpctl reload 126sleep 1 127route -T ${RDOMAIN1} exec bgpctl show nei | \ 128 grep '^ Last error sent: Cease, sent max-prefix exceeded' 129