Break code into multiple source files
authorVasilis Tsiligiannis <b_tsiligiannis@silverton.gr>
Wed, 10 Mar 2010 08:17:10 +0000 (10:17 +0200)
committerVasilis Tsiligiannis <b_tsiligiannis@silverton.gr>
Wed, 10 Mar 2010 08:17:10 +0000 (10:17 +0200)
12 files changed:
lib/quagga/src/client.c [new file with mode: 0644]
lib/quagga/src/client.h [new file with mode: 0644]
lib/quagga/src/common.h [new file with mode: 0644]
lib/quagga/src/olsrd_plugin.c
lib/quagga/src/packet.c [new file with mode: 0644]
lib/quagga/src/packet.h [new file with mode: 0644]
lib/quagga/src/parse.c [new file with mode: 0644]
lib/quagga/src/parse.h [new file with mode: 0644]
lib/quagga/src/plugin.c [new file with mode: 0644]
lib/quagga/src/plugin.h [new file with mode: 0644]
lib/quagga/src/quagga.c
lib/quagga/src/quagga.h

diff --git a/lib/quagga/src/client.c b/lib/quagga/src/client.c
new file mode 100644 (file)
index 0000000..d532390
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
+
+/* -------------------------------------------------------------------------
+ * File               : client.c
+ * Description        : zebra client functions
+ * ------------------------------------------------------------------------- */
+
+#define HAVE_SOCKLEN_T
+
+#include <sys/un.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "defs.h"
+#include "olsr.h"
+#include "log.h"
+#include "routing_table.h"
+
+#include "common.h"
+#include "quagga.h"
+#include "client.h"
+
+static void zebra_connect(void);
+static void *my_realloc(void *, size_t, const char *);
+
+static void *
+my_realloc(void *buf, size_t s, const char *c)
+{
+  buf = realloc(buf, s);
+  if (!buf) {
+    OLSR_PRINTF(1, "(QUAGGA) OUT OF MEMORY: %s\n", strerror(errno));
+    olsr_syslog(OLSR_LOG_ERR, "olsrd: out of memory!: %m\n");
+    olsr_exit(c, EXIT_FAILURE);
+  }
+  return buf;
+}
+
+void
+zebra_reconnect(void)
+{
+  struct rt_entry *tmp;
+
+  zebra_connect();
+  if (!(zebra.status & STATUS_CONNECTED))
+    return;                     // try again next time
+
+  if (zebra.options & OPTION_EXPORT) {
+    OLSR_FOR_ALL_RT_ENTRIES(tmp) {
+      zebra_add_route(tmp);
+    }
+    OLSR_FOR_ALL_RT_ENTRIES_END(tmp);
+  }
+  zebra_enable_redistribute();
+
+}
+
+static void
+zebra_connect(void)
+{
+
+  int ret;
+  union {
+    struct sockaddr_in sin;
+    struct sockaddr_un sun;
+  } sockaddr;
+
+  if (close(zebra.sock) < 0)
+    olsr_exit("(QUAGGA) Could not close socket!", EXIT_FAILURE);
+  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(&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
+    zebra.status |= STATUS_CONNECTED;
+}
+
+int
+zebra_send_command(unsigned char *options)
+{
+
+  unsigned char *pnt;
+  uint16_t len;
+  int ret;
+
+  if (!(zebra.status & STATUS_CONNECTED))
+    return 0;
+
+  pnt = options;
+  memcpy(&len, pnt, sizeof len);
+
+  len = ntohs(len);
+
+  do {
+    ret = write(zebra.sock, pnt, len);
+    if (ret < 0) {
+      if ((errno == EINTR) || (errno == EAGAIN)) {
+        errno = 0;
+        ret = 0;
+        continue;
+      } else {
+        OLSR_PRINTF(1, "(QUAGGA) Disconnected from zebra\n");
+        zebra.status &= ~STATUS_CONNECTED;
+        /* TODO: Remove HNAs added from redistribution */
+        free(options);
+        return -1;
+      }
+    }
+    pnt = pnt + ret;
+  }
+  while ((len -= ret));
+  free(options);
+  return 0;
+}
+
+unsigned char *
+try_read(ssize_t * size)
+{
+  unsigned char *buf;
+  ssize_t bytes, bufsize;
+  uint16_t length, offset;
+  int sockstatus;
+
+  /* initialize variables */
+  buf = NULL;
+  offset = 0;
+  *size = 0;
+  bufsize = 0;
+
+  /* save socket status and set non-blocking for read */
+  sockstatus = fcntl(zebra.sock, F_GETFL);
+  fcntl(zebra.sock, F_SETFL, sockstatus|O_NONBLOCK);
+
+  /* read whole packages */
+  do {
+
+    /* (re)allocate buffer */
+    if (*size == bufsize) {
+      bufsize += BUFSIZE;
+      buf = my_realloc(buf, bufsize, "Zebra try_read");
+    }
+
+    /* read from socket */
+    bytes = read(zebra.sock, buf + *size, bufsize - *size);
+    /* handle broken packet */
+    if (!bytes) {
+      free(buf);
+      return NULL;
+    }
+    /* handle no data available */
+    if (bytes < 0) {
+      /* handle disconnect */
+      if (errno != EAGAIN) {    // oops - we got disconnected
+        OLSR_PRINTF(1, "(QUAGGA) Disconnected from zebra\n");
+        zebra.status &= ~STATUS_CONNECTED;
+        /* TODO: Remove HNAs added from redistribution */
+      }
+      free(buf);
+      return NULL;
+    }
+
+    *size += bytes;
+
+    /* detect zebra packet fragmentation */
+    do {
+      memcpy(&length, buf + offset, sizeof length);
+      length = ntohs(length);
+      offset += length;
+    }
+    while (*size >= (ssize_t) (offset + sizeof length));
+    /* set blocking socket on fragmented packet */
+    if (*size != offset)
+      fcntl(zebra.sock, F_SETFL, sockstatus);
+
+  }
+  while (*size != offset);
+
+  /* restore socket status */
+  fcntl(zebra.sock, F_SETFL, sockstatus);
+
+  return buf;
+}
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/lib/quagga/src/client.h b/lib/quagga/src/client.h
new file mode 100644 (file)
index 0000000..721f591
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
+
+/* -------------------------------------------------------------------------
+ * File               : client.h
+ * Description        : header file for client.c
+ * ------------------------------------------------------------------------- */
+
+#define STATUS_CONNECTED 1
+
+/* Buffer size */
+#define BUFSIZE 1024
+
+int zebra_send_command(unsigned char *);
+void zebra_reconnect(void);
+unsigned char *try_read(ssize_t *);
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/lib/quagga/src/common.h b/lib/quagga/src/common.h
new file mode 100644 (file)
index 0000000..1702f04
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
+
+/* -------------------------------------------------------------------------
+ * File               : common.h
+ * Description        : common header file
+ * ------------------------------------------------------------------------- */
+
+#define OPTION_EXPORT 1
+
+/* Zebra route types */
+#define ZEBRA_ROUTE_OLSR               11
+#define ZEBRA_ROUTE_MAX                        13
+
+struct zebra {
+  char status;                         // internal status
+  char options;                        // internal options
+  int sock;                            // Socket to zebra...
+  char redistribute[ZEBRA_ROUTE_MAX];
+  char distance;
+  char flags;
+  char *sockpath;
+  unsigned int port;
+  char version;
+};
+
+extern struct zebra zebra;
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
index d2d3e6d..0f55847 100644 (file)
  * Description        : functions to setup plugin
  * ------------------------------------------------------------------------- */
 
-
-#include <stdio.h>
-#include <string.h>
-
 #include "olsrd_plugin.h"
 #include "plugin_util.h"
 #include "olsr.h"
 #include "scheduler.h"
 #include "defs.h"
-#include "quagga.h"
 #include "net_olsr.h"
 
+#include "quagga.h"
+#include "plugin.h"
+#include "parse.h"
+
 #define PLUGIN_NAME    "OLSRD quagga plugin"
 #define PLUGIN_VERSION "0.2.2"
 #define PLUGIN_AUTHOR  "Immo 'FaUl' Wehrenberg"
@@ -46,7 +45,6 @@ static set_plugin_parameter set_sockpath;
 static set_plugin_parameter set_port;
 static set_plugin_parameter set_version;
 
-
 int
 olsrd_plugin_interface_version(void)
 {
diff --git a/lib/quagga/src/packet.c b/lib/quagga/src/packet.c
new file mode 100644 (file)
index 0000000..3d3e14e
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
+
+/* -------------------------------------------------------------------------
+ * File               : packet.c
+ * Description        : zebra packet creation functions
+ * ------------------------------------------------------------------------- */
+
+#include "defs.h"
+#include "olsr.h"
+
+#include "common.h"
+#include "packet.h"
+
+unsigned char
+*zebra_redistribute_packet (uint16_t cmd, unsigned char type)
+{
+  unsigned char *data, *pnt;
+  uint16_t size;
+
+  data = olsr_malloc(ZEBRA_MAX_PACKET_SIZ , "zebra_redistribute_packet");
+
+  pnt = &data[2];
+  if (zebra.version) {
+    *pnt++ = ZEBRA_HEADER_MARKER;
+    *pnt++ = zebra.version;
+    cmd = htons(cmd);
+    memcpy(pnt, &cmd, sizeof cmd);
+    pnt += sizeof cmd;
+  } else
+      *pnt++ = (unsigned char) cmd;
+  *pnt++ = type;
+  size = htons(pnt - data);
+  memcpy(data, &size, sizeof size);
+
+  return data;
+}
+
+unsigned char
+*zebra_route_packet(uint16_t cmd, struct zebra_route *r)
+{
+
+  int count;
+  uint8_t len;
+  uint16_t size;
+  uint32_t ind, metric;
+
+  unsigned char *cmdopt, *t;
+
+  cmdopt = olsr_malloc(ZEBRA_MAX_PACKET_SIZ, "zebra add_v4_route");
+
+  t = &cmdopt[2];
+  if (zebra.version) {
+    *t++ = ZEBRA_HEADER_MARKER;
+    *t++ = zebra.version;
+    cmd = htons(cmd);
+    memcpy(t, &cmd, sizeof cmd);
+    t += sizeof cmd;
+  } else
+      *t++ = (unsigned char) cmd;
+  *t++ = r->type;
+  *t++ = r->flags;
+  *t++ = r->message;
+  *t++ = r->prefixlen;
+  len = (r->prefixlen + 7) / 8;
+  if (olsr_cnf->ip_version == AF_INET)
+    memcpy(t, &r->prefix.v4.s_addr, len);
+  else
+    memcpy(t, r->prefix.v6.s6_addr, len);
+  t = t + len;
+
+  if (r->message & ZAPI_MESSAGE_NEXTHOP) {
+    *t++ = r->nexthop_num + r->ifindex_num;
+
+      for (count = 0; count < r->nexthop_num; count++) {
+        if (olsr_cnf->ip_version == AF_INET) {
+          *t++ = ZEBRA_NEXTHOP_IPV4;
+          memcpy(t, &r->nexthop[count].v4.s_addr, sizeof r->nexthop[count].v4.s_addr);
+          t += sizeof r->nexthop[count].v4.s_addr;
+        } else {
+          *t++ = ZEBRA_NEXTHOP_IPV6;
+          memcpy(t, r->nexthop[count].v6.s6_addr, sizeof r->nexthop[count].v6.s6_addr);
+          t += sizeof r->nexthop[count].v6.s6_addr;
+        }
+      }
+      for (count = 0; count < r->ifindex_num; count++) {
+        *t++ = ZEBRA_NEXTHOP_IFINDEX;
+        ind = htonl(r->ifindex[count]);
+        memcpy(t, &ind, sizeof ind);
+        t += sizeof ind;
+      }
+  }
+  if ((r->message & ZAPI_MESSAGE_DISTANCE) > 0)
+    *t++ = r->distance;
+  if ((r->message & ZAPI_MESSAGE_METRIC) > 0) {
+    metric = htonl(r->metric);
+    memcpy(t, &metric, sizeof metric);
+    t += sizeof metric;
+  }
+  size = htons(t - cmdopt);
+  memcpy(cmdopt, &size, sizeof size);
+
+  return cmdopt;
+}
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/lib/quagga/src/packet.h b/lib/quagga/src/packet.h
new file mode 100644 (file)
index 0000000..64d69cd
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
+
+/* -------------------------------------------------------------------------
+ * File               : packet.h
+ * Description        : header file for packet.c
+ * ------------------------------------------------------------------------- */
+
+/* Zebra packet size */
+#define ZEBRA_MAX_PACKET_SIZ           4096
+
+/* Zebra header marker */
+#ifndef ZEBRA_HEADER_MARKER
+#define ZEBRA_HEADER_MARKER 255
+#endif
+
+/* Zebra message types */
+#define ZEBRA_IPV4_ROUTE_ADD           7
+#define ZEBRA_IPV4_ROUTE_DELETE                8
+#define ZEBRA_IPV6_ROUTE_ADD            9
+#define ZEBRA_IPV6_ROUTE_DELETE         10
+#define ZEBRA_REDISTRIBUTE_ADD         11
+#define ZEBRA_REDISTRIBUTE_DELETE      12
+
+/* Zebra nexthop flags */
+#define ZEBRA_NEXTHOP_IFINDEX          1
+#define ZEBRA_NEXTHOP_IPV4             3
+#define ZEBRA_NEXTHOP_IPV6              6
+
+/* Zebra message flags */
+#define ZAPI_MESSAGE_NEXTHOP           0x01
+#define ZAPI_MESSAGE_IFINDEX           0x02
+#define ZAPI_MESSAGE_DISTANCE          0x04
+#define ZAPI_MESSAGE_METRIC            0x08
+
+/* Zebra flags */
+#define ZEBRA_FLAG_SELECTED            0x10
+
+struct zebra_route {
+  unsigned char type;
+  unsigned char flags;
+  unsigned char message;
+  unsigned char prefixlen;
+  union olsr_ip_addr prefix;
+  unsigned char nexthop_num;
+  union olsr_ip_addr *nexthop;
+  unsigned char ifindex_num;
+  uint32_t *ifindex;
+  uint32_t metric;
+  uint8_t distance;
+};
+
+unsigned char *zebra_route_packet(uint16_t, struct zebra_route *);
+unsigned char *zebra_redistribute_packet(uint16_t, unsigned char);
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/lib/quagga/src/parse.c b/lib/quagga/src/parse.c
new file mode 100644 (file)
index 0000000..e14f20f
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
+
+/* -------------------------------------------------------------------------
+ * File               : parse.c
+ * Description        : functions to parse received zebra packets
+ * ------------------------------------------------------------------------- */
+
+#include "defs.h"
+#include "olsr.h"
+
+#include "common.h"
+#include "packet.h"
+#include "client.h"
+#include "parse.h"
+
+static struct zebra_route *zebra_parse_route(unsigned char *);
+static void free_ipv4_route(struct zebra_route *);
+
+void
+zebra_parse(void *foo __attribute__ ((unused)))
+{
+  unsigned char *data, *f;
+  uint16_t command;
+  uint16_t length;
+  ssize_t len;
+  struct zebra_route *route;
+
+  if (!(zebra.status & STATUS_CONNECTED)) {
+    zebra_reconnect();
+    return;
+  }
+  data = try_read(&len);
+  if (data) {
+    f = data;
+    do {
+      memcpy(&length, f, sizeof length);
+      length = ntohs (length);
+      if (!length) // something weired happened
+        olsr_exit("(QUAGGA) Zero message length??? ", EXIT_FAILURE);
+      if (zebra.version) {
+        if ((f[2] != ZEBRA_HEADER_MARKER) || (f[3] != zebra.version))
+          olsr_exit("(QUAGGA) Invalid zebra header received!", EXIT_FAILURE);
+        memcpy(&command, &f[4], sizeof command);
+        command = ntohs (command);
+      } else
+          command = f[2];
+      if (olsr_cnf->ip_version == AF_INET) {
+        switch (command) {
+          case ZEBRA_IPV4_ROUTE_ADD:
+            route = zebra_parse_route(f);
+            ip_prefix_list_add(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen);
+            free_ipv4_route(route);
+            free(route);
+            break;
+          case ZEBRA_IPV4_ROUTE_DELETE:
+            route = zebra_parse_route(f);
+            ip_prefix_list_remove(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen);
+            free_ipv4_route(route);
+            free(route);
+            break;
+          default:
+            break;
+        }
+      } else {
+        switch (command) {
+          case ZEBRA_IPV6_ROUTE_ADD:
+            route = zebra_parse_route(f);
+            ip_prefix_list_add(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen);
+            free_ipv4_route(route);
+            free(route);
+            break;
+          case ZEBRA_IPV6_ROUTE_DELETE:
+            route = zebra_parse_route(f);
+            ip_prefix_list_remove(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen);
+            free_ipv4_route(route);
+            free(route);
+            break;
+          default:
+            break;
+        }
+      }
+
+      f += length;
+    }
+    while ((f - data) < len);
+    free(data);
+  }
+}
+
+static struct zebra_route
+*zebra_parse_route(unsigned char *opt)
+{
+  struct zebra_route *r;
+  int c;
+  size_t size;
+  uint16_t length;
+  unsigned char *pnt;
+
+  memcpy(&length, opt, sizeof length);
+  length = ntohs (length);
+
+  r = olsr_malloc(sizeof *r, "zebra_parse_route");
+  pnt = (zebra.version ? &opt[6] : &opt[3]);
+  r->type = *pnt++;
+  r->flags = *pnt++;
+  r->message = *pnt++;
+  r->prefixlen = *pnt++;
+  size = (r->prefixlen + 7) / 8;
+  memset(&r->prefix, 0, sizeof r->prefix);
+  if (olsr_cnf->ip_version == AF_INET)
+    memcpy(&r->prefix.v4.s_addr, pnt, size);
+  else
+    memcpy(r->prefix.v6.s6_addr, pnt, size);
+  pnt += size;
+
+  switch (zebra.version) {
+    case 0:
+    case 1:
+      if (r->message & ZAPI_MESSAGE_NEXTHOP) {
+        r->nexthop_num = *pnt++;
+        r->nexthop = olsr_malloc((sizeof *r->nexthop) * r->nexthop_num, "quagga: zebra_parse_route");
+        for (c = 0; c < r->nexthop_num; c++) {
+          if (olsr_cnf->ip_version == AF_INET) {
+            memcpy(&r->nexthop[c].v4.s_addr, pnt, sizeof r->nexthop[c].v4.s_addr);
+            pnt += sizeof r->nexthop[c].v4.s_addr;
+          } else {
+            memcpy(r->nexthop[c].v6.s6_addr, pnt, sizeof r->nexthop[c].v6.s6_addr);
+            pnt += sizeof r->nexthop[c].v6.s6_addr;
+          }
+        }
+      }
+
+      if (r->message & ZAPI_MESSAGE_IFINDEX) {
+        r->ifindex_num = *pnt++;
+        r->ifindex = olsr_malloc(sizeof(uint32_t) * r->ifindex_num, "quagga: zebra_parse_route");
+        for (c = 0; c < r->ifindex_num; c++) {
+          memcpy(&r->ifindex[c], pnt, sizeof r->ifindex[c]);
+          r->ifindex[c] = ntohl (r->ifindex[c]);
+          pnt += sizeof r->ifindex[c];
+        }
+      }
+      break;
+    default:
+      OLSR_PRINTF(1, "(QUAGGA) Unsupported zebra packet version!\n");
+      break;
+  }
+
+  if (r->message & ZAPI_MESSAGE_DISTANCE) {
+    r->distance = *pnt++;
+  }
+
+// Quagga v0.98.6 BUG workaround: metric is always sent by zebra
+// even without ZAPI_MESSAGE_METRIC message.
+//  if (r.message & ZAPI_MESSAGE_METRIC) {
+    memcpy(&r->metric, pnt, sizeof r->metric);
+    r->metric = ntohl(r->metric);
+    pnt += sizeof r->metric;
+//  }
+
+  if (pnt - opt != length) {
+    olsr_exit("(QUAGGA) length does not match ??? ", EXIT_FAILURE);
+  }
+
+  return r;
+}
+
+static void
+free_ipv4_route(struct zebra_route *r)
+{
+
+  if(r->ifindex_num)
+    free(r->ifindex);
+  if(r->nexthop_num)
+    free(r->nexthop);
+
+}
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/lib/quagga/src/parse.h b/lib/quagga/src/parse.h
new file mode 100644 (file)
index 0000000..0e7cd21
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
+
+/* -------------------------------------------------------------------------
+ * File               : parse.h
+ * Description        : header file for parse.c
+ * ------------------------------------------------------------------------- */
+
+void zebra_parse(void*);
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/lib/quagga/src/plugin.c b/lib/quagga/src/plugin.c
new file mode 100644 (file)
index 0000000..7a27185
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
+
+/* -------------------------------------------------------------------------
+ * File               : plugin.c
+ * Description        : functions to set zebra plugin parameters
+ * ------------------------------------------------------------------------- */
+
+#include "defs.h"
+#include "olsr.h"
+#include "log.h"
+
+#include "common.h"
+#include "packet.h"
+#include "plugin.h"
+
+static void *my_realloc(void *, size_t, const char *);
+
+static void
+*my_realloc(void *buf, size_t s, const char *c)
+{
+  buf = realloc(buf, s);
+  if (!buf) {
+    OLSR_PRINTF(1, "(QUAGGA) OUT OF MEMORY: %s\n", strerror(errno));
+    olsr_syslog(OLSR_LOG_ERR, "olsrd: out of memory!: %m\n");
+    olsr_exit(c, EXIT_FAILURE);
+  }
+  return buf;
+}
+
+int
+zebra_redistribute(unsigned char type)
+{
+
+  if (type > ZEBRA_ROUTE_MAX - 1)
+    return -1;
+  zebra.redistribute[type] = 1;
+
+  return 0;
+
+}
+
+void
+zebra_export_routes(unsigned char t)
+{
+  if (t)
+    zebra.options |= OPTION_EXPORT;
+  else
+    zebra.options &= ~OPTION_EXPORT;
+}
+
+void
+zebra_olsr_distance(unsigned char dist)
+{
+  zebra.distance = dist;
+}
+
+void
+zebra_olsr_localpref(void)
+{
+  zebra.flags &= ZEBRA_FLAG_SELECTED;
+}
+
+void
+zebra_sockpath(char *sockpath)
+{
+  size_t len;
+
+  len = strlen(sockpath) + 1;
+  zebra.sockpath = my_realloc(zebra.sockpath, len, "zebra_sockpath");
+  memcpy(zebra.sockpath, sockpath, len);
+
+}
+
+void
+zebra_port(unsigned int port)
+{
+
+  zebra.port = port;
+
+}
+
+void
+zebra_version(char version)
+{
+
+  zebra.version = version;
+
+}
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/lib/quagga/src/plugin.h b/lib/quagga/src/plugin.h
new file mode 100644 (file)
index 0000000..91a9680
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * OLSRd Quagga plugin
+ *
+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
+ * Copyright (C) 2007-2010 Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation or - at your option - under
+ * the terms of the GNU General Public Licence version 2 but can be
+ * linked to any BSD-Licenced Software with public available sourcecode
+ *
+ */
+
+/* -------------------------------------------------------------------------
+ * File               : plugin.h
+ * Description        : header file for plugin.c
+ * ------------------------------------------------------------------------- */
+
+int zebra_redistribute(unsigned char);
+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);
+void zebra_version(char);
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * End:
+ */
index d715242..ab14955 100644 (file)
 
 /* -------------------------------------------------------------------------
  * File               : quagga.c
- * Description        : functions to interface to the zebra daemon
+ * Description        : functions to interface zebra with olsrd
  * ------------------------------------------------------------------------- */
 
-#define HAVE_SOCKLEN_T
+#include "defs.h"
+#include "olsr.h"
+#include "log.h"
 
+#include "common.h"
 #include "quagga.h"
-#include "olsr.h" /* olsr_exit
-                     olsr_malloc */
-#include "log.h" /* olsr_syslog */
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/un.h>
-
-/* prototypes intern */
-static struct {
-  char status;                         // internal status
-  char options;                        // internal options
-  int sock;                            // Socket to zebra...
-  char redistribute[ZEBRA_ROUTE_MAX];
-  char distance;
-  char flags;
-  char *sockpath;
-  unsigned int port;
-  char version;
-} zebra;
-
-static void *my_realloc(void *, size_t, const char *);
-static void zebra_connect(void);
-static unsigned char *try_read(ssize_t *);
-static int zebra_send_command(unsigned char *);
-static unsigned char *zebra_route_packet(uint16_t, struct zebra_route *);
-static unsigned char *zebra_redistribute_packet(uint16_t, unsigned char);
-static void zebra_enable_redistribute(void);
-static void zebra_disable_redistribute(void);
-static struct zebra_route *zebra_parse_route(unsigned char *);
-static void zebra_reconnect(void);
-static void free_ipv4_route(struct zebra_route *);
-
-static void *
-my_realloc(void *buf, size_t s, const char *c)
-{
-  buf = realloc(buf, s);
-  if (!buf) {
-    OLSR_PRINTF(1, "(QUAGGA) OUT OF MEMORY: %s\n", strerror(errno));
-    olsr_syslog(OLSR_LOG_ERR, "olsrd: out of memory!: %m\n");
-    olsr_exit(c, EXIT_FAILURE);
-  }
-  return buf;
-}
+#include "packet.h"
+#include "client.h"
+
+struct zebra zebra;
 
 void
 init_zebra(void)
@@ -98,432 +53,7 @@ zebra_cleanup(void)
 
 }
 
-static void
-zebra_reconnect(void)
-{
-  struct rt_entry *tmp;
-
-  zebra_connect();
-  if (!(zebra.status & STATUS_CONNECTED))
-    return;                     // try again next time
-
-  if (zebra.options & OPTION_EXPORT) {
-    OLSR_FOR_ALL_RT_ENTRIES(tmp) {
-      zebra_add_route(tmp);
-    }
-    OLSR_FOR_ALL_RT_ENTRIES_END(tmp);
-  }
-  zebra_enable_redistribute();
-
-}
-
-/* Connect to the zebra-daemon, returns a socket */
-static void
-zebra_connect(void)
-{
-
-  int ret;
-  union {
-    struct sockaddr_in sin;
-    struct sockaddr_un sun;
-  } sockaddr;
-
-  if (close(zebra.sock) < 0)
-    olsr_exit("(QUAGGA) Could not close socket!", EXIT_FAILURE);
-  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(&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
-    zebra.status |= STATUS_CONNECTED;
-}
-
-/* Sends a command to zebra, command is
-   the command defined in zebra.h, options is the packet-payload,
-   optlen the length, of the payload */
-static int
-zebra_send_command(unsigned char *options)
-{
-
-  unsigned char *pnt;
-  uint16_t len;
-  int ret;
-
-  if (!(zebra.status & STATUS_CONNECTED))
-    return 0;
-
-  pnt = options;
-  memcpy(&len, pnt, sizeof len);
-
-  len = ntohs(len);
-
-  do {
-    ret = write(zebra.sock, pnt, len);
-    if (ret < 0) {
-      if ((errno == EINTR) || (errno == EAGAIN)) {
-        errno = 0;
-        ret = 0;
-        continue;
-      } else {
-        OLSR_PRINTF(1, "(QUAGGA) Disconnected from zebra\n");
-        zebra.status &= ~STATUS_CONNECTED;
-        /* TODO: Remove HNAs added from redistribution */
-        free(options);
-        return -1;
-      }
-    }
-    pnt = pnt + ret;
-  }
-  while ((len -= ret));
-  free(options);
-  return 0;
-}
-
-/* Creates a Route-Packet-Payload, needs address, netmask, nexthop,
-   distance, and a pointer of an size_t */
-static unsigned char *
-zebra_route_packet(uint16_t cmd, struct zebra_route *r)
-{
-
-  int count;
-  uint8_t len;
-  uint16_t size;
-  uint32_t ind, metric;
-
-  unsigned char *cmdopt, *t;
-
-  cmdopt = olsr_malloc(ZEBRA_MAX_PACKET_SIZ, "zebra add_v4_route");
-
-  t = &cmdopt[2];
-  if (zebra.version) {
-    *t++ = ZEBRA_HEADER_MARKER;
-    *t++ = zebra.version;
-    cmd = htons(cmd);
-    memcpy(t, &cmd, sizeof cmd);
-    t += sizeof cmd;
-  } else
-      *t++ = (unsigned char) cmd;
-  *t++ = r->type;
-  *t++ = r->flags;
-  *t++ = r->message;
-  *t++ = r->prefixlen;
-  len = (r->prefixlen + 7) / 8;
-  if (olsr_cnf->ip_version == AF_INET)
-    memcpy(t, &r->prefix.v4.s_addr, len);
-  else
-    memcpy(t, r->prefix.v6.s6_addr, len);
-  t = t + len;
-
-  if (r->message & ZAPI_MESSAGE_NEXTHOP) {
-    *t++ = r->nexthop_num + r->ifindex_num;
-
-      for (count = 0; count < r->nexthop_num; count++) {
-        if (olsr_cnf->ip_version == AF_INET) {
-          *t++ = ZEBRA_NEXTHOP_IPV4;
-          memcpy(t, &r->nexthop[count].v4.s_addr, sizeof r->nexthop[count].v4.s_addr);
-          t += sizeof r->nexthop[count].v4.s_addr;
-        } else {
-          *t++ = ZEBRA_NEXTHOP_IPV6;
-          memcpy(t, r->nexthop[count].v6.s6_addr, sizeof r->nexthop[count].v6.s6_addr);
-          t += sizeof r->nexthop[count].v6.s6_addr;
-        }
-      }
-      for (count = 0; count < r->ifindex_num; count++) {
-        *t++ = ZEBRA_NEXTHOP_IFINDEX;
-        ind = htonl(r->ifindex[count]);
-        memcpy(t, &ind, sizeof ind);
-        t += sizeof ind;
-      }
-  }
-  if ((r->message & ZAPI_MESSAGE_DISTANCE) > 0)
-    *t++ = r->distance;
-  if ((r->message & ZAPI_MESSAGE_METRIC) > 0) {
-    metric = htonl(r->metric);
-    memcpy(t, &metric, sizeof metric);
-    t += sizeof metric;
-  }
-  size = htons(t - cmdopt);
-  memcpy(cmdopt, &size, sizeof size);
-
-  return cmdopt;
-}
-
-/* Check wether there is data from zebra aviable */
 void
-zebra_parse(void *foo __attribute__ ((unused)))
-{
-  unsigned char *data, *f;
-  uint16_t command;
-  uint16_t length;
-  ssize_t len;
-  struct zebra_route *route;
-
-  if (!(zebra.status & STATUS_CONNECTED)) {
-    zebra_reconnect();
-    return;
-  }
-  data = try_read(&len);
-  if (data) {
-    f = data;
-    do {
-      memcpy(&length, f, sizeof length);
-      length = ntohs (length);
-      if (!length) // something wired happened
-        olsr_exit("(QUAGGA) Zero message length??? ", EXIT_FAILURE);
-      if (zebra.version) {
-        if ((f[2] != ZEBRA_HEADER_MARKER) || (f[3] != zebra.version))
-          olsr_exit("(QUAGGA) Invalid zebra header received!", EXIT_FAILURE);
-        memcpy(&command, &f[4], sizeof command);
-        command = ntohs (command);
-      } else
-          command = f[2];
-      if (olsr_cnf->ip_version == AF_INET) {
-        switch (command) {
-          case ZEBRA_IPV4_ROUTE_ADD:
-            route = zebra_parse_route(f);
-            ip_prefix_list_add(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen);
-            free_ipv4_route(route);
-            free(route);
-            break;
-          case ZEBRA_IPV4_ROUTE_DELETE:
-            route = zebra_parse_route(f);
-            ip_prefix_list_remove(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen);
-            free_ipv4_route(route);
-            free(route);
-            break;
-          default:
-            break;
-        }
-      } else {
-        switch (command) {
-          case ZEBRA_IPV6_ROUTE_ADD:
-            route = zebra_parse_route(f);
-            ip_prefix_list_add(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen);
-            free_ipv4_route(route);
-            free(route);
-            break;
-          case ZEBRA_IPV6_ROUTE_DELETE:
-            route = zebra_parse_route(f);
-            ip_prefix_list_remove(&olsr_cnf->hna_entries, &route->prefix, route->prefixlen);
-            free_ipv4_route(route);
-            free(route);
-            break;
-          default:
-            break;
-        }
-      }
-
-      f += length;
-    }
-    while ((f - data) < len);
-    free(data);
-  }
-}
-
-// tries to read a packet from zebra_socket
-// if there is something to read - make sure to read whole packages
-static unsigned char *
-try_read(ssize_t * size)
-{
-  unsigned char *buf;
-  ssize_t bytes, bufsize;
-  uint16_t length, offset;
-  int sockstatus;
-
-  /* initialize variables */
-  buf = NULL;
-  offset = 0;
-  *size = 0;
-  bufsize = 0;
-
-  /* save socket status and set non-blocking for read */
-  sockstatus = fcntl(zebra.sock, F_GETFL);
-  fcntl(zebra.sock, F_SETFL, sockstatus|O_NONBLOCK);
-
-  /* read whole packages */
-  do {
-
-    /* (re)allocate buffer */
-    if (*size == bufsize) {
-      bufsize += BUFSIZE;
-      buf = my_realloc(buf, bufsize, "Zebra try_read");
-    }
-
-    /* read from socket */
-    bytes = read(zebra.sock, buf + *size, bufsize - *size);
-    /* handle broken packet */
-    if (!bytes) {
-      free(buf);
-      return NULL;
-    }
-    /* handle no data available */
-    if (bytes < 0) {
-      /* handle disconnect */
-      if (errno != EAGAIN) {    // oops - we got disconnected
-        OLSR_PRINTF(1, "(QUAGGA) Disconnected from zebra\n");
-        zebra.status &= ~STATUS_CONNECTED;
-        /* TODO: Remove HNAs added from redistribution */
-      }
-      free(buf);
-      return NULL;
-    }
-
-    *size += bytes;
-
-    /* detect zebra packet fragmentation */
-    do {
-      memcpy(&length, buf + offset, sizeof length);
-      length = ntohs(length);
-      offset += length;
-    }
-    while (*size >= (ssize_t) (offset + sizeof length));
-    /* set blocking socket on fragmented packet */
-    if (*size != offset)
-      fcntl(zebra.sock, F_SETFL, sockstatus);
-
-  }
-  while (*size != offset);
-
-  /* restore socket status */
-  fcntl(zebra.sock, F_SETFL, sockstatus);
-
-  return buf;
-}
-
-/* Parse an ipv4-route-packet recived from zebra
- */
-static struct zebra_route
-*zebra_parse_route(unsigned char *opt)
-{
-  struct zebra_route *r;
-  int c;
-  size_t size;
-  uint16_t length;
-  unsigned char *pnt;
-
-  memcpy(&length, opt, sizeof length);
-  length = ntohs (length);
-
-  r = olsr_malloc(sizeof *r, "zebra_parse_route");
-  pnt = (zebra.version ? &opt[6] : &opt[3]);
-  r->type = *pnt++;
-  r->flags = *pnt++;
-  r->message = *pnt++;
-  r->prefixlen = *pnt++;
-  size = (r->prefixlen + 7) / 8;
-  memset(&r->prefix, 0, sizeof r->prefix);
-  if (olsr_cnf->ip_version == AF_INET)
-    memcpy(&r->prefix.v4.s_addr, pnt, size);
-  else
-    memcpy(r->prefix.v6.s6_addr, pnt, size);
-  pnt += size;
-
-  switch (zebra.version) {
-    case 0:
-    case 1:
-      if (r->message & ZAPI_MESSAGE_NEXTHOP) {
-        r->nexthop_num = *pnt++;
-        r->nexthop = olsr_malloc((sizeof *r->nexthop) * r->nexthop_num, "quagga: zebra_parse_route");
-        for (c = 0; c < r->nexthop_num; c++) {
-          if (olsr_cnf->ip_version == AF_INET) {
-            memcpy(&r->nexthop[c].v4.s_addr, pnt, sizeof r->nexthop[c].v4.s_addr);
-            pnt += sizeof r->nexthop[c].v4.s_addr;
-          } else {
-            memcpy(r->nexthop[c].v6.s6_addr, pnt, sizeof r->nexthop[c].v6.s6_addr);
-            pnt += sizeof r->nexthop[c].v6.s6_addr;
-          }
-        }
-      }
-
-      if (r->message & ZAPI_MESSAGE_IFINDEX) {
-        r->ifindex_num = *pnt++;
-        r->ifindex = olsr_malloc(sizeof(uint32_t) * r->ifindex_num, "quagga: zebra_parse_route");
-        for (c = 0; c < r->ifindex_num; c++) {
-          memcpy(&r->ifindex[c], pnt, sizeof r->ifindex[c]);
-          r->ifindex[c] = ntohl (r->ifindex[c]);
-          pnt += sizeof r->ifindex[c];
-        }
-      }
-      break;
-    default:
-      OLSR_PRINTF(1, "(QUAGGA) Unsupported zebra packet version!\n");
-      break;
-  }
-
-  if (r->message & ZAPI_MESSAGE_DISTANCE) {
-    r->distance = *pnt++;
-  }
-
-// Quagga v0.98.6 BUG workaround: metric is always sent by zebra
-// even without ZAPI_MESSAGE_METRIC message.
-//  if (r.message & ZAPI_MESSAGE_METRIC) {
-    memcpy(&r->metric, pnt, sizeof r->metric);
-    r->metric = ntohl(r->metric);
-    pnt += sizeof r->metric;
-//  }
-
-  if (pnt - opt != length) {
-    olsr_exit("(QUAGGA) length does not match ??? ", EXIT_FAILURE);
-  }
-
-  return r;
-}
-
-static unsigned char
-*zebra_redistribute_packet (uint16_t cmd, unsigned char type)
-{
-  unsigned char *data, *pnt;
-  uint16_t size;
-
-  data = olsr_malloc(ZEBRA_MAX_PACKET_SIZ , "zebra_redistribute_packet");
-
-  pnt = &data[2];
-  if (zebra.version) {
-    *pnt++ = ZEBRA_HEADER_MARKER;
-    *pnt++ = zebra.version;
-    cmd = htons(cmd);
-    memcpy(pnt, &cmd, sizeof cmd);
-    pnt += sizeof cmd;
-  } else
-      *pnt++ = (unsigned char) cmd;
-  *pnt++ = type;
-  size = htons(pnt - data);
-  memcpy(data, &size, sizeof size);
-
-  return data;
-}
-
-/* start redistribution FROM zebra */
-int
-zebra_redistribute(unsigned char type)
-{
-
-  if (type > ZEBRA_ROUTE_MAX - 1)
-    return -1;
-  zebra.redistribute[type] = 1;
-
-  return 0;
-
-}
-
-/* start redistribution FROM zebra */
-static void
 zebra_enable_redistribute(void)
 {
   unsigned char type;
@@ -536,8 +66,7 @@ zebra_enable_redistribute(void)
 
 }
 
-/* end redistribution FROM zebra */
-static void
+void
 zebra_disable_redistribute(void)
 {
   unsigned char type;
@@ -550,17 +79,6 @@ zebra_disable_redistribute(void)
 
 }
 
-static void
-free_ipv4_route(struct zebra_route *r)
-{
-
-  if(r->ifindex_num)
-    free(r->ifindex);
-  if(r->nexthop_num)
-    free(r->nexthop);
-
-}
-
 int
 zebra_add_route(const struct rt_entry *r)
 {
@@ -664,54 +182,6 @@ zebra_del_route(const struct rt_entry *r)
   return retval;
 }
 
-void
-zebra_olsr_distance(unsigned char dist)
-{
-  zebra.distance = dist;
-}
-
-void
-zebra_olsr_localpref(void)
-{
-  zebra.flags &= ZEBRA_FLAG_SELECTED;
-}
-
-void
-zebra_export_routes(unsigned char t)
-{
-  if (t)
-    zebra.options |= OPTION_EXPORT;
-  else
-    zebra.options &= ~OPTION_EXPORT;
-}
-
-void
-zebra_sockpath(char *sockpath)
-{
-  size_t len;
-
-  len = strlen(sockpath) + 1;
-  zebra.sockpath = my_realloc(zebra.sockpath, len, "zebra_sockpath");
-  memcpy(zebra.sockpath, sockpath, len);
-
-}
-
-void
-zebra_port(unsigned int port)
-{
-
-  zebra.port = port;
-
-}
-
-void
-zebra_version(char version)
-{
-
-  zebra.version = version;
-
-}
-
 /*
  * Local Variables:
  * c-basic-offset: 2
index 7c3e393..047c24b 100644 (file)
  * Description        : header file for quagga.c
  * ------------------------------------------------------------------------- */
 
-#include "routing_table.h" /* rt_entry */
-#include "olsr_types.h" /* olsr_ip_addr */
-
-#include <stdint.h>
-#include <stdlib.h>
-
-#define HAVE_SOCKLEN_T
-
-/* Zebra version */
-#ifndef ZEBRA_HEADER_MARKER
-#define ZEBRA_HEADER_MARKER 255
-#endif
-
-#ifndef ZSERV_VERSION
-#define ZSERV_VERSION 1
-#endif
+#include "routing_table.h"
 
 /* Zebra socket */
 #ifndef ZEBRA_SOCKPATH
 #define ZEBRA_SOCKPATH "/var/run/quagga/zserv.api"
 #endif
 
-/* Zebra packet size */
-#define ZEBRA_MAX_PACKET_SIZ           4096
-
-/* Zebra message types */
-#define ZEBRA_IPV4_ROUTE_ADD           7
-#define ZEBRA_IPV4_ROUTE_DELETE                8
-#define ZEBRA_IPV6_ROUTE_ADD            9
-#define ZEBRA_IPV6_ROUTE_DELETE         10
-#define ZEBRA_REDISTRIBUTE_ADD         11
-#define ZEBRA_REDISTRIBUTE_DELETE      12
-#define ZEBRA_MESSAGE_MAX              23
-
-/* Zebra route types */
-#define ZEBRA_ROUTE_OLSR               11
-#define ZEBRA_ROUTE_MAX                        13
-
-/* Zebra flags */
-#define ZEBRA_FLAG_SELECTED            0x10
-
-/* Zebra nexthop flags */
-#define ZEBRA_NEXTHOP_IFINDEX          1
-#define ZEBRA_NEXTHOP_IPV4             3
-#define ZEBRA_NEXTHOP_IPV6              6
-
-/* Zebra message flags */
-#define ZAPI_MESSAGE_NEXTHOP           0x01
-#define ZAPI_MESSAGE_IFINDEX           0x02
-#define ZAPI_MESSAGE_DISTANCE          0x04
-#define ZAPI_MESSAGE_METRIC            0x08
-
-/* Buffer size */
-#define BUFSIZE 1024
-
 /* Quagga plugin flags */
-#define STATUS_CONNECTED 1
-#define OPTION_EXPORT 1
-
-struct zebra_route {
-  unsigned char type;
-  unsigned char flags;
-  unsigned char message;
-  unsigned char prefixlen;
-  union olsr_ip_addr prefix;
-  unsigned char nexthop_num;
-  union olsr_ip_addr *nexthop;
-  unsigned char ifindex_num;
-  uint32_t *ifindex;
-  uint32_t metric;
-  uint8_t distance;
-};
 
 void init_zebra(void);
 void zebra_cleanup(void);
-void zebra_parse(void*);
-int zebra_redistribute(unsigned char);
 int zebra_add_route(const struct rt_entry *);
 int zebra_del_route(const struct rt_entry *);
-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);
-void zebra_version(char);
+void zebra_enable_redistribute(void);
+void zebra_disable_redistribute(void);
 
 /*
  * Local Variables: