* updated bmf plugin to 1.5.1
authorBernd Petrovitsch <bernd@firmix.at>
Tue, 11 Sep 2007 23:08:20 +0000 (23:08 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Tue, 11 Sep 2007 23:08:20 +0000 (23:08 +0000)
13 files changed:
CHANGELOG
lib/bmf/README_BMF.txt
lib/bmf/src/Address.c
lib/bmf/src/Address.h
lib/bmf/src/Bmf.c
lib/bmf/src/Bmf.h
lib/bmf/src/DropList.c [deleted file]
lib/bmf/src/DropList.h [deleted file]
lib/bmf/src/NetworkInterfaces.c
lib/bmf/src/NetworkInterfaces.h
lib/bmf/src/Packet.h
lib/bmf/src/olsrd_plugin.c
lib/bmf/version-script.txt

index 93de748..83790be 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,10 +1,13 @@
 This file states changes as of version 0.2.4:
-$Id: CHANGELOG,v 1.82 2007/09/07 09:07:25 bernd67 Exp $
+$Id: CHANGELOG,v 1.83 2007/09/11 23:08:19 bernd67 Exp $
 
 0.5.4 ---------------------------------------------------------------------
 
-QUAGGA
-updated to svn version 33
+QUAGGA by Immo 'FaUl' Wehrenberg <immo.olsr@do.bundessicherheitsministerium.de>
+- updated to svn version 33
+
+BMF PLUGIN by Erik Tromp <erik_tromp@hotmail.com>
+- updated to 1.5.1
 
 PATCH by Hannes Gredler <hannes@gredler.at> which rewrites the route handling.
 To quote him:
index d3ca257..e49bd0e 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
+Version 1.5.1
 
 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.tar.gz file and save it into your OLSRD
+Download the olsr-bmf-v1.5.1.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.tar.gz
+  tar -zxvf ./olsr-bmf-v1.5.1.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"
+  LoadPlugin "olsrd_bmf.so.1.5.1"
   {
     # No PlParam entries required for basic operation
   }
@@ -64,8 +64,8 @@ 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
-  OLSRD Basic Multicast Forwarding plugin 1.5 (May 16 2007 14:30:57)
+  Library: olsrd_bmf.so.1.5.1
+  OLSRD Basic Multicast Forwarding plugin 1.5.1 (Sep  4 2007 11:13:43)
     (C) Thales Communications Huizen, Netherlands
     Erik Tromp (erik.tromp@nl.thalesgroup.com)
   Checking plugin interface version...  4 - OK
@@ -190,7 +190,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"
+  LoadPlugin "olsrd_bmf.so.1.5.1"
   {
     # Specify the name of the BMF network interface.
     # Defaults to "bmf0".
@@ -331,7 +331,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"
+  LoadPlugin "olsrd_bmf.so.1.5.1"
   {
     # Non-OLSR interfaces to participate in the multicast flooding
     PlParam     "NonOlsrIf"  "eth2"
@@ -389,7 +389,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"
+  LoadPlugin "olsrd_bmf.so.1.5.1"
   {
       PlParam "BmfInterfaceIp" "10.10.10.4/24"
   }
@@ -525,6 +525,15 @@ the BMF network interface, either by specifying the interface name itself
 10. Version history
 -------------------
 
+3 September 2007: Version 1.5.1
+
+* Fixed a bug that would cause BMF to crash (and OLSR with it) if a link
+  was timing out --> thanks to Frank Renwick
+* Fixed bug in the checking of the packet length --> thanks to Frank Renwick
+* Fixed a bug in shutdown, which cause a crash if the BMF thread was not
+  yet running --> thanks to Bernd Petrovitsch
+* Updated to OLSR plugin interface version 5.
+
 16 May 2007: Version 1.5
 
 * Improved packet history list to take into account the full 32 bits
index 1fe0f44..6d2d708 100644 (file)
@@ -62,25 +62,26 @@ int EnableLocalBroadcast = 1;
  * Description: Overrule the default setting, enabling or disabling the
  *              flooding of local broadcast packets
  * Input      : enable - either "yes" or "no"
+ *              data - not used
  * Output     : none
- * Return     : fail (0) or success (1)
+ * Return     : success (0) or fail (1)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int DoLocalBroadcast(const char* enable)
+int DoLocalBroadcast(const char* enable, void* data)
 {
   if (strcmp(enable, "yes") == 0)
   {
     EnableLocalBroadcast = 1;
-    return 1;
+    return 0;
   }
   else if (strcmp(enable, "no") == 0)
   {
     EnableLocalBroadcast = 0;
-    return 1;
+    return 0;
   }
 
   /* Value not recognized */
-  return 0;
+  return 1;
 }
 
 /* -------------------------------------------------------------------------
index 1642283..c258391 100644 (file)
@@ -47,7 +47,7 @@ struct TBmfInterface;
 
 extern int EnableLocalBroadcast;
 
-int DoLocalBroadcast(const char* enable);
+int DoLocalBroadcast(const char* enable, void* data);
 int IsMulticast(union olsr_ip_addr* ipAddress);
 int IsOlsrOrBmfPacket(unsigned char* ipPacket);
 
index 5110230..f2d08e5 100644 (file)
 #include "mpr_selector_set.h" /* olsr_lookup_mprs_set() */
 #include "link_set.h" /* get_best_link_to_neighbor() */
 
-/* Plugin includes */
+/* BMF includes */
 #include "NetworkInterfaces.h" /* TBmfInterface, CreateBmfNetworkInterfaces(), CloseBmfNetworkInterfaces() */
 #include "Address.h" /* IsMulticast() */
-#include "Packet.h" /* ETH_TYPE_OFFSET, IFHWADDRLEN etc. */
+#include "Packet.h" /* ENCAP_HDR_LEN, BMF_ENCAP_TYPE, BMF_ENCAP_LEN etc. */
 #include "PacketHistory.h" /* InitPacketHistory() */
 
 static pthread_t BmfThread;
@@ -158,7 +158,7 @@ static void EncapsulateAndForwardPacket(
   int i;
 
   /* Retrieve at most two best neigbors to forward the packet to */
-  bestNeighborLinks = GetBestTwoNeighbors(intf, NULL, NULL, NULL, &nPossibleNeighbors);
+  GetBestTwoNeighbors(&bestNeighborLinks, intf, NULL, NULL, NULL, &nPossibleNeighbors);
 
   if (nPossibleNeighbors <= 0)
   {
@@ -759,13 +759,13 @@ static void BmfEncapsulationPacketReceived(
       int i;
 
       /* Retrieve at most two best neigbors to forward the packet to */
-      bestNeighborLinks =
-        GetBestTwoNeighbors(
-          walker,
-          &mcSrc,
-          forwardedBy,
-          forwardedTo,
-          &nPossibleNeighbors);
+      GetBestTwoNeighbors(
+        &bestNeighborLinks,
+        walker,
+        &mcSrc,
+        forwardedBy,
+        forwardedTo,
+        &nPossibleNeighbors);
 
       if (nPossibleNeighbors <= 0)
       {
@@ -1152,7 +1152,6 @@ static void DoBmf(void)
          * - the IP header of the encapsulation IP packet
          * - the UDP header of the encapsulation IP packet
          * - the encapsulation header
-         * - the Ethernet header in the encapsulated Ethernet packet
          * - a minimum IP header inside the encapsulated packet
          * Note: on a VLAN interface, the value returned by 'recvfrom' may (but need
          * not) be 4 (bytes) larger than the value returned on a non-VLAN interface, for
@@ -1161,7 +1160,6 @@ static void DoBmf(void)
           GetIpHeaderLength(rxBuffer) +
           sizeof(struct udphdr) +
           ENCAP_HDR_LEN +
-          IP_HDR_OFFSET +
           sizeof(struct ip);
         if (nBytes < minimumLength)
         {
@@ -1196,6 +1194,7 @@ static void DoBmf(void)
         struct sockaddr_in from;
         socklen_t fromLen = sizeof(from);
         int nBytes;
+        int minimumLength;
         union olsr_ip_addr forwardedBy;
 
         /* An encapsulated packet was received */
@@ -1221,9 +1220,11 @@ static void DoBmf(void)
         /* Check if the number of received bytes is large enough for a minimal BMF
          * encapsulation packet, at least:
          * - the encapsulation header
-         * - the Ethernet header in the encapsulated Ethernet packet
          * - a minimum IP header inside the encapsulated packet */
-        if (nBytes < ENCAP_HDR_LEN + IP_HDR_OFFSET + (int)sizeof(struct ip))
+        minimumLength =
+          ENCAP_HDR_LEN +
+          sizeof(struct ip);
+        if (nBytes < minimumLength)
         {
           olsr_printf(
             1,
@@ -1473,43 +1474,3 @@ void CloseBmf(void)
   CloseBmfNetworkInterfaces();
 } /* CloseBmf */
 
-/* -------------------------------------------------------------------------
- * Function   : RegisterBmfParameter
- * Description: Register a configuration parameter with the BMF process
- * Input      : key - the parameter name, e.g. "DropMac" or "NonOlsrIf"
- *              value - the parameter value
- * Output     : none
- * Return     : fatal error (<0), minor error (0) or success (>0)
- * Data Used  : none
- * ------------------------------------------------------------------------- */
-int RegisterBmfParameter(char* key, char* value)
-{
-  if (strcmp(key, "NonOlsrIf") == 0)
-  {
-    return AddNonOlsrBmfIf(value);
-  }
-  else if (strcmp(key, "DoLocalBroadcast") == 0)
-  {
-    return DoLocalBroadcast(value);
-  }
-  else if (strcmp(key, "BmfInterface") == 0)
-  {
-    return SetBmfInterfaceName(value);
-  }
-  else if (strcmp(key, "BmfInterfaceIp") == 0)
-  {
-    return SetBmfInterfaceIp(value);
-  }
-  else if (strcmp(key, "CapturePacketsOnOlsrInterfaces") == 0)
-  {
-    return SetCapturePacketsOnOlsrInterfaces(value);
-  }
-  else if (strcmp(key, "BmfMechanism") == 0)
-  {
-    return SetBmfMechanism(value);
-  }
-
-  /* Key not recognized */
-  return 0;
-} /* RegisterBmfParameter */
-
index bf8749e..f2e549b 100644 (file)
 /* BMF plugin data */
 #define PLUGIN_NAME "OLSRD Basic Multicast Forwarding (BMF) plugin"
 #define PLUGIN_NAME_SHORT "OLSRD BMF"
-#define PLUGIN_VERSION "1.5 (" __DATE__ " " __TIME__ ")"
+#define PLUGIN_VERSION "1.5.1 (" __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
+#define PLUGIN_INTERFACE_VERSION 5
 
 /* UDP-Port on which multicast packets are encapsulated */
 #define BMF_ENCAP_PORT 50698
diff --git a/lib/bmf/src/DropList.c b/lib/bmf/src/DropList.c
deleted file mode 100644 (file)
index f661e5f..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * OLSR Basic Multicast Forwarding (BMF) plugin.
- * Copyright (c) 2005, 2006, Thales Communications, Huizen, The Netherlands.
- * Written by Erik Tromp.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions 
- * are met:
- *
- * * Redistributions of source code must retain the above copyright 
- *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright 
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the 
- *   distribution.
- * * Neither the name of Thales, BMF nor the names of its 
- *   contributors may be used to endorse or promote products derived 
- *   from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
- * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* -------------------------------------------------------------------------
- * File       : DropList.c
- * Description: List of MAC addresses of hosts from which received multicast
- *              and local broadcast packets are dropped.
- * Created    : 29 Jun 2006
- *
- * ------------------------------------------------------------------------- */
-
-
-#include "DropList.h"
-
-/* System includes */
-#include <assert.h> /* assert() */
-#include <stddef.h> /* NULL */
-#include <stdio.h> /* sscanf */
-#include <stdlib.h> /* malloc */
-#include <string.h> /* memcmp */
-
-/* OLSRD includes */
-#include "olsr.h" /* olsr_printf */
-
-/* Plugin includes */
-#include "Bmf.h" /* PLUGIN_NAME */
-#include "Packet.h" /* IFHWADDRLEN */
-
-static struct TMacAddress* DroppedMacAddresses = NULL;
-
-/* -------------------------------------------------------------------------
- * Function   : DropMac
- * Description: Register a MAC address in the drop list
- * Input      : macStr - MAC address as string
- * Output     : none
- * Return     : fail (0) or success (1)
- * Data Used  : DroppedMacAddresses
- * Notes      : The registered MAC address will be matched to the source MAC 
- *              address of incoming multicast packets. If matched, the multicast 
- *              packet will be dropped. 
- *              The drop list is needed only in lab environments, where hidden
- *              nodes are simulated by using iptables with the
- *              -m mac helper and --mac-source option (as in: 
- *              "iptables -A INPUT -m mac --mac-source 00:0C:29:EE:C9:D0 -j DROP") 
- *              The drop list is needed because network interfaces in promiscuous 
- *              mode will still capture packets even if they are specified to 
- *              be dropped by iptables.
- * ------------------------------------------------------------------------- */
-int DropMac(const char* macStr)
-{
-  unsigned int mac[6];
-  int n;
-  struct TMacAddress* newMacAddress;
-  int i;
-
-  assert(macStr != NULL);
-
-  n = sscanf(macStr, "%x:%x:%x:%x:%x:%x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
-  if (n != 6)
-  {
-    olsr_printf(1, "%s: Invalid Ethernet address '%s'\n", PLUGIN_NAME, macStr);
-    return 0;
-  }
-
-  newMacAddress = malloc(sizeof(struct TMacAddress));
-  for (i = 0; i < 6; i++)
-  {
-    newMacAddress->addr[i] = (unsigned char) mac[i];
-  }
-  newMacAddress->next = DroppedMacAddresses;
-  DroppedMacAddresses = newMacAddress;
-
-  return 1;
-}
-
-/* -------------------------------------------------------------------------
- * Function   : IsInDropList
- * Description: Check if a MAC address is in the drop list
- * Input      : macAddress
- * Output     : none
- * Return     : true (1) or false (0)
- * Data Used  : DroppedMacAddresses
- * ------------------------------------------------------------------------- */
-int IsInDropList(const unsigned char* macAddress)
-{
-  struct TMacAddress* ma = DroppedMacAddresses;
-
-  assert(macAddress != NULL);
-
-  while (ma != NULL)
-  {
-    if (memcmp(ma->addr, macAddress, IFHWADDRLEN) == 0) return 1;
-    ma = ma->next;
-  }
-  return 0;
-}
-
diff --git a/lib/bmf/src/DropList.h b/lib/bmf/src/DropList.h
deleted file mode 100644 (file)
index 1df5113..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef _BMF_DROPLIST_H
-#define _BMF_DROPLIST_H
-
-/*
- * OLSR Basic Multicast Forwarding (BMF) plugin.
- * Copyright (c) 2005, 2006, Thales Communications, Huizen, The Netherlands.
- * Written by Erik Tromp.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions 
- * are met:
- *
- * * Redistributions of source code must retain the above copyright 
- *   notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright 
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the 
- *   distribution.
- * * Neither the name of Thales, BMF nor the names of its 
- *   contributors may be used to endorse or promote products derived 
- *   from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
- * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* -------------------------------------------------------------------------
- * File       : DropList.h
- * Description: List of MAC addresses of hosts from which all packets are dropped.
- * Created    : 29 Jun 2006
- *
- * ------------------------------------------------------------------------- */
-
-struct TMacAddress
-{
-  unsigned char addr[6];
-  struct TMacAddress* next;
-};
-
-int DropMac(const char* macStr);
-int IsInDropList(const unsigned char* macAddress);
-
-#endif /* _BMF_DROPLIST_H */
index 055a635..bb41441 100644 (file)
@@ -121,15 +121,16 @@ int CapturePacketsOnOlsrInterfaces = 0;
  * Description: Overrule the default network interface name ("bmf0") of the
  *              EtherTunTap interface
  * Input      : ifname - network interface name (e.g. "mybmf0")
+ *              data - not used
  * Output     : none
- * Return     : fail (0) or success (1)
+ * Return     : success (0) or fail (1)
  * Data Used  : EtherTunTapIfName
  * ------------------------------------------------------------------------- */
-int SetBmfInterfaceName(const char* ifname)
+int SetBmfInterfaceName(const char* ifname, void* data)
 {
   strncpy(EtherTunTapIfName, ifname, IFNAMSIZ - 1);
   EtherTunTapIfName[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */
-  return 1;
+  return 0;
 } /* SetBmfInterfaceName */
 
 /* -------------------------------------------------------------------------
@@ -137,12 +138,13 @@ int SetBmfInterfaceName(const char* ifname)
  * Description: Overrule the default IP address and prefix length
  *              ("10.255.255.253/30") of the EtherTunTap interface
  * Input      : ip - IP address string, followed by '/' and prefix length
+ *              data - not used
  * Output     : none
- * Return     : fail (0) or success (1)
+ * Return     : success (0) or fail (1)
  * Data Used  : EtherTunTapIp, EtherTunTapIpMask, EtherTunTapIpBroadcast,
  *              TunTapIpOverruled
  * ------------------------------------------------------------------------- */
-int SetBmfInterfaceIp(const char* ip)
+int SetBmfInterfaceIp(const char* ip, void* data)
 {
 #define IPV4_MAX_ADDRLEN 16
 #define IPV4_MAX_PREFIXLEN 32
@@ -162,7 +164,7 @@ int SetBmfInterfaceIp(const char* ip)
   if (slashAt == NULL || slashAt - ip >= IPV4_MAX_ADDRLEN)
   {
     /* No prefix length specified, or IP address too long */
-    return 0;
+    return 1;
   }
 
   strncpy(ipAddr, ip, slashAt - ip);
@@ -170,7 +172,7 @@ int SetBmfInterfaceIp(const char* ip)
   if (inet_aton(ipAddr, &sinaddr) == 0)
   {
     /* Invalid address passed */
-    return 0;
+    return 1;
   }
 
   EtherTunTapIp = ntohl(sinaddr.s_addr);
@@ -179,8 +181,8 @@ int SetBmfInterfaceIp(const char* ip)
   prefixLen = atoi(++slashAt);
   if (prefixLen <= 0 || prefixLen > IPV4_MAX_PREFIXLEN)
   {
-         return 0;
-       }
+    return 1;
+  }
 
   /* Compose IP subnet mask in host byte order */
   EtherTunTapIpMask = 0;
@@ -198,7 +200,7 @@ int SetBmfInterfaceIp(const char* ip)
 
   TunTapIpOverruled = 1;
 
-  return 1;
+  return 0;
 } /* SetBmfInterfaceIp */
 
 /* -------------------------------------------------------------------------
@@ -206,25 +208,26 @@ int SetBmfInterfaceIp(const char* ip)
  * Description: Overrule the default setting, enabling or disabling the
  *              capturing of packets on OLSR-enabled interfaces.
  * Input      : enable - either "yes" or "no"
+ *              data - not used
  * Output     : none
- * Return     : fail (0) or success (1)
+ * Return     : success (0) or fail (1)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int SetCapturePacketsOnOlsrInterfaces(const char* enable)
+int SetCapturePacketsOnOlsrInterfaces(const char* enable, void* data)
 {
   if (strcmp(enable, "yes") == 0)
   {
     CapturePacketsOnOlsrInterfaces = 1;
-    return 1;
+    return 0;
   }
   else if (strcmp(enable, "no") == 0)
   {
     CapturePacketsOnOlsrInterfaces = 0;
-    return 1;
+    return 0;
   }
 
   /* Value not recognized */
-  return 0;
+  return 1;
 } /* SetCapturePacketsOnOlsrInterfaces */
 
 /* -------------------------------------------------------------------------
@@ -232,25 +235,26 @@ int SetCapturePacketsOnOlsrInterfaces(const char* enable)
  * Description: Overrule the default BMF mechanism to either BM_BROADCAST or
  *              BM_UNICAST_PROMISCUOUS.
  * Input      : mechanism - either "Broadcast" or "UnicastPromiscuous"
+ *              data - not used
  * Output     : none
- * Return     : fail (0) or success (1)
+ * Return     : success (0) or fail (1)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int SetBmfMechanism(const char* mechanism)
+int SetBmfMechanism(const char* mechanism, void* data)
 {
   if (strcmp(mechanism, "Broadcast") == 0)
   {
     BmfMechanism = BM_BROADCAST;
-    return 1;
+    return 0;
   }
   else if (strcmp(mechanism, "UnicastPromiscuous") == 0)
   {
     BmfMechanism = BM_UNICAST_PROMISCUOUS;
-    return 1;
+    return 0;
   }
 
   /* Value not recognized */
-  return 0;
+  return 1;
 } /* SetBmfMechanism */
 
 /* -------------------------------------------------------------------------
@@ -402,22 +406,22 @@ static float CalcEtx(float loss, float neigh_loss)
  *                packet
  *              forwardedTo - the IP address of the node to which the BMF packet
  *                was directed
- * Output     : nPossibleNeighbors - number of found possible neighbors
- * Return     : The list of the two best neighbors. If only one best neighbor is
- *              found, the second list entry is NULL. If no neigbors are found,
- *              the first and second list entries are both NULL.
+ * Output     : result - the list of the two best neighbors. If only one best
+ *                neighbor is found, the second list entry is NULL. If no neigbors
+ *                are found, the first and second list entries are both NULL.
+ *              nPossibleNeighbors - number of found possible neighbors
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-struct TBestNeighbors GetBestTwoNeighbors(
+void GetBestTwoNeighbors(
+  struct TBestNeighbors* result,
   struct TBmfInterface* intf,
   union olsr_ip_addr* source,
   union olsr_ip_addr* forwardedBy,
   union olsr_ip_addr* forwardedTo,
   int* nPossibleNeighbors)
 {
-  struct TBestNeighbors result;
-  result.links[0] = NULL;
-  result.links[1] = NULL;
+  result->links[0] = NULL;
+  result->links[1] = NULL;
 
   /* handle the non-LQ case */
 
@@ -489,13 +493,13 @@ struct TBestNeighbors GetBestTwoNeighbors(
 
       /* In the non-LQ case, it is not possible to select neigbors
        * by quality or cost. So just remember the first two found links. */
-      if (result.links[0] == NULL)
+      if (result->links[0] == NULL)
       {
-        result.links[0] = walker;
+        result->links[0] = walker;
       }
-      else if (result.links[1] == NULL)
+      else if (result->links[1] == NULL)
       {
-        result.links[1] = walker;
+        result->links[1] = walker;
       } /* if */
     } /* for */
 
@@ -506,9 +510,9 @@ struct TBestNeighbors GetBestTwoNeighbors(
 #ifdef USING_THALES_LINK_COST_ROUTING
 
     struct link_entry* walker;
-    float previousLinkCost = INFINITE_COST;
-    float bestLinkCost = INFINITE_COST;
-    float oneButBestLinkCost = INFINITE_COST;
+    float previousLinkCost = 2 * INFINITE_COST;
+    float bestLinkCost = 2 * INFINITE_COST;
+    float oneButBestLinkCost = 2 * INFINITE_COST;
     *nPossibleNeighbors = 0;
 
     if (forwardedBy != NULL)
@@ -582,6 +586,17 @@ struct TBestNeighbors GetBestTwoNeighbors(
 
       /* Found a candidate neighbor to direct our packet to */
 
+      if (walker->link_cost >= INFINITE_COST)
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: link is timing out\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&walker->neighbor_iface_addr));
+
+        continue; /* for */
+      }
+
       /* Compare costs to check if the candidate neighbor is best reached via 'intf' */
       OLSR_PRINTF(
         9,
@@ -670,13 +685,13 @@ struct TBestNeighbors GetBestTwoNeighbors(
       /* Remember the best two links. If all are very bad, remember none. */
       if (walker->link_cost < bestLinkCost)
       {
-        result.links[1] = result.links[0];
-        result.links[0] = walker;
+        result->links[1] = result->links[0];
+        result->links[0] = walker;
         bestLinkCost = walker->link_cost;
       }
       else if (walker->link_cost < oneButBestLinkCost)
       {
-        result.links[1] = walker;
+        result->links[1] = walker;
         oneButBestLinkCost = walker->link_cost;
       } /* if */
     } /* for */
@@ -684,9 +699,9 @@ struct TBestNeighbors GetBestTwoNeighbors(
 #else /* USING_THALES_LINK_COST_ROUTING */
         
     struct link_entry* walker;
-    float previousLinkEtx = INFINITE_ETX;
-    float bestEtx = INFINITE_ETX; 
-    float oneButBestEtx = INFINITE_ETX; 
+    float previousLinkEtx = 2 * INFINITE_ETX;
+    float bestEtx = 2 * INFINITE_ETX; 
+    float oneButBestEtx = 2 * INFINITE_ETX;
     *nPossibleNeighbors = 0;
 
     if (forwardedBy != NULL)
@@ -769,6 +784,17 @@ struct TBestNeighbors GetBestTwoNeighbors(
         walker->loss_link_quality,
         walker->neigh_link_quality);
  
+      if (currEtx >= INFINITE_ETX)
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: link is timing out\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&walker->neighbor_iface_addr));
+
+        continue; /* for */
+      }
+
       /* Compare costs to check if the candidate neighbor is best reached via 'intf' */
       OLSR_PRINTF(
         9,
@@ -865,13 +891,13 @@ struct TBestNeighbors GetBestTwoNeighbors(
       /* Remember the best two links. If all are very bad, remember none. */
       if (currEtx < bestEtx)
       {
-        result.links[1] = result.links[0];
-        result.links[0] = walker;
+        result->links[1] = result->links[0];
+        result->links[0] = walker;
         bestEtx = currEtx;
       }
       else if (currEtx < oneButBestEtx)
       {
-        result.links[1] = walker;
+        result->links[1] = walker;
         oneButBestEtx = currEtx;
       } /* if */
     } /* for */
@@ -881,7 +907,7 @@ struct TBestNeighbors GetBestTwoNeighbors(
   } /* if */
 
   /* Display the result of the neighbor search */
-  if (result.links[0] == NULL)
+  if (result->links[0] == NULL)
   {
     OLSR_PRINTF(
       9,
@@ -901,20 +927,19 @@ struct TBestNeighbors GetBestTwoNeighbors(
     OLSR_PRINTF(
       9,
       "%s",
-      olsr_ip_to_string(&result.links[0]->neighbor_iface_addr));
+      olsr_ip_to_string(&result->links[0]->neighbor_iface_addr));
 
-    if (result.links[1] != NULL)
+    if (result->links[1] != NULL)
     {
       OLSR_PRINTF(
         9,
         ", %s",
-        olsr_ip_to_string(&result.links[1]->neighbor_iface_addr));
+        olsr_ip_to_string(&result->links[1]->neighbor_iface_addr));
     } /* if */
 
     OLSR_PRINTF(9, "\n");
   } /* if */
 
-  return result;
 } /* GetBestTwoNeighbors */
 
 /* -------------------------------------------------------------------------
@@ -1734,11 +1759,12 @@ static int nNonOlsrIfs = 0;
  * Description: Add an non-OLSR enabled network interface to the list of BMF-enabled
  *              network interfaces
  * Input      : ifName - network interface (e.g. "eth0")
+ *              data - not used
  * Output     : none
- * Return     : fail (0) or success (1)
+ * Return     : success (0) or fail (1)
  * Data Used  : NonOlsrIfNames
  * ------------------------------------------------------------------------- */
-int AddNonOlsrBmfIf(const char* ifName)
+int AddNonOlsrBmfIf(const char* ifName, void* data)
 {
   assert(ifName != NULL);
 
@@ -1749,13 +1775,13 @@ int AddNonOlsrBmfIf(const char* ifName)
       "%s: too many non-OLSR interfaces specified, maximum is %d\n",
       PLUGIN_NAME,
       MAX_NON_OLSR_IFS);
-    return 0;
+    return 1;
   }
 
   strncpy(NonOlsrIfNames[nNonOlsrIfs], ifName, IFNAMSIZ - 1);
   NonOlsrIfNames[nNonOlsrIfs][IFNAMSIZ - 1] = '\0'; /* Ensures null termination */
   nNonOlsrIfs++;
-  return 1;
+  return 0;
 } /* AddNonOlsrBmfIf */
 
 /* -------------------------------------------------------------------------
index c586206..a110967 100644 (file)
@@ -120,10 +120,10 @@ extern int CapturePacketsOnOlsrInterfaces;
 enum TBmfMechanism { BM_BROADCAST = 0, BM_UNICAST_PROMISCUOUS };
 extern enum TBmfMechanism BmfMechanism;
 
-int SetBmfInterfaceName(const char* ifname);
-int SetBmfInterfaceIp(const char* ip);
-int SetCapturePacketsOnOlsrInterfaces(const char* enable);
-int SetBmfMechanism(const char* mechanism);
+int SetBmfInterfaceName(const char* ifname, void* data);
+int SetBmfInterfaceIp(const char* ip, void* data);
+int SetCapturePacketsOnOlsrInterfaces(const char* enable, void* data);
+int SetBmfMechanism(const char* mechanism, void* data);
 int DeactivateSpoofFilter(void);
 void RestoreSpoofFilter(void);
 
@@ -132,7 +132,8 @@ struct TBestNeighbors
   struct link_entry* links[2];
 };
 
-struct TBestNeighbors GetBestTwoNeighbors(
+void GetBestTwoNeighbors(
+  struct TBestNeighbors* result,
   struct TBmfInterface* intf,
   union olsr_ip_addr* source,
   union olsr_ip_addr* forwardedBy,
@@ -142,7 +143,7 @@ struct TBestNeighbors GetBestTwoNeighbors(
 int CreateBmfNetworkInterfaces(struct interface* skipThisIntf);
 void AddInterface(struct interface* newIntf);
 void CloseBmfNetworkInterfaces(void);
-int AddNonOlsrBmfIf(const char* ifName);
+int AddNonOlsrBmfIf(const char* ifName, void* data);
 int IsNonOlsrBmfIf(const char* ifName);
 void CheckAndUpdateLocalBroadcast(unsigned char* ipPacket, union olsr_ip_addr* broadAddr);
 void AddMulticastRoute(void);
index 1dee489..68e8fda 100644 (file)
 #include <net/if.h> /* IFNAMSIZ, IFHWADDRLEN */
 #include <sys/types.h> /* u_int8_t, u_int16_t */
 
-/* Offsets and sizes into IP-ethernet packets */
-#define IPV4_ADDR_SIZE 4
-#define ETH_TYPE_OFFSET (2*IFHWADDRLEN)
-#define ETH_TYPE_LEN 2
-#define IP_HDR_OFFSET (ETH_TYPE_OFFSET + ETH_TYPE_LEN)
-#define IPV4_OFFSET_SRCIP 12
-#define IPV4_OFFSET_DSTIP (IPV4_OFFSET_SRCIP + IPV4_ADDR_SIZE)
-
-#define IPV4_TYPE 0x0800
-
 /* BMF-encapsulated packets are Ethernet-IP-UDP packets, which start
  * with a 8-bytes BMF header (struct TEncapHeader), followed by the
  * encapsulated Ethernet-IP packet itself */
@@ -67,7 +57,7 @@ struct TEncapHeader
   u_int32_t crc32;
 } __attribute__((__packed__));
 
-#define        ENCAP_HDR_LEN ((int)sizeof(struct TEncapHeader))
+#define ENCAP_HDR_LEN ((int)sizeof(struct TEncapHeader))
 #define BMF_ENCAP_TYPE 1
 #define BMF_ENCAP_LEN 6
 
index 1f32bf7..e9dcddd 100644 (file)
@@ -49,8 +49,8 @@
 /* BMF includes */
 #include "Bmf.h" /* InitBmf(), CloseBmf(), RegisterBmfParameter() */
 #include "PacketHistory.h" /* InitPacketHistory() */
-
-#define PLUGIN_INTERFACE_VERSION 4
+#include "NetworkInterfaces.h" /* AddNonOlsrBmfIf(), SetBmfInterfaceIp(), ... */
+#include "Address.h" /* DoLocalBroadcast() */
 
 static void __attribute__ ((constructor)) my_init(void);
 static void __attribute__ ((destructor)) my_fini(void);
@@ -116,23 +116,31 @@ void olsr_plugin_exit(void)
   CloseBmf();
 }
 
+static const struct olsrd_plugin_parameters plugin_parameters[] = {
+    { .name = "NonOlsrIf", .set_plugin_parameter = &AddNonOlsrBmfIf, .data = NULL },
+    { .name = "DoLocalBroadcast", .set_plugin_parameter = &DoLocalBroadcast, .data = NULL },
+    { .name = "BmfInterface", .set_plugin_parameter = &SetBmfInterfaceName, .data = NULL },
+    { .name = "BmfInterfaceIp", .set_plugin_parameter = &SetBmfInterfaceIp, .data = NULL },
+    { .name = "CapturePacketsOnOlsrInterfaces", .set_plugin_parameter = &SetCapturePacketsOnOlsrInterfaces, .data = NULL },
+    { .name = "BmfMechanism", .set_plugin_parameter = &SetBmfMechanism, .data = NULL },
+};
+
 /* -------------------------------------------------------------------------
- * Function   : olsrd_plugin_register_param
- * Description: Register parameters from config file
- * Input      : key - the parameter name
- *              value - the parameter value
- * Output     : none
- * Return     : fatal error (<0), minor error (0) or success (>0)
- * Data Used  : none
- * Notes      : Called by main OLSR (init_olsr_plugin) for all plugin parameters
+ * Function   : olsrd_get_plugin_parameters
+ * Description: Return the parameter table and its size
+ * Input      : none
+ * Output     : params - the parameter table
+ *              size - its size in no. of entries
+ * Return     : none
+ * Data Used  : plugin_parameters
+ * Notes      : Called by main OLSR (init_olsr_plugin) for all plugins
  * ------------------------------------------------------------------------- */
-int olsrd_plugin_register_param(char* key, char* value)
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
 {
-  assert(key != NULL && value != NULL);
-
-  return RegisterBmfParameter(key, value);
+    *params = plugin_parameters;
+    *size = sizeof(plugin_parameters)/sizeof(*plugin_parameters);
 }
+
 /* -------------------------------------------------------------------------
  * Function   : my_init
  * Description: Plugin constructor
index 3d09da3..a145659 100644 (file)
@@ -2,8 +2,8 @@ VERS_1.0
 {
   global:
     olsrd_plugin_interface_version;
-    olsrd_plugin_register_param;
     olsrd_plugin_init;
+    olsrd_get_plugin_parameters;
 
   local:
     *;