* sync'ed current svn (rev 33) upon Immo 'FaUl' Wehrenberg's hint
authorBernd Petrovitsch <bernd@firmix.at>
Thu, 16 Aug 2007 19:07:28 +0000 (19:07 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Thu, 16 Aug 2007 19:07:28 +0000 (19:07 +0000)
lib/quagga/ChangeLog
lib/quagga/Contributors [new file with mode: 0644]
lib/quagga/README_QUAGGA
lib/quagga/quagga-0.98.6-olsr.diff [deleted file]
lib/quagga/src/olsrd_plugin.c
lib/quagga/src/quagga.c
lib/quagga/src/quagga.h

index b80cf55..90f9622 100644 (file)
@@ -1,3 +1,11 @@
+0.2.2: Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>:
+       * make selected flag configurable (do not set it by default)
+       * configurable administrative distance now
+       * make it compile (and work) on *bsd (only tested on freebsd, please
+         drop me a note if you test it on any other platform!)
+       * lot of bugfixes (now support for redistribute with
+         ZEBRA_HEADER_MARKER), etc
+
 0.2.1: Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>:
        * now check (most of the) return-values of syscalls, improvement still
          possible...
diff --git a/lib/quagga/Contributors b/lib/quagga/Contributors
new file mode 100644 (file)
index 0000000..d03a8e7
--- /dev/null
@@ -0,0 +1,4 @@
+This file is to thank people contributing code or do a lot of testing 
+
+* Vassilis T. <acinonyxs@yahoo.gr> for a lot of cleanups and fixes
+* Johannes Joemann <5@free.de> for a lot of testing
index 9e59dde..4a93c6f 100644 (file)
@@ -28,15 +28,15 @@ PlParam "redistribute" "<protocol>"
 
 PlParam "ExportRoutes" "<only/both>"
        exportes olsr-routes to quagga or to both, quagga and kernel
-       no routes are exportet if not set.
+       no routes are exported to quagga (normal behaviour) if not set.
 
 PlParam "LocalPref" "true"
-        sets the zebra SELECTED-flag on the routes exported to zebra
+        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 Administrative distance to routes exported 
-       to zebra.
+        allowes to set the administrative distance to routes exported 
+       to Zebra.
        
 ---------------------------------------------------------------------
 SAMPLE CONFIG
diff --git a/lib/quagga/quagga-0.98.6-olsr.diff b/lib/quagga/quagga-0.98.6-olsr.diff
deleted file mode 100644 (file)
index 81be34a..0000000
+++ /dev/null
@@ -1,717 +0,0 @@
-diff -Nur quagga-0.98.6.orig/bgpd/bgp_vty.c quagga-0.98.6/bgpd/bgp_vty.c
---- quagga-0.98.6.orig/bgpd/bgp_vty.c  2006-03-30 18:12:25.000000000 +0200
-+++ quagga-0.98.6/bgpd/bgp_vty.c       2006-12-02 10:52:14.000000000 +0100
-@@ -7793,7 +7793,9 @@
-       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;
-     }
-   if (afi == AFI_IP6)
-@@ -7806,20 +7808,23 @@
-       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;
-     }
-   return 0;
- }
- DEFUN (bgp_redistribute_ipv4,
-        bgp_redistribute_ipv4_cmd,
--       "redistribute (connected|kernel|ospf|rip|static)",
-+       "redistribute (connected|kernel|ospf|rip|static|olsr)",
-        "Redistribute information from another routing protocol\n"
-        "Connected\n"
-        "Kernel routes\n"
-        "Open Shurtest Path First (OSPF)\n"
-        "Routing Information Protocol (RIP)\n"
-+       "Optimized Link State Routing (OLSR)\n"
-        "Static routes\n")
- {
-   int type;
-@@ -7835,13 +7840,14 @@
- 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) 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"
-        "Route map reference\n"
-        "Pointer to route-map entries\n")
- {
-@@ -7860,13 +7866,14 @@
- 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) 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"
-        "Metric for redistributed routes\n"
-        "Default metric\n")
- {
-@@ -7887,13 +7894,14 @@
- 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) 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"
-        "Route map reference\n"
-        "Pointer to route-map entries\n"
-        "Metric for redistributed routes\n"
-@@ -7917,13 +7925,14 @@
- 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) 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"
-        "Metric for redistributed routes\n"
-        "Default metric\n"
-        "Route map reference\n"
-@@ -7947,14 +7956,16 @@
- 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)",
-        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"
-+       )
- {
-   int type;
-@@ -7970,7 +7981,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) route-map WORD",
-        NO_STR
-        "Redistribute information from another routing protocol\n"
-        "Connected\n"
-@@ -7978,6 +7989,7 @@
-        "Open Shurtest Path First (OSPF)\n"
-        "Routing Information Protocol (RIP)\n"
-        "Static routes\n"
-+       "Optimized Link State Routing (OLSR)\n"
-        "Route map reference\n"
-        "Pointer to route-map entries\n")
- {
-@@ -7996,7 +8008,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) metric <0-4294967295>",
-        NO_STR
-        "Redistribute information from another routing protocol\n"
-        "Connected\n"
-@@ -8004,6 +8016,7 @@
-        "Open Shurtest Path First (OSPF)\n"
-        "Routing Information Protocol (RIP)\n"
-        "Static routes\n"
-+       "Optimized Link State Routing (OLSR)\n"
-        "Metric for redistributed routes\n"
-        "Default metric\n")
- {
-@@ -8022,7 +8035,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) route-map WORD metric <0-4294967295>",
-        NO_STR
-        "Redistribute information from another routing protocol\n"
-        "Connected\n"
-@@ -8030,6 +8043,7 @@
-        "Open Shurtest Path First (OSPF)\n"
-        "Routing Information Protocol (RIP)\n"
-        "Static routes\n"
-+       "Optimized Link State Routing (OLSR)\n"
-        "Route map reference\n"
-        "Pointer to route-map entries\n"
-        "Metric for redistributed routes\n"
-@@ -8051,7 +8065,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) metric <0-4294967295> route-map WORD",
-        NO_STR
-        "Redistribute information from another routing protocol\n"
-        "Connected\n"
-@@ -8059,6 +8073,7 @@
-        "Open Shurtest Path First (OSPF)\n"
-        "Routing Information Protocol (RIP)\n"
-        "Static routes\n"
-+       "Optimized Link State Routing (OLSR)\n"
-        "Metric for redistributed routes\n"
-        "Default metric\n"
-        "Route map reference\n"
-@@ -8067,13 +8082,15 @@
- #ifdef HAVE_IPV6
- DEFUN (bgp_redistribute_ipv6,
-        bgp_redistribute_ipv6_cmd,
--       "redistribute (connected|kernel|ospf6|ripng|static)",
-+       "redistribute (connected|kernel|ospf6|ripng|static|olsr)",
-        "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"
-+       )
- {
-   int type;
-@@ -8089,13 +8106,14 @@
- 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) 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"
-        "Route map reference\n"
-        "Pointer to route-map entries\n")
- {
-@@ -8114,13 +8132,14 @@
- 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) 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"
-        "Metric for redistributed routes\n"
-        "Default metric\n")
- {
-@@ -8141,13 +8160,14 @@
- 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|ols) 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"
-        "Route map reference\n"
-        "Pointer to route-map entries\n"
-        "Metric for redistributed routes\n"
-@@ -8171,13 +8191,14 @@
- 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) 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"
-        "Metric for redistributed routes\n"
-        "Default metric\n"
-        "Route map reference\n"
-@@ -8201,14 +8222,16 @@
- 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)",
-        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"
-+      )
- {
-   int type;
-@@ -8224,7 +8247,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) route-map WORD",
-        NO_STR
-        "Redistribute information from another routing protocol\n"
-        "Connected\n"
-@@ -8232,6 +8255,7 @@
-        "Open Shurtest Path First (OSPFv3)\n"
-        "Routing Information Protocol (RIPng)\n"
-        "Static routes\n"
-+       "Optimized Link State Routing (OLSR)\n"
-        "Route map reference\n"
-        "Pointer to route-map entries\n")
- {
-@@ -8250,7 +8274,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) metric <0-4294967295>",
-        NO_STR
-        "Redistribute information from another routing protocol\n"
-        "Connected\n"
-@@ -8258,6 +8282,7 @@
-        "Open Shurtest Path First (OSPFv3)\n"
-        "Routing Information Protocol (RIPng)\n"
-        "Static routes\n"
-+       "Optimized Link State Routing (OLSR)\n"
-        "Metric for redistributed routes\n"
-        "Default metric\n")
- {
-@@ -8276,7 +8301,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) route-map WORD metric <0-4294967295>",
-        NO_STR
-        "Redistribute information from another routing protocol\n"
-        "Connected\n"
-@@ -8284,6 +8309,7 @@
-        "Open Shurtest Path First (OSPFv3)\n"
-        "Routing Information Protocol (RIPng)\n"
-        "Static routes\n"
-+       "Optimized Link State Routing (OLSR)\n"
-        "Route map reference\n"
-        "Pointer to route-map entries\n"
-        "Metric for redistributed routes\n"
-@@ -8305,7 +8331,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) metric <0-4294967295> route-map WORD",
-        NO_STR
-        "Redistribute information from another routing protocol\n"
-        "Connected\n"
-@@ -8313,6 +8339,7 @@
-        "Open Shurtest Path First (OSPFv3)\n"
-        "Routing Information Protocol (RIPng)\n"
-        "Static routes\n"
-+       "Optimized Link State Routing (OLSR)\n"
-        "Metric for redistributed routes\n"
-        "Default metric\n"
-        "Route map reference\n"
-@@ -8325,7 +8352,7 @@
- {
-   int i;
-   const char *str[] = { "system", "kernel", "connected", "static", "rip",
--                "ripng", "ospf", "ospf6", "isis", "bgp"};
-+                "ripng", "ospf", "ospf6", "isis", "bgp", "hsls", "olsr"};
-   /* Unicast redistribution only.  */
-   if (safi != SAFI_UNICAST)
-diff -Nur quagga-0.98.6.orig/lib/zebra.h quagga-0.98.6/lib/zebra.h
---- quagga-0.98.6.orig/lib/zebra.h     2005-06-15 13:54:18.000000000 +0200
-+++ quagga-0.98.6/lib/zebra.h  2006-12-02 10:48:51.000000000 +0100
-@@ -378,7 +378,8 @@
- #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_MAX                  12
- /* Zebra's family types. */
- #define ZEBRA_FAMILY_IPV4                1
-diff -Nur quagga-0.98.6.orig/ospfd/ospf_vty.c quagga-0.98.6/ospfd/ospf_vty.c
---- quagga-0.98.6.orig/ospfd/ospf_vty.c        2006-03-30 17:41:20.000000000 +0200
-+++ quagga-0.98.6/ospfd/ospf_vty.c     2006-12-02 10:48:51.000000000 +0100
-@@ -108,9 +108,11 @@
-     *source = ZEBRA_ROUTE_RIP;
-   else if (strncmp (str, "b", 1) == 0)
-     *source = ZEBRA_ROUTE_BGP;
-+  else if (strncmp (str, "ol", 2) == 0)
-+    *source = ZEBRA_ROUTE_OLSR;
-   else
-     return 0;
--
-+  
-   return 1;
- }
-@@ -5302,13 +5304,14 @@
\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) 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"
-        "Metric for redistributed routes\n"
-        "OSPF default metric\n"
-        "OSPF exterior metric type for redistributed routes\n"
-@@ -5346,13 +5349,14 @@
- 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) 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"
-        "Metric for redistributed routes\n"
-        "OSPF default metric\n"
-        "OSPF exterior metric type for redistributed routes\n"
-@@ -5368,18 +5372,20 @@
-        "Static routes\n"
-        "Routing Information Protocol (RIP)\n"
-        "Border Gateway Protocol (BGP)\n"
-+       "Optimized Link State Routing (OLSR)\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) 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"
-        "OSPF exterior metric type for redistributed routes\n"
-        "Set OSPF External Type 1 metrics\n"
-        "Set OSPF External Type 2 metrics\n"
-@@ -5417,13 +5423,14 @@
- 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) 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"
-        "OSPF exterior metric type for redistributed routes\n"
-        "Set OSPF External Type 1 metrics\n"
-        "Set OSPF External Type 2 metrics\n"
-@@ -5432,7 +5439,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) metric-type (1|2)",
-        "Redistribute information from another routing protocol\n"
-        "Kernel routes\n"
-        "Connected\n"
-@@ -5440,28 +5447,31 @@
-        "Routing Information Protocol (RIP)\n"
-        "Border Gateway Protocol (BGP)\n"
-        "OSPF exterior metric type for redistributed routes\n"
-+       "Optimized Link State Routing (OLSR)\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)",
-        "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")
- 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) 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"
-        "Metric for redistributed routes\n"
-        "OSPF default metric\n"
-        "Route map reference\n"
-@@ -5490,13 +5500,14 @@
- 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) 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"
-        "OSPF exterior metric type for redistributed routes\n"
-        "Set OSPF External Type 1 metrics\n"
-        "Set OSPF External Type 2 metrics\n"
-@@ -5526,13 +5537,14 @@
- 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) 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"
-        "Route map reference\n"
-        "Pointer to route-map entries\n")
- {
-@@ -5553,14 +5565,16 @@
- 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)",
-        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"
-+       )
- {
-   struct ospf *ospf = vty->index;
-   int source;
-@@ -5574,7 +5588,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)",
-        "Filter networks in routing updates\n"
-        "Access-list name\n"
-        OUT_STR
-@@ -5582,7 +5596,8 @@
-        "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")
- {
-   struct ospf *ospf = vty->index;
-   int source;
-@@ -5596,7 +5611,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)",
-        NO_STR
-        "Filter networks in routing updates\n"
-        "Access-list name\n"
-@@ -5605,7 +5620,8 @@
-        "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")
- {
-   struct ospf *ospf = vty->index;
-   int source;
-@@ -7121,7 +7137,8 @@
\f
- const char *distribute_str[] = { "system", "kernel", "connected", "static",
--                              "rip", "ripng", "ospf", "ospf6", "isis", "bgp"};
-+                              "rip", "ripng", "ospf", "ospf6", "isis", "bgp",
-+                              "hsls","olsr"};
- int
- config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf)
- {
-diff -Nur quagga-0.98.6.orig/zebra/zebra_vty.c quagga-0.98.6/zebra/zebra_vty.c
---- quagga-0.98.6.orig/zebra/zebra_vty.c       2004-12-18 17:03:29.000000000 +0100
-+++ quagga-0.98.6/zebra/zebra_vty.c    2006-12-02 10:49:45.000000000 +0100
-@@ -53,6 +53,8 @@
-       return "isis";
-     case ZEBRA_ROUTE_BGP:
-       return "bgp";
-+    case ZEBRA_ROUTE_OLSR:
-+      return "olsr";
-     default:
-       return "unknown";
-     }
-@@ -84,6 +86,10 @@
-       return 'I';
-     case ZEBRA_ROUTE_BGP:
-       return 'B';
-+    case ZEBRA_ROUTE_HSLS:
-+      return 'H';
-+    case ZEBRA_ROUTE_OLSR:
-+      return 'L';
-     default:
-       return '?';
-     }
-@@ -755,8 +761,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, > - selected route, * - FIB route%s%s"
- DEFUN (show_ip_route,
-        show_ip_route_cmd,
-@@ -874,7 +880,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|static)",
-        SHOW_STR
-        IP_STR
-        "IP routing table\n"
-@@ -884,6 +890,7 @@
-        "Kernel\n"
-        "Open Shortest Path First (OSPF)\n"
-        "Routing Information Protocol (RIP)\n"
-+       "Optimized Link State Routing (OLSR)\n"
-        "Static routes\n")
- {
-   int type;
-@@ -898,7 +905,7 @@
-     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 +913,8 @@
-     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 
-     {
-       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
-@@ -1732,7 +1741,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|static)",
-        SHOW_STR
-        IP_STR
-        "IP routing table\n"
-@@ -1742,6 +1751,7 @@
-        "Kernel\n"
-        "Open Shortest Path First (OSPFv3)\n"
-        "Routing Information Protocol (RIPng)\n"
-+       "Optimized Link State Routing (olsr)\n"
-        "Static routes\n")
- {
-   int type;
-@@ -1756,7 +1766,7 @@
-     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 +1774,9 @@
-     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
-     {
-       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
-       return CMD_WARNING;
index 118e477..ff3e334 100644 (file)
@@ -31,7 +31,6 @@
 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
 #define PLUGIN_INTERFACE_VERSION 4
 
-
 static void __attribute__ ((constructor)) my_init(void);
 static void __attribute__ ((destructor)) my_fini(void);
 static void redist_hna (void);
@@ -63,13 +62,16 @@ int olsrd_plugin_register_param(char *key, char *value) {
        puts ("AIII, could not remove the kernel route deleter");
       olsr_addroute_add_function(&zebra_add_olsr_v4_route, AF_INET);
       olsr_delroute_add_function(&zebra_del_olsr_v4_route, AF_INET);
+      zebra_export_routes(1);
       return 1;
     }
     else if (!strcmp(value, "additional")) {
       olsr_addroute_add_function(&zebra_add_olsr_v4_route, AF_INET);
       olsr_delroute_add_function(&zebra_del_olsr_v4_route, AF_INET);
+      zebra_export_routes(1);
       return 1;
     }
+    else zebra_export_routes(0);
   }
   else if (!strcmp(key, "Distance")) {
     unsigned int distance = atoi (value);
@@ -91,7 +93,7 @@ int olsrd_plugin_register_param(char *key, char *value) {
 
 int olsrd_plugin_init() {
   if(olsr_cnf->ip_version != AF_INET) {
-    fputs("see the source - ipv6 so far not supportet\n" ,stderr);
+    fputs("see the source - ipv6 so far not supported\n" ,stderr);
     return 1;
   }
 
@@ -105,5 +107,6 @@ static void my_init(void) {
 }
 
 static void my_fini(void) {
+  zebra_cleanup();
 }
 
index 582ee33..fac7061 100644 (file)
 #define BUFSIZE 1024
 
 #define STATUS_CONNECTED 1
+#define OPTION_EXPORT 1
 
 static struct {
-  char status; // TODO: internal status
+  char status; // internal status
+  char options; // internal options
   int sock; // Socket to zebra...
   char redistribute[ZEBRA_ROUTE_MAX];
   char distance;
@@ -60,20 +62,19 @@ static struct {
 /* prototypes intern */
 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 int zebra_reconnect (void);
-static int zebra_connect (void);
-static int add_v4_route_status (struct ipv4_route r);
-static int del_v4_route_status (struct ipv4_route r);
+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 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*);
@@ -85,7 +86,6 @@ 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;
@@ -147,114 +147,72 @@ static void dump_ipv4_route (struct ipv4_route r, char *c) {
 void *my_realloc (void *buf, size_t s, const char *c) {
   buf = realloc (buf, s);
   if (!buf) {
-    OLSR_PRINTF (1, "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;
 }
 
-int init_zebra () {
-  if (zebra_connect() < 0 || !(zebra.status&STATUS_CONNECTED)) {
-    olsr_exit ("AIIIII, could not connect to zebra! is zebra running?", 
+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);
-  }
 }
 
-
-static int zebra_reconnect (void) {
-  struct ipv4_route *tmp;
+void zebra_cleanup (void) {
   int i;
+  struct rt_entry *tmp;
+  if (zebra.options & OPTION_EXPORT) {
+    for (i = 0; i < HASHSIZE; i++) {
+      for (tmp = routingtable[i].next; tmp != &routingtable[i]; tmp = tmp->next)
+       zebra_del_olsr_v4_route (tmp);     
+      for (tmp = hna_routes[i].next; tmp != &hna_routes[i]; tmp = tmp->next)
+       zebra_del_olsr_v4_route (tmp) ;   }
+  }  
 
-  if (zebra_connect() < 0 || !(zebra.status&STATUS_CONNECTED)) 
-    // log: zebra-reconnect failed
-    ;
   for (i = 0; ZEBRA_ROUTE_MAX - 1; i++)
-    if (zebra.redistribute[i]) zebra_redistribute(i + 1);
-
-  for (tmp = zebra.v4_rt; tmp; tmp = tmp->next)
-    zebra_add_v4_route(*tmp);
-}
-
-
-static int add_v4_route_status (struct ipv4_route r) {
-
-  struct ipv4_route *tmp = olsr_malloc (sizeof r, "quagga_v4_route_status");
-  memcpy (tmp, &r, sizeof r);
-
-  if (r.message & ZAPI_MESSAGE_NEXTHOP) {
-    tmp->nexthops = olsr_malloc (r.nh_count * sizeof tmp->nexthops, 
-                                "quagga_v4_route_status");
-    memcpy (tmp->nexthops, &r.nexthops, sizeof *r.nexthops);
-  }
-
-  if (r.message & ZAPI_MESSAGE_IFINDEX) {
-    tmp->index = olsr_malloc (r.ind_num * sizeof *tmp->index, 
-                             "quagga_v4_route_status");
-    memcpy (tmp->index, &r.index, r.ind_num * sizeof *tmp->index);
-  }
-
-  tmp->next = zebra.v4_rt;
-  zebra.v4_rt = tmp;
-
-  return 0;
-
-}
-
-
-static int cmp_v4_route (struct ipv4_route a, struct ipv4_route b) {
-  if (a.type != b.type) return 1;
-  if (a.flags != b.flags) return 1;
-  if (a.message != b.message) return 1;
-  if (a.prefixlen != b.prefixlen) return 1;
-  if (a.message & ZAPI_MESSAGE_NEXTHOP) {
-    if (a.nh_count != b.nh_count) return 1;
-    if (memcmp (a.nexthops, b.nexthops, a.nh_count * sizeof *b.nexthops)) 
-      return 1;
-  }
-  if (a.message & ZAPI_MESSAGE_IFINDEX) {
-    if (a.ind_num != b.ind_num) return 1;
-    if (memcpy (a.index, b.index, a.ind_num * sizeof *a.index)) return 1;
-  }
-  if (a.message & ZAPI_MESSAGE_DISTANCE) 
-    if (a.distance != b.distance) return 1;
-  if (a.message & ZAPI_MESSAGE_METRIC)
-    if (a.metric != b.metric) return 1;
-  return 0;
+    if (zebra.redistribute[i]) zebra_disable_redistribute(i + 1);
 }
 
-static int del_v4_route_status (struct ipv4_route r) {
 
-  struct ipv4_route *tmp, *prv = 0;
-
-  for (tmp = zebra.v4_rt; tmp; tmp = tmp->next) {
-    if (!cmp_v4_route(*tmp, r)) {
-      if (prv) prv->next = tmp->next;
-
-      free_ipv4_route(*tmp);
-      free (tmp);
+static void zebra_reconnect (void) {
+  struct rt_entry *tmp;
+  int i;
 
-      return 0;
+  zebra_connect();
+  if (!zebra.status & STATUS_CONNECTED) return; // try again next time
 
+  if (zebra.options & OPTION_EXPORT) {
+    for (i = 0; i < HASHSIZE; i++) {
+      for (tmp = routingtable[i].next; tmp != &routingtable[i]; tmp = tmp->next)
+       zebra_add_olsr_v4_route (tmp);     
+      for (tmp = hna_routes[i].next; tmp != &hna_routes[i]; tmp = tmp->next)
+       zebra_add_olsr_v4_route (tmp);
     }
-    prv = tmp;
-  }
+  }  
 
-  return 1;
+  for (i = 0; ZEBRA_ROUTE_MAX - 1; i++)
+    if (zebra.redistribute[i]) zebra_redistribute(i + 1);
+  /* Zebra sends us all routes of type it knows after 
+     zebra_redistribute(type) */
 }
 
 
+
 /* Connect to the zebra-daemon, returns a socket */
-static int zebra_connect (void) {
+static void zebra_connect (void) {
 
 #ifndef USE_UNIX_DOMAIN_SOCKET
   struct sockaddr_in i;
-  close (zebra.sock);
+  if (close (zebra.sock) < 0) olsr_exit ("(QUAGGA) Could not close socket!", EXIT_FAILURE);
+  
 
   zebra.sock = socket (AF_INET,SOCK_STREAM, 0);
 #else
   struct sockaddr_un i;
-  close (zebra.sock);
+  if (close (zebra.sock) < 0) olsr_exit ("(QUAGGA) Could not close socket!", EXIT_FAILURE);
 
   zebra.sock = socket (AF_UNIX,SOCK_STREAM, 0);
 #endif
@@ -262,7 +220,7 @@ static int zebra_connect (void) {
   int ret;
 
   if (zebra.sock <0 )
-    olsr_exit("could not create socket!", EXIT_FAILURE);
+    olsr_exit("(QUAGGA) Could not create socket!", EXIT_FAILURE);
   
   memset (&i, 0, sizeof i);
 #ifndef USE_UNIX_DOMAIN_SOCKET
@@ -275,11 +233,8 @@ static int zebra_connect (void) {
 #endif
 
   ret = connect (zebra.sock, (struct sockaddr *)&i, sizeof i);
-  if  (ret < 0) {
-    close (zebra.sock);
-  }
+  if  (ret < 0) zebra.status &= ~STATUS_CONNECTED;
   else zebra.status |= STATUS_CONNECTED;
-  return zebra.sock;
 }
 
     
@@ -297,10 +252,11 @@ 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
 #endif
-  
+  char *pnt = p;
   int ret;
   
   uint16_t len = htons(length);
+
   memcpy (p, &len, 2);
 
 #ifdef ZEBRA_HEADER_MARKER
@@ -324,13 +280,15 @@ char zebra_send_command (unsigned char command, char * options, int optlen) {
        continue;
       }
       else {
+       olsr_printf (1, "(QUAGGA) Disconnected from zebra\n");
        zebra.status &= ~STATUS_CONNECTED;
+       free (pnt);
        return -1;
       }
     }
     p = p+ret;
   } while ((length -= ret));
-
+  free (pnt);
   return 0;
 }
 
@@ -440,16 +398,16 @@ void zebra_check (void* foo) {
   ssize_t len, ret;
 
   if (!(zebra.status & STATUS_CONNECTED)) {
-    if (!zebra_reconnect()) return;
+    zebra_reconnect();
+    return;
   }
   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);
+      if (!ret) { // something wired happened
+       olsr_exit ("(QUAGGA) Zero message length??? ", EXIT_FAILURE);
       }
       f += ret;
     } while ((f - data) < len);
@@ -461,7 +419,7 @@ void zebra_check (void* foo) {
 // 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;
+  unsigned char *buf = NULL;
   ssize_t ret = 0, bsize = 0;
   uint16_t length = 0, l = 0;
   int sockstate;
@@ -477,22 +435,16 @@ static char *try_read (ssize_t *len) {
       buf = my_realloc (buf, bsize, "Zebra try_read");
     }
     ret = read (zebra.sock, buf + l, bsize - l);
-    if (ret <= 0) {
-      if (errno == EAGAIN) {
-       errno = 0;
-      }
-      else {
-       olsr_printf(1, "OOPS, something realy wired happened:"
-                   "read returned %s\n", strerror(errno));
-       errno = 0;
-       zebra.status &= ~STATUS_CONNECTED;
-       return 0;
-      }
+    if (!ret) { // nothing more to read, packet is broken, discard!
       free (buf);
       return NULL;
     }
-    *len += ret;
+    if (ret < 0 && errno != EAGAIN) { // oops - we got disconnected
+      olsr_printf (1, "(QUAGGA) Disconnected from zebra\n");
+      zebra.status &= ~STATUS_CONNECTED;
+    }
 
+    *len += ret;
     while ((*len - l) > length) {
       l += length;
       memcpy (&length, buf + l, 2);
@@ -511,10 +463,13 @@ static char *try_read (ssize_t *len) {
 
 
 /* Parse a packet recived from zebra */
-int zebra_parse_packet (char *packet, ssize_t maxlen) {
+int zebra_parse_packet (unsigned char *packet, ssize_t maxlen) {
+
+  uint16_t command;
+  int skip;
 
   /* Array of functions */
-  int (*foo[ZEBRA_MESSAGE_MAX]) (char *, size_t) = {
+  int (*foo[ZEBRA_MESSAGE_MAX]) (unsigned char *, size_t) = {
     parse_interface_add,
     parse_interface_delete,
     parse_interface_address_add,
@@ -526,67 +481,79 @@ int zebra_parse_packet (char *packet, ssize_t maxlen) {
     parse_ipv6_route_add
   };
 
+  uint16_t length;
+  int ret;
+
 #ifdef MY_DEBUG
   puts ("DEBUG: zebra_parse_packet");
 #endif
-  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;
+    olsr_printf (1, "(QUAGGA) maxlen = %d, packet_length = %d\n", maxlen, length);
+    olsr_exit ("(QUAGGA) programmer is an idiot", EXIT_FAILURE);
   }
 
-  if (packet[2] - 1 < ZEBRA_MESSAGE_MAX && foo[packet[2] - 1]) { 
-    if (!(ret = foo[packet[2] - 1] (packet + 3, length - 3))) 
+#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); 
+    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 printf ("DEBUG: Parse error: %d\n", ret);
+    else olsr_printf (1, "(QUAGGA) Parse error: %d\n", ret);
   }
   else
-    printf ("Unknown packet type: %d\n", packet[2]);
+    olsr_printf (1, "(QUAGGA) Unknown packet type: %d\n", packet[2]);
 
-  puts ("Quagga: RECIVED PACKET FROM ZEBRA THAT I CAN'T PARSE");
+  olsr_printf (1, "(Quagga) RECIVED PACKET FROM ZEBRA THAT I CAN'T PARSE");
 
   return length;
 }
 
 
-static int parse_interface_add (char *opt, size_t len) {
+static int parse_interface_add (unsigned char *opt, size_t len) {
   //todo
   return 0;
 }
 
 
-static int parse_interface_delete (char *opt, size_t len) {
+static int parse_interface_delete (unsigned char *opt, size_t len) {
   //todo
   return 0;
 }
 
 
-static int parse_interface_address_add (char *opt, size_t len) {
+static int parse_interface_address_add (unsigned char *opt, size_t len) {
   
   //todo
   return 0;
 }
 
-static int parse_interface_up (char *opt, size_t len) {
+static int parse_interface_up (unsigned char *opt, size_t len) {
   
   //todo
   return 0;
 }
 
-static int parse_interface_down (char *opt, size_t len) {
+static int parse_interface_down (unsigned char *opt, size_t len) {
   
   //todo
   return 0;
 }
 
 
-static int parse_interface_address_delete (char *opt, size_t  len) {
+static int parse_interface_address_delete (unsigned char *opt, size_t  len) {
   //todo
   return 0;
 }
@@ -594,7 +561,7 @@ static int parse_interface_address_delete (char *opt, size_t  len) {
 
 /* Parse an ipv4-route-packet recived from zebra
  */
-static int parse_ipv4_route (char *opt, size_t len, struct ipv4_route *r) {
+static int parse_ipv4_route (unsigned char *opt, size_t len, struct ipv4_route *r) {
   int c;
 
   if (len < 4) return -1;
@@ -653,22 +620,18 @@ static int parse_ipv4_route (char *opt, size_t len, struct ipv4_route *r) {
 }
 
 
-static int ipv4_route_add (char *opt, size_t len) {
+static int ipv4_route_add (unsigned char *opt, size_t len) {
 
   struct ipv4_route r;
   int f;
     
   f = parse_ipv4_route (opt, len, &r);
-  if (f < 0) {
-    printf ("parse-error: %d\n",f);
-    return f;
-  }
-  
-  add_hna4_route (r);
-  return 0;
+  if (f < 0) return f;
+
+  return add_hna4_route (r);
 }
 
-static int ipv4_route_delete (char *opt, size_t len) {
+static int ipv4_route_delete (unsigned char *opt, size_t len) {
   struct ipv4_route r;
   int f;
   
@@ -679,7 +642,7 @@ static int ipv4_route_delete (char *opt, size_t len) {
   
 }
 
-static int parse_ipv6_route_add (char *opt, size_t len) {
+static int parse_ipv6_route_add (unsigned char *opt, size_t len) {
   //todo
   return 0;
 }
@@ -810,7 +773,6 @@ int zebra_add_olsr_v4_route (struct rt_entry *r) {
     route.distance = zebra.distance;
   }
 
-  add_v4_route_status (route);
   retval = zebra_add_v4_route(route);
   free_ipv4_route (route);
   return retval;
@@ -855,7 +817,6 @@ int zebra_del_olsr_v4_route (struct rt_entry *r) {
     route.distance = zebra.distance;
   }
 
-  retval = zebra_delete_v4_route(route);
   del_v4_route_status(route);
   free_ipv4_route (route);
   return retval;
@@ -868,3 +829,10 @@ void zebra_olsr_distance (char dist) {
 void zebra_olsr_localpref (void) {
   zebra.flags &= ZEBRA_FLAG_SELECTED;
 }
+
+void zebra_export (char t) {
+  if (t)
+    zebra.options |= OPTION_EXPORT;
+  else
+    zebra.options &= ~OPTION_EXPORT;
+}
index 9eb8d25..4bbe383 100644 (file)
@@ -51,12 +51,13 @@ struct ipv4_route {
   struct ipv4_route *next;
 };
 
-int init_zebra (void);
+void init_zebra (void);
+void zebra_cleanup (void);
 char zebra_send_command (unsigned char, char *, int );
 int zebra_add_v4_route (struct ipv4_route r);
 int zebra_delete_v4_route (struct ipv4_route r);
 void zebra_check (void*);
-int zebra_parse_packet (char*, ssize_t);
+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);
@@ -64,5 +65,6 @@ int delete_hna4_route (struct ipv4_route);
 void *my_realloc (void *, size_t, const char*);
 int zebra_add_olsr_v4_route (struct rt_entry*);
 int zebra_del_olsr_v4_route (struct rt_entry*);
-void zebra_olsr_localpref(void);
-void zebra_olsr_distance(char);
+void zebra_olsr_localpref (void);
+void zebra_olsr_distance (char);
+void zebra_export_routes (unsigned char);