[pacakges] olsrd: Update to v0.6.0
authorVasilis Tsiligiannis <acinonyx@openwrt.gr>
Thu, 27 May 2010 21:43:30 +0000 (21:43 +0000)
committerVasilis Tsiligiannis <acinonyx@openwrt.gr>
Thu, 27 May 2010 21:43:30 +0000 (21:43 +0000)
SVN-Revision: 21585

net/olsrd/Makefile
net/olsrd/files/olsrd.config
net/olsrd/patches/100-no_forwarding_override.patch
net/olsrd/patches/150-olsrd_quagga_backport.patch [deleted file]

index 1c7b274468682d7056141aaf781956f2d9f774e2..ca8a3b80bc7663dc4e54fb3983c0921834f0fe74 100644 (file)
@@ -1,5 +1,5 @@
 # 
-# Copyright (C) 2009 OpenWrt.org
+# Copyright (C) 2009-2010 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=olsrd
-PKG_VERSION:=0.5.6-r8
+PKG_VERSION:=0.6.0
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
-PKG_SOURCE_URL:=http://www.olsr.org/releases/0.5
-PKG_MD5SUM:=aef6f4350c44fd0ad015a26621ef9607
+PKG_SOURCE_URL:=http://www.olsr.org/releases/0.6
+PKG_MD5SUM:=8425a10e315be5e061143ac310f2424b
 
 include $(INCLUDE_DIR)/package.mk
 
index 793c4f6099638babc4e60efc015239866de96a70..1e53a1d743e9577c24df3b64f33221c3581c3561 100644 (file)
@@ -8,7 +8,7 @@ config LoadPlugin
        option library 'olsrd_arprefresh.so.0.1'
 
 config LoadPlugin
-       option library 'olsrd_dyn_gw.so.0.4'
+       option library 'olsrd_dyn_gw.so.0.5'
 
 config LoadPlugin
        option library 'olsrd_httpinfo.so.0.1'
index c6e1b4e759ab8e068de749290e13528f8bd7114d..1a54574ef7ef40fc727b2b096705271cbe21e7c0 100644 (file)
@@ -1,34 +1,29 @@
 --- a/src/linux/net.c
 +++ b/src/linux/net.c
-@@ -115,6 +115,7 @@
- int
- enable_ip_forwarding(int version)
- {
+@@ -171,11 +171,13 @@ static bool is_at_least_linuxkernel_2_6_
+  */
+ void
net_os_set_global_ifoptions(void) {
 +#if 0
-   FILE *proc_fwd;
-   const char *const procfile = version == AF_INET ? "/proc/sys/net/ipv4/ip_forward" : "/proc/sys/net/ipv6/conf/all/forwarding";
-@@ -150,6 +151,7 @@
-     }
-     fclose(proc_fwd);
+   if (writeToProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, &orig_fwd_state, '1')) {
+     OLSR_PRINTF(1, "Warning, could not enable IP forwarding!\n"
+         "you should manually ensure that IP forwarding is enabled!\n\n");
+     olsr_startup_sleep(3);
    }
 +#endif
-   return 1;
- }
  
-@@ -276,6 +278,7 @@
+   if (olsr_cnf->smart_gw_active) {
+     char procfile[FILENAME_MAX];
+@@ -266,10 +268,12 @@ net_os_restore_ifoptions(void)
    OLSR_PRINTF(1, "Restoring network state\n");
  
-   /* Restore IP forwarding to "off" */
 +#if 0
-   if (orig_fwd_state == '0') {
-     const char *const procfile = version == AF_INET ? "/proc/sys/net/ipv4/ip_forward" : "/proc/sys/net/ipv6/conf/all/forwarding";
-     FILE *proc_fd;
-@@ -288,6 +291,7 @@
-       fclose(proc_fd);
-     }
+   /* Restore IP forwarding to "off" */
+   if (writeToProc(olsr_cnf->ip_version == AF_INET ? PROC_IPFORWARD_V4 : PROC_IPFORWARD_V6, NULL, orig_fwd_state)) {
+     OLSR_PRINTF(1, "Error, could not restore ip_forward settings\n");
    }
 +#endif
  
-   /* Restore global ICMP redirect setting */
-   if (orig_global_redirect_state != '0') {
+   if (olsr_cnf->smart_gw_active) {
+     /* Generate the procfile name */
diff --git a/net/olsrd/patches/150-olsrd_quagga_backport.patch b/net/olsrd/patches/150-olsrd_quagga_backport.patch
deleted file mode 100644 (file)
index a8ff830..0000000
+++ /dev/null
@@ -1,3916 +0,0 @@
---- a/lib/quagga/Makefile
-+++ b/lib/quagga/Makefile
-@@ -40,21 +40,19 @@
- 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
--#uncomment the following line only if you are sure what you're doing, it will 
--#probably break things! 
--# 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 supported on Windows (so it would be pointless to build the Quagga plugin)"
-+
- else
-+
- default_target: $(PLUGIN_FULLNAME)
- $(PLUGIN_FULLNAME): $(OBJS) version-script.txt
-@@ -66,4 +64,5 @@
- clean:
-               rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME)
-+
- endif
---- /dev/null
-+++ b/lib/quagga/patches/quagga-0.98.6.diff
-@@ -0,0 +1,860 @@
-+diff -Nur quagga-0.98.6/bgpd/bgp_vty.c quagga-0.98.6.patched/bgpd/bgp_vty.c
-+--- quagga-0.98.6/bgpd/bgp_vty.c      2006-03-30 18:12:25.000000000 +0200
-++++ quagga-0.98.6.patched/bgpd/bgp_vty.c      2007-12-30 14:18:22.000000000 +0200
-+@@ -3,6 +3,9 @@
-+ 
-+ This file is part of GNU Zebra.
-+ 
-++This file was modified from the original on 30/12/2007
-++by Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
-++
-+ GNU Zebra is free software; you can redistribute it and/or modify it
-+ under the terms of the GNU General Public License as published by the
-+ Free Software Foundation; either version 2, or (at your option) any
-+@@ -7793,8 +7796,12 @@
-+      return ZEBRA_ROUTE_STATIC;
-+       else if (strncmp (str, "r", 1) == 0)
-+      return ZEBRA_ROUTE_RIP;
-+-      else if (strncmp (str, "o", 1) == 0)
-++      else if (strncmp (str, "ol", 2) == 0)
-++     return ZEBRA_ROUTE_OLSR;
-++      else if (strncmp (str, "os", 2) == 0)
-+      return ZEBRA_ROUTE_OSPF;
-++      else if (strncmp (str, "ba", 2) == 0)
-++     return ZEBRA_ROUTE_BATMAN;
-+     }
-+   if (afi == AFI_IP6)
-+     {
-+@@ -7806,21 +7813,28 @@
-+      return ZEBRA_ROUTE_STATIC;
-+       else if (strncmp (str, "r", 1) == 0)
-+      return ZEBRA_ROUTE_RIPNG;
-+-      else if (strncmp (str, "o", 1) == 0)
-++      else if (strncmp (str, "os", 2) == 0)
-+      return ZEBRA_ROUTE_OSPF6;
-++      else if (strncmp (str, "ol", 2) == 0)
-++     return ZEBRA_ROUTE_OLSR;
-++      else if (strncmp (str, "ba", 2) == 0)
-++     return ZEBRA_ROUTE_BATMAN;
-+     }
-+   return 0;
-+ }
-+ 
-+ DEFUN (bgp_redistribute_ipv4,
-+        bgp_redistribute_ipv4_cmd,
-+-       "redistribute (connected|kernel|ospf|rip|static)",
-++       "redistribute (connected|kernel|ospf|rip|static|olsr|batman)",
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-+-       "Static routes\n")
-++       "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-++       )
-+ {
-+   int type;
-+ 
-+@@ -7835,13 +7849,15 @@
-+ 
-+ DEFUN (bgp_redistribute_ipv4_rmap,
-+        bgp_redistribute_ipv4_rmap_cmd,
-+-       "redistribute (connected|kernel|ospf|rip|static) route-map WORD",
-++       "redistribute (connected|kernel|ospf|rip|static|olsr|batman) route-map WORD",
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Route map reference\n"
-+        "Pointer to route-map entries\n")
-+ {
-+@@ -7860,13 +7876,15 @@
-+ 
-+ DEFUN (bgp_redistribute_ipv4_metric,
-+        bgp_redistribute_ipv4_metric_cmd,
-+-       "redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295>",
-++       "redistribute (connected|kernel|ospf|rip|static|olsr|batman) metric <0-4294967295>",
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "Default metric\n")
-+ {
-+@@ -7887,13 +7905,15 @@
-+ 
-+ DEFUN (bgp_redistribute_ipv4_rmap_metric,
-+        bgp_redistribute_ipv4_rmap_metric_cmd,
-+-       "redistribute (connected|kernel|ospf|rip|static) route-map WORD metric <0-4294967295>",
-++       "redistribute (connected|kernel|ospf|rip|static|olsr|batman) route-map WORD metric <0-4294967295>",
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Route map reference\n"
-+        "Pointer to route-map entries\n"
-+        "Metric for redistributed routes\n"
-+@@ -7917,13 +7937,15 @@
-+ 
-+ DEFUN (bgp_redistribute_ipv4_metric_rmap,
-+        bgp_redistribute_ipv4_metric_rmap_cmd,
-+-       "redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295> route-map WORD",
-++       "redistribute (connected|kernel|ospf|rip|static|olsr|batman) metric <0-4294967295> route-map WORD",
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "Default metric\n"
-+        "Route map reference\n"
-+@@ -7947,14 +7969,17 @@
-+ 
-+ DEFUN (no_bgp_redistribute_ipv4,
-+        no_bgp_redistribute_ipv4_cmd,
-+-       "no redistribute (connected|kernel|ospf|rip|static)",
-++       "no redistribute (connected|kernel|ospf|rip|static|olsr|batman)",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-+-       "Static routes\n")
-++       "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-++       )
-+ {
-+   int type;
-+ 
-+@@ -7970,7 +7995,7 @@
-+ 
-+ DEFUN (no_bgp_redistribute_ipv4_rmap,
-+        no_bgp_redistribute_ipv4_rmap_cmd,
-+-       "no redistribute (connected|kernel|ospf|rip|static) route-map WORD",
-++       "no redistribute (connected|kernel|ospf|rip|static|olsr|batman) route-map WORD",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+@@ -7978,6 +8003,8 @@
-+        "Open Shurtest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Route map reference\n"
-+        "Pointer to route-map entries\n")
-+ {
-+@@ -7996,7 +8023,7 @@
-+ 
-+ DEFUN (no_bgp_redistribute_ipv4_metric,
-+        no_bgp_redistribute_ipv4_metric_cmd,
-+-       "no redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295>",
-++       "no redistribute (connected|kernel|ospf|rip|static|olsr|batman) metric <0-4294967295>",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+@@ -8004,6 +8031,8 @@
-+        "Open Shurtest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "Default metric\n")
-+ {
-+@@ -8022,7 +8051,7 @@
-+ 
-+ DEFUN (no_bgp_redistribute_ipv4_rmap_metric,
-+        no_bgp_redistribute_ipv4_rmap_metric_cmd,
-+-       "no redistribute (connected|kernel|ospf|rip|static) route-map WORD metric <0-4294967295>",
-++       "no redistribute (connected|kernel|ospf|rip|static|olsr|batman) route-map WORD metric <0-4294967295>",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+@@ -8030,6 +8059,8 @@
-+        "Open Shurtest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Route map reference\n"
-+        "Pointer to route-map entries\n"
-+        "Metric for redistributed routes\n"
-+@@ -8051,7 +8082,7 @@
-+ 
-+ ALIAS (no_bgp_redistribute_ipv4_rmap_metric,
-+        no_bgp_redistribute_ipv4_metric_rmap_cmd,
-+-       "no redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295> route-map WORD",
-++       "no redistribute (connected|kernel|ospf|rip|static|olsr|batman) metric <0-4294967295> route-map WORD",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+@@ -8059,6 +8090,8 @@
-+        "Open Shurtest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "Default metric\n"
-+        "Route map reference\n"
-+@@ -8067,13 +8100,16 @@
-+ #ifdef HAVE_IPV6
-+ DEFUN (bgp_redistribute_ipv6,
-+        bgp_redistribute_ipv6_cmd,
-+-       "redistribute (connected|kernel|ospf6|ripng|static)",
-++       "redistribute (connected|kernel|ospf6|ripng|static|olsr|batman)",
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-+-       "Static routes\n")
-++       "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-++       )
-+ {
-+   int type;
-+ 
-+@@ -8089,13 +8125,15 @@
-+ 
-+ DEFUN (bgp_redistribute_ipv6_rmap,
-+        bgp_redistribute_ipv6_rmap_cmd,
-+-       "redistribute (connected|kernel|ospf6|ripng|static) route-map WORD",
-++       "redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) route-map WORD",
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Route map reference\n"
-+        "Pointer to route-map entries\n")
-+ {
-+@@ -8114,13 +8152,15 @@
-+ 
-+ DEFUN (bgp_redistribute_ipv6_metric,
-+        bgp_redistribute_ipv6_metric_cmd,
-+-       "redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295>",
-++       "redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) metric <0-4294967295>",
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "Default metric\n")
-+ {
-+@@ -8141,13 +8181,15 @@
-+ 
-+ DEFUN (bgp_redistribute_ipv6_rmap_metric,
-+        bgp_redistribute_ipv6_rmap_metric_cmd,
-+-       "redistribute (connected|kernel|ospf6|ripng|static) route-map WORD metric <0-4294967295>",
-++       "redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) route-map WORD metric <0-4294967295>",
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Route map reference\n"
-+        "Pointer to route-map entries\n"
-+        "Metric for redistributed routes\n"
-+@@ -8171,13 +8213,15 @@
-+ 
-+ DEFUN (bgp_redistribute_ipv6_metric_rmap,
-+        bgp_redistribute_ipv6_metric_rmap_cmd,
-+-       "redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295> route-map WORD",
-++       "redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) metric <0-4294967295> route-map WORD",
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "Default metric\n"
-+        "Route map reference\n"
-+@@ -8201,14 +8245,17 @@
-+ 
-+ DEFUN (no_bgp_redistribute_ipv6,
-+        no_bgp_redistribute_ipv6_cmd,
-+-       "no redistribute (connected|kernel|ospf6|ripng|static)",
-++       "no redistribute (connected|kernel|ospf6|ripng|static|olsr|batman)",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+        "Kernel routes\n"
-+        "Open Shurtest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-+-       "Static routes\n")
-++       "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-++      )
-+ {
-+   int type;
-+ 
-+@@ -8224,7 +8271,7 @@
-+ 
-+ DEFUN (no_bgp_redistribute_ipv6_rmap,
-+        no_bgp_redistribute_ipv6_rmap_cmd,
-+-       "no redistribute (connected|kernel|ospf6|ripng|static) route-map WORD",
-++       "no redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) route-map WORD",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+@@ -8232,6 +8279,8 @@
-+        "Open Shurtest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Route map reference\n"
-+        "Pointer to route-map entries\n")
-+ {
-+@@ -8250,7 +8299,7 @@
-+ 
-+ DEFUN (no_bgp_redistribute_ipv6_metric,
-+        no_bgp_redistribute_ipv6_metric_cmd,
-+-       "no redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295>",
-++       "no redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) metric <0-4294967295>",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+@@ -8258,6 +8307,8 @@
-+        "Open Shurtest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "Default metric\n")
-+ {
-+@@ -8276,7 +8327,7 @@
-+ 
-+ DEFUN (no_bgp_redistribute_ipv6_rmap_metric,
-+        no_bgp_redistribute_ipv6_rmap_metric_cmd,
-+-       "no redistribute (connected|kernel|ospf6|ripng|static) route-map WORD metric <0-4294967295>",
-++       "no redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) route-map WORD metric <0-4294967295>",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+@@ -8284,6 +8335,8 @@
-+        "Open Shurtest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Route map reference\n"
-+        "Pointer to route-map entries\n"
-+        "Metric for redistributed routes\n"
-+@@ -8305,7 +8358,7 @@
-+ 
-+ ALIAS (no_bgp_redistribute_ipv6_rmap_metric,
-+        no_bgp_redistribute_ipv6_metric_rmap_cmd,
-+-       "no redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295> route-map WORD",
-++       "no redistribute (connected|kernel|ospf6|ripng|static|olsr|batman) metric <0-4294967295> route-map WORD",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Connected\n"
-+@@ -8313,6 +8366,8 @@
-+        "Open Shurtest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-+        "Static routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "Default metric\n"
-+        "Route map reference\n"
-+@@ -8325,7 +8380,7 @@
-+ {
-+   int i;
-+   const char *str[] = { "system", "kernel", "connected", "static", "rip",
-+-               "ripng", "ospf", "ospf6", "isis", "bgp"};
-++               "ripng", "ospf", "ospf6", "isis", "bgp", "hsls", "olsr", "batman"};
-+ 
-+   /* Unicast redistribution only.  */
-+   if (safi != SAFI_UNICAST)
-+diff -Nur quagga-0.98.6/lib/zebra.h quagga-0.98.6.patched/lib/zebra.h
-+--- quagga-0.98.6/lib/zebra.h 2005-06-15 14:54:18.000000000 +0300
-++++ quagga-0.98.6.patched/lib/zebra.h 2007-12-30 14:18:22.000000000 +0200
-+@@ -3,6 +3,9 @@
-+ 
-+ This file is part of GNU Zebra.
-+ 
-++This file was modified from the original on 30/12/2007
-++by Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
-++
-+ GNU Zebra is free software; you can redistribute it and/or modify it
-+ under the terms of the GNU General Public License as published by the
-+ Free Software Foundation; either version 2, or (at your option) any
-+@@ -378,7 +381,9 @@
-+ #define ZEBRA_ROUTE_ISIS                 8
-+ #define ZEBRA_ROUTE_BGP                  9
-+ #define ZEBRA_ROUTE_HSLS              10
-+-#define ZEBRA_ROUTE_MAX                  11
-++#define ZEBRA_ROUTE_OLSR              11
-++#define ZEBRA_ROUTE_BATMAN            12
-++#define ZEBRA_ROUTE_MAX                  13
-+ 
-+ /* Zebra's family types. */
-+ #define ZEBRA_FAMILY_IPV4                1
-+diff -Nur quagga-0.98.6/ospfd/ospf_vty.c quagga-0.98.6.patched/ospfd/ospf_vty.c
-+--- quagga-0.98.6/ospfd/ospf_vty.c    2006-03-30 17:41:20.000000000 +0200
-++++ quagga-0.98.6.patched/ospfd/ospf_vty.c    2007-12-30 14:18:22.000000000 +0200
-+@@ -3,6 +3,9 @@
-+  *
-+  * This file is part of GNU Zebra.
-+  *
-++ * This file was modified from the original on 30/12/2007
-++ * by Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
-++ *
-+  * GNU Zebra is free software; you can redistribute it and/or modify it
-+  * under the terms of the GNU General Public License as published by the
-+  * Free Software Foundation; either version 2, or (at your option) any
-+@@ -106,11 +109,15 @@
-+     *source = ZEBRA_ROUTE_STATIC;
-+   else if (strncmp (str, "r", 1) == 0)
-+     *source = ZEBRA_ROUTE_RIP;
-+-  else if (strncmp (str, "b", 1) == 0)
-++  else if (strncmp (str, "bg", 2) == 0)
-+     *source = ZEBRA_ROUTE_BGP;
-++  else if (strncmp (str, "ol", 2) == 0)
-++    *source = ZEBRA_ROUTE_OLSR;
-++  else if (strncmp (str, "ba", 2) == 0)
-++    *source = ZEBRA_ROUTE_BATMAN;
-+   else
-+     return 0;
-+-
-++  
-+   return 1;
-+ }
-+ 
-+@@ -5302,13 +5309,15 @@
-+ \f
-+ DEFUN (ospf_redistribute_source_metric_type,
-+        ospf_redistribute_source_metric_type_routemap_cmd,
-+-       "redistribute (kernel|connected|static|rip|bgp) metric <0-16777214> metric-type (1|2) route-map WORD",
-++       "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric <0-16777214> metric-type (1|2) route-map WORD",
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "OSPF default metric\n"
-+        "OSPF exterior metric type for redistributed routes\n"
-+@@ -5346,13 +5355,15 @@
-+ 
-+ ALIAS (ospf_redistribute_source_metric_type,
-+        ospf_redistribute_source_metric_type_cmd,
-+-       "redistribute (kernel|connected|static|rip|bgp) metric <0-16777214> metric-type (1|2)",
-++       "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric <0-16777214> metric-type (1|2)",
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "OSPF default metric\n"
-+        "OSPF exterior metric type for redistributed routes\n"
-+@@ -5361,25 +5372,29 @@
-+ 
-+ ALIAS (ospf_redistribute_source_metric_type,
-+        ospf_redistribute_source_metric_cmd,
-+-       "redistribute (kernel|connected|static|rip|bgp) metric <0-16777214>",
-++       "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric <0-16777214>",
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "OSPF default metric\n")
-+ 
-+ DEFUN (ospf_redistribute_source_type_metric,
-+        ospf_redistribute_source_type_metric_routemap_cmd,
-+-       "redistribute (kernel|connected|static|rip|bgp) metric-type (1|2) metric <0-16777214> route-map WORD",
-++       "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric-type (1|2) metric <0-16777214> route-map WORD",
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "OSPF exterior metric type for redistributed routes\n"
-+        "Set OSPF External Type 1 metrics\n"
-+        "Set OSPF External Type 2 metrics\n"
-+@@ -5417,13 +5432,15 @@
-+ 
-+ ALIAS (ospf_redistribute_source_type_metric,
-+        ospf_redistribute_source_type_metric_cmd,
-+-       "redistribute (kernel|connected|static|rip|bgp) metric-type (1|2) metric <0-16777214>",
-++       "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric-type (1|2) metric <0-16777214>",
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "OSPF exterior metric type for redistributed routes\n"
-+        "Set OSPF External Type 1 metrics\n"
-+        "Set OSPF External Type 2 metrics\n"
-+@@ -5432,7 +5449,7 @@
-+ 
-+ ALIAS (ospf_redistribute_source_type_metric,
-+        ospf_redistribute_source_type_cmd,
-+-       "redistribute (kernel|connected|static|rip|bgp) metric-type (1|2)",
-++       "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric-type (1|2)",
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+@@ -5440,28 +5457,35 @@
-+        "Routing Information Protocol (RIP)\n"
-+        "Border Gateway Protocol (BGP)\n"
-+        "OSPF exterior metric type for redistributed routes\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Set OSPF External Type 1 metrics\n"
-+        "Set OSPF External Type 2 metrics\n")
-+ 
-+ ALIAS (ospf_redistribute_source_type_metric,
-+        ospf_redistribute_source_cmd,
-+-       "redistribute (kernel|connected|static|rip|bgp)",
-++       "redistribute (kernel|connected|static|rip|bgp|olsr|batman)",
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+-       "Border Gateway Protocol (BGP)\n")
-++       "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-++     )
-+ 
-+ DEFUN (ospf_redistribute_source_metric_routemap,
-+        ospf_redistribute_source_metric_routemap_cmd,
-+-       "redistribute (kernel|connected|static|rip|bgp) metric <0-16777214> route-map WORD",
-++       "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric <0-16777214> route-map WORD",
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Metric for redistributed routes\n"
-+        "OSPF default metric\n"
-+        "Route map reference\n"
-+@@ -5490,13 +5514,15 @@
-+ 
-+ DEFUN (ospf_redistribute_source_type_routemap,
-+        ospf_redistribute_source_type_routemap_cmd,
-+-       "redistribute (kernel|connected|static|rip|bgp) metric-type (1|2) route-map WORD",
-++       "redistribute (kernel|connected|static|rip|bgp|olsr|batman) metric-type (1|2) route-map WORD",
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "OSPF exterior metric type for redistributed routes\n"
-+        "Set OSPF External Type 1 metrics\n"
-+        "Set OSPF External Type 2 metrics\n"
-+@@ -5526,13 +5552,15 @@
-+ 
-+ DEFUN (ospf_redistribute_source_routemap,
-+        ospf_redistribute_source_routemap_cmd,
-+-       "redistribute (kernel|connected|static|rip|bgp) route-map WORD",
-++       "redistribute (kernel|connected|static|rip|bgp|olsr|batman) route-map WORD",
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+        "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Route map reference\n"
-+        "Pointer to route-map entries\n")
-+ {
-+@@ -5553,14 +5581,17 @@
-+ 
-+ DEFUN (no_ospf_redistribute_source,
-+        no_ospf_redistribute_source_cmd,
-+-       "no redistribute (kernel|connected|static|rip|bgp)",
-++       "no redistribute (kernel|connected|static|rip|bgp|olsr|batman)",
-+        NO_STR
-+        "Redistribute information from another routing protocol\n"
-+        "Kernel routes\n"
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+-       "Border Gateway Protocol (BGP)\n")
-++       "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-++       )
-+ {
-+   struct ospf *ospf = vty->index;
-+   int source;
-+@@ -5574,7 +5605,7 @@
-+ 
-+ DEFUN (ospf_distribute_list_out,
-+        ospf_distribute_list_out_cmd,
-+-       "distribute-list WORD out (kernel|connected|static|rip|bgp)",
-++       "distribute-list WORD out (kernel|connected|static|rip|bgp|olsr|batman)",
-+        "Filter networks in routing updates\n"
-+        "Access-list name\n"
-+        OUT_STR
-+@@ -5582,7 +5613,10 @@
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+-       "Border Gateway Protocol (BGP)\n")
-++       "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-++)
-+ {
-+   struct ospf *ospf = vty->index;
-+   int source;
-+@@ -5596,7 +5630,7 @@
-+ 
-+ DEFUN (no_ospf_distribute_list_out,
-+        no_ospf_distribute_list_out_cmd,
-+-       "no distribute-list WORD out (kernel|connected|static|rip|bgp)",
-++       "no distribute-list WORD out (kernel|connected|static|rip|bgp|olsr|batman)",
-+        NO_STR
-+        "Filter networks in routing updates\n"
-+        "Access-list name\n"
-+@@ -5605,7 +5639,10 @@
-+        "Connected\n"
-+        "Static routes\n"
-+        "Routing Information Protocol (RIP)\n"
-+-       "Border Gateway Protocol (BGP)\n")
-++       "Border Gateway Protocol (BGP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-++)
-+ {
-+   struct ospf *ospf = vty->index;
-+   int source;
-+@@ -7121,7 +7158,8 @@
-+ 
-+ \f
-+ const char *distribute_str[] = { "system", "kernel", "connected", "static",
-+-                             "rip", "ripng", "ospf", "ospf6", "isis", "bgp"};
-++                             "rip", "ripng", "ospf", "ospf6", "isis", "bgp",
-++                             "hsls","olsr","batman"};
-+ int
-+ config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf)
-+ {
-+diff -Nur quagga-0.98.6/zebra/redistribute.c quagga-0.98.6.patched/zebra/redistribute.c
-+--- quagga-0.98.6/zebra/redistribute.c        2005-06-15 14:54:51.000000000 +0300
-++++ quagga-0.98.6.patched/zebra/redistribute.c        2007-12-30 14:18:22.000000000 +0200
-+@@ -3,6 +3,9 @@
-+  *
-+  * This file is part of GNU Zebra.
-+  *
-++ * This file was modified from the original on 30/12/2007
-++ * by Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
-++ *
-+  * GNU Zebra is free software; you can redistribute it and/or modify it
-+  * under the terms of the GNU General Public License as published by the
-+  * Free Software Foundation; either version 2, or (at your option) any
-+@@ -253,6 +256,8 @@
-+     case ZEBRA_ROUTE_OSPF:
-+     case ZEBRA_ROUTE_OSPF6:
-+     case ZEBRA_ROUTE_BGP:
-++    case ZEBRA_ROUTE_OLSR:
-++    case ZEBRA_ROUTE_BATMAN:
-+       if (! client->redist[type])
-+      {
-+        client->redist[type] = 1;
-+@@ -281,6 +286,8 @@
-+     case ZEBRA_ROUTE_OSPF:
-+     case ZEBRA_ROUTE_OSPF6:
-+     case ZEBRA_ROUTE_BGP:
-++    case ZEBRA_ROUTE_OLSR:
-++    case ZEBRA_ROUTE_BATMAN:
-+       client->redist[type] = 0;
-+       break;
-+     default:
-+diff -Nur quagga-0.98.6/zebra/zebra_vty.c quagga-0.98.6.patched/zebra/zebra_vty.c
-+--- quagga-0.98.6/zebra/zebra_vty.c   2004-12-18 18:03:29.000000000 +0200
-++++ quagga-0.98.6.patched/zebra/zebra_vty.c   2007-12-30 14:25:48.000000000 +0200
-+@@ -53,6 +53,10 @@
-+       return "isis";
-+     case ZEBRA_ROUTE_BGP:
-+       return "bgp";
-++    case ZEBRA_ROUTE_OLSR:
-++      return "olsr";
-++    case ZEBRA_ROUTE_BATMAN:
-++      return "batman";
-+     default:
-+       return "unknown";
-+     }
-+@@ -84,6 +88,12 @@
-+       return 'I';
-+     case ZEBRA_ROUTE_BGP:
-+       return 'B';
-++    case ZEBRA_ROUTE_HSLS:
-++      return 'H';
-++    case ZEBRA_ROUTE_OLSR:
-++      return 'L';
-++    case ZEBRA_ROUTE_BATMAN:
-++      return 'M';
-+     default:
-+       return '?';
-+     }
-+@@ -755,8 +765,8 @@
-+ }
-+ 
-+ #define SHOW_ROUTE_V4_HEADER "Codes: K - kernel route, C - connected, " \
-+-  "S - static, R - RIP, O - OSPF,%s       I - ISIS, B - BGP, " \
-+-  "> - selected route, * - FIB route%s%s"
-++  "S - static, R - RIP, O - OSPF,%s       I - ISIS, B - BGP, H - HSLS, " \
-++  "L - OLSR, M - BATMAN, > - selected route, * - FIB route%s%s"
-+ 
-+ DEFUN (show_ip_route,
-+        show_ip_route_cmd,
-+@@ -874,7 +884,7 @@
-+ 
-+ DEFUN (show_ip_route_protocol,
-+        show_ip_route_protocol_cmd,
-+-       "show ip route (bgp|connected|isis|kernel|ospf|rip|static)",
-++       "show ip route (bgp|connected|isis|kernel|ospf|rip|olsr|batman|static)",
-+        SHOW_STR
-+        IP_STR
-+        "IP routing table\n"
-+@@ -884,6 +894,8 @@
-+        "Kernel\n"
-+        "Open Shortest Path First (OSPF)\n"
-+        "Routing Information Protocol (RIP)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Static routes\n")
-+ {
-+   int type;
-+@@ -892,13 +904,13 @@
-+   struct rib *rib;
-+   int first = 1;
-+ 
-+-  if (strncmp (argv[0], "b", 1) == 0)
-++  if (strncmp (argv[0], "bg", 2) == 0)
-+     type = ZEBRA_ROUTE_BGP;
-+   else if (strncmp (argv[0], "c", 1) == 0)
-+     type = ZEBRA_ROUTE_CONNECT;
-+   else if (strncmp (argv[0], "k", 1) ==0)
-+     type = ZEBRA_ROUTE_KERNEL;
-+-  else if (strncmp (argv[0], "o", 1) == 0)
-++  else if (strncmp (argv[0], "os", 2) == 0)
-+     type = ZEBRA_ROUTE_OSPF;
-+   else if (strncmp (argv[0], "i", 1) == 0)
-+     type = ZEBRA_ROUTE_ISIS;
-+@@ -906,6 +918,10 @@
-+     type = ZEBRA_ROUTE_RIP;
-+   else if (strncmp (argv[0], "s", 1) == 0)
-+     type = ZEBRA_ROUTE_STATIC;
-++  else if (strncmp (argv[0], "ol", 2) == 0)
-++    type = ZEBRA_ROUTE_OLSR;
-++  else if (strncmp (argv[0], "ba", 2) == 0)
-++    type = ZEBRA_ROUTE_BATMAN;
-+   else 
-+     {
-+       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
-+@@ -1732,7 +1748,7 @@
-+ 
-+ DEFUN (show_ipv6_route_protocol,
-+        show_ipv6_route_protocol_cmd,
-+-       "show ipv6 route (bgp|connected|isis|kernel|ospf6|ripng|static)",
-++       "show ipv6 route (bgp|connected|isis|kernel|ospf6|ripng|olsr|batman|static)",
-+        SHOW_STR
-+        IP_STR
-+        "IP routing table\n"
-+@@ -1742,6 +1758,8 @@
-+        "Kernel\n"
-+        "Open Shortest Path First (OSPFv3)\n"
-+        "Routing Information Protocol (RIPng)\n"
-++       "Optimized Link State Routing (OLSR)\n"
-++       "Better Approach to Mobile Ad-Hoc Networking (BATMAN)\n"
-+        "Static routes\n")
-+ {
-+   int type;
-+@@ -1750,13 +1768,13 @@
-+   struct rib *rib;
-+   int first = 1;
-+ 
-+-  if (strncmp (argv[0], "b", 1) == 0)
-++  if (strncmp (argv[0], "bg", 2) == 0)
-+     type = ZEBRA_ROUTE_BGP;
-+   else if (strncmp (argv[0], "c", 1) == 0)
-+     type = ZEBRA_ROUTE_CONNECT;
-+   else if (strncmp (argv[0], "k", 1) ==0)
-+     type = ZEBRA_ROUTE_KERNEL;
-+-  else if (strncmp (argv[0], "o", 1) == 0)
-++  else if (strncmp (argv[0], "os", 2) == 0)
-+     type = ZEBRA_ROUTE_OSPF6;
-+   else if (strncmp (argv[0], "i", 1) == 0)
-+     type = ZEBRA_ROUTE_ISIS;
-+@@ -1764,7 +1782,11 @@
-+     type = ZEBRA_ROUTE_RIPNG;
-+   else if (strncmp (argv[0], "s", 1) == 0)
-+     type = ZEBRA_ROUTE_STATIC;
-+-  else 
-++  else if (strncmp (argv[0], "ol", 2) == 0)
-++     type = ZEBRA_ROUTE_OLSR;
-++  else if (strncmp (argv[0], "ba", 2) == 0)
-++     type = ZEBRA_ROUTE_BATMAN;
-++  else
-+     {
-+       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
-+       return CMD_WARNING;
---- a/lib/quagga/README_QUAGGA
-+++ b/lib/quagga/README_QUAGGA
-@@ -1,20 +1,20 @@
- ---------------------------------------------------------------------
- QUAGGA PLUGIN FOR OLSRD
- by Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
-+
-+addittions by:        Sven-Ola Tuecke <sven-ola-aet-gmx.de>
-+              Vasilis Tsiligiannis <acinonyxs@yahoo.gr>
- ---------------------------------------------------------------------
--This is the Quagga Plugin for the OLSRD. 
--It allowes olsrd to redistribute from various quagga-protocols 
-+This is the Quagga Plugin for OLSRd. 
-+It allows olsrd to redistribute from various quagga-protocols 
- as well as to export olsr-routes to quagga so that they can be
- redistributed by the quagga-routing-daemons.
--Note Sven-Ola: You also need a source distribution of quagga-0.98.5
--or quagga-0.98.6 (that is the current stable). The quagga source tree 
--needs to be patched with quagga-0.98.6-olsr.diff, compiled and installed
--via 'make install'. Because many people will otherwise have compile
--probs, I've added 2 include files in lib/quagga/src/quagga. If you
--want to use another version of quagga, make sure to remove these
--before you compile the olsrd_quagga plugin.
-+You also need a source distribution of quagga-0.98.5 or quagga-0.98.6
-+(that is the current stable). The quagga source tree needs to be
-+patched with quagga-0.98.6.diff, compiled and installed via
-+'make install'.
- ---------------------------------------------------------------------
- PLUGIN PARAMETERS (PlParam)
-@@ -27,22 +27,22 @@
-       May be used more then once
- PlParam "ExportRoutes" "<only/both>"
--      exportes olsr-routes to quagga or to both, quagga and kernel
-+      exports olsr-routes to quagga or to both, quagga and kernel
-       no routes are exported to quagga (normal behaviour) if not set.
--PlParam "LocalPref" "true"
-+PlParam "LocalPref" "<true/false>"
-         sets the Zebra SELECTED-flag on the routes exported to zebra
-       which means these routes are prefered in any case.
- PlParam "Distance" "0-255"
--        allowes to set the administrative distance to routes exported 
--      to Zebra.
-+        allows to set the administrative distance to routes exported 
-+      to zebra.
-       
- ---------------------------------------------------------------------
- SAMPLE CONFIG
- ---------------------------------------------------------------------
--add in /etc/olsrd.conf:
-+add in /usr/local/etc/olsrd.conf:
- LoadPlugin "olsrd_quagga.so.0.2.2"
- {
-@@ -55,4 +55,4 @@
- ---------------------------------------------------------------------
--EOF / 8.5.2006
-+EOF / 29.12.2008
---- a/lib/quagga/src/olsrd_plugin.c
-+++ b/lib/quagga/src/olsrd_plugin.c
-@@ -1,19 +1,22 @@
-+/*
-+ * OLSRd Quagga plugin
-+ *
-+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
-+ * Copyright (C) 2007-2008 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               : olsrd_plugin.c
-+ * Description        : functions to setup plugin
-+ * ------------------------------------------------------------------------- */
--/***************************************************************************
-- projekt              : olsrd-quagga
-- file                 : olsrd_plugin.c
-- usage                : olsrd-plugin-handler-stuff
-- copyright            : (C) 2006 by Immo 'FaUl' Wehrenberg
-- e-mail               : immo@chaostreff-dortmund.de
-- ***************************************************************************/
--
--/***************************************************************************
-- *                                                                         *
-- *   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.                            *
-- *                                                                         *
-- ***************************************************************************/
- #include <stdio.h>
- #include <string.h>
-@@ -24,7 +27,6 @@
- #include "scheduler.h"
- #include "defs.h"
- #include "quagga.h"
--#include "kernel_routes.h"
- #include "net_olsr.h"
- #define PLUGIN_NAME    "OLSRD quagga plugin"
-@@ -41,120 +43,94 @@
- static set_plugin_parameter set_distance;
- static set_plugin_parameter set_localpref;
--static export_route_function orig_addroute_function;
--static export_route_function orig_delroute_function;
--int
--olsrd_plugin_interface_version(void)
--{
-+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,},
-+  { .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)
--{
-+void olsrd_get_plugin_parameters (const struct olsrd_plugin_parameters **params,
-+                                int *size) {
-   *params = plugin_parameters;
--  *size = sizeof plugin_parameters / sizeof *plugin_parameters;
-+  *size = ARRAYSIZE(plugin_parameters);
- }
--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"
--  };
-+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;
--    }
-+    if (!strcmp(value, zebra_route_types[i]))
-+      if (zebra_redistribute (i)) return 1;
-   }
--  return 1;
-+
-+  return 0;
- }
--static int
--set_exportroutes(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
--{
-+static int set_exportroutes (const char *value,
-+                           void *data __attribute__((unused)),
-+                           set_plugin_parameter_addon addon __attribute__((unused))) {
-   if (!strcmp(value, "only")) {
--    orig_addroute_function = NULL;
--    orig_delroute_function = NULL;
--    olsr_addroute_function = zebra_add_olsr_v4_route;
--    olsr_delroute_function = zebra_del_olsr_v4_route;
-+    olsr_addroute_function = zebra_add_route;
-+    olsr_delroute_function = zebra_del_route;
-     zebra_export_routes(1);
--  } else if (!strcmp(value, "additional")) {
--    orig_addroute_function = olsr_addroute_function;
--    orig_delroute_function = olsr_delroute_function;
--    olsr_addroute_function = zebra_add_olsr_v4_route;
--    olsr_delroute_function = zebra_del_olsr_v4_route;
-+  }
-+  else if (!strcmp(value, "additional")) {
-+    olsr_addroute_function = zebra_add_route;
-+    olsr_delroute_function = zebra_del_route;
-     zebra_export_routes(1);
--  } else
--    zebra_export_routes(0);
-+  }
-+  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)))
--{
-+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;
-+  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)))
--{
-+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();
-+  if (set_plugin_boolean(value, &b, addon)) return 1;
-+  if (b) zebra_olsr_localpref();
-   return 0;
- }
--int
--olsrd_plugin_init(void)
--{
--  if (olsr_cnf->ip_version != AF_INET) {
--    fputs("see the source - ipv6 so far not supported\n", stderr);
-+
-+int olsrd_plugin_init(void) {
-+  if(olsr_cnf->ip_version != AF_INET) {
-+    fputs("see the source - ipv6 so far not supported\n" ,stderr);
-     return 1;
-   }
--  olsr_start_timer(1 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &zebra_check, NULL, 0);
-+  olsr_start_timer(1 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC,
-+                   &zebra_parse, NULL, 0);
-   return 0;
- }
--static void
--my_init(void)
--{
-+static void my_init(void) {
-   init_zebra();
- }
--static void
--my_fini(void)
--{
-+static void my_fini(void) {
-   zebra_cleanup();
- }
--/*
-- * Local Variables:
-- * c-basic-offset: 2
-- * indent-tabs-mode: nil
-- * End:
-- */
---- a/lib/quagga/src/quagga/zassert.h
-+++ /dev/null
-@@ -1,33 +0,0 @@
--
--/*
-- */
--
--#ifndef _QUAGGA_ASSERT_H
--#define _QUAGGA_ASSERT_H
--
--extern void _zlog_assert_failed(const char *assertion, const char *file, unsigned int line, const char *function)
--  __attribute__ ((noreturn));
--
--#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
--#define __ASSERT_FUNCTION    __func__
--#elif defined(__GNUC__)
--#define __ASSERT_FUNCTION    __FUNCTION__
--#else
--#define __ASSERT_FUNCTION    NULL
--#endif
--
--#define zassert(EX) ((void)((EX) ?  0 :       \
--                          (_zlog_assert_failed(#EX, __FILE__, __LINE__, \
--                                               __ASSERT_FUNCTION), 0)))
--
--#undef assert
--#define assert(EX) zassert(EX)
--
--#endif /* _QUAGGA_ASSERT_H */
--
--/*
-- * Local Variables:
-- * c-basic-offset: 2
-- * indent-tabs-mode: nil
-- * End:
-- */
---- a/lib/quagga/src/quagga/zebra.h
-+++ /dev/null
-@@ -1,503 +0,0 @@
--
--/* Zebra common header.
--   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Kunihiro Ishiguro
--
--This file is part of GNU Zebra.
--
--GNU Zebra is free software; you can redistribute it and/or modify it
--under the terms of the GNU General Public License as published by the
--Free Software Foundation; either version 2, or (at your option) any
--later version.
--
--GNU Zebra is distributed in the hope that it will be useful, but
--WITHOUT ANY WARRANTY; without even the implied warranty of
--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
--General Public License for more details.
--
--You should have received a copy of the GNU General Public License
--along with GNU Zebra; see the file COPYING.  If not, write to the Free
--Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
--02111-1307, USA.  */
--
--#ifndef _ZEBRA_H
--#define _ZEBRA_H
--
--#ifdef HAVE_CONFIG_H
--#include "config.h"
--#endif /* HAVE_CONFIG_H */
--
--#ifdef SUNOS_5
--#define _XPG4_2
--#define __EXTENSIONS__
--typedef unsigned int u_int32_t;
--typedef unsigned short u_int16_t;
--typedef unsigned char u_int8_t;
--#endif /* SUNOS_5 */
--
--#ifndef HAVE_SOCKLEN_T
--typedef int socklen_t;
--#endif /* HAVE_SOCKLEN_T */
--
--#include <unistd.h>
--#include <stdio.h>
--#include <stdlib.h>
--#include <ctype.h>
--#include <errno.h>
--#include <fcntl.h>
--#include <signal.h>
--#include <string.h>
--#include <pwd.h>
--#include <grp.h>
--#ifdef HAVE_STROPTS_H
--#include <stropts.h>
--#endif /* HAVE_STROPTS_H */
--#include <sys/fcntl.h>
--#ifdef HAVE_SYS_SELECT_H
--#include <sys/select.h>
--#endif /* HAVE_SYS_SELECT_H */
--#include <sys/stat.h>
--#include <sys/time.h>
--#include <sys/types.h>
--#include <sys/param.h>
--#ifdef HAVE_SYS_SYSCTL_H
--#include <sys/sysctl.h>
--#endif /* HAVE_SYS_SYSCTL_H */
--#include <sys/ioctl.h>
--#ifdef HAVE_SYS_CONF_H
--#include <sys/conf.h>
--#endif /* HAVE_SYS_CONF_H */
--#ifdef HAVE_SYS_KSYM_H
--#include <sys/ksym.h>
--#endif /* HAVE_SYS_KSYM_H */
--#include <syslog.h>
--#include <time.h>
--#include <sys/uio.h>
--#include <sys/utsname.h>
--#ifdef HAVE_RUSAGE
--#include <sys/resource.h>
--#endif /* HAVE_RUSAGE */
--#ifdef HAVE_LIMITS_H
--#include <limits.h>
--#endif /* HAVE_LIMITS_H */
--
--/* machine dependent includes */
--#ifdef SUNOS_5
--#include <strings.h>
--#endif /* SUNOS_5 */
--
--/* machine dependent includes */
--#ifdef HAVE_LINUX_VERSION_H
--#include <linux/version.h>
--#endif /* HAVE_LINUX_VERSION_H */
--
--#ifdef HAVE_ASM_TYPES_H
--#include <asm/types.h>
--#endif /* HAVE_ASM_TYPES_H */
--
--/* misc include group */
--#include <stdarg.h>
--#if !(defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
--
--/* Not C99; do we need to define va_copy? */
--#ifndef va_copy
--#ifdef __va_copy
--#define va_copy(DST,SRC) __va_copy(DST,SRC)
--#else
--
--/* Now we are desperate; this should work on many typical platforms.
--   But this is slightly dangerous, because the standard does not require
--   va_copy to be a macro. */
--#define va_copy(DST,SRC) memcpy(&(DST), &(SRC), sizeof(va_list))
--#warning "Not C99 and no va_copy macro available, falling back to memcpy"
--#endif /* __va_copy */
--#endif /* !va_copy */
--#endif /* !C99 */
--
--#ifdef HAVE_LCAPS
--#include <sys/capability.h>
--#include <sys/prctl.h>
--#endif /* HAVE_LCAPS */
--
--/* network include group */
--
--#include <sys/socket.h>
--
--#ifdef HAVE_SYS_SOCKIO_H
--#include <sys/sockio.h>
--#endif /* HAVE_SYS_SOCKIO_H */
--
--#ifdef HAVE_NETINET_IN_H
--#include <netinet/in.h>
--#endif /* HAVE_NETINET_IN_H */
--#include <netinet/in_systm.h>
--#include <netinet/ip.h>
--#include <netinet/tcp.h>
--
--#ifdef HAVE_NET_NETOPT_H
--#include <net/netopt.h>
--#endif /* HAVE_NET_NETOPT_H */
--
--#include <net/if.h>
--
--#ifdef HAVE_NET_IF_DL_H
--#include <net/if_dl.h>
--#endif /* HAVE_NET_IF_DL_H */
--
--#ifdef HAVE_NET_IF_VAR_H
--#include <net/if_var.h>
--#endif /* HAVE_NET_IF_VAR_H */
--
--#ifdef HAVE_NET_ROUTE_H
--#include <net/route.h>
--#endif /* HAVE_NET_ROUTE_H */
--
--#ifdef HAVE_NETLINK
--#include <linux/netlink.h>
--#include <linux/rtnetlink.h>
--#else
--#define RT_TABLE_MAIN         0
--#endif /* HAVE_NETLINK */
--
--#ifdef HAVE_NETDB_H
--#include <netdb.h>
--#endif /* HAVE_NETDB_H */
--
--#include <arpa/inet.h>
--#include <arpa/telnet.h>
--
--#ifdef HAVE_INET_ND_H
--#include <inet/nd.h>
--#endif /* HAVE_INET_ND_H */
--
--#ifdef HAVE_NETINET_IN_VAR_H
--#include <netinet/in_var.h>
--#endif /* HAVE_NETINET_IN_VAR_H */
--
--#ifdef HAVE_NETINET6_IN6_VAR_H
--#include <netinet6/in6_var.h>
--#endif /* HAVE_NETINET6_IN6_VAR_H */
--
--#ifdef HAVE_NETINET_IN6_VAR_H
--#include <netinet/in6_var.h>
--#endif /* HAVE_NETINET_IN6_VAR_H */
--
--#ifdef HAVE_NETINET6_IN_H
--#include <netinet6/in.h>
--#endif /* HAVE_NETINET6_IN_H */
--
--#ifdef HAVE_NETINET6_IP6_H
--#include <netinet6/ip6.h>
--#endif /* HAVE_NETINET6_IP6_H */
--
--#ifdef HAVE_NETINET_ICMP6_H
--#include <netinet/icmp6.h>
--#endif /* HAVE_NETINET_ICMP6_H */
--
--#ifdef HAVE_NETINET6_ND6_H
--#include <netinet6/nd6.h>
--#endif /* HAVE_NETINET6_ND6_H */
--
--/* Some systems do not define UINT32_MAX */
--#ifndef UINT32_MAX
--#define UINT32_MAX 0xFFFFFFFFU
--#endif /* UINT32_MAX */
--
--#ifdef HAVE_LIBUTIL_H
--#include <libutil.h>
--#endif /* HAVE_LIBUTIL_H */
--
--#ifdef HAVE_GLIBC_BACKTRACE
--#include <execinfo.h>
--#endif /* HAVE_GLIBC_BACKTRACE */
--
--#ifdef BSDI_NRL
--
--#ifdef HAVE_NETINET6_IN6_H
--#include <netinet6/in6.h>
--#endif /* HAVE_NETINET6_IN6_H */
--
--#ifdef NRL
--#include <netinet6/in6.h>
--#endif /* NRL */
--
--#define IN6_ARE_ADDR_EQUAL IN6_IS_ADDR_EQUAL
--
--#endif /* BSDI_NRL */
--
--/* Local includes: */
--#if !(defined(__GNUC__) || defined(VTYSH_EXTRACT_PL))
--#define __attribute__(x)
--#endif /* !__GNUC__ || VTYSH_EXTRACT_PL */
--
--#include "zassert.h"
--
--#ifdef HAVE_BROKEN_CMSG_FIRSTHDR
--
--/* This bug is present in Solaris 8 and pre-patch Solaris 9 <sys/socket.h>;
--   please refer to http://bugzilla.quagga.net/show_bug.cgi?id=142 */
--
--/* Check that msg_controllen is large enough. */
--#define ZCMSG_FIRSTHDR(mhdr) \
--  (((size_t)((mhdr)->msg_controllen) >= sizeof(struct cmsghdr)) ? \
--   CMSG_FIRSTHDR(mhdr) : (struct cmsghdr *)NULL)
--
--#warning "CMSG_FIRSTHDR is broken on this platform, using a workaround"
--
--#else /* HAVE_BROKEN_CMSG_FIRSTHDR */
--#define ZCMSG_FIRSTHDR(M) CMSG_FIRSTHDR(M)
--#endif /* HAVE_BROKEN_CMSG_FIRSTHDR */
--
--/*
-- * RFC 3542 defines several macros for using struct cmsghdr.
-- * Here, we define those that are not present
-- */
--
--/*
-- * Internal defines, for use only in this file.
-- * These are likely wrong on other than ILP32 machines, so warn.
-- */
--#ifndef _CMSG_DATA_ALIGN
--#define _CMSG_DATA_ALIGN(n)           (((n) + 3) & ~3)
--#endif /* _CMSG_DATA_ALIGN */
--
--#ifndef _CMSG_HDR_ALIGN
--#define _CMSG_HDR_ALIGN(n)            (((n) + 3) & ~3)
--#endif /* _CMSG_HDR_ALIGN */
--
--/*
-- * CMSG_SPACE and CMSG_LEN are required in RFC3542, but were new in that
-- * version.
-- */
--#ifndef CMSG_SPACE
--#define CMSG_SPACE(l)       (_CMSG_DATA_ALIGN(sizeof(struct cmsghdr)) + \
--                              _CMSG_HDR_ALIGN(l))
--#warning "assuming 4-byte alignment for CMSG_SPACE"
--#endif /* CMSG_SPACE */
--
--#ifndef CMSG_LEN
--#define CMSG_LEN(l)         (_CMSG_DATA_ALIGN(sizeof(struct cmsghdr)) + (l))
--#warning "assuming 4-byte alignment for CMSG_LEN"
--#endif /* CMSG_LEN */
--
--/*  The definition of struct in_pktinfo is missing in old version of
--    GLIBC 2.1 (Redhat 6.1).  */
--#if defined (GNU_LINUX) && ! defined (HAVE_INPKTINFO)
--struct in_pktinfo {
--  int ipi_ifindex;
--  struct in_addr ipi_spec_dst;
--  struct in_addr ipi_addr;
--};
--#endif
--
--/*
-- * OSPF Fragmentation / fragmented writes
-- *
-- * ospfd can support writing fragmented packets, for cases where
-- * kernel will not fragment IP_HDRINCL and/or multicast destined
-- * packets (ie TTBOMK all kernels, BSD, SunOS, Linux). However,
-- * SunOS, probably BSD too, clobber the user supplied IP ID and IP
-- * flags fields, hence user-space fragmentation will not work.
-- * Only Linux is known to leave IP header unmolested.
-- * Further, fragmentation really should be done the kernel, which already
-- * supports it, and which avoids nasty IP ID state problems.
-- *
-- * Fragmentation of OSPF packets can be required on networks with router
-- * with many many interfaces active in one area, or on networks with links
-- * with low MTUs.
-- */
--#ifdef GNU_LINUX
--#define WANT_OSPF_WRITE_FRAGMENT
--#endif
--
--/*
-- * IP_HDRINCL / struct ip byte order
-- *
-- * Linux: network byte order
-- * *BSD: network, except for length and offset. (cf Stevens)
-- * SunOS: nominally as per BSD. but bug: network order on LE.
-- * OpenBSD: network byte order, apart from older versions which are as per
-- *          *BSD
-- */
--#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\
--   || (defined(__OpenBSD__) && (OpenBSD < 200311)) \
--   || (defined(SUNOS_5) && defined(WORDS_BIGENDIAN))
--#define HAVE_IP_HDRINCL_BSD_ORDER
--#endif
--
--/* MAX / MIN are not commonly defined, but useful */
--#ifndef MAX
--#define MAX(a, b) ((a) > (b) ? (a) : (b))
--#endif
--#ifndef MIN
--#define MIN(a, b) ((a) < (b) ? (a) : (b))
--#endif
--
--/* For old definition. */
--#ifndef IN6_ARE_ADDR_EQUAL
--#define IN6_ARE_ADDR_EQUAL IN6_IS_ADDR_EQUAL
--#endif /* IN6_ARE_ADDR_EQUAL */
--
--/* Zebra message types. */
--#define ZEBRA_INTERFACE_ADD                1
--#define ZEBRA_INTERFACE_DELETE             2
--#define ZEBRA_INTERFACE_ADDRESS_ADD        3
--#define ZEBRA_INTERFACE_ADDRESS_DELETE     4
--#define ZEBRA_INTERFACE_UP                 5
--#define ZEBRA_INTERFACE_DOWN               6
--#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_REDISTRIBUTE_DEFAULT_ADD    13
--#define ZEBRA_REDISTRIBUTE_DEFAULT_DELETE 14
--#define ZEBRA_IPV4_NEXTHOP_LOOKUP         15
--#define ZEBRA_IPV6_NEXTHOP_LOOKUP         16
--#define ZEBRA_IPV4_IMPORT_LOOKUP          17
--#define ZEBRA_IPV6_IMPORT_LOOKUP          18
--#define ZEBRA_INTERFACE_RENAME            19
--#define ZEBRA_ROUTER_ID_ADD               20
--#define ZEBRA_ROUTER_ID_DELETE            21
--#define ZEBRA_ROUTER_ID_UPDATE            22
--#define ZEBRA_MESSAGE_MAX                 23
--
--/* Zebra route's types. */
--#define ZEBRA_ROUTE_SYSTEM               0
--#define ZEBRA_ROUTE_KERNEL               1
--#define ZEBRA_ROUTE_CONNECT              2
--#define ZEBRA_ROUTE_STATIC               3
--#define ZEBRA_ROUTE_RIP                  4
--#define ZEBRA_ROUTE_RIPNG                5
--#define ZEBRA_ROUTE_OSPF                 6
--#define ZEBRA_ROUTE_OSPF6                7
--#define ZEBRA_ROUTE_ISIS                 8
--#define ZEBRA_ROUTE_BGP                  9
--#define ZEBRA_ROUTE_HSLS               10
--#define ZEBRA_ROUTE_OLSR               11
--#define ZEBRA_ROUTE_MAX                  12
--
--/* Zebra's family types. */
--#define ZEBRA_FAMILY_IPV4                1
--#define ZEBRA_FAMILY_IPV6                2
--#define ZEBRA_FAMILY_MAX                 3
--
--/* Error codes of zebra. */
--#define ZEBRA_ERR_RTEXIST               -1
--#define ZEBRA_ERR_RTUNREACH             -2
--#define ZEBRA_ERR_EPERM                 -3
--#define ZEBRA_ERR_RTNOEXIST             -4
--
--/* Zebra message flags */
--#define ZEBRA_FLAG_INTERNAL           0x01
--#define ZEBRA_FLAG_SELFROUTE          0x02
--#define ZEBRA_FLAG_BLACKHOLE          0x04
--#define ZEBRA_FLAG_IBGP               0x08
--#define ZEBRA_FLAG_SELECTED           0x10
--#define ZEBRA_FLAG_CHANGED            0x20
--#define ZEBRA_FLAG_STATIC             0x40
--#define ZEBRA_FLAG_REJECT             0x80
--
--/* Zebra nexthop flags. */
--#define ZEBRA_NEXTHOP_IFINDEX            1
--#define ZEBRA_NEXTHOP_IFNAME             2
--#define ZEBRA_NEXTHOP_IPV4               3
--#define ZEBRA_NEXTHOP_IPV4_IFINDEX       4
--#define ZEBRA_NEXTHOP_IPV4_IFNAME        5
--#define ZEBRA_NEXTHOP_IPV6               6
--#define ZEBRA_NEXTHOP_IPV6_IFINDEX       7
--#define ZEBRA_NEXTHOP_IPV6_IFNAME        8
--#define ZEBRA_NEXTHOP_BLACKHOLE          9
--
--#ifndef INADDR_LOOPBACK
--#define       INADDR_LOOPBACK 0x7f000001      /* Internet address 127.0.0.1.  */
--#endif
--
--/* Address family numbers from RFC1700. */
--#define AFI_IP                    1
--#define AFI_IP6                   2
--#define AFI_MAX                   3
--
--/* Subsequent Address Family Identifier. */
--#define SAFI_UNICAST              1
--#define SAFI_MULTICAST            2
--#define SAFI_UNICAST_MULTICAST    3
--#define SAFI_MPLS_VPN             4
--#define SAFI_MAX                  5
--
--/* Filter direction.  */
--#define FILTER_IN                 0
--#define FILTER_OUT                1
--#define FILTER_MAX                2
--
--/* Default Administrative Distance of each protocol. */
--#define ZEBRA_KERNEL_DISTANCE_DEFAULT      0
--#define ZEBRA_CONNECT_DISTANCE_DEFAULT     0
--#define ZEBRA_STATIC_DISTANCE_DEFAULT      1
--#define ZEBRA_RIP_DISTANCE_DEFAULT       120
--#define ZEBRA_RIPNG_DISTANCE_DEFAULT     120
--#define ZEBRA_OSPF_DISTANCE_DEFAULT      110
--#define ZEBRA_OSPF6_DISTANCE_DEFAULT     110
--#define ZEBRA_ISIS_DISTANCE_DEFAULT      115
--#define ZEBRA_IBGP_DISTANCE_DEFAULT      200
--#define ZEBRA_EBGP_DISTANCE_DEFAULT       20
--
--/* Flag manipulation macros. */
--#define CHECK_FLAG(V,F)      ((V) & (F))
--#define SET_FLAG(V,F)        (V) = (V) | (F)
--#define UNSET_FLAG(V,F)      (V) = (V) & ~(F)
--
--/* AFI and SAFI type. */
--typedef u_int16_t afi_t;
--typedef u_int8_t safi_t;
--
--/* Zebra types. */
--typedef u_int16_t zebra_size_t;
--typedef u_int8_t zebra_command_t;
--
--/* FIFO -- first in first out structure and macros.  */
--struct fifo {
--  struct fifo *next;
--  struct fifo *prev;
--};
--
--#define FIFO_INIT(F)                                  \
--  do {                                                \
--    struct fifo *Xfifo = (struct fifo *)(F);          \
--    Xfifo->next = Xfifo->prev = Xfifo;                \
--  } while (0)
--
--#define FIFO_ADD(F,N)                                 \
--  do {                                                \
--    struct fifo *Xfifo = (struct fifo *)(F);          \
--    struct fifo *Xnode = (struct fifo *)(N);          \
--    Xnode->next = Xfifo;                              \
--    Xnode->prev = Xfifo->prev;                        \
--    Xfifo->prev = Xfifo->prev->next = Xnode;          \
--  } while (0)
--
--#define FIFO_DEL(N)                                   \
--  do {                                                \
--    struct fifo *Xnode = (struct fifo *)(N);          \
--    Xnode->prev->next = Xnode->next;                  \
--    Xnode->next->prev = Xnode->prev;                  \
--  } while (0)
--
--#define FIFO_HEAD(F)                                  \
--  ((((struct fifo *)(F))->next == (struct fifo *)(F)) \
--  ? NULL : (F)->next)
--
--#define FIFO_EMPTY(F)                                 \
--  (((struct fifo *)(F))->next == (struct fifo *)(F))
--
--#define FIFO_TOP(F)                                   \
--  (FIFO_EMPTY(F) ? NULL : ((struct fifo *)(F))->next)
--
--#endif /* _ZEBRA_H */
--
--/*
-- * Local Variables:
-- * c-basic-offset: 2
-- * indent-tabs-mode: nil
-- * End:
-- */
---- a/lib/quagga/src/quagga.c
-+++ b/lib/quagga/src/quagga.c
-@@ -1,866 +1,555 @@
-+/*
-+ * OLSRd Quagga plugin
-+ *
-+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
-+ * Copyright (C) 2007-2008 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
-+ *
-+ */
--/***************************************************************************
-- projekt              : olsrd-quagga
-- file                 : quagga.c
-- usage                : communication with the zebra-daemon
-- copyright            : (C) 2006 by Immo 'FaUl' Wehrenberg
-- e-mail               : immo@chaostreff-dortmund.de
-- ***************************************************************************/
--
--/***************************************************************************
-- *                                                                         *
-- *   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.                            *
-- *                                                                         *
-- ***************************************************************************/
-+/* -------------------------------------------------------------------------
-+ * File               : quagga.c
-+ * Description        : functions to interface to the zebra daemon
-+ * ------------------------------------------------------------------------- */
--#ifdef MY_DEBUG
--#include <stdio.h>
--#endif
- #define HAVE_SOCKLEN_T
-+#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 <fcntl.h>
--#include <unistd.h>
--
--#include "quagga.h"
--#include "olsr.h"
--#include "log.h"
--#include "defs.h"
--#include "routing_table.h"
--
-+#include <arpa/inet.h>
- #ifdef USE_UNIX_DOMAIN_SOCKET
- #include <sys/un.h>
--#define ZEBRA_SOCKET "/var/run/quagga/zserv.api"
- #endif
--#define ZEBRA_IPV4_ROUTE_ADD          7
--#define ZEBRA_IPV4_ROUTE_DELETE               8
--#define ZEBRA_REDISTRIBUTE_ADD                11
--#define ZEBRA_REDISTRIBUTE_DELETE     12
--#define ZEBRA_MESSAGE_MAX             23
--
--#define ZEBRA_ROUTE_OLSR              11
--#define ZEBRA_ROUTE_MAX                       12
--
--#define ZEBRA_FLAG_SELECTED           0x10
--
--#define ZEBRA_NEXTHOP_IPV4            3
--#define ZEBRA_NEXTHOP_IPV4_IFINDEX    4
--
--#define ZAPI_MESSAGE_NEXTHOP  0x01
--#define ZAPI_MESSAGE_IFINDEX  0x02
--#define ZAPI_MESSAGE_DISTANCE 0x04
--#define ZAPI_MESSAGE_METRIC   0x08
--
--#define BUFSIZE 1024
--
--#define STATUS_CONNECTED 1
--#define OPTION_EXPORT 1
-+/* prototypes intern */
- static struct {
--  char status;                         // internal status
--  char options;                        // internal options
--  int sock;                            // Socket to zebra...
-+  char status; // internal status
-+  char options; // internal options
-+  int sock; // Socket to zebra...
-   char redistribute[ZEBRA_ROUTE_MAX];
-   char distance;
-   char flags;
--  struct ipv4_route *v4_rt;            // routes currently exportet to zebra
-+  struct zebra_route *v4_rt; // routes currently exportet to zebra
- } zebra;
--/* prototypes intern */
--static unsigned char *try_read(ssize_t *);
--static unsigned char *zebra_route_packet(struct ipv4_route r, ssize_t *);
--static int parse_interface_add(unsigned char *, size_t);
--static int parse_interface_delete(unsigned char *, size_t);
--static int parse_interface_up(unsigned char *, size_t);
--static int parse_interface_down(unsigned char *, size_t);
--static int parse_interface_address_add(unsigned char *, size_t);
--static int parse_interface_address_delete(unsigned char *, size_t);
--static int parse_ipv4_route(unsigned char *, size_t, struct ipv4_route *);
--static int ipv4_route_add(unsigned char *, size_t);
--static int ipv4_route_delete(unsigned char *, size_t);
--static int parse_ipv6_route_add(unsigned char *, size_t);
--static void zebra_reconnect(void);
--static void zebra_connect(void);
--
--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);*/
--
--#ifdef MY_DEBUG
--static void
--dump_ipv4_route(struct ipv4_route r, char *c)
--{
--  int i = 0, x = 0;
--
--  puts(c);
--  printf("type: %d\n", r.type);
--  puts("flags:");
--  printf("  Internal: %s\n", r.flags & ZEBRA_FLAG_INTERNAL ? "yes" : "no");
--  printf("  Selfroute %s\n", r.flags & ZEBRA_FLAG_SELFROUTE ? "yes" : "no");
--  printf("  Blackhole %s\n", r.flags & ZEBRA_FLAG_BLACKHOLE ? "yes" : "no");
--  printf("  IBGP: %s\n", r.flags & ZEBRA_FLAG_IBGP ? "yes" : "no");
--  printf("  Selected: %s\n", r.flags & ZEBRA_FLAG_SELECTED ? "yes" : "no");
--  printf("  Changed: %s\n", r.flags & ZEBRA_FLAG_CHANGED ? "yes" : "no");
--  printf("  static: %s\n", r.flags & ZEBRA_FLAG_STATIC ? "yes" : "no");
--  printf("  reject: %s\n", r.flags & ZEBRA_FLAG_REJECT ? "yes" : "no");
--  puts("message:");
--  printf("  nexthop: %s\n", r.message & ZAPI_MESSAGE_NEXTHOP ? "yes" : "no");
--  printf("  ifindex: %s\n", r.message & ZAPI_MESSAGE_IFINDEX ? "yes" : "no");
--  printf("  distance: %s\n", r.message & ZAPI_MESSAGE_DISTANCE ? "yes" : "no");
--  printf("  metric: %s\n", r.message & ZAPI_MESSAGE_METRIC ? "yes" : "no");
--  printf("Prefixlen: %d\n", r.prefixlen);
--  printf("Prefix: %d", (unsigned char)r.prefix);
--  c = (char *)&r.prefix;
--  while (++i < (r.prefixlen / 8 + (r.prefixlen % 8 ? 1 : 0)))
--    printf(".%d", (unsigned char)*(c + i));
--  while (i++ < 4)
--    printf(".0");
--  puts("");
--  i = 0;
--  if (r.message & ZAPI_MESSAGE_NEXTHOP) {
--    printf("nexthop-count: %d\n", r.nh_count);
--    while (i++ < r.nh_count) {
--      if (r.nexthops[i].type == ZEBRA_NEXTHOP_IPV4) {
--        c = (unsigned char *)&r.nexthops[i].payload.v4;
--        printf("Nexthop %d: %d", i, (unsigned char)*c);
--        while (++x < 4) {
--          printf(".%d", (unsigned char)c[x]);
--        }
--        puts("");
--      }
--    }
--    i = 0;
--  }
--  if (r.message & ZAPI_MESSAGE_IFINDEX) {
--
--    printf("index-number: %d\n", r.ind_num);
--    while (i++ < r.ind_num)
--      printf("Index: %d: %d\n", i, r.index[i]);
--    i = 0;
--    if (r.message & ZAPI_MESSAGE_DISTANCE)
--      printf("Distance: %d\n", r.distance);
--    if (r.message & ZAPI_MESSAGE_METRIC)
--      printf("Metric: %d\n", r.metric);
--    puts("\n");
--  }
--}
-+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 (unsigned char, unsigned char);
-+static struct zebra_route *zebra_parse_route (unsigned char *);
-+#if 0
-+static void zebra_reconnect (void);
- #endif
-+static void free_ipv4_route (struct zebra_route *);
-+
--void *
--my_realloc(void *buf, size_t s, const char *c)
--{
--  buf = realloc(buf, s);
-+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_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
--init_zebra(void)
--{
-+
-+void init_zebra (void) {
-   zebra_connect();
--  if (!(zebra.status & STATUS_CONNECTED))
--    olsr_exit("(QUAGGA) AIIIII, could not connect to zebra! is zebra running?", EXIT_FAILURE);
-+  if (!(zebra.status&STATUS_CONNECTED))
-+    olsr_exit ("(QUAGGA) AIIIII, could not connect to zebra! is zebra running?",
-+             EXIT_FAILURE);
- }
--void
--zebra_cleanup(void)
--{
-+
-+void zebra_cleanup (void) {
-   int i;
-   struct rt_entry *tmp;
-   if (zebra.options & OPTION_EXPORT) {
-     OLSR_FOR_ALL_RT_ENTRIES(tmp) {
--      zebra_del_olsr_v4_route(tmp);
--    }
--    OLSR_FOR_ALL_RT_ENTRIES_END(tmp);
-+      zebra_del_route(tmp);
-+    } OLSR_FOR_ALL_RT_ENTRIES_END(tmp);
-   }
-   for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
--    if (zebra.redistribute[i])
--      zebra_disable_redistribute(i + 1);
-+    if (zebra.redistribute[i]) zebra_disable_redistribute(i);
- }
--static void
--zebra_reconnect(void)
--{
-+
-+#if 0
-+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.status & STATUS_CONNECTED)) return; // try again next time
-   if (zebra.options & OPTION_EXPORT) {
-     OLSR_FOR_ALL_RT_ENTRIES(tmp) {
--      zebra_add_olsr_v4_route(tmp);
--    }
--    OLSR_FOR_ALL_RT_ENTRIES_END(tmp);
-+      zebra_add_route (tmp);
-+    } OLSR_FOR_ALL_RT_ENTRIES_END(tmp);
-   }
-   for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
--    if (zebra.redistribute[i])
--      zebra_redistribute(i + 1);
-+    if (zebra.redistribute[i]) zebra_redistribute(i + 1);
-   /* Zebra sends us all routes of type it knows after
-      zebra_redistribute(type) */
- }
-+#endif
-+
- /* Connect to the zebra-daemon, returns a socket */
--static void
--zebra_connect(void)
--{
-+static void zebra_connect (void) {
-   int ret;
- #ifndef USE_UNIX_DOMAIN_SOCKET
-   struct sockaddr_in i;
--  if (close(zebra.sock) < 0)
--    olsr_exit("(QUAGGA) Could not close socket!", EXIT_FAILURE);
-+  if (close (zebra.sock) < 0) olsr_exit ("(QUAGGA) Could not close socket!", EXIT_FAILURE);
-+
--  zebra.sock = socket(AF_INET, SOCK_STREAM, 0);
-+  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);
-+  if (close (zebra.sock) < 0) olsr_exit ("(QUAGGA) Could not close socket!", EXIT_FAILURE);
--  zebra.sock = socket(AF_UNIX, SOCK_STREAM, 0);
-+  zebra.sock = socket (AF_UNIX,SOCK_STREAM, 0);
- #endif
--  if (zebra.sock < 0)
-+  if (zebra.sock <0 )
-     olsr_exit("(QUAGGA) Could not create socket!", EXIT_FAILURE);
--  memset(&i, 0, sizeof i);
-+  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);
-+  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_SOCKET, sizeof(i.sun_path));
-+  strcpy (i.sun_path, ZEBRA_SOCKET);
- #endif
--  ret = connect(zebra.sock, (struct sockaddr *)&i, sizeof i);
--  if (ret < 0)
--    zebra.status &= ~STATUS_CONNECTED;
--  else
--    zebra.status |= STATUS_CONNECTED;
-+  ret = connect (zebra.sock, (struct sockaddr *)&i, sizeof i);
-+  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 */
--unsigned char
--zebra_send_command(unsigned char command, unsigned char *options, int optlen)
--{
-+static int zebra_send_command (unsigned char *options) {
--  char *p, *pnt;
-+  unsigned char *pnt;
-   uint16_t len;
-   int ret;
--#ifdef ZEBRA_HEADER_MARKER
--  uint16_t cmd;
--  uint16_t length = optlen + 6;        /* length of option + command + packet_length +
--                                          marker + zserv-version */
--#else
--  uint16_t length = optlen + 3;        // length of option + command + packet_length
--#endif
--
--  if (!(zebra.status & STATUS_CONNECTED))
--    return 0;
--
--  p = olsr_malloc(length, "zebra_send_command");
--  pnt = p;
--
--  len = htons(length);
-+  if (!(zebra.status & STATUS_CONNECTED)) return 0;
--  memcpy(p, &len, 2);
-+  pnt = options;
-+  memcpy (&len, pnt, 2);
--#ifdef ZEBRA_HEADER_MARKER
--  p[2] = ZEBRA_HEADER_MARKER;
--  p[3] = ZSERV_VERSION;
--  cmd = htons(command);
--  memcpy(p + 4, &cmd, 2);
--#else
--  p[2] = command;
--#endif
--  memcpy(p + length - optlen, options, optlen);
--
--  errno = 0;
-+  len = ntohs(len);
-   do {
--    ret = write(zebra.sock, p, length);
-+    ret = write (zebra.sock, pnt, len);
-     if (ret < 0) {
--      if (errno == EINTR) {
--        errno = 0;
--        continue;
--      } else {
--        olsr_printf(1, "(QUAGGA) Disconnected from zebra\n");
--        zebra.status &= ~STATUS_CONNECTED;
--        free(pnt);
--        return -1;
-+      if ((errno == EINTR) || (errno == EAGAIN)) {
-+      errno = 0;
-+        ret = 0;
-+      continue;
-+      }
-+      else {
-+      OLSR_PRINTF (1, "(QUAGGA) Disconnected from zebra\n");
-+      zebra.status &= ~STATUS_CONNECTED;
-+      free (options);
-+      return -1;
-       }
-     }
--    p = p + ret;
--  }
--  while ((length -= ret));
--  free(pnt);
-+    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(struct ipv4_route r, ssize_t * optlen)
--{
-+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;
--  *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.nexthops->type == ZEBRA_NEXTHOP_IPV4 || r.nexthops->type == ZEBRA_NEXTHOP_IPV4_IFINDEX) {
--      *optlen += (sizeof r.nexthops->payload.v4 + sizeof r.nexthops->type) * r.nh_count + 1;
--    } 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)
--    (*optlen)++;
--  if (r.message & ZAPI_MESSAGE_METRIC)
--    *optlen += sizeof r.metric;
--
--  cmdopt = olsr_malloc(*optlen, "zebra add_v4_route");
--
--  t = cmdopt;
--  *t++ = r.type;
--  *t++ = r.flags;
--  *t++ = r.message;
--  *t++ = r.prefixlen;
--  for (count = 0; count < r.prefixlen / 8 + (r.prefixlen % 8 ? 1 : 0); count++) {
--    *t++ = *((char *)&r.prefix + count);        /* this is so sick!! */
--  }
--
--  if (r.message & ZAPI_MESSAGE_NEXTHOP) {
--    *t++ = r.nh_count;
--    *t++ = r.nexthops->type;
--    if (r.nexthops->type == ZEBRA_NEXTHOP_IPV4 || r.nexthops->type == ZEBRA_NEXTHOP_IPV4_IFINDEX) {
--      for (count = 0; count != r.nh_count; count++) {
--        memcpy(t, &r.nexthops[count].payload.v4, sizeof r.nexthops->payload.v4);
--        t += sizeof r.nexthops->payload.v4;
--      }
--    } else if (r.nexthops->type == 0) {
--      *t++ = 0;
--      *t++ = 0;
--      *t++ = 0;
--    }
--  }
--  if (r.message & ZAPI_MESSAGE_IFINDEX) {
--    *t++ = r.ind_num;
--    memcpy(t, r.index, sizeof *r.index * r.ind_num);
--    t += sizeof r.index * r.ind_num;
--  }
--  if (r.message & ZAPI_MESSAGE_DISTANCE)
--    *t++ = r.distance;
--  if (r.message & ZAPI_MESSAGE_METRIC) {
--    memcpy(t, &r.metric, sizeof r.metric);
--    t += sizeof r.metric;
--  }
--  return cmdopt;
--}
--/* adds a route to zebra-daemon */
--int
--zebra_add_v4_route(const struct ipv4_route r)
--{
--
--  unsigned char *cmdopt;
--  ssize_t optlen;
--  int retval;
-+  cmdopt = olsr_malloc (ZEBRA_MAX_PACKET_SIZ , "zebra add_v4_route");
--  cmdopt = zebra_route_packet(r, &optlen);
-+  t = &cmdopt[2];
-+  *t++ = cmd;
-+  *t++ = r->type;
-+  *t++ = r->flags;
-+  *t++ = r->message;
-+  *t++ = r->prefixlen;
-+  len = (r->prefixlen + 7) / 8;
-+  memcpy (t, &r->prefix.v4.s_addr, len);
-+  t = t + len;
--  retval = zebra_send_command(ZEBRA_IPV4_ROUTE_ADD, cmdopt, optlen);
--  free(cmdopt);
--  return retval;
-+  if (r->message & ZAPI_MESSAGE_NEXTHOP) {
-+    *t++ = r->nexthop_num + r->ifindex_num;
-+    
-+      for (count = 0; count < r->nexthop_num; count++)
-+      {
-+        *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;
-+      }
-+      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, 2);
-+  return cmdopt;
- }
--/* deletes a route from the zebra-daemon */
--int
--zebra_delete_v4_route(struct ipv4_route r)
--{
--
--  unsigned char *cmdopt;
--  ssize_t optlen;
--  int retval;
--
--  cmdopt = zebra_route_packet(r, &optlen);
--
--  retval = zebra_send_command(ZEBRA_IPV4_ROUTE_DELETE, cmdopt, optlen);
--  free(cmdopt);
--
--  return retval;
--
--}
- /* Check wether there is data from zebra aviable */
--void
--zebra_check(void *foo __attribute__ ((unused)))
--{
-+void zebra_parse (void* foo __attribute__((unused))) {
-   unsigned char *data, *f;
--  ssize_t len, ret;
-+  unsigned char command;
-+  uint16_t length;
-+  ssize_t len;
-+  struct zebra_route *route;
-   if (!(zebra.status & STATUS_CONNECTED)) {
--    zebra_reconnect();
-+//    zebra_reconnect();
-     return;
-   }
--  data = try_read(&len);
-+  data = try_read (&len);
-   if (data) {
-     f = data;
-     do {
--      ret = zebra_parse_packet(f, len);
--      if (!ret)                 // something wired happened
--        olsr_exit("(QUAGGA) Zero message length??? ", EXIT_FAILURE);
--      f += ret;
--    }
--    while ((f - data) < len);
--    free(data);
-+      memcpy (&length, f, sizeof length);
-+      length = ntohs (length);
-+      if (!length) // something wired happened
-+      olsr_exit ("(QUAGGA) Zero message length??? ", EXIT_FAILURE);
-+      command = f[2];
-+      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;
-+      }
-+      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 * len)
--{
--  unsigned char *buf = NULL;
--  ssize_t ret = 0, bsize = 0;
--  uint16_t length = 0, l = 0;
--  int sockstate;
--
--  *len = 0;
--
--  sockstate = fcntl(zebra.sock, F_GETFL, 0);
--  fcntl(zebra.sock, F_SETFL, sockstate | O_NONBLOCK);
-+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 {
--    if (*len == bsize) {
--      bsize += BUFSIZE;
--      buf = my_realloc(buf, bsize, "Zebra try_read");
-+
-+  /* (re)allocate buffer */
-+    if (*size == bufsize) {
-+      bufsize += BUFSIZE;
-+      buf = my_realloc (buf, bufsize, "Zebra try_read");
-     }
--    ret = read(zebra.sock, buf + l, bsize - l);
--    if (!ret) {                 // nothing more to read, packet is broken, discard!
--      free(buf);
-+
-+  /* read from socket */
-+    bytes = read (zebra.sock, buf + *size, bufsize - *size);
-+  /* handle broken packet */
-+    if (!bytes) {
-+      free (buf);
-       return NULL;
-     }
--
--    if (ret < 0) {
--      if (errno != EAGAIN) {    // oops - we got disconnected
--        olsr_printf(1, "(QUAGGA) Disconnected from zebra\n");
-+  /* 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;
-       }
--      free(buf);
-+      free (buf);
-       return NULL;
-     }
--    *len += ret;
--    while ((*len - l) > length) {
--      l += length;
--      memcpy(&length, buf + l, 2);
--      length = ntohs(length);
--    }
--    if (((*len) - l) == length)
--      break;                    // GOT FULL PACKAGE!!
--    if (*len < l) {
--      fcntl(zebra.sock, F_SETFL, sockstate);
--      continue;
--    }
--  }
--  while (1);
--
--  fcntl(zebra.sock, F_SETFL, sockstate);
--  return buf;
--}
--
--/* Parse a packet recived from zebra */
--int
--zebra_parse_packet(unsigned char *packet, ssize_t maxlen)
--{
--
--  uint16_t command;
--  int skip;
--
--  /* Array of functions */
--  int (*foo[ZEBRA_MESSAGE_MAX]) (unsigned char *, size_t) = {
--  parse_interface_add, parse_interface_delete, parse_interface_address_add, parse_interface_address_delete, parse_interface_up,
--      parse_interface_down, ipv4_route_add, ipv4_route_delete, parse_ipv6_route_add};
--
--  uint16_t length;
--  int ret;
--
--#ifdef MY_DEBUG
--  puts("DEBUG: zebra_parse_packet");
--#endif
--
--  memcpy(&length, packet, 2);
--  length = ntohs(length);
--
--  if (maxlen < length) {
--    olsr_printf(1, "(QUAGGA) maxlen = %lu, packet_length = %d\n", (unsigned long)maxlen, length);
--    olsr_exit("(QUAGGA) programmer is an idiot", EXIT_FAILURE);
--  }
--#ifdef ZEBRA_HEADER_MARKER
--  if (packet[2] == 255) {       // found header marker!!
--    //packet[3] == ZSERV_VERSION: FIXME: HANDLE THIS!
--    memcpy(&command, packet + 4, sizeof command);       // two bytes command now!
--    command = ntohs(command) - 1;
--    skip = 6;
--  }
--#else
--  command = packet[2] - 1;
--  skip = 3;
--#endif
--
--  if (command < ZEBRA_MESSAGE_MAX && foo[command]) {
--    if (!(ret = foo[command] (packet + skip, length - skip)))
--      return length;
--    else
--      olsr_printf(1, "(QUAGGA) Parse error: %d\n", ret);
--  } else
--    olsr_printf(1, "(QUAGGA) Unknown packet type: %d\n", packet[2]);
--
--  olsr_printf(1, "(Quagga) RECIVED PACKET FROM ZEBRA THAT I CAN'T PARSE");
--
--  return length;
--}
--
--static int
--parse_interface_add(unsigned char *opt __attribute__ ((unused)), size_t len __attribute__ ((unused)))
--{
--  //todo
--  return 0;
--}
--
--static int
--parse_interface_delete(unsigned char *opt __attribute__ ((unused)), size_t len __attribute__ ((unused)))
--{
--  //todo
--  return 0;
--}
--
--static int
--parse_interface_address_add(unsigned char *opt __attribute__ ((unused)), size_t len __attribute__ ((unused)))
--{
--
--  //todo
--  return 0;
--}
--
--static int
--parse_interface_up(unsigned char *opt __attribute__ ((unused)), size_t len __attribute__ ((unused)))
--{
-+    *size += bytes;
--  //todo
--  return 0;
--}
-+  /* 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);
--static int
--parse_interface_down(unsigned char *opt __attribute__ ((unused)), size_t len __attribute__ ((unused)))
--{
-+  /* restore socket status */
-+  fcntl (zebra.sock, F_SETFL, sockstatus);
--  //todo
--  return 0;
-+  return buf;
- }
--static int
--parse_interface_address_delete(unsigned char *opt __attribute__ ((unused)), size_t len __attribute__ ((unused)))
--{
--  //todo
--  return 0;
--}
- /* Parse an ipv4-route-packet recived from zebra
-  */
--static int
--parse_ipv4_route(unsigned char *opt, size_t len, struct ipv4_route *r)
--{
-+static struct zebra_route *zebra_parse_route (unsigned char *opt) {
-+  
-+  struct zebra_route *r;
-   int c;
--
--  if (len < 4)
--    return -1;
--
--  r->type = *opt++;
--  r->flags = *opt++;
--  r->message = *opt++;
--  r->prefixlen = *opt++;
--  len -= 4;
--  r->prefix = 0;
--
--  if ((int)len < r->prefixlen / 8 + (r->prefixlen % 8 ? 1 : 0))
--    return -1;
--
--  memcpy(&r->prefix, opt, r->prefixlen / 8 + (r->prefixlen % 8 ? 1 : 0));
--  opt += r->prefixlen / 8 + (r->prefixlen % 8 ? 1 : 0);
-+  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 = &opt[3];
-+  r->type = *pnt++;
-+  r->flags = *pnt++;
-+  r->message = *pnt++;
-+  r->prefixlen = *pnt++;
-+  r->prefix.v4.s_addr = 0;
-+
-+  size = (r->prefixlen + 7) / 8;
-+  memcpy (&r->prefix.v4.s_addr, pnt, size);
-+  pnt += size;
-   if (r->message & ZAPI_MESSAGE_NEXTHOP) {
--    if (len < 1)
--      return -1;
--    r->nh_count = *opt++;
--    len--;
--    if (len < (sizeof(uint32_t) + 1) * r->nh_count)
--      return -1;
--    r->nexthops =
--      olsr_malloc((sizeof r->nexthops->type + sizeof r->nexthops->payload) * r->nh_count, "quagga: parse_ipv4_route_add");
--    for (c = 0; c < r->nh_count; c++) {
--      r->nexthops[c].type = *opt++;
--      memcpy(&r->nexthops[c].payload.v4, opt, sizeof(uint32_t));
--      opt += sizeof(uint32_t);
--      len -= sizeof(uint32_t) + 1;
-+    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++) {
-+      memcpy (&r->nexthop[c].v4.s_addr, pnt, sizeof r->nexthop[c].v4.s_addr);
-+      pnt += sizeof r->nexthop[c].v4.s_addr;
-     }
-   }
-   if (r->message & ZAPI_MESSAGE_IFINDEX) {
--    if (len < 1)
--      return -1;
--    r->ind_num = *opt++;
--    if (len < sizeof(uint32_t) * r->ind_num)
--      return -1;
--    r->index = olsr_malloc(sizeof(uint32_t) * r->ind_num, "quagga: parse_ipv4_route_add");
--    memcpy(r->index, opt, r->ind_num * sizeof(uint32_t));
--    opt += sizeof(uint32_t) * r->ind_num;
--    len -= sizeof(uint32_t) * r->ind_num;
-+    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];
-+    }
-   }
-   if (r->message & ZAPI_MESSAGE_DISTANCE) {
--    if (len < 1)
--      return -1;
--    r->distance = *opt++;
--    len--;
-+    r->distance = *pnt++;
-   }
--  if (r->message & ZAPI_MESSAGE_METRIC) {
--    if (len < sizeof(uint32_t))
--      return -1;
--    memcpy(&r->metric, opt, sizeof(uint32_t));
--  }
-+// 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 (uint32_t));
-+    r->metric = ntohl (r->metric);
-+      pnt += sizeof r->metric;
-+//  }
-+    
-+    if (pnt - opt != length) { olsr_exit ("(QUAGGA) length does not match ??? ", EXIT_FAILURE);
-+     }
--  return 0;
-+  return r;
- }
--static int
--ipv4_route_add(unsigned char *opt, size_t len)
--{
--  struct ipv4_route r;
--  int f;
-+static unsigned char *zebra_redistribute_packet (unsigned char cmd, unsigned char type) {
-+  unsigned char *data, *pnt;
-+  uint16_t size;
--  f = parse_ipv4_route(opt, len, &r);
--  if (f < 0)
--    return f;
-+  data = olsr_malloc (ZEBRA_MAX_PACKET_SIZ , "zebra_redistribute_packet");
--  return add_hna4_route(r);
--}
--
--static int
--ipv4_route_delete(unsigned char *opt, size_t len)
--{
--  struct ipv4_route r;
--  int f;
--
--  f = parse_ipv4_route(opt, len, &r);
--  if (f < 0)
--    return f;
--
--  return delete_hna4_route(r);
-+  pnt = &data[2];
-+  *pnt++ = cmd;
-+  *pnt++ = type;
-+  size = htons (pnt - data);
-+  memcpy (data, &size, 2);
-+  return data;
- }
--static int
--parse_ipv6_route_add(unsigned char *opt __attribute__ ((unused)), size_t len __attribute__ ((unused)))
--{
--  //todo
--  return 0;
--}
- /* start redistribution FROM zebra */
--int
--zebra_redistribute(unsigned char type)
--{
--
--  if (type > ZEBRA_ROUTE_MAX)
--    return -1;
--  zebra.redistribute[type - 1] = 1;
--
--  return zebra_send_command(ZEBRA_REDISTRIBUTE_ADD, &type, 1);
--
--}
--
--/* end redistribution FROM zebra */
--int
--zebra_disable_redistribute(unsigned char type)
--{
--
--  if (type > ZEBRA_ROUTE_MAX)
--    return -1;
--  zebra.redistribute[type - 1] = 0;
-+int zebra_redistribute (unsigned char type) {
--  return zebra_send_command(ZEBRA_REDISTRIBUTE_DELETE, &type, 1);
-+      if (zebra_send_command(zebra_redistribute_packet (ZEBRA_REDISTRIBUTE_ADD, type)) < 0)
-+        olsr_exit("(QUAGGA) could not send redistribute add command", EXIT_FAILURE);
--}
-+  if (type > ZEBRA_ROUTE_MAX-1) return -1;
-+  zebra.redistribute[type] = 1;
--int
--add_hna4_route(struct ipv4_route r)
--{
--  union olsr_ip_addr net;
--
--#ifdef MY_DEBUG
--  dump_ipv4_route(r, "add_hna4_route");
--#endif
--
--  net.v4.s_addr = r.prefix;
--
--  ip_prefix_list_add(&olsr_cnf->hna_entries, &net, r.prefixlen);
--  free_ipv4_route(r);
-   return 0;
-+
- }
--int
--delete_hna4_route(struct ipv4_route r)
--{
--  union olsr_ip_addr net;
-+/* end redistribution FROM zebra */
-+int zebra_disable_redistribute (unsigned char type) {
--#ifdef MY_DEBUG
--  dump_ipv4_route(r, "delete_hna4_route");
--#endif
-+      if (zebra_send_command(zebra_redistribute_packet (ZEBRA_REDISTRIBUTE_DELETE, type)) < 0)
-+        olsr_exit("(QUAGGA) could not send redistribute delete command", EXIT_FAILURE);
--  net.v4.s_addr = r.prefix;
-+  if (type > ZEBRA_ROUTE_MAX-1) return -1;
-+  zebra.redistribute[type] = 0;
--  ip_prefix_list_remove(&olsr_cnf->hna_entries, &net, r.prefixlen) ? 0 : -1;
--  free_ipv4_route(r);
-   return 0;
- }
--static void
--free_ipv4_route(struct ipv4_route r)
--{
--
--  if (r.message & ZAPI_MESSAGE_IFINDEX && r.ind_num)
--    free(r.index);
--  if (r.message & ZAPI_MESSAGE_NEXTHOP && r.nh_count)
--    free(r.nexthops);
--
--}
--
--/*
--static uint8_t masktoprefixlen (uint32_t mask) {
--
--  uint8_t prefixlen = 0;
--  mask = htonl (mask);
-+static void free_ipv4_route (struct zebra_route *r) {
--  if (mask) while (mask << ++prefixlen && prefixlen < 32);
--
--  return prefixlen;
-+  if(r->ifindex_num) free(r->ifindex);
-+  if(r->nexthop_num) free(r->nexthop);
- }
--*/
--int
--zebra_add_olsr_v4_route(const struct rt_entry *r)
--{
--  struct ipv4_route route;
-+int zebra_add_route (const struct rt_entry *r) {
-+
-+  struct zebra_route route;
-   int retval;
--  route.index = NULL;
--  route.distance = 0;
--  route.type = ZEBRA_ROUTE_OLSR;        // OLSR
--  route.message = ZAPI_MESSAGE_METRIC;
-+  route.type = ZEBRA_ROUTE_OLSR;
-   route.flags = zebra.flags;
-+  route.message = ZAPI_MESSAGE_NEXTHOP | ZAPI_MESSAGE_METRIC;
-   route.prefixlen = r->rt_dst.prefix_len;
--  route.prefix = r->rt_dst.prefix.v4.s_addr;
--  if ((r->rt_best->rtp_nexthop.gateway.v4.s_addr == r->rt_dst.prefix.v4.s_addr && route.prefixlen == 32)) {
--    route.message |= ZAPI_MESSAGE_IFINDEX | ZAPI_MESSAGE_NEXTHOP;
--    route.ind_num = 1;
--    route.index = olsr_malloc(sizeof *route.index, "zebra_add_olsr_v4_route");
--    *route.index = htonl(r->rt_best->rtp_nexthop.iif_index);
--    route.nexthops = olsr_malloc(sizeof route.nexthops->type + sizeof route.nexthops->payload, "zebra_add_olsr_v4_route");
--    route.nh_count = 1;
--    route.nexthops->type = 0;
--  } else {
--    route.message |= ZAPI_MESSAGE_NEXTHOP;
--    route.nh_count = 1;
--    route.nexthops =
--      olsr_malloc(route.nh_count * (sizeof route.nexthops->type + sizeof route.nexthops->payload), "zebra_add_olsr_v4_route");
--    route.nexthops->type = ZEBRA_NEXTHOP_IPV4;
--    route.nexthops->payload.v4 = r->rt_best->rtp_nexthop.gateway.v4.s_addr;
-+  route.prefix.v4.s_addr = r->rt_dst.prefix.v4.s_addr;
-+  route.ifindex_num = 0;
-+  route.ifindex = NULL;
-+  route.nexthop_num = 0;
-+  route.nexthop = NULL;
-+
-+  if (r->rt_best->rtp_nexthop.gateway.v4.s_addr == r->rt_dst.prefix.v4.s_addr &&
-+       route.prefixlen == 32) {
-+    return 0;                 /* Quagga BUG workaround: don't add routes with destination = gateway
-+                                 see http://lists.olsr.org/pipermail/olsr-users/2006-June/001726.html */
-+    route.ifindex_num++;
-+    route.ifindex = olsr_malloc (sizeof *route.ifindex,
-+                             "zebra_add_route");
-+    *route.ifindex = r->rt_best->rtp_nexthop.iif_index;
-+  }
-+  else {
-+    route.nexthop_num++;
-+    route.nexthop = olsr_malloc (sizeof *route.nexthop, "zebra_add_route");
-+    route.nexthop->v4.s_addr = r->rt_best->rtp_nexthop.gateway.v4.s_addr;
-   }
-   route.metric = r->rt_best->rtp_metric.hops;
--  route.metric = htonl(route.metric);
-   if (zebra.distance) {
-     route.message |= ZAPI_MESSAGE_DISTANCE;
-     route.distance = zebra.distance;
-   }
--  retval = zebra_add_v4_route(route);
--  free_ipv4_route(route);
-+  retval = zebra_send_command (zebra_route_packet (ZEBRA_IPV4_ROUTE_ADD, &route));
-   return retval;
-+
- }
--int
--zebra_del_olsr_v4_route(const struct rt_entry *r)
--{
-+int zebra_del_route (const struct rt_entry *r) {
--  struct ipv4_route route;
-+  struct zebra_route route;
-   int retval;
--  route.index = NULL;
--  route.distance = 0;
--  route.type = ZEBRA_ROUTE_OLSR;        // OLSR
--  route.message = ZAPI_MESSAGE_METRIC;
-+
-+  route.type = ZEBRA_ROUTE_OLSR;
-   route.flags = zebra.flags;
-+  route.message = ZAPI_MESSAGE_NEXTHOP | ZAPI_MESSAGE_METRIC;
-   route.prefixlen = r->rt_dst.prefix_len;
--  route.prefix = r->rt_dst.prefix.v4.s_addr;
--  if ((r->rt_nexthop.gateway.v4.s_addr == r->rt_dst.prefix.v4.s_addr && route.prefixlen == 32)) {
--    route.message |= ZAPI_MESSAGE_IFINDEX;
--    route.ind_num = 1;
--    route.index = olsr_malloc(sizeof *route.index, "zebra_add_olsr_v4_route");
--    *route.index = htonl(r->rt_nexthop.iif_index);
--    route.nexthops = olsr_malloc(sizeof route.nexthops->type + sizeof route.nexthops->payload, "zebra_add_olsr_v4_route");
--    route.nh_count = 1;
--    route.nexthops->type = 0;
--  } else {
--    route.message |= ZAPI_MESSAGE_NEXTHOP;
--    route.nh_count = 1;
--    route.nexthops =
--      olsr_malloc(route.nh_count * (sizeof route.nexthops->type + sizeof route.nexthops->payload), "zebra_add_olsr_v4_route");
--    route.nexthops->type = ZEBRA_NEXTHOP_IPV4;
--    route.nexthops->payload.v4 = r->rt_nexthop.gateway.v4.s_addr;
-+  route.prefix.v4.s_addr = r->rt_dst.prefix.v4.s_addr;
-+  route.ifindex_num = 0;
-+  route.ifindex = NULL;
-+  route.nexthop_num = 0;
-+  route.nexthop = NULL;
-+
-+  if (r->rt_nexthop.gateway.v4.s_addr == r->rt_dst.prefix.v4.s_addr &&
-+       route.prefixlen == 32){
-+    return 0;                 /* Quagga BUG workaround: don't delete routes with destination = gateway
-+                                 see http://lists.olsr.org/pipermail/olsr-users/2006-June/001726.html */
-+    route.ifindex_num++;
-+    route.ifindex = olsr_malloc (sizeof *route.ifindex,
-+                             "zebra_del_route");
-+    *route.ifindex = r->rt_nexthop.iif_index;
-+  }
-+  else {
-+    route.nexthop_num++;
-+    route.nexthop = olsr_malloc (sizeof *route.nexthop, "zebra_del_route");
-+    route.nexthop->v4.s_addr = r->rt_nexthop.gateway.v4.s_addr;
-   }
-+
-   route.metric = 0;
-   if (zebra.distance) {
-@@ -868,36 +557,23 @@
-     route.distance = zebra.distance;
-   }
--  retval = zebra_delete_v4_route(route);
--  free_ipv4_route(route);
-+  retval = zebra_send_command (zebra_route_packet (ZEBRA_IPV4_ROUTE_DELETE, &route));
-   return retval;
-+
- }
--void
--zebra_olsr_distance(unsigned char dist)
--{
-+void zebra_olsr_distance (unsigned char dist) {
-   zebra.distance = dist;
- }
--void
--zebra_olsr_localpref(void)
--{
-+void zebra_olsr_localpref (void) {
-   zebra.flags &= ZEBRA_FLAG_SELECTED;
- }
--void
--zebra_export_routes(unsigned char t)
--{
-+void zebra_export_routes (unsigned char t) {
-   if (t)
-     zebra.options |= OPTION_EXPORT;
-   else
-     zebra.options &= ~OPTION_EXPORT;
- }
--
--/*
-- * Local Variables:
-- * c-basic-offset: 2
-- * indent-tabs-mode: nil
-- * End:
-- */
---- a/lib/quagga/src/quagga.h
-+++ b/lib/quagga/src/quagga.h
-@@ -1,77 +1,102 @@
-+/*
-+ * OLSRd Quagga plugin
-+ *
-+ * Copyright (C) 2006-2008 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
-+ * Copyright (C) 2007-2008 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               : quagga.h
-+ * Description        : header file for quagga.c
-+ * ------------------------------------------------------------------------- */
--/***************************************************************************
-- projekt              : olsrd-quagga
-- file                 : quagga.h
-- usage                : header for quagga.c
-- copyright            : (C) 2006 by Immo 'FaUl' Wehrenberg
-- e-mail               : immo@chaostreff-dortmund.de
-- ***************************************************************************/
--
--/***************************************************************************
-- *                                                                         *
-- *   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.                            *
-- *                                                                         *
-- ***************************************************************************/
-+
-+#include "routing_table.h" /* rt_entry */
-+#include "olsr_types.h" /* olsr_ip_addr */
- #include <stdint.h>
--#include <stdio.h>
- #include <stdlib.h>
--#include "routing_table.h"
-+
- #define HAVE_SOCKLEN_T
-+/* Zebra port */
- #ifndef ZEBRA_PORT
- #define ZEBRA_PORT 2600
- #endif
-+/* Zebra version */
- #ifdef ZEBRA_HEADER_MARKER
- #ifndef ZSERV_VERSION
- #define ZSERV_VERSION 1
- #endif
- #endif
--struct ipv4_route {
--  uint8_t type;
--  uint8_t flags;
--  uint8_t message;
--  uint8_t prefixlen;
--  uint32_t prefix;
--  uint8_t nh_count;
--  struct {
--    uint8_t type;
--    union {
--      uint32_t v4;
--    } payload;
--  } *nexthops;
--  uint8_t ind_num;
--  uint32_t *index;
-+/* Zebra socket */
-+#define ZEBRA_SOCKET "/var/run/quagga/zserv.api"
-+
-+/* 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_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
-+
-+/* 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;
--  struct ipv4_route *next;
- };
--void init_zebra(void);
--void zebra_cleanup(void);
--unsigned char zebra_send_command(unsigned char, unsigned char *, int);
--int zebra_add_v4_route(const struct ipv4_route r);
--int zebra_delete_v4_route(const struct ipv4_route r);
--void zebra_check(void *);
--int zebra_parse_packet(unsigned char *, ssize_t);
--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(const struct rt_entry *);
--int zebra_del_olsr_v4_route(const struct rt_entry *);
--void zebra_olsr_localpref(void);
--void zebra_olsr_distance(unsigned char);
-+void init_zebra (void);
-+void zebra_cleanup (void);
-+void zebra_parse (void*);
-+int zebra_redistribute (unsigned char);
-+int zebra_disable_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);
--
--/*
-- * Local Variables:
-- * c-basic-offset: 2
-- * indent-tabs-mode: nil
-- * End:
-- */
---- a/lib/quagga/test/foo.c
-+++ /dev/null
-@@ -1,20 +0,0 @@
--#include "quagga.h"
--
--int
--main(void)
--{
--
--  init_zebra();
--  zebra_redistribute(2);
--  //  zebra_redistribute (1);
--  while (!sleep(1))
--    zebra_check();
--  return 0;
--}
--
--/*
-- * Local Variables:
-- * c-basic-offset: 2
-- * indent-tabs-mode: nil
-- * End:
-- */
---- a/lib/quagga/test/foo.pl
-+++ /dev/null
-@@ -1,19 +0,0 @@
--#!/usr/bin/perl
--
--use IO::Socket;
--
--$command = 11; # 11 = redistribute_add , 13 = redistribute_default_add
--
--$proto = 2; # connected 
--
--$remote = IO::Socket::INET->new (Proto => "tcp",
--                                 PeerAddr => "127.0.0.1",
--                                 PeerPort => "2600",
--                                 );
--$remote->autoflush (1);
--#print $remote pack ("nc", 3, 13);
--print $remote pack ("nc",3,1);
--print $remote pack ("ncc", 4,$command,2);
--print $remote pack ("ncccccNcNcNN", 25, 7, 10, 16, 11, 25, 0xc0a80206, 0, 0, 1, 5, 1);
--print <$remote>;
--close $remote
---- a/lib/quagga/test/quagga.try1.c
-+++ /dev/null
-@@ -1,728 +0,0 @@
--
--/*
-- *  (C) 2006 by Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
-- *
-- *  This code is covered by the GPLv2
-- *
-- */
--
--#include <stdint.h>
--#ifdef MY_DEBUG
--#include <stdio.h>
--#endif
--#include <sys/types.h>
--#include <sys/socket.h>
--#include <netinet/in.h>
--#define HAVE_SOCKLEN_T
--#include <quagga/zebra.h>
--#include "quagga.h"
--
--#ifdef OLSR_PLUGIN
--#include "olsr.h"
--#include "log.h"
--#include "defs.h"
--#include "local_hna_set.h"
--#endif
--
--#define ZAPI_MESSAGE_NEXTHOP  0x01
--#define ZAPI_MESSAGE_IFINDEX  0x02
--#define ZAPI_MESSAGE_DISTANCE 0x04
--#define ZAPI_MESSAGE_METRIC   0x08
--
--#define STATUS_CONNECTED 1
--#define BUFSIZE 1024
--static char status = 0;
--
--static int zsock;                      // Socket to zebra...
--struct ipv4_route *quagga_routes = 0;  // routes currently exportet to zebra
--
--/* prototypes ntern */
--static char *try_read(ssize_t *);
--static char *zebra_route_packet(struct ipv4_route r, ssize_t *);
--static int parse_interface_add(char *, size_t);
--static int parse_interface_delete(char *, size_t);
--static int parse_interface_up(char *, size_t);
--static int parse_interface_down(char *, size_t);
--static int parse_interface_address_add(char *, size_t);
--static int parse_interface_address_delete(char *, size_t);
--static int parse_ipv4_route(char *, size_t, struct ipv4_route *);
--static int ipv4_route_add(char *, size_t);
--static int ipv4_route_delete(char *, size_t);
--static int parse_ipv6_route_add(char *, size_t);
--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);
--
--#ifdef MY_DEBUG
--static void
--dump_ipv4_route(struct ipv4_route r, char *c)
--{
--  int i = 0, x = 0;
--
--  puts(c);
--  printf("type: %d\n", r.type);
--  puts("flags:");
--  printf("  Internal: %s\n", r.flags & ZEBRA_FLAG_INTERNAL ? "yes" : "no");
--  printf("  Selfroute %s\n", r.flags & ZEBRA_FLAG_SELFROUTE ? "yes" : "no");
--  printf("  Blackhole %s\n", r.flags & ZEBRA_FLAG_BLACKHOLE ? "yes" : "no");
--  printf("  IBGP: %s\n", r.flags & ZEBRA_FLAG_IBGP ? "yes" : "no");
--  printf("  Selected: %s\n", r.flags & ZEBRA_FLAG_SELECTED ? "yes" : "no");
--  printf("  Changed: %s\n", r.flags & ZEBRA_FLAG_CHANGED ? "yes" : "no");
--  printf("  static: %s\n", r.flags & ZEBRA_FLAG_STATIC ? "yes" : "no");
--  printf("  reject: %s\n", r.flags & ZEBRA_FLAG_REJECT ? "yes" : "no");
--  puts("message:");
--  printf("  nexthop: %s\n", r.message & ZAPI_MESSAGE_NEXTHOP ? "yes" : "no");
--  printf("  ifindex: %s\n", r.message & ZAPI_MESSAGE_IFINDEX ? "yes" : "no");
--  printf("  distance: %s\n", r.message & ZAPI_MESSAGE_DISTANCE ? "yes" : "no");
--  printf("  metric: %s\n", r.message & ZAPI_MESSAGE_METRIC ? "yes" : "no");
--  printf("Prefixlen: %d\n", r.prefixlen);
--  printf("Prefix: %d", (unsigned char)r.prefix);
--  c = (char *)&r.prefix;
--  while (++i < (r.prefixlen / 8 + (r.prefixlen % 8 ? 1 : 0)))
--    printf(".%d", (unsigned char)*(c + i));
--  while (i++ < 4)
--    printf(".0");
--  puts("");
--  i = 0;
--  if (r.message & ZAPI_MESSAGE_NEXTHOP) {
--
--    printf("nexthop-count: %d\n", r.nh_count);
--    while (i++ < r.nh_count) {
--      c = (unsigned char *)&r.nexthops[i];
--      printf("Nexthop %d: %d", i, (unsigned char)*c);
--      while (++x < 4) {
--        printf(".%d", (unsigned char)c[x]);
--      }
--      puts("");
--    }
--    i = 0;
--  }
--  if (r.message & ZAPI_MESSAGE_IFINDEX) {
--
--    printf("index-number: %d\n", r.ind_num);
--    while (i++ < r.ind_num)
--      printf("Index: %d: %d\n", i, r.index[i]);
--    i = 0;
--    if (r.message & ZAPI_MESSAGE_DISTANCE)
--      printf("Distance: %d\n", r.distance);
--    if (r.message & ZAPI_MESSAGE_METRIC)
--      printf("Metric: %d\n", r.metric);
--    puts("\n");
--  }
--}
--#endif
--
--void *
--my_realloc(void *buf, size_t s, const char *c)
--{
--  buf = realloc(buf, s);
--  if (!buf) {
--#ifdef OLSR_PLUGIN
--    OLSR_PRINTF(1, "OUT OF MEMORY: %s\n", strerror(errno));
--    olsr_syslog(OLSR_LOG_ERR, "olsrd: out of memory!: %m\n");
--    olsr_exit(c, EXIT_FAILURE);
--#else
--    exit(EXIT_FAILURE);
--#endif
--  }
--  return buf;
--}
--
--#ifndef OLSR_PLUGIN
--void *
--olsr_malloc(size_t f, const char *c)
--{
--  void *v = malloc(f);
--  return v;
--}
--#endif
--
--/* Connect to the zebra-daemon, returns a socket */
--int
--init_zebra()
--{
--  struct sockaddr_in i;
--  int ret;
--
--  zsock = socket(AF_INET, SOCK_STREAM, 0);
--  if (zsock < 0)                // TODO: Could not create socket
--    return -1;
--  memset(&i, 0, sizeof i);
--  i.sin_family = AF_INET;
--  i.sin_port = htons(ZEBRA_PORT);
--  //  i.sin_len = sizeof i;
--  i.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
--
--  ret = connect(zsock, (struct sockaddr *)&i, sizeof i);
--  if (ret < 0) {
--    close(zsock);
--    return -1;
--  }
--  status |= STATUS_CONNECTED;
--  return zsock;
--}
--
--/* Sends a command to zebra, command is
--   the command defined in zebra.h, options is the packet-payload,
--   optlen the length, of the payload */
--char
--zebra_send_command(unsigned char command, char *options, int optlen)
--{
--
--  char *p = olsr_malloc(optlen + 3, "zebra send_command");
--  uint16_t length = optlen + 3;        // length of option + command + packet_length
--
--  int ret;
--
--  uint16_t len = htons(length);
--  memcpy(p, &len, 2);
--  p[2] = command;
--  memcpy(p + 3, options, optlen);
--
--  do {
--    ret = write(zsock, p, length);
--    if (ret < 0) {
--      if (errno == EINTR)
--        continue;
--    } else
--      return -1;
--    p = p + ret;
--  }
--  while ((length -= ret));
--
--  return 0;
--}
--
--/* Creates a Route-Packet-Payload, needs address, netmask, nexthop,
--   distance, and a pointer of an size_t */
--static char *
--zebra_route_packet(struct ipv4_route r, ssize_t * optlen)
--{
--
--  char *cmdopt, *t;
--  *optlen = 9;                  // first: type, flags, message, prefixlen, nexthop number, nexthop)
--  *optlen += r.prefixlen / 8 + (r.prefixlen % 8 ? 1 : 0);
--
--  cmdopt = olsr_malloc(*optlen, "zebra add_v4_route");
--  t = cmdopt;
--  *t++ = 10;                    // Type: olsr
--  *t++ = r.flags;               // flags
--  *t++ = r.message;             // message: contains nexthop
--  *t++ = r.prefixlen;
--  memcpy(t, &r.prefix, r.prefixlen / 8 + (r.prefixlen % 8 ? 1 : 0));
--  *t += r.prefixlen / 8 + (r.prefixlen % 8 ? 1 : 0);
--  *t++ = r.nh_count;
--  memcpy(t, r.nexthops, r.nh_count * sizeof *r.nexthops);
--  return cmdopt;
--}
--
--/* adds a route to zebra-daemon (needs socket from zebra,
--   address = prefix of the route
--   mask = netmask of the route
--   nexthop = nexthop of the route
--   distance = distance-value of the route
--*/
--int
--zebra_add_v4_route(struct ipv4_route r)
--{
--
--  char *cmdopt;
--  ssize_t optlen;
--
--  cmdopt = zebra_route_packet(r, &optlen);
--
--  puts("DEBUG: zebra_route_packet returned");
--
--  return zebra_send_command(ZEBRA_IPV4_ROUTE_ADD, cmdopt, optlen);
--
--}
--
--/* deletes a route from the zebra-daemon (
--   needs socket from zebra,
--   address = prefix of the route
--   mask = netmask of the route
--   nexthop = nexthop of the route
--   distance = distance-value of the route
--*/
--int
--zebra_delete_v4_route(struct ipv4_route r)
--{
--
--  char *cmdopt;
--  ssize_t optlen;
--
--  cmdopt = zebra_route_packet(r, &optlen);
--
--  return zebra_send_command(ZEBRA_IPV4_ROUTE_DELETE, cmdopt, optlen);
--
--}
--
--/* Check wether there is data from zebra aviable */
--void
--zebra_check(void *foo)
--{
--  char *data, *f;
--  ssize_t len, ret;
--
--  if (!status & STATUS_CONNECTED) {
--  }
--  data = try_read(&len);
--  if (data) {
--    f = data;
--    do {
--      ret = zebra_parse_packet(f, len);
--      if (!ret) {               //something wired happened
--        puts("DEBUG: IIIIIIIIIIRGS");
--        exit(EXIT_FAILURE);
--      }
--      f += ret;
--    }
--    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 char *
--try_read(ssize_t * len)
--{
--  char *buf = NULL;
--  ssize_t ret = 0, bsize = 0;
--  uint16_t length = 0, l = 0;
--  int sockstate;
--
--  *len = 0;
--
--  sockstate = fcntl(zsock, F_GETFL, 0);
--  fcntl(zsock, F_SETFL, sockstate | O_NONBLOCK);
--
--  do {
--    if (*len == bsize) {
--      bsize += BUFSIZE;
--      buf = my_realloc(buf, bsize, "Zebra try_read");
--    }
--    ret = read(zsock, buf + l, bsize - l);
--    if (ret <= 0) {
--      if (errno == EAGAIN) {
--        errno = 0;
--      } else {
--        // TODO: errorhandling
--        ;
--      }
--      free(buf);
--      return NULL;
--    }
--    *len += ret;
--
--    while ((*len - l) > length) {
--      //      printf ("DEBUG: *len -l > length - %d - %d > %d\n", *len, l, length);
--      l += length;
--      memcpy(&length, buf + l, 2);
--      length = ntohs(length);
--    }
--    //    printf ("DEBUG: *len, l, length: %d,%d,%d\n", *len, l, length);
--    if (((*len) - l) == length)
--      break;                    // GOT FULL PACKAGE!!
--    if (*len < l) {
--      //      printf ("DEBUG: *len, l, length: %d,%d,%d\n", *len, l, length);
--      fcntl(zsock, F_SETFL, sockstate);
--      continue;
--    }
--  }
--  while (1);
--
--  fcntl(zsock, F_SETFL, sockstate);
--  return buf;
--}
--
--/* Parse a packet recived from zebra */
--int
--zebra_parse_packet(char *packet, ssize_t maxlen)
--{
--
--  /* Array of functions */
--  int (*foo[ZEBRA_MESSAGE_MAX]) (char *, size_t) = {
--  parse_interface_add, parse_interface_delete, parse_interface_address_add, parse_interface_address_delete, parse_interface_up,
--      parse_interface_down, ipv4_route_add, ipv4_route_delete, parse_ipv6_route_add};
--
--  puts("DEBUG: zebra_parse_packet");
--  uint16_t length;
--
--  int ret;
--  memcpy(&length, packet, 2);
--  length = ntohs(length);
--
--  if (maxlen < length) {
--    puts("Error: programmer is an idiot");
--    printf("DEBUG: maxlen = %d, packet_length = %d\n", maxlen, length);
--    return maxlen;
--  }
--
--  if (packet[2] - 1 < ZEBRA_MESSAGE_MAX && foo[packet[2] - 1]) {
--    if (!(ret = foo[packet[2] - 1] (packet + 3, length - 3)))
--      return length;
--    else
--      printf("DEBUG: Parse error: %d\n", ret);
--  } else
--    printf("Unknown packet type: %d\n", packet[2]);
--
--  puts("Quagga: RECIVED PACKET FROM ZEBRA THAT I CAN'T PARSE");
--
--  return length;
--}
--
--static int
--parse_interface_add(char *opt, size_t len)
--{
--  //todo
--  return 0;
--}
--
--static int
--parse_interface_delete(char *opt, size_t len)
--{
--  //todo
--  return 0;
--}
--
--static int
--parse_interface_address_add(char *opt, size_t len)
--{
--
--  //todo
--  return 0;
--}
--
--static int
--parse_interface_up(char *opt, size_t len)
--{
--
--  //todo
--  return 0;
--}
--
--static int
--parse_interface_down(char *opt, size_t len)
--{
--
--  //todo
--  return 0;
--}
--
--static int
--parse_interface_address_delete(char *opt, size_t len)
--{
--  //todo
--  return 0;
--}
--
--/* Parse an ipv4-route-packet recived from zebra
-- */
--static int
--parse_ipv4_route(char *opt, size_t len, struct ipv4_route *r)
--{
--  //  puts ("DEBUG: parse_ipv4_route");
--  if (len < 4)
--    return -1;
--
--  r->type = *opt++;
--  r->flags = *opt++;
--  r->message = *opt++;
--  r->prefixlen = *opt++;
--  len -= 4;
--  r->prefix = 0;
--
--  if ((int)len < r->prefixlen / 8 + (r->prefixlen % 8 ? 1 : 0))
--    return -1;
--
--  memcpy(&r->prefix, opt, r->prefixlen / 8 + (r->prefixlen % 8 ? 1 : 0));
--  opt += r->prefixlen / 8 + (r->prefixlen % 8 ? 1 : 0);
--
--  if (r->message & ZAPI_MESSAGE_NEXTHOP) {
--    if (len < 1)
--      return -1;
--    r->nh_count = *opt++;
--    if (len < sizeof(uint32_t) * r->nh_count)
--      return -1;
--    r->nexthops = olsr_malloc(sizeof(uint32_t) * r->nh_count, "quagga: parse_ipv4_route_add");
--    memcpy(r->nexthops, opt, sizeof(uint32_t) * r->nh_count);
--    opt += sizeof(uint32_t) * r->nh_count;
--    len -= sizeof(uint32_t) * r->nh_count + 1;
--  }
--
--  if (r->message & ZAPI_MESSAGE_IFINDEX) {
--    if (len < 1)
--      return -2;
--    r->ind_num = *opt++;
--    if (len < sizeof(uint32_t) * r->ind_num)
--      return -3;
--    r->index = olsr_malloc(sizeof(uint32_t) * r->ind_num, "quagga: parse_ipv4_route_add");
--    memcpy(r->index, opt, r->ind_num * sizeof(uint32_t));
--    opt += sizeof(uint32_t) * r->ind_num;
--    len -= sizeof(uint32_t) * r->ind_num;
--  }
--
--  if (r->message & ZAPI_MESSAGE_DISTANCE)
--    // todo
--    ;
--
--  if (r->message & ZAPI_MESSAGE_METRIC) {
--    if (len < sizeof(uint32_t))
--      return -4;
--    memcpy(&r->metric, opt, sizeof(uint32_t));
--  }
--
--  return 0;
--}
--
--static int
--ipv4_route_add(char *opt, size_t len)
--{
--
--  struct ipv4_route r;
--  int f;
--
--  //  puts ("DEBUG: ipv4_route_add");
--
--  f = parse_ipv4_route(opt, len, &r);
--  if (f < 0) {
--    printf("parse-error: %d\n", f);
--    return f;
--  }
--
--  add_hna4_route(r);
--  return 0;
--}
--
--static int
--ipv4_route_delete(char *opt, size_t len)
--{
--  struct ipv4_route r;
--  int f;
--
--  f = parse_ipv4_route(opt, len, &r);
--  if (f < 0)
--    return f;
--
--  return delete_hna4_route(r);
--  // OK, now delete that foo
--
--}
--
--static int
--parse_ipv6_route_add(char *opt, size_t len)
--{
--  //todo
--  return 0;
--}
--
--/* start redistribution FROM zebra */
--int
--zebra_redistribute(unsigned char type)
--{
--
--  return zebra_send_command(ZEBRA_REDISTRIBUTE_ADD, &type, 1);
--
--}
--
--/* end redistribution FROM zebra */
--int
--zebra_disable_redistribute(unsigned char type)
--{
--
--  return zebra_send_command(ZEBRA_REDISTRIBUTE_DELETE, &type, 1);
--
--}
--
--static uint32_t
--prefixlentomask(uint8_t prefix)
--{
--  uint32_t mask;
--  mask = prefix_to_netmask4(prefix);
--  mask = ntohl(mask);
--  return mask;
--}
--
--int
--add_hna4_route(struct ipv4_route r)
--{
--  union olsr_ip_addr net, mask;
--
--#ifdef MY_DEBUG
--  dump_ipv4_route(r, "add_hna4_route");
--#endif
--
--  mask.v4 = prefixlentomask(r.prefixlen);
--  net.v4 = r.prefix;
--
--#ifdef OLSR_PLUGIN
--  add_local_hna4_entry(&net, &mask);
--#endif
--  free_ipv4_route(r);
--  return 0;
--}
--
--int
--delete_hna4_route(struct ipv4_route r)
--{
--
--  union olsr_ip_addr net, mask;
--
--#ifdef MY_DEBUG
--  dump_ipv4_route(r, "delete_hna4_route");
--#endif
--
--  mask.v4 = prefixlentomask(r.prefixlen);
--  net.v4 = r.prefix;
--
--#ifdef OLSR_PLUGIN
--  return remove_local_hna4_entry(&net, &mask) ? 0 : -1;
--#endif
--
--  free_ipv4_route(r);
--  return 0;
--
--}
--
--static void
--free_ipv4_route(struct ipv4_route r)
--{
--
--  if (r.message & ZAPI_MESSAGE_IFINDEX && r.ind_num)
--    free(r.index);
--  if (r.message & ZAPI_MESSAGE_NEXTHOP && r.nh_count)
--    free(r.nexthops);
--
--}
--
--void
--zebra_clear_routes(void)
--{
--
--  struct ipv4_route *t;
--
--  t = quagga_routes;
--  while (t) {
--    zebra_delete_v4_route(*t);
--    t = t->next;
--  }
--  zebra_free_ipv4_route_table(quagga_routes);
--
--  quagga_routes = NULL;
--}
--
--void
--zebra_update_hna(void *f)
--{
--
--  struct ipv4_route *a = zebra_create_ipv4_route_table();
--  update_olsr_zebra_routes(a, quagga_routes);
--  zebra_free_ipv4_route_table(quagga_routes);
--
--  quagga_routes = a;
--
--}
--
--static struct ipv4_route *
--zebra_create_ipv4_route_table(void)
--{
--
--  struct ipv4_route *r = 0, *t = 0 /* make compiler happy */ ;
--  int i;
--  struct hna_entry *e;
--  struct hna_net *n;
--
--  for (i = 0; i < HASHSIZE; i++) {
--    e = hna_set[i].next;
--    for (; e != &hna_set[i]; e = e->next) {
--      n = e->networks.next;
--      for (; n != &e->networks; n = n->next) {
--        if (!r) {
--          r = zebra_create_ipv4_route_table_entry(n->A_network_addr.v4, n->A_netmask.v4, e->A_gateway_addr.v4);
--          t = r;
--        } else {
--          t->next = zebra_create_ipv4_route_table_entry(n->A_network_addr.v4, n->A_netmask.v4, e->A_gateway_addr.v4);
--          t = t->next;
--        }
--      }
--    }
--  }
--
--  return r;
--
--}
--
--static struct ipv4_route *
--zebra_create_ipv4_route_table_entry(uint32_t addr, uint32_t mask, uint32_t gw)
--{
--
--  struct ipv4_route *r;
--
--  r = olsr_malloc(sizeof *r, "zebra_create_ipv4_route_table_entry");
--  memset(r, 0, sizeof *r);
--  r->prefix = addr;
--  r->prefixlen = masktoprefixlen(mask);
--  r->message |= ZAPI_MESSAGE_NEXTHOP;
--  r->nh_count = 1;
--  r->nexthops = olsr_malloc(sizeof(uint32_t), "zebra_create_ipv4_route_table_entry");
--  *r->nexthops = gw;
--  r->next = NULL;
--
--  return r;
--}
--
--static uint8_t
--masktoprefixlen(uint32_t mask)
--{
--
--  uint8_t prefixlen = 0;
--while (mask & (1 << ++prefixlen && prefixlen < 32); return prefixlen;}
--
--       static void update_olsr_zebra_routes(struct ipv4_route *a, struct ipv4_route *r) {
--
--       struct ipv4_route * t; if (!r) {
--       puts("no quagga_routing_table aviable"); for (; a; a = a->next) {
--       dump_ipv4_route(*a, "adding this route");
--       //      zebra_add_v4_route(*r);
--       }
--       return;}
--
--       while (a) {
--       for (t = r; t; t = t->next) {
--       if (a->prefix == t->prefix) if (a->prefixlen == t->prefixlen) if (*a->nexthops == *t->nexthops) {
--       goto foo;}
--       }
--       dump_ipv4_route(*a, "adding this route");
--       //zebra_add_v4_route(*a);
--  foo:
--       a = a->next;}
--
--       while (r) {
--       for (t = a; t; t = t->next) {
--       if (r->prefix == t->prefix) if (r->prefixlen == t->prefixlen) if (*r->nexthops == *t->nexthops) {
--       goto bar;}
--       }
--       dump_ipv4_route(*r, "deleting this route");
--       //zebra_delete_v4_route(*r);
--  bar:
--       r = r->next;}
--
--       }
--
--       static void zebra_free_ipv4_route_table(struct ipv4_route *r) {
--       struct ipv4_route * n; if (!r) return; while ((n = r->next)) {
--       if (r->message & ZAPI_MESSAGE_NEXTHOP) free(r->nexthops); if (r->message & ZAPI_MESSAGE_IFINDEX) free(r->index); free(r);
--       r = n;}
--       }
--
--/*
-- * Local Variables:
-- * c-basic-offset: 2
-- * indent-tabs-mode: nil
-- * End:
-- */