mirror of
https://git.proxmox.com/git/mirror_frr
synced 2026-01-04 17:20:10 +00:00
2007-10-30 Nick Hilliard <nick@inex.ie>
* bgp_main.c: Add 'listenon' argument, to pass address to bind to. * bgp_network.c: (bgp_socket) Extend to take bind address. * bgpd.c: (bgp_init) Pass stored address. * bgpd.h: (struct bgp_master) storage for bind address 2007-11-01 Paul Jakma <paul.jakma@sun.com> * tools/multiple-bgpd.sh: New, quick script to launch a bunch of bgpds.
This commit is contained in:
parent
5619f56ba3
commit
3a02d1f7fb
@ -1,3 +1,11 @@
|
||||
2007-10-30 Nick Hilliard <nick@inex.ie>
|
||||
|
||||
* bgp_main.c: Add 'listenon' argument, to pass address to bind
|
||||
to.
|
||||
* bgp_network.c: (bgp_socket) Extend to take bind address.
|
||||
* bgpd.c: (bgp_init) Pass stored address.
|
||||
* bgpd.h: (struct bgp_master) storage for bind address
|
||||
|
||||
2007-09-27 Paul Jakma <paul.jakma@sun.com>
|
||||
|
||||
* bgp_aspath.c: (assegment_normalise) remove duplicates from
|
||||
|
||||
@ -43,6 +43,7 @@ struct option longopts[] =
|
||||
{ "config_file", required_argument, NULL, 'f'},
|
||||
{ "pid_file", required_argument, NULL, 'i'},
|
||||
{ "bgp_port", required_argument, NULL, 'p'},
|
||||
{ "listenon", required_argument, NULL, 'l'},
|
||||
{ "vty_addr", required_argument, NULL, 'A'},
|
||||
{ "vty_port", required_argument, NULL, 'P'},
|
||||
{ "retain", no_argument, NULL, 'r'},
|
||||
@ -135,6 +136,7 @@ redistribution between different routing protocols.\n\n\
|
||||
-f, --config_file Set configuration file name\n\
|
||||
-i, --pid_file Set process identifier file name\n\
|
||||
-p, --bgp_port Set bgp protocol's port number\n\
|
||||
-l, --listenon Listen on specified address (implies -n)\n\
|
||||
-A, --vty_addr Set vty's bind address\n\
|
||||
-P, --vty_port Set vty's port number\n\
|
||||
-r, --retain When program terminates, retain added route by bgpd.\n\
|
||||
@ -217,7 +219,7 @@ main (int argc, char **argv)
|
||||
/* Command line argument treatment. */
|
||||
while (1)
|
||||
{
|
||||
opt = getopt_long (argc, argv, "df:i:hp:A:P:rnu:g:vC", longopts, 0);
|
||||
opt = getopt_long (argc, argv, "df:i:hp:l:A:P:rnu:g:vC", longopts, 0);
|
||||
|
||||
if (opt == EOF)
|
||||
break;
|
||||
@ -255,6 +257,9 @@ main (int argc, char **argv)
|
||||
case 'r':
|
||||
retain_mode = 1;
|
||||
break;
|
||||
case 'l':
|
||||
bm->address = optarg;
|
||||
/* listenon implies -n */
|
||||
case 'n':
|
||||
bgp_option_set (BGP_OPT_NO_FIB);
|
||||
break;
|
||||
@ -315,8 +320,8 @@ main (int argc, char **argv)
|
||||
vty_serv_sock (vty_addr, vty_port, BGP_VTYSH_PATH);
|
||||
|
||||
/* Print banner. */
|
||||
zlog_notice ("BGPd %s starting: vty@%d, bgp@%d", QUAGGA_VERSION,
|
||||
vty_port, bm->port);
|
||||
zlog_notice ("BGPd %s starting: vty@%d, bgp@%s:%d", QUAGGA_VERSION,
|
||||
vty_port, bm->address, bm->port);
|
||||
|
||||
/* Start finite state machine, here we go! */
|
||||
while (thread_fetch (master, &thread))
|
||||
|
||||
@ -282,7 +282,7 @@ bgp_getsockname (struct peer *peer)
|
||||
/* IPv6 supported version of BGP server socket setup. */
|
||||
#if defined (HAVE_IPV6) && ! defined (NRL)
|
||||
int
|
||||
bgp_socket (struct bgp *bgp, unsigned short port)
|
||||
bgp_socket (struct bgp *bgp, unsigned short port, char *address)
|
||||
{
|
||||
int ret, en;
|
||||
struct addrinfo req;
|
||||
@ -299,7 +299,7 @@ bgp_socket (struct bgp *bgp, unsigned short port)
|
||||
sprintf (port_str, "%d", port);
|
||||
port_str[sizeof (port_str) - 1] = '\0';
|
||||
|
||||
ret = getaddrinfo (NULL, port_str, &req, &ainfo);
|
||||
ret = getaddrinfo (address, port_str, &req, &ainfo);
|
||||
if (ret != 0)
|
||||
{
|
||||
zlog_err ("getaddrinfo: %s", gai_strerror (ret));
|
||||
@ -357,7 +357,7 @@ bgp_socket (struct bgp *bgp, unsigned short port)
|
||||
#else
|
||||
/* Traditional IPv4 only version. */
|
||||
int
|
||||
bgp_socket (struct bgp *bgp, unsigned short port)
|
||||
bgp_socket (struct bgp *bgp, unsigned short port, char *address)
|
||||
{
|
||||
int sock;
|
||||
int socklen;
|
||||
@ -379,6 +379,14 @@ bgp_socket (struct bgp *bgp, unsigned short port)
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = htons (port);
|
||||
socklen = sizeof (struct sockaddr_in);
|
||||
|
||||
ret = inet_aton(address, &sin.sin_addr);
|
||||
|
||||
if (ret < 1)
|
||||
{
|
||||
zlog_err("bgp_socket: could not parse ip address %s: ", address, safe_strerror (errno));
|
||||
return ret;
|
||||
}
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
|
||||
sin.sin_len = socklen;
|
||||
#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
|
||||
|
||||
@ -21,7 +21,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
#ifndef _QUAGGA_BGP_NETWORK_H
|
||||
#define _QUAGGA_BGP_NETWORK_H
|
||||
|
||||
extern int bgp_socket (struct bgp *, unsigned short);
|
||||
extern int bgp_socket (struct bgp *, unsigned short, char *);
|
||||
extern int bgp_connect (struct peer *);
|
||||
extern void bgp_getsockname (struct peer *);
|
||||
|
||||
|
||||
@ -4961,7 +4961,7 @@ bgp_init (void)
|
||||
bgp_vty_init ();
|
||||
|
||||
/* Create BGP server socket. */
|
||||
bgp_socket (NULL, bm->port);
|
||||
bgp_socket (NULL, bm->port, bm->address);
|
||||
|
||||
/* Init zebra. */
|
||||
bgp_zebra_init ();
|
||||
|
||||
@ -45,6 +45,9 @@ struct bgp_master
|
||||
/* BGP port number. */
|
||||
u_int16_t port;
|
||||
|
||||
/* Listener address */
|
||||
char *address;
|
||||
|
||||
/* BGP start time. */
|
||||
time_t start_time;
|
||||
|
||||
|
||||
55
tools/multiple-bgpd.sh
Normal file
55
tools/multiple-bgpd.sh
Normal file
@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Public domain, not copyrighted..
|
||||
|
||||
NUM=5
|
||||
VTYBASE=2610
|
||||
ASBASE=64560
|
||||
BGPD=/path/to/bgpd
|
||||
PREFIX=192.168.145
|
||||
|
||||
for H in `seq 1 ${NUM}` ; do
|
||||
CONF=/etc/quagga/bgpd${H}.conf
|
||||
ADDR=${PREFIX}.${H}
|
||||
|
||||
if [ ! -e "$CONF" ] ; then
|
||||
# This sets up a ring of bgpd peerings
|
||||
NEXT=$(( ($H % ${NUM}) + 1 ))
|
||||
PREV=$(( (($H + 3) % ${NUM}) + 1 ))
|
||||
NEXTADDR="${PREFIX}.${NEXT}"
|
||||
NEXTAS=$((${ASBASE} + $NEXT))
|
||||
PREVADDR="${PREFIX}.${PREV}"
|
||||
PREVAS=$((${ASBASE} + $PREV))
|
||||
|
||||
# Edit config to suit.
|
||||
cat > "$CONF" <<- EOF
|
||||
password whatever
|
||||
service advanced-vty
|
||||
!
|
||||
router bgp $((64560+${H}))
|
||||
bgp router-id ${ADDR}
|
||||
network 10.${H}.1.0/24 pathlimit 1
|
||||
network 10.${H}.2.0/24 pathlimit 2
|
||||
network 10.${H}.3.0/24 pathlimit 3
|
||||
neighbor default peer-group
|
||||
neighbor default update-source ${ADDR}
|
||||
neighbor default capability orf prefix-list both
|
||||
neighbor default soft-reconfiguration inbound
|
||||
neighbor ${NEXTADDR} remote-as ${NEXTAS}
|
||||
neighbor ${NEXTADDR} peer-group default
|
||||
neighbor ${PREVADDR} remote-as ${PREVAS}
|
||||
neighbor ${PREVADDR} peer-group default
|
||||
EOF
|
||||
chown quagga:quagga "$CONF"
|
||||
fi
|
||||
# You may want to automatically add configure a local address
|
||||
# on a loop interface.
|
||||
#
|
||||
# Solaris: ifconfig vni${H} plumb ${ADDR}/32 up
|
||||
# Linux: ip address add ${ADDR}/32 dev lo 2> /dev/null
|
||||
${BGPD} -i /var/run/quagga/bgpd${H}.pid \
|
||||
-l ${ADDR} \
|
||||
-f /etc/quagga/bgpd${H}.conf \
|
||||
-P $((${VTYBASE}+${H})) \
|
||||
-d
|
||||
done
|
||||
Loading…
Reference in New Issue
Block a user