* updated to SVN trunk - revision 48
authorBernd Petrovitsch <bernd@firmix.at>
Wed, 10 Oct 2007 21:24:54 +0000 (21:24 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Wed, 10 Oct 2007 21:24:54 +0000 (21:24 +0000)
lib/quagga/Contributors
lib/quagga/Makefile
lib/quagga/src/olsrd_plugin.c
lib/quagga/src/quagga.c
lib/quagga/src/quagga.h

index d03a8e7..eeaddbe 100644 (file)
@@ -2,3 +2,6 @@ This file is to thank people contributing code or do a lot of testing
 
 * Vassilis T. <acinonyxs@yahoo.gr> for a lot of cleanups and fixes
 * Johannes Joemann <5@free.de> for a lot of testing
+* Bernd Petrovitsch <bernd@firmix.at> for support and new plugin-interface
+* Hannes Gredler <hannes@gredler.at> for new routing-core
+* Sven Ola Tucke <mail2news@commando.de> for various bugfixes
index 1c4f48a..6b99dc1 100644 (file)
 # to the project. For more information see the website or contact
 # the copyright holders.
 #
-# $Id: Makefile,v 1.8 2007/10/04 22:29:51 bernd67 Exp $
+# $Id: Makefile,v 1.9 2007/10/10 21:24:54 bernd67 Exp $
 
 OLSRD_PLUGIN = true
 PLUGIN_NAME =  olsrd_quagga
 PLUGIN_VER =   0.2.2
 
-TOPDIR = ../..
+TOPDIR= ../..
 include $(TOPDIR)/Makefile.inc
 
-#CPPFLAGS +=   -DMY_DEBUG 
-CFLAGS +=      -g
-CPPFLAGS +=    -DUSE_UNIX_DOMAIN_SOCKET
+#CPPFLAGS +=-DMY_DEBUG 
+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! 
-#CPPFLAGS +=   -DZEBRA_HEADER_MARKER=255 
+# CPPFLAGS +=-DZEBRA_HEADER_MARKER=255 
 
 ifeq ($(OS),win32)
 default_target install clean:
-       @echo "**** Quagga not supportet on Windows (so it would be pointless to build the Quagga Plugin"
+       @echo "**** Quagga not supportet on Windows (so it would be pointless to build the Quagga Plugin)"
 else
 default_target: $(PLUGIN_FULLNAME)
 
-$(PLUGIN_FULLNAME): $(OBJS) version-script.txt
+$(PLUGIN_FULLNAME): $(OBJS)
                $(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS)
 
 install:       $(PLUGIN_FULLNAME)
index c8e6f08..bc9a2ee 100644 (file)
@@ -19,6 +19,7 @@
 #include <string.h>
 
 #include "olsrd_plugin.h"
+#include "plugin_util.h"
 #include "olsr.h"
 #include "scheduler.h"
 #include "defs.h"
 #define PLUGIN_VERSION "0.2.2"
 #define PLUGIN_AUTHOR  "Immo 'FaUl' Wehrenberg"
 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
-#define PLUGIN_INTERFACE_VERSION 4
+#define PLUGIN_INTERFACE_VERSION 5
 
 static void __attribute__ ((constructor)) my_init(void);
 static void __attribute__ ((destructor)) my_fini(void);
 
-int olsrd_plugin_interface_version(void) {
+static set_plugin_parameter set_redistribute;
+static set_plugin_parameter set_exportroutes;
+static set_plugin_parameter set_distance;
+static set_plugin_parameter set_localpref;
+
+
+int olsrd_plugin_interface_version (void) {
   return PLUGIN_INTERFACE_VERSION;
 }
 
+static const struct olsrd_plugin_parameters plugin_parameters[] = {
+  { .name = "redistribute", .set_plugin_parameter = &set_redistribute, },
+  { .name = "ExportRoutes", .set_plugin_parameter = &set_exportroutes, },
+  { .name = "Distance",     .set_plugin_parameter = &set_distance,     },
+  { .name = "LocalPref",    .set_plugin_parameter = &set_localpref,    },
+};
+
+void olsrd_get_plugin_parameters (const struct olsrd_plugin_parameters **params,
+                                 int *size) {
+  *params = plugin_parameters;
+  *size = sizeof plugin_parameters / sizeof *plugin_parameters;
+}
 
-int olsrd_plugin_register_param(char *key, char *value) {
-  const char *zebra_route_types[] = {"system","kernel","connect","static",
-                             "rip","ripng","ospf","ospf6","isis",
-                             "bgp","hsls", NULL};
-  unsigned char i = 0;
-
-  if(!strcmp(key, "redistribute")) {
-    for (i = 0; zebra_route_types[i]; i++)
-      if (!strcmp(value, zebra_route_types[i])) {
-       zebra_redistribute(i);
-       return 1;
-      }
-  }
-  else if(!strcmp(key, "ExportRoutes")) {
-    if (!strcmp(value, "only")) {
-      if (!olsr_addroute_remove_function(&olsr_ioctl_add_route, AF_INET))
-       puts ("AIII, could not remove the kernel route exporter");
-      if (!olsr_delroute_remove_function(&olsr_ioctl_del_route, AF_INET))
-       puts ("AIII, could not remove the kernel route deleter");
-      olsr_addroute_add_function(&zebra_add_olsr_v4_route, AF_INET);
-      olsr_delroute_add_function(&zebra_del_olsr_v4_route, AF_INET);
-      zebra_export_routes(1);
-      return 1;
+static int set_redistribute (const char *value, 
+                            void *data __attribute__((unused)),
+                            set_plugin_parameter_addon addon __attribute__((unused))) {
+  const char *zebra_route_types[] = {"system","kernel","connect",
+                                             "static","rip","ripng","ospf",
+                                             "ospf6","isis","bgp","hsls"};
+  unsigned int i;
+
+  for (i = 0; i < ARRAYSIZE(zebra_route_types); i++) {
+    if (!strcmp(value, zebra_route_types[i])) {
+      zebra_redistribute(i);
+      return 0;
     }
-    else if (!strcmp(value, "additional")) {
-      olsr_addroute_add_function(&zebra_add_olsr_v4_route, AF_INET);
-      olsr_delroute_add_function(&zebra_del_olsr_v4_route, AF_INET);
-      zebra_export_routes(1);
-      return 1;
-    }
-    else zebra_export_routes(0);
   }
-  else if (!strcmp(key, "Distance")) {
-    unsigned int distance = atoi (value);
-    if (distance < 255)
-      zebra_olsr_distance(distance);
-      return 1;
+  return 1;
+}
+
+static int set_exportroutes (const char *value, 
+                            void *data __attribute__((unused)),
+                            set_plugin_parameter_addon addon __attribute__((unused))) {
+  if (!strcmp(value, "only")) {
+    if (!olsr_addroute_remove_function(&olsr_ioctl_add_route, AF_INET))
+      puts ("AIII, could not remove the kernel route exporter");
+    if (!olsr_delroute_remove_function(&olsr_ioctl_del_route, AF_INET))
+      puts ("AIII, could not remove the kernel route deleter");
+    olsr_addroute_add_function(&zebra_add_olsr_v4_route, AF_INET);
+    olsr_delroute_add_function(&zebra_del_olsr_v4_route, AF_INET);
+    zebra_export_routes(1);
   }
-  
-  else if (!strcmp(key, "LocalPref")) {
-    if (!strcmp(value, "true")) 
-      zebra_olsr_localpref();
-    else if (strcmp (value, "false"))
-      return -1;
-    return 1;
+  else if (!strcmp(value, "additional")) {
+    olsr_addroute_add_function(&zebra_add_olsr_v4_route, AF_INET);
+    olsr_delroute_add_function(&zebra_del_olsr_v4_route, AF_INET);
+    zebra_export_routes(1);
   }
-  return -1;
+  else zebra_export_routes(0);
+  return 0;
+}
+
+static int set_distance(const char *value, void *data __attribute__((unused)), 
+                       set_plugin_parameter_addon addon __attribute__((unused))) {
+  int distance;
+
+  if (set_plugin_int(value, &distance, addon)) return 1;
+  if (distance < 0 || distance > 255) return 1;
+  zebra_olsr_distance(distance);
+  return 0;
+}
+static int set_localpref(const char *value, void *data __attribute__((unused)), 
+                        set_plugin_parameter_addon addon __attribute__((unused))) {
+  int b;
+
+  if (set_plugin_boolean(value, &b, addon)) return 1;
+  if (b) zebra_olsr_localpref();
+  return 0;
 }
 
 
index fe09fd5..3cd4184 100644 (file)
@@ -32,6 +32,7 @@
 #include "log.h"
 #include "defs.h"
 #include "local_hna_set.h"
+#include "routing_table.h"
 
 #ifdef USE_UNIX_DOMAIN_SOCKET
 #include <sys/un.h>
@@ -77,13 +78,16 @@ static void zebra_connect (void);
 
 static uint32_t prefixlentomask (uint8_t);
 static void free_ipv4_route (struct ipv4_route);
+/* 
 static void update_olsr_zebra_routes (struct ipv4_route*, struct ipv4_route*);
 static struct ipv4_route *zebra_create_ipv4_route_table_entry (uint32_t,
                                                               uint32_t,
                                                               uint32_t);
 static struct ipv4_route *zebra_create_ipv4_route_table (void);
 static void zebra_free_ipv4_route_table (struct ipv4_route*);
-static uint8_t masktoprefixlen (uint32_t);
+*/
+
+/*static uint8_t masktoprefixlen (uint32_t);*/
 
 
 #ifdef MY_DEBUG
@@ -163,32 +167,33 @@ void init_zebra (void) {
 
 void zebra_cleanup (void) {
   int i;
+  struct rt_entry *tmp;
+  
   if (zebra.options & OPTION_EXPORT) {
-    struct rt_entry *rt;
-    OLSR_FOR_ALL_RT_ENTRIES(rt) {
-        zebra_del_olsr_v4_route (rt);
-    } OLSR_FOR_ALL_RT_ENTRIES_END(rt);
-  }  
+    OLSR_FOR_ALL_RT_ENTRIES(tmp) {
+      zebra_del_olsr_v4_route(tmp);
+    } OLSR_FOR_ALL_RT_ENTRIES_END(tmp);
+  }
 
-  for (i = 0; ZEBRA_ROUTE_MAX - 1; i++)
+  for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
     if (zebra.redistribute[i]) zebra_disable_redistribute(i + 1);
 }
 
 
 static void zebra_reconnect (void) {
+  struct rt_entry *tmp;
   int i;
 
   zebra_connect();
   if (!zebra.status & STATUS_CONNECTED) return; // try again next time
 
   if (zebra.options & OPTION_EXPORT) {
-    struct rt_entry *rt;
-    OLSR_FOR_ALL_RT_ENTRIES(rt) {
-        zebra_add_olsr_v4_route (rt);
-    } OLSR_FOR_ALL_RT_ENTRIES_END(rt);
+    OLSR_FOR_ALL_RT_ENTRIES(tmp) {
+      zebra_add_olsr_v4_route (tmp);
+    } OLSR_FOR_ALL_RT_ENTRIES_END(tmp);
   }  
 
-  for (i = 0; ZEBRA_ROUTE_MAX - 1; i++)
+  for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
     if (zebra.redistribute[i]) zebra_redistribute(i + 1);
   /* Zebra sends us all routes of type it knows after 
      zebra_redistribute(type) */
@@ -198,6 +203,8 @@ static void zebra_reconnect (void) {
 
 /* Connect to the zebra-daemon, returns a socket */
 static void zebra_connect (void) {
+  
+  int ret;
 
 #ifndef USE_UNIX_DOMAIN_SOCKET
   struct sockaddr_in i;
@@ -212,8 +219,6 @@ static void zebra_connect (void) {
   zebra.sock = socket (AF_UNIX,SOCK_STREAM, 0);
 #endif
 
-  int ret;
-
   if (zebra.sock <0 )
     olsr_exit("(QUAGGA) Could not create socket!", EXIT_FAILURE);
   
@@ -236,7 +241,8 @@ static void zebra_connect (void) {
 /* Sends a command to zebra, command is 
    the command defined in zebra.h, options is the packet-payload, 
    optlen the length, of the payload */
-unsigned char zebra_send_command (unsigned char command, unsigned char * options, int optlen) {
+unsigned char zebra_send_command (unsigned char command, 
+                                  unsigned char *options, int optlen) {
 
 #ifdef ZEBRA_HEADER_MARKER
   char *p = olsr_malloc (optlen + 6, "zebra_send_command");
@@ -290,14 +296,15 @@ unsigned char zebra_send_command (unsigned char command, unsigned char * options
 
 /* Creates a Route-Packet-Payload, needs address, netmask, nexthop, 
    distance, and a pointer of an size_t */
-static unsigned char* zebra_route_packet (struct ipv4_route r, ssize_t *optlen) {
+static unsigned char* zebra_route_packet (struct ipv4_route r, 
+                                          ssize_t *optlen) {
 
   int count;
 
   unsigned char *cmdopt, *t;
   *optlen = 4; // first: type, flags, message, prefixlen
   *optlen += r.prefixlen / 8 + (r.prefixlen % 8 ? 1 : 0); // + prefix
-  if (r.message & ZAPI_MESSAGE_NEXTHOP)
+  if (r.message & ZAPI_MESSAGE_NEXTHOP) {
     if (r.nexthops->type == ZEBRA_NEXTHOP_IPV4 
        || r.nexthops->type == ZEBRA_NEXTHOP_IPV4_IFINDEX){
       *optlen += (sizeof r.nexthops->payload.v4 
@@ -305,6 +312,7 @@ static unsigned char* zebra_route_packet (struct ipv4_route r, ssize_t *optlen)
     }
     else if (r.nexthops->type == 0) 
       *optlen += 5;
+  }
   if (r.message & ZAPI_MESSAGE_IFINDEX)
     *optlen += r.ind_num * sizeof *r.index + 1;
   if (r.message & ZAPI_MESSAGE_DISTANCE)
@@ -401,9 +409,8 @@ void zebra_check (void* foo) {
     f = data;
     do {
       ret = zebra_parse_packet (f, len);
-      if (!ret) // something wired happened
+      if (!ret) // something wired happened
        olsr_exit ("(QUAGGA) Zero message length??? ", EXIT_FAILURE);
-      }
       f += ret;
     } while ((f - data) < len);
     free (data);
@@ -715,6 +722,7 @@ static void free_ipv4_route (struct ipv4_route r) {
 
 }
 
+/*
 static uint8_t masktoprefixlen (uint32_t mask) {
   
   uint8_t prefixlen = 0;
@@ -726,6 +734,7 @@ static uint8_t masktoprefixlen (uint32_t mask) {
   return prefixlen;
   
 }
+*/
 
 int zebra_add_olsr_v4_route (struct rt_entry *r) {
   
@@ -735,9 +744,9 @@ int zebra_add_olsr_v4_route (struct rt_entry *r) {
   route.type = ZEBRA_ROUTE_OLSR; // OLSR
   route.message = ZAPI_MESSAGE_METRIC;
   route.flags = zebra.flags;
-  route.prefixlen = r->rt_dst.prefix_len;
+  route.prefixlen =(r->rt_dst.prefix_len);
   route.prefix = r->rt_dst.prefix.v4;
-  if ((r->rt_best->rtp_nexthop.gateway.v4 == r->rt_dst.prefix.v4 &&
+  if ((r->rt_best->rtp_nexthop.gateway.v4 == r->rt_dst.prefix.v4 && 
        route.prefixlen == 32)) {
     route.message |= ZAPI_MESSAGE_IFINDEX | ZAPI_MESSAGE_NEXTHOP;
     route.ind_num = 1;
@@ -783,7 +792,8 @@ int zebra_del_olsr_v4_route (struct rt_entry *r) {
   route.flags = zebra.flags;
   route.prefixlen = r->rt_dst.prefix_len;
   route.prefix = r->rt_dst.prefix.v4;
-  if ((r->rt_best->rtp_nexthop.gateway.v4 == r->rt_dst.prefix.v4 && route.prefixlen == 32)){
+  if ((r->rt_best->rtp_nexthop.gateway.v4 == r->rt_dst.prefix.v4 && 
+       route.prefixlen == 32)){
     route.message |= ZAPI_MESSAGE_IFINDEX;
     route.ind_num = 1;
     route.index = olsr_malloc (sizeof *route.index, 
@@ -813,12 +823,13 @@ int zebra_del_olsr_v4_route (struct rt_entry *r) {
     route.distance = zebra.distance;
   }
 
-  del_v4_route_status(route);
+  retval = zebra_delete_v4_route(route);
+
   free_ipv4_route (route);
   return retval;
 }
 
-void zebra_olsr_distance (char dist) {
+void zebra_olsr_distance (unsigned char dist) {
   zebra.distance = dist;
 }
 
@@ -826,7 +837,7 @@ void zebra_olsr_localpref (void) {
   zebra.flags &= ZEBRA_FLAG_SELECTED;
 }
 
-void zebra_export (char t) {
+void zebra_export_routes (unsigned char t) {
   if (t)
     zebra.options |= OPTION_EXPORT;
   else
index 238e46d..83f2032 100644 (file)
@@ -62,9 +62,9 @@ int zebra_redistribute (unsigned char);
 int zebra_disable_redistribute (unsigned char);
 int add_hna4_route (struct ipv4_route);
 int delete_hna4_route (struct ipv4_route);
-void *my_realloc (void *, size_t, const char*);
-int zebra_add_olsr_v4_route (struct rt_entry*);
-int zebra_del_olsr_v4_route (struct rt_entry*);
+void *my_realloc (void *, size_t, const char *);
+int zebra_add_olsr_v4_route (struct rt_entry *);
+int zebra_del_olsr_v4_route (struct rt_entry *);
 void zebra_olsr_localpref (void);
-void zebra_olsr_distance (char);
-void zebra_export_routes (unsigned char);
+void zebra_olsr_distance (unsigned char);
+void zebra_export_routes(unsigned char);