]> git.puffer.fish Git - mirror/frr.git/commitdiff
2007-10-30 Nick Hilliard <nick@inex.ie>
authorPaul Jakma <paul.jakma@sun.com>
Thu, 1 Nov 2007 14:29:11 +0000 (14:29 +0000)
committerPaul Jakma <paul.jakma@sun.com>
Thu, 1 Nov 2007 14:29:11 +0000 (14:29 +0000)
* 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.

bgpd/ChangeLog
bgpd/bgp_main.c
bgpd/bgp_network.c
bgpd/bgp_network.h
bgpd/bgpd.c
bgpd/bgpd.h
tools/multiple-bgpd.sh [new file with mode: 0644]

index 5a31d9cb5452178324d10efe41a9d1290463d123..0fdd36ac1fea5ef7b5090413f04c384bd9515a37 100644 (file)
@@ -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
index ecfe62ef1cc7fe247aa49b62bcf2dac434562427..843b124ecb06d843bc398f7ee1cd1d5b3ccc083c 100644 (file)
@@ -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))
index 8040e47d65feed5a70c28dafd5bb90a13b7aef0e..6b8c8a4490cb5febab0182379583445dca205803 100644 (file)
@@ -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 */
index ddf050d34fdddfe0ba8badb61704911c42c1ddce..b455f5743edf7986cc7465bff5051a09200b5375 100644 (file)
@@ -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 *);
 
index 9852d6595697e95a7ff807e57eaa4fbe40af15ca..374c4c5281531de5991a0f4a11e104fb206f1be3 100644 (file)
@@ -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 ();
index e04575d80a18bec5c566c0f48df0a6c4468cf165..e9fc410f9b41d362ad56650ce958d4d4fbd02929 100644 (file)
@@ -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;
 
diff --git a/tools/multiple-bgpd.sh b/tools/multiple-bgpd.sh
new file mode 100644 (file)
index 0000000..4097754
--- /dev/null
@@ -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