bmf: allow marking the BMF network interface as non-persistent
authorFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 3 Aug 2012 17:53:30 +0000 (19:53 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 3 Aug 2012 17:56:46 +0000 (19:56 +0200)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/bmf/README_BMF
lib/bmf/src/NetworkInterfaces.c
lib/bmf/src/NetworkInterfaces.h
lib/bmf/src/olsrd_plugin.c

index ec313da..d92f1b5 100644 (file)
@@ -201,6 +201,12 @@ network.
     # The default prefix length is 32.
     PlParam "BmfInterfaceIp" "10.10.10.234/24"
 
+    # Enable or disable marking the BMF network interface as persistent.
+    # When the interface is persistent (default) then it will not be removed
+    # when olsrd shuts down. This is to facilitate other programs (for example
+    # multicast routing daemon mrouted) to continue using it.
+    PlParam "BmfInterfacePersistent" "yes"
+
     # Enable or disable the flooding of local broadcast packets
     # (e.g. packets with IP destination 192.168.1.255). Either "yes"
     # or "no". Defaults to "yes".
index 548c0f7..0657f55 100644 (file)
@@ -108,6 +108,9 @@ u_int32_t EtherTunTapIpMask = 0xFFFFFFFF;
  * May be overruled by setting the plugin parameter "BmfinterfaceIp". */
 u_int32_t EtherTunTapIpBroadcast = ETHERTUNTAPIPNOTSET;
 
+/* Whether or not the BMF network interface must be marked as persistent */
+int EtherTunTapPersistent = 1;
+
 /* Whether or not the configuration has overruled the default IP
  * configuration of the EtherTunTap interface */
 int TunTapIpOverruled = 0;
@@ -212,6 +215,32 @@ int SetBmfInterfaceIp(
   return 0;
 } /* SetBmfInterfaceIp */
 
+/* -------------------------------------------------------------------------
+ * Function   : SetBmfInterfacePersistent
+ * Description: Determine if the EtherTunTap interface must be marked
+ *              persistent or not
+ * Input      : value - yes/true/1  or no/false/0
+ *              data  - not used
+ *              addon - not used
+ * Output     : none
+ * Return     : success (0) or fail (1)
+ * Data Used  : EtherTunTapPersistent
+ * ------------------------------------------------------------------------- */
+int SetBmfInterfacePersistent(
+  const char* value,
+  void* data __attribute__((unused)),
+  set_plugin_parameter_addon addon __attribute__((unused)))
+{
+       if (strcasecmp(value, "yes") == 0 || strcasecmp(value, "true") == 0 || strcasecmp(value, "1") == 0) {
+               EtherTunTapPersistent = 1;
+       } else if (strcasecmp(value, "no") == 0 || strcasecmp(value, "false") == 0 || strcasecmp(value, "0") == 0) {
+               EtherTunTapPersistent = 0;
+       } else {
+               return 1;
+       }
+       return 0;
+} /* SetBmfInterfacePersistent */
+
 /* -------------------------------------------------------------------------
  * Function   : SetCapturePacketsOnOlsrInterfaces
  * Description: Overrule the default setting, enabling or disabling the
@@ -1298,9 +1327,9 @@ static int 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. */
-  if (ioctl(etfd, TUNSETPERSIST, (void *)&ifreq) < 0)
+  if (ioctl(etfd, TUNSETPERSIST, EtherTunTapPersistent ? (void *)&ifreq : NULL) < 0)
   {
-    BmfPError("error making EtherTunTap interface \"%s\" persistent", EtherTunTapIfName);
+    BmfPError("error making EtherTunTap interface \"%s\" %spersistent", EtherTunTapIfName, !EtherTunTapPersistent ? "non-" : "");
 
     /* Continue anyway */
   }
index b2e5da9..645c2e7 100644 (file)
@@ -112,6 +112,7 @@ 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 SetBmfInterfacePersistent(const char* value, 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);
index 12116b9..a533dae 100644 (file)
@@ -124,6 +124,7 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
     { .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 = "BmfInterfacePersistent", .set_plugin_parameter = &SetBmfInterfacePersistent, .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 },