update in bmf due to new flags field in tc_edge_entry
authorErik Tromp <erik_tromp@hotmail.com>
Mon, 25 Feb 2008 19:20:49 +0000 (20:20 +0100)
committerErik Tromp <erik_tromp@hotmail.com>
Mon, 25 Feb 2008 19:20:49 +0000 (20:20 +0100)
lib/bmf/Makefile
lib/bmf/README_BMF.txt
lib/bmf/src/Bmf.h
lib/bmf/src/NetworkInterfaces.c
src/tc_set.c

index 8263408..a169745 100644 (file)
@@ -34,7 +34,7 @@
 
 OLSRD_PLUGIN = true
 PLUGIN_NAME =  olsrd_bmf
-PLUGIN_VER =   1.5.2
+PLUGIN_VER =   1.5.3
 
 TOPDIR = ../..
 include $(TOPDIR)/Makefile.inc
index b2c3fb7..f7735ad 100644 (file)
@@ -1,6 +1,6 @@
 BASIC MULTICAST FORWARDING PLUGIN FOR OLSRD
 by Erik Tromp (erik.tromp@nl.thalesgroup.com, erik_tromp@hotmail.com)
-Version 1.5.2
+Version 1.5.3
 
 1. Introduction
 ---------------
@@ -17,14 +17,14 @@ in the past 3-6 seconds are forwarded.
 2. How to build and install
 ---------------------------
 
-Download the olsr-bmf-v1.5.2.tar.gz file and save it into your OLSRD
+Download the olsr-bmf-v1.5.3.tar.gz file and save it into your OLSRD
 base install directory.
 
 Change directory (cd) to your OLSRD base install directory.
 
 At the command prompt, type:
 
-  tar -zxvf ./olsr-bmf-v1.5.2.tar.gz
+  tar -zxvf ./olsr-bmf-v1.5.3.tar.gz
 
 then type:
 
@@ -47,7 +47,7 @@ Set permissions, e.g.:
 To configure BMF in OLSR, you must edit the file /etc/olsrd.conf
 to load the BMF plugin. For example, add the following lines:
 
-  LoadPlugin "olsrd_bmf.so.1.5.2"
+  LoadPlugin "olsrd_bmf.so.1.5.3"
   {
     # No PlParam entries required for basic operation
   }
@@ -63,19 +63,18 @@ olsrd daemon by entering at the shell prompt:
 
 Look at the output; it should list the BMF plugin, e.g.:
 
-  ---------- Plugin loader ----------
-  Library: olsrd_bmf.so.1.5.2
-  OLSRD Basic Multicast Forwarding plugin 1.5.2 (Dec  7 2007 09:08:19)
+  ---------- LOADING LIBRARY olsrd_bmf.so.1.5.3 ----------
+  OLSRD Basic Multicast Forwarding (BMF) plugin 1.5.3 (Feb 24 2008 17:58:02)
     (C) Thales Communications Huizen, Netherlands
-    Erik Tromp (erik.tromp@nl.thalesgroup.com)
-  Checking plugin interface version...  4 - OK
-  Trying to fetch plugin init function... OK
-  Trying to fetch param function... OK
+    Erik Tromp (eriktromp@users.sourceforge.net)
+  Checking plugin interface version:  5 - OK
+  Trying to fetch plugin init function: OK
+  Trying to fetch parameter table and it's size...
   Sending parameters...
-  "NonOlsrIf"/"eth0"... OK
+  "NonOlsrIf"/"eth0"... NonOlsrIf: OK
   Running plugin_init function...
-  OLSRD Basic Multicast Forwarding (BMF) plugin: opened 6 sockets
-  ---------- LIBRARY LOADED ----------
+  OLSRD Basic Multicast Forwarding (BMF) plugin: opened 5 sockets
+  ---------- LIBRARY olsrd_bmf.so.1.5.3 LOADED ----------
 
 
 4. How to check if it works
@@ -190,7 +189,7 @@ the /etc/olsrd.conf file.
 The following gives an overview of all plugin parameters that can be
 configured:
 
-  LoadPlugin "olsrd_bmf.so.1.5.2"
+  LoadPlugin "olsrd_bmf.so.1.5.3"
   {
     # Specify the name of the BMF network interface.
     # Defaults to "bmf0".
@@ -344,7 +343,7 @@ want to forward multicast and local-broadcast IP packets, specify these
 interfaces one by one as "NonOlsrIf" parameters in the BMF plugin section
 of /etc/olsrd.conf. For example:
 
-  LoadPlugin "olsrd_bmf.so.1.5.2"
+  LoadPlugin "olsrd_bmf.so.1.5.3"
   {
     # Non-OLSR interfaces to participate in the multicast flooding
     PlParam     "NonOlsrIf"  "eth2"
@@ -402,7 +401,7 @@ Therefore, override the default IP address and prefix length of
 the BMF network interface, by editing the /etc/olsrd.conf file.
 For example:
 
-  LoadPlugin "olsrd_bmf.so.1.5.2"
+  LoadPlugin "olsrd_bmf.so.1.5.3"
   {
       PlParam "BmfInterfaceIp" "10.10.10.4/24"
   }
@@ -540,6 +539,13 @@ the BMF network interface, either by specifying the interface name itself
 10. Version history
 -------------------
 
+24 February 2008: Version 1.5.3
+
+* Fixed a bug so that dying or dead end edges are not taken into account.
+  As of OLSRd version 0.5.4 , stale TC entries are not cleaned up, but
+  marked with a flag OLSR_TC_EDGE_DOWN. This flag was not taken into account
+  by BMF.
+
 7 December 2007: Version 1.5.2
 
 * Fixed a bug that would cause BMF to always send encapsulated broadcast
index 69136be..42a1680 100644 (file)
@@ -45,7 +45,7 @@
 /* BMF plugin data */
 #define PLUGIN_NAME "OLSRD Basic Multicast Forwarding (BMF) plugin"
 #define PLUGIN_NAME_SHORT "OLSRD BMF"
-#define PLUGIN_VERSION "1.5.2 (" __DATE__ " " __TIME__ ")"
+#define PLUGIN_VERSION "1.5.3 (" __DATE__ " " __TIME__ ")"
 #define PLUGIN_COPYRIGHT "  (C) Thales Communications Huizen, Netherlands"
 #define PLUGIN_AUTHOR "  Erik Tromp (eriktromp@users.sourceforge.net)"
 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION "\n" PLUGIN_COPYRIGHT "\n" PLUGIN_AUTHOR
index 0969cbf..4daf2a8 100644 (file)
@@ -62,7 +62,7 @@
 #include "defs.h" /* olsr_cnf */
 #include "link_set.h" /* get_link_set() */
 #include "lq_route.h" /* MIN_LINK_QUALITY */
-#include "tc_set.h" /* olsr_lookup_tc_entry(), olsr_tc_lookup_dst() */
+#include "tc_set.h" /* olsr_lookup_tc_entry(), olsr_lookup_tc_edge() */
 #include "net_olsr.h" /* ipequal */
 
 /* Plugin includes */
@@ -575,6 +575,9 @@ void FindNeighbors(
     /* TODO: get_link_set() is not thread-safe! */
     for (walker = get_link_set(); walker != NULL; walker = walker->next) 
     {
+#ifndef NODEBUG
+      struct ipaddr_str buf;
+#endif
       union olsr_ip_addr* neighborMainIp;
       struct link_entry* bestLinkToNeighbor;
       struct tc_entry* tcLastHop;
@@ -590,7 +593,7 @@ void FindNeighbors(
         "%s: ----> Considering forwarding pkt on \"%s\" to %s\n",
         PLUGIN_NAME_SHORT,
         intf->ifName,
-        olsr_ip_to_string(&walker->neighbor_iface_addr));
+        olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
 
       neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr);
 
@@ -602,7 +605,7 @@ void FindNeighbors(
           9,
           "%s: ----> Not forwarding to %s: is source of pkt\n",
           PLUGIN_NAME_SHORT,
-          olsr_ip_to_string(&walker->neighbor_iface_addr));
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
 
         continue; /* for */
       }
@@ -614,7 +617,7 @@ void FindNeighbors(
           9,
           "%s: ----> Not forwarding to %s: is the node that forwarded the pkt\n",
           PLUGIN_NAME_SHORT,
-          olsr_ip_to_string(&walker->neighbor_iface_addr));
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
 
         continue; /* for */
       }
@@ -626,7 +629,7 @@ void FindNeighbors(
           9,
           "%s: ----> Not forwarding to %s: is the node to which the pkt was forwarded\n",
           PLUGIN_NAME_SHORT,
-          olsr_ip_to_string(&walker->neighbor_iface_addr));
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
 
         continue; /* for */
       }
@@ -639,7 +642,7 @@ void FindNeighbors(
           9,
           "%s: ----> Not forwarding to %s: link is timing out\n",
           PLUGIN_NAME_SHORT,
-          olsr_ip_to_string(&walker->neighbor_iface_addr));
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
 
         continue; /* for */
       }
@@ -649,7 +652,7 @@ void FindNeighbors(
         9,
         "%s: ----> Forwarding pkt to %s will cost %5.2f\n",
         PLUGIN_NAME_SHORT,
-        olsr_ip_to_string(&walker->neighbor_iface_addr),
+        olsr_ip_to_string(&buf, &walker->neighbor_iface_addr),
         walker->link_cost);
 
       /* If the candidate neighbor is best reached via another interface, then skip 
@@ -666,7 +669,7 @@ void FindNeighbors(
             9,
             "%s: ----> Not forwarding to %s: no link found\n",
             PLUGIN_NAME_SHORT,
-            olsr_ip_to_string(&walker->neighbor_iface_addr));
+            olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
         }
         else
         {
@@ -676,7 +679,7 @@ void FindNeighbors(
             9,
             "%s: ----> Not forwarding to %s: \"%s\" gives a better link to this neighbor, costing %5.2f\n",
             PLUGIN_NAME_SHORT,
-            olsr_ip_to_string(&walker->neighbor_iface_addr),
+            olsr_ip_to_string(&buf, &walker->neighbor_iface_addr),
             bestIntf->int_name,
             bestLinkToNeighbor->link_cost);
         }
@@ -686,12 +689,15 @@ void FindNeighbors(
 
       if (forwardedBy != NULL)
       {
+#ifndef NODEBUG
+        struct ipaddr_str forwardedByBuf, niaBuf;
+#endif
         OLSR_PRINTF(
           9,
           "%s: ----> 2-hop path from %s via me to %s will cost %5.2f\n",
           PLUGIN_NAME_SHORT,
-          olsr_ip_to_string(forwardedBy),
-          olsr_ip_to_string(&walker->neighbor_iface_addr),
+          olsr_ip_to_string(&forwardedByBuf, forwardedBy),
+          olsr_ip_to_string(&niaBuf, &walker->neighbor_iface_addr),
           previousLinkCost + walker->link_cost);
       }
 
@@ -705,24 +711,31 @@ void FindNeighbors(
         tcLastHop = olsr_lookup_tc_entry(MainAddressOf(forwardedBy));
         if (tcLastHop != NULL)
         {
-          struct topo_dst* tcDest;
-
-          /* TODO: olsr_tc_lookup_dst() is not thread-safe. */
-          tcDest = olsr_tc_lookup_dst(tcLastHop, MainAddressOf(&walker->neighbor_iface_addr));
+          struct tc_edge_entry* tc_edge;
 
-          /* Rely on short-circuit boolean evaluation */
-          if (tcDest != NULL && previousLinkCost + walker->link_cost > tcDest->link_cost)
+          /* TODO: olsr_lookup_tc_edge() is not thread-safe. */
+          tc_edge = olsr_lookup_tc_edge(tcLastHop, MainAddressOf(&walker->neighbor_iface_addr));
+          
+          /* We are not interested in dead-end or dying edges. */
+          if (tc_edge != NULL && (tc_edge->flags & OLSR_TC_EDGE_DOWN) == 0)
           {
-            OLSR_PRINTF(
-              9,
-              "%s: ----> Not forwarding to %s: I am not an MPR between %s and %s, direct link costs %5.2f\n",
-              PLUGIN_NAME_SHORT,
-              olsr_ip_to_string(&walker->neighbor_iface_addr),
-              olsr_ip_to_string(forwardedBy),
-              olsr_ip_to_string(&walker->neighbor_iface_addr),
-              tcDest->link_cost);
-
-            continue; /* for */
+            if (previousLinkCost + walker->link_cost > tc_edge->link_cost)
+            {
+#ifndef NODEBUG
+              struct ipaddr_str neighbor_iface_buf, forw_buf;
+              olsr_ip_to_string(&neighbor_iface_buf, &walker->neighbor_iface_addr);
+#endif
+              OLSR_PRINTF(
+                9,
+                "%s: ----> Not forwarding to %s: I am not an MPR between %s and %s, direct link costs %5.2f\n",
+                PLUGIN_NAME_SHORT,
+                neighbor_iface_buf.buf,
+                olsr_ip_to_string(&forw_buf, forwardedBy),
+                neighbor_iface_buf.buf,
+                tc_edge->link_cost);
+
+              continue; /* for */
+            } /* if */
           } /* if */
         } /* if */
       } /* if */
@@ -913,7 +926,7 @@ void FindNeighbors(
               bestLinkToNeighbor->neigh_link_quality));
 #endif
         }
-        
+
         continue; /* for */
       }
 
@@ -946,7 +959,8 @@ void FindNeighbors(
           /* TODO: olsr_lookup_tc_edge() is not thread-safe. */
           tc_edge = olsr_lookup_tc_edge(tcLastHop, MainAddressOf(&walker->neighbor_iface_addr));
 
-          if (tc_edge != NULL)
+          /* We are not interested in dead-end or dying edges. */
+          if (tc_edge != NULL && (tc_edge->flags & OLSR_TC_EDGE_DOWN) == 0)
           {
             float tcEtx = CalcEtx(
 #ifdef USE_FPM
@@ -1530,9 +1544,9 @@ static int CreateInterface(
       BmfPError("ioctl(SIOCGIFADDR) error for interface \"%s\"", ifName);
 
       newIf->intAddr.v4.s_addr = inet_addr("0.0.0.0");
-         }
-         else
-         {
+    }
+    else
+    {
       /* Downcast to correct sockaddr subtype */
       newIf->intAddr.v4 = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
     }
@@ -1546,9 +1560,9 @@ static int CreateInterface(
       BmfPError("ioctl(SIOCGIFBRDADDR) error for interface \"%s\"", ifName);
 
       newIf->broadAddr.v4.s_addr = inet_addr("0.0.0.0");
-         }
-         else
-         {
+    }
+    else
+    {
       /* Downcast to correct sockaddr subtype */
       newIf->broadAddr.v4 = ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr;
     }
index ac53584..5e0ed89 100644 (file)
@@ -753,20 +753,21 @@ olsr_print_tc_table(void)
 
   OLSR_PRINTF(1,
               "\n--- %02d:%02d:%02d.%02d ------------------------------------------------- TOPOLOGY\n\n"
-              "%-*s %-*s %-5s  %-5s  %s\n",
+              "%-*s %-*s %-5s  %-5s  %s  %s\n",
               nowtm->tm_hour, nowtm->tm_min, nowtm->tm_sec, (int)now.tv_usec / 10000,
-              ipwidth, "Source IP addr", ipwidth, "Dest IP addr", "LQ", "ILQ", "ETX");
+              ipwidth, "Source IP addr", ipwidth, "Dest IP addr", "LQ", "ILQ", "ETX", "UP");
 
   OLSR_FOR_ALL_TC_ENTRIES(tc) {
     struct tc_edge_entry *tc_edge;
     OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) {
       struct ipaddr_str addrbuf, dstaddrbuf;
-      OLSR_PRINTF(1, "%-*s %-*s  %s  %s  %s\n",
+      OLSR_PRINTF(1, "%-*s %-*s  %s  %s  %s  %s\n",
                   ipwidth, olsr_ip_to_string(&addrbuf, &tc->addr),
                   ipwidth, olsr_ip_to_string(&dstaddrbuf, &tc_edge->T_dest_addr),
                   olsr_etx_to_string(tc_edge->link_quality),
                   olsr_etx_to_string(tc_edge->inverse_link_quality),
-                  olsr_etx_to_string(olsr_calc_tc_etx(tc_edge)));
+                  olsr_etx_to_string(olsr_calc_tc_etx(tc_edge)),
+                  tc_edge->flags & OLSR_TC_EDGE_DOWN ? "DOWN" : "UP");
     } OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge);
   } OLSR_FOR_ALL_TC_ENTRIES_END(tc);
 #endif