Add plugin parameter to specify zebra listening port
authorVasilis Tsiligiannis <b_tsiligiannis@silverton.gr>
Fri, 5 Mar 2010 20:09:13 +0000 (22:09 +0200)
committerVasilis Tsiligiannis <b_tsiligiannis@silverton.gr>
Fri, 5 Mar 2010 20:09:13 +0000 (22:09 +0200)
lib/quagga/Makefile
lib/quagga/README_QUAGGA
lib/quagga/src/olsrd_plugin.c
lib/quagga/src/quagga.c
lib/quagga/src/quagga.h

index 67dade8..b62373e 100644 (file)
@@ -44,7 +44,6 @@ TOPDIR = ../..
 include $(TOPDIR)/Makefile.inc
 
 CFLAGS += -g
-CPPFLAGS +=-DUSE_UNIX_DOMAIN_SOCKET
 
 #uncomment the following line only if you are sure what you're doing, it will 
 #probably break things! 
index d968a37..88fed14 100644 (file)
@@ -42,6 +42,10 @@ PlParam "SockPath" "<path>"
         sets the path to zebra socket
        defaults to "/var/run/quagga/zserv.api" if not set.
 
+PlParam "Port" "<port>"
+        sets the port on which zebra is listening
+       overrides 'SockPath' parameter if set.
+
 ---------------------------------------------------------------------
 SAMPLE CONFIG
 ---------------------------------------------------------------------
index fdd7219..597812e 100644 (file)
@@ -43,6 +43,7 @@ static set_plugin_parameter set_exportroutes;
 static set_plugin_parameter set_distance;
 static set_plugin_parameter set_localpref;
 static set_plugin_parameter set_sockpath;
+static set_plugin_parameter set_port;
 
 
 int
@@ -57,6 +58,7 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
   {.name = "Distance",.set_plugin_parameter = &set_distance,},
   {.name = "LocalPref",.set_plugin_parameter = &set_localpref,},
   {.name = "SockPath",.set_plugin_parameter = &set_sockpath,.addon = {PATH_MAX},},
+  {.name = "Port",.set_plugin_parameter = &set_port,},
 };
 
 void
@@ -135,6 +137,18 @@ set_sockpath(const char *value, void *data __attribute__ ((unused)), set_plugin_
   return 0;
 }
 
+static int
+set_port(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
+{
+  unsigned int port;
+
+  if (set_plugin_port(value, &port, addon))
+    return 1;
+  zebra_port(port);
+
+  return 0;
+}
+
 int
 olsrd_plugin_init(void)
 {
index 35a1f9f..2f0bd0d 100644 (file)
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-
-#ifdef USE_UNIX_DOMAIN_SOCKET
 #include <sys/un.h>
-#endif
 
 /* prototypes intern */
 static struct {
@@ -48,6 +45,7 @@ static struct {
   char distance;
   char flags;
   char *sockpath;
+  unsigned int port;
 } zebra;
 
 static void *my_realloc(void *, size_t, const char *);
@@ -125,35 +123,31 @@ zebra_connect(void)
 {
 
   int ret;
+  union {
+    struct sockaddr_in sin;
+    struct sockaddr_un sun;
+  } sockaddr;
 
-#ifndef USE_UNIX_DOMAIN_SOCKET
-  struct sockaddr_in i;
-  if (close(zebra.sock) < 0)
-    olsr_exit("(QUAGGA) Could not close socket!", EXIT_FAILURE);
-
-  zebra.sock = socket(AF_INET, SOCK_STREAM, 0);
-#else
-  struct sockaddr_un i;
   if (close(zebra.sock) < 0)
     olsr_exit("(QUAGGA) Could not close socket!", EXIT_FAILURE);
-
-  zebra.sock = socket(AF_UNIX, SOCK_STREAM, 0);
-#endif
+  zebra.sock = socket(zebra.port ? AF_INET : AF_UNIX, SOCK_STREAM, 0);
 
   if (zebra.sock < 0)
     olsr_exit("(QUAGGA) Could not create socket!", EXIT_FAILURE);
 
-  memset(&i, 0, sizeof i);
-#ifndef USE_UNIX_DOMAIN_SOCKET
-  i.sin_family = AF_INET;
-  i.sin_port = htons(ZEBRA_PORT);
-  i.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-#else
-  i.sun_family = AF_UNIX;
-  strscpy(i.sun_path, zebra.sockpath, sizeof(i.sun_path));
-#endif
-
-  ret = connect(zebra.sock, (struct sockaddr *)&i, sizeof i);
+  memset(&sockaddr, 0, sizeof sockaddr);
+
+  if (zebra.port) {
+    sockaddr.sin.sin_family = AF_INET;
+    sockaddr.sin.sin_port = htons(zebra.port);
+    sockaddr.sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+    ret = connect(zebra.sock, (struct sockaddr *)&sockaddr.sin, sizeof sockaddr.sin);
+  } else {
+    sockaddr.sun.sun_family = AF_UNIX;
+    strscpy(sockaddr.sun.sun_path, zebra.sockpath, sizeof(sockaddr.sun.sun_path));
+    ret = connect(zebra.sock, (struct sockaddr *)&sockaddr.sun, sizeof sockaddr.sun);
+  }
+
   if (ret < 0)
     zebra.status &= ~STATUS_CONNECTED;
   else
@@ -618,6 +612,14 @@ zebra_sockpath(char *sockpath)
 
 }
 
+void
+zebra_port(unsigned int port)
+{
+
+  zebra.port = port;
+
+}
+
 /*
  * Local Variables:
  * c-basic-offset: 2
index a5595f9..9bfd8a3 100644 (file)
 
 #define HAVE_SOCKLEN_T
 
-/* Zebra port */
-#ifndef ZEBRA_PORT
-#define ZEBRA_PORT 2600
-#endif
-
 /* Zebra version */
 #ifndef ZEBRA_HEADER_MARKER
 #define ZEBRA_HEADER_MARKER 255
@@ -40,7 +35,9 @@
 #endif
 
 /* Zebra socket */
+#ifndef ZEBRA_SOCKPATH
 #define ZEBRA_SOCKPATH "/var/run/quagga/zserv.api"
+#endif
 
 /* Zebra packet size */
 #define ZEBRA_MAX_PACKET_SIZ           4096
@@ -100,6 +97,7 @@ void zebra_olsr_localpref(void);
 void zebra_olsr_distance(unsigned char);
 void zebra_export_routes(unsigned char);
 void zebra_sockpath(char *);
+void zebra_port(unsigned int);
 
 /*
  * Local Variables: