Update to BMF 1.6.2 (written by Erik Tromp)
authorHenning Rogge <hrogge@googlemail.com>
Sun, 7 Feb 2010 10:05:02 +0000 (11:05 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Sun, 7 Feb 2010 10:05:02 +0000 (11:05 +0100)
Small changes to adapt 1.6.2 to refactorings for OLSRd 0.5.7.0 release
Removed mutex

13 files changed:
lib/bmf/Makefile
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/NetworkInterfaces.c
lib/bmf/src/NetworkInterfaces.h
lib/bmf/src/Packet.c
lib/bmf/src/Packet.h
lib/bmf/src/PacketHistory.c
lib/bmf/src/PacketHistory.h
lib/bmf/src/olsrd_plugin.c

index 92c0fd8..7c1fceb 100644 (file)
 
 OLSRD_PLUGIN = true
 PLUGIN_NAME =  olsrd_bmf
 
 OLSRD_PLUGIN = true
 PLUGIN_NAME =  olsrd_bmf
-PLUGIN_VER =   1.5.3
+PLUGIN_VER =   1.6.2
 
 TOPDIR = ../..
 include $(TOPDIR)/Makefile.inc
 
 LIBS +=        $(OS_LIB_PTHREAD)
 
 
 TOPDIR = ../..
 include $(TOPDIR)/Makefile.inc
 
 LIBS +=        $(OS_LIB_PTHREAD)
 
-ifneq ($(OS),$(filter $(OS),linux android))
+ifneq ($(OS),linux)
 
 default_target install clean: 
        @echo "*** BMF Plugin only supported on Linux, sorry!"
 
 default_target install clean: 
        @echo "*** BMF Plugin only supported on Linux, sorry!"
index f7735ad..eda6f65 100644 (file)
@@ -1,6 +1,6 @@
 BASIC MULTICAST FORWARDING PLUGIN FOR OLSRD
 BASIC MULTICAST FORWARDING PLUGIN FOR OLSRD
-by Erik Tromp (erik.tromp@nl.thalesgroup.com, erik_tromp@hotmail.com)
-Version 1.5.3
+by Erik Tromp (eriktromp@users.sourceforge.net, erik_tromp@hotmail.com)
+Version 1.6.2
 
 1. Introduction
 ---------------
 
 1. Introduction
 ---------------
@@ -17,14 +17,14 @@ in the past 3-6 seconds are forwarded.
 2. How to build and install
 ---------------------------
 
 2. How to build and install
 ---------------------------
 
-Download the olsr-bmf-v1.5.3.tar.gz file and save it into your OLSRD
+Download the olsr-bmf-v1.6.2.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:
 
 base install directory.
 
 Change directory (cd) to your OLSRD base install directory.
 
 At the command prompt, type:
 
-  tar -zxvf ./olsr-bmf-v1.5.3.tar.gz
+  tar -zxvf ./olsr-bmf-v1.6.2.tar.gz
 
 then type:
 
 
 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:
 
 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.3"
+  LoadPlugin "olsrd_bmf.so.1.6.2"
   {
     # No PlParam entries required for basic operation
   }
   {
     # No PlParam entries required for basic operation
   }
@@ -63,8 +63,8 @@ olsrd daemon by entering at the shell prompt:
 
 Look at the output; it should list the BMF plugin, e.g.:
 
 
 Look at the output; it should list the BMF plugin, e.g.:
 
-  ---------- LOADING LIBRARY olsrd_bmf.so.1.5.3 ----------
-  OLSRD Basic Multicast Forwarding (BMF) plugin 1.5.3 (Feb 24 2008 17:58:02)
+  ---------- LOADING LIBRARY olsrd_bmf.so.1.6.2 ----------
+  OLSRD Basic Multicast Forwarding (BMF) plugin 1.6.2 (Jul 22 2008 10:45:12)
     (C) Thales Communications Huizen, Netherlands
     Erik Tromp (eriktromp@users.sourceforge.net)
   Checking plugin interface version:  5 - OK
     (C) Thales Communications Huizen, Netherlands
     Erik Tromp (eriktromp@users.sourceforge.net)
   Checking plugin interface version:  5 - OK
@@ -74,7 +74,7 @@ Look at the output; it should list the BMF plugin, e.g.:
   "NonOlsrIf"/"eth0"... NonOlsrIf: OK
   Running plugin_init function...
   OLSRD Basic Multicast Forwarding (BMF) plugin: opened 5 sockets
   "NonOlsrIf"/"eth0"... NonOlsrIf: OK
   Running plugin_init function...
   OLSRD Basic Multicast Forwarding (BMF) plugin: opened 5 sockets
-  ---------- LIBRARY olsrd_bmf.so.1.5.3 LOADED ----------
+  ---------- LIBRARY olsrd_bmf.so.1.6.2 LOADED ----------
 
 
 4. How to check if it works
 
 
 4. How to check if it works
@@ -189,7 +189,7 @@ the /etc/olsrd.conf file.
 The following gives an overview of all plugin parameters that can be
 configured:
 
 The following gives an overview of all plugin parameters that can be
 configured:
 
-  LoadPlugin "olsrd_bmf.so.1.5.3"
+  LoadPlugin "olsrd_bmf.so.1.6.2"
   {
     # Specify the name of the BMF network interface.
     # Defaults to "bmf0".
   {
     # Specify the name of the BMF network interface.
     # Defaults to "bmf0".
@@ -343,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:
 
 interfaces one by one as "NonOlsrIf" parameters in the BMF plugin section
 of /etc/olsrd.conf. For example:
 
-  LoadPlugin "olsrd_bmf.so.1.5.3"
+  LoadPlugin "olsrd_bmf.so.1.6.2"
   {
     # Non-OLSR interfaces to participate in the multicast flooding
     PlParam     "NonOlsrIf"  "eth2"
   {
     # Non-OLSR interfaces to participate in the multicast flooding
     PlParam     "NonOlsrIf"  "eth2"
@@ -401,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:
 
 the BMF network interface, by editing the /etc/olsrd.conf file.
 For example:
 
-  LoadPlugin "olsrd_bmf.so.1.5.3"
+  LoadPlugin "olsrd_bmf.so.1.6.2"
   {
       PlParam "BmfInterfaceIp" "10.10.10.4/24"
   }
   {
       PlParam "BmfInterfaceIp" "10.10.10.4/24"
   }
@@ -539,6 +539,25 @@ the BMF network interface, either by specifying the interface name itself
 10. Version history
 -------------------
 
 10. Version history
 -------------------
 
+7 February 2010: (Henning Rogge <hrogge@googlemail.com>)
+* Ported 1.6.2 back into OLSRd for 0.5.7.0 release,
+* removed mutex
+
+23 November 2008: Version 1.6.2
+
+* Fixed a bug that prevented the route for multicast traffic to be updated
+  when a network interface was added at runtime --> thanks to Daniele Lacamera
+  for finding and solving this bug.
+
+22 July 2008: Version 1.6.1
+
+* Introduced a mutex for safe access to the OLSR data by the BMF thread.
+
+4 July 2008: Version 1.6
+
+* Fixed a bug in the CreateInterface() function: missing initialization
+  of newIf->next to NULL.
+
 24 February 2008: Version 1.5.3
 
 * Fixed a bug so that dying or dead end edges are not taken into account.
 24 February 2008: Version 1.5.3
 
 * Fixed a bug so that dying or dead end edges are not taken into account.
index 7601958..855f3ba 100644 (file)
@@ -1,57 +1,56 @@
-
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands.
  * Written by Erik Tromp.
  * All rights reserved.
  *
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-
 /* -------------------------------------------------------------------------
  * File       : Address.c
  * Description: IP packet characterization functions
  * Created    : 29 Jun 2006
  *
  * ------------------------------------------------------------------------- */
 /* -------------------------------------------------------------------------
  * File       : Address.c
  * Description: IP packet characterization functions
  * Created    : 29 Jun 2006
  *
  * ------------------------------------------------------------------------- */
-
 #include "Address.h"
 
 /* System includes */
 #include "Address.h"
 
 /* System includes */
-#include <stddef.h>             /* NULL */
-#include <assert.h>             /* assert() */
-#include <netinet/ip.h>         /* struct ip */
-#include <netinet/udp.h>        /* struct udphdr */
+#include <stddef.h> /* NULL */
+#include <assert.h> /* assert() */
+#include <netinet/ip.h> /* struct ip */
+#include <netinet/udp.h> /* struct udphdr */
 
 /* OLSRD includes */
 
 /* OLSRD includes */
-#include "defs.h"               /* ipequal */
+#include "defs.h" /* ipequal */
 
 /* Plugin includes */
 
 /* Plugin includes */
-#include "Bmf.h"                /* BMF_ENCAP_PORT */
-#include "NetworkInterfaces.h"  /* TBmfInterface */
+#include "Bmf.h" /* BMF_ENCAP_PORT */
+#include "NetworkInterfaces.h" /* TBmfInterface */
 
 /* Whether or not to flood local broadcast packets (e.g. packets with IP
  * destination 192.168.1.255). May be overruled by setting the plugin
 
 /* Whether or not to flood local broadcast packets (e.g. packets with IP
  * destination 192.168.1.255). May be overruled by setting the plugin
@@ -69,13 +68,18 @@ int EnableLocalBroadcast = 1;
  * Return     : success (0) or fail (1)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : success (0) or fail (1)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int
-DoLocalBroadcast(const char *enable, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
+int DoLocalBroadcast(
+  const char* enable,
+  void* data __attribute__((unused)),
+  set_plugin_parameter_addon addon __attribute__((unused)))
 {
 {
-  if (strcmp(enable, "yes") == 0) {
+  if (strcmp(enable, "yes") == 0)
+  {
     EnableLocalBroadcast = 1;
     return 0;
     EnableLocalBroadcast = 1;
     return 0;
-  } else if (strcmp(enable, "no") == 0) {
+  }
+  else if (strcmp(enable, "no") == 0)
+  {
     EnableLocalBroadcast = 0;
     return 0;
   }
     EnableLocalBroadcast = 0;
     return 0;
   }
@@ -92,8 +96,7 @@ DoLocalBroadcast(const char *enable, void *data __attribute__ ((unused)), set_pl
  * Return     : true (1) or false (0)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : true (1) or false (0)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int
-IsMulticast(union olsr_ip_addr *ipAddress)
+int IsMulticast(union olsr_ip_addr* ipAddress)
 {
   assert(ipAddress != NULL);
 
 {
   assert(ipAddress != NULL);
 
@@ -108,12 +111,11 @@ IsMulticast(union olsr_ip_addr *ipAddress)
  * Return     : true (1) or false (0)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : true (1) or false (0)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int
-IsOlsrOrBmfPacket(unsigned char *ipPacket)
+int IsOlsrOrBmfPacket(unsigned char* ipPacket)
 {
 {
-  struct ip *ipHeader;
+  struct ipipHeader;
   unsigned int ipHeaderLen;
   unsigned int ipHeaderLen;
-  struct udphdr *udpHeader;
+  struct udphdrudpHeader;
   u_int16_t destPort;
 
   assert(ipPacket != NULL);
   u_int16_t destPort;
 
   assert(ipPacket != NULL);
@@ -123,35 +125,30 @@ IsOlsrOrBmfPacket(unsigned char *ipPacket)
    * OLSR-Autodetect probe packets are UDP - port 51698 */
 
   /* Check if UDP */
    * OLSR-Autodetect probe packets are UDP - port 51698 */
 
   /* Check if UDP */
-  ipHeader = (struct ip *)(ARM_NOWARN_ALIGN)ipPacket;
-  if (ipHeader->ip_p != SOL_UDP) {
+  ipHeader = (struct ip*) ipPacket;
+  if (ipHeader->ip_p != SOL_UDP)
+  {
     /* Not UDP */
     return 0;
   }
 
   /* The total length must be at least large enough to store the UDP header */
   ipHeaderLen = GetIpHeaderLength(ipPacket);
     /* Not UDP */
     return 0;
   }
 
   /* The total length must be at least large enough to store the UDP header */
   ipHeaderLen = GetIpHeaderLength(ipPacket);
-  if (GetIpTotalLength(ipPacket) < ipHeaderLen + sizeof(struct udphdr)) {
+  if (GetIpTotalLength(ipPacket) < ipHeaderLen + sizeof(struct udphdr))
+  {
     /* Not long enough */
     return 0;
   }
 
   /* Go into the UDP header and check port number */
     /* Not long enough */
     return 0;
   }
 
   /* Go into the UDP header and check port number */
-  udpHeader = (struct udphdr *)(ARM_NOWARN_ALIGN)(ipPacket + ipHeaderLen);
+  udpHeader = (struct udphdr*) (ipPacket + ipHeaderLen);
   destPort = ntohs(udpHeader->dest);
 
   if (destPort == olsr_cnf->olsrport || destPort == BMF_ENCAP_PORT || destPort == 51698)
   destPort = ntohs(udpHeader->dest);
 
   if (destPort == olsr_cnf->olsrport || destPort == BMF_ENCAP_PORT || destPort == 51698)
-    /* TODO: #define for 51698 */
+      /* TODO: #define for 51698 */
   {
     return 1;
   }
 
   return 0;
 }
   {
     return 1;
   }
 
   return 0;
 }
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index 7a056aa..7d28c30 100644 (file)
@@ -7,29 +7,29 @@
  * Written by Erik Tromp.
  * All rights reserved.
  *
  * 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
 
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
  *
  * ------------------------------------------------------------------------- */
 
  *
  * ------------------------------------------------------------------------- */
 
-#include "olsr_types.h"         /* olsr_ip_addr */
-#include "olsrd_plugin.h"       /* union set_plugin_parameter_addon */
-#include "interfaces.h"         /* struct interface */
+#include "olsr_types.h" /* olsr_ip_addr */
+#include "olsrd_plugin.h" /* union set_plugin_parameter_addon */
+#include "interfaces.h" /* struct interface */
 
 struct TBmfInterface;
 
 extern int EnableLocalBroadcast;
 
 
 struct TBmfInterface;
 
 extern int EnableLocalBroadcast;
 
-int DoLocalBroadcast(const char *enable, void *data, set_plugin_parameter_addon addon);
-int IsMulticast(union olsr_ip_addr *ipAddress);
-int IsOlsrOrBmfPacket(unsigned char *ipPacket);
+int DoLocalBroadcast(const char* enable, void* data, set_plugin_parameter_addon addon);
+int IsMulticast(union olsr_ip_addripAddress);
+int IsOlsrOrBmfPacket(unsigned charipPacket);
 
 #endif /* _BMF_ADDRESS_H */
 
 #endif /* _BMF_ADDRESS_H */
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index c000da7..ad5d06d 100644 (file)
@@ -1,33 +1,32 @@
-
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands.
  * Written by Erik Tromp.
  * All rights reserved.
  *
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
 
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include "Bmf.h"
 
 /* System includes */
 #include "Bmf.h"
 
 /* System includes */
-#include <stddef.h>             /* NULL */
-#include <sys/types.h>          /* ssize_t */
-#include <string.h>             /* strerror() */
-#include <stdarg.h>             /* va_list, va_start, va_end */
-#include <errno.h>              /* errno */
-#include <assert.h>             /* assert() */
-#include <linux/if_ether.h>     /* ETH_P_IP */
-#include <linux/if_packet.h>    /* struct sockaddr_ll, PACKET_MULTICAST */
-#include <pthread.h>            /* pthread_t, pthread_create() */
-#include <signal.h>             /* sigset_t, sigfillset(), sigdelset(), SIGINT */
-#include <netinet/ip.h>         /* struct ip */
-#include <netinet/udp.h>        /* struct udphdr */
-#include <unistd.h>             /* struct udphdr */
+#include <stddef.h> /* NULL */
+#include <sys/types.h> /* ssize_t */
+#include <string.h> /* strerror() */
+#include <stdarg.h> /* va_list, va_start, va_end */
+#include <errno.h> /* errno */
+#include <assert.h> /* assert() */
+#include <linux/if_ether.h> /* ETH_P_IP */
+#include <linux/if_packet.h> /* struct sockaddr_ll, PACKET_MULTICAST */
+#include <pthread.h> /* pthread_t, pthread_create() */
+#include <signal.h> /* sigset_t, sigfillset(), sigdelset(), SIGINT */
+#include <netinet/ip.h> /* struct ip */
+#include <netinet/udp.h> /* struct udphdr */
+#include <unistd.h> /* read(), write() */
 
 /* OLSRD includes */
 
 /* OLSRD includes */
-#include "plugin_util.h"        /* set_plugin_int */
-#include "defs.h"               /* olsr_cnf, OLSR_PRINTF */
+#include "plugin_util.h" /* set_plugin_int */
+#include "defs.h" /* olsr_cnf, OLSR_PRINTF */
 #include "ipcalc.h"
 #include "ipcalc.h"
-#include "olsr.h"               /* olsr_printf */
-#include "scheduler.h"          /* olsr_start_timer() */
-#include "mid_set.h"            /* mid_lookup_main_addr() */
-#include "mpr_selector_set.h"   /* olsr_lookup_mprs_set() */
-#include "link_set.h"           /* get_best_link_to_neighbor() */
-#include "net_olsr.h"           /* ipequal */
+#include "olsr.h" /* olsr_printf */
+#include "mid_set.h" /* mid_lookup_main_addr() */
+#include "mpr_selector_set.h" /* olsr_lookup_mprs_set() */
+#include "link_set.h" /* get_best_link_to_neighbor() */
+#include "net_olsr.h" /* ipequal */
+#include "scheduler.h" /* olsr_mutex */
 
 /* BMF includes */
 
 /* BMF includes */
-#include "NetworkInterfaces.h"  /* TBmfInterface, CreateBmfNetworkInterfaces(), CloseBmfNetworkInterfaces() */
-#include "Address.h"            /* IsMulticast() */
-#include "Packet.h"             /* ENCAP_HDR_LEN, BMF_ENCAP_TYPE, BMF_ENCAP_LEN etc. */
-#include "PacketHistory.h"      /* InitPacketHistory() */
+#include "NetworkInterfaces.h" /* TBmfInterface, CreateBmfNetworkInterfaces(), CloseBmfNetworkInterfaces() */
+#include "Address.h" /* IsMulticast() */
+#include "Packet.h" /* ENCAP_HDR_LEN, BMF_ENCAP_TYPE, BMF_ENCAP_LEN etc. */
+#include "PacketHistory.h" /* InitPacketHistory() */
 
 static pthread_t BmfThread;
 static int BmfThreadRunning = 0;
 
 static pthread_t BmfThread;
 static int BmfThreadRunning = 0;
@@ -93,17 +92,19 @@ int BroadcastRetransmitCount = 1;
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-void
-BmfPError(const char *format, ...)
+void BmfPError(const char* format, ...)
 {
 #define MAX_STR_DESC 255
 {
 #define MAX_STR_DESC 255
-  char *strErr = strerror(errno);
+  charstrErr = strerror(errno);
   char strDesc[MAX_STR_DESC];
 
   /* Rely on short-circuit boolean evaluation */
   char strDesc[MAX_STR_DESC];
 
   /* Rely on short-circuit boolean evaluation */
-  if (format == NULL || *format == '\0') {
+  if (format == NULL || *format == '\0')
+  {
     olsr_printf(1, "%s: %s\n", PLUGIN_NAME, strErr);
     olsr_printf(1, "%s: %s\n", PLUGIN_NAME, strErr);
-  } else {
+  }
+  else
+  {
     va_list arglist;
 
     olsr_printf(1, "%s: ", PLUGIN_NAME);
     va_list arglist;
 
     olsr_printf(1, "%s: ", PLUGIN_NAME);
@@ -112,11 +113,11 @@ BmfPError(const char *format, ...)
     vsnprintf(strDesc, MAX_STR_DESC, format, arglist);
     va_end(arglist);
 
     vsnprintf(strDesc, MAX_STR_DESC, format, arglist);
     va_end(arglist);
 
-    strDesc[MAX_STR_DESC - 1] = '\0';   /* Ensures null termination */
+    strDesc[MAX_STR_DESC - 1] = '\0'; /* Ensures null termination */
 
     olsr_printf(1, "%s: %s\n", strDesc, strErr);
   }
 
     olsr_printf(1, "%s: %s\n", strDesc, strErr);
   }
-}                               /* BmfPError */
+} /* BmfPError */
 
 /* -------------------------------------------------------------------------
  * Function   : MainAddressOf
 
 /* -------------------------------------------------------------------------
  * Function   : MainAddressOf
@@ -126,18 +127,18 @@ BmfPError(const char *format, ...)
  * Return     : The main IP address of the node
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : The main IP address of the node
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-union olsr_ip_addr *
-MainAddressOf(union olsr_ip_addr *ip)
+union olsr_ip_addr* MainAddressOf(union olsr_ip_addr* ip)
 {
 {
-  union olsr_ip_addr *result;
+  union olsr_ip_addrresult;
 
 
-  /* TODO: mid_lookup_main_addr() is not thread-safe! */
+  /* Assumption: olsr_mutex has been grabbed for safe access to OLSR data */
   result = mid_lookup_main_addr(ip);
   result = mid_lookup_main_addr(ip);
-  if (result == NULL) {
+  if (result == NULL)
+  {
     result = ip;
   }
   return result;
     result = ip;
   }
   return result;
-}                               /* MainAddressOf */
+} /* MainAddressOf */
 
 /* -------------------------------------------------------------------------
  * Function   : EncapsulateAndForwardPacket
 
 /* -------------------------------------------------------------------------
  * Function   : EncapsulateAndForwardPacket
@@ -149,29 +150,34 @@ MainAddressOf(union olsr_ip_addr *ip)
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-static void
-EncapsulateAndForwardPacket(struct TBmfInterface *intf, unsigned char *encapsulationUdpData)
+static void EncapsulateAndForwardPacket(
+  struct TBmfInterface* intf,
+  unsigned char* encapsulationUdpData)
 {
   /* The packet */
   u_int16_t udpDataLen = GetEncapsulationUdpDataLength(encapsulationUdpData);
 
   /* The next destination(s) */
   struct TBestNeighbors bestNeighborLinks;
 {
   /* The packet */
   u_int16_t udpDataLen = GetEncapsulationUdpDataLength(encapsulationUdpData);
 
   /* The next destination(s) */
   struct TBestNeighbors bestNeighborLinks;
-  struct link_entry *bestNeighbor;
+  struct link_entrybestNeighbor;
 
   int nPossibleNeighbors = 0;
 
   int nPossibleNeighbors = 0;
-  struct sockaddr_in forwardTo;        /* Next destination of encapsulation packet */
+  struct sockaddr_in forwardTo; /* Next destination of encapsulation packet */
   int nPacketsToSend;
   int nPacketsToSend;
-  int sendUnicast;                     /* 0 = send broadcast; 1 = send unicast */
+  int sendUnicast; /* 0 = send broadcast; 1 = send unicast */
 
   int i;
 
   /* Find at most 'FanOutLimit' best neigbors to forward the packet to */
   FindNeighbors(&bestNeighborLinks, &bestNeighbor, intf, NULL, NULL, NULL, &nPossibleNeighbors);
 
 
   int i;
 
   /* Find at most 'FanOutLimit' best neigbors to forward the packet to */
   FindNeighbors(&bestNeighborLinks, &bestNeighbor, intf, NULL, NULL, NULL, &nPossibleNeighbors);
 
-  if (nPossibleNeighbors <= 0) {
-    OLSR_PRINTF(8, "%s: --> not encap-forwarding on \"%s\": there is no neighbor that needs my retransmission\n", PLUGIN_NAME_SHORT,
-                intf->ifName);
+  if (nPossibleNeighbors <= 0)
+  {
+    OLSR_PRINTF(
+      8,
+      "%s: --> not encap-forwarding on \"%s\": there is no neighbor that needs my retransmission\n",
+      PLUGIN_NAME_SHORT,
+      intf->ifName);
     return;
   }
 
     return;
   }
 
@@ -191,51 +197,68 @@ EncapsulateAndForwardPacket(struct TBmfInterface *intf, unsigned char *encapsula
    *     'FanOutLimit' possible neighbors,
    *   - if there are more than 'FanOutLimit' possible neighbors, then
    *     send a (WLAN-air-expensive, less reliable) broadcast packet. */
    *     'FanOutLimit' possible neighbors,
    *   - if there are more than 'FanOutLimit' possible neighbors, then
    *     send a (WLAN-air-expensive, less reliable) broadcast packet. */
-  if (BmfMechanism == BM_UNICAST_PROMISCUOUS) {
+  if (BmfMechanism == BM_UNICAST_PROMISCUOUS)
+  {
     /* One unicast packet to the best neighbor */
     nPacketsToSend = 1;
     sendUnicast = 1;
     bestNeighborLinks.links[0] = bestNeighbor;
     /* One unicast packet to the best neighbor */
     nPacketsToSend = 1;
     sendUnicast = 1;
     bestNeighborLinks.links[0] = bestNeighbor;
-  } else {                      /* BmfMechanism == BM_BROADCAST */
-
-    if (nPossibleNeighbors <= FanOutLimit) {
+  }
+  else /* BmfMechanism == BM_BROADCAST */
+  {
+    if (nPossibleNeighbors <= FanOutLimit)
+    {
       /* 'nPossibleNeighbors' unicast packets */
       nPacketsToSend = nPossibleNeighbors;
       sendUnicast = 1;
       /* 'nPossibleNeighbors' unicast packets */
       nPacketsToSend = nPossibleNeighbors;
       sendUnicast = 1;
-    } else {                    /* nPossibleNeighbors > FanOutLimit */
-
+    }
+    else /* nPossibleNeighbors > FanOutLimit */
+    {
       /* One broadcast packet, possibly retransmitted as specified in the
        * 'BroadcastRetransmitCount' plugin parameter */
       nPacketsToSend = BroadcastRetransmitCount;
       sendUnicast = 0;
       /* One broadcast packet, possibly retransmitted as specified in the
        * 'BroadcastRetransmitCount' plugin parameter */
       nPacketsToSend = BroadcastRetransmitCount;
       sendUnicast = 0;
-    }                           /* if */
-  }                             /* if */
+    } /* if */
+  } /* if */
 
 
-  for (i = 0; i < nPacketsToSend; i++) {
+  for (i = 0; i < nPacketsToSend; i++)
+  {
     int nBytesWritten;
 
     int nBytesWritten;
 
-    if (sendUnicast == 1) {
+    if (sendUnicast == 1)
+    {
       /* For unicast, overwrite the local broadcast address which was filled in above */
       forwardTo.sin_addr = bestNeighborLinks.links[i]->neighbor_iface_addr.v4;
     }
 
     /* Forward the BMF packet via the encapsulation socket */
       /* For unicast, overwrite the local broadcast address which was filled in above */
       forwardTo.sin_addr = bestNeighborLinks.links[i]->neighbor_iface_addr.v4;
     }
 
     /* Forward the BMF packet via the encapsulation socket */
-    nBytesWritten =
-      sendto(intf->encapsulatingSkfd, encapsulationUdpData, udpDataLen, MSG_DONTROUTE, (struct sockaddr *)&forwardTo,
-             sizeof(forwardTo));
+    nBytesWritten = sendto(
+      intf->encapsulatingSkfd,
+      encapsulationUdpData,
+      udpDataLen,
+      MSG_DONTROUTE,
+      (struct sockaddr*) &forwardTo,
+      sizeof(forwardTo));                   
 
     /* Evaluate and display result */
 
     /* Evaluate and display result */
-    if (nBytesWritten != udpDataLen) {
+    if (nBytesWritten != udpDataLen)
+    {
       BmfPError("sendto() error forwarding pkt on \"%s\"", intf->ifName);
       BmfPError("sendto() error forwarding pkt on \"%s\"", intf->ifName);
-    } else {
+    }
+    else
+    {
       /* Increase counter */
       intf->nBmfPacketsTx++;
 
       /* Increase counter */
       intf->nBmfPacketsTx++;
 
-      OLSR_PRINTF(8, "%s: --> encapsulated and forwarded on \"%s\" to %s\n", PLUGIN_NAME_SHORT, intf->ifName,
-                  inet_ntoa(forwardTo.sin_addr));
-    }                           /* if (nBytesWritten != udpDataLen) */
-  }                             /* for */
-}                               /* EncapsulateAndForwardPacket */
+      OLSR_PRINTF(
+        8,
+        "%s: --> encapsulated and forwarded on \"%s\" to %s\n",
+        PLUGIN_NAME_SHORT,
+        intf->ifName,
+        inet_ntoa(forwardTo.sin_addr));
+    } /* if (nBytesWritten != udpDataLen) */
+  } /* for */
+} /* EncapsulateAndForwardPacket */
 
 /* -------------------------------------------------------------------------
  * Function   : BmfPacketCaptured
 
 /* -------------------------------------------------------------------------
  * Function   : BmfPacketCaptured
@@ -251,30 +274,38 @@ EncapsulateAndForwardPacket(struct TBmfInterface *intf, unsigned char *encapsula
  * Notes      : The IP packet is assumed to be captured on a socket of family
  *              PF_PACKET and type SOCK_DGRAM (cooked).
  * ------------------------------------------------------------------------- */
  * Notes      : The IP packet is assumed to be captured on a socket of family
  *              PF_PACKET and type SOCK_DGRAM (cooked).
  * ------------------------------------------------------------------------- */
-static void
-BmfPacketCaptured(struct TBmfInterface *intf, unsigned char sllPkttype, unsigned char *encapsulationUdpData)
+static void BmfPacketCaptured(
+  struct TBmfInterface* intf,
+  unsigned char sllPkttype,
+  unsigned char* encapsulationUdpData)
 {
 {
-  union olsr_ip_addr src;              /* Source IP address in captured packet */
-  union olsr_ip_addr dst;              /* Destination IP address in captured packet */
-  union olsr_ip_addr *origIp;          /* Main OLSR address of source of captured packet */
-  struct TBmfInterface *walker;
+  union olsr_ip_addr src; /* Source IP address in captured packet */
+  union olsr_ip_addr dst; /* Destination IP address in captured packet */
+  union olsr_ip_addr* origIp; /* Main OLSR address of source of captured packet */
+  struct TBmfInterfacewalker;
   int isFromOlsrIntf;
   int isFromOlsrNeighbor;
   int iAmMpr;
   int isFromOlsrIntf;
   int isFromOlsrNeighbor;
   int iAmMpr;
-  unsigned char *ipPacket;             /* The captured IP packet... */
-  u_int16_t ipPacketLen;               /* ...and its length */
-  struct ip *ipHeader;                 /* The IP header inside the captured IP packet */
+  unsigned char* ipPacket; /* The captured IP packet... */
+  u_int16_t ipPacketLen; /* ...and its length */
+  struct ip* ipHeader; /* The IP header inside the captured IP packet */
   u_int32_t crc32;
   u_int32_t crc32;
-  struct TEncapHeader *encapHdr;
+  struct TEncapHeader* encapHdr;
+#ifndef NODEBUG
   struct ipaddr_str srcBuf, dstBuf;
   struct ipaddr_str srcBuf, dstBuf;
+#endif
   ipHeader = GetIpHeader(encapsulationUdpData);
 
   dst.v4 = ipHeader->ip_dst;
 
   /* Only forward multicast packets. If configured, also forward local broadcast packets */
   ipHeader = GetIpHeader(encapsulationUdpData);
 
   dst.v4 = ipHeader->ip_dst;
 
   /* Only forward multicast packets. If configured, also forward local broadcast packets */
-  if (IsMulticast(&dst) || (EnableLocalBroadcast != 0 && ipequal(&dst, &intf->broadAddr))) {
+  if (IsMulticast(&dst) ||
+      (EnableLocalBroadcast != 0 && ipequal(&dst, &intf->broadAddr)))
+  {
     /* continue */
     /* continue */
-  } else {
+  }
+  else
+  {
     return;
   }
 
     return;
   }
 
@@ -287,7 +318,8 @@ BmfPacketCaptured(struct TBmfInterface *intf, unsigned char sllPkttype, unsigned
    * than the first fragment, so that the list is not yet up to date and the second
    * fragment is not recognized as a BMF packet.
    * Also, don't forward OLSR packets (UDP port 698) and BMF encapsulated packets */
    * than the first fragment, so that the list is not yet up to date and the second
    * fragment is not recognized as a BMF packet.
    * Also, don't forward OLSR packets (UDP port 698) and BMF encapsulated packets */
-  if (IsIpFragment(ipPacket) || IsOlsrOrBmfPacket(ipPacket)) {
+  if (IsIpFragment(ipPacket) || IsOlsrOrBmfPacket(ipPacket))
+  {
     return;
   }
 
     return;
   }
 
@@ -302,9 +334,16 @@ BmfPacketCaptured(struct TBmfInterface *intf, unsigned char sllPkttype, unsigned
 
   src.v4 = ipHeader->ip_src;
 
 
   src.v4 = ipHeader->ip_src;
 
-  OLSR_PRINTF(8, "%s: %s pkt of %ld bytes captured on %s interface \"%s\": %s->%s\n", PLUGIN_NAME_SHORT,
-              sllPkttype == PACKET_OUTGOING ? "outgoing" : "incoming", (long)ipPacketLen, isFromOlsrIntf ? "OLSR" : "non-OLSR",
-              intf->ifName, olsr_ip_to_string(&srcBuf, &src), olsr_ip_to_string(&dstBuf, &dst));
+  OLSR_PRINTF(
+    8,
+    "%s: %s pkt of %ld bytes captured on %s interface \"%s\": %s->%s\n",
+    PLUGIN_NAME_SHORT,
+    sllPkttype == PACKET_OUTGOING ? "outgoing" : "incoming",
+    (long)ipPacketLen,
+    isFromOlsrIntf ? "OLSR" : "non-OLSR",
+    intf->ifName,
+    olsr_ip_to_string(&srcBuf, &src),
+    olsr_ip_to_string(&dstBuf, &dst));
 
   /* Lookup main address of source in the MID table of OLSR */
   origIp = MainAddressOf(&src);
 
   /* Lookup main address of source in the MID table of OLSR */
   origIp = MainAddressOf(&src);
@@ -313,35 +352,41 @@ BmfPacketCaptured(struct TBmfInterface *intf, unsigned char sllPkttype, unsigned
   crc32 = PacketCrc32(ipPacket, ipPacketLen);
 
   /* Check if this packet was seen recently */
   crc32 = PacketCrc32(ipPacket, ipPacketLen);
 
   /* Check if this packet was seen recently */
-  if (CheckAndMarkRecentPacket(crc32)) {
+  if (CheckAndMarkRecentPacket(crc32))
+  {
     /* Increase counter */
     intf->nBmfPacketsRxDup++;
 
     /* Increase counter */
     intf->nBmfPacketsRxDup++;
 
-    OLSR_PRINTF(8, "%s: --> discarding: packet is duplicate\n", PLUGIN_NAME_SHORT);
+    OLSR_PRINTF(
+      8,
+      "%s: --> discarding: packet is duplicate\n",
+      PLUGIN_NAME_SHORT);
     return;
   }
 
   /* Compose encapsulation header */
     return;
   }
 
   /* Compose encapsulation header */
-  encapHdr = (struct TEncapHeader *)encapsulationUdpData;
-  memset(encapHdr, 0, ENCAP_HDR_LEN);
+  encapHdr = (struct TEncapHeader*) encapsulationUdpData;
+  memset (encapHdr, 0, ENCAP_HDR_LEN);
   encapHdr->type = BMF_ENCAP_TYPE;
   encapHdr->len = BMF_ENCAP_LEN;
   encapHdr->reserved = 0;
   encapHdr->crc32 = htonl(crc32);
 
   /* Check if the frame is captured on an OLSR interface from an OLSR neighbor.
   encapHdr->type = BMF_ENCAP_TYPE;
   encapHdr->len = BMF_ENCAP_LEN;
   encapHdr->reserved = 0;
   encapHdr->crc32 = htonl(crc32);
 
   /* Check if the frame is captured on an OLSR interface from an OLSR neighbor.
-   * TODO1: get_best_link_to_neighbor() is not thread-safe.
-   * TODO2: get_best_link_to_neighbor() may be very CPU-expensive, a simpler call
+   * Assumption: olsr_mutex has been grabbed for safe access to OLSR data.
+   * TODO: get_best_link_to_neighbor() may be very CPU-expensive, a simpler call
    * would do here (something like 'get_any_link_to_neighbor()'). */
    * would do here (something like 'get_any_link_to_neighbor()'). */
-  isFromOlsrNeighbor = (isFromOlsrIntf  /* The frame is captured on an OLSR interface... */
-                        && get_best_link_to_neighbor(origIp) != NULL);  /* ...from an OLSR neighbor */
+  isFromOlsrNeighbor =
+    (isFromOlsrIntf /* The frame is captured on an OLSR interface... */
+    && get_best_link_to_neighbor(origIp) != NULL); /* ...from an OLSR neighbor */ 
 
 
-  /* Check with OLSR if I am MPR for that neighbor */
-  /* TODO: olsr_lookup_mprs_set() is not thread-safe! */
+  /* Check with OLSR if I am MPR for that neighbor.
+   * Assumption: olsr_mutex has been grabbed for safe access to OLSR data. */
   iAmMpr = olsr_lookup_mprs_set(origIp) != NULL;
 
   /* Check with each network interface what needs to be done on it */
   iAmMpr = olsr_lookup_mprs_set(origIp) != NULL;
 
   /* Check with each network interface what needs to be done on it */
-  for (walker = BmfInterfaces; walker != NULL; walker = walker->next) {
+  for (walker = BmfInterfaces; walker != NULL; walker = walker->next)
+  {
     /* Is the forwarding interface OLSR-enabled? */
     int isToOlsrIntf = (walker->olsrIntf != NULL);
 
     /* Is the forwarding interface OLSR-enabled? */
     int isToOlsrIntf = (walker->olsrIntf != NULL);
 
@@ -387,26 +432,42 @@ BmfPacketCaptured(struct TBmfInterface *intf, unsigned char sllPkttype, unsigned
      *   Answer 2 (better): Forward it.
      */
 
      *   Answer 2 (better): Forward it.
      */
 
-    if (isFromOlsrIntf && isToOlsrIntf) {
+    if (isFromOlsrIntf && isToOlsrIntf)
+    {
       /* Case 1: Forward from an OLSR interface to an OLSR interface */
 
       /* Case 1: Forward from an OLSR interface to an OLSR interface */
 
-      if (isFromOlsrNeighbor && !iAmMpr) {
+      if (isFromOlsrNeighbor && !iAmMpr)
+      {
         /* Case 1.1 */
         {
         /* Case 1.1 */
         {
+#ifndef NODEBUG
           struct ipaddr_str buf;
           struct ipaddr_str buf;
-          OLSR_PRINTF(8, "%s: --> not encap-forwarding on \"%s\": I am not selected as MPR by neighbor %s\n", PLUGIN_NAME_SHORT,
-                      walker->ifName, olsr_ip_to_string(&buf, &src));
-        }
-      } else if (sllPkttype == PACKET_OUTGOING && intf == walker) {
-        OLSR_PRINTF(8, "%s: --> not encap-forwarding on \"%s\": pkt was captured on that interface\n", PLUGIN_NAME_SHORT,
-                    walker->ifName);
-      } else {
+#endif
+          OLSR_PRINTF(
+            8,
+            "%s: --> not encap-forwarding on \"%s\": I am not selected as MPR by neighbor %s\n",
+            PLUGIN_NAME_SHORT,
+            walker->ifName,
+            olsr_ip_to_string(&buf, &src));
+        }    
+      }
+      else if (sllPkttype == PACKET_OUTGOING && intf == walker)
+      {
+        OLSR_PRINTF(
+          8,
+          "%s: --> not encap-forwarding on \"%s\": pkt was captured on that interface\n",
+          PLUGIN_NAME_SHORT,
+          walker->ifName);
+      }
+      else
+      {
         /* Case 1.2 and 1.3 */
         EncapsulateAndForwardPacket(walker, encapsulationUdpData);
       }
         /* Case 1.2 and 1.3 */
         EncapsulateAndForwardPacket(walker, encapsulationUdpData);
       }
-    }
-    /* if (isFromOlsrIntf && isToOlsrIntf) */
-    else if (isFromOlsrIntf && !isToOlsrIntf) {
+    } /* if (isFromOlsrIntf && isToOlsrIntf) */
+
+    else if (isFromOlsrIntf && !isToOlsrIntf)
+    {
       /* Case 2: Forward from OLSR interface to non-OLSR interface */
 
       int nBytesWritten;
       /* Case 2: Forward from OLSR interface to non-OLSR interface */
 
       int nBytesWritten;
@@ -431,33 +492,50 @@ BmfPacketCaptured(struct TBmfInterface *intf, unsigned char sllPkttype, unsigned
        * in that case. */
       memset(dest.sll_addr, 0xFF, IFHWADDRLEN);
 
        * in that case. */
       memset(dest.sll_addr, 0xFF, IFHWADDRLEN);
 
-      nBytesWritten = sendto(walker->capturingSkfd, ipPacket, ipPacketLen, 0, (struct sockaddr *)&dest, sizeof(dest));
-      if (nBytesWritten != ipPacketLen) {
+      nBytesWritten = sendto(
+        walker->capturingSkfd,
+        ipPacket,
+        ipPacketLen,
+        0,
+        (struct sockaddr*) &dest,
+        sizeof(dest));
+      if (nBytesWritten != ipPacketLen)
+      {
         BmfPError("sendto() error forwarding pkt on \"%s\"", walker->ifName);
         BmfPError("sendto() error forwarding pkt on \"%s\"", walker->ifName);
-      } else {
+      }
+      else
+      {
         /* Increase counter */
         walker->nBmfPacketsTx++;
 
         OLSR_PRINTF(8, "%s: --> forwarded on \"%s\"\n", PLUGIN_NAME_SHORT, walker->ifName);
       }
         /* Increase counter */
         walker->nBmfPacketsTx++;
 
         OLSR_PRINTF(8, "%s: --> forwarded on \"%s\"\n", PLUGIN_NAME_SHORT, walker->ifName);
       }
-    }
-    /* else if (isFromOlsrIntf && !isToOlsrIntf) */
-    else if (!isFromOlsrIntf && isToOlsrIntf) {
+    } /* else if (isFromOlsrIntf && !isToOlsrIntf) */
+
+    else if (!isFromOlsrIntf && isToOlsrIntf)
+    {
       /* Case 3: Forward from a non-OLSR interface to an OLSR interface.
        * Encapsulate and forward packet. */
 
       EncapsulateAndForwardPacket(walker, encapsulationUdpData);
       /* Case 3: Forward from a non-OLSR interface to an OLSR interface.
        * Encapsulate and forward packet. */
 
       EncapsulateAndForwardPacket(walker, encapsulationUdpData);
-    }
-    /* else if (!isFromOlsrIntf && isToOlsrIntf) */
-    else {
+    } /* else if (!isFromOlsrIntf && isToOlsrIntf) */
+
+    else
+    {
       /* Case 4: Forward from non-OLSR interface to non-OLSR interface. */
 
       /* Don't forward on interface on which packet was received */
       /* Case 4: Forward from non-OLSR interface to non-OLSR interface. */
 
       /* Don't forward on interface on which packet was received */
-      if (intf == walker) {
-        OLSR_PRINTF(8, "%s: --> not forwarding on \"%s\": pkt was captured on that interface\n", PLUGIN_NAME_SHORT, walker->ifName);
+      if (intf == walker)
+      {
+        OLSR_PRINTF(
+          8,
+          "%s: --> not forwarding on \"%s\": pkt was captured on that interface\n",
+          PLUGIN_NAME_SHORT,
+          walker->ifName);
       }
 
       }
 
-      else {
+      else
+      {
         int nBytesWritten;
         struct sockaddr_ll dest;
 
         int nBytesWritten;
         struct sockaddr_ll dest;
 
@@ -480,19 +558,32 @@ BmfPacketCaptured(struct TBmfInterface *intf, unsigned char sllPkttype, unsigned
          * in that case. */
         memset(dest.sll_addr, 0xFF, IFHWADDRLEN);
 
          * in that case. */
         memset(dest.sll_addr, 0xFF, IFHWADDRLEN);
 
-        nBytesWritten = sendto(walker->capturingSkfd, ipPacket, ipPacketLen, 0, (struct sockaddr *)&dest, sizeof(dest));
-        if (nBytesWritten != ipPacketLen) {
+        nBytesWritten = sendto(
+          walker->capturingSkfd,
+          ipPacket,
+          ipPacketLen,
+          0,
+          (struct sockaddr*) &dest,
+          sizeof(dest));
+        if (nBytesWritten != ipPacketLen)
+        {
           BmfPError("sendto() error forwarding pkt on \"%s\"", walker->ifName);
           BmfPError("sendto() error forwarding pkt on \"%s\"", walker->ifName);
-        } else {
+        }
+        else
+        {
           /* Increase counter */
           walker->nBmfPacketsTx++;
 
           /* Increase counter */
           walker->nBmfPacketsTx++;
 
-          OLSR_PRINTF(8, "%s: --> forwarded from non-OLSR on non-OLSR \"%s\"\n", PLUGIN_NAME_SHORT, walker->ifName);
+          OLSR_PRINTF(
+            8,
+            "%s: --> forwarded from non-OLSR on non-OLSR \"%s\"\n",
+            PLUGIN_NAME_SHORT,
+            walker->ifName);
         }
         }
-      }                         /* if (intf == walker) */
-    }                           /* if */
-  }                             /* for */
-}                               /* BmfPacketCaptured */
+      } /* if (intf == walker) */
+    } /* if */
+  } /* for */
+} /* BmfPacketCaptured */
 
 /* -------------------------------------------------------------------------
  * Function   : BmfEncapsulationPacketReceived
 
 /* -------------------------------------------------------------------------
  * Function   : BmfEncapsulationPacketReceived
@@ -510,28 +601,34 @@ BmfPacketCaptured(struct TBmfInterface *intf, unsigned char sllPkttype, unsigned
  * Return     : none
  * Data Used  : BmfInterfaces
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : BmfInterfaces
  * ------------------------------------------------------------------------- */
-static void
-BmfEncapsulationPacketReceived(struct TBmfInterface *intf, union olsr_ip_addr *forwardedBy, union olsr_ip_addr *forwardedTo,
-                               unsigned char *encapsulationUdpData)
+static void BmfEncapsulationPacketReceived(
+  struct TBmfInterface* intf,
+  union olsr_ip_addr* forwardedBy,
+  union olsr_ip_addr* forwardedTo,
+  unsigned char* encapsulationUdpData)
 {
 {
-  int iAmMpr;                          /* True (1) if I am selected as MPR by 'forwardedBy' */
-  struct sockaddr_in forwardTo;        /* Next destination of encapsulation packet */
-  unsigned char *ipPacket;             /* The encapsulated IP packet */
-  u_int16_t ipPacketLen;               /* Length of the encapsulated IP packet */
-  struct ip *ipHeader;                 /* IP header inside the encapsulated IP packet */
-  union olsr_ip_addr mcSrc;            /* Original source of the encapsulated multicast packet */
-  union olsr_ip_addr mcDst;            /* Multicast destination of the encapsulated packet */
-  struct TEncapHeader *encapsulationHdr;
+  int iAmMpr; /* True (1) if I am selected as MPR by 'forwardedBy' */
+  struct sockaddr_in forwardTo; /* Next destination of encapsulation packet */
+  unsigned char* ipPacket; /* The encapsulated IP packet */
+  u_int16_t ipPacketLen; /* Length of the encapsulated IP packet */
+  struct ip* ipHeader; /* IP header inside the encapsulated IP packet */
+  union olsr_ip_addr mcSrc; /* Original source of the encapsulated multicast packet */
+  union olsr_ip_addr mcDst; /* Multicast destination of the encapsulated packet */
+  struct TEncapHeaderencapsulationHdr;
   u_int16_t encapsulationUdpDataLen;
   u_int16_t encapsulationUdpDataLen;
-  struct TBmfInterface *walker;
+  struct TBmfInterface* walker;
+#ifndef NODEBUG
   struct ipaddr_str mcSrcBuf, mcDstBuf, forwardedByBuf, forwardedToBuf;
   struct ipaddr_str mcSrcBuf, mcDstBuf, forwardedByBuf, forwardedToBuf;
+#endif
   /* Are we talking to ourselves? */
   /* Are we talking to ourselves? */
-  if (if_ifwithaddr(forwardedBy) != NULL) {
+  if (if_ifwithaddr(forwardedBy) != NULL)
+  {
     return;
   }
 
   /* Discard encapsulated packets received on a non-OLSR interface */
     return;
   }
 
   /* Discard encapsulated packets received on a non-OLSR interface */
-  if (intf->olsrIntf == NULL) {
+  if (intf->olsrIntf == NULL)
+  {
     return;
   }
 
     return;
   }
 
@@ -547,36 +644,53 @@ BmfEncapsulationPacketReceived(struct TBmfInterface *intf, union olsr_ip_addr *f
   intf->nBmfPacketsRx++;
 
   /* Beware: not possible to call olsr_ip_to_string more than 4 times in same printf */
   intf->nBmfPacketsRx++;
 
   /* Beware: not possible to call olsr_ip_to_string more than 4 times in same printf */
-  OLSR_PRINTF(8, "%s: encapsulated pkt of %ld bytes incoming on \"%s\": %s->%s, forwarded by %s to %s\n", PLUGIN_NAME_SHORT,
-              (long)ipPacketLen, intf->ifName, olsr_ip_to_string(&mcSrcBuf, &mcSrc), olsr_ip_to_string(&mcDstBuf, &mcDst),
-              olsr_ip_to_string(&forwardedByBuf, forwardedBy), forwardedTo != NULL ? olsr_ip_to_string(&forwardedToBuf,
-                                                                                                       forwardedTo) : "me");
+  OLSR_PRINTF(
+    8,
+    "%s: encapsulated pkt of %ld bytes incoming on \"%s\": %s->%s, forwarded by %s to %s\n",
+    PLUGIN_NAME_SHORT,
+    (long)ipPacketLen,
+    intf->ifName,
+    olsr_ip_to_string(&mcSrcBuf, &mcSrc),
+    olsr_ip_to_string(&mcDstBuf, &mcDst),
+    olsr_ip_to_string(&forwardedByBuf, forwardedBy),
+    forwardedTo != NULL ? olsr_ip_to_string(&forwardedToBuf, forwardedTo) : "me");
 
   /* Get encapsulation header */
 
   /* Get encapsulation header */
-  encapsulationHdr = (struct TEncapHeader *)encapsulationUdpData;
+  encapsulationHdr = (struct TEncapHeader*) encapsulationUdpData;
 
   /* Verify correct format of BMF encapsulation header */
 
   /* Verify correct format of BMF encapsulation header */
-  if (encapsulationHdr->type != BMF_ENCAP_TYPE || encapsulationHdr->len != BMF_ENCAP_LEN || ntohs(encapsulationHdr->reserved != 0)) {
-    OLSR_PRINTF(8, "%s: --> discarding: format of BMF encapsulation header not recognized\n", PLUGIN_NAME_SHORT);
+  if (encapsulationHdr->type != BMF_ENCAP_TYPE ||
+      encapsulationHdr->len != BMF_ENCAP_LEN ||
+      ntohs(encapsulationHdr->reserved != 0))
+  {
+    OLSR_PRINTF(
+      8,
+      "%s: --> discarding: format of BMF encapsulation header not recognized\n",
+      PLUGIN_NAME_SHORT);
     return;
   }
 
   /* Check if this packet was seen recently */
     return;
   }
 
   /* Check if this packet was seen recently */
-  if (CheckAndMarkRecentPacket(ntohl(encapsulationHdr->crc32))) {
+  if (CheckAndMarkRecentPacket(ntohl(encapsulationHdr->crc32)))
+  {
     /* Increase counter */
     intf->nBmfPacketsRxDup++;
 
     /* Increase counter */
     intf->nBmfPacketsRxDup++;
 
-    OLSR_PRINTF(8, "%s: --> discarding: packet is duplicate\n", PLUGIN_NAME_SHORT);
+    OLSR_PRINTF(
+      8,
+      "%s: --> discarding: packet is duplicate\n",
+      PLUGIN_NAME_SHORT);
     return;
   }
 
     return;
   }
 
-  if (EtherTunTapFd >= 0) {
+  if (EtherTunTapFd >= 0)
+  {
     /* Unpack the encapsulated IP packet and deliver it locally, by sending
      * a copy into the local IP stack via the EtherTunTap interface */
 
     union olsr_ip_addr broadAddr;
     int nBytesToWrite, nBytesWritten;
     /* Unpack the encapsulated IP packet and deliver it locally, by sending
      * a copy into the local IP stack via the EtherTunTap interface */
 
     union olsr_ip_addr broadAddr;
     int nBytesToWrite, nBytesWritten;
-    unsigned char *bufferToWrite;
+    unsigned charbufferToWrite;
 
     /* If the encapsulated IP packet is a local broadcast packet,
      * update its destination address to match the subnet of the EtherTunTap
 
     /* If the encapsulated IP packet is a local broadcast packet,
      * update its destination address to match the subnet of the EtherTunTap
@@ -589,16 +703,22 @@ BmfEncapsulationPacketReceived(struct TBmfInterface *intf, union olsr_ip_addr *f
 
     /* Write the packet into the EtherTunTap interface for local delivery */
     nBytesWritten = write(EtherTunTapFd, bufferToWrite, nBytesToWrite);
 
     /* Write the packet into the EtherTunTap interface for local delivery */
     nBytesWritten = write(EtherTunTapFd, bufferToWrite, nBytesToWrite);
-    if (nBytesWritten != nBytesToWrite) {
+    if (nBytesWritten != nBytesToWrite)
+    {
       BmfPError("write() error forwarding encapsulated pkt on \"%s\"", EtherTunTapIfName);
       BmfPError("write() error forwarding encapsulated pkt on \"%s\"", EtherTunTapIfName);
-    } else {
-      OLSR_PRINTF(8, "%s: --> unpacked and delivered locally on \"%s\"\n", PLUGIN_NAME_SHORT, EtherTunTapIfName);
     }
     }
-  }
+    else
+    {
+      OLSR_PRINTF(
+        8,
+        "%s: --> unpacked and delivered locally on \"%s\"\n",
+        PLUGIN_NAME_SHORT,
+        EtherTunTapIfName);
+    }
+  } /* if (EtherTunTapFd >= 0) */
 
 
-  /* if (EtherTunTapFd >= 0) */
-  /* Check if I am MPR for the forwarder */
-  /* TODO: olsr_lookup_mprs_set() is not thread-safe! */
+  /* Check if I am MPR for the forwarder.
+   * Assumption: olsr_mutex has been grabbed for safe access to OLSR data. */
   iAmMpr = (olsr_lookup_mprs_set(MainAddressOf(forwardedBy)) != NULL);
 
   /* Compose destination address for next hop */
   iAmMpr = (olsr_lookup_mprs_set(MainAddressOf(forwardedBy)) != NULL);
 
   /* Compose destination address for next hop */
@@ -610,7 +730,8 @@ BmfEncapsulationPacketReceived(struct TBmfInterface *intf, union olsr_ip_addr *f
   encapsulationUdpDataLen = GetEncapsulationUdpDataLength(encapsulationUdpData);
 
   /* Check with each network interface what needs to be done on it */
   encapsulationUdpDataLen = GetEncapsulationUdpDataLength(encapsulationUdpData);
 
   /* Check with each network interface what needs to be done on it */
-  for (walker = BmfInterfaces; walker != NULL; walker = walker->next) {
+  for (walker = BmfInterfaces; walker != NULL; walker = walker->next)
+  {
     /* What to do with the packet on a non-OLSR interface? Unpack
      * encapsulated packet, and forward it.
      *
     /* What to do with the packet on a non-OLSR interface? Unpack
      * encapsulated packet, and forward it.
      *
@@ -621,7 +742,8 @@ BmfEncapsulationPacketReceived(struct TBmfInterface *intf, union olsr_ip_addr *f
      * it is an encapsulated BMF packet. */
 
     /* To a non-OLSR interface: unpack the encapsulated IP packet and forward it */
      * it is an encapsulated BMF packet. */
 
     /* To a non-OLSR interface: unpack the encapsulated IP packet and forward it */
-    if (walker->olsrIntf == NULL) {
+    if (walker->olsrIntf == NULL)
+    {
       int nBytesWritten;
       struct sockaddr_ll dest;
 
       int nBytesWritten;
       struct sockaddr_ll dest;
 
@@ -644,36 +766,60 @@ BmfEncapsulationPacketReceived(struct TBmfInterface *intf, union olsr_ip_addr *f
        * in that case. */
       memset(dest.sll_addr, 0xFF, IFHWADDRLEN);
 
        * in that case. */
       memset(dest.sll_addr, 0xFF, IFHWADDRLEN);
 
-      nBytesWritten = sendto(walker->capturingSkfd, ipPacket, ipPacketLen, 0, (struct sockaddr *)&dest, sizeof(dest));
-      if (nBytesWritten != ipPacketLen) {
+      nBytesWritten = sendto(
+        walker->capturingSkfd,
+        ipPacket,
+        ipPacketLen,
+        0,
+        (struct sockaddr*) &dest,
+        sizeof(dest));
+      if (nBytesWritten != ipPacketLen)
+      {
         BmfPError("sendto() error forwarding unpacked encapsulated pkt on \"%s\"", walker->ifName);
         BmfPError("sendto() error forwarding unpacked encapsulated pkt on \"%s\"", walker->ifName);
-      } else {
+      }
+      else
+      {
         /* Increase counter */
         walker->nBmfPacketsTx++;
 
         /* Increase counter */
         walker->nBmfPacketsTx++;
 
-        OLSR_PRINTF(8, "%s: --> unpacked and forwarded on \"%s\"\n", PLUGIN_NAME_SHORT, walker->ifName);
+        OLSR_PRINTF(
+          8,
+          "%s: --> unpacked and forwarded on \"%s\"\n",
+          PLUGIN_NAME_SHORT,
+          walker->ifName);
       }
       }
-    }
+    } /* if (walker->olsrIntf == NULL) */
 
 
-    /* if (walker->olsrIntf == NULL) */
     /* To an OLSR interface: forward the packet, but only if this node is
      * selected as MPR by the forwarding node */
     /* To an OLSR interface: forward the packet, but only if this node is
      * selected as MPR by the forwarding node */
-    else if (iAmMpr) {
+    else if (iAmMpr)
+    {
       struct TBestNeighbors bestNeighborLinks;
       struct TBestNeighbors bestNeighborLinks;
-      struct link_entry *bestNeighbor;
+      struct link_entrybestNeighbor;
       int nPossibleNeighbors;
       int nPacketsToSend;
       int nPossibleNeighbors;
       int nPacketsToSend;
-      int sendUnicast;                 /* 0 = send broadcast; 1 = send unicast */
+      int sendUnicast; /* 0 = send broadcast; 1 = send unicast */
       int i;
 
       /* Retrieve at most two best neigbors to forward the packet to */
       int i;
 
       /* Retrieve at most two best neigbors to forward the packet to */
-      FindNeighbors(&bestNeighborLinks, &bestNeighbor, walker, &mcSrc, forwardedBy, forwardedTo, &nPossibleNeighbors);
-
-      if (nPossibleNeighbors <= 0) {
-        OLSR_PRINTF(8, "%s: --> not forwarding on \"%s\": there is no neighbor that needs my retransmission\n", PLUGIN_NAME_SHORT,
-                    walker->ifName);
-
-        continue;               /* for */
+      FindNeighbors(
+        &bestNeighborLinks,
+        &bestNeighbor,
+        walker,
+        &mcSrc,
+        forwardedBy,
+        forwardedTo,
+        &nPossibleNeighbors);
+
+      if (nPossibleNeighbors <= 0)
+      {
+        OLSR_PRINTF(
+          8,
+          "%s: --> not forwarding on \"%s\": there is no neighbor that needs my retransmission\n",
+          PLUGIN_NAME_SHORT,
+          walker->ifName);
+
+        continue; /* for */
       }
 
       /* Compose destination of encapsulation packet.
       }
 
       /* Compose destination of encapsulation packet.
@@ -687,61 +833,85 @@ BmfEncapsulationPacketReceived(struct TBmfInterface *intf, union olsr_ip_addr *f
        *     'FanOutLimit' possible neighbors,
        *   - if there are more than 'FanOutLimit' possible neighbors, then
        *     send a (WLAN-air-expensive, less reliable) broadcast packet. */
        *     'FanOutLimit' possible neighbors,
        *   - if there are more than 'FanOutLimit' possible neighbors, then
        *     send a (WLAN-air-expensive, less reliable) broadcast packet. */
-      if (BmfMechanism == BM_UNICAST_PROMISCUOUS) {
+      if (BmfMechanism == BM_UNICAST_PROMISCUOUS)
+      {
         /* One unicast packet to the best neighbor */
         nPacketsToSend = 1;
         sendUnicast = 1;
         bestNeighborLinks.links[0] = bestNeighbor;
         /* One unicast packet to the best neighbor */
         nPacketsToSend = 1;
         sendUnicast = 1;
         bestNeighborLinks.links[0] = bestNeighbor;
-      } else {                  /* BmfMechanism == BM_BROADCAST */
-
-        if (nPossibleNeighbors <= FanOutLimit) {
+      }
+      else /* BmfMechanism == BM_BROADCAST */
+      {
+        if (nPossibleNeighbors <= FanOutLimit)
+        {
           /* 'nPossibleNeighbors' unicast packets */
           nPacketsToSend = nPossibleNeighbors;
           sendUnicast = 1;
           /* 'nPossibleNeighbors' unicast packets */
           nPacketsToSend = nPossibleNeighbors;
           sendUnicast = 1;
-        } else {                /* nPossibleNeighbors > FanOutLimit */
-
+        }
+        else /* nPossibleNeighbors > FanOutLimit */
+        {
           /* One broadcast packet, possibly retransmitted as specified in the
            * 'BroadcastRetransmitCount' plugin parameter */
           nPacketsToSend = BroadcastRetransmitCount;
           sendUnicast = 0;
           /* One broadcast packet, possibly retransmitted as specified in the
            * 'BroadcastRetransmitCount' plugin parameter */
           nPacketsToSend = BroadcastRetransmitCount;
           sendUnicast = 0;
-        }                       /* if */
-      }                         /* if */
+        } /* if */
+      } /* if */
 
 
-      for (i = 0; i < nPacketsToSend; i++) {
+      for (i = 0; i < nPacketsToSend; i++)
+      {
         int nBytesWritten;
 
         int nBytesWritten;
 
-        if (sendUnicast) {
+        if (sendUnicast)
+        {    
           /* For unicast, overwrite the local broadcast address which was filled in above */
           forwardTo.sin_addr = bestNeighborLinks.links[i]->neighbor_iface_addr.v4;
         }
 
         /* Forward the BMF packet via the encapsulation socket */
           /* For unicast, overwrite the local broadcast address which was filled in above */
           forwardTo.sin_addr = bestNeighborLinks.links[i]->neighbor_iface_addr.v4;
         }
 
         /* Forward the BMF packet via the encapsulation socket */
-        nBytesWritten =
-          sendto(walker->encapsulatingSkfd, encapsulationUdpData, encapsulationUdpDataLen, MSG_DONTROUTE,
-                 (struct sockaddr *)&forwardTo, sizeof(forwardTo));
+        nBytesWritten = sendto(
+          walker->encapsulatingSkfd,
+          encapsulationUdpData,
+          encapsulationUdpDataLen,
+          MSG_DONTROUTE,
+          (struct sockaddr*) &forwardTo,
+          sizeof(forwardTo));                   
 
         /* Evaluate and display result */
 
         /* Evaluate and display result */
-        if (nBytesWritten != encapsulationUdpDataLen) {
+        if (nBytesWritten != encapsulationUdpDataLen)
+        {
           BmfPError("sendto() error forwarding encapsulated pkt on \"%s\"", walker->ifName);
           BmfPError("sendto() error forwarding encapsulated pkt on \"%s\"", walker->ifName);
-        } else {
+        }
+        else
+        {
           /* Increase counter */
           walker->nBmfPacketsTx++;
 
           /* Increase counter */
           walker->nBmfPacketsTx++;
 
-          OLSR_PRINTF(8, "%s: --> forwarded on \"%s\" to %s\n", PLUGIN_NAME_SHORT, walker->ifName, inet_ntoa(forwardTo.sin_addr));
-        }                       /* if */
-      }                         /* for */
-    }
-    /* else if (iAmMpr) */
-    else {                      /* walker->olsrIntf != NULL && !iAmMpr */
-
+          OLSR_PRINTF(
+            8,
+            "%s: --> forwarded on \"%s\" to %s\n",
+            PLUGIN_NAME_SHORT,
+            walker->ifName,
+            inet_ntoa(forwardTo.sin_addr));
+        } /* if */
+      } /* for */
+    }  /* else if (iAmMpr) */
+
+    else /* walker->olsrIntf != NULL && !iAmMpr */
+    {
+#ifndef NODEBUG
       struct ipaddr_str buf;
       struct ipaddr_str buf;
+#endif
       /* 'walker' is an OLSR interface, but I am not selected as MPR. In that
        * case, don't forward. */
       /* 'walker' is an OLSR interface, but I am not selected as MPR. In that
        * case, don't forward. */
-      OLSR_PRINTF(8, "%s: --> not forwarding on \"%s\": I am not selected as MPR by %s\n", PLUGIN_NAME_SHORT, walker->ifName,
-                  olsr_ip_to_string(&buf, forwardedBy));
-    }                           /* else */
-  }                             /* for */
-}                               /* BmfEncapsulationPacketReceived */
+      OLSR_PRINTF(
+        8,
+        "%s: --> not forwarding on \"%s\": I am not selected as MPR by %s\n",
+        PLUGIN_NAME_SHORT,
+        walker->ifName,
+        olsr_ip_to_string(&buf, forwardedBy));
+    } /* else */
+  } /* for */
+} /* BmfEncapsulationPacketReceived */
 
 /* -------------------------------------------------------------------------
  * Function   : BmfTunPacketCaptured
 
 /* -------------------------------------------------------------------------
  * Function   : BmfTunPacketCaptured
@@ -754,19 +924,20 @@ BmfEncapsulationPacketReceived(struct TBmfInterface *intf, union olsr_ip_addr *f
  * Notes      : The packet is assumed to be captured on a socket of family
  *              PF_PACKET and type SOCK_DGRAM (cooked).
  * ------------------------------------------------------------------------- */
  * Notes      : The packet is assumed to be captured on a socket of family
  *              PF_PACKET and type SOCK_DGRAM (cooked).
  * ------------------------------------------------------------------------- */
-static void
-BmfTunPacketCaptured(unsigned char *encapsulationUdpData)
+static void BmfTunPacketCaptured(unsigned char* encapsulationUdpData)
 {
   union olsr_ip_addr srcIp;
   union olsr_ip_addr dstIp;
   union olsr_ip_addr broadAddr;
 {
   union olsr_ip_addr srcIp;
   union olsr_ip_addr dstIp;
   union olsr_ip_addr broadAddr;
-  struct TBmfInterface *walker;
-  unsigned char *ipPacket;
+  struct TBmfInterfacewalker;
+  unsigned charipPacket;
   u_int16_t ipPacketLen;
   u_int16_t ipPacketLen;
-  struct ip *ipHeader;
+  struct ipipHeader;
   u_int32_t crc32;
   u_int32_t crc32;
-  struct TEncapHeader *encapHdr;
+  struct TEncapHeader* encapHdr;
+#ifndef NODEBUG
   struct ipaddr_str srcIpBuf, dstIpBuf;
   struct ipaddr_str srcIpBuf, dstIpBuf;
+#endif
   ipPacket = GetIpPacket(encapsulationUdpData);
   ipPacketLen = GetIpTotalLength(ipPacket);
   ipHeader = GetIpHeader(encapsulationUdpData);
   ipPacket = GetIpPacket(encapsulationUdpData);
   ipPacketLen = GetIpTotalLength(ipPacket);
   ipHeader = GetIpHeader(encapsulationUdpData);
@@ -775,42 +946,60 @@ BmfTunPacketCaptured(unsigned char *encapsulationUdpData)
   broadAddr.v4.s_addr = htonl(EtherTunTapIpBroadcast);
 
   /* Only forward multicast packets. If configured, also forward local broadcast packets */
   broadAddr.v4.s_addr = htonl(EtherTunTapIpBroadcast);
 
   /* Only forward multicast packets. If configured, also forward local broadcast packets */
-  if (IsMulticast(&dstIp) || (EnableLocalBroadcast != 0 && ipequal(&dstIp, &broadAddr))) {
+  if (IsMulticast(&dstIp) ||
+      (EnableLocalBroadcast != 0 && ipequal(&dstIp, &broadAddr)))
+  {
     /* continue */
     /* continue */
-  } else {
+  }
+  else
+  {
     return;
   }
 
   srcIp.v4 = ipHeader->ip_src;
 
     return;
   }
 
   srcIp.v4 = ipHeader->ip_src;
 
-  OLSR_PRINTF(8, "%s: outgoing pkt of %ld bytes captured on tuntap interface \"%s\": %s->%s\n", PLUGIN_NAME_SHORT,
-              (long)ipPacketLen, EtherTunTapIfName, olsr_ip_to_string(&srcIpBuf, &srcIp), olsr_ip_to_string(&dstIpBuf, &dstIp));
+  OLSR_PRINTF(
+    8,
+    "%s: outgoing pkt of %ld bytes captured on tuntap interface \"%s\": %s->%s\n",
+    PLUGIN_NAME_SHORT,
+    (long)ipPacketLen,
+    EtherTunTapIfName,
+    olsr_ip_to_string(&srcIpBuf, &srcIp),
+    olsr_ip_to_string(&dstIpBuf, &dstIp));
 
   /* Calculate packet fingerprint */
   crc32 = PacketCrc32(ipPacket, ipPacketLen);
 
   /* Check if this packet was seen recently */
 
   /* Calculate packet fingerprint */
   crc32 = PacketCrc32(ipPacket, ipPacketLen);
 
   /* Check if this packet was seen recently */
-  if (CheckAndMarkRecentPacket(crc32)) {
-    OLSR_PRINTF(8, "%s: --> discarding: packet is duplicate\n", PLUGIN_NAME_SHORT);
+  if (CheckAndMarkRecentPacket(crc32))
+  {
+    OLSR_PRINTF(
+      8,
+      "%s: --> discarding: packet is duplicate\n",
+      PLUGIN_NAME_SHORT);
     return;
   }
 
   /* Compose encapsulation header */
     return;
   }
 
   /* Compose encapsulation header */
-  encapHdr = (struct TEncapHeader *)encapsulationUdpData;
-  memset(encapHdr, 0, ENCAP_HDR_LEN);
+  encapHdr = (struct TEncapHeader*) encapsulationUdpData;
+  memset (encapHdr, 0, ENCAP_HDR_LEN);
   encapHdr->type = BMF_ENCAP_TYPE;
   encapHdr->len = BMF_ENCAP_LEN;
   encapHdr->reserved = 0;
   encapHdr->crc32 = htonl(crc32);
 
   /* Check with each network interface what needs to be done on it */
   encapHdr->type = BMF_ENCAP_TYPE;
   encapHdr->len = BMF_ENCAP_LEN;
   encapHdr->reserved = 0;
   encapHdr->crc32 = htonl(crc32);
 
   /* Check with each network interface what needs to be done on it */
-  for (walker = BmfInterfaces; walker != NULL; walker = walker->next) {
+  for (walker = BmfInterfaces; walker != NULL; walker = walker->next)
+  {
     /* Is the forwarding interface OLSR-enabled? */
     /* Is the forwarding interface OLSR-enabled? */
-    if (walker->olsrIntf != NULL) {
+    if (walker->olsrIntf != NULL)
+    {
       /* On an OLSR interface: encapsulate and forward packet. */
 
       EncapsulateAndForwardPacket(walker, encapsulationUdpData);
       /* On an OLSR interface: encapsulate and forward packet. */
 
       EncapsulateAndForwardPacket(walker, encapsulationUdpData);
-    } else {
+    }
+    else
+    {
       /* On a non-OLSR interface: what to do?
        * Answer 1: nothing. Multicast routing between non-OLSR interfaces
        * is to be done by other protocols (e.g. PIM, DVMRP).
       /* On a non-OLSR interface: what to do?
        * Answer 1: nothing. Multicast routing between non-OLSR interfaces
        * is to be done by other protocols (e.g. PIM, DVMRP).
@@ -838,18 +1027,31 @@ BmfTunPacketCaptured(unsigned char *encapsulationUdpData)
        * in that case. */
       memset(dest.sll_addr, 0xFF, IFHWADDRLEN);
 
        * in that case. */
       memset(dest.sll_addr, 0xFF, IFHWADDRLEN);
 
-      nBytesWritten = sendto(walker->capturingSkfd, ipPacket, ipPacketLen, 0, (struct sockaddr *)&dest, sizeof(dest));
-      if (nBytesWritten != ipPacketLen) {
+      nBytesWritten = sendto(
+        walker->capturingSkfd,
+        ipPacket,
+        ipPacketLen,
+        0,
+        (struct sockaddr*) &dest,
+        sizeof(dest));
+      if (nBytesWritten != ipPacketLen)
+      {
         BmfPError("sendto() error forwarding pkt on \"%s\"", walker->ifName);
         BmfPError("sendto() error forwarding pkt on \"%s\"", walker->ifName);
-      } else {
+      }
+      else
+      {
         /* Increase counter */
         walker->nBmfPacketsTx++;
 
         /* Increase counter */
         walker->nBmfPacketsTx++;
 
-        OLSR_PRINTF(8, "%s: --> forwarded from non-OLSR to non-OLSR \"%s\"\n", PLUGIN_NAME_SHORT, walker->ifName);
-      }                         /* if */
-    }                           /* if */
-  }                             /* for */
-}                               /* BmfTunPacketCaptured */
+        OLSR_PRINTF(
+          8,
+          "%s: --> forwarded from non-OLSR to non-OLSR \"%s\"\n",
+          PLUGIN_NAME_SHORT,
+          walker->ifName);
+      } /* if */
+    } /* if */
+  } /* for */
+} /* BmfTunPacketCaptured */
 
 /* -------------------------------------------------------------------------
  * Function   : DoBmf
 
 /* -------------------------------------------------------------------------
  * Function   : DoBmf
@@ -860,8 +1062,7 @@ BmfTunPacketCaptured(unsigned char *encapsulationUdpData)
  * Return     : none
  * Data Used  : BmfInterfaces
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : BmfInterfaces
  * ------------------------------------------------------------------------- */
-static void
-DoBmf(void)
+static void DoBmf(void)
 {
   int nFdBitsSet;
   unsigned char rxBuffer[BMF_BUFFER_SIZE];
 {
   int nFdBitsSet;
   unsigned char rxBuffer[BMF_BUFFER_SIZE];
@@ -876,25 +1077,35 @@ DoBmf(void)
   /* Wait (blocking) for packets received on any of the sockets.
    * NOTE: don't use a timeout (last parameter). It causes a high system CPU load! */
   nFdBitsSet = select(HighestSkfd + 1, &rxFdSet, NULL, NULL, NULL);
   /* Wait (blocking) for packets received on any of the sockets.
    * NOTE: don't use a timeout (last parameter). It causes a high system CPU load! */
   nFdBitsSet = select(HighestSkfd + 1, &rxFdSet, NULL, NULL, NULL);
-  if (nFdBitsSet < 0) {
-    if (errno != EINTR) {
+  if (nFdBitsSet < 0)
+  {
+    if (errno != EINTR)
+    {
       BmfPError("select() error");
     }
     return;
   }
 
       BmfPError("select() error");
     }
     return;
   }
 
-  while (nFdBitsSet > 0) {
-    struct TBmfInterface *walker;
+  while (nFdBitsSet > 0)
+  {
+    struct TBmfInterface* walker;
+
+    /* Guarantee safe access to OLSR data */
+#if 0
+    pthread_mutex_lock(&olsr_mutex);
+#endif
 
     /* Check if a packet was received on the capturing socket (if any)
      * of each network interface */
 
     /* Check if a packet was received on the capturing socket (if any)
      * of each network interface */
-    for (walker = BmfInterfaces; walker != NULL; walker = walker->next) {
+    for (walker = BmfInterfaces; walker != NULL; walker = walker->next)
+    {
       int skfd = walker->capturingSkfd;
       int skfd = walker->capturingSkfd;
-      if (skfd >= 0 && (FD_ISSET(skfd, &rxFdSet))) {
+      if (skfd >= 0 && (FD_ISSET(skfd, &rxFdSet)))
+      {
         struct sockaddr_ll pktAddr;
         socklen_t addrLen = sizeof(pktAddr);
         int nBytes;
         struct sockaddr_ll pktAddr;
         socklen_t addrLen = sizeof(pktAddr);
         int nBytes;
-        unsigned char *ipPacket;
+        unsigned charipPacket;
 
         /* A packet was captured. */
 
 
         /* A packet was captured. */
 
@@ -903,47 +1114,63 @@ DoBmf(void)
         /* Receive the captured Ethernet frame, leaving space for the BMF
          * encapsulation header */
         ipPacket = GetIpPacket(rxBuffer);
         /* Receive the captured Ethernet frame, leaving space for the BMF
          * encapsulation header */
         ipPacket = GetIpPacket(rxBuffer);
-        nBytes = recvfrom(skfd, ipPacket, BMF_BUFFER_SIZE - ENCAP_HDR_LEN, 0, (struct sockaddr *)&pktAddr, &addrLen);
-        if (nBytes < 0) {
+        nBytes = recvfrom(
+          skfd,
+          ipPacket,
+          BMF_BUFFER_SIZE - ENCAP_HDR_LEN,
+          0,
+          (struct sockaddr*)&pktAddr,
+          &addrLen);
+        if (nBytes < 0)
+        {
           BmfPError("recvfrom() error on \"%s\"", walker->ifName);
 
           BmfPError("recvfrom() error on \"%s\"", walker->ifName);
 
-          continue;             /* for */
-        }
+          continue; /* for */
+        } /* if (nBytes < 0) */
 
 
-        /* if (nBytes < 0) */
         /* Check if the number of received bytes is large enough for an IP
          * packet which contains at least a minimum-size IP header.
          * Note: There is an apparent bug in the packet socket implementation in
          * combination with VLAN interfaces. 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 the same ethernet frame. */
         /* Check if the number of received bytes is large enough for an IP
          * packet which contains at least a minimum-size IP header.
          * Note: There is an apparent bug in the packet socket implementation in
          * combination with VLAN interfaces. 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 the same ethernet frame. */
-        if (nBytes < (int)sizeof(struct ip)) {
-          olsr_printf(1, "%s: captured frame too short (%d bytes) on \"%s\"\n", PLUGIN_NAME, nBytes, walker->ifName);
-
-          continue;             /* for */
+        if (nBytes < (int)sizeof(struct ip))
+        {
+          olsr_printf(
+            1,
+            "%s: captured frame too short (%d bytes) on \"%s\"\n",
+            PLUGIN_NAME,
+            nBytes,
+            walker->ifName);
+
+          continue; /* for */
         }
 
         }
 
-        if (pktAddr.sll_pkttype == PACKET_OUTGOING || pktAddr.sll_pkttype == PACKET_MULTICAST
-            || pktAddr.sll_pkttype == PACKET_BROADCAST) {
+        if (pktAddr.sll_pkttype == PACKET_OUTGOING ||
+            pktAddr.sll_pkttype == PACKET_MULTICAST ||
+            pktAddr.sll_pkttype == PACKET_BROADCAST)
+        {
           /* A multicast or broadcast packet was captured */
 
           BmfPacketCaptured(walker, pktAddr.sll_pkttype, rxBuffer);
 
           /* A multicast or broadcast packet was captured */
 
           BmfPacketCaptured(walker, pktAddr.sll_pkttype, rxBuffer);
 
-        }                       /* if (pktAddr.sll_pkttype == ...) */
-      }                         /* if (skfd >= 0 && (FD_ISSET...)) */
-    }                           /* for */
-
+        } /* if (pktAddr.sll_pkttype == ...) */
+      } /* if (skfd >= 0 && (FD_ISSET...)) */
+    } /* for */
+    
     /* Check if a BMF encapsulation packet was received on the listening
      * socket (if any) of each network interface */
     /* Check if a BMF encapsulation packet was received on the listening
      * socket (if any) of each network interface */
-    for (walker = BmfInterfaces; walker != NULL; walker = walker->next) {
+    for (walker = BmfInterfaces; walker != NULL; walker = walker->next)
+    {
       int skfd = walker->listeningSkfd;
       int skfd = walker->listeningSkfd;
-      if (skfd >= 0 && (FD_ISSET(skfd, &rxFdSet))) {
+      if (skfd >= 0 && (FD_ISSET(skfd, &rxFdSet)))
+      {
         struct sockaddr_ll pktAddr;
         socklen_t addrLen = sizeof(pktAddr);
         int nBytes;
         int minimumLength;
         struct sockaddr_ll pktAddr;
         socklen_t addrLen = sizeof(pktAddr);
         int nBytes;
         int minimumLength;
-        struct ip *ipHeader;
-        struct udphdr *udpHeader;
+        struct ipipHeader;
+        struct udphdrudpHeader;
         u_int16_t destPort;
         union olsr_ip_addr forwardedBy;
         union olsr_ip_addr forwardedTo;
         u_int16_t destPort;
         union olsr_ip_addr forwardedBy;
         union olsr_ip_addr forwardedTo;
@@ -952,36 +1179,44 @@ DoBmf(void)
 
         nFdBitsSet--;
 
 
         nFdBitsSet--;
 
-        nBytes = recvfrom(skfd, rxBuffer, BMF_BUFFER_SIZE, 0, (struct sockaddr *)&pktAddr, &addrLen);
-        if (nBytes < 0) {
+        nBytes = recvfrom(
+          skfd,
+          rxBuffer,
+          BMF_BUFFER_SIZE,
+          0,
+          (struct sockaddr*)&pktAddr,
+          &addrLen);
+        if (nBytes < 0)
+        {
           BmfPError("recvfrom() error on \"%s\"", walker->ifName);
 
           BmfPError("recvfrom() error on \"%s\"", walker->ifName);
 
-          continue;             /* for */
-        }
+          continue; /* for */
+        } /* if (nBytes < 0) */
 
 
-        /* if (nBytes < 0) */
         /* Check if the received packet is actually directed to another
          * node on the LAN */
         /* Check if the received packet is actually directed to another
          * node on the LAN */
-        if (pktAddr.sll_pkttype != PACKET_OTHERHOST) {
+        if (pktAddr.sll_pkttype != PACKET_OTHERHOST)
+        {
           /* No, the packet is directed to this node. In that case it will
            * be, or will already have been received, via the encapsulating
            * socket. Discard it here. */
           /* No, the packet is directed to this node. In that case it will
            * be, or will already have been received, via the encapsulating
            * socket. Discard it here. */
-          continue;             /* for */
-        }
+          continue; /* for */
+        } /* if (pktAddr.sll_pkttype ...) */
 
 
-        /* if (pktAddr.sll_pkttype ...) */
         /* Check if the received packet is UDP - BMF port */
         /* Check if the received packet is UDP - BMF port */
-        ipHeader = (struct ip *)(ARM_NOWARN_ALIGN)rxBuffer;
-        if (ipHeader->ip_p != SOL_UDP) {
+        ipHeader = (struct ip*)rxBuffer;
+        if (ipHeader->ip_p != SOL_UDP)
+        {
           /* Not UDP */
           /* Not UDP */
-          continue;             /* for */
+          continue; /* for */
         }
 
         }
 
-        udpHeader = (struct udphdr *)(ARM_NOWARN_ALIGN)(rxBuffer + GetIpHeaderLength(rxBuffer));
+        udpHeader = (struct udphdr*)(rxBuffer + GetIpHeaderLength(rxBuffer));
         destPort = ntohs(udpHeader->dest);
         destPort = ntohs(udpHeader->dest);
-        if (destPort != BMF_ENCAP_PORT) {
+        if (destPort != BMF_ENCAP_PORT)
+        {
           /* Not BMF */
           /* Not BMF */
-          continue;             /* for */
+          continue; /* for */
         }
 
         /* Check if the number of received bytes is large enough for a minimal BMF
         }
 
         /* Check if the number of received bytes is large enough for a minimal BMF
@@ -993,27 +1228,41 @@ DoBmf(void)
          * 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
          * the same ethernet frame. */
          * 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
          * the same ethernet frame. */
-        minimumLength = GetIpHeaderLength(rxBuffer) + sizeof(struct udphdr) + ENCAP_HDR_LEN + sizeof(struct ip);
-        if (nBytes < minimumLength) {
-          olsr_printf(1, "%s: captured a too short encapsulation packet (%d bytes) on \"%s\"\n", PLUGIN_NAME, nBytes,
-                      walker->ifName);
-
-          continue;             /* for */
+        minimumLength =
+          GetIpHeaderLength(rxBuffer) +
+          sizeof(struct udphdr) +
+          ENCAP_HDR_LEN +
+          sizeof(struct ip);
+        if (nBytes < minimumLength)
+        {
+          olsr_printf(
+            1,
+            "%s: captured a too short encapsulation packet (%d bytes) on \"%s\"\n",
+            PLUGIN_NAME,
+            nBytes,
+            walker->ifName);
+
+          continue; /* for */
         }
 
         forwardedBy.v4 = ipHeader->ip_src;
         forwardedTo.v4 = ipHeader->ip_dst;
         }
 
         forwardedBy.v4 = ipHeader->ip_src;
         forwardedTo.v4 = ipHeader->ip_dst;
-        BmfEncapsulationPacketReceived(walker, &forwardedBy, &forwardedTo,
-                                       rxBuffer + GetIpHeaderLength(rxBuffer) + sizeof(struct udphdr));
+        BmfEncapsulationPacketReceived(
+          walker,
+          &forwardedBy,
+          &forwardedTo,
+          rxBuffer + GetIpHeaderLength(rxBuffer) + sizeof(struct udphdr));
 
 
-      }                         /* if (skfd >= 0 && (FD_ISSET...)) */
-    }                           /* for */
+      } /* if (skfd >= 0 && (FD_ISSET...)) */
+    } /* for */
 
     /* Check if a packet was received on the encapsulating socket (if any)
      * of each network interface */
 
     /* Check if a packet was received on the encapsulating socket (if any)
      * of each network interface */
-    for (walker = BmfInterfaces; walker != NULL; walker = walker->next) {
+    for (walker = BmfInterfaces; walker != NULL; walker = walker->next)
+    {
       int skfd = walker->encapsulatingSkfd;
       int skfd = walker->encapsulatingSkfd;
-      if (skfd >= 0 && (FD_ISSET(skfd, &rxFdSet))) {
+      if (skfd >= 0 && (FD_ISSET(skfd, &rxFdSet)))
+      {
         struct sockaddr_in from;
         socklen_t fromLen = sizeof(from);
         int nBytes;
         struct sockaddr_in from;
         socklen_t fromLen = sizeof(from);
         int nBytes;
@@ -1024,26 +1273,41 @@ DoBmf(void)
 
         nFdBitsSet--;
 
 
         nFdBitsSet--;
 
-        nBytes = recvfrom(skfd, rxBuffer, BMF_BUFFER_SIZE, 0, (struct sockaddr *)&from, &fromLen);
-        if (nBytes < 0) {
+        nBytes = recvfrom(
+          skfd,
+          rxBuffer,
+          BMF_BUFFER_SIZE,
+          0,
+          (struct sockaddr*)&from,
+          &fromLen);
+        if (nBytes < 0)
+        {
           BmfPError("recvfrom() error on \"%s\"", walker->ifName);
 
           BmfPError("recvfrom() error on \"%s\"", walker->ifName);
 
-          continue;             /* for */
-        }
-        /* if (nBytes < 0) */
+          continue; /* for */
+        } /* if (nBytes < 0) */
+
         forwardedBy.v4 = from.sin_addr;
 
         /* Check if the number of received bytes is large enough for a minimal BMF
          * encapsulation packet, at least:
          * - the encapsulation header
          * - a minimum IP header inside the encapsulated packet */
         forwardedBy.v4 = from.sin_addr;
 
         /* Check if the number of received bytes is large enough for a minimal BMF
          * encapsulation packet, at least:
          * - the encapsulation header
          * - a minimum IP header inside the encapsulated packet */
-        minimumLength = ENCAP_HDR_LEN + sizeof(struct ip);
-        if (nBytes < minimumLength) {
+        minimumLength =
+          ENCAP_HDR_LEN +
+          sizeof(struct ip);
+        if (nBytes < minimumLength)
+        {
           struct ipaddr_str buf;
           struct ipaddr_str buf;
-          olsr_printf(1, "%s: received a too short encapsulation packet (%d bytes) from %s on \"%s\"\n", PLUGIN_NAME, nBytes,
-                      olsr_ip_to_string(&buf, &forwardedBy), walker->ifName);
-
-          continue;             /* for */
+          olsr_printf(
+            1,
+            "%s: received a too short encapsulation packet (%d bytes) from %s on \"%s\"\n",
+            PLUGIN_NAME,
+            nBytes,
+            olsr_ip_to_string(&buf, &forwardedBy),
+            walker->ifName);
+
+          continue; /* for */
         }
 
         /* Unfortunately, the recvfrom call does not return the destination
         }
 
         /* Unfortunately, the recvfrom call does not return the destination
@@ -1052,45 +1316,62 @@ DoBmf(void)
          * for the 'forwardedTo' parameter. */
         BmfEncapsulationPacketReceived(walker, &forwardedBy, NULL, rxBuffer);
 
          * for the 'forwardedTo' parameter. */
         BmfEncapsulationPacketReceived(walker, &forwardedBy, NULL, rxBuffer);
 
-      }                         /* if (skfd >= 0 && (FD_ISSET...)) */
-    }                           /* for */
+      } /* if (skfd >= 0 && (FD_ISSET...)) */
+    } /* for */
 
 
-    if (nFdBitsSet > 0 && FD_ISSET(EtherTunTapFd, &rxFdSet)) {
+    if (nFdBitsSet > 0 && FD_ISSET(EtherTunTapFd, &rxFdSet))
+    {
       /* Check if an application has sent a packet out via the tuntap
        * network interface */
 
       int nBytes;
       /* Check if an application has sent a packet out via the tuntap
        * network interface */
 
       int nBytes;
-      unsigned char *ipPacket;
-      unsigned char *bufferToRead;
+      unsigned charipPacket;
+      unsigned charbufferToRead;
       size_t nBytesToRead;
 
       nFdBitsSet--;
 
       /* Receive the packet, leaving space for the BMF encapsulation header */
       ipPacket = GetIpPacket(rxBuffer);
       size_t nBytesToRead;
 
       nFdBitsSet--;
 
       /* Receive the packet, leaving space for the BMF encapsulation header */
       ipPacket = GetIpPacket(rxBuffer);
-
+    
       bufferToRead = ipPacket;
       nBytesToRead = BMF_BUFFER_SIZE - ENCAP_HDR_LEN;
 
       nBytes = read(EtherTunTapFd, bufferToRead, nBytesToRead);
 
       bufferToRead = ipPacket;
       nBytesToRead = BMF_BUFFER_SIZE - ENCAP_HDR_LEN;
 
       nBytes = read(EtherTunTapFd, bufferToRead, nBytesToRead);
 
-      if (nBytes < 0) {
+      if (nBytes < 0)
+      {
         BmfPError("recvfrom() error on \"%s\"", EtherTunTapIfName);
         BmfPError("recvfrom() error on \"%s\"", EtherTunTapIfName);
-      } else {
+      }
+      else
+      {
         /* Check if the number of received bytes is large enough for an IP
          * packet which contains at least a minimum-size IP header */
         /* Check if the number of received bytes is large enough for an IP
          * packet which contains at least a minimum-size IP header */
-        if (nBytes < (int)sizeof(struct ip)) {
-          olsr_printf(1, "%s: captured packet too short (%d bytes) on \"%s\"\n", PLUGIN_NAME, nBytes, EtherTunTapIfName);
-        } else {
+        if (nBytes < (int)sizeof(struct ip))
+        {
+          olsr_printf(
+            1,
+            "%s: captured packet too short (%d bytes) on \"%s\"\n",
+            PLUGIN_NAME,
+            nBytes,
+            EtherTunTapIfName);
+        }
+        else
+        {
           /* An outbound packet was captured */
 
           BmfTunPacketCaptured(rxBuffer);
 
           /* An outbound packet was captured */
 
           BmfTunPacketCaptured(rxBuffer);
 
-        }                       /* if (nBytes < ... */
-      }                         /* if (nBytes < 0) */
-    }                           /* if (nFdBitsSet > 0 && ... */
-  }                             /* while (nFdBitsSet > 0) */
-}                               /* DoBmf */
+        } /* if (nBytes < ... */
+      } /* if (nBytes < 0) */
+    } /* if (nFdBitsSet > 0 && ... */
+
+    /* Release safe access to OLSR data */
+#if 0
+    pthread_mutex_unlock(&olsr_mutex);
+#endif
+  } /* while (nFdBitsSet > 0) */
+} /* DoBmf */
 
 /* -------------------------------------------------------------------------
  * Function   : BmfSignalHandler
 
 /* -------------------------------------------------------------------------
  * Function   : BmfSignalHandler
@@ -1100,11 +1381,10 @@ DoBmf(void)
  * Return     : none
  * Data Used  : BmfThreadRunning
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : BmfThreadRunning
  * ------------------------------------------------------------------------- */
-static void
-BmfSignalHandler(int signo __attribute__ ((unused)))
+static void BmfSignalHandler(int signo __attribute__((unused)))
 {
   BmfThreadRunning = 0;
 {
   BmfThreadRunning = 0;
-}                               /* BmfSignalHandler */
+} /* BmfSignalHandler */
 
 /* -------------------------------------------------------------------------
  * Function   : BmfRun
 
 /* -------------------------------------------------------------------------
  * Function   : BmfRun
@@ -1116,14 +1396,14 @@ BmfSignalHandler(int signo __attribute__ ((unused)))
  * Notes      : Another thread can gracefully stop this thread by sending
  *              a SIGALRM signal.
  * ------------------------------------------------------------------------- */
  * Notes      : Another thread can gracefully stop this thread by sending
  *              a SIGALRM signal.
  * ------------------------------------------------------------------------- */
-static void *
-BmfRun(void *useless __attribute__ ((unused)))
+static void* BmfRun(void* useless __attribute__((unused)))
 {
   /* Mask all signals except SIGALRM */
   sigset_t blockedSigs;
   sigfillset(&blockedSigs);
   sigdelset(&blockedSigs, SIGALRM);
 {
   /* Mask all signals except SIGALRM */
   sigset_t blockedSigs;
   sigfillset(&blockedSigs);
   sigdelset(&blockedSigs, SIGALRM);
-  if (pthread_sigmask(SIG_BLOCK, &blockedSigs, NULL) != 0) {
+  if (pthread_sigmask(SIG_BLOCK, &blockedSigs, NULL) != 0)
+  {
     BmfPError("pthread_sigmask() error");
   }
 
     BmfPError("pthread_sigmask() error");
   }
 
@@ -1133,41 +1413,47 @@ BmfRun(void *useless __attribute__ ((unused)))
    * specified, any system call in which the thread may be waiting will not
    * return. Note that the BMF thread is usually blocked in the select()
    * function (see DoBmf()). */
    * specified, any system call in which the thread may be waiting will not
    * return. Note that the BMF thread is usually blocked in the select()
    * function (see DoBmf()). */
-  if (signal(SIGALRM, BmfSignalHandler) == SIG_ERR) {
+  if (signal(SIGALRM, BmfSignalHandler) == SIG_ERR)
+  {
     BmfPError("signal() error");
   }
 
   /* Call the thread function until flagged to exit */
     BmfPError("signal() error");
   }
 
   /* Call the thread function until flagged to exit */
-  while (BmfThreadRunning != 0) {
+  while (BmfThreadRunning != 0)
+  {
     DoBmf();
   }
 
   return NULL;
     DoBmf();
   }
 
   return NULL;
-}                               /* BmfRun */
+} /* BmfRun */
 
 /* -------------------------------------------------------------------------
  * Function   : InterfaceChange
  * Description: Callback function passed to OLSRD for it to call whenever a
  *              network interface has been added, removed or updated
 
 /* -------------------------------------------------------------------------
  * Function   : InterfaceChange
  * Description: Callback function passed to OLSRD for it to call whenever a
  *              network interface has been added, removed or updated
- * Input      : if_index - interface index
- *              interf - the network interface to deal with, might be NULL
- *                 if interface is not an OLSR interface (tunl0 for example)
+ * Input      : if_index - index of the interface
+ *              interf - the network interface to deal with
+ *                       (might be NULL for non-OLSR interfaces)
  *              action - indicates if the specified network interface was
  *                added, removed or updated.
  * Output     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  *              action - indicates if the specified network interface was
  *                added, removed or updated.
  * Output     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-void
-InterfaceChange(int if_index  __attribute__ ((unused)), struct interface *interf, enum olsr_ifchg_flag action)
+void InterfaceChange(int if_index __attribute__((unused)), struct interface* interf,
+    enum olsr_ifchg_flag action)
 {
   if (interf == NULL) {
 {
   if (interf == NULL) {
-    /* we only care for OLSR interfaces */
     return;
   }
     return;
   }
-
-  switch (action) {
+  switch (action)
+  {
   case (IFCHG_IF_ADD):
   case (IFCHG_IF_ADD):
-    AddInterface(interf);
+    /* If the new interfaces is ready, completely restart BMF. In this way
+     * the IP address for the BMF network interface is correctly re-evaluated,
+     * and a default route for multicast traffic is (re)established. 
+     * Thanks to Daniele Lacamera for finding and solving this bug. */
+    CloseBmf();
+    InitBmf(NULL);
     olsr_printf(1, "%s: interface %s added\n", PLUGIN_NAME, interf->int_name);
     break;
 
     olsr_printf(1, "%s: interface %s added\n", PLUGIN_NAME, interf->int_name);
     break;
 
@@ -1185,12 +1471,17 @@ InterfaceChange(int if_index  __attribute__ ((unused)), struct interface *interf
   case (IFCHG_IF_UPDATE):
     olsr_printf(1, "%s: interface %s updated\n", PLUGIN_NAME, interf->int_name);
     break;
   case (IFCHG_IF_UPDATE):
     olsr_printf(1, "%s: interface %s updated\n", PLUGIN_NAME, interf->int_name);
     break;
-
+      
   default:
   default:
-    olsr_printf(1, "%s: interface %s: error - unknown action (%d)\n", PLUGIN_NAME, interf->int_name, action);
+    olsr_printf(
+      1,
+      "%s: interface %s: error - unknown action (%d)\n",
+      PLUGIN_NAME,
+      interf->int_name, action);
     break;
   }
     break;
   }
-}                               /* InterfaceChange */
+} /* InterfaceChange */
+
 
 /* -------------------------------------------------------------------------
  * Function   : SetFanOutLimit
 
 /* -------------------------------------------------------------------------
  * Function   : SetFanOutLimit
@@ -1202,12 +1493,16 @@ InterfaceChange(int if_index  __attribute__ ((unused)), struct interface *interf
  * Return     : success (0) or fail (1)
  * Data Used  : FanOutLimit
  * ------------------------------------------------------------------------- */
  * Return     : success (0) or fail (1)
  * Data Used  : FanOutLimit
  * ------------------------------------------------------------------------- */
-int
-SetFanOutLimit(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
+int SetFanOutLimit(
+  const char* value,
+  void* data __attribute__((unused)),
+  set_plugin_parameter_addon addon __attribute__((unused)))
 {
 {
-  if (set_plugin_int(value, &FanOutLimit, addon) == 0) {
+  if (set_plugin_int(value, &FanOutLimit, addon) == 0)
+  {
     /* Extra check if within range */
     /* Extra check if within range */
-    if (FanOutLimit >= 1 && FanOutLimit <= MAX_UNICAST_NEIGHBORS) {
+    if (FanOutLimit >= 1 && FanOutLimit <= MAX_UNICAST_NEIGHBORS)
+    {
       return 0;
     }
   }
       return 0;
     }
   }
@@ -1223,31 +1518,33 @@ SetFanOutLimit(const char *value, void *data __attribute__ ((unused)), set_plugi
  * Return     : fail (0) or success (1)
  * Data Used  : BmfThreadRunning, BmfThread
  * ------------------------------------------------------------------------- */
  * Return     : fail (0) or success (1)
  * Data Used  : BmfThreadRunning, BmfThread
  * ------------------------------------------------------------------------- */
-int
-InitBmf(struct interface *skipThisIntf)
+int InitBmf(struct interface* skipThisIntf)
 {
   CreateBmfNetworkInterfaces(skipThisIntf);
 
   /* Start running the multicast packet processing thread */
   BmfThreadRunning = 1;
 {
   CreateBmfNetworkInterfaces(skipThisIntf);
 
   /* Start running the multicast packet processing thread */
   BmfThreadRunning = 1;
-  if (pthread_create(&BmfThread, NULL, BmfRun, NULL) != 0) {
+  if (pthread_create(&BmfThread, NULL, BmfRun, NULL) != 0)
+  {
     BmfPError("pthread_create() error");
     return 0;
   }
 
     BmfPError("pthread_create() error");
     return 0;
   }
 
-  if (EtherTunTapFd >= 0) {
+  if (EtherTunTapFd >= 0)
+  {
     /* Deactivate IP spoof filter for EtherTunTap interface */
     DeactivateSpoofFilter();
 
     /* If the BMF network interface has a sensible IP address, it is a good idea
      * to route all multicast traffic through that interface */
     /* Deactivate IP spoof filter for EtherTunTap interface */
     DeactivateSpoofFilter();
 
     /* If the BMF network interface has a sensible IP address, it is a good idea
      * to route all multicast traffic through that interface */
-    if (EtherTunTapIp != ETHERTUNTAPDEFAULTIP) {
+    if (EtherTunTapIp != ETHERTUNTAPDEFAULTIP)
+    {
       AddMulticastRoute();
     }
   }
 
   return 1;
       AddMulticastRoute();
     }
   }
 
   return 1;
-}                               /* InitBmf */
+} /* InitBmf */
 
 /* -------------------------------------------------------------------------
  * Function   : CloseBmf
 
 /* -------------------------------------------------------------------------
  * Function   : CloseBmf
@@ -1257,10 +1554,10 @@ InitBmf(struct interface *skipThisIntf)
  * Return     : none
  * Data Used  : BmfThread
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : BmfThread
  * ------------------------------------------------------------------------- */
-void
-CloseBmf(void)
+void CloseBmf(void)
 {
 {
-  if (EtherTunTapFd >= 0) {
+  if (EtherTunTapFd >= 0)
+  {
     /* If there is a multicast route, try to delete it first */
     DeleteMulticastRoute();
 
     /* If there is a multicast route, try to delete it first */
     DeleteMulticastRoute();
 
@@ -1268,28 +1565,25 @@ CloseBmf(void)
     RestoreSpoofFilter();
   }
 
     RestoreSpoofFilter();
   }
 
-  if (BmfThreadRunning) {
+  if (BmfThreadRunning)
+  {
     /* Signal BmfThread to exit */
     /* Strangely enough, all running threads receive the SIGALRM signal. But only the
      * BMF thread is affected by this signal, having specified a handler for this
      * signal in its thread entry function BmfRun(...). */
     /* Signal BmfThread to exit */
     /* Strangely enough, all running threads receive the SIGALRM signal. But only the
      * BMF thread is affected by this signal, having specified a handler for this
      * signal in its thread entry function BmfRun(...). */
-    if (pthread_kill(BmfThread, SIGALRM) != 0) {
+    if (pthread_kill(BmfThread, SIGALRM) != 0)
+    {
       BmfPError("pthread_kill() error");
     }
 
     /* Wait for BmfThread to acknowledge */
       BmfPError("pthread_kill() error");
     }
 
     /* Wait for BmfThread to acknowledge */
-    if (pthread_join(BmfThread, NULL) != 0) {
+    if (pthread_join(BmfThread, NULL) != 0)
+    {
       BmfPError("pthread_join() error");
     }
   }
 
   /* Clean up after the BmfThread has been killed */
   CloseBmfNetworkInterfaces();
       BmfPError("pthread_join() error");
     }
   }
 
   /* Clean up after the BmfThread has been killed */
   CloseBmfNetworkInterfaces();
-}                               /* CloseBmf */
+} /* CloseBmf */
 
 
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index d291128..9987ab5 100644 (file)
@@ -7,29 +7,29 @@
  * Written by Erik Tromp.
  * All rights reserved.
  *
  * 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
 
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
  *
  * ------------------------------------------------------------------------- */
 
  *
  * ------------------------------------------------------------------------- */
 
-#include "olsrd_plugin.h"       /* union set_plugin_parameter_addon */
-#include "interfaces.h"
+#include "olsrd_plugin.h" /* union set_plugin_parameter_addon */ 
+#include "interfaces.h"   /* enum olsr_ifchg_flag */
 
 /* BMF plugin data */
 #define PLUGIN_NAME "OLSRD Basic Multicast Forwarding (BMF) plugin"
 #define PLUGIN_NAME_SHORT "OLSRD BMF"
 
 /* BMF plugin data */
 #define PLUGIN_NAME "OLSRD Basic Multicast Forwarding (BMF) plugin"
 #define PLUGIN_NAME_SHORT "OLSRD BMF"
-#define PLUGIN_VERSION "1.5.3 (" __DATE__ " " __TIME__ ")"
+#define PLUGIN_VERSION "1.6.2 (" __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_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
@@ -61,18 +61,11 @@ struct interface;
 extern int FanOutLimit;
 extern int BroadcastRetransmitCount;
 
 extern int FanOutLimit;
 extern int BroadcastRetransmitCount;
 
-void BmfPError(const char *format, ...) __attribute__ ((format(printf, 1, 2)));
-union olsr_ip_addr *MainAddressOf(union olsr_ip_addr *ip);
-void InterfaceChange(int if_index, struct interface *interf, enum olsr_ifchg_flag action);
-int SetFanOutLimit(const char *value, void *data, set_plugin_parameter_addon addon);
-int InitBmf(struct interface *skipThisIntf);
+void BmfPError(const char* format, ...) __attribute__((format(printf, 1, 2)));
+union olsr_ip_addr* MainAddressOf(union olsr_ip_addr* ip);
+void InterfaceChange(int, struct interface* interf, enum olsr_ifchg_flag action);
+int SetFanOutLimit(const char* value, void* data, set_plugin_parameter_addon addon);
+int InitBmf(struct interfaceskipThisIntf);
 void CloseBmf(void);
 
 #endif /* _BMF_BMF_H */
 void CloseBmf(void);
 
 #endif /* _BMF_BMF_H */
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index 042f4e8..5b334a1 100644 (file)
@@ -1,33 +1,32 @@
-
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands.
  * Written by Erik Tromp.
  * All rights reserved.
  *
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
 
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include "NetworkInterfaces.h"
 
 /* System includes */
 #include "NetworkInterfaces.h"
 
 /* System includes */
-#include <stddef.h>             /* NULL */
-#include <syslog.h>             /* syslog() */
-#include <string.h>             /* strerror(), strchr(), strcmp() */
-#include <errno.h>              /* errno */
-#include <unistd.h>             /* close() */
-#include <sys/ioctl.h>          /* ioctl() */
-#include <fcntl.h>              /* fcntl() */
-#include <assert.h>             /* assert() */
-#include <net/if.h>             /* socket(), ifreq, if_indextoname(), if_nametoindex() */
-#include <netinet/in.h>         /* htons() */
-#include <linux/if_ether.h>     /* ETH_P_IP */
-#include <linux/if_packet.h>    /* packet_mreq, PACKET_MR_PROMISC, PACKET_ADD_MEMBERSHIP */
-#include <linux/if_tun.h>       /* IFF_TAP */
-#include <netinet/ip.h>         /* struct ip */
-#include <netinet/udp.h>        /* SOL_UDP */
+#include <stddef.h> /* NULL */
+#include <syslog.h> /* syslog() */
+#include <string.h> /* strerror(), strchr(), strcmp() */
+#include <errno.h> /* errno */
+#include <unistd.h> /* close() */
+#include <sys/ioctl.h> /* ioctl() */
+#include <fcntl.h> /* fcntl() */
+#include <assert.h> /* assert() */
+#include <net/if.h> /* socket(), ifreq, if_indextoname(), if_nametoindex() */
+#include <netinet/in.h> /* htons() */
+#include <linux/if_ether.h> /* ETH_P_IP */
+#include <linux/if_packet.h> /* packet_mreq, PACKET_MR_PROMISC, PACKET_ADD_MEMBERSHIP */
+#include <linux/if_tun.h> /* IFF_TAP */
+#include <netinet/ip.h> /* struct ip */
+#include <netinet/udp.h> /* SOL_UDP */
 
 /* OLSRD includes */
 
 /* OLSRD includes */
-#include "olsr.h"               /* olsr_printf() */
+#include "olsr.h" /* olsr_printf() */
 #include "ipcalc.h"
 #include "ipcalc.h"
-#include "defs.h"               /* olsr_cnf */
-#include "link_set.h"           /* get_link_set() */
-#include "tc_set.h"             /* olsr_lookup_tc_entry(), olsr_lookup_tc_edge() */
-#include "net_olsr.h"           /* ipequal */
+#include "defs.h" /* olsr_cnf */
+#include "link_set.h" /* get_link_set() */
+#include "tc_set.h" /* olsr_lookup_tc_entry(), olsr_lookup_tc_edge() */
+#include "net_olsr.h" /* ipequal */
 #include "lq_plugin.h"
 
 /* Plugin includes */
 #include "lq_plugin.h"
 
 /* Plugin includes */
-#include "Packet.h"             /* IFHWADDRLEN */
-#include "Bmf.h"                /* PLUGIN_NAME, MainAddressOf() */
-#include "Address.h"            /* IsMulticast() */
+#include "Packet.h" /* IFHWADDRLEN */
+#include "Bmf.h" /* PLUGIN_NAME, MainAddressOf() */
+#include "Address.h" /* IsMulticast() */
 
 /* List of network interface objects used by BMF plugin */
 
 /* List of network interface objects used by BMF plugin */
-struct TBmfInterface *BmfInterfaces = NULL;
-struct TBmfInterface *LastBmfInterface = NULL;
+struct TBmfInterfaceBmfInterfaces = NULL;
+struct TBmfInterfaceLastBmfInterface = NULL;
 
 /* Highest-numbered open socket file descriptor. To be used as first
  * parameter in calls to select(...). */
 
 /* Highest-numbered open socket file descriptor. To be used as first
  * parameter in calls to select(...). */
@@ -129,14 +128,15 @@ int CapturePacketsOnOlsrInterfaces = 0;
  * Return     : success (0) or fail (1)
  * Data Used  : EtherTunTapIfName
  * ------------------------------------------------------------------------- */
  * Return     : success (0) or fail (1)
  * Data Used  : EtherTunTapIfName
  * ------------------------------------------------------------------------- */
-int
-SetBmfInterfaceName(const char *ifname, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon
-                    __attribute__ ((unused)))
+int SetBmfInterfaceName(
+  const char* ifname,
+  void* data __attribute__((unused)),
+  set_plugin_parameter_addon addon __attribute__((unused)))
 {
   strncpy(EtherTunTapIfName, ifname, IFNAMSIZ - 1);
 {
   strncpy(EtherTunTapIfName, ifname, IFNAMSIZ - 1);
-  EtherTunTapIfName[IFNAMSIZ - 1] = '\0';       /* Ensures null termination */
+  EtherTunTapIfName[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */
   return 0;
   return 0;
-}                               /* SetBmfInterfaceName */
+} /* SetBmfInterfaceName */
 
 /* -------------------------------------------------------------------------
  * Function   : SetBmfInterfaceIp
 
 /* -------------------------------------------------------------------------
  * Function   : SetBmfInterfaceIp
@@ -150,12 +150,14 @@ SetBmfInterfaceName(const char *ifname, void *data __attribute__ ((unused)), set
  * Data Used  : EtherTunTapIp, EtherTunTapIpMask, EtherTunTapIpBroadcast,
  *              TunTapIpOverruled
  * ------------------------------------------------------------------------- */
  * Data Used  : EtherTunTapIp, EtherTunTapIpMask, EtherTunTapIpBroadcast,
  *              TunTapIpOverruled
  * ------------------------------------------------------------------------- */
-int
-SetBmfInterfaceIp(const char *ip, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
+int SetBmfInterfaceIp(
+  const char* ip,
+  void* data __attribute__((unused)),
+  set_plugin_parameter_addon addon __attribute__((unused)))
 {
 #define IPV4_MAX_ADDRLEN 16
 #define IPV4_MAX_PREFIXLEN 32
 {
 #define IPV4_MAX_ADDRLEN 16
 #define IPV4_MAX_PREFIXLEN 32
-  char *slashAt;
+  charslashAt;
   char ipAddr[IPV4_MAX_ADDRLEN];
   struct in_addr sinaddr;
   int prefixLen;
   char ipAddr[IPV4_MAX_ADDRLEN];
   struct in_addr sinaddr;
   int prefixLen;
@@ -168,14 +170,16 @@ SetBmfInterfaceIp(const char *ip, void *data __attribute__ ((unused)), set_plugi
   slashAt = strchr(ip, '/');
 
   /* String doesn't contain slash. */
   slashAt = strchr(ip, '/');
 
   /* String doesn't contain slash. */
-  if (slashAt == NULL || slashAt - ip >= IPV4_MAX_ADDRLEN) {
+  if (slashAt == NULL || slashAt - ip >= IPV4_MAX_ADDRLEN)
+  {
     /* No prefix length specified, or IP address too long */
     return 1;
   }
 
   strncpy(ipAddr, ip, slashAt - ip);
   *(ipAddr + (slashAt - ip)) = '\0';
     /* No prefix length specified, or IP address too long */
     return 1;
   }
 
   strncpy(ipAddr, ip, slashAt - ip);
   *(ipAddr + (slashAt - ip)) = '\0';
-  if (inet_aton(ipAddr, &sinaddr) == 0) {
+  if (inet_aton(ipAddr, &sinaddr) == 0)
+  {
     /* Invalid address passed */
     return 1;
   }
     /* Invalid address passed */
     return 1;
   }
@@ -184,26 +188,29 @@ SetBmfInterfaceIp(const char *ip, void *data __attribute__ ((unused)), set_plugi
 
   /* Get prefix length. */
   prefixLen = atoi(++slashAt);
 
   /* Get prefix length. */
   prefixLen = atoi(++slashAt);
-  if (prefixLen <= 0 || prefixLen > IPV4_MAX_PREFIXLEN) {
+  if (prefixLen <= 0 || prefixLen > IPV4_MAX_PREFIXLEN)
+  {
     return 1;
   }
 
   /* Compose IP subnet mask in host byte order */
   EtherTunTapIpMask = 0;
     return 1;
   }
 
   /* Compose IP subnet mask in host byte order */
   EtherTunTapIpMask = 0;
-  for (i = 0; i < prefixLen; i++) {
+  for (i = 0; i < prefixLen; i++)
+  {
     EtherTunTapIpMask |= (1 << (IPV4_MAX_PREFIXLEN - 1 - i));
   }
 
   /* Compose IP broadcast address in host byte order */
   EtherTunTapIpBroadcast = EtherTunTapIp;
     EtherTunTapIpMask |= (1 << (IPV4_MAX_PREFIXLEN - 1 - i));
   }
 
   /* Compose IP broadcast address in host byte order */
   EtherTunTapIpBroadcast = EtherTunTapIp;
-  for (i = prefixLen; i < IPV4_MAX_PREFIXLEN; i++) {
+  for (i = prefixLen; i < IPV4_MAX_PREFIXLEN; i++)
+  {
     EtherTunTapIpBroadcast |= (1 << (IPV4_MAX_PREFIXLEN - 1 - i));
   }
 
   TunTapIpOverruled = 1;
 
   return 0;
     EtherTunTapIpBroadcast |= (1 << (IPV4_MAX_PREFIXLEN - 1 - i));
   }
 
   TunTapIpOverruled = 1;
 
   return 0;
-}                               /* SetBmfInterfaceIp */
+} /* SetBmfInterfaceIp */
 
 /* -------------------------------------------------------------------------
  * Function   : SetCapturePacketsOnOlsrInterfaces
 
 /* -------------------------------------------------------------------------
  * Function   : SetCapturePacketsOnOlsrInterfaces
@@ -216,21 +223,25 @@ SetBmfInterfaceIp(const char *ip, void *data __attribute__ ((unused)), set_plugi
  * Return     : success (0) or fail (1)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : success (0) or fail (1)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int
-SetCapturePacketsOnOlsrInterfaces(const char *enable, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon
-                                  __attribute__ ((unused)))
+int SetCapturePacketsOnOlsrInterfaces(
+  const char* enable,
+  void* data __attribute__((unused)),
+  set_plugin_parameter_addon addon __attribute__((unused)))
 {
 {
-  if (strcmp(enable, "yes") == 0) {
+  if (strcmp(enable, "yes") == 0)
+  {
     CapturePacketsOnOlsrInterfaces = 1;
     return 0;
     CapturePacketsOnOlsrInterfaces = 1;
     return 0;
-  } else if (strcmp(enable, "no") == 0) {
+  }
+  else if (strcmp(enable, "no") == 0)
+  {
     CapturePacketsOnOlsrInterfaces = 0;
     return 0;
   }
 
   /* Value not recognized */
   return 1;
     CapturePacketsOnOlsrInterfaces = 0;
     return 0;
   }
 
   /* Value not recognized */
   return 1;
-}                               /* SetCapturePacketsOnOlsrInterfaces */
+} /* SetCapturePacketsOnOlsrInterfaces */
 
 /* -------------------------------------------------------------------------
  * Function   : SetBmfMechanism
 
 /* -------------------------------------------------------------------------
  * Function   : SetBmfMechanism
@@ -243,21 +254,25 @@ SetCapturePacketsOnOlsrInterfaces(const char *enable, void *data __attribute__ (
  * Return     : success (0) or fail (1)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : success (0) or fail (1)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int
-SetBmfMechanism(const char *mechanism, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon
-                __attribute__ ((unused)))
+int SetBmfMechanism(
+  const char* mechanism,
+  void* data __attribute__((unused)),
+  set_plugin_parameter_addon addon __attribute__((unused)))
 {
 {
-  if (strcmp(mechanism, "Broadcast") == 0) {
+  if (strcmp(mechanism, "Broadcast") == 0)
+  {
     BmfMechanism = BM_BROADCAST;
     return 0;
     BmfMechanism = BM_BROADCAST;
     return 0;
-  } else if (strcmp(mechanism, "UnicastPromiscuous") == 0) {
+  }
+  else if (strcmp(mechanism, "UnicastPromiscuous") == 0)
+  {
     BmfMechanism = BM_UNICAST_PROMISCUOUS;
     return 0;
   }
 
   /* Value not recognized */
   return 1;
     BmfMechanism = BM_UNICAST_PROMISCUOUS;
     return 0;
   }
 
   /* Value not recognized */
   return 1;
-}                               /* SetBmfMechanism */
+} /* SetBmfMechanism */
 
 /* -------------------------------------------------------------------------
  * Function   : AddDescriptorToInputSet
 
 /* -------------------------------------------------------------------------
  * Function   : AddDescriptorToInputSet
@@ -268,17 +283,17 @@ SetBmfMechanism(const char *mechanism, void *data __attribute__ ((unused)), set_
  * Data Used  : HighestSkfd, InputSet
  * Notes      : Keeps track of the highest-numbered descriptor
  * ------------------------------------------------------------------------- */
  * Data Used  : HighestSkfd, InputSet
  * Notes      : Keeps track of the highest-numbered descriptor
  * ------------------------------------------------------------------------- */
-static void
-AddDescriptorToInputSet(int skfd)
+static void AddDescriptorToInputSet(int skfd)
 {
   /* Keep the highest-numbered descriptor */
 {
   /* Keep the highest-numbered descriptor */
-  if (skfd > HighestSkfd) {
+  if (skfd > HighestSkfd)
+  {
     HighestSkfd = skfd;
   }
 
   /* Add descriptor to input set */
   FD_SET(skfd, &InputSet);
     HighestSkfd = skfd;
   }
 
   /* Add descriptor to input set */
   FD_SET(skfd, &InputSet);
-}                               /* AddDescriptorToInputSet */
+} /* AddDescriptorToInputSet */
 
 /* To save the state of the IP spoof filter for the EtherTunTap interface */
 static char EthTapSpoofState = '1';
 
 /* To save the state of the IP spoof filter for the EtherTunTap interface */
 static char EthTapSpoofState = '1';
@@ -293,10 +308,9 @@ static char EthTapSpoofState = '1';
  * Data Used  : EtherTunTapIfName, EthTapSpoofState
  * Notes      : Saves the current filter state for later restoring
  * ------------------------------------------------------------------------- */
  * Data Used  : EtherTunTapIfName, EthTapSpoofState
  * Notes      : Saves the current filter state for later restoring
  * ------------------------------------------------------------------------- */
-int
-DeactivateSpoofFilter(void)
+int DeactivateSpoofFilter(void)
 {
 {
-  FILE *procSpoof;
+  FILEprocSpoof;
   char procFile[FILENAME_MAX];
 
   /* Generate the procfile name */
   char procFile[FILENAME_MAX];
 
   /* Generate the procfile name */
@@ -304,12 +318,17 @@ DeactivateSpoofFilter(void)
 
   /* Open procfile for reading */
   procSpoof = fopen(procFile, "r");
 
   /* Open procfile for reading */
   procSpoof = fopen(procFile, "r");
-  if (procSpoof == NULL) {
-    fprintf(stderr,
-            "WARNING! Could not open the %s file to check/disable the IP spoof filter!\n" "Are you using the procfile filesystem?\n"
-            "Does your system support IPv4?\n" "I will continue (in 3 sec) - but you should manually ensure that IP spoof\n"
-            "filtering is disabled!\n\n", procFile);
-
+  if (procSpoof == NULL)
+  {
+    fprintf(
+      stderr,
+      "WARNING! Could not open the %s file to check/disable the IP spoof filter!\n"
+      "Are you using the procfile filesystem?\n"
+      "Does your system support IPv4?\n"
+      "I will continue (in 3 sec) - but you should manually ensure that IP spoof\n"
+      "filtering is disabled!\n\n",
+      procFile);
+      
     sleep(3);
     return 0;
   }
     sleep(3);
     return 0;
   }
@@ -319,9 +338,13 @@ DeactivateSpoofFilter(void)
 
   /* Open procfile for writing */
   procSpoof = fopen(procFile, "w");
 
   /* Open procfile for writing */
   procSpoof = fopen(procFile, "w");
-  if (procSpoof == NULL) {
+  if (procSpoof == NULL)
+  {
     fprintf(stderr, "Could not open %s for writing!\n", procFile);
     fprintf(stderr, "Could not open %s for writing!\n", procFile);
-    fprintf(stderr, "I will continue (in 3 sec) - but you should manually ensure that IP" " spoof filtering is disabled!\n\n");
+    fprintf(
+      stderr,
+      "I will continue (in 3 sec) - but you should manually ensure that IP"
+      " spoof filtering is disabled!\n\n");
     sleep(3);
     return 0;
   }
     sleep(3);
     return 0;
   }
@@ -332,7 +355,7 @@ DeactivateSpoofFilter(void)
   fclose(procSpoof);
 
   return 1;
   fclose(procSpoof);
 
   return 1;
-}                               /* DeactivateSpoofFilter */
+} /* DeactivateSpoofFilter */
 
 /* -------------------------------------------------------------------------
  * Function   : RestoreSpoofFilter
 
 /* -------------------------------------------------------------------------
  * Function   : RestoreSpoofFilter
@@ -343,10 +366,9 @@ DeactivateSpoofFilter(void)
  * Return     : none
  * Data Used  : EtherTunTapIfName, EthTapSpoofState
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : EtherTunTapIfName, EthTapSpoofState
  * ------------------------------------------------------------------------- */
-void
-RestoreSpoofFilter(void)
+void RestoreSpoofFilter(void)
 {
 {
-  FILE *procSpoof;
+  FILEprocSpoof;
   char procFile[FILENAME_MAX];
 
   /* Generate the procfile name */
   char procFile[FILENAME_MAX];
 
   /* Generate the procfile name */
@@ -354,22 +376,25 @@ RestoreSpoofFilter(void)
 
   /* Open procfile for writing */
   procSpoof = fopen(procFile, "w");
 
   /* Open procfile for writing */
   procSpoof = fopen(procFile, "w");
-  if (procSpoof == NULL) {
+  if (procSpoof == NULL)
+  {
     fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procFile);
     fprintf(stderr, "Could not open %s for writing!\nSettings not restored!\n", procFile);
-  } else {
+  }
+  else
+  {
     syslog(LOG_INFO, "Resetting %s to %c\n", procFile, EthTapSpoofState);
 
     fputc(EthTapSpoofState, procSpoof);
     fclose(procSpoof);
   }
     syslog(LOG_INFO, "Resetting %s to %c\n", procFile, EthTapSpoofState);
 
     fputc(EthTapSpoofState, procSpoof);
     fclose(procSpoof);
   }
-}                               /* RestoreSpoofFilter */
+} /* RestoreSpoofFilter */
 
 /* -------------------------------------------------------------------------
  * Function   : FindNeighbors
  * Description: Find the neighbors on a network interface to forward a BMF
  *              packet to
  * Input      : intf - the network interface
 
 /* -------------------------------------------------------------------------
  * Function   : FindNeighbors
  * Description: Find the neighbors on a network interface to forward a BMF
  *              packet to
  * Input      : intf - the network interface
- *              source - the source IP address of the BMF packet
+ *              source - the source IP address of the BMF packet 
  *              forwardedBy - the IP address of the node that forwarded the BMF
  *                packet
  *              forwardedTo - the IP address of the node to which the BMF packet
  *              forwardedBy - the IP address of the node that forwarded the BMF
  *                packet
  *              forwardedTo - the IP address of the node to which the BMF packet
@@ -380,61 +405,88 @@ RestoreSpoofFilter(void)
  *              nPossibleNeighbors - number of found possible neighbors
  * Data Used  : FanOutLimit
  * ------------------------------------------------------------------------- */
  *              nPossibleNeighbors - number of found possible neighbors
  * Data Used  : FanOutLimit
  * ------------------------------------------------------------------------- */
-void
-FindNeighbors(struct TBestNeighbors *neighbors, struct link_entry **bestNeighbor, struct TBmfInterface *intf,
-              union olsr_ip_addr *source, union olsr_ip_addr *forwardedBy, union olsr_ip_addr *forwardedTo, int *nPossibleNeighbors)
+void FindNeighbors(
+  struct TBestNeighbors* neighbors,
+  struct link_entry** bestNeighbor,
+  struct TBmfInterface* intf,
+  union olsr_ip_addr* source,
+  union olsr_ip_addr* forwardedBy,
+  union olsr_ip_addr* forwardedTo,
+  int* nPossibleNeighbors)
 {
 {
+#ifndef NODEBUG
+  struct ipaddr_str buf;
+#endif
   int i;
 
   /* Initialize */
   *bestNeighbor = NULL;
   int i;
 
   /* Initialize */
   *bestNeighbor = NULL;
-  for (i = 0; i < MAX_UNICAST_NEIGHBORS; i++) {
+  for (i = 0; i < MAX_UNICAST_NEIGHBORS; i++)
+  {
     neighbors->links[i] = NULL;
   }
   *nPossibleNeighbors = 0;
 
   /* handle the non-LQ case */
 
     neighbors->links[i] = NULL;
   }
   *nPossibleNeighbors = 0;
 
   /* handle the non-LQ case */
 
-  if (olsr_cnf->lq_level == 0) {
-    struct link_entry *walker;
+  if (olsr_cnf->lq_level == 0)
+  {
+    struct link_entry* walker;
 
 
+    /* Assumption: olsr_mutex has been grabbed for safe access to OLSR data */
     OLSR_FOR_ALL_LINK_ENTRIES(walker) {
     OLSR_FOR_ALL_LINK_ENTRIES(walker) {
-      struct ipaddr_str buf;
-      union olsr_ip_addr *neighborMainIp;
+      union olsr_ip_addr* neighborMainIp;
 
       /* Consider only links from the specified interface */
 
       /* Consider only links from the specified interface */
-      if (!ipequal(&intf->intAddr, &walker->local_iface_addr)) {
-        continue;               /* for */
+      if (! ipequal(&intf->intAddr, &walker->local_iface_addr))
+      {
+        continue; /* for */
       }
 
       }
 
-      OLSR_PRINTF(8, "%s: ----> Considering forwarding pkt on \"%s\" to %s\n", PLUGIN_NAME_SHORT, intf->ifName,
-                  olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+      OLSR_PRINTF(
+        8,
+        "%s: ----> Considering forwarding pkt on \"%s\" to %s\n",
+        PLUGIN_NAME_SHORT,
+        intf->ifName,
+        olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
 
       neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr);
 
       /* Consider only neighbors with an IP address that differs from the
        * passed IP addresses (if passed). Rely on short-circuit boolean evaluation. */
 
       neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr);
 
       /* Consider only neighbors with an IP address that differs from the
        * passed IP addresses (if passed). Rely on short-circuit boolean evaluation. */
-      if (source != NULL && ipequal(neighborMainIp, MainAddressOf(source))) {
-        OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: is source of pkt\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-
-        continue;               /* for */
+      if (source != NULL && ipequal(neighborMainIp, MainAddressOf(source)))
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: is source of pkt\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+
+        continue; /* for */
       }
 
       /* Rely on short-circuit boolean evaluation */
       }
 
       /* Rely on short-circuit boolean evaluation */
-      if (forwardedBy != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedBy))) {
-        OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: is the node that forwarded the pkt\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-
-        continue;               /* for */
+      if (forwardedBy != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedBy)))
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: is the node that forwarded the pkt\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+
+        continue; /* for */
       }
 
       /* Rely on short-circuit boolean evaluation */
       }
 
       /* Rely on short-circuit boolean evaluation */
-      if (forwardedTo != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedTo))) {
-        OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: is the node to which the pkt was forwarded\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-
-        continue;               /* for */
+      if (forwardedTo != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedTo)))
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: is the node to which the pkt was forwarded\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+
+        continue; /* for */
       }
 
       /* Found a candidate neighbor to direct our packet to */
       }
 
       /* Found a candidate neighbor to direct our packet to */
@@ -443,154 +495,207 @@ FindNeighbors(struct TBestNeighbors *neighbors, struct link_entry **bestNeighbor
        * by quality or cost. So just remember the first found link.
        * TODO: come on, there must be something better than to simply
        * select the first one found! */
        * by quality or cost. So just remember the first found link.
        * TODO: come on, there must be something better than to simply
        * select the first one found! */
-      if (*bestNeighbor == NULL) {
+      if (*bestNeighbor == NULL)
+      {
         *bestNeighbor = walker;
       }
 
       /* Fill the list with up to 'FanOutLimit' neighbors. If there
        * are more neighbors, broadcast is used instead of unicast. In that
        * case we do not need the list of neighbors. */
         *bestNeighbor = walker;
       }
 
       /* Fill the list with up to 'FanOutLimit' neighbors. If there
        * are more neighbors, broadcast is used instead of unicast. In that
        * case we do not need the list of neighbors. */
-      if (*nPossibleNeighbors < FanOutLimit) {
+      if (*nPossibleNeighbors < FanOutLimit)
+      {
         neighbors->links[*nPossibleNeighbors] = walker;
       }
 
       *nPossibleNeighbors += 1;
         neighbors->links[*nPossibleNeighbors] = walker;
       }
 
       *nPossibleNeighbors += 1;
-    }
-    OLSR_FOR_ALL_LINK_ENTRIES_END(walker);
+    } OLSR_FOR_ALL_LINK_ENTRIES_END(walker);
 
   }
   /* handle the LQ case */
 
   }
   /* handle the LQ case */
-  else {
+  else
+  {
 #ifdef USING_THALES_LINK_COST_ROUTING
 
 #ifdef USING_THALES_LINK_COST_ROUTING
 
-    struct link_entry *walker;
+    struct link_entrywalker;
     float previousLinkCost = 2 * INFINITE_COST;
     float bestLinkCost = 2 * INFINITE_COST;
 
     float previousLinkCost = 2 * INFINITE_COST;
     float bestLinkCost = 2 * INFINITE_COST;
 
-    if (forwardedBy != NULL) {
+    if (forwardedBy != NULL)
+    {
       /* Retrieve the cost of the link from 'forwardedBy' to myself */
       /* Retrieve the cost of the link from 'forwardedBy' to myself */
-      struct link_entry *bestLinkFromForwarder = get_best_link_to_neighbor(forwardedBy);
-      if (bestLinkFromForwarder != NULL) {
+      struct link_entry* bestLinkFromForwarder = get_best_link_to_neighbor(forwardedBy);
+      if (bestLinkFromForwarder != NULL)
+      {
         previousLinkCost = bestLinkFromForwarder->link_cost;
       }
     }
 
         previousLinkCost = bestLinkFromForwarder->link_cost;
       }
     }
 
-    /* TODO: get_link_set() is not thread-safe! */
-    for (walker = get_link_set(); walker != NULL; walker = walker->next) {
-      struct ipaddr_str buf;
-      union olsr_ip_addr *neighborMainIp;
-      struct link_entry *bestLinkToNeighbor;
-      struct tc_entry *tcLastHop;
+    /* Assumption: olsr_mutex has been grabbed for safe access to OLSR data */
+    for (walker = get_link_set(); walker != NULL; walker = walker->next) 
+    {
+      union olsr_ip_addrneighborMainIp;
+      struct link_entrybestLinkToNeighbor;
+      struct tc_entrytcLastHop;
 
       /* Consider only links from the specified interface */
 
       /* Consider only links from the specified interface */
-      if (!ipequal(&intf->intAddr, &walker->local_iface_addr)) {
-        continue;               /* for */
+      if (! ipequal(&intf->intAddr, &walker->local_iface_addr))
+      {
+        continue; /* for */
       }
 
       }
 
-      OLSR_PRINTF(9, "%s: ----> Considering forwarding pkt on \"%s\" to %s\n", PLUGIN_NAME_SHORT, intf->ifName,
-                  olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+      OLSR_PRINTF(
+        9,
+        "%s: ----> Considering forwarding pkt on \"%s\" to %s\n",
+        PLUGIN_NAME_SHORT,
+        intf->ifName,
+        olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
 
       neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr);
 
       /* Consider only neighbors with an IP address that differs from the
        * passed IP addresses (if passed). Rely on short-circuit boolean evaluation. */
 
       neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr);
 
       /* Consider only neighbors with an IP address that differs from the
        * passed IP addresses (if passed). Rely on short-circuit boolean evaluation. */
-      if (source != NULL && ipequal(neighborMainIp, MainAddressOf(source))) {
-        OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: is source of pkt\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-
-        continue;               /* for */
+      if (source != NULL && ipequal(neighborMainIp, MainAddressOf(source)))
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: is source of pkt\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+
+        continue; /* for */
       }
 
       /* Rely on short-circuit boolean evaluation */
       }
 
       /* Rely on short-circuit boolean evaluation */
-      if (forwardedBy != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedBy))) {
-        OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: is the node that forwarded the pkt\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-
-        continue;               /* for */
+      if (forwardedBy != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedBy)))
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: is the node that forwarded the pkt\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+
+        continue; /* for */
       }
 
       /* Rely on short-circuit boolean evaluation */
       }
 
       /* Rely on short-circuit boolean evaluation */
-      if (forwardedTo != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedTo))) {
-        OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: is the node to which the pkt was forwarded\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-
-        continue;               /* for */
+      if (forwardedTo != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedTo)))
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: is the node to which the pkt was forwarded\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+
+        continue; /* for */
       }
 
       /* Found a candidate neighbor to direct our packet to */
 
       }
 
       /* 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(&buf, &walker->neighbor_iface_addr));
+      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(&buf, &walker->neighbor_iface_addr));
 
 
-        continue;               /* for */
+        continue; /* for */
       }
 
       /* Compare costs to check if the candidate neighbor is best reached via 'intf' */
       }
 
       /* Compare costs to check if the candidate neighbor is best reached via 'intf' */
-      OLSR_PRINTF(9, "%s: ----> Forwarding pkt to %s will cost %5.2f\n", PLUGIN_NAME_SHORT,
-                  olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), walker->link_cost);
-
-      /* If the candidate neighbor is best reached via another interface, then skip
+      OLSR_PRINTF(
+        9,
+        "%s: ----> Forwarding pkt to %s will cost %5.2f\n",
+        PLUGIN_NAME_SHORT,
+        olsr_ip_to_string(&buf, &walker->neighbor_iface_addr),
+        walker->link_cost);
+
+      /* If the candidate neighbor is best reached via another interface, then skip 
        * the candidate neighbor; the candidate neighbor has been / will be selected via that
        * other interface.
        * the candidate neighbor; the candidate neighbor has been / will be selected via that
        * other interface.
-       * TODO: get_best_link_to_neighbor() is not thread-safe. */
+       * Assumption: olsr_mutex has been grabbed for safe access to OLSR data. */
       bestLinkToNeighbor = get_best_link_to_neighbor(&walker->neighbor_iface_addr);
 
       bestLinkToNeighbor = get_best_link_to_neighbor(&walker->neighbor_iface_addr);
 
-      if (walker != bestLinkToNeighbor) {
-        if (bestLinkToNeighbor == NULL) {
-          OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: no link found\n", PLUGIN_NAME_SHORT,
-                      olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-        } else {
-          struct interface *bestIntf = if_ifwithaddr(&bestLinkToNeighbor->local_iface_addr);
-
-          OLSR_PRINTF(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(&buf, &walker->neighbor_iface_addr), bestIntf->int_name,
-                      bestLinkToNeighbor->link_cost);
+      if (walker != bestLinkToNeighbor)
+      {
+        if (bestLinkToNeighbor == NULL)
+        {
+          OLSR_PRINTF(
+            9,
+            "%s: ----> Not forwarding to %s: no link found\n",
+            PLUGIN_NAME_SHORT,
+            olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+        }
+        else
+        {
+          struct interface* bestIntf = if_ifwithaddr(&bestLinkToNeighbor->local_iface_addr);
+
+          OLSR_PRINTF(
+            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(&buf, &walker->neighbor_iface_addr),
+            bestIntf->int_name,
+            bestLinkToNeighbor->link_cost);
         }
 
         }
 
-        continue;               /* for */
+        continue; /* for */
       }
 
       }
 
-      if (forwardedBy != NULL) {
-        struct ipaddr_str forwardedByBuf, niaBuf;
-        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(&forwardedByBuf, forwardedBy), olsr_ip_to_string(&niaBuf, &walker->neighbor_iface_addr),
-                    previousLinkCost + walker->link_cost);
+      if (forwardedBy != NULL)
+      {
+        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(&forwardedByBuf, forwardedBy),
+          olsr_ip_to_string(&niaBuf, &walker->neighbor_iface_addr),
+          previousLinkCost + walker->link_cost);
       }
 
       /* Check the topology table whether the 'forwardedBy' node is itself a direct
        * neighbor of the candidate neighbor, at a lower cost than the 2-hop route
        * via myself. If so, we do not need to forward the BMF packet to the candidate
        * neighbor, because the 'forwardedBy' node will forward the packet. */
       }
 
       /* Check the topology table whether the 'forwardedBy' node is itself a direct
        * neighbor of the candidate neighbor, at a lower cost than the 2-hop route
        * via myself. If so, we do not need to forward the BMF packet to the candidate
        * neighbor, because the 'forwardedBy' node will forward the packet. */
-      if (forwardedBy != NULL) {
-        /* TODO: olsr_lookup_tc_entry() is not thread-safe. */
+      if (forwardedBy != NULL)
+      {
+        /* Assumption: olsr_mutex has been grabbed for safe access to OLSR data */
         tcLastHop = olsr_lookup_tc_entry(MainAddressOf(forwardedBy));
         tcLastHop = olsr_lookup_tc_entry(MainAddressOf(forwardedBy));
-        if (tcLastHop != NULL) {
-          struct tc_edge_entry *tc_edge;
+        if (tcLastHop != NULL)
+        {
+          struct tc_edge_entry* tc_edge;
 
 
-          /* TODO: olsr_lookup_tc_edge() is not thread-safe. */
+          /* Assumption: olsr_mutex has been grabbed for safe access to OLSR data */
           tc_edge = olsr_lookup_tc_edge(tcLastHop, MainAddressOf(&walker->neighbor_iface_addr));
           tc_edge = olsr_lookup_tc_edge(tcLastHop, MainAddressOf(&walker->neighbor_iface_addr));
-
+          
           /* We are not interested in dead-end or dying edges. */
           /* We are not interested in dead-end or dying edges. */
-          if (tc_edge != NULL && (tc_edge->flags & OLSR_TC_EDGE_DOWN) == 0) {
-            if (previousLinkCost + walker->link_cost > tc_edge->link_cost) {
+          if (tc_edge != NULL && (tc_edge->flags & OLSR_TC_EDGE_DOWN) == 0)
+          {
+            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
 #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 */
-      }
+              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 */
 
 
-      /* if */
       /* Remember the best neighbor. If all are very bad, remember none. */
       /* Remember the best neighbor. If all are very bad, remember none. */
-      if (walker->link_cost < bestLinkCost) {
+      if (walker->link_cost < bestLinkCost)
+      {
         *bestNeighbor = walker;
         bestLinkCost = walker->link_cost;
       }
         *bestNeighbor = walker;
         bestLinkCost = walker->link_cost;
       }
@@ -598,155 +703,207 @@ FindNeighbors(struct TBestNeighbors *neighbors, struct link_entry **bestNeighbor
       /* Fill the list with up to 'FanOutLimit' neighbors. If there
        * are more neighbors, broadcast is used instead of unicast. In that
        * case we do not need the list of neighbors. */
       /* Fill the list with up to 'FanOutLimit' neighbors. If there
        * are more neighbors, broadcast is used instead of unicast. In that
        * case we do not need the list of neighbors. */
-      if (*nPossibleNeighbors < FanOutLimit) {
+      if (*nPossibleNeighbors < FanOutLimit)
+      {
         neighbors->links[*nPossibleNeighbors] = walker;
       }
 
       *nPossibleNeighbors += 1;
 
         neighbors->links[*nPossibleNeighbors] = walker;
       }
 
       *nPossibleNeighbors += 1;
 
-    }                           /* for */
+    } /* for */
 
 #else /* USING_THALES_LINK_COST_ROUTING */
 
 #else /* USING_THALES_LINK_COST_ROUTING */
-
-    struct link_entry *walker;
+        
+    struct link_entrywalker;
     olsr_linkcost previousLinkEtx = LINK_COST_BROKEN;
     olsr_linkcost bestEtx = LINK_COST_BROKEN;
 
     olsr_linkcost previousLinkEtx = LINK_COST_BROKEN;
     olsr_linkcost bestEtx = LINK_COST_BROKEN;
 
-    if (forwardedBy != NULL) {
+    if (forwardedBy != NULL)
+    {
       /* Retrieve the cost of the link from 'forwardedBy' to myself */
       /* Retrieve the cost of the link from 'forwardedBy' to myself */
-      struct link_entry *bestLinkFromForwarder = get_best_link_to_neighbor(forwardedBy);
-      if (bestLinkFromForwarder != NULL) {
+      struct link_entry* bestLinkFromForwarder = get_best_link_to_neighbor(forwardedBy);
+      if (bestLinkFromForwarder != NULL)
+      {
         previousLinkEtx = bestLinkFromForwarder->linkcost;
       }
     }
 
         previousLinkEtx = bestLinkFromForwarder->linkcost;
       }
     }
 
+    /* Assumption: olsr_mutex has been grabbed for safe access to OLSR data */
     OLSR_FOR_ALL_LINK_ENTRIES(walker) {
     OLSR_FOR_ALL_LINK_ENTRIES(walker) {
-      struct ipaddr_str buf;
-      union olsr_ip_addr *neighborMainIp;
-      struct link_entry *bestLinkToNeighbor;
-      struct tc_entry *tcLastHop;
+      union olsr_ip_addr* neighborMainIp;
+      struct link_entry* bestLinkToNeighbor;
+      struct tc_entry* tcLastHop;
       float currEtx;
       float currEtx;
-
       /* Consider only links from the specified interface */
       /* Consider only links from the specified interface */
-      if (!ipequal(&intf->intAddr, &walker->local_iface_addr)) {
-        continue;               /* for */
+      if (! ipequal(&intf->intAddr, &walker->local_iface_addr))
+      {
+        continue; /* for */
       }
 
       }
 
-      OLSR_PRINTF(9, "%s: ----> Considering forwarding pkt on \"%s\" to %s\n", PLUGIN_NAME_SHORT, intf->ifName,
-                  olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+      OLSR_PRINTF(
+        9,
+        "%s: ----> Considering forwarding pkt on \"%s\" to %s\n",
+        PLUGIN_NAME_SHORT,
+        intf->ifName,
+        olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
 
       neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr);
 
       /* Consider only neighbors with an IP address that differs from the
        * passed IP addresses (if passed). Rely on short-circuit boolean evaluation. */
 
       neighborMainIp = MainAddressOf(&walker->neighbor_iface_addr);
 
       /* Consider only neighbors with an IP address that differs from the
        * passed IP addresses (if passed). Rely on short-circuit boolean evaluation. */
-      if (source != NULL && ipequal(neighborMainIp, MainAddressOf(source))) {
-        OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: is source of pkt\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-
-        continue;               /* for */
+      if (source != NULL && ipequal(neighborMainIp, MainAddressOf(source)))
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: is source of pkt\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+
+        continue; /* for */
       }
 
       /* Rely on short-circuit boolean evaluation */
       }
 
       /* Rely on short-circuit boolean evaluation */
-      if (forwardedBy != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedBy))) {
-        OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: is the node that forwarded the pkt\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-
-        continue;               /* for */
+      if (forwardedBy != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedBy)))
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: is the node that forwarded the pkt\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+
+        continue; /* for */
       }
 
       /* Rely on short-circuit boolean evaluation */
       }
 
       /* Rely on short-circuit boolean evaluation */
-      if (forwardedTo != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedTo))) {
-        OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: is the node to which the pkt was forwarded\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-
-        continue;               /* for */
+      if (forwardedTo != NULL && ipequal(neighborMainIp, MainAddressOf(forwardedTo)))
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: is the node to which the pkt was forwarded\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+
+        continue; /* for */
       }
 
       /* Found a candidate neighbor to direct our packet to */
 
       /* Calculate the link quality (ETX) of the link to the found neighbor */
       currEtx = walker->linkcost;
       }
 
       /* Found a candidate neighbor to direct our packet to */
 
       /* Calculate the link quality (ETX) of the link to the found neighbor */
       currEtx = walker->linkcost;
-
-      if (currEtx >= LINK_COST_BROKEN) {
-        OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: link is timing out\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-
-        continue;               /* for */
+      if (currEtx >= LINK_COST_BROKEN)
+      {
+        OLSR_PRINTF(
+          9,
+          "%s: ----> Not forwarding to %s: link is timing out\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+
+        continue; /* for */
       }
 
       /* Compare costs to check if the candidate neighbor is best reached via 'intf' */
       }
 
       /* Compare costs to check if the candidate neighbor is best reached via 'intf' */
-      OLSR_PRINTF(9, "%s: ----> Forwarding pkt to %s will cost ETX %5.2f\n", PLUGIN_NAME_SHORT,
-                  olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), currEtx);
-
-      /* If the candidate neighbor is best reached via another interface, then skip
+      OLSR_PRINTF(
+        9,
+        "%s: ----> Forwarding pkt to %s will cost ETX %5.2f\n",
+        PLUGIN_NAME_SHORT,
+        olsr_ip_to_string(&buf, &walker->neighbor_iface_addr),
+        currEtx);
+
+      /* If the candidate neighbor is best reached via another interface, then skip 
        * the candidate neighbor; the candidate neighbor has been / will be selected via that
        * other interface.
        * the candidate neighbor; the candidate neighbor has been / will be selected via that
        * other interface.
-       * TODO: get_best_link_to_neighbor() is not thread-safe. */
+       * Assumption: olsr_mutex has been grabbed for safe access to OLSR data. */
       bestLinkToNeighbor = get_best_link_to_neighbor(&walker->neighbor_iface_addr);
 
       bestLinkToNeighbor = get_best_link_to_neighbor(&walker->neighbor_iface_addr);
 
-      if (walker != bestLinkToNeighbor) {
-        if (bestLinkToNeighbor == NULL) {
-          OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: no link found\n", PLUGIN_NAME_SHORT,
-                      olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
-        } else {
+      if (walker != bestLinkToNeighbor)
+      {
+        if (bestLinkToNeighbor == NULL)
+        {
+          OLSR_PRINTF(
+            9,
+            "%s: ----> Not forwarding to %s: no link found\n",
+            PLUGIN_NAME_SHORT,
+            olsr_ip_to_string(&buf, &walker->neighbor_iface_addr));
+        }
+        else
+        {
 #ifndef NODEBUG
 #ifndef NODEBUG
-          struct interface *bestIntf = if_ifwithaddr(&bestLinkToNeighbor->local_iface_addr);
+          struct interfacebestIntf = if_ifwithaddr(&bestLinkToNeighbor->local_iface_addr);
           struct lqtextbuffer lqbuffer;
 #endif
           struct lqtextbuffer lqbuffer;
 #endif
-          OLSR_PRINTF(9, "%s: ----> Not forwarding to %s: \"%s\" gives a better link to this neighbor, costing %s\n",
-                      PLUGIN_NAME_SHORT, olsr_ip_to_string(&buf, &walker->neighbor_iface_addr), bestIntf->int_name,
-                      get_linkcost_text(bestLinkToNeighbor->linkcost, false, &lqbuffer));
+          OLSR_PRINTF(
+            9,
+            "%s: ----> Not forwarding to %s: \"%s\" gives a better link to this neighbor, costing %s\n",
+            PLUGIN_NAME_SHORT,
+            olsr_ip_to_string(&buf, &walker->neighbor_iface_addr),
+            bestIntf->int_name,
+            get_linkcost_text(bestLinkToNeighbor->linkcost, false, &lqbuffer));
         }
 
         }
 
-        continue;               /* for */
+        continue; /* for */
       }
 
       }
 
-      if (forwardedBy != NULL) {
+      if (forwardedBy != NULL)
+      {
 #ifndef NODEBUG
         struct ipaddr_str forwardedByBuf, niaBuf;
         struct lqtextbuffer lqbuffer;
 #endif
 #ifndef NODEBUG
         struct ipaddr_str forwardedByBuf, niaBuf;
         struct lqtextbuffer lqbuffer;
 #endif
-        OLSR_PRINTF(9, "%s: ----> 2-hop path from %s via me to %s will cost ETX %s\n", PLUGIN_NAME_SHORT,
-                    olsr_ip_to_string(&forwardedByBuf, forwardedBy), olsr_ip_to_string(&niaBuf, &walker->neighbor_iface_addr),
-                    get_linkcost_text(previousLinkEtx + currEtx, true, &lqbuffer));
+        OLSR_PRINTF(
+          9,
+          "%s: ----> 2-hop path from %s via me to %s will cost ETX %s\n",
+          PLUGIN_NAME_SHORT,
+          olsr_ip_to_string(&forwardedByBuf, forwardedBy),
+          olsr_ip_to_string(&niaBuf, &walker->neighbor_iface_addr),
+          get_linkcost_text(previousLinkEtx + currEtx, true, &lqbuffer));
       }
 
       /* Check the topology table whether the 'forwardedBy' node is itself a direct
        * neighbor of the candidate neighbor, at a lower cost than the 2-hop route
        * via myself. If so, we do not need to forward the BMF packet to the candidate
        * neighbor, because the 'forwardedBy' node will forward the packet. */
       }
 
       /* Check the topology table whether the 'forwardedBy' node is itself a direct
        * neighbor of the candidate neighbor, at a lower cost than the 2-hop route
        * via myself. If so, we do not need to forward the BMF packet to the candidate
        * neighbor, because the 'forwardedBy' node will forward the packet. */
-      if (forwardedBy != NULL) {
-        /* TODO: olsr_lookup_tc_entry() is not thread-safe. */
+      if (forwardedBy != NULL)
+      {
+        /* Assumption: olsr_mutex has been grabbed for safe access to OLSR data */
         tcLastHop = olsr_lookup_tc_entry(MainAddressOf(forwardedBy));
         tcLastHop = olsr_lookup_tc_entry(MainAddressOf(forwardedBy));
-        if (tcLastHop != NULL) {
-          struct tc_edge_entry *tc_edge;
+        if (tcLastHop != NULL)
+        {
+          struct tc_edge_entry* tc_edge;
 
 
-          /* TODO: olsr_lookup_tc_edge() is not thread-safe. */
+          /* Assumption: olsr_mutex has been grabbed for safe access to OLSR data */
           tc_edge = olsr_lookup_tc_edge(tcLastHop, MainAddressOf(&walker->neighbor_iface_addr));
 
           /* We are not interested in dead-end edges. */
           if (tc_edge) {
             olsr_linkcost tcEtx = tc_edge->cost;
 
           tc_edge = olsr_lookup_tc_edge(tcLastHop, MainAddressOf(&walker->neighbor_iface_addr));
 
           /* We are not interested in dead-end edges. */
           if (tc_edge) {
             olsr_linkcost tcEtx = tc_edge->cost;
 
-            if (previousLinkEtx + currEtx > tcEtx) {
+            if (previousLinkEtx + currEtx > tcEtx)
+            {
 #ifndef NODEBUG
               struct ipaddr_str neighbor_iface_buf, forw_buf;
               struct lqtextbuffer lqbuffer;
               olsr_ip_to_string(&neighbor_iface_buf, &walker->neighbor_iface_addr);
 #endif
 #ifndef NODEBUG
               struct ipaddr_str neighbor_iface_buf, forw_buf;
               struct lqtextbuffer lqbuffer;
               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 %s\n",
-                          PLUGIN_NAME_SHORT, neighbor_iface_buf.buf, olsr_ip_to_string(&forw_buf, forwardedBy),
-                          neighbor_iface_buf.buf, get_linkcost_text(tcEtx, false, &lqbuffer));
-
-              continue;         /* for */
-            }                   /* if */
-          }                     /* if */
-        }                       /* if */
-      }
+              OLSR_PRINTF(
+                9,
+                "%s: ----> Not forwarding to %s: I am not an MPR between %s and %s, direct link costs %s\n",
+                PLUGIN_NAME_SHORT,
+                neighbor_iface_buf.buf,
+                olsr_ip_to_string(&forw_buf, forwardedBy),
+                neighbor_iface_buf.buf,
+                get_linkcost_text(tcEtx, false, &lqbuffer));
+
+              continue; /* for */
+            } /* if */
+          } /* if */
+        } /* if */
+      } /* if */
 
 
-      /* if */
       /* Remember the best neighbor. If all are very bad, remember none. */
       /* Remember the best neighbor. If all are very bad, remember none. */
-      if (currEtx < bestEtx) {
+      if (currEtx < bestEtx)
+      {
         *bestNeighbor = walker;
         bestEtx = currEtx;
       }
         *bestNeighbor = walker;
         bestEtx = currEtx;
       }
@@ -754,28 +911,39 @@ FindNeighbors(struct TBestNeighbors *neighbors, struct link_entry **bestNeighbor
       /* Fill the list with up to 'FanOutLimit' neighbors. If there
        * are more neighbors, broadcast is used instead of unicast. In that
        * case we do not need the list of neighbors. */
       /* Fill the list with up to 'FanOutLimit' neighbors. If there
        * are more neighbors, broadcast is used instead of unicast. In that
        * case we do not need the list of neighbors. */
-      if (*nPossibleNeighbors < FanOutLimit) {
+      if (*nPossibleNeighbors < FanOutLimit)
+      {
         neighbors->links[*nPossibleNeighbors] = walker;
       }
 
       *nPossibleNeighbors += 1;
         neighbors->links[*nPossibleNeighbors] = walker;
       }
 
       *nPossibleNeighbors += 1;
-    }
-    OLSR_FOR_ALL_LINK_ENTRIES_END(walker);
+    } OLSR_FOR_ALL_LINK_ENTRIES_END(walker);
 
 #endif /* USING_THALES_LINK_COST_ROUTING */
 
 
 #endif /* USING_THALES_LINK_COST_ROUTING */
 
-  }                             /* if */
+  } /* if */
 
   /* Display the result of the neighbor search */
 
   /* Display the result of the neighbor search */
-  if (*nPossibleNeighbors == 0) {
-    OLSR_PRINTF(9, "%s: ----> No suitable neighbor found to forward to on \"%s\"\n", PLUGIN_NAME_SHORT, intf->ifName);
-  } else {
-    struct ipaddr_str buf;
-    OLSR_PRINTF(9, "%s: ----> %d neighbors found on \"%s\"; best neighbor to forward to: %s\n", PLUGIN_NAME_SHORT,
-                *nPossibleNeighbors, intf->ifName, olsr_ip_to_string(&buf, &(*bestNeighbor)->neighbor_iface_addr));
-  }                             /* if */
-
-}                               /* FindNeighbors */
+  if (*nPossibleNeighbors == 0)
+  {
+    OLSR_PRINTF(
+      9,
+      "%s: ----> No suitable neighbor found to forward to on \"%s\"\n",
+      PLUGIN_NAME_SHORT,
+      intf->ifName);
+  }
+  else
+  {
+    OLSR_PRINTF(
+      9,
+      "%s: ----> %d neighbors found on \"%s\"; best neighbor to forward to: %s\n",
+      PLUGIN_NAME_SHORT,
+      *nPossibleNeighbors,
+      intf->ifName,
+      olsr_ip_to_string(&buf, &(*bestNeighbor)->neighbor_iface_addr));
+  } /* if */
+
+} /* FindNeighbors */
 
 /* -------------------------------------------------------------------------
  * Function   : CreateCaptureSocket
 
 /* -------------------------------------------------------------------------
  * Function   : CreateCaptureSocket
@@ -787,8 +955,7 @@ FindNeighbors(struct TBestNeighbors *neighbors, struct link_entry **bestNeighbor
  * Notes      : The socket is a cooked IP packet socket, bound to the specified
  *              network interface
  * ------------------------------------------------------------------------- */
  * Notes      : The socket is a cooked IP packet socket, bound to the specified
  *              network interface
  * ------------------------------------------------------------------------- */
-static int
-CreateCaptureSocket(const char *ifName)
+static int CreateCaptureSocket(const char* ifName)
 {
   int ifIndex = if_nametoindex(ifName);
   struct packet_mreq mreq;
 {
   int ifIndex = if_nametoindex(ifName);
   struct packet_mreq mreq;
@@ -797,7 +964,8 @@ CreateCaptureSocket(const char *ifName)
 
   /* Open cooked IP packet socket */
   int skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
 
   /* Open cooked IP packet socket */
   int skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
-  if (skfd < 0) {
+  if (skfd < 0)
+  {
     BmfPError("socket(PF_PACKET) error");
     return -1;
   }
     BmfPError("socket(PF_PACKET) error");
     return -1;
   }
@@ -806,7 +974,8 @@ CreateCaptureSocket(const char *ifName)
   memset(&mreq, 0, sizeof(struct packet_mreq));
   mreq.mr_ifindex = ifIndex;
   mreq.mr_type = PACKET_MR_PROMISC;
   memset(&mreq, 0, sizeof(struct packet_mreq));
   mreq.mr_ifindex = ifIndex;
   mreq.mr_type = PACKET_MR_PROMISC;
-  if (setsockopt(skfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
+  if (setsockopt(skfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
+  {
     BmfPError("setsockopt(PACKET_MR_PROMISC) error");
     close(skfd);
     return -1;
     BmfPError("setsockopt(PACKET_MR_PROMISC) error");
     close(skfd);
     return -1;
@@ -815,13 +984,14 @@ CreateCaptureSocket(const char *ifName)
   /* Get hardware (MAC) address */
   memset(&req, 0, sizeof(struct ifreq));
   strncpy(req.ifr_name, ifName, IFNAMSIZ - 1);
   /* Get hardware (MAC) address */
   memset(&req, 0, sizeof(struct ifreq));
   strncpy(req.ifr_name, ifName, IFNAMSIZ - 1);
-  req.ifr_name[IFNAMSIZ - 1] = '\0';    /* Ensures null termination */
-  if (ioctl(skfd, SIOCGIFHWADDR, &req) < 0) {
+  req.ifr_name[IFNAMSIZ-1] = '\0'; /* Ensures null termination */
+  if (ioctl(skfd, SIOCGIFHWADDR, &req) < 0)
+  {
     BmfPError("error retrieving MAC address");
     close(skfd);
     return -1;
   }
     BmfPError("error retrieving MAC address");
     close(skfd);
     return -1;
   }
-
+   
   /* Bind the socket to the specified interface */
   memset(&bindTo, 0, sizeof(bindTo));
   bindTo.sll_family = AF_PACKET;
   /* Bind the socket to the specified interface */
   memset(&bindTo, 0, sizeof(bindTo));
   bindTo.sll_family = AF_PACKET;
@@ -829,15 +999,17 @@ CreateCaptureSocket(const char *ifName)
   bindTo.sll_ifindex = ifIndex;
   memcpy(bindTo.sll_addr, req.ifr_hwaddr.sa_data, IFHWADDRLEN);
   bindTo.sll_halen = IFHWADDRLEN;
   bindTo.sll_ifindex = ifIndex;
   memcpy(bindTo.sll_addr, req.ifr_hwaddr.sa_data, IFHWADDRLEN);
   bindTo.sll_halen = IFHWADDRLEN;
-
-  if (bind(skfd, (struct sockaddr *)&bindTo, sizeof(bindTo)) < 0) {
+    
+  if (bind(skfd, (struct sockaddr*)&bindTo, sizeof(bindTo)) < 0)
+  {
     BmfPError("bind() error");
     close(skfd);
     return -1;
   }
 
   /* Set socket to blocking operation */
     BmfPError("bind() error");
     close(skfd);
     return -1;
   }
 
   /* Set socket to blocking operation */
-  if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) {
+  if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0)
+  {
     BmfPError("fcntl() error");
     close(skfd);
     return -1;
     BmfPError("fcntl() error");
     close(skfd);
     return -1;
@@ -846,7 +1018,7 @@ CreateCaptureSocket(const char *ifName)
   AddDescriptorToInputSet(skfd);
 
   return skfd;
   AddDescriptorToInputSet(skfd);
 
   return skfd;
-}                               /* CreateCaptureSocket */
+} /* CreateCaptureSocket */
 
 /* -------------------------------------------------------------------------
  * Function   : CreateListeningSocket
 
 /* -------------------------------------------------------------------------
  * Function   : CreateListeningSocket
@@ -859,8 +1031,7 @@ CreateCaptureSocket(const char *ifName)
  * Notes      : The socket is a cooked IP packet socket, bound to the specified
  *              network interface
  * ------------------------------------------------------------------------- */
  * Notes      : The socket is a cooked IP packet socket, bound to the specified
  *              network interface
  * ------------------------------------------------------------------------- */
-static int
-CreateListeningSocket(const char *ifName)
+static int CreateListeningSocket(const char* ifName)
 {
   int ifIndex = if_nametoindex(ifName);
   struct packet_mreq mreq;
 {
   int ifIndex = if_nametoindex(ifName);
   struct packet_mreq mreq;
@@ -869,7 +1040,8 @@ CreateListeningSocket(const char *ifName)
 
   /* Open cooked IP packet socket */
   int skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
 
   /* Open cooked IP packet socket */
   int skfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
-  if (skfd < 0) {
+  if (skfd < 0)
+  {
     BmfPError("socket(PF_PACKET) error");
     return -1;
   }
     BmfPError("socket(PF_PACKET) error");
     return -1;
   }
@@ -878,7 +1050,8 @@ CreateListeningSocket(const char *ifName)
   memset(&mreq, 0, sizeof(struct packet_mreq));
   mreq.mr_ifindex = ifIndex;
   mreq.mr_type = PACKET_MR_PROMISC;
   memset(&mreq, 0, sizeof(struct packet_mreq));
   mreq.mr_ifindex = ifIndex;
   mreq.mr_type = PACKET_MR_PROMISC;
-  if (setsockopt(skfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
+  if (setsockopt(skfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
+  {
     BmfPError("setsockopt(PACKET_MR_PROMISC) error");
     close(skfd);
     return -1;
     BmfPError("setsockopt(PACKET_MR_PROMISC) error");
     close(skfd);
     return -1;
@@ -887,8 +1060,9 @@ CreateListeningSocket(const char *ifName)
   /* Get hardware (MAC) address */
   memset(&req, 0, sizeof(struct ifreq));
   strncpy(req.ifr_name, ifName, IFNAMSIZ - 1);
   /* Get hardware (MAC) address */
   memset(&req, 0, sizeof(struct ifreq));
   strncpy(req.ifr_name, ifName, IFNAMSIZ - 1);
-  req.ifr_name[IFNAMSIZ - 1] = '\0';    /* Ensures null termination */
-  if (ioctl(skfd, SIOCGIFHWADDR, &req) < 0) {
+  req.ifr_name[IFNAMSIZ-1] = '\0'; /* Ensures null termination */
+  if (ioctl(skfd, SIOCGIFHWADDR, &req) < 0)
+  {
     BmfPError("error retrieving MAC address");
     close(skfd);
     return -1;
     BmfPError("error retrieving MAC address");
     close(skfd);
     return -1;
@@ -901,15 +1075,17 @@ CreateListeningSocket(const char *ifName)
   bindTo.sll_ifindex = ifIndex;
   memcpy(bindTo.sll_addr, req.ifr_hwaddr.sa_data, IFHWADDRLEN);
   bindTo.sll_halen = IFHWADDRLEN;
   bindTo.sll_ifindex = ifIndex;
   memcpy(bindTo.sll_addr, req.ifr_hwaddr.sa_data, IFHWADDRLEN);
   bindTo.sll_halen = IFHWADDRLEN;
-
-  if (bind(skfd, (struct sockaddr *)&bindTo, sizeof(bindTo)) < 0) {
+    
+  if (bind(skfd, (struct sockaddr*)&bindTo, sizeof(bindTo)) < 0)
+  {
     BmfPError("bind() error");
     close(skfd);
     return -1;
   }
 
   /* Set socket to blocking operation */
     BmfPError("bind() error");
     close(skfd);
     return -1;
   }
 
   /* Set socket to blocking operation */
-  if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) {
+  if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0)
+  {
     BmfPError("fcntl() error");
     close(skfd);
     return -1;
     BmfPError("fcntl() error");
     close(skfd);
     return -1;
@@ -918,7 +1094,7 @@ CreateListeningSocket(const char *ifName)
   AddDescriptorToInputSet(skfd);
 
   return skfd;
   AddDescriptorToInputSet(skfd);
 
   return skfd;
-}                               /* CreateListeningSocket */
+} /* CreateListeningSocket */
 
 /* -------------------------------------------------------------------------
  * Function   : CreateEncapsulateSocket
 
 /* -------------------------------------------------------------------------
  * Function   : CreateEncapsulateSocket
@@ -931,29 +1107,31 @@ CreateListeningSocket(const char *ifName)
  * Notes      : The socket is an UDP (datagram) over IP socket, bound to the
  *              specified network interface
  * ------------------------------------------------------------------------- */
  * Notes      : The socket is an UDP (datagram) over IP socket, bound to the
  *              specified network interface
  * ------------------------------------------------------------------------- */
-static int
-CreateEncapsulateSocket(const char *ifName)
+static int CreateEncapsulateSocket(const char* ifName)
 {
   int on = 1;
   struct sockaddr_in bindTo;
 
   /* Open UDP-IP socket */
   int skfd = socket(PF_INET, SOCK_DGRAM, 0);
 {
   int on = 1;
   struct sockaddr_in bindTo;
 
   /* Open UDP-IP socket */
   int skfd = socket(PF_INET, SOCK_DGRAM, 0);
-  if (skfd < 0) {
+  if (skfd < 0)
+  {
     BmfPError("socket(PF_INET) error");
     return -1;
   }
 
   /* Enable sending to broadcast addresses */
     BmfPError("socket(PF_INET) error");
     return -1;
   }
 
   /* Enable sending to broadcast addresses */
-  if (setsockopt(skfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) {
+  if (setsockopt(skfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0)
+  {
     BmfPError("setsockopt(SO_BROADCAST) error");
     close(skfd);
     return -1;
   }
     BmfPError("setsockopt(SO_BROADCAST) error");
     close(skfd);
     return -1;
   }
-
+       
   /* Bind to the specific network interfaces indicated by ifName. */
   /* When using Kernel 2.6 this must happer prior to the port binding! */
   /* Bind to the specific network interfaces indicated by ifName. */
   /* When using Kernel 2.6 this must happer prior to the port binding! */
-  if (setsockopt(skfd, SOL_SOCKET, SO_BINDTODEVICE, ifName, strlen(ifName) + 1) < 0) {
+  if (setsockopt(skfd, SOL_SOCKET, SO_BINDTODEVICE, ifName, strlen(ifName) + 1) < 0)
+  {
     BmfPError("setsockopt(SO_BINDTODEVICE) error");
     close(skfd);
     return -1;
     BmfPError("setsockopt(SO_BINDTODEVICE) error");
     close(skfd);
     return -1;
@@ -964,15 +1142,17 @@ CreateEncapsulateSocket(const char *ifName)
   bindTo.sin_family = AF_INET;
   bindTo.sin_port = htons(BMF_ENCAP_PORT);
   bindTo.sin_addr.s_addr = htonl(INADDR_ANY);
   bindTo.sin_family = AF_INET;
   bindTo.sin_port = htons(BMF_ENCAP_PORT);
   bindTo.sin_addr.s_addr = htonl(INADDR_ANY);
-
-  if (bind(skfd, (struct sockaddr *)&bindTo, sizeof(bindTo)) < 0) {
+      
+  if (bind(skfd, (struct sockaddr*)&bindTo, sizeof(bindTo)) < 0) 
+  {
     BmfPError("bind() error");
     close(skfd);
     return -1;
   }
 
   /* Set socket to blocking operation */
     BmfPError("bind() error");
     close(skfd);
     return -1;
   }
 
   /* Set socket to blocking operation */
-  if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0) {
+  if (fcntl(skfd, F_SETFL, fcntl(skfd, F_GETFL, 0) & ~O_NONBLOCK) < 0)
+  {
     BmfPError("fcntl() error");
     close(skfd);
     return -1;
     BmfPError("fcntl() error");
     close(skfd);
     return -1;
@@ -981,7 +1161,7 @@ CreateEncapsulateSocket(const char *ifName)
   AddDescriptorToInputSet(skfd);
 
   return skfd;
   AddDescriptorToInputSet(skfd);
 
   return skfd;
-}                               /* CreateEncapsulateSocket */
+} /* CreateEncapsulateSocket */
 
 /* -------------------------------------------------------------------------
  * Function   : CreateLocalEtherTunTap
 
 /* -------------------------------------------------------------------------
  * Function   : CreateLocalEtherTunTap
@@ -998,8 +1178,7 @@ CreateEncapsulateSocket(const char *ifName)
  * Note       : Order dependency: call this function only if BmfInterfaces
  *              is filled with a list of network interfaces.
  * ------------------------------------------------------------------------- */
  * Note       : Order dependency: call this function only if BmfInterfaces
  *              is filled with a list of network interfaces.
  * ------------------------------------------------------------------------- */
-static int
-CreateLocalEtherTunTap(void)
+static int CreateLocalEtherTunTap(void)
 {
   static const char deviceName[] = "/dev/net/tun";
   struct ifreq ifreq;
 {
   static const char deviceName[] = "/dev/net/tun";
   struct ifreq ifreq;
@@ -1008,21 +1187,23 @@ CreateLocalEtherTunTap(void)
   int ioctlres;
 
   etfd = open(deviceName, O_RDWR | O_NONBLOCK);
   int ioctlres;
 
   etfd = open(deviceName, O_RDWR | O_NONBLOCK);
-  if (etfd < 0) {
+  if (etfd < 0)
+  {
     BmfPError("error opening %s", deviceName);
     return -1;
   }
 
   memset(&ifreq, 0, sizeof(ifreq));
   strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1);
     BmfPError("error opening %s", deviceName);
     return -1;
   }
 
   memset(&ifreq, 0, sizeof(ifreq));
   strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1);
-  ifreq.ifr_name[IFNAMSIZ - 1] = '\0';  /* Ensures null termination */
+  ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */
 
   /* Specify the IFF_TUN flag for IP packets.
    * Specify IFF_NO_PI for not receiving extra meta packet information. */
   ifreq.ifr_flags = IFF_TUN;
   ifreq.ifr_flags |= IFF_NO_PI;
 
 
   /* Specify the IFF_TUN flag for IP packets.
    * Specify IFF_NO_PI for not receiving extra meta packet information. */
   ifreq.ifr_flags = IFF_TUN;
   ifreq.ifr_flags |= IFF_NO_PI;
 
-  if (ioctl(etfd, TUNSETIFF, (void *)&ifreq) < 0) {
+  if (ioctl(etfd, TUNSETIFF, (void *)&ifreq) < 0)
+  {
     BmfPError("ioctl(TUNSETIFF) error on %s", deviceName);
     close(etfd);
     return -1;
     BmfPError("ioctl(TUNSETIFF) error on %s", deviceName);
     close(etfd);
     return -1;
@@ -1030,11 +1211,12 @@ CreateLocalEtherTunTap(void)
 
   memset(&ifreq, 0, sizeof(ifreq));
   strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1);
 
   memset(&ifreq, 0, sizeof(ifreq));
   strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1);
-  ifreq.ifr_name[IFNAMSIZ - 1] = '\0';  /* Ensures null termination */
+  ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */
   ifreq.ifr_addr.sa_family = AF_INET;
 
   ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0);
   ifreq.ifr_addr.sa_family = AF_INET;
 
   ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0);
-  if (ioctlSkfd < 0) {
+  if (ioctlSkfd < 0)
+  {
     BmfPError("socket(PF_INET) error on %s", deviceName);
     close(etfd);
     return -1;
     BmfPError("socket(PF_INET) error on %s", deviceName);
     close(etfd);
     return -1;
@@ -1044,39 +1226,47 @@ CreateLocalEtherTunTap(void)
    * The default IP address is the address of the first OLSR interface;
    * the default netmask is 255.255.255.255 . Having an all-ones netmask prevents
    * automatic entry of the BMF network interface in the routing table. */
    * The default IP address is the address of the first OLSR interface;
    * the default netmask is 255.255.255.255 . Having an all-ones netmask prevents
    * automatic entry of the BMF network interface in the routing table. */
-  if (EtherTunTapIp == ETHERTUNTAPIPNOTSET) {
-    struct TBmfInterface *nextBmfIf = BmfInterfaces;
-    while (nextBmfIf != NULL) {
-      struct TBmfInterface *bmfIf = nextBmfIf;
+  if (EtherTunTapIp == ETHERTUNTAPIPNOTSET)
+  {
+    struct TBmfInterface* nextBmfIf = BmfInterfaces;
+    while (nextBmfIf != NULL)
+    {
+      struct TBmfInterface* bmfIf = nextBmfIf;
       nextBmfIf = bmfIf->next;
 
       nextBmfIf = bmfIf->next;
 
-      if (bmfIf->olsrIntf != NULL) {
+      if (bmfIf->olsrIntf != NULL)
+      {
         EtherTunTapIp = ntohl(bmfIf->intAddr.v4.s_addr);
         EtherTunTapIpBroadcast = EtherTunTapIp;
       }
     }
   }
 
         EtherTunTapIp = ntohl(bmfIf->intAddr.v4.s_addr);
         EtherTunTapIpBroadcast = EtherTunTapIp;
       }
     }
   }
 
-  if (EtherTunTapIp == ETHERTUNTAPIPNOTSET) {
+  if (EtherTunTapIp == ETHERTUNTAPIPNOTSET)
+  {
     /* No IP address configured for BMF network interface, and no OLSR interface found to
      * copy IP address from. Fall back to default: 10.255.255.253 . */
     EtherTunTapIp = ETHERTUNTAPDEFAULTIP;
   }
 
     /* No IP address configured for BMF network interface, and no OLSR interface found to
      * copy IP address from. Fall back to default: 10.255.255.253 . */
     EtherTunTapIp = ETHERTUNTAPDEFAULTIP;
   }
 
-  ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifreq.ifr_addr)->sin_addr.s_addr = htonl(EtherTunTapIp);
+  ((struct sockaddr_in*)&ifreq.ifr_addr)->sin_addr.s_addr = htonl(EtherTunTapIp);
   ioctlres = ioctl(ioctlSkfd, SIOCSIFADDR, &ifreq);
   ioctlres = ioctl(ioctlSkfd, SIOCSIFADDR, &ifreq);
-  if (ioctlres >= 0) {
+  if (ioctlres >= 0)
+  {
     /* Set net mask */
     /* Set net mask */
-    ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifreq.ifr_netmask)->sin_addr.s_addr = htonl(EtherTunTapIpMask);
+    ((struct sockaddr_in*)&ifreq.ifr_netmask)->sin_addr.s_addr = htonl(EtherTunTapIpMask);
     ioctlres = ioctl(ioctlSkfd, SIOCSIFNETMASK, &ifreq);
     ioctlres = ioctl(ioctlSkfd, SIOCSIFNETMASK, &ifreq);
-    if (ioctlres >= 0) {
+    if (ioctlres >= 0)
+    {
       /* Set broadcast IP */
       /* Set broadcast IP */
-      ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifreq.ifr_broadaddr)->sin_addr.s_addr = htonl(EtherTunTapIpBroadcast);
+      ((struct sockaddr_in*)&ifreq.ifr_broadaddr)->sin_addr.s_addr = htonl(EtherTunTapIpBroadcast);
       ioctlres = ioctl(ioctlSkfd, SIOCSIFBRDADDR, &ifreq);
       ioctlres = ioctl(ioctlSkfd, SIOCSIFBRDADDR, &ifreq);
-      if (ioctlres >= 0) {
+      if (ioctlres >= 0)
+      {
         /* Bring EtherTunTap interface up (if not already) */
         ioctlres = ioctl(ioctlSkfd, SIOCGIFFLAGS, &ifreq);
         /* Bring EtherTunTap interface up (if not already) */
         ioctlres = ioctl(ioctlSkfd, SIOCGIFFLAGS, &ifreq);
-        if (ioctlres >= 0) {
+        if (ioctlres >= 0)
+        {
           ifreq.ifr_flags |= (IFF_UP | IFF_RUNNING | IFF_BROADCAST);
           ioctlres = ioctl(ioctlSkfd, SIOCSIFFLAGS, &ifreq);
         }
           ifreq.ifr_flags |= (IFF_UP | IFF_RUNNING | IFF_BROADCAST);
           ioctlres = ioctl(ioctlSkfd, SIOCSIFFLAGS, &ifreq);
         }
@@ -1084,27 +1274,29 @@ CreateLocalEtherTunTap(void)
     }
   }
 
     }
   }
 
-  if (ioctlres < 0) {
+  if (ioctlres < 0)
+  {
     /* Any of the above ioctl() calls failed */
     BmfPError("error bringing up EtherTunTap interface \"%s\"", EtherTunTapIfName);
 
     close(etfd);
     close(ioctlSkfd);
     return -1;
     /* Any of the above ioctl() calls failed */
     BmfPError("error bringing up EtherTunTap interface \"%s\"", EtherTunTapIfName);
 
     close(etfd);
     close(ioctlSkfd);
     return -1;
-  }
+  } /* if (ioctlres < 0) */
 
 
-  /* if (ioctlres < 0) */
   /* Set the multicast flag on the interface */
   memset(&ifreq, 0, sizeof(ifreq));
   strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1);
   /* Set the multicast flag on the interface */
   memset(&ifreq, 0, sizeof(ifreq));
   strncpy(ifreq.ifr_name, EtherTunTapIfName, IFNAMSIZ - 1);
-  ifreq.ifr_name[IFNAMSIZ - 1] = '\0';  /* Ensures null termination */
+  ifreq.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */
 
   ioctlres = ioctl(ioctlSkfd, SIOCGIFFLAGS, &ifreq);
 
   ioctlres = ioctl(ioctlSkfd, SIOCGIFFLAGS, &ifreq);
-  if (ioctlres >= 0) {
+  if (ioctlres >= 0)
+  {
     ifreq.ifr_flags |= IFF_MULTICAST;
     ioctlres = ioctl(ioctlSkfd, SIOCSIFFLAGS, &ifreq);
   }
     ifreq.ifr_flags |= IFF_MULTICAST;
     ioctlres = ioctl(ioctlSkfd, SIOCSIFFLAGS, &ifreq);
   }
-  if (ioctlres < 0) {
+  if (ioctlres < 0)
+  {
     /* Any of the two above ioctl() calls failed */
     BmfPError("error setting multicast flag on EtherTunTap interface \"%s\"", EtherTunTapIfName);
 
     /* Any of the two above ioctl() calls failed */
     BmfPError("error setting multicast flag on EtherTunTap interface \"%s\"", EtherTunTapIfName);
 
@@ -1114,7 +1306,8 @@ CreateLocalEtherTunTap(void)
   /* Use ioctl to make the tuntap persistent. Otherwise it will disappear
    * when this program exits. That is not desirable, since a multicast
    * daemon (e.g. mrouted) may be using the tuntap interface. */
   /* Use ioctl to make the tuntap persistent. Otherwise it will disappear
    * when this program exits. That is not desirable, since a multicast
    * daemon (e.g. mrouted) may be using the tuntap interface. */
-  if (ioctl(etfd, TUNSETPERSIST, (void *)&ifreq) < 0) {
+  if (ioctl(etfd, TUNSETPERSIST, (void *)&ifreq) < 0)
+  {
     BmfPError("error making EtherTunTap interface \"%s\" persistent", EtherTunTapIfName);
 
     /* Continue anyway */
     BmfPError("error making EtherTunTap interface \"%s\" persistent", EtherTunTapIfName);
 
     /* Continue anyway */
@@ -1127,7 +1320,8 @@ CreateLocalEtherTunTap(void)
   /* If the user configured a specific IP address for the BMF network interface,
    * help the user and advertise the IP address of the BMF network interface
    * on the OLSR network via HNA */
   /* If the user configured a specific IP address for the BMF network interface,
    * help the user and advertise the IP address of the BMF network interface
    * on the OLSR network via HNA */
-  if (TunTapIpOverruled != 0) {
+  if (TunTapIpOverruled != 0)
+  {
     union olsr_ip_addr temp_net;
 
     temp_net.v4.s_addr = htonl(EtherTunTapIp);
     union olsr_ip_addr temp_net;
 
     temp_net.v4.s_addr = htonl(EtherTunTapIp);
@@ -1137,7 +1331,7 @@ CreateLocalEtherTunTap(void)
   close(ioctlSkfd);
 
   return etfd;
   close(ioctlSkfd);
 
   return etfd;
-}                               /* CreateLocalEtherTunTap */
+} /* CreateLocalEtherTunTap */
 
 /* -------------------------------------------------------------------------
  * Function   : CreateInterface
 
 /* -------------------------------------------------------------------------
  * Function   : CreateInterface
@@ -1150,8 +1344,9 @@ CreateLocalEtherTunTap(void)
  * Return     : the number of opened sockets
  * Data Used  : BmfInterfaces, LastBmfInterface
  * ------------------------------------------------------------------------- */
  * Return     : the number of opened sockets
  * Data Used  : BmfInterfaces, LastBmfInterface
  * ------------------------------------------------------------------------- */
-static int
-CreateInterface(const char *ifName, struct interface *olsrIntf)
+static int CreateInterface(
+  const char* ifName,
+  struct interface* olsrIntf)
 {
   int capturingSkfd = -1;
   int encapsulatingSkfd = -1;
 {
   int capturingSkfd = -1;
   int encapsulatingSkfd = -1;
@@ -1159,19 +1354,22 @@ CreateInterface(const char *ifName, struct interface *olsrIntf)
   int ioctlSkfd;
   struct ifreq ifr;
   int nOpened = 0;
   int ioctlSkfd;
   struct ifreq ifr;
   int nOpened = 0;
-  struct TBmfInterface *newIf = malloc(sizeof(struct TBmfInterface));
+  struct TBmfInterfacenewIf = malloc(sizeof(struct TBmfInterface));
 
   assert(ifName != NULL);
 
 
   assert(ifName != NULL);
 
-  if (newIf == NULL) {
+  if (newIf == NULL)
+  {
     return 0;
   }
 
     return 0;
   }
 
-  if (olsrIntf != NULL) {
-    /* On OLSR-enabled interfaces, create socket for encapsulating and forwarding
+  if (olsrIntf != NULL)
+  {
+    /* On OLSR-enabled interfaces, create socket for encapsulating and forwarding 
      * multicast packets */
     encapsulatingSkfd = CreateEncapsulateSocket(ifName);
      * multicast packets */
     encapsulatingSkfd = CreateEncapsulateSocket(ifName);
-    if (encapsulatingSkfd < 0) {
+    if (encapsulatingSkfd < 0)
+    {
       free(newIf);
       return 0;
     }
       free(newIf);
       return 0;
     }
@@ -1180,9 +1378,11 @@ CreateInterface(const char *ifName, struct interface *olsrIntf)
 
   /* Create socket for capturing and sending of multicast packets on
    * non-OLSR interfaces, and on OLSR-interfaces if configured. */
 
   /* Create socket for capturing and sending of multicast packets on
    * non-OLSR interfaces, and on OLSR-interfaces if configured. */
-  if ((olsrIntf == NULL) || (CapturePacketsOnOlsrInterfaces != 0)) {
+  if ((olsrIntf == NULL) || (CapturePacketsOnOlsrInterfaces != 0))
+  {
     capturingSkfd = CreateCaptureSocket(ifName);
     capturingSkfd = CreateCaptureSocket(ifName);
-    if (capturingSkfd < 0) {
+    if (capturingSkfd < 0)
+    {
       close(encapsulatingSkfd);
       free(newIf);
       return 0;
       close(encapsulatingSkfd);
       free(newIf);
       return 0;
@@ -1193,9 +1393,11 @@ CreateInterface(const char *ifName, struct interface *olsrIntf)
 
   /* Create promiscuous mode listening interface if BMF uses IP unicast
    * as underlying forwarding mechanism */
 
   /* Create promiscuous mode listening interface if BMF uses IP unicast
    * as underlying forwarding mechanism */
-  if (BmfMechanism == BM_UNICAST_PROMISCUOUS) {
+  if (BmfMechanism == BM_UNICAST_PROMISCUOUS)
+  {
     listeningSkfd = CreateListeningSocket(ifName);
     listeningSkfd = CreateListeningSocket(ifName);
-    if (listeningSkfd < 0) {
+    if (listeningSkfd < 0)
+    {
       close(listeningSkfd);
       close(encapsulatingSkfd); /* no problem if 'encapsulatingSkfd' is -1 */
       free(newIf);
       close(listeningSkfd);
       close(encapsulatingSkfd); /* no problem if 'encapsulatingSkfd' is -1 */
       free(newIf);
@@ -1212,8 +1414,9 @@ CreateInterface(const char *ifName, struct interface *olsrIntf)
   /* Retrieve the MAC address of the interface. */
   memset(&ifr, 0, sizeof(struct ifreq));
   strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1);
   /* Retrieve the MAC address of the interface. */
   memset(&ifr, 0, sizeof(struct ifreq));
   strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1);
-  ifr.ifr_name[IFNAMSIZ - 1] = '\0';    /* Ensures null termination */
-  if (ioctl(ioctlSkfd, SIOCGIFHWADDR, &ifr) < 0) {
+  ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */
+  if (ioctl(ioctlSkfd, SIOCGIFHWADDR, &ifr) < 0)
+  {
     BmfPError("ioctl(SIOCGIFHWADDR) error for interface \"%s\"", ifName);
     close(capturingSkfd);
     close(encapsulatingSkfd);
     BmfPError("ioctl(SIOCGIFHWADDR) error for interface \"%s\"", ifName);
     close(capturingSkfd);
     close(encapsulatingSkfd);
@@ -1228,44 +1431,49 @@ CreateInterface(const char *ifName, struct interface *olsrIntf)
   memcpy(newIf->macAddr, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN);
   memcpy(newIf->ifName, ifName, IFNAMSIZ);
   newIf->olsrIntf = olsrIntf;
   memcpy(newIf->macAddr, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN);
   memcpy(newIf->ifName, ifName, IFNAMSIZ);
   newIf->olsrIntf = olsrIntf;
-  if (olsrIntf != NULL) {
+  if (olsrIntf != NULL)
+  {
     /* For an OLSR-interface, copy the interface address and broadcast
      * address from the OLSR interface object. Downcast to correct sockaddr
      * subtype. */
     newIf->intAddr.v4 = ((struct sockaddr_in *)&olsrIntf->int_addr)->sin_addr;
     newIf->broadAddr.v4 = ((struct sockaddr_in *)&olsrIntf->int_broadaddr)->sin_addr;
     /* For an OLSR-interface, copy the interface address and broadcast
      * address from the OLSR interface object. Downcast to correct sockaddr
      * subtype. */
     newIf->intAddr.v4 = ((struct sockaddr_in *)&olsrIntf->int_addr)->sin_addr;
     newIf->broadAddr.v4 = ((struct sockaddr_in *)&olsrIntf->int_broadaddr)->sin_addr;
-  } else {
+  }
+  else
+  {
     /* For a non-OLSR interface, retrieve the IP address ourselves */
     memset(&ifr, 0, sizeof(struct ifreq));
     strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1);
     /* For a non-OLSR interface, retrieve the IP address ourselves */
     memset(&ifr, 0, sizeof(struct ifreq));
     strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1);
-    ifr.ifr_name[IFNAMSIZ - 1] = '\0';  /* Ensures null termination */
-    if (ioctl(ioctlSkfd, SIOCGIFADDR, &ifr) < 0) {
+    ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */
+    if (ioctl(ioctlSkfd, SIOCGIFADDR, &ifr) < 0) 
+    {
       BmfPError("ioctl(SIOCGIFADDR) error for interface \"%s\"", ifName);
 
       newIf->intAddr.v4.s_addr = inet_addr("0.0.0.0");
       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 */
       /* Downcast to correct sockaddr subtype */
-      newIf->intAddr.v4 = ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifr.ifr_addr)->sin_addr;
+      newIf->intAddr.v4 = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
     }
 
     /* For a non-OLSR interface, retrieve the IP broadcast address ourselves */
     memset(&ifr, 0, sizeof(struct ifreq));
     strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1);
     }
 
     /* For a non-OLSR interface, retrieve the IP broadcast address ourselves */
     memset(&ifr, 0, sizeof(struct ifreq));
     strncpy(ifr.ifr_name, ifName, IFNAMSIZ - 1);
-    ifr.ifr_name[IFNAMSIZ - 1] = '\0';  /* Ensures null termination */
-    if (ioctl(ioctlSkfd, SIOCGIFBRDADDR, &ifr) < 0) {
+    ifr.ifr_name[IFNAMSIZ - 1] = '\0'; /* Ensures null termination */
+    if (ioctl(ioctlSkfd, SIOCGIFBRDADDR, &ifr) < 0) 
+    {
       BmfPError("ioctl(SIOCGIFBRDADDR) error for interface \"%s\"", ifName);
 
       newIf->broadAddr.v4.s_addr = inet_addr("0.0.0.0");
       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 */
       /* Downcast to correct sockaddr subtype */
-      newIf->broadAddr.v4 = ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifr.ifr_broadaddr)->sin_addr;
+      newIf->broadAddr.v4 = ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr;
     }
   }
 
     }
   }
 
-  /* Initialize fragment history table */
-  memset(&newIf->fragmentHistory, 0, sizeof(newIf->fragmentHistory));
-  newIf->nextFragmentHistoryEntry = 0;
-
   /* Reset counters */
   newIf->nBmfPacketsRx = 0;
   newIf->nBmfPacketsRxDup = 0;
   /* Reset counters */
   newIf->nBmfPacketsRx = 0;
   newIf->nBmfPacketsRxDup = 0;
@@ -1273,26 +1481,38 @@ CreateInterface(const char *ifName, struct interface *olsrIntf)
 
   /* Add new TBmfInterface object to global list. OLSR interfaces are
    * added at the front of the list, non-OLSR interfaces at the back. */
 
   /* Add new TBmfInterface object to global list. OLSR interfaces are
    * added at the front of the list, non-OLSR interfaces at the back. */
-  if (BmfInterfaces == NULL) {
+  if (BmfInterfaces == NULL)
+  {
     /* First TBmfInterface object in list */
     /* First TBmfInterface object in list */
+    newIf->next = NULL;
     BmfInterfaces = newIf;
     LastBmfInterface = newIf;
     BmfInterfaces = newIf;
     LastBmfInterface = newIf;
-  } else if (olsrIntf != NULL) {
+  }
+  else if (olsrIntf != NULL)
+  {
     /* Add new TBmfInterface object at front of list */
     newIf->next = BmfInterfaces;
     BmfInterfaces = newIf;
     /* Add new TBmfInterface object at front of list */
     newIf->next = BmfInterfaces;
     BmfInterfaces = newIf;
-  } else {
+  }
+  else
+  {
     /* Add new TBmfInterface object at back of list */
     newIf->next = NULL;
     /* Add new TBmfInterface object at back of list */
     newIf->next = NULL;
-    LastBmfInterface->next = newIf;
+    LastBmfInterface->next= newIf;
     LastBmfInterface = newIf;
   }
 
     LastBmfInterface = newIf;
   }
 
-  OLSR_PRINTF(8, "%s: opened %d socket%s on %s interface \"%s\"\n", PLUGIN_NAME_SHORT, nOpened, nOpened == 1 ? "" : "s",
-              olsrIntf != NULL ? "OLSR" : "non-OLSR", ifName);
+  OLSR_PRINTF(
+    8,
+    "%s: opened %d socket%s on %s interface \"%s\"\n",
+    PLUGIN_NAME_SHORT,
+    nOpened,
+    nOpened == 1 ? "" : "s",
+    olsrIntf != NULL ? "OLSR" : "non-OLSR",
+    ifName);
 
   return nOpened;
 
   return nOpened;
-}                               /* CreateInterface */
+} /* CreateInterface */
 
 /* -------------------------------------------------------------------------
  * Function   : CreateBmfNetworkInterfaces
 
 /* -------------------------------------------------------------------------
  * Function   : CreateBmfNetworkInterfaces
@@ -1303,13 +1523,12 @@ CreateInterface(const char *ifName, struct interface *olsrIntf)
  * Return     : fail (-1) or success (0)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : fail (-1) or success (0)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int
-CreateBmfNetworkInterfaces(struct interface *skipThisIntf)
+int CreateBmfNetworkInterfaces(struct interface* skipThisIntf)
 {
   int skfd;
   struct ifconf ifc;
   int numreqs = 30;
 {
   int skfd;
   struct ifconf ifc;
   int numreqs = 30;
-  struct ifreq *ifr;
+  struct ifreqifr;
   int n;
   int nOpenedSockets = 0;
 
   int n;
   int nOpenedSockets = 0;
 
@@ -1317,100 +1536,91 @@ CreateBmfNetworkInterfaces(struct interface *skipThisIntf)
   FD_ZERO(&InputSet);
 
   skfd = socket(PF_INET, SOCK_DGRAM, 0);
   FD_ZERO(&InputSet);
 
   skfd = socket(PF_INET, SOCK_DGRAM, 0);
-  if (skfd < 0) {
+  if (skfd < 0)
+  {
     BmfPError("no inet socket available to retrieve interface list");
     return -1;
   }
 
   /* Retrieve the network interface configuration list */
   ifc.ifc_buf = NULL;
     BmfPError("no inet socket available to retrieve interface list");
     return -1;
   }
 
   /* Retrieve the network interface configuration list */
   ifc.ifc_buf = NULL;
-  for (;;) {
+  for (;;)
+  {
     ifc.ifc_len = sizeof(struct ifreq) * numreqs;
     ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len);
 
     ifc.ifc_len = sizeof(struct ifreq) * numreqs;
     ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len);
 
-    if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) {
+    if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0)
+    {
       BmfPError("ioctl(SIOCGIFCONF) error");
 
       close(skfd);
       free(ifc.ifc_buf);
       return -1;
     }
       BmfPError("ioctl(SIOCGIFCONF) error");
 
       close(skfd);
       free(ifc.ifc_buf);
       return -1;
     }
-    if ((unsigned)ifc.ifc_len == sizeof(struct ifreq) * numreqs) {
+    if ((unsigned)ifc.ifc_len == sizeof(struct ifreq) * numreqs)
+    {
       /* Assume it overflowed; double the space and try again */
       numreqs *= 2;
       assert(numreqs < 1024);
       /* Assume it overflowed; double the space and try again */
       numreqs *= 2;
       assert(numreqs < 1024);
-      continue;                 /* for (;;) */
+      continue; /* for (;;) */
     }
     }
-    break;                      /* for (;;) */
-  }                             /* for (;;) */
+    break; /* for (;;) */
+  } /* for (;;) */
 
   close(skfd);
 
   /* For each item in the interface configuration list... */
   ifr = ifc.ifc_req;
 
   close(skfd);
 
   /* For each item in the interface configuration list... */
   ifr = ifc.ifc_req;
-  for (n = ifc.ifc_len / sizeof(struct ifreq); --n >= 0; ifr++) {
-    struct interface *olsrIntf;
+  for (n = ifc.ifc_len / sizeof(struct ifreq); --n >= 0; ifr++)
+  {
+    struct interface* olsrIntf;
     union olsr_ip_addr ipAddr;
 
     /* Skip the BMF network interface itself */
     union olsr_ip_addr ipAddr;
 
     /* Skip the BMF network interface itself */
-    if (strncmp(ifr->ifr_name, EtherTunTapIfName, IFNAMSIZ) == 0) {
-      continue;                 /* for (n = ...) */
+    if (strncmp(ifr->ifr_name, EtherTunTapIfName, IFNAMSIZ) == 0)
+    {
+      continue; /* for (n = ...) */
     }
 
     /* ...find the OLSR interface structure, if any */
     }
 
     /* ...find the OLSR interface structure, if any */
-    ipAddr.v4 = ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&ifr->ifr_addr)->sin_addr;
+    ipAddr.v4 =  ((struct sockaddr_in*)&ifr->ifr_addr)->sin_addr;
     olsrIntf = if_ifwithaddr(&ipAddr);
 
     olsrIntf = if_ifwithaddr(&ipAddr);
 
-    if (skipThisIntf != NULL && olsrIntf == skipThisIntf) {
-      continue;                 /* for (n = ...) */
+    if (skipThisIntf != NULL && olsrIntf == skipThisIntf)
+    {
+      continue; /* for (n = ...) */
     }
 
     }
 
-    if (olsrIntf == NULL && !IsNonOlsrBmfIf(ifr->ifr_name)) {
+    if (olsrIntf == NULL && ! IsNonOlsrBmfIf(ifr->ifr_name))
+    {
       /* Interface is neither OLSR interface, nor specified as non-OLSR BMF
        * interface in the BMF plugin parameter list */
       /* Interface is neither OLSR interface, nor specified as non-OLSR BMF
        * interface in the BMF plugin parameter list */
-      continue;                 /* for (n = ...) */
+      continue; /* for (n = ...) */
     }
 
     nOpenedSockets += CreateInterface(ifr->ifr_name, olsrIntf);
 
     }
 
     nOpenedSockets += CreateInterface(ifr->ifr_name, olsrIntf);
 
-  }                             /* for (n = ...) */
+  } /* for (n = ...) */
 
   free(ifc.ifc_buf);
 
   free(ifc.ifc_buf);
-
+  
   /* Create the BMF network interface */
   EtherTunTapFd = CreateLocalEtherTunTap();
   /* Create the BMF network interface */
   EtherTunTapFd = CreateLocalEtherTunTap();
-  if (EtherTunTapFd >= 0) {
+  if (EtherTunTapFd >= 0)
+  {
     nOpenedSockets++;
   }
 
     nOpenedSockets++;
   }
 
-  if (BmfInterfaces == NULL) {
+  if (BmfInterfaces == NULL)
+  {
     olsr_printf(1, "%s: could not initialize any network interface\n", PLUGIN_NAME);
     olsr_printf(1, "%s: could not initialize any network interface\n", PLUGIN_NAME);
-  } else {
+  }
+  else
+  {
     olsr_printf(1, "%s: opened %d sockets\n", PLUGIN_NAME, nOpenedSockets);
   }
   return 0;
     olsr_printf(1, "%s: opened %d sockets\n", PLUGIN_NAME, nOpenedSockets);
   }
   return 0;
-}                               /* CreateBmfNetworkInterfaces */
-
-/* -------------------------------------------------------------------------
- * Function   : AddInterface
- * Description: Add an OLSR-enabled network interface to the list of BMF-enabled
- *              network interfaces
- * Input      : newIntf - network interface to add
- * Output     : none
- * Return     : none
- * Data Used  : none
- * ------------------------------------------------------------------------- */
-void
-AddInterface(struct interface *newIntf)
-{
-  int nOpened;
-
-  assert(newIntf != NULL);
-
-  nOpened = CreateInterface(newIntf->int_name, newIntf);
-
-  olsr_printf(1, "%s: opened %d sockets\n", PLUGIN_NAME, nOpened);
-}                               /* AddInterface */
+} /* CreateBmfNetworkInterfaces */
 
 /* -------------------------------------------------------------------------
  * Function   : CloseBmfNetworkInterfaces
 
 /* -------------------------------------------------------------------------
  * Function   : CloseBmfNetworkInterfaces
@@ -1418,7 +1628,7 @@ AddInterface(struct interface *newIntf)
  * Input      : none
  * Output     : none
  * Return     : none
  * Input      : none
  * Output     : none
  * Return     : none
- * Data Used  : none
+ * Data Used  : BmfInterfaces, LastBmfInterface
  * Notes      : Closes
  *              - the local EtherTunTap interface (e.g. "tun0" or "tap0")
  *              - for each BMF-enabled interface, the socket used for
  * Notes      : Closes
  *              - the local EtherTunTap interface (e.g. "tun0" or "tap0")
  *              - for each BMF-enabled interface, the socket used for
@@ -1428,8 +1638,7 @@ AddInterface(struct interface *newIntf)
  *              Also restores the network state to the situation before BMF
  *              was started.
  * ------------------------------------------------------------------------- */
  *              Also restores the network state to the situation before BMF
  *              was started.
  * ------------------------------------------------------------------------- */
-void
-CloseBmfNetworkInterfaces(void)
+void CloseBmfNetworkInterfaces(void)
 {
   int nClosed = 0;
   u_int32_t totalOlsrBmfPacketsRx = 0;
 {
   int nClosed = 0;
   u_int32_t totalOlsrBmfPacketsRx = 0;
@@ -1440,42 +1649,59 @@ CloseBmfNetworkInterfaces(void)
   u_int32_t totalNonOlsrBmfPacketsTx = 0;
 
   /* Close all opened sockets */
   u_int32_t totalNonOlsrBmfPacketsTx = 0;
 
   /* Close all opened sockets */
-  struct TBmfInterface *nextBmfIf = BmfInterfaces;
-  while (nextBmfIf != NULL) {
-    struct TBmfInterface *bmfIf = nextBmfIf;
+  struct TBmfInterface* nextBmfIf = BmfInterfaces;
+  while (nextBmfIf != NULL) 
+  {
+    struct TBmfInterface* bmfIf = nextBmfIf;
     nextBmfIf = bmfIf->next;
 
     nextBmfIf = bmfIf->next;
 
-    if (bmfIf->capturingSkfd >= 0) {
+    if (bmfIf->capturingSkfd >= 0)
+    {
       close(bmfIf->capturingSkfd);
       nClosed++;
     }
       close(bmfIf->capturingSkfd);
       nClosed++;
     }
-    if (bmfIf->encapsulatingSkfd >= 0) {
+    if (bmfIf->encapsulatingSkfd >= 0) 
+    {
       close(bmfIf->encapsulatingSkfd);
       nClosed++;
     }
 
       close(bmfIf->encapsulatingSkfd);
       nClosed++;
     }
 
-    OLSR_PRINTF(7, "%s: %s interface \"%s\": RX pkts %d (%d dups); TX pkts %d\n", PLUGIN_NAME_SHORT,
-                bmfIf->olsrIntf != NULL ? "OLSR" : "non-OLSR", bmfIf->ifName, bmfIf->nBmfPacketsRx, bmfIf->nBmfPacketsRxDup,
-                bmfIf->nBmfPacketsTx);
-
-    olsr_printf(1, "%s: closed %s interface \"%s\"\n", PLUGIN_NAME_SHORT, bmfIf->olsrIntf != NULL ? "OLSR" : "non-OLSR",
-                bmfIf->ifName);
+    OLSR_PRINTF(
+      7,
+      "%s: %s interface \"%s\": RX pkts %d (%d dups); TX pkts %d\n", 
+      PLUGIN_NAME_SHORT,
+      bmfIf->olsrIntf != NULL ? "OLSR" : "non-OLSR",
+      bmfIf->ifName,
+      bmfIf->nBmfPacketsRx,
+      bmfIf->nBmfPacketsRxDup,
+      bmfIf->nBmfPacketsTx);
+
+    olsr_printf(
+      1,
+      "%s: closed %s interface \"%s\"\n", 
+      PLUGIN_NAME_SHORT,
+      bmfIf->olsrIntf != NULL ? "OLSR" : "non-OLSR",
+      bmfIf->ifName);
 
     /* Add totals */
 
     /* Add totals */
-    if (bmfIf->olsrIntf != NULL) {
+    if (bmfIf->olsrIntf != NULL)
+    {
       totalOlsrBmfPacketsRx += bmfIf->nBmfPacketsRx;
       totalOlsrBmfPacketsRxDup += bmfIf->nBmfPacketsRxDup;
       totalOlsrBmfPacketsTx += bmfIf->nBmfPacketsTx;
       totalOlsrBmfPacketsRx += bmfIf->nBmfPacketsRx;
       totalOlsrBmfPacketsRxDup += bmfIf->nBmfPacketsRxDup;
       totalOlsrBmfPacketsTx += bmfIf->nBmfPacketsTx;
-    } else {
+    }
+    else
+    {
       totalNonOlsrBmfPacketsRx += bmfIf->nBmfPacketsRx;
       totalNonOlsrBmfPacketsRxDup += bmfIf->nBmfPacketsRxDup;
       totalNonOlsrBmfPacketsTx += bmfIf->nBmfPacketsTx;
     }
 
     free(bmfIf);
       totalNonOlsrBmfPacketsRx += bmfIf->nBmfPacketsRx;
       totalNonOlsrBmfPacketsRxDup += bmfIf->nBmfPacketsRxDup;
       totalNonOlsrBmfPacketsTx += bmfIf->nBmfPacketsTx;
     }
 
     free(bmfIf);
-  }                             /* while */
-
-  if (EtherTunTapFd >= 0) {
+  } /* while */
+  
+  if (EtherTunTapFd >= 0)
+  {
     close(EtherTunTapFd);
     nClosed++;
 
     close(EtherTunTapFd);
     nClosed++;
 
@@ -1483,14 +1709,29 @@ CloseBmfNetworkInterfaces(void)
   }
 
   BmfInterfaces = NULL;
   }
 
   BmfInterfaces = NULL;
+  LastBmfInterface = NULL;
+
+  /* Re-initialize the IP address for the BMF network interface. Thanks to
+   * Daniele Lacamera for finding and solving this bug. */
+  EtherTunTapIp = ETHERTUNTAPIPNOTSET;
 
   olsr_printf(1, "%s: closed %d sockets\n", PLUGIN_NAME_SHORT, nClosed);
 
 
   olsr_printf(1, "%s: closed %d sockets\n", PLUGIN_NAME_SHORT, nClosed);
 
-  OLSR_PRINTF(7, "%s: Total all OLSR interfaces    : RX pkts %d (%d dups); TX pkts %d\n", PLUGIN_NAME_SHORT, totalOlsrBmfPacketsRx,
-              totalOlsrBmfPacketsRxDup, totalOlsrBmfPacketsTx);
-  OLSR_PRINTF(7, "%s: Total all non-OLSR interfaces: RX pkts %d (%d dups); TX pkts %d\n", PLUGIN_NAME_SHORT,
-              totalNonOlsrBmfPacketsRx, totalNonOlsrBmfPacketsRxDup, totalNonOlsrBmfPacketsTx);
-}                               /* CloseBmfNetworkInterfaces */
+  OLSR_PRINTF(
+    7,
+    "%s: Total all OLSR interfaces    : RX pkts %d (%d dups); TX pkts %d\n",
+    PLUGIN_NAME_SHORT,
+    totalOlsrBmfPacketsRx,
+    totalOlsrBmfPacketsRxDup,
+    totalOlsrBmfPacketsTx);
+  OLSR_PRINTF(
+    7,
+    "%s: Total all non-OLSR interfaces: RX pkts %d (%d dups); TX pkts %d\n",
+    PLUGIN_NAME_SHORT,
+    totalNonOlsrBmfPacketsRx,
+    totalNonOlsrBmfPacketsRxDup,
+    totalNonOlsrBmfPacketsTx);
+} /* CloseBmfNetworkInterfaces */
 
 #define MAX_NON_OLSR_IFS 32
 static char NonOlsrIfNames[MAX_NON_OLSR_IFS][IFNAMSIZ];
 
 #define MAX_NON_OLSR_IFS 32
 static char NonOlsrIfNames[MAX_NON_OLSR_IFS][IFNAMSIZ];
@@ -1507,21 +1748,28 @@ static int nNonOlsrIfs = 0;
  * Return     : success (0) or fail (1)
  * Data Used  : NonOlsrIfNames
  * ------------------------------------------------------------------------- */
  * Return     : success (0) or fail (1)
  * Data Used  : NonOlsrIfNames
  * ------------------------------------------------------------------------- */
-int
-AddNonOlsrBmfIf(const char *ifName, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
+int AddNonOlsrBmfIf(
+  const char* ifName,
+  void* data __attribute__((unused)),
+  set_plugin_parameter_addon addon __attribute__((unused)))
 {
   assert(ifName != NULL);
 
 {
   assert(ifName != NULL);
 
-  if (nNonOlsrIfs >= MAX_NON_OLSR_IFS) {
-    olsr_printf(1, "%s: too many non-OLSR interfaces specified, maximum is %d\n", PLUGIN_NAME, MAX_NON_OLSR_IFS);
+  if (nNonOlsrIfs >= MAX_NON_OLSR_IFS)
+  {
+    olsr_printf(
+      1,
+      "%s: too many non-OLSR interfaces specified, maximum is %d\n",
+      PLUGIN_NAME,
+      MAX_NON_OLSR_IFS);
     return 1;
   }
 
   strncpy(NonOlsrIfNames[nNonOlsrIfs], ifName, IFNAMSIZ - 1);
     return 1;
   }
 
   strncpy(NonOlsrIfNames[nNonOlsrIfs], ifName, IFNAMSIZ - 1);
-  NonOlsrIfNames[nNonOlsrIfs][IFNAMSIZ - 1] = '\0';     /* Ensures null termination */
+  NonOlsrIfNames[nNonOlsrIfs][IFNAMSIZ - 1] = '\0'; /* Ensures null termination */
   nNonOlsrIfs++;
   return 0;
   nNonOlsrIfs++;
   return 0;
-}                               /* AddNonOlsrBmfIf */
+} /* AddNonOlsrBmfIf */
 
 /* -------------------------------------------------------------------------
  * Function   : IsNonOlsrBmfIf
 
 /* -------------------------------------------------------------------------
  * Function   : IsNonOlsrBmfIf
@@ -1531,19 +1779,18 @@ AddNonOlsrBmfIf(const char *ifName, void *data __attribute__ ((unused)), set_plu
  * Return     : true (1) or false (0)
  * Data Used  : NonOlsrIfNames
  * ------------------------------------------------------------------------- */
  * Return     : true (1) or false (0)
  * Data Used  : NonOlsrIfNames
  * ------------------------------------------------------------------------- */
-int
-IsNonOlsrBmfIf(const char *ifName)
+int IsNonOlsrBmfIf(const char* ifName)
 {
   int i;
 
   assert(ifName != NULL);
 
 {
   int i;
 
   assert(ifName != NULL);
 
-  for (i = 0; i < nNonOlsrIfs; i++) {
-    if (strncmp(NonOlsrIfNames[i], ifName, IFNAMSIZ) == 0)
-      return 1;
+  for (i = 0; i < nNonOlsrIfs; i++)
+  {
+    if (strncmp(NonOlsrIfNames[i], ifName, IFNAMSIZ) == 0) return 1;
   }
   return 0;
   }
   return 0;
-}                               /* IsNonOlsrBmfIf */
+} /* IsNonOlsrBmfIf */
 
 /* -------------------------------------------------------------------------
  * Function   : CheckAndUpdateLocalBroadcast
 
 /* -------------------------------------------------------------------------
  * Function   : CheckAndUpdateLocalBroadcast
@@ -1558,17 +1805,17 @@ IsNonOlsrBmfIf(const char *ifName)
  * Data Used  : none
  * Notes      : See also RFC1141
  * ------------------------------------------------------------------------- */
  * Data Used  : none
  * Notes      : See also RFC1141
  * ------------------------------------------------------------------------- */
-void
-CheckAndUpdateLocalBroadcast(unsigned char *ipPacket, union olsr_ip_addr *broadAddr)
+void CheckAndUpdateLocalBroadcast(unsigned char* ipPacket, union olsr_ip_addr* broadAddr)
 {
 {
-  struct iphdr *iph;
+  struct iphdriph;
   union olsr_ip_addr destIp;
 
   assert(ipPacket != NULL && broadAddr != NULL);
 
   union olsr_ip_addr destIp;
 
   assert(ipPacket != NULL && broadAddr != NULL);
 
-  iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
+  iph = (struct iphdr*) ipPacket;
   destIp.v4.s_addr = iph->daddr;
   destIp.v4.s_addr = iph->daddr;
-  if (!IsMulticast(&destIp)) {
+  if (! IsMulticast(&destIp))
+  {
     u_int32_t origDaddr, newDaddr;
     u_int32_t check;
 
     u_int32_t origDaddr, newDaddr;
     u_int32_t check;
 
@@ -1580,34 +1827,35 @@ CheckAndUpdateLocalBroadcast(unsigned char *ipPacket, union olsr_ip_addr *broadA
     /* Re-calculate IP header checksum for new destination */
     check = ntohs(iph->check);
 
     /* Re-calculate IP header checksum for new destination */
     check = ntohs(iph->check);
 
-    check = ~(~check - ((origDaddr >> 16) & 0xFFFF) + ((newDaddr >> 16) & 0xFFFF));
-    check = ~(~check - (origDaddr & 0xFFFF) + (newDaddr & 0xFFFF));
+    check = ~ (~ check - ((origDaddr >> 16) & 0xFFFF) + ((newDaddr >> 16) & 0xFFFF));
+    check = ~ (~ check - (origDaddr & 0xFFFF) + (newDaddr & 0xFFFF));
 
     /* Add carry */
     check = check + (check >> 16);
 
     iph->check = htons(check);
 
 
     /* Add carry */
     check = check + (check >> 16);
 
     iph->check = htons(check);
 
-    if (iph->protocol == SOL_UDP) {
+    if (iph->protocol == SOL_UDP)
+    {
       /* Re-calculate UDP/IP checksum for new destination */
 
       int ipHeaderLen = GetIpHeaderLength(ipPacket);
       /* Re-calculate UDP/IP checksum for new destination */
 
       int ipHeaderLen = GetIpHeaderLength(ipPacket);
-      struct udphdr *udph = (struct udphdr *)(ARM_NOWARN_ALIGN)(ipPacket + ipHeaderLen);
+      struct udphdr* udph = (struct udphdr*) (ipPacket + ipHeaderLen);
 
       /* RFC 1624, Eq. 3: HC' = ~(~HC - m + m') */
 
       check = ntohs(udph->check);
 
 
       /* RFC 1624, Eq. 3: HC' = ~(~HC - m + m') */
 
       check = ntohs(udph->check);
 
-      check = ~(~check - ((origDaddr >> 16) & 0xFFFF) + ((newDaddr >> 16) & 0xFFFF));
-      check = ~(~check - (origDaddr & 0xFFFF) + (newDaddr & 0xFFFF));
+      check = ~ (~ check - ((origDaddr >> 16) & 0xFFFF) + ((newDaddr >> 16) & 0xFFFF));
+      check = ~ (~ check - (origDaddr & 0xFFFF) + (newDaddr & 0xFFFF));
 
       /* Add carry */
       check = check + (check >> 16);
 
       udph->check = htons(check);
 
       /* Add carry */
       check = check + (check >> 16);
 
       udph->check = htons(check);
-    }                           /* if */
-  }                             /* if */
-}                               /* CheckAndUpdateLocalBroadcast */
+     } /* if */
+  } /* if */
+} /* CheckAndUpdateLocalBroadcast */
 
 /* -------------------------------------------------------------------------
  * Function   : AddMulticastRoute
 
 /* -------------------------------------------------------------------------
  * Function   : AddMulticastRoute
@@ -1618,38 +1866,39 @@ CheckAndUpdateLocalBroadcast(unsigned char *ipPacket, union olsr_ip_addr *broadA
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-void
-AddMulticastRoute(void)
+void AddMulticastRoute(void)
 {
   struct rtentry kernel_route;
   int ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0);
 {
   struct rtentry kernel_route;
   int ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0);
-  if (ioctlSkfd < 0) {
+  if (ioctlSkfd < 0)
+  {
     BmfPError("socket(PF_INET) error");
     return;
   }
 
   memset(&kernel_route, 0, sizeof(struct rtentry));
 
     BmfPError("socket(PF_INET) error");
     return;
   }
 
   memset(&kernel_route, 0, sizeof(struct rtentry));
 
-  ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&kernel_route.rt_dst)->sin_family = AF_INET;
-  ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&kernel_route.rt_gateway)->sin_family = AF_INET;
-  ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&kernel_route.rt_genmask)->sin_family = AF_INET;
+  ((struct sockaddr_in*)&kernel_route.rt_dst)->sin_family = AF_INET;
+  ((struct sockaddr_in*)&kernel_route.rt_gateway)->sin_family = AF_INET;
+  ((struct sockaddr_in*)&kernel_route.rt_genmask)->sin_family = AF_INET;
 
   /* 224.0.0.0/4 */
 
   /* 224.0.0.0/4 */
-  ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&kernel_route.rt_dst)->sin_addr.s_addr = htonl(0xE0000000);
-  ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&kernel_route.rt_genmask)->sin_addr.s_addr = htonl(0xF0000000);
+  ((struct sockaddr_in *)&kernel_route.rt_dst)->sin_addr.s_addr = htonl(0xE0000000);
+  ((struct sockaddr_in *)&kernel_route.rt_genmask)->sin_addr.s_addr = htonl(0xF0000000);
 
   kernel_route.rt_metric = 0;
   kernel_route.rt_flags = RTF_UP;
 
   kernel_route.rt_dev = EtherTunTapIfName;
 
 
   kernel_route.rt_metric = 0;
   kernel_route.rt_flags = RTF_UP;
 
   kernel_route.rt_dev = EtherTunTapIfName;
 
-  if (ioctl(ioctlSkfd, SIOCADDRT, &kernel_route) < 0) {
+  if (ioctl(ioctlSkfd, SIOCADDRT, &kernel_route) < 0)
+  {
     BmfPError("error setting multicast route via EtherTunTap interface \"%s\"", EtherTunTapIfName);
 
     /* Continue anyway */
   }
   close(ioctlSkfd);
     BmfPError("error setting multicast route via EtherTunTap interface \"%s\"", EtherTunTapIfName);
 
     /* Continue anyway */
   }
   close(ioctlSkfd);
-}                               /* AddMulticastRoute */
+} /* AddMulticastRoute */
 
 /* -------------------------------------------------------------------------
  * Function   : DeleteMulticastRoute
 
 /* -------------------------------------------------------------------------
  * Function   : DeleteMulticastRoute
@@ -1660,44 +1909,39 @@ AddMulticastRoute(void)
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-void
-DeleteMulticastRoute(void)
+void DeleteMulticastRoute(void)
 {
 {
-  if (EtherTunTapIp != ETHERTUNTAPDEFAULTIP) {
+  if (EtherTunTapIp != ETHERTUNTAPDEFAULTIP)
+  {
     struct rtentry kernel_route;
     int ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0);
     struct rtentry kernel_route;
     int ioctlSkfd = socket(PF_INET, SOCK_DGRAM, 0);
-    if (ioctlSkfd < 0) {
+    if (ioctlSkfd < 0)
+    {
       BmfPError("socket(PF_INET) error");
       return;
     }
 
     memset(&kernel_route, 0, sizeof(struct rtentry));
 
       BmfPError("socket(PF_INET) error");
       return;
     }
 
     memset(&kernel_route, 0, sizeof(struct rtentry));
 
-    ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&kernel_route.rt_dst)->sin_family = AF_INET;
-    ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&kernel_route.rt_gateway)->sin_family = AF_INET;
-    ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&kernel_route.rt_genmask)->sin_family = AF_INET;
+    ((struct sockaddr_in*)&kernel_route.rt_dst)->sin_family = AF_INET;
+    ((struct sockaddr_in*)&kernel_route.rt_gateway)->sin_family = AF_INET;
+    ((struct sockaddr_in*)&kernel_route.rt_genmask)->sin_family = AF_INET;
 
     /* 224.0.0.0/4 */
 
     /* 224.0.0.0/4 */
-    ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&kernel_route.rt_dst)->sin_addr.s_addr = htonl(0xE0000000);
-    ((struct sockaddr_in *)(ARM_NOWARN_ALIGN)&kernel_route.rt_genmask)->sin_addr.s_addr = htonl(0xF0000000);
+    ((struct sockaddr_in *)&kernel_route.rt_dst)->sin_addr.s_addr = htonl(0xE0000000);
+    ((struct sockaddr_in *)&kernel_route.rt_genmask)->sin_addr.s_addr = htonl(0xF0000000);
 
     kernel_route.rt_metric = 0;
     kernel_route.rt_flags = RTF_UP;
 
     kernel_route.rt_dev = EtherTunTapIfName;
 
 
     kernel_route.rt_metric = 0;
     kernel_route.rt_flags = RTF_UP;
 
     kernel_route.rt_dev = EtherTunTapIfName;
 
-    if (ioctl(ioctlSkfd, SIOCDELRT, &kernel_route) < 0) {
+    if (ioctl(ioctlSkfd, SIOCDELRT, &kernel_route) < 0)
+    {
       BmfPError("error deleting multicast route via EtherTunTap interface \"%s\"", EtherTunTapIfName);
 
       /* Continue anyway */
     }
     close(ioctlSkfd);
       BmfPError("error deleting multicast route via EtherTunTap interface \"%s\"", EtherTunTapIfName);
 
       /* Continue anyway */
     }
     close(ioctlSkfd);
-  }                             /* if */
-}                               /* DeleteMulticastRoute */
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
+  } /* if */
+} /* DeleteMulticastRoute */
index b7d3e30..b2e5da9 100644 (file)
@@ -7,29 +7,29 @@
  * Written by Erik Tromp.
  * All rights reserved.
  *
  * 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
 
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
  * ------------------------------------------------------------------------- */
 
 /* System includes */
  * ------------------------------------------------------------------------- */
 
 /* System includes */
-#include <netinet/in.h>         /* struct in_addr */
+#include <netinet/in.h> /* struct in_addr */
 
 /* OLSR includes */
 
 /* OLSR includes */
-#include "olsr_types.h"         /* olsr_ip_addr */
-#include "olsrd_plugin.h"       /* union set_plugin_parameter_addon */
+#include "olsr_types.h" /* olsr_ip_addr */
+#include "olsrd_plugin.h" /* union set_plugin_parameter_addon */
 
 /* Plugin includes */
 
 /* Plugin includes */
-#include "Packet.h"             /* IFHWADDRLEN */
+#include "Packet.h" /* IFHWADDRLEN */
 
 /* Size of buffer in which packets are received */
 #define BMF_BUFFER_SIZE 2048
 
 
 /* Size of buffer in which packets are received */
 #define BMF_BUFFER_SIZE 2048
 
-struct TBmfInterface {
+struct TBmfInterface
+{
   /* File descriptor of raw packet socket, used for capturing multicast packets */
   int capturingSkfd;
 
   /* File descriptor of raw packet socket, used for capturing multicast packets */
   int capturingSkfd;
 
-  /* File descriptor of UDP (datagram) socket for encapsulated multicast packets.
+  /* File descriptor of UDP (datagram) socket for encapsulated multicast packets. 
    * Only used for OLSR-enabled interfaces; set to -1 if interface is not OLSR-enabled. */
   int encapsulatingSkfd;
 
    * Only used for OLSR-enabled interfaces; set to -1 if interface is not OLSR-enabled. */
   int encapsulatingSkfd;
 
@@ -71,7 +72,7 @@ struct TBmfInterface {
 
   /* OLSRs idea of this network interface. NULL if this interface is not
    * OLSR-enabled. */
 
   /* OLSRs idea of this network interface. NULL if this interface is not
    * OLSR-enabled. */
-  struct interface *olsrIntf;
+  struct interfaceolsrIntf;
 
   /* IP address of this network interface */
   union olsr_ip_addr intAddr;
 
   /* IP address of this network interface */
   union olsr_ip_addr intAddr;
@@ -79,26 +80,16 @@ struct TBmfInterface {
   /* Broadcast address of this network interface */
   union olsr_ip_addr broadAddr;
 
   /* Broadcast address of this network interface */
   union olsr_ip_addr broadAddr;
 
-#define FRAGMENT_HISTORY_SIZE 10
-  struct TFragmentHistory {
-    u_int16_t ipId;
-    u_int8_t ipProto;
-    struct in_addr ipSrc;
-    struct in_addr ipDst;
-  } fragmentHistory[FRAGMENT_HISTORY_SIZE];
-
-  int nextFragmentHistoryEntry;
-
   /* Number of received and transmitted BMF packets on this interface */
   u_int32_t nBmfPacketsRx;
   u_int32_t nBmfPacketsRxDup;
   u_int32_t nBmfPacketsTx;
 
   /* Next element in list */
   /* Number of received and transmitted BMF packets on this interface */
   u_int32_t nBmfPacketsRx;
   u_int32_t nBmfPacketsRxDup;
   u_int32_t nBmfPacketsTx;
 
   /* Next element in list */
-  struct TBmfInterface *next;
+  struct TBmfInterface* next; 
 };
 
 };
 
-extern struct TBmfInterface *BmfInterfaces;
+extern struct TBmfInterfaceBmfInterfaces;
 
 extern int HighestSkfd;
 extern fd_set InputSet;
 
 extern int HighestSkfd;
 extern fd_set InputSet;
@@ -119,36 +110,34 @@ extern int CapturePacketsOnOlsrInterfaces;
 enum TBmfMechanism { BM_BROADCAST = 0, BM_UNICAST_PROMISCUOUS };
 extern enum TBmfMechanism BmfMechanism;
 
 enum TBmfMechanism { BM_BROADCAST = 0, BM_UNICAST_PROMISCUOUS };
 extern enum TBmfMechanism BmfMechanism;
 
-int SetBmfInterfaceName(const char *ifname, void *data, set_plugin_parameter_addon addon);
-int SetBmfInterfaceIp(const char *ip, void *data, set_plugin_parameter_addon addon);
-int SetCapturePacketsOnOlsrInterfaces(const char *enable, void *data, set_plugin_parameter_addon addon);
-int SetBmfMechanism(const char *mechanism, void *data, set_plugin_parameter_addon addon);
+int SetBmfInterfaceName(const char* ifname, void* data, set_plugin_parameter_addon addon);
+int SetBmfInterfaceIp(const char* ip, void* data, set_plugin_parameter_addon addon);
+int SetCapturePacketsOnOlsrInterfaces(const char* enable, void* data, set_plugin_parameter_addon addon);
+int SetBmfMechanism(const char* mechanism, void* data, set_plugin_parameter_addon addon);
 int DeactivateSpoofFilter(void);
 void RestoreSpoofFilter(void);
 
 #define MAX_UNICAST_NEIGHBORS 10
 int DeactivateSpoofFilter(void);
 void RestoreSpoofFilter(void);
 
 #define MAX_UNICAST_NEIGHBORS 10
-struct TBestNeighbors {
-  struct link_entry *links[MAX_UNICAST_NEIGHBORS];
+struct TBestNeighbors
+{
+  struct link_entry* links[MAX_UNICAST_NEIGHBORS];
 };
 
 };
 
-void FindNeighbors(struct TBestNeighbors *neighbors, struct link_entry **bestNeighbor, struct TBmfInterface *intf,
-                   union olsr_ip_addr *source, union olsr_ip_addr *forwardedBy, union olsr_ip_addr *forwardedTo,
-                   int *nPossibleNeighbors);
+void FindNeighbors(
+  struct TBestNeighbors* neighbors,
+  struct link_entry** bestNeighbor,
+  struct TBmfInterface* intf,
+  union olsr_ip_addr* source,
+  union olsr_ip_addr* forwardedBy,
+  union olsr_ip_addr* forwardedTo,
+  int* nPossibleNeighbors);
 
 
-int CreateBmfNetworkInterfaces(struct interface *skipThisIntf);
-void AddInterface(struct interface *newIntf);
+int CreateBmfNetworkInterfaces(struct interface* skipThisIntf);
 void CloseBmfNetworkInterfaces(void);
 void CloseBmfNetworkInterfaces(void);
-int AddNonOlsrBmfIf(const char *ifName, void *data, set_plugin_parameter_addon addon);
-int IsNonOlsrBmfIf(const char *ifName);
-void CheckAndUpdateLocalBroadcast(unsigned char *ipPacket, union olsr_ip_addr *broadAddr);
+int AddNonOlsrBmfIf(const char* ifName, void* data, set_plugin_parameter_addon addon);
+int IsNonOlsrBmfIf(const charifName);
+void CheckAndUpdateLocalBroadcast(unsigned char* ipPacket, union olsr_ip_addr* broadAddr);
 void AddMulticastRoute(void);
 void DeleteMulticastRoute(void);
 
 #endif /* _BMF_NETWORKINTERFACES_H */
 void AddMulticastRoute(void);
 void DeleteMulticastRoute(void);
 
 #endif /* _BMF_NETWORKINTERFACES_H */
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index bbba9c8..cb302a6 100644 (file)
@@ -1,33 +1,32 @@
-
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands.
  * Written by Erik Tromp.
  * All rights reserved.
  *
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
 
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include "Packet.h"
 
 /* System includes */
 #include "Packet.h"
 
 /* System includes */
-#include <stddef.h>             /* NULL */
-#include <assert.h>             /* assert() */
-#include <string.h>             /* memcpy() */
-#include <sys/types.h>          /* u_int8_t, u_int16_t, u_int32_t */
-#include <netinet/in.h>         /* ntohs(), htons() */
-#include <netinet/ip.h>         /* struct iphdr */
-
-#include "defs.h"               /* ARM_NOWARN_ALIGN */
+#include <stddef.h> /* NULL */
+#include <assert.h> /* assert() */
+#include <string.h> /* memcpy() */
+#include <sys/types.h> /* u_int8_t, u_int16_t, u_int32_t */
+#include <netinet/in.h> /* ntohs(), htons() */
+#include <netinet/ip.h> /* struct iphdr */
 
 /* -------------------------------------------------------------------------
  * Function   : IsIpFragment
 
 /* -------------------------------------------------------------------------
  * Function   : IsIpFragment
  * Return     : true (1) or false (0)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : true (1) or false (0)
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-int
-IsIpFragment(unsigned char *ipPacket)
+int IsIpFragment(unsigned char* ipPacket)
 {
 {
-  struct ip *iph;
+  struct ipiph;
 
   assert(ipPacket != NULL);
 
 
   assert(ipPacket != NULL);
 
-  iph = (struct ip *)(ARM_NOWARN_ALIGN)ipPacket;
-  if ((ntohs(iph->ip_off) & IP_OFFMASK) != 0) {
+  iph = (struct ip*) ipPacket;
+  if ((ntohs(iph->ip_off) & IP_OFFMASK) != 0)
+  {
     return 1;
   }
   return 0;
     return 1;
   }
   return 0;
-}                               /* IsIpFragment */
+} /* IsIpFragment */
 
 /* -------------------------------------------------------------------------
  * Function   : GetIpTotalLength
 
 /* -------------------------------------------------------------------------
  * Function   : GetIpTotalLength
@@ -81,16 +78,15 @@ IsIpFragment(unsigned char *ipPacket)
  * Return     : IP packet length
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : IP packet length
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-u_int16_t
-GetIpTotalLength(unsigned char *ipPacket)
+u_int16_t GetIpTotalLength(unsigned char* ipPacket)
 {
 {
-  struct iphdr *iph;
+  struct iphdriph;
 
   assert(ipPacket != NULL);
 
 
   assert(ipPacket != NULL);
 
-  iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
+  iph = (struct iphdr*) ipPacket;
   return ntohs(iph->tot_len);
   return ntohs(iph->tot_len);
-}                               /* GetIpTotalLength */
+} /* GetIpTotalLength */
 
 /* -------------------------------------------------------------------------
  * Function   : GetIpHeaderLength
 
 /* -------------------------------------------------------------------------
  * Function   : GetIpHeaderLength
@@ -100,16 +96,15 @@ GetIpTotalLength(unsigned char *ipPacket)
  * Return     : IP header length
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : IP header length
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-unsigned int
-GetIpHeaderLength(unsigned char *ipPacket)
+unsigned int GetIpHeaderLength(unsigned char* ipPacket)
 {
 {
-  struct iphdr *iph;
+  struct iphdriph;
 
   assert(ipPacket != NULL);
 
 
   assert(ipPacket != NULL);
 
-  iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
+  iph = (struct iphdr*) ipPacket;
   return iph->ihl << 2;
   return iph->ihl << 2;
-}                               /* GetIpHeaderLength */
+} /* GetIpHeaderLength */
 
 /* -------------------------------------------------------------------------
  * Function   : GetTtl
 
 /* -------------------------------------------------------------------------
  * Function   : GetTtl
@@ -120,16 +115,15 @@ GetIpHeaderLength(unsigned char *ipPacket)
  * Return     : TTL value
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : TTL value
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-u_int8_t
-GetTtl(unsigned char *ipPacket)
+u_int8_t GetTtl(unsigned char* ipPacket)
 {
 {
-  struct iphdr *iph;
+  struct iphdriph;
 
   assert(ipPacket != NULL);
 
 
   assert(ipPacket != NULL);
 
-  iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
+  iph = (struct iphdr*) ipPacket;
   return iph->ttl;
   return iph->ttl;
-}                               /* GetTtl */
+} /* GetTtl */
 
 /* -------------------------------------------------------------------------
  * Function   : SaveTtlAndChecksum
 
 /* -------------------------------------------------------------------------
  * Function   : SaveTtlAndChecksum
@@ -140,17 +134,16 @@ GetTtl(unsigned char *ipPacket)
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-void
-SaveTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl)
+void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl)
 {
 {
-  struct iphdr *iph;
+  struct iphdriph;
 
   assert(ipPacket != NULL && sttl != NULL);
 
 
   assert(ipPacket != NULL && sttl != NULL);
 
-  iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
+  iph = (struct iphdr*) ipPacket;
   sttl->ttl = iph->ttl;
   sttl->check = ntohs(iph->check);
   sttl->ttl = iph->ttl;
   sttl->check = ntohs(iph->check);
-}                               /* SaveTtlAndChecksum */
+} /* SaveTtlAndChecksum */
 
 /* -------------------------------------------------------------------------
  * Function   : RestoreTtlAndChecksum
 
 /* -------------------------------------------------------------------------
  * Function   : RestoreTtlAndChecksum
@@ -162,17 +155,16 @@ SaveTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl)
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-void
-RestoreTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl)
+void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl)
 {
 {
-  struct iphdr *iph;
+  struct iphdriph;
 
   assert(ipPacket != NULL && sttl != NULL);
 
 
   assert(ipPacket != NULL && sttl != NULL);
 
-  iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
+  iph = (struct iphdr*) ipPacket;
   iph->ttl = sttl->ttl;
   iph->check = htons(sttl->check);
   iph->ttl = sttl->ttl;
   iph->check = htons(sttl->check);
-}                               /* RestoreTtlAndChecksum */
+} /* RestoreTtlAndChecksum */
 
 /* -------------------------------------------------------------------------
  * Function   : DecreaseTtlAndUpdateHeaderChecksum
 
 /* -------------------------------------------------------------------------
  * Function   : DecreaseTtlAndUpdateHeaderChecksum
@@ -184,20 +176,19 @@ RestoreTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl)
  * Data Used  : none
  * Notes      : See also RFC1141
  * ------------------------------------------------------------------------- */
  * Data Used  : none
  * Notes      : See also RFC1141
  * ------------------------------------------------------------------------- */
-void
-DecreaseTtlAndUpdateHeaderChecksum(unsigned char *ipPacket)
+void DecreaseTtlAndUpdateHeaderChecksum(unsigned char* ipPacket)
 {
 {
-  struct iphdr *iph;
+  struct iphdriph;
   u_int32_t sum;
 
   assert(ipPacket != NULL);
 
   u_int32_t sum;
 
   assert(ipPacket != NULL);
 
-  iph = (struct iphdr *)(ARM_NOWARN_ALIGN)ipPacket;
+  iph = (struct iphdr*) ipPacket;
 
 
-  iph->ttl--;                   /* decrement ttl */
-  sum = ntohs(iph->check) + 0x100;      /* increment checksum high byte */
-  iph->check = htons(sum + (sum >> 16));        /* add carry */
-}                               /* DecreaseTtlAndUpdateHeaderChecksum */
+  iph->ttl--; /* decrement ttl */
+  sum = ntohs(iph->check) + 0x100; /* increment checksum high byte */
+  iph->check = htons(sum + (sum>>16)); /* add carry */
+} /* DecreaseTtlAndUpdateHeaderChecksum */
 
 /* -------------------------------------------------------------------------
  * Function   : GetIpHeader
 
 /* -------------------------------------------------------------------------
  * Function   : GetIpHeader
@@ -207,11 +198,10 @@ DecreaseTtlAndUpdateHeaderChecksum(unsigned char *ipPacket)
  * Return     : IP header
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : IP header
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-struct ip *
-GetIpHeader(unsigned char *encapsulationUdpData)
+struct ip* GetIpHeader(unsigned char* encapsulationUdpData)
 {
 {
-  return (struct ip *)(ARM_NOWARN_ALIGN)(encapsulationUdpData + ENCAP_HDR_LEN);
-}                               /* GetIpHeader */
+  return (struct ip*)(encapsulationUdpData + ENCAP_HDR_LEN);
+} /* GetIpHeader */
 
 /* -------------------------------------------------------------------------
  * Function   : GetIpPacket
 
 /* -------------------------------------------------------------------------
  * Function   : GetIpPacket
@@ -221,11 +211,10 @@ GetIpHeader(unsigned char *encapsulationUdpData)
  * Return     : The IP packet
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : The IP packet
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-unsigned char *
-GetIpPacket(unsigned char *encapsulationUdpData)
+unsigned char* GetIpPacket(unsigned char* encapsulationUdpData)
 {
   return encapsulationUdpData + ENCAP_HDR_LEN;
 {
   return encapsulationUdpData + ENCAP_HDR_LEN;
-}                               /* GetIpPacket */
+} /* GetIpPacket */
 
 /* -------------------------------------------------------------------------
  * Function   : GetEncapsulationUdpDataLength
 
 /* -------------------------------------------------------------------------
  * Function   : GetEncapsulationUdpDataLength
@@ -235,15 +224,8 @@ GetIpPacket(unsigned char *encapsulationUdpData)
  * Return     : The encapsulation data length
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : The encapsulation data length
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-u_int16_t
-GetEncapsulationUdpDataLength(unsigned char *encapsulationUdpData)
+u_int16_t GetEncapsulationUdpDataLength(unsigned char* encapsulationUdpData)
 {
   return GetIpTotalLength(GetIpPacket(encapsulationUdpData)) + ENCAP_HDR_LEN;
 {
   return GetIpTotalLength(GetIpPacket(encapsulationUdpData)) + ENCAP_HDR_LEN;
-}                               /* GetEncapsulationUdpDataLength */
+} /* GetEncapsulationUdpDataLength */
 
 
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index 22157ce..68e8fda 100644 (file)
@@ -7,29 +7,29 @@
  * Written by Erik Tromp.
  * All rights reserved.
  *
  * 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
 
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
  * ------------------------------------------------------------------------- */
 
 /* System includes */
  * ------------------------------------------------------------------------- */
 
 /* System includes */
-#include <net/if.h>             /* IFNAMSIZ, IFHWADDRLEN */
-#include <sys/types.h>          /* u_int8_t, u_int16_t */
+#include <net/if.h> /* IFNAMSIZ, IFHWADDRLEN */
+#include <sys/types.h> /* u_int8_t, u_int16_t */
 
 /* 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 */
 
 
 /* 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 */
 
-struct TEncapHeader {
+struct TEncapHeader
+{
   /* Use a standard Type-Length-Value (TLV) element */
   u_int8_t type;
   u_int8_t len;
   /* Use a standard Type-Length-Value (TLV) element */
   u_int8_t type;
   u_int8_t len;
-  u_int16_t reserved;                  /* Always 0 */
+  u_int16_t reserved; /* Always 0 */
   u_int32_t crc32;
   u_int32_t crc32;
-} __attribute__ ((__packed__));
+} __attribute__((__packed__));
 
 #define ENCAP_HDR_LEN ((int)sizeof(struct TEncapHeader))
 #define BMF_ENCAP_TYPE 1
 #define BMF_ENCAP_LEN 6
 
 
 #define ENCAP_HDR_LEN ((int)sizeof(struct TEncapHeader))
 #define BMF_ENCAP_TYPE 1
 #define BMF_ENCAP_LEN 6
 
-struct TSaveTtl {
+struct TSaveTtl
+{
   u_int8_t ttl;
   u_int16_t check;
   u_int8_t ttl;
   u_int16_t check;
-} __attribute__ ((__packed__));
+} __attribute__((__packed__));
 
 
-int IsIpFragment(unsigned char *ipPacket);
-u_int16_t GetIpTotalLength(unsigned char *ipPacket);
-unsigned int GetIpHeaderLength(unsigned char *ipPacket);
-u_int8_t GetTtl(unsigned char *ipPacket);
-void SaveTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl);
-void RestoreTtlAndChecksum(unsigned char *ipPacket, struct TSaveTtl *sttl);
-void DecreaseTtlAndUpdateHeaderChecksum(unsigned char *ipPacket);
-struct ip *GetIpHeader(unsigned char *encapsulationUdpData);
-unsigned char *GetIpPacket(unsigned char *encapsulationUdpData);
-u_int16_t GetEncapsulationUdpDataLength(unsigned char *encapsulationUdpData);
+int IsIpFragment(unsigned charipPacket);
+u_int16_t GetIpTotalLength(unsigned charipPacket);
+unsigned int GetIpHeaderLength(unsigned charipPacket);
+u_int8_t GetTtl(unsigned charipPacket);
+void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl);
+void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl);
+void DecreaseTtlAndUpdateHeaderChecksum(unsigned charipPacket);
+struct ip* GetIpHeader(unsigned char* encapsulationUdpData);
+unsigned char* GetIpPacket(unsigned char* encapsulationUdpData);
+u_int16_t GetEncapsulationUdpDataLength(unsigned charencapsulationUdpData);
 
 #endif /* _BMF_PACKET_H */
 
 #endif /* _BMF_PACKET_H */
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index 2e8528e..e759ae9 100644 (file)
@@ -1,33 +1,32 @@
-
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands.
  * Written by Erik Tromp.
  * All rights reserved.
  *
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
 
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include "PacketHistory.h"
 
 /* System includes */
 #include "PacketHistory.h"
 
 /* System includes */
-#include <stddef.h>             /* NULL */
-#include <assert.h>             /* assert() */
-#include <string.h>             /* memset */
-#include <sys/types.h>          /* u_int16_t, u_int32_t */
-#include <netinet/ip.h>         /* struct iphdr */
+#include <stddef.h> /* NULL */
+#include <assert.h> /* assert() */
+#include <string.h> /* memset */
+#include <sys/types.h> /* u_int16_t, u_int32_t */
+#include <netinet/ip.h> /* struct iphdr */
+#include <stdlib.h> /* free() */
 
 /* OLSRD includes */
 
 /* OLSRD includes */
-#include "defs.h"               /* GET_TIMESTAMP, TIMED_OUT */
-#include "olsr.h"               /* olsr_printf */
-#include "scheduler.h"
+#include "olsr.h" /* olsr_printf */
+#include "scheduler.h" /* GET_TIMESTAMP, TIMED_OUT */
 
 /* Plugin includes */
 #include "Packet.h"
 
 
 /* Plugin includes */
 #include "Packet.h"
 
-static struct TDupEntry *PacketHistory[HISTORY_HASH_SIZE];
+static struct TDupEntryPacketHistory[HISTORY_HASH_SIZE];
 
 #define CRC_UPTO_NBYTES 256
 
 #if 0
 
 #define CRC_UPTO_NBYTES 256
 
 #if 0
-
 /* -------------------------------------------------------------------------
  * Function   : CalcCrcCcitt
  * Description: Calculate 16-bits CRC according to CRC-CCITT specification
 /* -------------------------------------------------------------------------
  * Function   : CalcCrcCcitt
  * Description: Calculate 16-bits CRC according to CRC-CCITT specification
@@ -71,25 +69,25 @@ static struct TDupEntry *PacketHistory[HISTORY_HASH_SIZE];
  * Return     : CRC-16 value
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : CRC-16 value
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-static u_int16_t
-CalcCrcCcitt(unsigned char *buffer, ssize_t len)
+static u_int16_t CalcCrcCcitt(unsigned char* buffer, ssize_t len)
 {
   /* Initial value of 0xFFFF should be 0x1D0F according to
    * www.joegeluso.com/software/articles/ccitt.htm */
 {
   /* Initial value of 0xFFFF should be 0x1D0F according to
    * www.joegeluso.com/software/articles/ccitt.htm */
-  u_int16_t crc = 0xFFFF;
+  u_int16_t crc = 0xFFFF; 
   int i;
 
   assert(buffer != NULL);
 
   int i;
 
   assert(buffer != NULL);
 
-  for (i = 0; i < len; i++) {
-    crc = (unsigned char)(crc >> 8) | (crc << 8);
+  for (i = 0; i < len; i++)
+  {
+    crc  = (unsigned char)(crc >> 8) | (crc << 8);
     crc ^= buffer[i];
     crc ^= (unsigned char)(crc & 0xff) >> 4;
     crc ^= (crc << 8) << 4;
     crc ^= ((crc & 0xff) << 4) << 1;
   }
   return crc;
     crc ^= buffer[i];
     crc ^= (unsigned char)(crc & 0xff) >> 4;
     crc ^= (crc << 8) << 4;
     crc ^= ((crc & 0xff) << 4) << 1;
   }
   return crc;
-}                               /* CalcCrcCcitt */
+} /* CalcCrcCcitt */
 #endif
 
 /* -------------------------------------------------------------------------
 #endif
 
 /* -------------------------------------------------------------------------
@@ -101,27 +99,31 @@ CalcCrcCcitt(unsigned char *buffer, ssize_t len)
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-#define CRC32_POLYNOMIAL 0xedb88320UL   /* bit-inverse of 0x04c11db7UL */
+#define CRC32_POLYNOMIAL 0xedb88320UL /* bit-inverse of 0x04c11db7UL */
 
 static unsigned long CrcTable[256];
 
 
 static unsigned long CrcTable[256];
 
-static void
-GenerateCrc32Table(void)
+static void GenerateCrc32Table(void)
 {
   int i, j;
   u_int32_t crc;
 {
   int i, j;
   u_int32_t crc;
-  for (i = 0; i < 256; i++) {
+  for (i = 0; i < 256; i++)
+  {
     crc = (u_int32_t) i;
     crc = (u_int32_t) i;
-    for (j = 0; j < 8; j++) {
-      if (crc & 1) {
+    for (j = 0; j < 8; j++)
+    {
+      if (crc & 1)
+      {
         crc = (crc >> 1) ^ CRC32_POLYNOMIAL;
         crc = (crc >> 1) ^ CRC32_POLYNOMIAL;
-      } else {
+      }
+      else
+      {
         crc = (crc >> 1);
       }
     }
     CrcTable[i] = crc;
         crc = (crc >> 1);
       }
     }
     CrcTable[i] = crc;
-  }                             /* for */
-}                               /* GenerateCrc32Table */
+  } /* for */
+} /* GenerateCrc32Table */
 
 /* -------------------------------------------------------------------------
  * Function   : CalcCrc32
 
 /* -------------------------------------------------------------------------
  * Function   : CalcCrc32
@@ -132,17 +134,17 @@ GenerateCrc32Table(void)
  * Return     : CRC-32 value
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : CRC-32 value
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-static u_int32_t
-CalcCrc32(unsigned char *buffer, ssize_t len)
+static u_int32_t CalcCrc32(unsigned char* buffer, ssize_t len)
 {
   int i, j;
   u_int32_t crc = 0xffffffffUL;
 {
   int i, j;
   u_int32_t crc = 0xffffffffUL;
-  for (i = 0; i < len; i++) {
-    j = ((int)(crc & 0xFF) ^ *buffer++);
+  for (i = 0; i < len; i++)
+  {
+    j = ((int) (crc & 0xFF) ^ *buffer++);
     crc = (crc >> 8) ^ CrcTable[j];
   }
   return crc ^ 0xffffffffUL;
     crc = (crc >> 8) ^ CrcTable[j];
   }
   return crc ^ 0xffffffffUL;
-}                               /* CalcCrc32 */
+} /* CalcCrc32 */
 
 /* -------------------------------------------------------------------------
  * Function   : PacketCrc32
 
 /* -------------------------------------------------------------------------
  * Function   : PacketCrc32
@@ -153,11 +155,10 @@ CalcCrc32(unsigned char *buffer, ssize_t len)
  * Return     : 32-bits CRC value
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : 32-bits CRC value
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-u_int32_t
-PacketCrc32(unsigned char *ipPacket, ssize_t len)
+u_int32_t PacketCrc32(unsigned char* ipPacket, ssize_t len)
 {
   struct TSaveTtl sttl;
 {
   struct TSaveTtl sttl;
-  struct ip *ipHeader;
+  struct ipipHeader;
   u_int32_t result;
 
   assert(ipPacket != NULL);
   u_int32_t result;
 
   assert(ipPacket != NULL);
@@ -172,21 +173,22 @@ PacketCrc32(unsigned char *ipPacket, ssize_t len)
    * Clip number of bytes over which CRC is calculated to prevent
    * long packets from possibly claiming too much CPU resources. */
   assert(len > 0);
    * Clip number of bytes over which CRC is calculated to prevent
    * long packets from possibly claiming too much CPU resources. */
   assert(len > 0);
-  if (len > CRC_UPTO_NBYTES) {
+  if (len > CRC_UPTO_NBYTES)
+  {
     len = CRC_UPTO_NBYTES;
   }
 
   SaveTtlAndChecksum(ipPacket, &sttl);
 
     len = CRC_UPTO_NBYTES;
   }
 
   SaveTtlAndChecksum(ipPacket, &sttl);
 
-  ipHeader = (struct ip *)(ARM_NOWARN_ALIGN)ipPacket;
-  ipHeader->ip_ttl = 0xFF;      /* fixed value of TTL for CRC-32 calculation */
-  ipHeader->ip_sum = 0x5A5A;    /* fixed value of IP header checksum for CRC-32 calculation */
+  ipHeader = (struct ip*)ipPacket;
+  ipHeader->ip_ttl = 0xFF; /* fixed value of TTL for CRC-32 calculation */
+  ipHeader->ip_sum = 0x5A5A; /* fixed value of IP header checksum for CRC-32 calculation */
 
   result = CalcCrc32(ipPacket, len);
 
   RestoreTtlAndChecksum(ipPacket, &sttl);
   return result;
 
   result = CalcCrc32(ipPacket, len);
 
   RestoreTtlAndChecksum(ipPacket, &sttl);
   return result;
-}                               /* PacketCrc32 */
+} /* PacketCrc32 */
 
 /* -------------------------------------------------------------------------
  * Function   : Hash
 
 /* -------------------------------------------------------------------------
  * Function   : Hash
@@ -196,11 +198,10 @@ PacketCrc32(unsigned char *ipPacket, ssize_t len)
  * Return     : hash value
  * Data Used  : none
  * ------------------------------------------------------------------------- */
  * Return     : hash value
  * Data Used  : none
  * ------------------------------------------------------------------------- */
-u_int32_t
-Hash(u_int32_t from32)
+u_int32_t Hash(u_int32_t from32)
 {
   return ((from32 >> N_HASH_BITS) + from32) & ((1 << N_HASH_BITS) - 1);
 {
   return ((from32 >> N_HASH_BITS) + from32) & ((1 << N_HASH_BITS) - 1);
-}                               /* Hash */
+} /* Hash */
 
 /* -------------------------------------------------------------------------
  * Function   : InitPacketHistory
 
 /* -------------------------------------------------------------------------
  * Function   : InitPacketHistory
@@ -210,17 +211,17 @@ Hash(u_int32_t from32)
  * Return     : none
  * Data Used  : PacketHistory
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : PacketHistory
  * ------------------------------------------------------------------------- */
-void
-InitPacketHistory(void)
+void InitPacketHistory(void)
 {
   int i;
 
   GenerateCrc32Table();
 
 {
   int i;
 
   GenerateCrc32Table();
 
-  for (i = 0; i < HISTORY_HASH_SIZE; i++) {
+  for(i = 0; i < HISTORY_HASH_SIZE; i++)
+  {
     PacketHistory[i] = NULL;
   }
     PacketHistory[i] = NULL;
   }
-}                               /* InitPacketHistory */
+} /* InitPacketHistory */
 
 /* -------------------------------------------------------------------------
  * Function   : CheckAndMarkRecentPacket
 
 /* -------------------------------------------------------------------------
  * Function   : CheckAndMarkRecentPacket
@@ -231,32 +232,34 @@ InitPacketHistory(void)
  * Return     : not recently seen (0), recently seen (1)
  * Data Used  : PacketHistory
  * ------------------------------------------------------------------------- */
  * Return     : not recently seen (0), recently seen (1)
  * Data Used  : PacketHistory
  * ------------------------------------------------------------------------- */
-int
-CheckAndMarkRecentPacket(u_int32_t crc32)
+int CheckAndMarkRecentPacket(u_int32_t crc32)
 {
   u_int32_t idx;
 {
   u_int32_t idx;
-  struct TDupEntry *walker;
-  struct TDupEntry *newEntry;
+  struct TDupEntrywalker;
+  struct TDupEntrynewEntry;
 
   idx = Hash(crc32);
   assert(idx < HISTORY_HASH_SIZE);
 
 
   idx = Hash(crc32);
   assert(idx < HISTORY_HASH_SIZE);
 
-  for (walker = PacketHistory[idx]; walker != NULL; walker = walker->next) {
-    if (walker->crc32 == crc32) {
+  for (walker = PacketHistory[idx]; walker != NULL; walker = walker->next)
+  {
+    if (walker->crc32 == crc32)
+    {
       /* Found duplicate entry */
 
       /* Always mark as "seen recently": refresh time-out */
       walker->timeOut = olsr_getTimestamp(HISTORY_HOLD_TIME);
 
       return 1;
       /* Found duplicate entry */
 
       /* Always mark as "seen recently": refresh time-out */
       walker->timeOut = olsr_getTimestamp(HISTORY_HOLD_TIME);
 
       return 1;
-    }                           /* if */
-  }                             /* for */
+    } /* if */
+  } /* for */
 
   /* No duplicate entry found: create one */
 
   /* No duplicate entry found: create one */
-  newEntry = malloc(sizeof(struct TDupEntry));
-  if (newEntry != NULL) {
+  newEntry = olsr_malloc(sizeof(struct TDupEntry), "BMF: TDupEntry");
+  if (newEntry != NULL)
+  {
     newEntry->crc32 = crc32;
     newEntry->crc32 = crc32;
-    newEntry->timeOut = GET_TIMESTAMP(HISTORY_HOLD_TIME);
+    newEntry->timeOut = olsr_getTimestamp(HISTORY_HOLD_TIME);
 
     /* Add new entry at the front of the list */
     newEntry->next = PacketHistory[idx];
 
     /* Add new entry at the front of the list */
     newEntry->next = PacketHistory[idx];
@@ -264,8 +267,8 @@ CheckAndMarkRecentPacket(u_int32_t crc32)
   }
 
   return 0;
   }
 
   return 0;
-}                               /* CheckAndMarkRecentPacket */
-
+} /* CheckAndMarkRecentPacket */
+  
 /* -------------------------------------------------------------------------
  * Function   : PrunePacketHistory
  * Description: Prune the packet history table.
 /* -------------------------------------------------------------------------
  * Function   : PrunePacketHistory
  * Description: Prune the packet history table.
@@ -274,39 +277,40 @@ CheckAndMarkRecentPacket(u_int32_t crc32)
  * Return     : none
  * Data Used  : PacketHistory
  * ------------------------------------------------------------------------- */
  * Return     : none
  * Data Used  : PacketHistory
  * ------------------------------------------------------------------------- */
-void
-PrunePacketHistory(void *useless __attribute__ ((unused)))
+void PrunePacketHistory(void* useless __attribute__((unused)))
 {
   uint i;
 {
   uint i;
-  for (i = 0; i < HISTORY_HASH_SIZE; i++) {
-    if (PacketHistory[i] != NULL) {
-      struct TDupEntry *nextEntry = PacketHistory[i];
-      struct TDupEntry *prevEntry = NULL;
-      while (nextEntry != NULL) {
-        struct TDupEntry *entry = nextEntry;
+  for (i = 0; i < HISTORY_HASH_SIZE; i++)
+  {
+    if (PacketHistory[i] != NULL)
+    {
+      struct TDupEntry* nextEntry = PacketHistory[i];
+      struct TDupEntry* prevEntry = NULL;
+      while (nextEntry != NULL) 
+      {
+        struct TDupEntry* entry = nextEntry;
         nextEntry = entry->next;
 
         nextEntry = entry->next;
 
-        if (TIMED_OUT(entry->timeOut)) {
+        if (olsr_isTimedOut(entry->timeOut))
+        {
           /* De-queue */
           /* De-queue */
-          if (prevEntry != NULL) {
+          if (prevEntry != NULL)
+          {
             prevEntry->next = entry->next;
             prevEntry->next = entry->next;
-          } else {
+          }
+          else
+          {
             PacketHistory[i] = entry->next;
             PacketHistory[i] = entry->next;
-          }                     /* if */
+          } /* if */
 
           /* De-allocate memory */
 
           /* De-allocate memory */
-          free(entry);
-        } else {
-          prevEntry = entry;
-        }                       /* if */
-      }                         /* while */
-    }                           /* if (PacketHistory[i] != NULL) */
-  }                             /* for (i = ...) */
-}                               /* PrunePacketHistory */
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
+          free(entry); 
+             }
+             else
+             {
+               prevEntry = entry;
+             } /* if */
+      } /* while */
+    } /* if (PacketHistory[i] != NULL) */
+  } /* for (i = ...) */
+} /* PrunePacketHistory */
index d725bb3..229b299 100644 (file)
@@ -7,29 +7,29 @@
  * Written by Erik Tromp.
  * All rights reserved.
  *
  * 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
 
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
@@ -42,7 +42,8 @@
  * ------------------------------------------------------------------------- */
 
 /* System includes */
  * ------------------------------------------------------------------------- */
 
 /* System includes */
-#include <sys/types.h>          /* ssize_t */
+#include <sys/types.h> /* ssize_t */
+#include <sys/times.h> /* clock_t */
 
 #define N_HASH_BITS 12
 #define HISTORY_HASH_SIZE (1 << N_HASH_BITS)
 
 #define N_HASH_BITS 12
 #define HISTORY_HASH_SIZE (1 << N_HASH_BITS)
 /* Time-out of duplicate entries, in milliseconds */
 #define HISTORY_HOLD_TIME 3000
 
 /* Time-out of duplicate entries, in milliseconds */
 #define HISTORY_HOLD_TIME 3000
 
-struct TDupEntry {
+struct TDupEntry
+{
   u_int32_t crc32;
   u_int32_t crc32;
-  u_int32_t timeOut;
-  struct TDupEntry *next;
+  clock_t timeOut;
+  struct TDupEntrynext;
 };
 
 void InitPacketHistory(void);
 };
 
 void InitPacketHistory(void);
-u_int32_t PacketCrc32(unsigned char *ipPkt, ssize_t len);
+u_int32_t PacketCrc32(unsigned charipPkt, ssize_t len);
 u_int32_t Hash(u_int32_t from32);
 void MarkRecentPacket(u_int32_t crc32);
 int CheckAndMarkRecentPacket(u_int32_t crc32);
 u_int32_t Hash(u_int32_t from32);
 void MarkRecentPacket(u_int32_t crc32);
 int CheckAndMarkRecentPacket(u_int32_t crc32);
-void PrunePacketHistory(void *);
+void PrunePacketHistory(void*);
 
 #endif /* _BMF_PACKETHISTORY_H */
 
 #endif /* _BMF_PACKETHISTORY_H */
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index e943b36..12116b9 100644 (file)
@@ -1,33 +1,32 @@
-
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands.
  * Written by Erik Tromp.
  * All rights reserved.
  *
 /*
  * OLSR Basic Multicast Forwarding (BMF) plugin.
  * Copyright (c) 2005 - 2007, 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
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
  * are met:
  *
  * are met:
  *
- * * Redistributions of source code must retain the above copyright
+ * * Redistributions of source code must retain the above copyright 
  *   notice, this list of conditions and the following disclaimer.
  *   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
+ * * 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.
  *   distribution.
- * * Neither the name of Thales, BMF nor the names of its
- *   contributors may be used to endorse or promote products derived
+ * * 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.
  *
  *   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
+ * 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.
  */
 
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
  * ------------------------------------------------------------------------- */
 
 /* System includes */
  * ------------------------------------------------------------------------- */
 
 /* System includes */
-#include <assert.h>             /* assert() */
-#include <stddef.h>             /* NULL */
+#include <assert.h> /* assert() */
+#include <stddef.h> /* NULL */
 
 /* OLSRD includes */
 #include "olsrd_plugin.h"
 #include "plugin_util.h"
 
 /* OLSRD includes */
 #include "olsrd_plugin.h"
 #include "plugin_util.h"
-#include "defs.h"               /* uint8_t, olsr_cnf */
-#include "scheduler.h"          /* olsr_start_timer() */
+#include "defs.h" /* olsr_u8_t, olsr_cnf */
+#include "scheduler.h" /* olsr_start_timer() */
 
 /* BMF includes */
 
 /* BMF includes */
-#include "Bmf.h"                /* InitBmf(), CloseBmf() */
-#include "PacketHistory.h"      /* InitPacketHistory() */
-#include "NetworkInterfaces.h"  /* AddNonOlsrBmfIf(), SetBmfInterfaceIp(), ... */
-#include "Address.h"            /* DoLocalBroadcast() */
+#include "Bmf.h" /* InitBmf(), CloseBmf() */
+#include "PacketHistory.h" /* InitPacketHistory() */
+#include "NetworkInterfaces.h" /* AddNonOlsrBmfIf(), SetBmfInterfaceIp(), ... */
+#include "Address.h" /* DoLocalBroadcast() */
 
 static void __attribute__ ((constructor)) my_init(void);
 static void __attribute__ ((destructor)) my_fini(void);
 
 static void __attribute__ ((constructor)) my_init(void);
 static void __attribute__ ((destructor)) my_fini(void);
@@ -69,8 +68,7 @@ void olsr_plugin_exit(void);
  * Notes      : Called by main OLSRD (olsr_load_dl) to check plugin interface
  *              version
  * ------------------------------------------------------------------------- */
  * Notes      : Called by main OLSRD (olsr_load_dl) to check plugin interface
  *              version
  * ------------------------------------------------------------------------- */
-int
-olsrd_plugin_interface_version(void)
+int olsrd_plugin_interface_version(void)
 {
   return PLUGIN_INTERFACE_VERSION;
 }
 {
   return PLUGIN_INTERFACE_VERSION;
 }
@@ -84,11 +82,11 @@ olsrd_plugin_interface_version(void)
  * Data Used  : olsr_cnf
  * Notes      : Called by main OLSRD (init_olsr_plugin) to initialize plugin
  * ------------------------------------------------------------------------- */
  * Data Used  : olsr_cnf
  * Notes      : Called by main OLSRD (init_olsr_plugin) to initialize plugin
  * ------------------------------------------------------------------------- */
-int
-olsrd_plugin_init(void)
+int olsrd_plugin_init(void)
 {
   /* Check validity */
 {
   /* Check validity */
-  if (olsr_cnf->ip_version != AF_INET) {
+  if (olsr_cnf->ip_version != AF_INET)
+  {
     fprintf(stderr, PLUGIN_NAME ": This plugin only supports IPv4!\n");
     return 0;
   }
     fprintf(stderr, PLUGIN_NAME ": This plugin only supports IPv4!\n");
     return 0;
   }
@@ -100,7 +98,9 @@ olsrd_plugin_init(void)
   olsr_add_ifchange_handler(&InterfaceChange);
 
   /* Register the duplicate registration pruning process */
   olsr_add_ifchange_handler(&InterfaceChange);
 
   /* Register the duplicate registration pruning process */
-  olsr_start_timer(3 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC, &PrunePacketHistory, NULL, 0);
+  olsr_start_timer(3 * MSEC_PER_SEC, 0, OLSR_TIMER_PERIODIC,
+                   &PrunePacketHistory, NULL, 0);
+
 
   return InitBmf(NULL);
 }
 
   return InitBmf(NULL);
 }
@@ -114,21 +114,20 @@ olsrd_plugin_init(void)
  * Data Used  : none
  * Notes      : Called by my_fini() at unload of shared object
  * ------------------------------------------------------------------------- */
  * Data Used  : none
  * Notes      : Called by my_fini() at unload of shared object
  * ------------------------------------------------------------------------- */
-void
-olsr_plugin_exit(void)
+void olsr_plugin_exit(void)
 {
   CloseBmf();
 }
 
 static const struct olsrd_plugin_parameters plugin_parameters[] = {
 {
   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},
-  {.name = "FanOutLimit",.set_plugin_parameter = &SetFanOutLimit,.data = NULL},
-  {.name = "BroadcastRetransmitCount",.set_plugin_parameter = &set_plugin_int,.data = &BroadcastRetransmitCount},
+    { .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 },
+    { .name = "FanOutLimit", .set_plugin_parameter = &SetFanOutLimit, .data = NULL },
+    { .name = "BroadcastRetransmitCount", .set_plugin_parameter = &set_plugin_int, .data = &BroadcastRetransmitCount},
 };
 
 /* ----------