Merge branch 'release-0.6.6'
authorFerry Huberts <ferry.huberts@pelagic.nl>
Sat, 17 Aug 2013 09:15:34 +0000 (11:15 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Sat, 17 Aug 2013 09:15:34 +0000 (11:15 +0200)
* release-0.6.6:
  Update version after release of v0.6.6
  Release v0.6.6
  Fix build break for MinGW compilation on Fedora 19. Still throws a lot of warnings
  jsoninfo: ensure output is wrapped in curly braces.
  pud: fix readIPAddress function
  Makefile: fix builddata when building from tarball
  build: only print the md5 hash in hash_source.sh
  build: really _ignore_ builddata.c when hashing sources
  pud: nmealib: _nmea_parse_time not parsing hsec when given "hhmmss" format
  txtinfo: update README file

Conflicts:
CHANGELOG
Makefile
gui/win32/Inst/installer.nsi
gui/win32/Main/Frontend.rc
lib/txtinfo/README_TXTINFO
make/hash_source.sh

41 files changed:
.gitignore
CHANGELOG
Makefile
Makefile.inc
debian/README.Debian
gui/win32/Inst/installer.nsi
gui/win32/Inst/linux-manual.txt
gui/win32/Main/Frontend.rc
lib/arprefresh/README_ARPREFRESH
lib/bmf/README_BMF
lib/httpinfo/src/olsrd_httpinfo.c
lib/jsoninfo/README_JSONINFO
lib/mini/README_MINI
lib/nameservice/README_NAMESERVICE
lib/pgraph/README_PGRAPH
lib/pud/Makefile
lib/pud/wireformat-java/Makefile
lib/pud/wireformat-java/resources/build.xml
lib/quagga/README_QUAGGA
lib/quagga/src/quagga.c
lib/sgwdynspeed/Makefile
lib/txtinfo/README_TXTINFO
lib/txtinfo/src/olsrd_txtinfo.c
lib/watchdog/README_WATCHDOG
make/Makefile.android
make/Makefile.fbsd
make/hash_source.sh
redhat/olsrd.spec
src/cfgparser/Makefile
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/defs.h
src/gateway.c
src/gateway.h
src/gateway_costs.c [new file with mode: 0644]
src/gateway_costs.h [new file with mode: 0644]
src/gateway_default_handler.c
src/olsr_cfg.h
unmaintained/README
unmaintained/README-Link-Quality-Fish-Eye.txt
unmaintained/README-Olsr-Switch.html

index e54968f..b09a271 100644 (file)
 /.project
 /.settings
 /build-stamp
+/builddata.txt
 /configure-stamp
 /olsrd
 /olsrd.exe
 /olsr_switch
 /olsr_switch.exe
-/olsr-setup.exe
\ No newline at end of file
+/olsr-setup.exe
+/src/cfgparser/olsrd_cfgparser
index 3f28edf..bc6b6be 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -194,6 +194,57 @@ Vasilis Tsiligiannis (1):
 equinox (1):
       quagga plugin routes additional
 
+0.6.5.5 -------------------------------------------------------------------
+
+Ferry Huberts (4):
+      build: really _ignore_ builddata.c when hashing sources
+      build: only print the md5 hash in hash_source.sh
+      Makefile: fix builddata when building from tarball
+      pud: fix readIPAddress function
+
+Henning Rogge (3):
+      Update version after release of v0.6.5.4
+      Fix build break for MinGW compilation on Fedora 19.
+      Release v0.6.5.5
+
+Scott Kidder (1):
+      jsoninfo: ensure output is wrapped in curly braces.
+
+0.6.5.4 -------------------------------------------------------------------
+
+Ferry Huberts (11):
+      Remove mercurial ignore file; we use git
+      build: ignore builddata.c when hashing sources
+      release: fix the list of generated files
+      release: update some comments
+      release: refactor the checkVersionIncrementing function
+      release: do not update the version on master when it's already higher
+      release: only report that master changed when it was actually changed
+      release: checkVersionIncrementing: optionally allow equal versions
+      release: also check against the Makefile version when branching
+      txtinfo: prevent buffer overflow
+      pud: nmealib: _nmea_parse_time not parsing hsec when given "hhmmss" format
+
+Henning Rogge (2):
+      Update version after release of v0.6.5.3
+      Release v0.6.5.4
+
+0.6.5.3 -------------------------------------------------------------------
+
+Ferry Huberts (5):
+      pud: detect the java include directory
+      pud: better detection of java jdk
+      gateway: work around kernel IPIP module initialisation bug
+      main: use /dev/urandom by default
+      pud: set local loopback for multicast tx
+
+Henning Rogge (2):
+      Update version after release of v0.6.5.2
+      Release v0.6.5.3
+
+Ronald in 't Velt (1):
+      Fix setsockopt for setting Traffic Class in IPv6
+
 0.6.5.2 -------------------------------------------------------------------
 
 Henning Rogge (2):
index 55a0721..66fe7d4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -39,7 +39,7 @@
 # Please also write a new version to:
 # gui/win32/Main/Frontend.rc (line 71, around "CAPTION [...]")
 # gui/win32/Inst/installer.nsi (line 57, around "MessageBox MB_YESNO [...]")
-VERS =         pre-0.6.6.1
+VERS =         pre-0.6.7
 
 TOPDIR = .
 INSTALLOVERWRITE ?=
@@ -84,16 +84,15 @@ switch:
        $(MAKECMDPREFIX)$(MAKECMD) -C $(SWITCHDIR)
 
 # generate it always
-.PHONY: src/builddata.c
-src/builddata.c:
-       $(MAKECMDPREFIX)$(RM) "$@"
-       $(MAKECMDPREFIX)echo "#include \"defs.h\"" >> "$@" 
-       $(MAKECMDPREFIX)echo "const char olsrd_version[] = \"olsr.org -  $(VERS)`./make/hash_source.sh`\";"  >> "$@"
-       $(MAKECMDPREFIX)date +"const char build_date[] = \"%Y-%m-%d %H:%M:%S\";" >> "$@" 
-       $(MAKECMDPREFIX)echo "const char build_host[] = \"$(shell hostname)\";" >> "$@" 
+.PHONY: builddata.txt
+builddata.txt:
+       $(MAKECMDPREFIX)./make/hash_source.sh "$@" "$(VERS)" "$(VERBOSE)"
 
+# only overwrite it when it doesn't exists or when it has changed
+src/builddata.c: builddata.txt
+       $(MAKECMDPREFIX)if [ ! -f "$@" ] || [ -n "$$(diff "$<" "$@")" ]; then cp -a -v "$<" "$@"; fi
 
-.PHONY: help libs clean_libs libs_clean clean distclean uberclean install_libs uninstall_libs libs_install libs_uninstall install_bin uninstall_bin install_olsrd uninstall_olsrd install uninstall build_all install_all uninstall_all clean_all gui clean_gui 
+.PHONY: help libs clean_libs libs_clean clean distclean uberclean install_libs uninstall_libs libs_install libs_uninstall install_bin uninstall_bin install_olsrd uninstall_olsrd install uninstall build_all install_all uninstall_all clean_all gui clean_gui cfgparser_install cfgparser_clean
 
 clean:
        -rm -f $(OBJS) $(SRCS:%.c=%.d) $(EXENAME) $(EXENAME).exe src/builddata.c $(TMPFILES)
@@ -127,6 +126,12 @@ install: install_olsrd
 
 uninstall: uninstall_olsrd
 
+cfgparser_install: cfgparser
+               $(MAKECMDPREFIX)$(MAKECMD) -C $(CFGDIR) install
+
+cfgparser_clean:
+               $(MAKECMDPREFIX)$(MAKECMD) -C $(CFGDIR) clean
+
 install_bin:
                mkdir -p $(SBINDIR)
                install -m 755 $(EXENAME) $(SBINDIR)
index 52fea38..77e9547 100644 (file)
@@ -57,7 +57,7 @@ TAGCMD ?=     etags
 
 # target directories and names
 DESTDIR  ?=
-ETCDIR   ?= $(DESTDIR)/etc
+ETCDIR   ?= $(DESTDIR)/etc/olsrd
 USRDIR   ?= $(DESTDIR)/usr
 INCLUDEDIR ?= $(DESTDIR)/usr/include
 LIBDIR   ?= $(USRDIR)/lib
@@ -228,6 +228,9 @@ OBJS +=             $(SRCS:%.c=%.o)
 ifeq ($(DEBUG),1)
 CPPFLAGS +=    -DDEBUG
 CFLAGS +=      -ggdb
+ifeq ($(OS),linux)
+LDFLAGS  += -rdynamic
+endif
 else
 CPPFLAGS +=    -DNDEBUG
 ifeq ($(OPTIMIZE),)
index 93a8115..3f07e37 100644 (file)
@@ -6,8 +6,7 @@ Configuration
 -------------
 
 Before running olsrd you must edit the default configuration file
-/etc/olsrd/olsrd.conf (the location differs in the debian package from the 
-upstream default /etc/olsrd.conf). The one change you must make is to define
+/etc/olsrd/olsrd.conf. The one change you must make is to define
 on which interfaces olsrd is supposed to act on.
 
 If you want, you can run olsrd via init.d by editing /etc/default/olsrd - the
index 83f88d9..74ca4fe 100644 (file)
@@ -54,7 +54,7 @@ UninstPage uninstConfirm
 UninstPage instfiles
 
 Function .onInit
-        MessageBox MB_YESNO "This will install olsr.org pre-0.6.6.1 on your computer. Continue?" IDYES NoAbort
+        MessageBox MB_YESNO "This will install olsr.org pre-0.6.7 on your computer. Continue?" IDYES NoAbort
         Abort
 NoAbort:
 FunctionEnd
index 64db668..23ff9e7 100644 (file)
@@ -24,8 +24,8 @@ DESCRIPTION
        it with some debug output which is directed to STDOUT.\r
 \r
 \r
-       This  manual page only lists the command line arguments. For details of\r
-       the configuration file see the comments  included  in  /etc/olsrd.conf.\r
+       This  manual page only lists command line arguments. For details of the\r
+       configuration file see the comments  included in /etc/olsrd/olsrd.conf.\r
        Note  that  none  of these options need to be set at the command line -\r
        all these options and others can be set in the configuration file.\r
 \r
@@ -41,7 +41,7 @@ OPTIONS
 \r
        -f configfile\r
                    This option overrides the default configuration  file  path\r
-                   used by olsrd - /etc/olsrd.conf\r
+                   used by olsrd - /etc/olsrd/olsrd.conf\r
 \r
        -d debuglevel\r
                    This option specifies the amount of debug information olsrd\r
@@ -118,7 +118,7 @@ OPTIONS
 \r
 \r
 \r
-       FILES  /etc/olsrd.conf\r
+       FILES  /etc/olsrd/olsrd.conf\r
 \r
 SEE ALSO\r
        iwconfig(8) route(8).\r
index c1bc742..2ffaf2c 100644 (file)
@@ -68,7 +68,7 @@ IDD_FRONTEND_DIALOG DIALOGEX 0, 0, 399, 289
 STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | \r
     WS_SYSMENU\r
 EXSTYLE WS_EX_APPWINDOW\r
-CAPTION "olsr.org Switch pre-0.6.6.1"
+CAPTION "olsr.org Switch pre-0.6.7"\r
 FONT 8, "MS Sans Serif", 0, 0, 0x1\r
 BEGIN\r
     CONTROL         "Tab1",IDC_TAB1,"SysTabControl32",0x0,7,7,383,256\r
index 4c3b45f..b624611 100644 (file)
@@ -21,7 +21,7 @@ None.
 SAMPLE CONFIG
 ---------------------------------------------------------------------
 
-add in /etc/olsrd.conf:
+add in /etc/olsrd/olsrd.conf:
 
 LoadPlugin "arprefresh.so.0.1"
 {
index d92f1b5..bbf5ced 100644 (file)
@@ -44,7 +44,7 @@ Set permissions, e.g.:
 
   chmod 0700 /dev/net/tun
 
-To configure BMF in OLSR, you must edit the file /etc/olsrd.conf
+To configure BMF in OLSR, you must edit the file /etc/olsrd/olsrd.conf
 to load the BMF plugin. For example, add the following lines:
 
   LoadPlugin "olsrd_bmf.so.1.7.0"
@@ -184,7 +184,7 @@ the forwarding towards non-OLSR enabled hosts are omitted):
 -------------------------
 
 All configuration of BMF is done via the "LoadPlugin" section in
-the /etc/olsrd.conf file.
+the /etc/olsrd/olsrd.conf file.
 
 The following gives an overview of all plugin parameters that can be
 configured. Unless otherwise stated, settings may differ for each node in the
@@ -354,7 +354,7 @@ non-OLSR interfaces.
 If you have network interfaces on which OLSR is *not* running, but you *do*
 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:
+of /etc/olsrd/olsrd.conf. For example:
 
   LoadPlugin "olsrd_bmf.so.1.7.0"
   {
@@ -374,7 +374,7 @@ as an OLSR-enabled interface.
 In a typical interworking configuration there is a network of OLSR hosts
 in which one host acts as a gateway to a fixed infrastructure network.
 Usually that host will be advertising a default route via the HNA
-mechanism, e.g. by adding the following lines to its /etc/olsrd.conf
+mechanism, e.g. by adding the following lines to its /etc/olsrd/olsrd.conf
 file:
 
   Hna4
@@ -411,7 +411,7 @@ add the following line /etc/mrouted.conf :
 
 Finally, mrouted does not accept interfaces with prefix length 32.
 Therefore, override the default IP address and prefix length of
-the BMF network interface, by editing the /etc/olsrd.conf file.
+the BMF network interface, by editing the /etc/olsrd/olsrd.conf file.
 For example:
 
   LoadPlugin "olsrd_bmf.so.1.7.0"
index 277c3dd..3cce14d 100644 (file)
@@ -58,6 +58,7 @@
 #include "builddata.h"
 #include "olsr_cfg.h"
 #include "interfaces.h"
+#include "gateway.h"
 #include "olsr_protocol.h"
 #include "net_olsr.h"
 #include "link_set.h"
@@ -185,6 +186,10 @@ static void build_nodes_body(struct autobuf *);
 
 static void build_all_body(struct autobuf *);
 
+#ifdef __linux__
+static void build_sgw_body(struct autobuf *);
+#endif /* __linux__ */
+
 #ifdef HTTPINFO_PUD
 static void build_pud_body(struct autobuf *);
 #endif /* HTTPINFO_PUD */
@@ -219,6 +224,9 @@ static const struct tab_entry tab_entries[] = {
   {"Configuration", "config", build_config_body, true},
   {"Routes", "routes", build_routes_body, true},
   {"Links/Topology", "nodes", build_nodes_body, true},
+#ifdef __linux__
+  {"Smart Gateway", "sgw", build_sgw_body, true},
+#endif /* __linux__ */
 #ifdef HTTPINFO_PUD
   {"Position", "position", build_pud_body, true},
 #endif /* HTTPINFO_PUD */
@@ -1099,6 +1107,9 @@ build_all_body(struct autobuf *abuf)
   build_neigh_body(abuf);
   build_topo_body(abuf);
   build_mid_body(abuf);
+#ifdef __linux__
+  build_sgw_body(abuf);
+#endif /* __linux__ */
 #ifdef HTTPINFO_PUD
   build_pud_body(abuf);
 #endif /* HTTPINFO_PUD */
@@ -1446,6 +1457,104 @@ static void build_pud_body(struct autobuf *abuf) {
 }
 #endif /* HTTPINFO_PUD */
 
+#ifdef __linux__
+
+/**
+ * Construct the sgw table for a given ip version
+ *
+ * @param abuf the string buffer
+ * @param ipv6 true for IPv6, false for IPv4
+ */
+static void sgw_ipvx(struct autobuf *abuf, bool ipv6) {
+  struct gateway_entry * current_gw;
+  struct gw_list * list;
+  struct gw_container_entry * gw;
+
+  list = ipv6 ? &gw_list_ipv6 : &gw_list_ipv4;
+  if (!list->count) {
+    abuf_appendf(abuf, "<p><b>No IPv%s Gateways</b></p>\n", ipv6 ? "6" : "4");
+  } else {
+    char buf[INET6_ADDRSTRLEN];
+    memset(buf, 0, sizeof(buf));
+
+    abuf_appendf(abuf, "<p><b>IPv%s Gateways</b></p>\n", ipv6 ? "6" : "4");
+    abuf_puts(abuf, "<p>\n");
+    abuf_appendf(abuf, "<table border=\"1\" cellpadding=\"2\" cellspacing=\"0\" id=\"sgw_ipv%s\">\n", ipv6 ? "6" : "4");
+    abuf_puts(abuf, "  <tbody align=\"center\">\n");
+    abuf_puts(abuf, "    <tr>\n");
+    abuf_puts(abuf, "      <th><center>Originator</center></th>\n");
+    abuf_puts(abuf, "      <th><center>Prefix</center></th>\n");
+    abuf_puts(abuf, "      <th><center>Uplink (kbps)</center></th>\n");
+    abuf_puts(abuf, "      <th><center>Downlink (kbps)</center></th>\n");
+    abuf_puts(abuf, "      <th><center>IPv4</center></th>\n");
+    abuf_puts(abuf, "      <th><center>IPv4 NAT</center></th>\n");
+    abuf_puts(abuf, "      <th><center>IPv6</center></th>\n");
+    abuf_puts(abuf, "      <th><center>Tunnel Name</center></th>\n");
+    abuf_puts(abuf, "      <th><center>Destination</center></th>\n");
+    abuf_puts(abuf, "      <th><center>Cost</center></th>\n");
+    abuf_puts(abuf, "    </tr>\n");
+
+    current_gw = olsr_get_inet_gateway(false);
+    OLSR_FOR_ALL_GWS(&list->head, gw) {
+      if (gw) {
+        bool is_current = (current_gw && (gw->gw == current_gw));
+
+        if (is_current) {
+          abuf_puts(abuf, "    <tr bgcolor=\"lime\">\n");
+        } else {
+          abuf_puts(abuf, "    <tr>\n");
+        }
+
+        if (!gw->gw) {
+          int i;
+          for (i = 0; i < 7; i++) {
+            abuf_puts(abuf, "      <td></td>\n");
+          }
+        } else {
+          abuf_appendf(abuf, "      <td>%s</td>\n", inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->gw->originator, buf, sizeof(buf)));
+          abuf_appendf(abuf, "      <td>%s</td>\n", olsr_ip_prefix_to_string(&gw->gw->external_prefix));
+          abuf_appendf(abuf, "      <td>%u</td>\n", gw->gw->uplink);
+          abuf_appendf(abuf, "      <td>%u</td>\n", gw->gw->downlink);
+          abuf_appendf(abuf, "      <td>%s</td>\n", gw->gw->ipv4 ? "yes" : "no");
+          abuf_appendf(abuf, "      <td>%s</td>\n", gw->gw->ipv4nat ? "yes" : "no");
+          abuf_appendf(abuf, "      <td>%s</td>\n", gw->gw->ipv6 ? "yes" : "no");
+        }
+        if (!gw->tunnel) {
+          int i;
+          for (i = 0; i < 2; i++) {
+            abuf_puts(abuf, "      <td></td>\n");
+          }
+        } else {
+          abuf_appendf(abuf, "      <td>%s</td>\n", gw->tunnel->if_name);
+          abuf_appendf(abuf, "      <td>%s</td>\n", inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->tunnel->target, buf, sizeof(buf)));
+        }
+        if (!gw->gw) {
+          abuf_puts(abuf, "      <td></td>\n");
+        } else {
+          abuf_appendf(abuf, "      <td>%llu</td>\n", (long long unsigned int)gw->path_cost);
+        }
+        abuf_puts(abuf, "    </tr>\n");
+      }
+    } OLSR_FOR_ALL_GWS_END(gw);
+    abuf_puts(abuf, "  </tbody>\n");
+    abuf_puts(abuf, "</table>\n");
+    abuf_puts(abuf, "</p>\n");
+  }
+}
+
+static void build_sgw_body(struct autobuf *abuf) {
+  abuf_puts(abuf, "<h2>Smart Gateway System</h2>\n");
+
+  if (!olsr_cnf->smart_gw_active) {
+    abuf_puts(abuf, "<p><b>Smart Gateway system is not enabled</b></p>\n");
+    return;
+  }
+
+  sgw_ipvx(abuf, false);
+  sgw_ipvx(abuf, true);
+}
+#endif /* __linux__ */
+
 static void
 build_about_body(struct autobuf *abuf)
 {
index 709c975..a102a56 100644 (file)
@@ -48,7 +48,7 @@ start-up information:
 * /plugins - currently loaded plugins and their config parameters
 
 start-up information not in JSON format:
-* /olsrd.conf - the current config, formatted for writing directly to /etc/olsrd.conf
+* /olsrd.conf - the current config, formatted for writing directly to /etc/olsrd/olsrd.conf
 
 
 PLUGIN CONFIGURATION
index 625f994..ff47b3f 100644 (file)
@@ -24,7 +24,7 @@ PlParam "test" "anything"
 SAMPLE CONFIG
 ---------------------------------------------------------------------
 
-add in /etc/olsrd.conf:
+add in /etc/olsrd/olsrd.conf:
 
 LoadPlugin "olsrd_mini.so.0.1"
 {
index 828139d..35161a1 100644 (file)
@@ -142,7 +142,7 @@ PlParam "macs-change-script" "/path/to/script"
 SAMPLE CONFIG
 ---------------------------------------------------------------------
 
-add in /etc/olsrd.conf:
+add in /etc/olsrd/olsrd.conf:
 
 LoadPlugin "olsrd_nameservice.so.0.2"
 {
index bc73f69..a663bc3 100644 (file)
@@ -39,7 +39,7 @@ Usage:
            run "make" and "make install"
           This will create the "olsrd_pgraph.so.1.1" file and install it. 
 
-       3) Modify the "/etc/olsrd.conf" file of the system you wish to
+       3) Modify the "/etc/olsrd/olsrd.conf" file of the system you wish to
           monitor from to load the plugin. 
           Add the line: "LoadPlugin "olsrd_pgraph.so.1.1" {}"
 
@@ -51,7 +51,7 @@ Usage:
            # By default only localhost will be able to connect to the IPC
           # system of the olsrd process so if you are not going to be 
           # running pgraph locally, modify the "Host" variable of the 
-          # "IpcConnect" structure in the "/etc/olsrd.conf" file to 
+          # "IpcConnect" structure in the "/etc/olsrd/olsrd.conf" file to
           # reflect the IP address of the host you will be connecting from. 
 
        5) Start olsrd and make sure that the plugin has loaded correctly.
index 9a32312..a543200 100644 (file)
@@ -82,16 +82,16 @@ install: all
        $(MAKECMDPREFIX)$(MAKE) -C "$(NMEALIB_PATH)" DESTDIR="$(DESTDIR)" install
        $(MAKECMDPREFIX)$(MAKE) -C "$(LIBRARY_PATH)" DESTDIR="$(DESTDIR)" install
        $(INSTALL_LIB)
-       mkdir -p "$(DOCDIR_OLSRD)"
-       cp "$(RESOURCESDIR)/olsrd.pud.position.conf" "$(DOCDIR_OLSRD)"
+       mkdir -p "$(ETCDIR)"
+       cp "$(RESOURCESDIR)/olsrd.pud.position.conf" "$(ETCDIR)"
        $(STRIP) "$(LIBDIR)/$(PLUGIN_FULLNAME)"
 
 uninstall:
        $(MAKECMDPREFIX)$(MAKE) -C "$(NMEALIB_PATH)" DESTDIR="$(DESTDIR)" uninstall
        $(MAKECMDPREFIX)$(MAKE) -C "$(LIBRARY_PATH)" DESTDIR="$(DESTDIR)" uninstall
-       rm -f "$(LIBDIR)/lib$(PLUGIN_NAME).so" "$(LIBDIR)/$(PLUGIN_NAME)" "$(DOCDIR_OLSRD)/olsrd.pud.position.conf"
+       rm -f "$(LIBDIR)/lib$(PLUGIN_NAME).so" "$(LIBDIR)/$(PLUGIN_NAME)" "$(ETCDIR)/olsrd.pud.position.conf"
        $(UNINSTALL_LIB)
-       rmdir -v -p --ignore-fail-on-non-empty "$(LIBDIR)" "$(DOCDIR_OLSRD)"
+       rmdir -v -p --ignore-fail-on-non-empty "$(LIBDIR)" "$(ETCDIR)"
 
 clean:
 ifeq ($(VERBOSE),0)
index 0254716..7376ab1 100644 (file)
@@ -300,6 +300,8 @@ endif
        $(MAKECMDPREFIX)rm -fr "$(BUILD_DIR)" "$(LIBDIR_BUILD)" \
                build.xml \
                "$(SRC_DIR_C)/$(JAVA_PKG_UNDER)_PositionUpdate.h" \
+               "$(SRC_DIR_C)/$(JAVA_PKG_UNDER)_ClusterLeader.h" \
+               "$(SRC_DIR_C)/$(JAVA_PKG_UNDER)_UplinkMessage.h" \
                "$(JAVASRC)/$(JAVA_PKG_DIR)/WireFormatConstants.java"
 
 doc: build.xml
index 00ad48f..e2d1db3 100644 (file)
        -->
 
        <target name="getgitcommit" description="Retrieve the Git Commit SHA1">
+               <exec dir="${basedir}" executable="git" outputproperty="git.commit.descriptor" failonerror="false" error="/dev/null">
+                       <arg value="describe" />
+                       <arg value="--dirty" />
+                       <arg value="--always" />
+               </exec>
                <exec dir="${basedir}" executable="git" outputproperty="git.commit.sha" failonerror="false" error="/dev/null">
                        <arg value="rev-parse" />
                        <arg value="HEAD" />
@@ -59,7 +64,8 @@
                        <manifest>
                                <attribute name="Class-Path" value="." />
                                <attribute name="Version" value="${version}" />
-                               <attribute name="Git-SHA1" value="${git.commit.sha}" />
+                               <attribute name="Git-Descriptor" value="${git.commit.descriptor}" />
+                               <attribute name="Git-SHA" value="${git.commit.sha}" />
                        </manifest>
                </jar>
        </target>
index 85fa050..a83547b 100644 (file)
@@ -58,7 +58,7 @@ PlParam "Version" "<version>"
 SAMPLE CONFIG
 ---------------------------------------------------------------------
 
-add in /usr/local/etc/olsrd.conf:
+add in /etc/olsrd/olsrd.conf:
 
 LoadPlugin "olsrd_quagga.so.0.2.2"
 {
index 43d3d1d..d658cdb 100644 (file)
@@ -99,7 +99,7 @@ zebra_addroute(const struct rt_entry *r)
   }
 
   retval = zclient_write(zpacket_route(olsr_cnf->ip_version == AF_INET ? ZEBRA_IPV4_ROUTE_ADD : ZEBRA_IPV6_ROUTE_ADD, &route));
-  if(!retval && zebra.options & OPTION_ROUTE_ADDITIONAL)
+  if(!retval && (zebra.options & OPTION_ROUTE_ADDITIONAL))
     retval = olsr_cnf->ip_version == AF_INET ? zebra.orig_addroute_function(r) : zebra.orig_addroute6_function(r);
 
   free(route.ifindex);
@@ -154,7 +154,7 @@ zebra_delroute(const struct rt_entry *r)
   }
 
   retval = zclient_write(zpacket_route(olsr_cnf->ip_version == AF_INET ? ZEBRA_IPV4_ROUTE_DELETE : ZEBRA_IPV6_ROUTE_DELETE, &route));
-  if(!retval && zebra.options & OPTION_ROUTE_ADDITIONAL)
+  if(!retval && (zebra.options & OPTION_ROUTE_ADDITIONAL))
     retval = olsr_cnf->ip_version == AF_INET ? zebra.orig_delroute_function(r) : zebra.orig_delroute6_function(r);
 
   free(route.ifindex);
index 4fce5ed..3b54085 100644 (file)
@@ -43,14 +43,14 @@ endif
 
 install: all
        $(INSTALL_LIB)
-       mkdir -p "$(DOCDIR_OLSRD)"
-       cp "$(RESOURCESDIR)/olsrd.sgw.speed.conf" "$(DOCDIR_OLSRD)"
+       mkdir -p "$(ETCDIR)"
+       cp "$(RESOURCESDIR)/olsrd.sgw.speed.conf" "$(ETCDIR)"
        $(STRIP) "$(LIBDIR)/$(PLUGIN_FULLNAME)"
 
 uninstall:
-       rm -f "$(LIBDIR)/lib$(PLUGIN_NAME).so" "$(LIBDIR)/$(PLUGIN_NAME)" "$(DOCDIR_OLSRD)/olsrd.sgw.speed.conf"
+       rm -f "$(LIBDIR)/lib$(PLUGIN_NAME).so" "$(LIBDIR)/$(PLUGIN_NAME)" "$(ETCDIR)/olsrd.sgw.speed.conf"
        $(UNINSTALL_LIB)
-       rmdir -v -p --ignore-fail-on-non-empty "$(LIBDIR)" "$(DOCDIR_OLSRD)"
+       rmdir -v -p --ignore-fail-on-non-empty "$(LIBDIR)" "$(ETCDIR)"
 
 clean:
 ifeq ($(VERBOSE),0)
index c4e6b0c..9f07db1 100644 (file)
@@ -33,6 +33,7 @@ So what commands does the txtinfo plugin accept?
     * Topology: "/topo" -> send_what=SIW_TOPO
     * 2-hop neighbors: "/2hop" -> send_what=SIW_2HOP
     * Version: "/ver" -> send_what=version of olsrd
+    * (Smart) Gateway Information: "/sgw" -> send_what=information on all active (smart) gateways
 
 This is the same as the "/neigh" and "/link" commands combined:
 
index b56545d..2cefde9 100644 (file)
@@ -116,6 +116,8 @@ static void ipc_print_config(struct autobuf *);
 
 static void ipc_print_interface(struct autobuf *);
 
+static void ipc_print_sgw(struct autobuf *);
+
 #define TXT_IPC_BUFSIZE 256
 
 #define SIW_NEIGH 0x0001
@@ -129,6 +131,7 @@ static void ipc_print_interface(struct autobuf *);
 #define SIW_CONFIG 0x0100
 #define SIW_2HOP 0x0200
 #define SIW_VERSION 0x0400
+#define SIW_SGW 0x0800
 
 /* ALL = neigh link route hna mid topo */
 #define SIW_ALL 0x003F
@@ -327,6 +330,7 @@ ipc_action(int fd, void *data __attribute__ ((unused)), unsigned int flags __att
         if (0 != strstr(requ, "/int")) send_what |= SIW_INTERFACE;
         if (0 != strstr(requ, "/2ho")) send_what |= SIW_2HOP;
         if (0 != strstr(requ, "/ver")) send_what |= SIW_VERSION;
+        if (0 != strstr(requ, "/sgw")) send_what |= SIW_SGW;
       }
     }
     if ( send_what == 0 ) send_what = SIW_ALL;
@@ -507,6 +511,89 @@ ipc_print_hna(struct autobuf *abuf)
   abuf_puts(abuf, "\n");
 }
 
+
+#ifdef __linux__
+/**
+ * Construct the sgw table for a given ip version
+ *
+ * @param abuf the string buffer
+ * @param ipv6 true for IPv6, false for IPv4
+ * @param fmtv the format for printing
+ */
+static void sgw_ipvx(struct autobuf *abuf, bool ipv6, const char * fmth, const char * fmtv) {
+  struct gateway_entry * current_gw;
+  struct gw_list * list;
+  struct gw_container_entry * gw;
+
+  abuf_appendf(abuf, "Table: Smart Gateway IPv%s\n", ipv6 ? "6" : "4");
+
+  list = ipv6 ? &gw_list_ipv6 : &gw_list_ipv4;
+  if (list->count) {
+    char current[2] = { 0, 0 };
+    char originator[INET6_ADDRSTRLEN];
+    char prefix[(INET6_ADDRSTRLEN * 2) + 1];
+    uint32_t uplink = 0;
+    uint32_t downlink = 0;
+    char sipv4[2] = { 0, 0 };
+    char sipv4nat[2] = { 0, 0 };
+    char sipv6[2] = { 0, 0 };
+    char if_name[IF_NAMESIZE];
+    char destination[INET6_ADDRSTRLEN];
+    long long unsigned int cost = 0;
+    memset(originator, 0, sizeof(originator));
+    memset(prefix, 0, sizeof(prefix));
+    memset(if_name, 0, sizeof(if_name));
+    memset(destination, 0, sizeof(destination));
+
+    abuf_appendf(abuf, fmth, " ", "Originator", "Prefix", "Uplink", "Downlink", "IPv4", "IPv4-NAT", "IPv6", "Tunnel-Name", "Destination", "Cost");
+
+    current_gw = olsr_get_inet_gateway(false);
+    OLSR_FOR_ALL_GWS(&list->head, gw) {
+      if (gw) {
+        current[0] = (current_gw && (gw->gw == current_gw)) ? '*' : ' ';
+
+        if (gw->gw) {
+          inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->gw->originator, originator, sizeof(originator));
+          strncpy(prefix, olsr_ip_prefix_to_string(&gw->gw->external_prefix), sizeof(prefix));
+          uplink = gw->gw->uplink;
+          downlink = gw->gw->downlink;
+          sipv4[0] = gw->gw->ipv4 ? 'Y' : 'N';
+          sipv4nat[0] = gw->gw->ipv4nat ? 'Y' : 'N';
+          sipv6[0] = gw->gw->ipv6 ? 'Y' : 'N';
+        }
+        if (gw->tunnel) {
+          strncpy(if_name, gw->tunnel->if_name, sizeof(if_name));
+          inet_ntop(ipv6 ? AF_INET6 : AF_INET, &gw->tunnel->target, destination, sizeof(destination));
+        }
+        if (gw->gw) {
+          cost = (long long unsigned int)gw->path_cost;
+        }
+        abuf_appendf(abuf, fmtv, current, originator, prefix, uplink, downlink, sipv4, sipv4nat, sipv6, if_name, destination, cost);
+      }
+    } OLSR_FOR_ALL_GWS_END(gw);
+  }
+}
+#endif /* __linux__ */
+
+static void
+ipc_print_sgw(struct autobuf *abuf)
+{
+#ifndef __linux__
+  abuf_puts(abuf, "Gateway mode is only supported in linux\n");
+#else
+
+  static const char * fmth4 = "%s%-16s %-33s %-8s %-8s %-4s %-8s %-4s %-16s %-16s %s\n";
+  static const char * fmtv4 = "%s%-16s %-33s %-8u %-8u %-4s %-8s %-4s %-16s %-16s %llu\n";
+  static const char * fmth6 = "%s%-46s %-93s %-8s %-8s %-4s %-8s %-4s %-16s %-46s %s\n";
+  static const char * fmtv6 = "%s%-46s %-93s %-8u %-8u %-4s %-8s %-4s %-16s %-46s %llu\n";
+
+  sgw_ipvx(abuf, false, fmth4, fmtv4);
+  abuf_puts(abuf, "\n");
+  sgw_ipvx(abuf, true, fmth6, fmtv6);
+  abuf_puts(abuf, "\n");
+#endif /* __linux__ */
+}
+
 static void
 ipc_print_mid(struct autobuf *abuf)
 {
@@ -729,6 +816,8 @@ send_info(unsigned int send_what, int the_socket)
   if ((send_what & SIW_TOPO) == SIW_TOPO) ipc_print_topology(&abuf);
   /* hna */
   if ((send_what & SIW_HNA) == SIW_HNA) ipc_print_hna(&abuf);
+  /* sgw */
+  if ((send_what & SIW_SGW) == SIW_SGW) ipc_print_sgw(&abuf);
   /* mid */
   if ((send_what & SIW_MID) == SIW_MID) ipc_print_mid(&abuf);
   /* routes */
index f5eac1d..8397cb2 100644 (file)
@@ -21,7 +21,7 @@ PlParam "interval" "5"
 SAMPLE CONFIG
 ---------------------------------------------------------------------
 
-add in /etc/olsrd.conf:
+add in /etc/olsrd/olsrd.conf:
 
 LoadPlugin "olsrd_watchdog.so.0.1"
 {
index 7ec5370..e45c138 100644 (file)
@@ -12,7 +12,7 @@
 #    sudo make OS=android DEBUG=0 install_all
 #    which creates a /data directory on your PC.
 #
-# 4) Change /data/local/etc/olsrd.conf. You need
+# 4) Change /data/local/etc/olsrd/olsrd.conf. You need
 #    to adapt the 'Interfaces' line, e.g. to use
 #    the eth0 on your android mobile. Also, the
 #    LoadPlugin lines needs adaption, e.g. you
@@ -29,7 +29,7 @@
 DESTDIR ?=
 prefix ?=
 sbindir ?= $(prefix)/bin
-etcdir ?= $(prefix)/etc
+etcdir ?= $(prefix)/etc/olsrd
 libdir ?= $(prefix)/lib
 datarootdir ?= $(prefix)/usr/share
 
index 283e3ff..2048ae6 100644 (file)
@@ -4,7 +4,7 @@
 
 PREFIX ?= /usr/local
 SBINDIR = $(PREFIX)/sbin
-ETCDIR = $(PREFIX)/etc
+ETCDIR = $(PREFIX)/etc/olsrd
 LIBDIR = $(PREFIX)/lib
 DOCDIR = $(PREFIX)/share/doc
 MANDIR = $(PREFIX)/man
index 9b41fe6..d41d41c 100755 (executable)
@@ -1,15 +1,54 @@
 #!/bin/sh
 
-sha="`git log -1 --pretty=%h 2> /dev/null`"
-if [ -z "$sha" ]; then
-  sha="0000000"
+if [ $# -ne 3 ]; then
+       echo "ERROR: Supply filename, version and verbosity"
+       echo "       Example: $0 builddata.txt pre-0.6.7 1"
+       exit 1
 fi
-echo -n "-git_$sha"
 
-md5cmd=md5sum
-os=$(uname)
-if [ "xDarwin" = "x$os" ] ; then
-  md5cmd=md5
+buildDataTxt="$1"
+version="$2"
+verbose="$3"
+
+
+md5Command="md5sum"
+osName="$(uname)"
+if [ "x$osName" = "xDarwin" ] ; then
+  md5Command="md5"
+fi
+
+
+gitSha="$(git log -1 --pretty=%h 2> /dev/null)"
+if [ -z "$gitSha" ]; then
+  gitSha="0000000"
 fi
-echo -n "-hash_"
-cat `find . -name *.[ch] | grep -v -E '[/\\]?builddata.c$'`| $md5cmd | awk '{ print $1; }'
+sourceHash="$(cat $(find . -name *.[ch] | grep -v -E '[/\\]?builddata.c$') | "$md5Command" | awk '{ print $1; }')"
+hostName="$(hostname)"
+buildDate="$(date +"%Y-%m-%d %H:%M:%S")"
+
+
+tmpBuildDataTxt="$(mktemp -t olsrd.hash_source.XXXXXXXXXX)"
+cat > "$tmpBuildDataTxt" << EOF
+const char olsrd_version[] = "olsr.org - $version-git_$gitSha-hash_$sourceHash";
+const char build_host[]    = "$hostName";
+const char build_date[]    = "$buildDate";
+EOF
+
+
+if [ ! -e "$buildDataTxt" ]; then
+  echo "[CREATE] $buildDataTxt"
+  if [ "$verbose" = "0" ]; then
+    cp -a "$tmpBuildDataTxt" "$buildDataTxt"
+  else
+    cp -a -v "$tmpBuildDataTxt" "$buildDataTxt"
+  fi
+elif [ -n "$(diff -I "^const char build_date\[\].*\$" "$tmpBuildDataTxt" "$buildDataTxt" | sed 's/"/\\"/g')" ]; then
+  echo "[UPDATE] $buildDataTxt"
+  if [ "$verbose" = "0" ]; then
+    cp -a "$tmpBuildDataTxt" "$buildDataTxt"
+  else
+    cp -a -v "$tmpBuildDataTxt" "$buildDataTxt"
+  fi
+fi
+rm -f "$tmpBuildDataTxt"
+
index 4f7b923..ec48788 100644 (file)
@@ -30,7 +30,7 @@ See http://www.olsr.org/ for more info.
 # description: This script starts OLSRD (Ad Hoc routing protocol)
 #
 # processname: olsrd
-# config: %{_sysconfdir}/olsrd.conf
+# config: %{_sysconfdir}/olsrd/olsrd.conf
 # pidfile: %{_localstatedir}/run/olsrd.pid
 
 source %{_initrddir}/functions
@@ -40,7 +40,7 @@ source %{_sysconfdir}/sysconfig/network
 [ ${NETWORKING} = "no" ] && exit 0
 
 [ -x %{_sbindir}/olsrd ] || exit 1
-[ -r %{_sysconfdir}/olsrd.conf ] || exit 1
+[ -r %{_sysconfdir}/olsrd/olsrd.conf ] || exit 1
 
 RETVAL=0
 prog="olsrd"
@@ -132,7 +132,7 @@ rm -rf %{buildroot}
 #/sbin/chkconfig --add olsrd
 # Default to not start olsrd automatic
 /sbin/chkconfig olsrd off
-echo "Now please edit /etc/olsrd.conf and run 'service olsrd start' or '/etc/init.d/olsrd start' to start olsrd"
+echo "Now please edit /etc/olsrd/olsrd.conf and run 'service olsrd start' or '/etc/init.d/olsrd start' to start olsrd"
 echo "Run 'chkconfig olsrd on' to enable automatic starting of olsrd"
 
 %files
@@ -140,7 +140,7 @@ echo "Run 'chkconfig olsrd on' to enable automatic starting of olsrd"
 %doc README CHANGELOG
 %doc lib/*/*README*
 
-%config(noreplace) %{_sysconfdir}/olsrd.conf
+%config(noreplace) %{_sysconfdir}/olsrd/olsrd.conf
 %config %{_initrddir}/olsrd
 /usr/sbin/olsrd
 # Wildchar to cover all installed plugins
index d318410..6ace3c1 100644 (file)
@@ -50,12 +50,14 @@ ifeq ($(OS), win32)
 
 LIBNAME ?=     olsrd_cfgparser.dll
 BINNAME ?=     olsrd_cfgparser.exe
-OBJS +=                ../win32/compat.o ../ipcalc.o ../builddata.o
+OBJS +=                ../win32/compat.o ../ipcalc.o ../builddata.o ../common/autobuf.o
 
 else
 
 LIBNAME ?=     olsrd_cfgparser.so.0.1
 BINNAME ?=     olsrd_cfgparser
+
+OBJS +=                ../ipcalc.o ../builddata.o ../common/autobuf.o
 endif
 
 
index b308bb2..f1b68ef 100644 (file)
@@ -107,12 +107,12 @@ static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options
   struct olsr_lq_mult *mult;
 
   abuf_puts(out, "{\n");
-  if (comments) abuf_puts(out,
+  if (comments) abuf_appendf(out,
     "    # Interface Mode is used to prevent unnecessary\n"
     "    # packet forwarding on switched ethernet interfaces\n"
     "    # valid Modes are \"mesh\" and \"ether\"\n"
-    "    # (default is \"mesh\")\n"
-    "    \n");
+    "    # (default is \"%s\")\n"
+    "    \n", OLSR_IF_MODE[DEF_IF_MODE]);
   if_appendf(out, comments, "    %sMode \"%s\"\n",
       cnfi->mode == DEF_IF_MODE ? "# " : "",
       OLSR_IF_MODE[cnfi->mode]);
@@ -129,11 +129,11 @@ static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options
   if_appendf(out, comments, "    %sIp4Broadcast      %s\n",
       cnfi->ipv4_multicast.v4.s_addr == 0 ? "# " : "",
       inet_ntop(AF_INET, &cnfi->ipv4_multicast, ipbuf.buf, sizeof(ipbuf)));
-  if (comments) abuf_puts(out,
+  if (comments) abuf_appendf(out,
     "    \n"
     "    # IPv6 multicast address\n"
-    "    # (default is FF02::6D, the manet-router linklocal multicast)\n"
-    "    \n");
+    "    # (default is %s, the manet-router linklocal multicast)\n"
+    "    \n", inet_ntop(AF_INET6, &ipv6_def_multicast, ipbuf.buf, sizeof(ipbuf)));
   if_appendf(out, comments, "    %sIPv6Multicast %s\n",
       memcmp(&cnfi->ipv6_multicast, &ipv6_def_multicast, sizeof(ipv6_def_multicast)) == 0 ? "# " : "",
       inet_ntop(AF_INET6, &cnfi->ipv6_multicast, ipbuf.buf, sizeof(ipbuf)));
@@ -155,12 +155,18 @@ static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options
   if_appendf(out, comments, "    %sIPv6Src %s\n",
       cnfi->ipv6_src.prefix_len == 0 ? "# " : "",
       inet_ntop(AF_INET6, &cnfi->ipv6_src, ipbuf.buf, sizeof(ipbuf)));
-  if (comments) abuf_puts(out,
+  if (comments) abuf_appendf(out,
     "    \n"
     "    # Emission intervals in seconds.\n"
-    "    # If not defined, Freifunk network defaults are used\n"
-    "    # (default is 2.0/20.0 for Hello and 5.0/300.0 for Tc/Mid/Hna)\n"
-    "    \n");
+    "    # If not defined, Freifunk network defaults are used.\n"
+    "    # (defaults: Hello = %.1f/%.1f,  TC  = %.1f/%.1f,\n"
+    "    #            MID   = %.1f/%.1f, HNA = %.1f/%.1f)\n"
+    "    \n",
+    (double)HELLO_INTERVAL, (double)NEIGHB_HOLD_TIME,
+    (double)TC_INTERVAL,    (double)TOP_HOLD_TIME,
+    (double)MID_INTERVAL,   (double)MID_HOLD_TIME,
+    (double)HNA_INTERVAL,   (double)HNA_HOLD_TIME
+    );
   if_appendf(out, comments, "    %sHelloInterval       %3.1f\n",
       cnfi->hello_params.emission_interval == HELLO_INTERVAL ? "# " : "",
       (double)cnfi->hello_params.emission_interval);
@@ -213,7 +219,7 @@ static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options
     "    # ETX value.\n"
     "    # Note:\n"
     "    # Link quality multiplier is used only when\n"
-    "    # LinkQualityLevel is > 0.\n"
+    "    # LinkQualityLevel is greater than 0.\n"
     "    \n");
   mult = cnfi->lq_mult;
 
@@ -246,7 +252,7 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
       "#\n"
       "\n",
       olsrd_version, PARSER_VERSION);
-  abuf_puts(out,
+  abuf_appendf(out,
     "# OLSR.org routing daemon config file\n"
     "# This file contains ALL available options and explanations about them\n"
     "#\n"
@@ -264,20 +270,20 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "\n"
     "# Debug level (0-9)\n"
     "# If set to 0 the daemon runs in the background, unless \"NoFork\" is set to true\n"
-    "# (Default is 1)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_DEBUGLVL);
   abuf_appendf(out, "%sDebugLevel  %d\n",
       cnf->debug_level == DEF_DEBUGLVL ? "# " : "",
       cnf->debug_level);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# IP version to use (4 or 6)\n"
-    "# (Default is 4)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", (DEF_IP_VERSION == AF_INET) ? 4 : 6);
   abuf_appendf(out, "%sIpVersion %d\n",
       cnf->ip_version == DEF_IP_VERSION ? "# " : "",
       cnf->ip_version == AF_INET ? 4 : 6);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "#################################\n"
     "### OLSRd agent configuration ###\n"
@@ -286,18 +292,18 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# related to the OLSR protocol and it's extensions\n"
     "\n"
     "# Clear the screen each time the internal state changes\n"
-    "# (Default is yes)\n"
-    "\n");
+    "# (default is %s)\n"
+    "\n", DEF_CLEAR_SCREEN ? "yes" : "no");
   abuf_appendf(out, "%sClearScreen     %s\n",
       cnf->clear_screen == DEF_CLEAR_SCREEN ? "# " : "",
       cnf->clear_screen ? "yes" : "no");
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Should olsrd keep on running even if there are\n"
     "# no interfaces available? This is a good idea\n"
     "# for a PCMCIA/USB hotswap environment.\n"
-    "# (Default is yes)\n"
-    "\n");
+    "# (default is %s)\n"
+    "\n", DEF_ALLOW_NO_INTS ? "yes" : "no");
   abuf_appendf(out, "%sAllowNoInt  %s\n",
       cnf->allow_no_interfaces == DEF_ALLOW_NO_INTS ? "# " : "",
       cnf->allow_no_interfaces ? "yes" : "no");
@@ -307,37 +313,37 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# The lockfile is used to prevent multiple OLSR instances running at the same\n"
     "# time.\n"
     "# (Linux/BSD default is \"/var/run/olsrd-ipv(4/6).lock\")\n"
-    "# (Win32 default is \"<configfile>-ipv(4/6).lock\")\n"
+    "# (Win32     default is \"configfile-ipv(4/6).lock\")\n"
     "\n");
   abuf_appendf(out, "%sLockFile \"%s\"\n",
       cnf->lock_file == NULL ? "# " : "",
       cnf->lock_file ? cnf->lock_file : "lockfile");
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Polling rate for OLSR sockets in seconds (float). \n"
-    "# (Default is 0.05)\n"
-    "\n");
+    "# (default is %.2f)\n"
+    "\n", (double)DEF_POLLRATE);
   abuf_appendf(out, "%sPollrate  %.2f\n",
       cnf->pollrate == (float)DEF_POLLRATE ? "# " : "",
       (double)cnf->pollrate);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Interval to poll network interfaces for configuration changes (in seconds).\n"
     "# Linux systems can detect interface statechange via netlink sockets.\n"
-    "# (Defaults is 2.5)\n"
-    "\n");
+    "# (default is %.1f)\n"
+    "\n", (double)DEF_NICCHGPOLLRT);
   abuf_appendf(out, "%sNicChgsPollInt  %.1f\n",
       cnf->nic_chgs_pollrate == (float)DEF_NICCHGPOLLRT ? "# " : "",
       (double)cnf->nic_chgs_pollrate);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# TOS(type of service) value for the IP header of control traffic.\n"
-    "# (Default is 16)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_TOS);
   abuf_appendf(out, "%sTosValue %u\n",
       cnf->tos == DEF_TOS ? "# " : "",
       cnf->tos);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# FIBMetric controls the metric value of the host-routes OLSRd sets.\n"
     "# - \"flat\" means that the metric value is always 2. This is the preferred value\n"
@@ -345,12 +351,12 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# - \"correct\" use the hopcount as the metric value.\n"
     "# - \"approx\" use the hopcount as the metric value too, but does only update the\n"
     "#   hopcount if the nexthop changes too\n"
-    "# (Default is \"flat\")\n"
-    "\n");
+    "# (default is \"%s\")\n"
+    "\n", FIB_METRIC_TXT[DEF_FIB_METRIC]);
   abuf_appendf(out, "%sFIBMetric \"%s\"\n",
       cnf->fib_metric == DEF_FIB_METRIC ? "# " : "",
       FIB_METRIC_TXT[cnf->fib_metric]);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "#######################################\n"
     "### Linux specific OLSRd extensions ###\n"
@@ -361,12 +367,12 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip\n"
     "# of the node. In addition to this an additional localhost device is created\n"
     "# to make sure the returning traffic can be received.\n"
-    "# (Default is \"no\")\n"
-    "\n");
+    "# (default is \"%s\")\n"
+    "\n", DEF_USE_SRCIP_ROUTES ? "yes" : "no");
   abuf_appendf(out, "%sSrcIpRoutes %s\n",
       cnf->use_src_ip_routes == DEF_USE_SRCIP_ROUTES ? "# " : "",
       cnf->use_src_ip_routes ? "yes" : "no");
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Specify the proto tag to be used for routes olsr inserts into kernel\n"
     "# currently only implemented for linux\n"
@@ -376,87 +382,151 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# 3 BOOT (should in fact not be used by routing daemons)\n"
     "# 4 STATIC \n"
     "# 8 .. 15 various routing daemons (gated, zebra, bird, & co)\n"
-    "# (defaults to 0 which gets replaced by an OS-specific default value\n"
+    "# (default is %u which gets replaced by an OS-specific default value\n"
     "# under linux 3 (BOOT) (for backward compatibility)\n"
-    "\n");
+    "\n", DEF_RTPROTO);
   abuf_appendf(out, "%sRtProto %u\n",
       cnf->rt_proto == DEF_RTPROTO ? "# " : "",
       cnf->rt_proto);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Specifies the routing Table olsr uses\n"
     "# RtTable is for host routes, RtTableDefault for the route to the default\n"
     "# internet gateway (2 in case of IPv6+NIIT) and RtTableTunnel is for\n"
     "# routes to the ipip tunnels, valid values are 1 to 254\n"
     "# There is a special parameter \"auto\" (choose default below)\n"
-    "# (with smartgw: default is 254/223/224)\n"
-    "# (without smartgw: default is 254/254/254, linux main table)\n"
-    "\n");
-  abuf_appendf(out, "RtTable %u\n",
-      cnf->rt_table);
-  abuf_appendf(out, "RtTableDefault %u\n",
-      cnf->rt_table_default);
-  abuf_appendf(out, "RtTableTunnel %u\n",
-      cnf->rt_table_tunnel);
-  abuf_puts(out,
+    "# (with    smartgw: default is %u/%u/%u)\n"
+    "# (without smartgw: default is %u/%u/%u, linux main table)\n"
+    "\n",
+    DEF_SGW_RT_TABLE_NR, DEF_SGW_RT_TABLE_DEFAULT_NR, DEF_SGW_RT_TABLE_TUNNEL_NR,
+    DEF_RT_TABLE_NR, DEF_RT_TABLE_DEFAULT_NR, DEF_RT_TABLE_TUNNEL_NR);
+  if (!cnf->smart_gw_active) {
+    abuf_appendf(out, "%sRtTable        %u\n",
+        cnf->rt_table == DEF_RT_TABLE_NR ? "# " : "",
+        cnf->rt_table);
+    abuf_appendf(out, "%sRtTableDefault %u\n",
+        cnf->rt_table_default == DEF_RT_TABLE_DEFAULT_NR ? "# " : "",
+        cnf->rt_table_default);
+    abuf_appendf(out, "%sRtTableTunnel  %u\n",
+        cnf->rt_table_tunnel == DEF_RT_TABLE_TUNNEL_NR ? "# " : "",
+        cnf->rt_table_tunnel);
+  } else {
+    abuf_appendf(out, "%sRtTable        %u\n",
+        cnf->rt_table == DEF_SGW_RT_TABLE_NR ? "# " : "",
+        cnf->rt_table);
+    abuf_appendf(out, "%sRtTableDefault %u\n",
+        cnf->rt_table_default == DEF_SGW_RT_TABLE_DEFAULT_NR ? "# " : "",
+        cnf->rt_table_default);
+    abuf_appendf(out, "%sRtTableTunnel  %u\n",
+        cnf->rt_table_tunnel == DEF_SGW_RT_TABLE_TUNNEL_NR ? "# " : "",
+        cnf->rt_table_tunnel);
+  }
+  abuf_appendf(out,
     "\n"
     "# Specifies the policy rule priorities for the three routing tables and\n"
     "# a special rule for smartgateway routing (see README-Olsr-Extensions)\n"
     "# Priorities can only be set if three different routing tables are set.\n"
     "# if set the values must obey to condition\n"
-    "# RtTablePriority < RtTableDefaultOlsrPriority\n"
-    "# < RtTableTunnelPriority < RtTableDefaultPriority\n"
+    "# RtTablePriority less than RtTableDefaultOlsrPriority\n"
+    "# less than RtTableTunnelPriority less than RtTableDefaultPriority\n"
     "# There are two special parameters, \"auto\" (choose fitting to SmartGW\n"
     "# mode) and \"none\" (do not set policy rule)\n"
-    "# (with smartgw: default is none/32776/32786/32796)\n"
-    "# (without smartgw: default is none/none/none/none)\n"
-    "\n");
-  abuf_appendf(out, "RtTablePriority %u\n",
-      cnf->rt_table_pri);
-  abuf_appendf(out, "RtTableDefaultOlsrPriority %u\n",
-      cnf->rt_table_default_pri);
-  abuf_appendf(out, "RtTableTunnelPriority %u\n",
-      cnf->rt_table_tunnel_pri);
-  abuf_appendf(out, "RtTableDefaultPriority %u\n",
-      cnf->rt_table_defaultolsr_pri);
-  abuf_puts(out,
+    "# (with    smartgw: default is %d/%u/%u/%u)\n"
+    "# (without smartgw: default is %d/%d   /%d   /%d   )\n"
+    "\n",
+    DEF_SGW_RT_TABLE_PRI,
+    DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER,
+    DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER + DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER,
+    DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER + DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER + DEF_SGW_RT_TABLE_DEFAULT_PRI_ADDER,
+    DEF_RT_TABLE_PRI,
+    DEF_RT_TABLE_DEFAULTOLSR_PRI,
+    DEF_RT_TABLE_TUNNEL_PRI,
+    DEF_RT_TABLE_DEFAULT_PRI);
+  if (!cnf->smart_gw_active) {
+    if (cnf->rt_table_pri == DEF_RT_TABLE_PRI) {
+      abuf_appendf(out, "# RtTablePriority            %d\n",
+          cnf->rt_table_pri);
+    } else {
+      abuf_appendf(out, "RtTablePriority            %u\n",
+          cnf->rt_table_pri);
+    }
+    if (cnf->rt_table_defaultolsr_pri == DEF_RT_TABLE_DEFAULTOLSR_PRI) {
+      abuf_appendf(out, "# RtTableDefaultOlsrPriority %d\n",
+          cnf->rt_table_defaultolsr_pri);
+    } else {
+      abuf_appendf(out, "RtTableDefaultOlsrPriority %u\n",
+          cnf->rt_table_defaultolsr_pri);
+    }
+    if (cnf->rt_table_tunnel_pri == DEF_RT_TABLE_TUNNEL_PRI) {
+      abuf_appendf(out, "# RtTableTunnelPriority      %d\n",
+          cnf->rt_table_tunnel_pri);
+    } else {
+      abuf_appendf(out, "RtTableTunnelPriority      %u\n",
+          cnf->rt_table_tunnel_pri);
+    }
+    if (cnf->rt_table_default_pri == DEF_RT_TABLE_DEFAULT_PRI) {
+      abuf_appendf(out, "# RtTableDefaultPriority     %d\n",
+          cnf->rt_table_default_pri);
+    } else {
+      abuf_appendf(out, "RtTableDefaultPriority     %u\n",
+          cnf->rt_table_default_pri);
+    }
+  } else {
+    if (cnf->rt_table_pri == DEF_SGW_RT_TABLE_PRI) {
+      abuf_appendf(out, "# RtTablePriority            %d\n",
+          cnf->rt_table_pri);
+    } else {
+      abuf_appendf(out, "RtTablePriority            %u\n",
+          cnf->rt_table_pri);
+    }
+    abuf_appendf(out, "%sRtTableDefaultOlsrPriority %u\n",
+        cnf->rt_table_defaultolsr_pri == (DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER) ? "# " : "",
+        cnf->rt_table_defaultolsr_pri);
+    abuf_appendf(out, "%sRtTableTunnelPriority      %u\n",
+        cnf->rt_table_tunnel_pri == (DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER + DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER) ? "# " : "",
+        cnf->rt_table_tunnel_pri);
+    abuf_appendf(out, "%sRtTableDefaultPriority     %u\n",
+        cnf->rt_table_default_pri == (DEF_SGW_RT_TABLE_PRI_BASE + DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER + DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER + DEF_SGW_RT_TABLE_DEFAULT_PRI_ADDER) ? "# " : "",
+        cnf->rt_table_default_pri);
+  }
+  abuf_appendf(out,
     "\n"
     "# Activates (in IPv6 mode) the automatic use of NIIT\n"
     "# (see README-Olsr-Extensions)\n"
-    "# (default is \"yes\")\n"
-    "\n");
+    "# (default is \"%s\")\n"
+    "\n", DEF_USE_NIIT ? "yes" : "no");
   abuf_appendf(out, "%sUseNiit %s\n",
       cnf->use_niit == DEF_USE_NIIT ? "# " : "",
       cnf->use_niit ? "yes" : "no");
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Activates the smartgateway ipip tunnel feature.\n"
     "# See README-Olsr-Extensions for a description of smartgateways.\n"
-    "# (default is \"yes\")\n"
-    "\n");
+    "# (default is \"%s\")\n"
+    "\n", DEF_SMART_GW ? "yes" : "no");
   abuf_appendf(out, "%sSmartGateway %s\n",
       cnf->smart_gw_active == DEF_SMART_GW ? "# " : "",
       cnf->smart_gw_active ? "yes" : "no");
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Signals that the server tunnel must always be removed on shutdown,\n"
     "# irrespective of the interface up/down state during startup.\n"
-    "# (default is \"no\")\n"
-    "\n");
+    "# (default is \"%s\")\n"
+    "\n", DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL ? "yes" : "no");
   abuf_appendf(out, "%sSmartGatewayAlwaysRemoveServerTunnel %s\n",
       cnf->smart_gw_always_remove_server_tunnel == DEF_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL ? "# " : "",
       cnf->smart_gw_always_remove_server_tunnel ? "yes" : "no");
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Determines the maximum number of gateways that can be in use at any given\n"
     "# time. This setting is used to mitigate the effects of breaking connections\n"
     "# (due to the selection of a new gateway) on a dynamic network.\n"
-    "# (default is 1)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_GW_USE_COUNT);
   abuf_appendf(out, "%sSmartGatewayUseCount %d\n",
       cnf->smart_gw_use_count == DEF_GW_USE_COUNT ? "# " : "",
       cnf->smart_gw_use_count);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Determines the take-down percentage for a non-current smart gateway tunnel.\n"
     "# If the cost of the current smart gateway tunnel is less than this percentage\n"
@@ -464,8 +534,8 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# gateway tunnel is taken down because it is then presumed to be 'too expensive'.\n"
     "# This setting is only relevant when SmartGatewayUseCount is larger than 1;\n"
     "# a value of 0 will result in the tunnels not being taken down proactively.\n"
-    "# (default is 0)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_GW_TAKEDOWN_PERCENTAGE);
   abuf_appendf(out, "%sSmartGatewayTakeDownPercentage %d\n",
       cnf->smart_gw_takedown_percentage == DEF_GW_TAKEDOWN_PERCENTAGE ? "# " : "",
       cnf->smart_gw_takedown_percentage);
@@ -497,126 +567,125 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     }
     abuf_puts(out, "\n");
   }
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Determines the offset of the smart gateway egress interfaces mark that are\n"
     "# used in the policy routing rules in a multi-gateway setup. Only relevant\n"
     "# when a multi-gateway setup is used.\n"
-    "# (default is 91)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_GW_MARK_OFFSET_EGRESS);
   abuf_appendf(out, "%sSmartGatewayMarkOffsetEgress %u\n",
       cnf->smart_gw_mark_offset_egress == DEF_GW_MARK_OFFSET_EGRESS ? "# " : "",
       cnf->smart_gw_mark_offset_egress);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Determines the offset of the smart gateway tunnel interfaces mark that are\n"
     "# used in the policy routing rules in a multi-gateway setup. Only relevant\n"
     "# when a multi-gateway setup is used.\n"
     "# The ranges [egress offset, egress offset + egress count] and\n"
     "# [tunnel offset, tunnel offset + use count] are not allowed to overlap.\n"
-    "# (default is 101)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_GW_MARK_OFFSET_TUNNELS);
   abuf_appendf(out, "%sSmartGatewayMarkOffsetTunnels %u\n",
       cnf->smart_gw_mark_offset_tunnels == DEF_GW_MARK_OFFSET_TUNNELS ? "# " : "",
       cnf->smart_gw_mark_offset_tunnels);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Allows the selection of a smartgateway with NAT (only for IPv4)\n"
-    "# (default is \"yes\")\n"
-    "\n");
+    "# (default is \"%s\")\n"
+    "\n", DEF_GW_ALLOW_NAT ? "yes" : "no");
   abuf_appendf(out, "%sSmartGatewayAllowNAT %s\n",
       cnf->smart_gw_allow_nat == DEF_GW_ALLOW_NAT ? "# " : "",
       cnf->smart_gw_allow_nat ? "yes" : "no");
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Determines the period (in milliseconds) on which a new smart gateway\n"
     "# selection is performed.\n"
-    "# (default is 10000 milliseconds)\n"
-    "\n");
+    "# (default is %u milliseconds)\n"
+    "\n", DEF_GW_PERIOD);
   abuf_appendf(out, "%sSmartGatewayPeriod %d\n",
       cnf->smart_gw_period == DEF_GW_PERIOD ? "# " : "",
       cnf->smart_gw_period);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Determines the number of times the link state database must be stable\n"
     "# before a new smart gateway is selected.\n"
-    "# (default is 6)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_GW_STABLE_COUNT);
   abuf_appendf(out, "%sSmartGatewayStableCount %d\n",
       cnf->smart_gw_stablecount == DEF_GW_STABLE_COUNT ? "# " : "",
       cnf->smart_gw_stablecount);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# When another gateway than the current one has a cost of less than the cost\n"
     "# of the current gateway multiplied by SmartGatewayThreshold then the smart\n"
     "# gateway is switched to the other gateway. The unit is percentage.\n"
-    "# (defaults to 0)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_GW_THRESH);
   abuf_appendf(out, "%sSmartGatewayThreshold  %d\n",
       cnf->smart_gw_thresh == DEF_GW_THRESH ? "# " : "",
       cnf->smart_gw_thresh);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# The weighing factor for the gateway uplink bandwidth (exit link, uplink).\n"
     "# See README-Olsr-Extensions for a description of smart gateways.\n"
-    "# (default is 1)\n"
-    "\n");
+    "# (default is %lu)\n"
+    "\n", (long unsigned int)DEF_GW_WEIGHT_EXITLINK_UP);
   abuf_appendf(out, "%sSmartGatewayWeightExitLinkUp  %d\n",
       cnf->smart_gw_weight_exitlink_up == DEF_GW_WEIGHT_EXITLINK_UP ? "# " : "",
       cnf->smart_gw_weight_exitlink_up);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# The weighing factor for the gateway downlink bandwidth (exit link, downlink).\n"
     "# See README-Olsr-Extensions for a description of smart gateways.\n"
-    "# (default is 1)\n"
-    "\n");
+    "# (default is %lu)\n"
+    "\n", (long unsigned int)DEF_GW_WEIGHT_EXITLINK_DOWN);
   abuf_appendf(out, "%sSmartGatewayWeightExitLinkDown  %d\n",
       cnf->smart_gw_weight_exitlink_down == DEF_GW_WEIGHT_EXITLINK_DOWN ? "# " : "",
       cnf->smart_gw_weight_exitlink_down);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# The weighing factor for the ETX costs.\n"
     "# See README-Olsr-Extensions for a description of smart gateways.\n"
-    "# (default is 1)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_GW_WEIGHT_ETX);
   abuf_appendf(out, "%sSmartGatewayWeightEtx  %d\n",
       cnf->smart_gw_weight_etx == DEF_GW_WEIGHT_ETX ? "# " : "",
       cnf->smart_gw_weight_etx);
-
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# The divider for the ETX costs.\n"
     "# See README-Olsr-Extensions for a description of smart gateways.\n"
-    "# (default is 0)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_GW_DIVIDER_ETX);
   abuf_appendf(out, "%sSmartGatewayDividerEtx  %d\n",
       cnf->smart_gw_divider_etx == DEF_GW_DIVIDER_ETX ? "# " : "",
       cnf->smart_gw_divider_etx);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Defines what kind of Uplink this node will publish as a\n"
     "# smartgateway. The existence of the uplink is detected by\n"
     "# a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3.\n"
     "# possible values are \"none\", \"ipv4\", \"ipv6\", \"both\"\n"
-    "# (default is \"both\")\n"
-    "\n");
+    "# (default is \"%s\")\n"
+    "\n", GW_UPLINK_TXT[DEF_GW_TYPE]);
   abuf_appendf(out, "%sSmartGatewayUplink \"%s\"\n",
       cnf->smart_gw_type == DEF_GW_TYPE ? "# " : "",
       GW_UPLINK_TXT[cnf->smart_gw_type]);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Specifies if the local ipv4 uplink use NAT\n"
-    "# (default is \"yes\")\n"
-    "\n");
+    "# (default is \"%s\")\n"
+    "\n", DEF_GW_UPLINK_NAT ? "yes" : "no");
   abuf_appendf(out, "%sSmartGatewayUplinkNAT %s\n",
       cnf->smart_gw_uplink_nat == DEF_GW_UPLINK_NAT ? "# " : "",
       cnf->smart_gw_uplink_nat ? "yes" : "no");
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Specifies the speed of the uplink in kilobit/s.\n"
     "# First parameter is upstream, second parameter is downstream\n"
-    "# (default is 128/1024)\n"
-    "\n");
+    "# (default is %u/%u)\n"
+    "\n", DEF_UPLINK_SPEED, DEF_DOWNLINK_SPEED);
   abuf_appendf(out, "%sSmartGatewaySpeed %d %d\n",
       cnf->smart_gw_uplink == DEF_UPLINK_SPEED && cnf->smart_gw_downlink == DEF_DOWNLINK_SPEED ? "# " : "",
       cnf->smart_gw_uplink, cnf->smart_gw_downlink);
@@ -629,7 +698,7 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
   abuf_appendf(out, "%sSmartGatewayPrefix %s\n",
       cnf->smart_gw_prefix.prefix_len == 0 ? "# " : "",
       olsr_ip_prefix_to_string(&cnf->smart_gw_prefix));
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "##############################\n"
     "### OLSR protocol settings ###\n"
@@ -638,10 +707,10 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# For testing purposes it may be nice to use another port for olsrd\n"
     "# for using another port than the IANA assigned one \n"
     "# for a production network, there should be a good reason!!\n"
-    "# valid values are integers >1, please be careful with using reserved\n"
-    "# port numbers\n"
-    "# (default is 698, the IANA assigned olsr-port)\n"
-    "\n");
+    "# valid values are integers greater than 1, please be careful with\n"
+    "# using reserved port numbers\n"
+    "# (default is %u, the IANA assigned olsr-port)\n"
+    "\n", DEF_OLSRPORT);
   abuf_appendf(out, "%sOlsrPort %u\n",
       cnf->olsrport == DEF_OLSRPORT ? "# " : "",
       cnf->olsrport);
@@ -653,13 +722,13 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "\n");
   abuf_appendf(out, "MainIp %s\n",
       olsr_ip_to_string(&ipbuf, &cnf->main_addr));
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# The fixed willingness to use (0-7)\n"
     "# If not set willingness will be calculated\n"
     "# dynamically based on battery/power status\n"
-    "# (default is 3)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_WILLINGNESS);
   abuf_appendf(out, "%sWillingness     %u\n",
       cnf->willingness == DEF_WILLINGNESS ? "# " : "",
       cnf->willingness);
@@ -679,26 +748,26 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     abuf_appendf(out, "    %s\n", olsr_ip_prefix_to_string(&hna->net));
     hna = hna->next;
   }
-  abuf_puts(out,
+  abuf_appendf(out,
     "}\n"
     "\n"
     "# Hysteresis for link sensing (only for hopcount metric)\n"
     "# Hysteresis adds more robustness to the link sensing\n"
     "# but delays neighbor registration.\n"
-    "# (defaults to yes)\n"
-    "\n");
+    "# (default is %s)\n"
+    "\n", DEF_USE_HYST ? "yes" : "no");
   abuf_appendf(out, "%sUseHysteresis %s\n",
       cnf->use_hysteresis == DEF_USE_HYST ? "# " : "",
       cnf->use_hysteresis ? "yes" : "no");
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Hysteresis parameters (only for hopcount metric)\n"
     "# Do not alter these unless you know what you are doing!\n"
     "# Set to auto by default. Allowed values are floating point\n"
     "# values in the interval 0,1\n"
     "# THR_LOW must always be lower than THR_HIGH!!\n"
-    "# (default is 0.5/0.8/0.3)\n"
-    "\n");
+    "# (default is %.2f/%.2f/%.2f)\n"
+    "\n", (double)HYST_SCALING, (double)HYST_THRESHOLD_HIGH, (double)HYST_THRESHOLD_LOW);
   abuf_appendf(out, "%sHystScaling  %.2f\n",
       cnf->hysteresis_param.scaling == (float)HYST_SCALING ? "# " : "",
       (double)cnf->hysteresis_param.scaling);
@@ -708,30 +777,30 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
   abuf_appendf(out, "%sHystThrLow  %.2f\n",
       cnf->hysteresis_param.thr_low == (float)HYST_THRESHOLD_LOW ? "# " : "",
       (double)cnf->hysteresis_param.thr_low);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# TC redundancy\n"
     "# Specifies how much neighbor info should be sent in\n"
     "# TC messages. Because of a design problem in the 0.5.x\n"
     "# dijkstra implementation this value must be set to 2.\n"
     "# 2 - send all neighbors\n"
-    "# (default is 2)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", TC_REDUNDANCY);
   abuf_appendf(out, "%sTcRedundancy  %d\n",
       cnf->tc_redundancy == TC_REDUNDANCY ? "# " : "",
       cnf->tc_redundancy);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# MPR coverage specifies how many MPRs a node should\n"
     "# try select to reach every 2 hop neighbor. Because of\n"
     "# a design problem in the 0.5.x dijkstra algorithm this\n"
     "# value should be set to 7.\n"
-    "# (default is 7)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", MPR_COVERAGE);
   abuf_appendf(out, "%sMprCoverage %d\n",
       cnf->mpr_coverage == MPR_COVERAGE ? "# " : "",
       cnf->mpr_coverage);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "################################\n"
     "### OLSR protocol extensions ###\n"
@@ -743,12 +812,12 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# value should not be set to 1.\n"
     "# 0 = do not use link quality\n"
     "# 2 = use link quality for MPR selection and routing\n"
-    "# (default is 2)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_LQ_LEVEL);
   abuf_appendf(out, "%sLinkQualityLevel %d\n",
       cnf->lq_level == DEF_LQ_LEVEL ? "# " : "",
       cnf->lq_level);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Link quality algorithm (only for lq level 2)\n"
     "# (see README-Olsr-Extensions)\n"
@@ -758,31 +827,31 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "#   traffic (instead of only hellos) for ETX calculation\n"
     "# - \"etx_ffeth\", an incompatible variant of etx_ff that allows\n"
     "#   ethernet links with ETX 0.1.\n"
-    "# (defaults to \"etx_ff\")\n"
-    "\n");
+    "# (default is \"%s\")\n"
+    "\n", DEF_LQ_ALGORITHM);
   abuf_appendf(out, "%sLinkQualityAlgorithm    \"%s\"\n",
       cnf->lq_algorithm == NULL ? "# " : "",
       cnf->lq_algorithm == NULL ? DEF_LQ_ALGORITHM : cnf->lq_algorithm);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Link quality aging factor (only for lq level 2)\n"
     "# Tuning parameter for etx_float and etx_fpm, smaller values\n"
     "# mean slower changes of ETX value. (allowed values are\n"
     "# between 0.01 and 1.0)\n"
-    "# (default is 0.05)\n"
-    "\n");
+    "# (default is %.2f)\n"
+    "\n", (double)DEF_LQ_AGING);
   abuf_appendf(out, "%sLinkQualityAging %.2f\n",
       cnf->lq_aging == (float)DEF_LQ_AGING ? "# " : "",
       (double)cnf->lq_aging);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "# Fisheye mechanism for TCs (0 meansoff, 1 means on)\n"
-    "# (default is 1)\n"
-    "\n");
+    "# (default is %u)\n"
+    "\n", DEF_LQ_FISH);
   abuf_appendf(out, "%sLinkQualityFishEye  %d\n",
       cnf->lq_fish == DEF_LQ_FISH ? "# " : "",
       cnf->lq_fish);
-  abuf_puts(out,
+  abuf_appendf(out,
     "\n"
     "#\n"
     "# NatThreshold \n"
@@ -796,8 +865,8 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# should be close to 1.0 if changed.\n"
     "# WARNING: This parameter should not be used together with\n"
     "# the etx_ffeth metric !!\n"
-    "# (defaults to 1.0)\n"
-    "\n");
+    "# (default is %.1f)\n"
+    "\n", (double)DEF_LQ_NAT_THRESH);
   abuf_appendf(out, "%sNatThreshold  %.1f\n",
       cnf->lq_nat_thresh == (float)DEF_LQ_NAT_THRESH ? "# " : "",
       (double)cnf->lq_nat_thresh);
index ca856f5..c1f6652 100644 (file)
@@ -100,17 +100,17 @@ struct olsrd_config *olsr_cnf;         /* The global configuration */
 int
 main(int argc, char *argv[])
 {
-  struct olsrd_config *cnf;
-
   if (argc == 1) {
     fprintf(stderr, "Usage: olsrd_cfgparser [filename] -print\n\n");
     exit(EXIT_FAILURE);
   }
 
-  if ((cnf = olsrd_parse_cnf(argv[1])) == 0) {
+  olsr_cnf = olsrd_get_default_cnf();
+
+  if (olsrd_parse_cnf(argv[1]) == 0) {
     if ((argc > 2) && (!strcmp(argv[2], "-print"))) {
-      olsrd_print_cnf(cnf);
-      olsrd_write_cnf(cnf, "./out.conf");
+      olsrd_print_cnf(olsr_cnf);
+      olsrd_write_cnf(olsr_cnf, "./out.conf");
     } else
       printf("Use -print to view parsed values\n");
     printf("Configfile parsed OK\n");
@@ -121,6 +121,10 @@ main(int argc, char *argv[])
   return 0;
 }
 
+void
+olsr_startup_sleep(int seconds __attribute__((unused))) {
+}
+
 #else /* MAKEBIN */
 
 /* Build as part of olsrd */
@@ -219,55 +223,55 @@ static int olsrd_sanity_check_rtpolicy(struct olsrd_config *cnf) {
   if (!cnf->smart_gw_active) {
     /* default is "no policy rules" and "everything into the main table" */
     if (cnf->rt_table == DEF_RT_AUTO) {
-      cnf->rt_table = 254;
+      cnf->rt_table = DEF_RT_TABLE_NR;
     }
     if (cnf->rt_table_default == DEF_RT_AUTO) {
-      cnf->rt_table_default = cnf->rt_table;
+      cnf->rt_table_default = DEF_RT_TABLE_DEFAULT_NR;
     }
     if (cnf->rt_table_tunnel != DEF_RT_AUTO) {
       fprintf(stderr, "Warning, setting a table for tunnels without SmartGW does not make sense.\n");
     }
-    cnf->rt_table_tunnel = cnf->rt_table_default;
+    cnf->rt_table_tunnel = DEF_RT_TABLE_TUNNEL_NR;
 
     /* priority rules default is "none" */
     if (cnf->rt_table_pri == DEF_RT_AUTO) {
-      cnf->rt_table_pri = DEF_RT_NONE;
+      cnf->rt_table_pri = DEF_RT_TABLE_PRI;
     }
     if (cnf->rt_table_defaultolsr_pri == DEF_RT_AUTO) {
-      cnf->rt_table_defaultolsr_pri = DEF_RT_NONE;
+      cnf->rt_table_defaultolsr_pri = DEF_RT_TABLE_DEFAULTOLSR_PRI;
     }
     if (cnf->rt_table_tunnel_pri == DEF_RT_AUTO) {
-      cnf->rt_table_tunnel_pri = DEF_RT_NONE;
+      cnf->rt_table_tunnel_pri = DEF_RT_TABLE_TUNNEL_PRI;
     }
     if (cnf->rt_table_default_pri == DEF_RT_AUTO) {
-      cnf->rt_table_default_pri = DEF_RT_NONE;
+      cnf->rt_table_default_pri = DEF_RT_TABLE_DEFAULT_PRI;
     }
   }
   else {
     /* default is "policy rules" and "everything into separate tables (254, 223, 224)" */
     if (cnf->rt_table == DEF_RT_AUTO) {
-      cnf->rt_table = 254;
+      cnf->rt_table = DEF_SGW_RT_TABLE_NR;
     }
     if (cnf->rt_table_default == DEF_RT_AUTO) {
-      cnf->rt_table_default = 223;
+      cnf->rt_table_default = DEF_SGW_RT_TABLE_DEFAULT_NR;
     }
     if (cnf->rt_table_tunnel == DEF_RT_AUTO) {
-      cnf->rt_table_tunnel = 224;
+      cnf->rt_table_tunnel = DEF_SGW_RT_TABLE_TUNNEL_NR;
     }
 
     /* default for "rt_table_pri" is none (main table already has a policy rule */
-    prio = 32766;
+    prio = DEF_SGW_RT_TABLE_PRI_BASE;
     if (cnf->rt_table_pri > 0) {
       prio = cnf->rt_table_pri;
     }
     else if (cnf->rt_table_pri == DEF_RT_AUTO) {
       /* choose default */
-      olsr_cnf->rt_table_pri = DEF_RT_NONE;
+      olsr_cnf->rt_table_pri = DEF_SGW_RT_TABLE_PRI;
       fprintf(stderr, "No policy rule for rt_table_pri\n");
     }
 
     /* default for "rt_table_defaultolsr_pri" is +10 */
-    prio += 10;
+    prio += DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER;
     if (cnf->rt_table_defaultolsr_pri > 0) {
       prio = cnf->rt_table_defaultolsr_pri;
     }
@@ -276,7 +280,7 @@ static int olsrd_sanity_check_rtpolicy(struct olsrd_config *cnf) {
       fprintf(stderr, "Choose priority %u for rt_table_defaultolsr_pri\n", prio);
     }
 
-    prio += 10;
+    prio += DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER;
     if (cnf->rt_table_tunnel_pri > 0) {
       prio = cnf->rt_table_tunnel_pri;
     }
@@ -285,8 +289,11 @@ static int olsrd_sanity_check_rtpolicy(struct olsrd_config *cnf) {
       fprintf(stderr, "Choose priority %u for rt_table_tunnel_pri\n", prio);
     }
 
-    prio += 10;
-    if (cnf->rt_table_default_pri == DEF_RT_AUTO) {
+    prio += DEF_SGW_RT_TABLE_DEFAULT_PRI_ADDER;
+    if (cnf->rt_table_default_pri > 0) {
+      prio = cnf->rt_table_default_pri;
+    }
+    else if (cnf->rt_table_default_pri == DEF_RT_AUTO) {
       olsr_cnf->rt_table_default_pri = prio;
       fprintf(stderr, "Choose priority %u for rt_table_default_pri\n", prio);
     }
index efde908..7b51986 100644 (file)
@@ -58,7 +58,7 @@
 
 #ifndef OLSRD_GLOBAL_CONF_FILE
 #define OLSRD_CONF_FILE_NAME   "olsrd.conf"
-#define OLSRD_GLOBAL_CONF_FILE "/etc/" OLSRD_CONF_FILE_NAME
+#define OLSRD_GLOBAL_CONF_FILE "/etc/olsrd/" OLSRD_CONF_FILE_NAME
 #endif /* OLSRD_GLOBAL_CONF_FILE */
 
 #define        MAXMESSAGESIZE          1500    /* max broadcast size */
index 95036b4..e4db6e9 100644 (file)
@@ -59,10 +59,10 @@ static uint8_t smart_gateway_netmask[sizeof(union olsr_ip_addr)];
 static struct olsr_gw_handler *gw_handler;
 
 /** the IPv4 gateway list */
-static struct gw_list gw_list_ipv4;
+struct gw_list gw_list_ipv4;
 
 /** the IPv6 gateway list */
-static struct gw_list gw_list_ipv6;
+struct gw_list gw_list_ipv6;
 
 /** the current IPv4 gateway */
 static struct gw_container_entry *current_ipv4_gw;
index 7481218..2102ef1 100644 (file)
@@ -13,6 +13,7 @@
 #include "defs.h"
 #include "olsr.h"
 #include "scheduler.h"
+#include "gateway_list.h"
 
 /** used to signal to olsr_delete_gateway_entry to force deletion */
 #define FORCE_DELETE_GW_ENTRY 255
@@ -83,6 +84,12 @@ AVLNODE2STRUCT(node2gateway, struct gateway_entry, node);
 /** the gateway tree */
 extern struct avl_tree gateway_tree;
 
+/** the list IPv4 gateways */
+extern struct gw_list gw_list_ipv4;
+
+/** the list IPv6 gateways */
+extern struct gw_list gw_list_ipv6;
+
 /**
  * Function pointer table for gateway plugin hooks.
  */
diff --git a/src/gateway_costs.c b/src/gateway_costs.c
new file mode 100644 (file)
index 0000000..440e6cb
--- /dev/null
@@ -0,0 +1,34 @@
+#include "gateway_costs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SCALING_SHIFT_CLASSIC 32
+#define SCALING_SHIFT 24
+
+uint64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk) {
+  uint64_t costU;
+  uint64_t costD;
+  uint64_t costE;
+
+  if (!weights.Detx) {
+    /* only consider path costs (classic behaviour) (but scale to 64 bit) */
+    return (uint64_t) path_cost << SCALING_SHIFT_CLASSIC;
+  }
+
+  if (!exitUk || !exitDk) {
+    /* zero bandwidth */
+    return UINT64_MAX;
+  }
+
+  costU = (((uint64_t) (1000 * weights.WexitU))    << SCALING_SHIFT) / exitUk;
+  costD = (((uint64_t) (1000 * weights.WexitD))    << SCALING_SHIFT) / exitDk;
+  costE = (((uint64_t) (weights.Wetx * path_cost)) << SCALING_SHIFT) / weights.Detx;
+
+  return (costU + costD + costE);
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/gateway_costs.h b/src/gateway_costs.h
new file mode 100644 (file)
index 0000000..31ca3c5
--- /dev/null
@@ -0,0 +1,88 @@
+#ifndef GATEWAY_COSTS_H_
+#define GATEWAY_COSTS_H_
+
+/*
+ * Weighing of the path costs:
+ *
+ * exitUm = the gateway exit link uplink   bandwidth, in Mbps
+ * exitDm = the gateway exit link downlink bandwidth, in Mbps
+ * WexitU = the gateway exit link uplink   bandwidth weight   (configured)
+ * WexitD = the gateway exit link downlink bandwidth weight   (configured)
+ * Wetx   = the ETX path cost weight                          (configured)
+ * Detx   = the ETX path cost divider                         (configured)
+ *
+ *                     WexitU   WexitD   Wetx
+ * path_cost_weight =  ------ + ------ + ---- * path_cost
+ *                     exitUm   exitDm   Detx
+ *
+ * Since the gateway exit link bandwidths are in Kbps, the following formula
+ * is used to convert them to the desired Mbps:
+ *
+ *       bwK
+ * bwM = ----       bwK = bandwidth in Kbps
+ *       1000       bwM = bandwidth in Mbps
+ *
+ * exitUk = the gateway exit link uplink   bandwidth, in Kbps
+ * exitDk = the gateway exit link downlink bandwidth, in Kbps
+ *
+ *                     1000 * WexitU   1000 * WexitD   Wetx
+ * path_cost_weight =  ------------- + ------------- + ---- * path_cost
+ *                         exitUk          exitDk      Detx
+ *
+ *
+ * Analysis of the required bit width of the result:
+ *
+ * exitUk    = [1,   320,000,000] = 29 bits
+ * exitDk    = [1,   320,000,000] = 29 bits
+ * WexitU    = [1,           255] =  8 bits
+ * WexitD    = [1,           255] =  8 bits
+ * Wetx      = [1,           255] =  8 bits
+ * Detx      = [1,           255] =  8 bits
+ * path_cost = [1, 4,294,967,295] = 32 bits
+ *
+ *                         1000 * 255   1000 * 255   255
+ * path_cost_weight(max) = ---------- + ---------- + --- * 4,294,967,295
+ *                              1             1       1
+ *
+ * path_cost_weight(max) = 0x3E418    + 0x3E418    + 0xFEFFFFFF01
+ * path_cost_weight(max) = 0xFF0007C731
+ *
+ * Because we can multiply 0xFF0007C731 by 2^24 without overflowing a
+ * 64 bits number, we do this to increase accuracy.
+ */
+
+#include "stdint.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+  /**
+   * Structure to keep weighing factors for the gw_costs_weigh function
+   */
+  struct costs_weights {
+      uint8_t WexitU;
+      uint8_t WexitD;
+      uint8_t Wetx;
+      uint8_t Detx;
+  };
+
+  /**
+   * Weigh the path costs and the gateway bandwidth.
+   *
+   * If the ETX divider is zero, then no weighing is performed and only the path
+   * costs are considered (classic behaviour), but scaled to a 64 bit number.
+   *
+   * @param weights the weights for the calculation
+   * @param path_cost the (ETX) path cost to the gateway
+   * @param exitUk the gateway exit link uplink bandwidth (in kbps)
+   * @param exitDk the gateway exit link downlink bandwidth (in kbps)
+   * @return the weighed path cost, UINT64_MAX when exitUk and/or exitDk are zero
+   */
+  uint64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GATEWAY_COSTS_H_ */
index 11bca37..115d1b5 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "gateway_default_handler.h"
 
+#include "gateway_costs.h"
 #include "defs.h"
 #include "gateway.h"
 #include "lq_plugin.h"
@@ -17,6 +18,7 @@ static uint32_t gw_def_stablecount;
 static bool gw_def_choose_new_ipv4_gw;
 static bool gw_def_choose_new_ipv6_gw;
 static struct timer_entry *gw_def_timer;
+static struct costs_weights gw_costs_weights;
 
 /* forward declarations */
 static void gw_default_init(void);
@@ -59,96 +61,6 @@ static inline uint64_t gw_default_calc_threshold(uint64_t path_cost) {
 }
 
 /**
- * Weigh the path costs and the gateway bandwidth.
- *
- * If the ETX divider is zero, then no weighing is performed and only the path
- * costs are considered (classic behaviour).
- *
- * If either of the uplink or downlink bandwidths is zero, then UINT64_MAX is
- * returned.
- *
- * @param path_cost the (ETX) path cost to the gateway
- * @param exitUk the gateway exit link uplink bandwidth (in kbps)
- * @param exitDk the gateway exit link downlink bandwidth (in kbps)
- * @return the weighed path cost
- */
-static inline uint64_t gw_default_weigh_costs(uint32_t path_cost, uint32_t exitUk, uint32_t exitDk) {
-  uint8_t WexitU = olsr_cnf->smart_gw_weight_exitlink_up;
-  uint8_t WexitD = olsr_cnf->smart_gw_weight_exitlink_down;
-  uint8_t Wetx = olsr_cnf->smart_gw_weight_etx;
-  uint8_t Detx = olsr_cnf->smart_gw_divider_etx;
-  uint64_t costU;
-  uint64_t costD;
-  uint64_t costE;
-
-  if (!Detx) {
-    /* only consider path costs (classic behaviour) (but scale to 64 bit) */
-    return (uint64_t)path_cost << 32;
-  }
-
-  if (!exitUk || !exitDk) {
-    /* zero bandwidth */
-    return UINT64_MAX;
-  }
-
-  /*
-   * Weighing of the path costs:
-   *
-   * exitUm = the gateway exit link uplink   bandwidth, in Mbps
-   * exitDm = the gateway exit link downlink bandwidth, in Mbps
-   * WexitU = the gateway exit link uplink   bandwidth weight   (configured)
-   * WexitD = the gateway exit link downlink bandwidth weight   (configured)
-   * Wetx   = the ETX path cost weight                          (configured)
-   * Detx   = the ETX path cost divider                         (configured)
-   *
-   *                     WexitU   WexitD   Wetx
-   * path_cost_weight =  ------ + ------ + ---- * path_cost
-   *                     exitUm   exitDm   Detx
-   *
-   * Since the gateway exit link bandwidths are in Kbps, the following formula
-   * is used to convert them to the desired Mbps:
-   *
-   *       bwK
-   * bwM = ----       bwK = bandwidth in Kbps
-   *       1000       bwM = bandwidth in Mbps
-   *
-   * exitUk = the gateway exit link uplink   bandwidth, in Kbps
-   * exitDk = the gateway exit link downlink bandwidth, in Kbps
-   *
-   *                     1000 * WexitU   1000 * WexitD   Wetx
-   * path_cost_weight =  ------------- + ------------- + ---- * path_cost
-   *                         exitUk          exitDk      Detx
-   *
-   *
-   * Analysis of the required bit width of the result:
-   *
-   * exitUk    = [1,   320,000,000] = 29 bits
-   * exitDk    = [1,   320,000,000] = 29 bits
-   * WexitU    = [1,           255] =  8 bits
-   * WexitD    = [1,           255] =  8 bits
-   * Wetx      = [1,           255] =  8 bits
-   * Detx      = [1,           255] =  8 bits
-   * path_cost = [1, 4,294,967,295] = 32 bits
-   *
-   *                         1000 * 255   1000 * 255   255
-   * path_cost_weight(max) = ---------- + ---------- + --- * 4,294,967,295
-   *                              1             1       1
-   *
-   * path_cost_weight(max) = 0x3E418    + 0x3E418    + 0xFEFFFFFF01
-   * path_cost_weight(max) = 0xFF0007C731
-   *
-   * Because we can multiply 0xFF0007C731 by 2^24 without overflowing a
-   * 64 bits number, we do this to increase accuracy.
-   */
-
-  costU = (((uint64_t) (1000 * WexitU)) << 24) / exitUk;
-  costD = (((uint64_t) (1000 * WexitD)) << 24) / exitDk;
-  costE = (((uint64_t) (Wetx * path_cost)) << 24) / Detx;
-
-  return (costU + costD + costE);
-}
-
-/**
  * Look through the gateway list and select the best gateway
  * depending on the distance to this router
  */
@@ -301,6 +213,11 @@ static void gw_default_init(void) {
   gw_def_choose_new_ipv4_gw = true;
   gw_def_choose_new_ipv6_gw = true;
   gw_def_timer = NULL;
+
+  gw_costs_weights.WexitU = olsr_cnf->smart_gw_weight_exitlink_up;
+  gw_costs_weights.WexitD = olsr_cnf->smart_gw_weight_exitlink_down;
+  gw_costs_weights.Wetx = olsr_cnf->smart_gw_weight_etx;
+  gw_costs_weights.Detx = olsr_cnf->smart_gw_divider_etx;
 }
 
 /**
@@ -354,7 +271,7 @@ static uint64_t gw_default_getcosts(struct gateway_entry *gw) {
   }
 
   /* determine the path cost */
-  return gw_default_weigh_costs(tc->path_cost, gw->uplink, gw->downlink);
+  return gw_costs_weigh(gw_costs_weights, tc->path_cost, gw->uplink, gw->downlink);
 }
 
 /**
index bf409fd..e5fb5ab 100644 (file)
 #define DEF_RTPROTO          0 /* 0 means OS-specific default */
 #define DEF_RT_NONE          -1
 #define DEF_RT_AUTO          0
+
+#define DEF_RT_TABLE_NR                   254
+#define DEF_RT_TABLE_DEFAULT_NR           254
+#define DEF_RT_TABLE_TUNNEL_NR            254
+
+#define DEF_SGW_RT_TABLE_NR               254
+#define DEF_SGW_RT_TABLE_DEFAULT_NR       223
+#define DEF_SGW_RT_TABLE_TUNNEL_NR        224
+
+#define DEF_RT_TABLE_PRI                  DEF_RT_NONE
+#define DEF_RT_TABLE_DEFAULTOLSR_PRI      DEF_RT_NONE
+#define DEF_RT_TABLE_TUNNEL_PRI           DEF_RT_NONE
+#define DEF_RT_TABLE_DEFAULT_PRI          DEF_RT_NONE
+
+#define DEF_SGW_RT_TABLE_PRI                    DEF_RT_NONE
+#define DEF_SGW_RT_TABLE_PRI_BASE               32766
+#define DEF_SGW_RT_TABLE_DEFAULTOLSR_PRI_ADDER  10
+#define DEF_SGW_RT_TABLE_TUNNEL_PRI_ADDER       10
+#define DEF_SGW_RT_TABLE_DEFAULT_PRI_ADDER      10
+
 #define DEF_MIN_TC_VTIME     0.0
 #define DEF_USE_NIIT         true
 #define DEF_SMART_GW         false
index 0373a4e..dc32688 100644 (file)
@@ -361,7 +361,7 @@ Optionally, to clean all generated files:
  make uberclean
 
 Before running olsrd you must edit the default configuration file 
-/etc/olsrd.conf adding at least what interfaces olsrd is to run on. 
+/etc/olsrd/olsrd.conf adding at least what interfaces olsrd is to run on.
 Options in the config file can also be overridden by command line 
 options. See the manual pages olsrd(8) and olsrd.conf(5) for details.
 The binary is named 'olsrd' and is installed in (PREFIX)/usr/sbin. 
index e1795ab..449379a 100644 (file)
@@ -36,7 +36,7 @@ II. How to use
 --------------
 
 The Fish Eye algorithm can be enabled in the configuration file
-/etc/olsrd.conf with the following lines:
+/etc/olsrd/olsrd.conf with the following lines:
 
        # Fish Eye mechanism for TC messages 0 = off, 1 = on
 
@@ -120,7 +120,7 @@ also critical to have MPR information in sync if the MPR algorithm is
 used, but in the author's opinion this optimization doesn't do any
 good anyway. The MPR algorithm introduces a new source of failure and
 reduces TC message redundancy, so it should be switched off in the
-configuration file /etc/olsrd.conf with these lines:
+configuration file /etc/olsrd/olsrd.conf with these lines:
 
         TcRedundancy 2
         MprCoverage  7
index 4d2d4ca..33f2c40 100644 (file)
@@ -253,7 +253,7 @@ will run in the background using the <I>-d 0</I> option. In this
 example we'll run our olsrd instances in the foreground using debug
 level 1. Start them off(in separate terminals) using: 
 </P>
-<PRE STYLE="margin-bottom: 0.2in">./olsrd -f /etc/olsrd.emu.conf -hemu 10.0.0.x -d 1</PRE><P>
+<PRE STYLE="margin-bottom: 0.2in">./olsrd -f /etc/olsrd/olsrd.emu.conf -hemu 10.0.0.x -d 1</PRE><P>
 where x is 1-8(we'll run 8 instances). The <A HREF="http://www.gnu.org/software/screen/">screen</A>
 terminal multiplexer application is <I>highly</I> recomended for
 making your life easier if working on multiple terminals.