Adds mode parameter to interface section of cfg.
authorHenning Rogge <rogge@fgan.de>
Mon, 19 Jan 2009 10:46:55 +0000 (11:46 +0100)
committerHenning Rogge <rogge@fgan.de>
Mon, 19 Jan 2009 10:46:55 +0000 (11:46 +0100)
Adds 'mesh' (default).
Adds 'ether' mode (for switched ethernet interfaces) to prevent
unnecessary forwardings of packages.

17 files changed:
files/olsrd-manpages.xml
files/olsrd-metrics.3.gz
files/olsrd.8.gz
files/olsrd.conf.5.gz
gui/win32/mk.sh
src/interfaces.h
src/olsr.c
src/olsr.h
src/olsr_cfg.c
src/olsr_cfg.h
src/olsr_cfg_data.c [moved from src/olsr_logging_data.c with 90% similarity]
src/olsr_cfg_data.h [moved from src/olsr_logging_data.h with 70% similarity]
src/olsr_logging.c
src/olsr_logging.h
src/parser.c
src/unix/ifnet.c
src/win32/ifnet.c

index 1426c0c..54145a9 100644 (file)
 
             <variablelist>
               <varlistentry>
+                <term><option>Mode</option>
+                <replaceable>mesh</replaceable>|<replaceable>ether</replaceable></term>
+
+                <listitem>
+                  <para><productname>olsrd</productname> can be used on wireless interfaces
+                  and ethernet. To prevent unnecessary packet forwardings on switched
+                  ethernet interfaces the mode of an interface can be set to <option>ether</option>. 
+                  The default value of this option is <option>mesh</option>.</para>
+                </listitem>
+              </varlistentry>
+
+              <varlistentry>
                 <term><option>AutoDetectChanges</option>
                 <replaceable>yes</replaceable>|<replaceable>no</replaceable></term>
 
index 7a2e281..8d1ecd5 100644 (file)
Binary files a/files/olsrd-metrics.3.gz and b/files/olsrd-metrics.3.gz differ
index ca2b9df..fc3f494 100644 (file)
Binary files a/files/olsrd.8.gz and b/files/olsrd.8.gz differ
index 994bf70..c036bd8 100644 (file)
Binary files a/files/olsrd.conf.5.gz and b/files/olsrd.conf.5.gz differ
index 25a2389..f572e32 100755 (executable)
@@ -3,7 +3,7 @@
 #CFLAGS="-O0 -ggdb -DDEBUG"
 CFLAGS="-ggdb -O2 -DNODEBUG -DNDEBUG"
 
-SRCS="olsr_cfg olsr_cfg_gen olsr_ip_acl olsr_ip_prefix_list olsr_logging_data ipcalc builddata common/autobuf"
+SRCS="olsr_cfg olsr_cfg_gen olsr_ip_acl olsr_ip_prefix_list olsr_cfg_data ipcalc builddata common/autobuf"
 OBJS=
 
 for i in $SRCS; do
index a4447ab..7366ebc 100644 (file)
@@ -53,6 +53,7 @@
 #include <time.h>
 
 #include "olsr_types.h"
+#include "olsr_cfg_data.h"
 #include "mantissa.h"
 #include "common/list.h"
 
@@ -129,6 +130,8 @@ struct olsr_netbuf {
 struct interface {
   struct list_node int_node;          /* List of all interfaces */
 
+  enum interface_mode mode;          /* mode of the interface, default is mesh */
+
   /* IP version 4 */
   struct sockaddr_in int_addr;        /* address */
   struct sockaddr_in int_netmask;      /* netmask */
index 2043adb..8dc006a 100644 (file)
@@ -291,7 +291,7 @@ olsr_init_tables(void)
  *@returns positive if forwarded
  */
 int
-olsr_forward_message(union olsr_message *m,
+olsr_forward_message(union olsr_message *m, struct interface *in_if,
                     union olsr_ip_addr *from_addr)
 {
   union olsr_ip_addr *src;
@@ -361,6 +361,10 @@ olsr_forward_message(union olsr_message *m,
   OLSR_FOR_ALL_INTERFACES(ifn) {
       if(net_output_pending(ifn))
        {
+    /* dont forward to incoming interface if interface is mode ether */
+    if (in_if->mode == IF_MODE_ETHER && ifn == in_if)
+      continue;
+
          /*
           * Check if message is to big to be piggybacked
           */
index b52a876..13fe25f 100644 (file)
@@ -63,7 +63,7 @@ uint16_t
 EXPORT(get_msg_seqno)(void);
 
 int
-olsr_forward_message(union olsr_message *,
+olsr_forward_message(union olsr_message *, struct interface *,
                     union olsr_ip_addr *);
 
 void
index 7e42f5e..2f1e4fb 100644 (file)
@@ -40,7 +40,7 @@
  */
 
 #include "olsr_cfg.h"
-#include "olsr_logging_data.h"
+#include "olsr_cfg_data.h"
 
 #include "olsr.h"
 #include "parser.h"
@@ -281,7 +281,7 @@ get_default_olsr_if_options(void)
   new_io->hna_params.validity_time = HNA_HOLD_TIME;
   /* new_io->lq_mult = NULL; */
   new_io->autodetect_chg = true;
-
+  new_io->mode = IF_MODE_MESH;
   return new_io;
 }
 
@@ -420,7 +420,16 @@ parse_cfg_interface(char *argstr, struct olsr_config *rcfg, char *rmsg)
             parse_tok_free(tok);
             return CFG_ERROR;
           }
-          if (0 == strcmp("AutoDetectChanges", p_next[0])) {
+          if (0 == strcmp("Mode", p_next[0])) {
+            if (0 == strcasecmp("Ether", p_next[1])) {
+              new_if->cnf->mode = IF_MODE_ETHER;
+            }
+            else {
+              new_if->cnf->mode = IF_MODE_MESH;
+            }
+            PARSER_DEBUG_PRINTF("\tMode: %s\n", INTERFACE_MODE_NAMES[new_if->cnf->mode]);
+          }
+          else if (0 == strcmp("AutoDetectChanges", p_next[0])) {
             new_if->cnf->autodetect_chg = (0 == strcmp("yes", p_next[1]));
             PARSER_DEBUG_PRINTF("\tAutodetect changes: %d\n", new_if->cnf->autodetect_chg);
           } else if (0 == strcmp("Ip4Broadcast", p_next[0])) {
index 9c0bb15..c4a0999 100644 (file)
@@ -136,6 +136,7 @@ struct olsr_if_options {
   struct olsr_msg_params hna_params;
   struct olsr_lq_mult *lq_mult;
   bool autodetect_chg;
+  enum interface_mode mode;
 };
 
 struct olsr_if_config {
similarity index 90%
rename from src/olsr_logging_data.c
rename to src/olsr_cfg_data.c
index 79ad621..e3da9c6 100644 (file)
  *
  */
 
-#include "olsr_logging_data.h"
+#include "olsr_cfg_data.h"
 
 /*
- * String constants for olsr_log_* as used in olsrd.conf.
+ * String constants for olsr_log_* and if_mode as used in olsrd.conf.
  * Keep this in the same order as the log_source and
- * log_severity enums (see olsr_logging_data.h).
+ * log_severity enums (see olsr_cfg_data.h).
  */
 
 const char *LOG_SOURCE_NAMES[] = {
@@ -58,3 +58,8 @@ const char *LOG_SEVERITY_NAMES[] = {
   "ERROR"
 };
 
+
+const char *INTERFACE_MODE_NAMES[] = {
+    "mesh",
+    "ether"
+};
similarity index 70%
rename from src/olsr_logging_data.h
rename to src/olsr_cfg_data.h
index 6b440aa..4ffdf7a 100644 (file)
 #ifndef OLSR_CFG_DATA_H_
 #define OLSR_CFG_DATA_H_
 
+/**
+ * defines the source of a logging event
+ */
 enum log_source {
-  LOG_ALL,
-  LOG_LOGGING,
+  LOG_ALL,        //!< LOG_ALL
+  LOG_LOGGING,    //!< LOG_LOGGING
 
   /* this one must be the last of the enums ! */
-  LOG_SOURCE_COUNT
+  LOG_SOURCE_COUNT//!< LOG_SOURCE_COUNT
 };
 
+/**
+ * defines the severity of a logging event
+ */
 enum log_severity {
-  SEVERITY_DEBUG,
-  SEVERITY_INFO,
-  SEVERITY_WARN,
-  SEVERITY_ERROR,
+  SEVERITY_DEBUG,   //!< SEVERITY_DEBUG
+  SEVERITY_INFO,    //!< SEVERITY_INFO
+  SEVERITY_WARN,    //!< SEVERITY_WARN
+  SEVERITY_ERROR,   //!< SEVERITY_ERROR
 
   /* this one must be the last of the enums ! */
-  LOG_SEVERITY_COUNT
+  LOG_SEVERITY_COUNT//!< LOG_SEVERITY_COUNT
+};
+
+/**
+ * defines the mode of the interface.
+ *
+ * - Mesh: default behavior
+ * - Ether: an interface with nearly no packet loss and a "closed" broadcast
+ *   domain. This means packages received through this interface does not need
+ *   to be forwarded through the interface again.
+ */
+enum interface_mode {
+  IF_MODE_MESH, //!< IF_MODE_MESH
+  IF_MODE_ETHER,//!< IF_MODE_ETHER
+
+  /* this must be the last entry */
+  IF_MODE_COUNT //!< IF_MODE_COUNT
 };
 
+
 extern const char *LOG_SOURCE_NAMES[];
 extern const char *LOG_SEVERITY_NAMES[];
+extern const char *INTERFACE_MODE_NAMES[];
 
 #endif /* OLSR_CFG_DATA_H_ */
index cee0ffe..28a879a 100644 (file)
@@ -46,8 +46,8 @@
 #include <sys/time.h>
 
 #include "olsr_cfg.h"
+#include "olsr_cfg_data.h"
 #include "olsr_logging.h"
-#include "olsr_logging_data.h"
 #include "log.h"
 
 struct log_handler_entry {
index bfaf7ed..694d52e 100644 (file)
@@ -42,7 +42,7 @@
 #define OLSR_LOGGING_H_
 
 #include "defs.h"
-#include "olsr_logging_data.h"
+#include "olsr_cfg_data.h"
 
 #define LOGBUFFER_SIZE 1024
 #define MAX_LOG_HANDLER 8
index 1ef7f97..c8a0d6b 100644 (file)
@@ -326,7 +326,7 @@ static void parse_packet(struct olsr *olsr, int size, struct interface *in_if, u
     }
 
     if (forward) {
-      olsr_forward_message(m, from_addr);
+      olsr_forward_message(m, in_if, from_addr);
     }
   } /* for olsr_msg */
 }
index 594c923..ab6c01a 100644 (file)
@@ -786,6 +786,8 @@ chk_if_up(struct olsr_if_config *iface, int debuglvl __attribute__((unused)))
   ifp->valtimes.mid = reltime_to_me(iface->cnf->mid_params.validity_time * MSEC_PER_SEC);
   ifp->valtimes.hna = reltime_to_me(iface->cnf->hna_params.validity_time * MSEC_PER_SEC);
 
+  ifp->mode = iface->cnf->mode;
+
   /*
    * Call possible ifchange functions registered by plugins
    */
index d01773a..b2a4bb8 100644 (file)
@@ -963,6 +963,8 @@ int chk_if_up(struct olsr_if_config *IntConf, int DebugLevel __attribute__((unus
   New->valtimes.mid = reltime_to_me(IntConf->cnf->mid_params.validity_time * MSEC_PER_SEC);
   New->valtimes.hna = reltime_to_me(IntConf->cnf->hna_params.validity_time * MSEC_PER_SEC);
 
+  New->mode = IntConf->cnf->mode;
+
   /*
    * Call possible ifchange functions registered by plugins
    */