Merge branch 'release-0.6.6'
authorFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 21 Oct 2013 16:12:25 +0000 (18:12 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 21 Oct 2013 16:12:25 +0000 (18:12 +0200)
* release-0.6.6:
  Update version after release of v0.6.6.1
  Release v0.6.6.1
  Fix jsoninfo again after a regression which was introduced with http://olsr.org/git/?p=olsrd.git;a=commit;h=8f633c9f54e179ce530291571a13b3b96d288bf4 For a discussion of the bug see http://olsr.org/bugs/view.php?id=40  Bitte geben Sie eine Commit-Beschreibung für Ihre Änderungen ein. Zeilen,

Conflicts:
Makefile
gui/win32/Inst/installer.nsi
gui/win32/Main/Frontend.rc

74 files changed:
.gitignore
CHANGELOG
Makefile
Makefile.inc
README-Debian-package [new file with mode: 0644]
README-LINUX_NL80211.txt [new file with mode: 0644]
debian/.gitignore [deleted file]
debian/README.Debian [deleted file]
debian/changelog [deleted file]
debian/compat [deleted file]
debian/control [deleted file]
debian/copyright [deleted file]
debian/olsrd-default [deleted file]
debian/olsrd-plugins.dirs [deleted file]
debian/olsrd-plugins.docs [deleted file]
debian/olsrd.conf [deleted file]
debian/olsrd.dirs [deleted file]
debian/olsrd.docs [deleted file]
debian/olsrd.init [deleted file]
debian/olsrd.postinst [deleted file]
debian/rules [deleted file]
debian/todo [deleted file]
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/nmealib/src/info.c
lib/pud/olsrd.conf.sample
lib/pud/src/configTools.c
lib/pud/src/configTools.h
lib/pud/src/configuration.c
lib/pud/src/configuration.h
lib/pud/src/netTools.c
lib/pud/src/posAvg.c
lib/pud/src/pud.c
lib/pud/src/pudOlsrdPlugin.h
lib/pud/src/receiver.c
lib/pud/wireformat-java/Makefile
lib/pud/wireformat-java/resources/WireFormatConstants.java.h
lib/pud/wireformat-java/resources/build.xml
lib/pud/wireformat/include/OlsrdPudWireFormat/nodeIdConversion.h
lib/pud/wireformat/include/OlsrdPudWireFormat/wireFormat.h
lib/pud/wireformat/src/nodeIdConversion.c
lib/pud/wireformat/src/wireFormat.c
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..66e1cd0 100644 (file)
 /.project
 /.settings
 /build-stamp
+/builddata.txt
 /configure-stamp
+/debian/
 /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 59669e4..ac92bca 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -203,6 +203,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 ba4002b..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.2
+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),)
diff --git a/README-Debian-package b/README-Debian-package
new file mode 100644 (file)
index 0000000..2d98790
--- /dev/null
@@ -0,0 +1,28 @@
+
+If you want to build the Debian packages from the latest git source, here is
+how to do it:
+
+First, get the latest debian/ folder from Subversion, which contains all the
+files needed to build the Debian package, then run dpkg-buildpackage:
+
+  sudo apt-get install build-essential dpkg-dev
+  git clone http://olsr.org/git/olsrd.git
+  cd olsrd
+  svn checkout svn://svn.debian.org/svn/collab-maint/deb-maint/olsrd/trunk/debian
+  echo "1.0" > debian/source/format
+  dpkg-buildpackage -uc -us
+  ls -l ../olsrd*.*
+
+If you want the package to have the proper version, then you'll need to edit
+the debian/changelog file.  Just change the version number on the top-most
+line of debian/changelog.
+
+You can also find the latest tarballs of the debian/ folder here, look on the
+right column under "Download Source Package olsrd":
+http://packages.debian.org/source/sid/olsrd
+
+e.g.
+http://ftp.debian.org/debian/pool/main/o/olsrd/olsrd_0.6.3-6.debian.tar.gz
+
+You can find complete developer info here:
+http://packages.qa.debian.org/o/olsrd.html
diff --git a/README-LINUX_NL80211.txt b/README-LINUX_NL80211.txt
new file mode 100644 (file)
index 0000000..55fca68
--- /dev/null
@@ -0,0 +1,62 @@
+Abstract
+==========================================================================
+This document describes the OLSRd link quality extension that utilizes
+linux NL80211 to apply wireless link information in the link quality
+calculation.
+
+Design
+==========================================================================
+Each second the latest information is gathered from linux NL80211. This
+data contains the MAC addresses of the neighbor stations. To match this
+MAC address with the neighbors IP, the linux ARP cache is queried.
+
+Implementation
+==========================================================================
+The extension adds an external dependency to build the code namely libnl.
+This library is used to simplify the IPC communication with linux kernel.
+
+The files src/linux/nl80211_link_info.* are doing the actual wireless link
+status gathering. A modified link ffeth quality plugin will use the new
+link status information for link quality calculations. This link quality
+plugin is using #ifdef LINUX_NL80211 statements as much as possible to
+make it easy to merge the code back into the original ffeth plugin. The
+benefit of merging those link quality plugins will be less duplicate code
+and less code to maintain.
+
+Cost calculation
+==========================================================================
+A penalty is added to the old cost from the ffeth plugin, depending on the
+signal strength and the link bandwidth. Both penalties can have a maximum
+value of 1.0.
+
+Costs = EXT + BandwidthPenalty + SignalPenalty
+
+BandwidthPenalty = 1 - ( ActualBandwidth / ReferenceBandwidth)
+
+SignalPenalty = LookupSignalPenaltyTable(SignalStrenghtOfNeighbor)
+
+Both penalties are added into the two unused bytes of LQ_HELLO messages.
+Currently the nodes won't use this value when received from their neighbor
+and only use their own NL80211 information.
+
+Considerations
+==========================================================================
+It is designed mainly for IPv4, but should work with minimal effort on
+IPv6 as well. Majority of that work will be actually testing it on IPv6.
+
+The netlink code is blocking, this shouldn't cause major problems but a
+more ideal design would be non-blocking.
+
+Current version does not use the NL80211 data received from it's neighbors.
+A discussion is needed to find out if this is required or not.
+
+Currently both penalties have a maximum of 1.0, which might not be enough.
+If that's the case, a configurable multiplier for both penalties might be
+interesting to add.
+
+The value for ReferenceBandwidth is hardcoded to 54 MBit.
+The values in the signal strength penalty table are hardcoded.
+It's desirable to have them configurable through the configuration file.
+
+Add configuration option to completely disable the use of NL80211 data, in
+case the plugin is merged with the existing ff_eth link quality plugin.
\ No newline at end of file
diff --git a/debian/.gitignore b/debian/.gitignore
deleted file mode 100644 (file)
index a650178..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/olsrd/
-/olsrd-plugins/
-/olsrd-plugins.debhelper.log
-/olsrd.debhelper.log
-/files
-/olsrd-plugins.substvars
-/olsrd.postinst.debhelper
-/olsrd.postrm.debhelper
-/olsrd.prerm.debhelper
-/olsrd.substvars
\ No newline at end of file
diff --git a/debian/README.Debian b/debian/README.Debian
deleted file mode 100644 (file)
index 93a8115..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-olsrd for Debian
-----------------
-
-
-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
-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
-default configuration is to not start olsrd on boot. It needs root privileges
-to run olsrd. 
-
-To debug olsrd you can start it with "/etc/init.d/olsrd start debug".
-
-You also need to configure your network interface. For example, for 
-freifunk.hamburg.net the following settings are used:
-
-       ifconfig eth1 $YOUR_IP broadcast 10.127.255.255
-       iwconfig eth1 essid hamburg.freifunk.net channel 10 mode ad-hoc enc off
-
-Options in the olsrd config file can also be overridden by command line
-options or in /etc/default/olsrd. See the manual pages olsrd(8) and 
-olsrd.conf(5) for details.
-
-If debug level is set to 0 olsrd will detach and run in the background (this 
-is the default in the debian package), if not it will keep running in your 
-shell.
-
-
-Plugins
--------
-
-The following plugins are included in the olsrd-plugins package and are 
-explained in detail in /usr/share/doc/olsrd-plugins:
-
-- httpinfo     - tiny webserver for information purposes 
-- dyn_gw       - dynamically announce uplinks
-- dot_draw     - generates output (over a TCP socket) in the dot format
-- secure       - secure OLSR routing with a shared key
-- nameservice  - announce hostnames and dns servers
-- bmf          - basic multicast forwarding plugin for olsrd
-- txtinfo
-
-The following plugins are not included in the olsrd-plugins binary package:
-
-- quagga       - quagga plugin
-- powerinfo    - displays /proc/apm on 127.0.0.1:8888
-- pgraph       - obsoleted by httpinfo and dot-draw
-- mini         - minimal example plugin, useful as a howto for writing plugins
-
-If you need them, you can easily build them from the debian source package 
-yourself: define which (additional) plugins you want in debian/rules, and 
-rebuild the package. And if you tell me a good reason why they should be 
-included in the binary package, I'll be glad to add them :)
-
-
-About this package
-------------------
-
-This is actually the unik-olsrd implementation, but because it's the only 
-commonly used one (the other two, nrl- and inria-olsrd are mostly used 
-where they were written) and the one found on www.olsr.org, so I decided to 
-call the package olsrd.
-
-The config file shipped in /etc/olsrd/olsrd.conf is based on the one from
-http://olsrexperiment.de/sven-ola/nylon/packages/olsrd/files/olsrd.conf-sven-ola 
-and has been successfully used in the freifunk networks in Berlin and Hamburg
-(Germany).
-
-The plugins are installed in /usr/lib/olsrd/ which differs from the upstream 
-default /usr/lib/.
-
-
- -- Holger Levsen <holger@debian.org>  Tue,  8 Jul 2008 18:09:15 +0200
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644 (file)
index 87ca478..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-olsrd (0.6.1-1) UNRELEASED; urgency=low
-
-  * New upstream version with quite some fixes and new features, see upstream
-    changelog for details. Quoting from there:
-     Change in version number system. No more -rcX for release candidates and
-     -rX for bugfix releases. In future bugfix releases or updates of plugins
-     will increase the third digit of the version string while feature 
-     releases will increase the first and/or the second one.
-   Removed the following patches from series trying to make it build again:
-   - 100-debug_level.patch
-   - 240-plugin-install-targets.patch
-   - 260-quagga-plugin-detect-protocol-version.patch
-   - 270-make-kfbsd.patch
-   
-  THIS IS WORK IN PROGRESS and needs checking whether those patches are still
-  needed. Also 0.6.1 is out.
-
-  * Update package description, OLSR is no experimental protocol anymore. 
-
- -- Holger Levsen <holger@debian.org>  Fri, 21 May 2010 23:47:52 +0200
-
-olsrd (0.5.6-r8-1) unstable; urgency=low
-
-  * New upstream version, the eighth maintenance release of 0.5.6, introducing
-    options to set the source and destination IP of the OLSR packets and a 
-    more flexible handling config handling as well as some bug fixes including
-    memory leaks.
-
- -- Holger Levsen <holger@debian.org>  Wed, 20 Jan 2010 01:13:43 +0000
-
-olsrd (0.5.6-r7-1) unstable; urgency=low
-
-  * New upstream version, the seventh maintenance release of 0.5.6, with some
-    improvements in the ETX-FFmetric and new stabilization patches for the 
-    route generation.
-
- -- Holger Levsen <holger@debian.org>  Wed, 11 Nov 2009 17:53:26 +0100
-
-olsrd (0.5.6-r6-3) unstable; urgency=low
-
-  * Brown paper bag release: add 270-make-kfbsd.patch to debian/patches/series
-    so it actually gets applied. (Closes: #544758)
-
- -- Holger Levsen <holger@debian.org>  Mon, 19 Oct 2009 11:31:38 +0200
-
-olsrd (0.5.6-r6-2) unstable; urgency=low
-
-  * Do not override the general setting in Makefile.kfbsd to "honor DESTDIR 
-    in make install". Thanks to Petr Salinger for the patch. (Closes: #544758)
-
- -- Holger Levsen <holger@debian.org>  Sat, 17 Oct 2009 13:00:41 +0000
-
-olsrd (0.5.6-r6-1) unstable; urgency=low
-
-  * New upstream version, the sixth maintenance release of 0.5.6, adding
-    support for Debian kfreebsd (Closes: #544758) and including fixes for
-    httpinfo, txtinfo and dotdraw plugin to prevent them blocking in case of
-    timed out outgoing connections. 
-    Drop 250-dot-draw-plugin-honor-accept-parameter.patch as it has been
-    included in the new upstream release.
-  * Fix incorrect runlevels and dependencies in init.d LSB header, thanks to
-    Petter Reinholdtsen for spotting the issues and providing the patch.
-    (Closes: #548607)
-  * Bump standards version to 3.8.3, no changes necessary.
-
- -- Holger Levsen <holger@debian.org>  Sat, 10 Oct 2009 14:55:37 +0200
-
-olsrd (0.5.6-r5-1) unstable; urgency=low
-
-  * New upstream version, the fifth maintenance release of 0.5.6.
-  * Add patch by Sebastian Harl to add a listen parameter to the dot_draw
-    plugin. (Closes: #532573) - Thanks, Sebastian! 
-  * Re-enable quagga plugin. Since olsrd is licenced under the 3 clause BSD 
-    licence and quagga is GPL-2 code, the resuling binary is GPL-2 licenced
-    too, and thats fine. (Closes: #532761)
-    Add patch by Florian Forster to determine quagga protocol version - thanks
-    Florian!
-  * Add descriptions of quagga, bmf and txtinfo plugins to package 
-    description. (Closes: #532765)
-  * Bump standards version to 3.8.2.
-  * Update years in debian/copyright.
-
- -- Holger Levsen <holger@debian.org>  Tue, 04 Aug 2009 12:10:35 +0000
-
-olsrd (0.5.6-r4-1) unstable; urgency=low
-
-  * New upstream version, the fourth maintenance release of 0.5.6.
-  * olsrd.init: 
-    - do not write the pidfile until olsrd has actually been started
-      (Closes: #519842) - thanks to Sebastian Reichel for the bug report!
-    - only start olsrd if it is not already running. 
-  * Bump standards-version to 3.8.1.
-
- -- Holger Levsen <holger@debian.org>  Sat, 30 May 2009 09:14:27 +0000
-
-olsrd (0.5.6-r3-1) unstable; urgency=low
-
-  * New upstream release, the third maintenance release of 0.5.6.
-  * Adopt debian/patches/200-etc-olsrd.patch to cope with the whitespace
-    changes in the new release.
-
- -- Holger Levsen <holger@debian.org>  Sat, 14 Mar 2009 18:31:55 +0100
-
-olsrd (0.5.6~rc7-1) unstable; urgency=low
-
-  * New upstream release candidate.
-  * Use a PID file. (Closes: #484128)
-  * Bump standards-version to 3.8.0, no changes needed.
-  * Install the plugins into /usr/lib/olsrd/, to get rid off all the lintian
-    overrides. Adapted README.Debian to reflect that.
-  * Compile the source without DESTDIR, just install it to DESTDIR.
-  * Modify the plugin targets in the upstream Makefile to provide distinct
-    $pluginname_install targets, otherwise DESTDIR shows up in rpath. 
-  * Drop debian/patches/210-txtinfo-Makefile.patch as it has been adapted by
-    upstream.
-
- -- Holger Levsen <holger@debian.org>  Sat, 12 Jul 2008 16:38:15 +0000
-
-olsrd (0.5.5-3) unstable; urgency=low
-
-  * No longer work around a bug in debhelper (#470913) in debian/rules,
-    which was introduced in 0.5.5-2 to fix #471627. Due to this, it's also not
-    necessary to manually uncompress and compress some manpages, as debhelper
-    now handles this as well.
-
- -- Holger Levsen <holger@debian.org>  Wed,  2 Apr 2008 13:06:27 +0200
-
-olsrd (0.5.5-2) unstable; urgency=low
-
-  * update debian/copyright to clarify that src/cfgparser/oparse.(c|h)
-    has a special exception which allows distributing it under other
-    conditions than the GPL in special cases
-  * fix handling of zipped manpages (Closes: #471627)
-  * remove the quagga plugin from the binary package, as it is GPL licenced
-    and cannot be distributed together with the BSD licenced olsrd 
-  * remove linda overwrites as linda is deprecated
-  * updated lintian overwrites
-
- -- Holger Levsen <holger@debian.org>  Mon, 31 Mar 2008 08:50:25 +0000
-
-olsrd (0.5.5-1) unstable; urgency=low
-
-  * new upstream version
-  * removed unused lintian overwrites
-  * upgraded to policy 3.7.3, no changes requiered
-  * made debian/copyright machine readable following
-    http://wiki.debian.org/Proposals/CopyrightFormat and converted it to utf8
-  * patch upstream Makefile to use /usr/lib on amd64
-    (Closes: #461604)
-
- -- Holger Levsen <holger@debian.org>  Sat, 09 Feb 2008 09:39:28 +0000
-
-olsrd (0.5.4-2) unstable; urgency=low
-
-  * clean up olsrd makefile, fix a very annoying dependency bug in the olsrd
-    build system (Closes: #452100) - taken from OpenWRT, thanks to Felix
-    Fietkau 
-
- -- Holger Levsen <holger@debian.org>  Tue, 20 Nov 2007 14:26:34 +0100
-
-olsrd (0.5.4-1) unstable; urgency=low
-
-  * new upstream version
-  * add Homepage and Vcs-* headers to debian/control
-  * olsrd.conf: small improvements as suggested by Jens Nachtigall - Thanks!
-
- -- Holger Levsen <holger@debian.org>  Fri, 16 Nov 2007 12:02:21 +0000
-
-olsrd (0.5.3-3) unstable; urgency=low
-
-  * Undefine STRIP when running make install and instead use dh_strip so that 
-    DEB_BUILD_OPTIONS=nostrip can be used (Closes: #437676) 
-
- -- Holger Levsen <holger@debian.org>  Sat, 18 Aug 2007 23:06:02 +0200
-
-olsrd (0.5.3-2) unstable; urgency=low
-
-  * improved olsrd.conf settings (Thanks elektra!) and made olsrd quiet on 
-    default
-
- -- Holger Levsen <holger@debian.org>  Sun, 12 Aug 2007 19:38:19 +0200
-
-olsrd (0.5.3-1) unstable; urgency=low
-
-  * new upstream version (Closes: #404899, #405331)
-  * include bmf, quagga and txtinfo plugins in binary package
-
- -- Holger Levsen <holger@debian.org>  Sun,  5 Aug 2007 01:49:19 +0200
-
-olsrd (0.5.2-1) unstable; urgency=low
-
-  * new upstream release (Closes: #426580)
-  * added build-dependency on bison and flex
-  * removed dependency on libpthread2 (Closes: #412752)
-  * maintainer address updated
-  * updated README.Debian
-  * cleaned up debian/patches/ (from openwrt) as they are included
-    upstream by now
-  * added debian/todo in source
-  * make init-script exit gracefully if stopping olsrd fails (Closes: #412936)
-
- -- Holger Levsen <holger@debian.org>  Wed,  1 Aug 2007 00:58:23 +0200
-
-olsrd (0.4.10-3) unstable; urgency=low
-
-  * improved Makefile clean target to allow rebuilds
-  * fixed and improved broken /etc/default/olsrd and /etc/init.d/olsrd
-  * improved README.Debian and olsrd.conf
-
- -- Holger Levsen <debian@layer-acht.org>  Wed, 20 Dec 2006 22:57:21 +0000
-
-olsrd (0.4.10-2) unstable; urgency=low
-
-  * fix debian/copyright (gui/linux-gtk is GPL licenced, not BSD like the rest)
-  * upgraded debian/compat debhelper source-depends version to 5 (as it's enough 
-    if 0.4.10-1 builds on sarge without changes)
-  * use ${binary:Version} format for olsrd-plugins depends on olsrd, for the
-    same reason
-
- -- Holger Levsen <debian@layer-acht.org>  Sun, 17 Dec 2006 18:51:00 +0000
-
-olsrd (0.4.10-1) unstable; urgency=low
-
-  * Initial release (Closes: #401307, #243527)
-
- -- Holger Levsen <debian@layer-acht.org>  Sat,  9 Dec 2006 17:04:26 +0000
-
diff --git a/debian/compat b/debian/compat
deleted file mode 100644 (file)
index 7ed6ff8..0000000
+++ /dev/null
@@ -1 +0,0 @@
-5
diff --git a/debian/control b/debian/control
deleted file mode 100644 (file)
index 287f860..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-Source: olsrd
-Section: net
-Priority: extra
-Maintainer: Holger Levsen <holger@debian.org>
-Build-Depends: debhelper (>= 5), quilt, bison, flex
-Standards-Version: 3.8.3
-Homepage: http://olsr.org/
-Vcs-Svn: svn://svn.debian.org/svn/collab-maint/deb-maint/olsrd/
-Vcs-Browser: http://svn.debian.org/wsvn/collab-maint/deb-maint/olsrd/
-
-Package: olsrd
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
-Description: optimized link-state routing daemon (unik-olsrd)
- unik-olsrd is an implementation of the Optimized Link State Routing protocol 
- for Mobile Ad-Hoc networks(MANET). The protocol is described in RFC3626. It 
- is designed to be run as a standalone server process.
- .
- OLSR operates as a table driven, proactive protocol, i.e., it exchanges 
- topology information with other nodes of the network regularly. It is 
- developed to work independently from other protocols. Likewise, OLSR makes no
- assumptions about the underlying link-layer.
-
-Package: olsrd-plugins
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, olsrd (= ${binary:Version})
-Description: various plugins to enhance olsrd
- olsrd is an implementation of the Optimized Link State Routing protocol
- for Mobile Ad-Hoc networks(MANET)
- .
- The following plugins are available:
- .
-  * httpinfo      - tiny webserver for information purposes 
-  * dyn_gw        - dynamically announce uplinks
-  * dot_draw      - generates output (over a TCP socket) in the dot format
-  * secure        - secure OLSR routing with a shared key
-  * nameservice   - announce hostnames and dns servers
-  * bmf           - basic multicast forwarding
-  * quagga        - import external routes from quagga
-  * txtinfo       - display information about the OSLR node
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644 (file)
index 4fb358c..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-This package was downloaded from http://www.olsr.org/releases/
-
-Files: debian/*
-Copyright: © 2006-2009 Holger Levsen <holger@debian.org>
-Licence: GPL-2+
- The Debian packaging is free software; you can redistribute it and/or 
- modify it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your option)
- any later version.
- On Debian systems, the full text of the GPL-2+ is available at
- /usr/share/common-licenses/GPL-2
-
-Files: *
-Copyright: © 2003-2005 Andreas Tønnesen <andreto@olsr.org>, 2004 Thomas Lopatic 
- <thomas@lopatic.de>, 2006, 2007 Sven-Ola <sven-ola-aet-gmx.de>, 2005, Bruno Randolf <bruno.randolf@4g-systems.biz>, 2007 Bernd Petrovitsch <bernd@firmix.at> and 
- 2006 Jens Nachtigall <nachtigall@web.de>
-Licence: BSD-3
- | All rights reserved.
- |
- | Redistribution and use in source and binary forms, with or without 
- | modification, are permitted provided that the following conditions 
- | are met:
- |
- | * Redistributions of source code must retain the above copyright 
- |   notice, this list of conditions and the following disclaimer.
- | * Redistributions in binary form must reproduce the above copyright 
- |   notice, this list of conditions and the following disclaimer in 
- |   the documentation and/or other materials provided with the 
- |   distribution.
- | * Neither the name of olsr.org, olsrd nor the names of its 
- |   contributors may be used to endorse or promote products derived 
- |   from this software without specific prior written permission.
- |
- | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
- | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
- | COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
- | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
- | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
- | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
- | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- | POSSIBILITY OF SUCH DAMAGE.
-
-Files: gui/linux-gtk/*
-Copyright: © 2003 Andreas Tønnesen (andreto@ifi.uio.no)
-Licence: GPL-2+
- olsrd/gui/linux-gtk is free software; you can redistribute it and/or 
- modify it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your option)
- any later version.
- On Debian systems, the full text of the GPL-2+ is available at
- /usr/share/common-licenses/GPL-2
-
-Files: lib/bmf*
-Copyright: © 2005 - 2007, Thales Communications, Huizen, The Netherlands.
- Written by Erik Tromp.
-Licence: BSD-3
- | All rights reserved.
- |
- | Redistribution and use in source and binary forms, with or without 
- | modification, are permitted provided that the following conditions 
- | are met:
- | 
- | * Redistributions of source code must retain the above copyright 
- |   notice, this list of conditions and the following disclaimer.
- | * Redistributions in binary form must reproduce the above copyright 
- |   notice, this list of conditions and the following disclaimer in 
- |   the documentation and/or other materials provided with the 
- |   distribution.
- | * Neither the name of Thales, BMF nor the names of its 
- |   contributors may be used to endorse or promote products derived 
- |   from this software without specific prior written permission.
- |
- | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
- | IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
- | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
- | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
- | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
- | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
- | OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Files: src/cfgparser/oparse.c src/cfgparser/oparse.h
-Copyright: © 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
-Licence: GPL-2+
- | src/cfgparser/oparse.(c|h) is free software; you can redistribute it and/or 
- | modify it under the terms of the GNU General Public License as published
- | by the Free Software Foundation; either version 2, or (at your option)
- | any later version.
- | On Debian systems, the full text of the GPL-2+ is available at
- | /usr/share/common-licenses/GPL-2
- |
- | As a special exception, you may create a larger work that contains
- |  part or all of the Bison parser skeleton and distribute that work
- |  under terms of your choice, so long as that work isn't itself a
- |  parser generator using the skeleton or a modified version thereof
- |  as a parser skeleton.  Alternatively, if you modify or redistribute
- |  the parser skeleton itself, you may (at your option) remove this
- |  special exception, which will cause the skeleton and the resulting
- |  Bison output files to be licensed under the GNU General Public
- |  License without this special exception.
- |
- | This special exception was added by the Free Software Foundation in
- | version 2.2 of Bison.  
-
-Files: lib/quagga/src/quagga.h lib/quagga/src/olsrd_plugin.c lib/quagga.c
-Copyright: © 2006 Immo 'FaUl' Wehrenberg <immo@chaostreff-dortmund.de>
-Licence: GPL-2+
- lib/quagga/src/quagga.h is free software; you can redistribute it and/or 
- modify it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your option)
- any later version.
- On Debian systems, the full text of the GPL is available at
- /usr/share/common-licenses/GPL-2
-
-Files: lib/quagga/src/quagga/zebra.h
-Copyright: © 1997, 1998, 1999, 2000, 2001, 2002 Kunihiro Ishiguro 
-Licence: GPL-2+
- lib/quagga/zebra.h is free software; you can redistribute it and/or 
- modify it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your option)
- any later version.
- On Debian systems, the full text of the GPL-2+ is available at
- /usr/share/common-licenses/GPL-2
-
-Files: lib/secure/src/md5.(c|h)
-Copyright: © 1991, 1992 RSA Data Security, Inc. Created 1991. 
-Licence: other
- | All rights reserved.
- | License to copy and use this software is granted provided that it
- |  is identified as the "RSA Data Security, Inc. MD5 Message-Digest
- |  Algorithm" in all material mentioning or referencing this software
- |  or this function.
- |
- |  License is also granted to make and use derivative works provided
- |  that such works are identified as "derived from the RSA Data
- |  Security, Inc. MD5 Message-Digest Algorithm" in all material
- |  mentioning or referencing the derived work.  
- |                                                                   
- |  RSA Data Security, Inc. makes no representations concerning either
- |  the merchantability of this software or the suitability of this
- |  software for any particular purpose. It is provided "as is"
- |  without express or implied warranty of any kind.  
- |                                                                   
- |  These notices must be retained in any copies of any part of this
- |  documentation and/or software.  
-
diff --git a/debian/olsrd-default b/debian/olsrd-default
deleted file mode 100644 (file)
index 00dac53..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-# Defaults for olsrd initscript
-# sourced by /etc/init.d/olsrd
-# installed at /etc/default/olsrd by the maintainer scripts
-
-#
-# This is a POSIX shell fragment
-#
-
-#
-# uncomment the next line run olsrd automatically at startup
-#
-#START_OLSRD="YES"
-
-#
-# debuglevel from 1 (=quiet) to 9 (=max debug)
-# for running from init.d 0 is recommended
-#
-DEBUGLEVEL=0
-
-#
-# "command-line options"
-#
-DAEMON_OPTS="-f /etc/olsrd/olsrd.conf -d $DEBUGLEVEL"
-
diff --git a/debian/olsrd-plugins.dirs b/debian/olsrd-plugins.dirs
deleted file mode 100644 (file)
index 51b9280..0000000
+++ /dev/null
@@ -1 +0,0 @@
-usr/lib/olsrd
diff --git a/debian/olsrd-plugins.docs b/debian/olsrd-plugins.docs
deleted file mode 100644 (file)
index 16e45f8..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-lib/dyn_gw/README_DYN_GW
-lib/httpinfo/README_HTTPINFO
-lib/dot_draw/README_DOT_DRAW
-lib/nameservice/README_NAMESERVICE
-lib/secure/README_SECURE
-lib/bmf/README_BMF
-lib/quagga/README_QUAGGA
-lib/txtinfo/README_TXTINFO 
diff --git a/debian/olsrd.conf b/debian/olsrd.conf
deleted file mode 100644 (file)
index 31775b5..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# olsr.org OLSR daemon config file
-#
-# Lines starting with a # are discarded
-#
-# This file was shipped with the debian olsrd package
-#
-
-# Interfaces and their rules
-# Omitted options will be set to the
-# default values. Multiple interfaces
-# can be specified in the same block
-# and multiple blocks can be set.
-
-#Interface "eth1" "eth0" "wlan0" "wlan1" "ath0" "ath1"
-Interface "eth1" 
-{
-}
diff --git a/debian/olsrd.dirs b/debian/olsrd.dirs
deleted file mode 100644 (file)
index 34a2cc6..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-usr/sbin
-etc/default/
-etc/olsrd
diff --git a/debian/olsrd.docs b/debian/olsrd.docs
deleted file mode 100644 (file)
index 19331e7..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-README-Olsr-Extensions
-
diff --git a/debian/olsrd.init b/debian/olsrd.init
deleted file mode 100644 (file)
index 2168853..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-#! /bin/sh
-### BEGIN INIT INFO
-# Provides:          olsrd
-# Required-Start:    $network $remote_fs $syslog
-# Required-Stop:     $network $remote_fs $syslog
-# Default-Start:     2 3 4 5
-# Default-Stop:      0 1 6
-# Short-Description: /etc/init.d/olsrd: start olsrd
-### END INIT INFO
-
-#              Based on skeleton script written by Miquel van Smoorenburg <miquels@cistron.nl>.
-#              Modified for Debian 
-#              by Ian Murdock <imurdock@gnu.ai.mit.edu>.
-#              Modified for olsrd
-#              by Holger Levsen <debian@layer-acht.org>
-# 
-# Version:     21-Dec-2006  
-# modified:     01-Aug-2007
-#              31-Jun-2008
-#              30-May-2009
-
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
-DAEMON=/usr/sbin/olsrd
-NAME=olsrd
-DESC=olsrd
-
-PID_FILE=/var/run/$NAME.pid
-
-test -x $DAEMON || exit 0
-
-# Include olsrd defaults if available
-if [ -f /etc/default/olsrd ] ; then
-       . /etc/default/olsrd
-fi
-
-set -e
-
-case "$1" in
-  debug)
-       echo -n "Starting $DESC: "
-       start-stop-daemon --start --quiet --exec $DAEMON --pidfile $PID_FILE -- $DAEMON_OPTS &
-       # sleep til olsrd has been started
-       while ! pidof $NAME > /dev/null ; do 
-         sleep 1
-       done
-       echo "$NAME."
-       echo $(pidof $NAME) > $PID_FILE
-       ;;
-  start)
-       if [ "$START_OLSRD" != "YES" ] ; then exit 0 ; fi
-       if [ $(pidof $NAME) -eq 0 ] ; then 
-               echo "$NAME already running, doing nothing."
-               exit 0
-       fi
-       echo -n "Starting $DESC: "
-       start-stop-daemon --start --quiet --exec $DAEMON --pidfile $PID_FILE -- $DAEMON_OPTS &
-       # sleep til olsrd has been started
-       while ! pidof $NAME > /dev/null ; do 
-         sleep 1
-       done
-       echo "$NAME."        
-       echo $(pidof $NAME) > $PID_FILE
-       ;;
-  stop)
-       pidof $NAME || exit 0
-       echo -n "Stopping $DESC: "
-       start-stop-daemon --stop  --quiet --exec $DAEMON --pidfile $PID_FILE
-        rm -f $PID_FILE
-       echo "$NAME."
-       ;;
-  restart|force-reload)
-       echo -n "Restarting $DESC: "
-       $0 stop
-       sleep 1
-       $0 start
-       ;;
-  *)
-       N=/etc/init.d/$NAME
-       echo "Usage: $N {start|stop|restart}" >&2
-       exit 1
-       ;;
-esac
-
-exit 0
diff --git a/debian/olsrd.postinst b/debian/olsrd.postinst
deleted file mode 100644 (file)
index 1ecae81..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-set -e
-
-# Recover from incorrect init.d script headers in version 0.5.6-r5-1 and earlier
-if [ "$1" = "configure" ] && dpkg --compare-versions "$2" le "0.5.6-r5-1" \
-   && [ -f /etc/rcS.d/S[0-9][0-9]olsrd ] \
-   && ! [ -f /etc/rc2.d/S[0-9][0-9]olsrd ] ; then
-    update-rc.d -f olsrd remove
-fi
-
-#DEBHELPER#
diff --git a/debian/rules b/debian/rules
deleted file mode 100644 (file)
index b5100b8..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/make -f
-# Holger Levsen, 2006-12, based on 
-# -*- makefile -*-
-# Sample debian/rules that uses debhelper.
-# This file was originally written by Joey Hess and Craig Small.
-# As a special exception, when this file is copied by dh-make into a
-# dh-make output file, you may use that output file without restriction.
-# This special exception was added by Craig Small in version 0.37 of dh-make.
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-# plugins to be build (not build per default are: powerinfo pgraph mini quagga)
-#      (fixme?: if you add them here, they are build but their README is not 
-#      copied to /usr/share/doc/olsrd-plugins/)
-#
-# you dont need to edit this file. export PLUGIS=foo ; fakeroot ./debian/rules binary
-# is enough for a rebuild :)
-PLUGINS ?= dyn_gw httpinfo dot_draw nameservice secure txtinfo bmf quagga
-#hack: - also needs debian/patches/240-plugin-install-targets.patch - this has been reported to upstream...
-PLUGINS_INSTALL ?= dyn_gw_install httpinfo_install dot_draw_install nameservice_install secure_install txtinfo_install bmf_install quagga_install
-
-CFLAGS = -Wall -g
-
-ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
-       CFLAGS += -O0
-else
-       CFLAGS += -O2
-endif
-
-configure: configure-stamp
-configure-stamp:
-       dh_testdir
-       # Add here commands to configure the package.
-       QUILT_PATCHES=debian/patches quilt push -a || test $$? = 2
-       
-       touch configure-stamp
-
-build: build-stamp
-
-build-stamp: configure-stamp 
-       dh_testdir
-
-       # Add here commands to compile the package.
-       $(MAKE)
-       $(MAKE) $(PLUGINS)
-
-       touch $@
-
-clean:
-       dh_testdir
-       dh_testroot
-       rm -f build-stamp configure-stamp
-
-       # Add here commands to clean up after the build process.
-       -$(MAKE) clean_all
-       rm -f $(CURDIR)/lib/*/src/*.o $(CURDIR)/lib/*/*.so.?.?
-       QUILT_PATCHES=debian/patches quilt pop -a -R || test $$? = 2
-
-       dh_clean 
-
-install: build
-       dh_testdir
-       dh_testroot
-       dh_clean -k 
-       dh_installdirs
-
-       # Add here commands to install the package into debian/olsrd.
-       $(MAKE) DESTDIR=$(CURDIR)/debian/olsrd install STRIP=: 
-       $(MAKE) DESTDIR=$(CURDIR)/debian/olsrd-plugins LIBDIR=$(CURDIR)/debian/olsrd-plugins/usr/lib/olsrd $(PLUGINS_INSTALL) STRIP=:
-
-# Build architecture-independent files here.
-binary-indep: build install
-# We have nothing to do by default.
-
-# Build architecture-dependent files here.
-binary-arch: build install
-       dh_testdir
-       dh_testroot
-       dh_installchangelogs -polsrd CHANGELOG -polsrd-plugins
-       dh_installdocs
-       dh_installinit
-       dh_installman
-       dh_link
-       dh_strip
-       # compress, but don't compress README_NAMESERVICE, for consistency reasons
-       dh_compress -XREADME_NAMESERVICE -XREADME_BMF
-       # provide better default config
-       rm $(CURDIR)/debian/olsrd/etc/olsrd.conf
-       cp $(CURDIR)/debian/olsrd.conf $(CURDIR)/debian/olsrd/etc/olsrd/olsrd.conf
-       cp  $(CURDIR)/debian/olsrd-default $(CURDIR)/debian/olsrd/etc/default/olsrd
-       dh_fixperms
-       dh_installdeb
-       dh_shlibdeps
-       dh_gencontrol
-       dh_md5sums
-       dh_builddeb
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/debian/todo b/debian/todo
deleted file mode 100644 (file)
index 4d2f2a4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-- remove debian/patches/240-plugin-install-targets.patch
index 91fe05c..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.2 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 3df92d6..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.2"
+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..6bee0e4 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 */
@@ -1113,8 +1124,8 @@ build_all_body(struct autobuf *abuf)
  * @param fieldName use a name from nmeaINFO_FIELD
  * @return a boolean, true when the structure has the requested field
  */
-static inline bool nmea_INFO_has_field_local(uint32_t present, nmeaINFO_FIELD fieldName) {
-       return ((present & fieldName) != 0);
+static inline bool nmea_INFO_is_present_local(uint32_t present, nmeaINFO_FIELD fieldName) {
+  return ((present & fieldName) != 0);
 }
 
 static const char * NA_STRING = "N.A.";
@@ -1156,8 +1167,8 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* utc */
        abuf_puts(abuf, "<tr><td>Date / Time</td><td></td><td>UTC</td><td></td><td id=\"utc\">");
-       datePresent = nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, UTCDATE);
-       timePresent = nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, UTCTIME);
+       datePresent = nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, UTCDATE);
+       timePresent = nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, UTCTIME);
        if (datePresent || timePresent) {
                if (datePresent) {
                        abuf_appendf(abuf, "%04d%02d%02d",
@@ -1180,9 +1191,76 @@ static void build_pud_body(struct autobuf *abuf) {
        }
        abuf_puts(abuf, "</td></tr>\n");
 
+       /* present */
+       abuf_puts(abuf, "<tr><td>Input Fields</td><td></td><td></td><td></td><td id=\"present\">");
+       if (txGpsInfo->txPosition.nmeaInfo.present != 0) {
+    const int id[] = {
+        SMASK,
+        UTCDATE,
+        UTCTIME,
+        SIG,
+        FIX,
+        PDOP,
+        HDOP,
+        VDOP,
+        LAT,
+        LON,
+        ELV,
+        SPEED,
+        TRACK,
+        MTRACK,
+        MAGVAR,
+        SATINUSECOUNT,
+        SATINUSE,
+        SATINVIEW,
+        0 };
+               const char * ids[] = {
+        "SMASK",
+        "UTCDATE",
+        "UTCTIME",
+        "SIG",
+        "FIX",
+        "PDOP",
+        "HDOP",
+        "VDOP",
+        "LAT",
+        "LON",
+        "ELV",
+        "SPEED",
+        "TRACK",
+        "MTRACK",
+        "MAGVAR",
+        "SATINUSECOUNT",
+        "SATINUSE",
+        "SATINVIEW" };
+               bool printed = false;
+               int i = 0;
+               int count = 0;
+
+               while (id[i] != 0) {
+                       if (txGpsInfo->txPosition.nmeaInfo.present & id[i]) {
+                               if (printed) {
+                                 if (count >= 8) {
+                                   abuf_puts(abuf, "<br/>");
+                                   count = 0;
+                                 } else {
+                                   abuf_puts(abuf, "&nbsp;");
+                                 }
+                               }
+                               abuf_puts(abuf, ids[i]);
+                               count++;
+                               printed = true;
+                       }
+                       i++;
+               }
+       } else {
+               abuf_puts(abuf, NA_STRING);
+       }
+       abuf_puts(abuf, "</td></tr>\n");
+
        /* smask */
        abuf_puts(abuf, "<tr><td>Input Sentences</td><td></td><td></td><td></td><td id=\"smask\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, SMASK)
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, SMASK)
                        && (txGpsInfo->txPosition.nmeaInfo.smask != GPNON)) {
                const int id[] = { GPGGA, GPGSA, GPGSV, GPRMC, GPVTG, GPNON };
                const char * ids[] = { "GPGGA", "GPGSA", "GPGSV", "GPRMC", "GPVTG" };
@@ -1205,7 +1283,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* sig */
        abuf_puts(abuf, "<tr><td>Signal Strength</td><td></td><td></td><td></td><td id=\"sig\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, SIG)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, SIG)) {
                const char * s;
                switch (txGpsInfo->txPosition.nmeaInfo.sig) {
                        case NMEA_SIG_BAD:
@@ -1247,7 +1325,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* fix */
        abuf_puts(abuf, "<tr><td>Fix</td><td></td><td></td><td></td><td id=\"fix\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, FIX)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, FIX)) {
                const char * s;
                switch (txGpsInfo->txPosition.nmeaInfo.fix) {
                        case NMEA_FIX_BAD:
@@ -1271,7 +1349,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* PDOP */
        abuf_puts(abuf, "<tr><td>PDOP</td><td></td><td></td><td></td><td id=\"pdop\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, PDOP)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, PDOP)) {
                abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.PDOP);
        } else {
                abuf_puts(abuf, NA_STRING);
@@ -1280,7 +1358,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* HDOP */
        abuf_puts(abuf, "<tr><td>HDOP</td><td></td><td></td><td></td><td id=\"hdop\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, HDOP)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, HDOP)) {
                abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.HDOP);
        } else {
                abuf_puts(abuf, NA_STRING);
@@ -1289,7 +1367,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* VDOP */
        abuf_puts(abuf, "<tr><td>VDOP</td><td></td><td></td><td></td><td id=\"vdop\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, VDOP)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, VDOP)) {
                abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.VDOP);
        } else {
                abuf_puts(abuf, NA_STRING);
@@ -1298,7 +1376,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* lat */
        abuf_puts(abuf, "<tr><td>Latitude</td><td></td><td>degrees</td><td></td><td id=\"lat\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, LAT)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, LAT)) {
                abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.lat);
        } else {
                abuf_puts(abuf, NA_STRING);
@@ -1307,7 +1385,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* lon */
        abuf_puts(abuf, "<tr><td>Longitude</td><td></td><td>degrees</td><td></td><td id=\"lon\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, LON)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, LON)) {
                abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.lon);
        } else {
                abuf_puts(abuf, NA_STRING);
@@ -1316,7 +1394,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* elv */
        abuf_puts(abuf, "<tr><td>Elevation</td><td></td><td>m</td><td></td><td id=\"elv\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, ELV)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, ELV)) {
                abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.elv);
        } else {
                abuf_puts(abuf, NA_STRING);
@@ -1325,7 +1403,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* speed */
        abuf_puts(abuf, "<tr><td>Speed</td><td></td><td>kph</td><td></td><td id=\"speed\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, SPEED)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, SPEED)) {
                abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.speed);
        } else {
                abuf_puts(abuf, NA_STRING);
@@ -1334,7 +1412,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* track */
        abuf_puts(abuf, "<tr><td>Track</td><td></td><td>degrees</td><td></td><td id=\"track\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, TRACK)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, TRACK)) {
                abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.track);
        } else {
                abuf_puts(abuf, NA_STRING);
@@ -1343,7 +1421,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* mtrack */
        abuf_puts(abuf, "<tr><td>Magnetic Track</td><td></td><td>degrees</td><td></td><td id=\"mtrack\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, MTRACK)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, MTRACK)) {
                abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.mtrack);
        } else {
                abuf_puts(abuf, NA_STRING);
@@ -1352,7 +1430,7 @@ static void build_pud_body(struct autobuf *abuf) {
 
        /* magvar */
        abuf_puts(abuf, "<tr><td>Magnetic Variation</td><td></td><td>degrees</td><td></td><td id=\"magvar\">");
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, MAGVAR)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, MAGVAR)) {
                abuf_appendf(abuf, "%f", txGpsInfo->txPosition.nmeaInfo.magvar);
        } else {
                abuf_puts(abuf, NA_STRING);
@@ -1363,7 +1441,7 @@ static void build_pud_body(struct autobuf *abuf) {
        abuf_puts(abuf, "</table></p>\n");
 
        /* sats */
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, SATINVIEW)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, SATINVIEW)) {
                int cnt = 0;
 
                abuf_puts(abuf, "<p>\n");
@@ -1381,7 +1459,7 @@ static void build_pud_body(struct autobuf *abuf) {
                                        bool inuse = false;
                                        const char * inuseStr;
 
-                                       if (!nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, SATINUSE)) {
+                                       if (!nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, SATINUSE)) {
                                                inuseStr = NA_STRING;
                                        } else {
                                                int inuseIndex;
@@ -1414,8 +1492,8 @@ static void build_pud_body(struct autobuf *abuf) {
        }
 
        /* add Google Maps and OpenStreetMap links when we have both lat and lon */
-       if (nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, LAT)
-                       && nmea_INFO_has_field_local(txGpsInfo->txPosition.nmeaInfo.present, LON)) {
+       if (nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, LAT)
+                       && nmea_INFO_is_present_local(txGpsInfo->txPosition.nmeaInfo.present, LON)) {
                const char * c = nodeId;
 
                abuf_appendf(abuf,
@@ -1446,6 +1524,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..a91b921 100644 (file)
@@ -66,8 +66,8 @@ PlParam "interval" "SEC"
        (default: 120 - 2 minutes)
 
 PlParam "timeout" "SEC"
-       validity time for received NAME messages in seconds.
-       (default: 3600 - 1 hour)
+       validity time for transmitted NAME messages in seconds.
+       (default: 1800 - 30 minutes)
 
 PlParam "lat" "12.123"
        Float: Decimal latitude for this node to be flooded in the mesh
@@ -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 e3ec4ab..98d310e 100644 (file)
@@ -54,7 +54,7 @@ void nmea_time_now(nmeaTIME *utc, uint32_t * present) {
        utc->sec = tt.tm_sec;
        utc->hsec = (tp.tv_usec / 10000);
        if (present) {
-               *present |= (UTCDATE | UTCTIME);
+         nmea_INFO_set_present(present, UTCDATE | UTCTIME);
        }
 }
 
index 9f33b44..0a6db30 100644 (file)
@@ -1,46 +1,53 @@
 LoadPlugin "<olsrd plugin library path>/olsrd_pud.so.1.1.0"
 {
-    # nodeIdType is used to indicate the type of the nodeId field and is a
-    #            number in the range 0-255, with the following meaning:
-    #
-    #        0 : MAC address of sending interface
-    #            (nodeId is not relevant)
-    #        1 : an MSISDN number with 15 digits
-    #        2 : a Tetra number with 17 digits
-    #        3 : a DNS name
-    #        4 : IPv4 address (OLSR main address) of the sending node
-    #            (nodeId is not relevant)
-    #        6 : IPv6 address (OLSR main address) of the sending node
-    #            (nodeId is not relevant)
-    #        7 : an AIS MMSI number with 9 digits
-    #        8 : a URN number with 8 digits
-    #      192 : a 7 digit number conforming to 'Nationaal Nummerplan
-    #            Brandweer Nederland'
-    #      193 : a 6 digit number conforming to 'Nationaal Nummerplan
-    #            Ambulancezorg Nederland'
-    #      194 : a 4 digit number in the range [1, 8191]
-    #
-    #      other numbers are reserved 
-    #
-    # Note: setting 4 or 6 is the same for olsrd: both mean 'use the main
-    #       IP address, which is either an IPv4 or an IPv6 address, depending
-    #       on the IP version under which olsrd is run.
-    #
-    # Default: 4 or 6, depending on the IP version olsrd is using
-    #
-    #PlParam     "nodeIdType"                   "4"
-
-    # nodeId is the node identification with the meaning as indicated by the
-    #        nodeIdType parameter. When not set AND the nodeIdType is 3 (DNS
-    #        name) then the hostname is used.
-    #
-    # Note: Both the nodeIdType and nodeId fields are transported over
-    #       OLSR, so care must be taken to keep the size of the nodeId
-    #       parameter down.
-    #
-    # Default: none
-    #
-    #PlParam     "nodeId"                       ""
+    # nodeId contains the node identification. It first describes the semantics
+    #        (meaning/code) of the identification and then specifies the node
+    #        identification itself.
+    #        For some codes the identification itself is not relevant and
+    #        therefore ignored (specified if so).
+    #
+    #        The format is "number,identification"
+    #
+    #        "Number" is a number in the range 0-255, with the following
+    #        meaning:
+    #           0 : MAC address of sending interface
+    #               (identification is not relevant)
+    #           1 : an MSISDN number with 15 digits
+    #           2 : a Tetra number with 17 digits
+    #           3 : a DNS name
+    #               (identification can be empty, in which case the hostname is
+    #                used)
+    #           4 : IPv4 address (OLSR main address) of the sending node
+    #               (identification is not relevant)
+    #           5 : an UUID number with 32 hexadecimal digits
+    #           6 : IPv6 address (OLSR main address) of the sending node
+    #               (identification is not relevant)
+    #           7 : an AIS MMSI number with 9 digits
+    #           8 : a URN number (a plain 24 bits number) with 8 digits. See
+    #               http://www.dtic.mil/cjcs_directives/cdata/unlimit/3156_01.pdf
+    #           9 : a MIP OID number with 20 digits. See
+    #               http://www.mip-site.org/publicsite (IR Annex D – DMWG,
+    #               20081211, Edition 3.7, Annex D Key Management for the MIP
+    #               Data Model, (MIR Annex D - Key Management-JC3IEDM-3.0.9.pdf)
+    #         192 : a 7 digit number conforming to 'Nationaal Nummerplan
+    #               Brandweer Nederland'
+    #         193 : a 6 digit number conforming to 'Nationaal Nummerplan
+    #               Ambulancezorg Nederland'
+    #         194 : a 4 digit number in the range [1, 8191]
+    #
+    #         other numbers are reserved
+    #
+    # Note: setting "number" to 4 or 6 is the same for olsrd: both mean 'use
+    #       the main IP address, which is either an IPv4 or an IPv6 address,
+    #       depending on the IP version under which olsrd is run.
+    #
+    # Note: Both the number and the identification are transported over OLSR,
+    #       so care must be taken to keep the size of the identification down.
+    #
+    # Default: "4" (when olsrd is run under IPv4)
+    #          "6" (when olsrd is run under IPv6)
+    #
+    #PlParam     "nodeId"                       "4"
 
 
     #
index 4a957d8..2b7aced 100644 (file)
@@ -175,25 +175,28 @@ bool readUS(const char * parameterName, const char * str, unsigned short * dst)
  @param dst
  A pointer to the location where to store the number upon successful conversion
  Not touched when errors are reported.
+ @param base
+ The base of the number conversion: 10 for decimal, 16 for hexadecimal
 
  @return
  - true on success
  - false otherwise
  */
-bool readULL(const char * parameterName, const char * str, unsigned long long * dst) {
+bool readULL(const char * parameterName, const char * str, unsigned long long * dst, int base) {
        char * endPtr = NULL;
        unsigned long long value;
 
        assert(parameterName != NULL);
        assert(str != NULL);
        assert(dst != NULL);
+       assert(base > 1);
 
        errno = 0;
-       value = strtoull(str, &endPtr, 10);
+       value = strtoull(str, &endPtr, base);
 
        if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
                /* invalid conversion */
-               pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str);
+               pudError(false, "Value of parameter %s (%s) could not be converted to a number (base %d)", parameterName, str, base);
                return false;
        }
 
index 2e71e30..32dd1ce 100644 (file)
@@ -15,7 +15,7 @@ bool readUC(const char * parameterName, const char * str, unsigned char * dst);
 
 bool readUS(const char * parameterName, const char * str, unsigned short * dst);
 
-bool readULL(const char * parameterName, const char * str, unsigned long long * dst);
+bool readULL(const char * parameterName, const char * str, unsigned long long * dst, int base);
 
 bool readDouble(const char * parameterName, const char * str, double * dst);
 
index e73d80a..8b38f41 100644 (file)
@@ -9,6 +9,7 @@
 
 /* OLSR includes */
 #include <olsr_protocol.h>
+#include <olsr.h>
 
 /* System includes */
 #include <unistd.h>
@@ -16,6 +17,9 @@
 #include <OlsrdPudWireFormat/nodeIdConversion.h>
 #include <limits.h>
 
+/* forward declarations */
+static bool setupNodeIdBinaryAndValidate(NodeIdType nodeIdTypeNumber);
+
 /*
  * Note:
  * Setters must return true when an error is detected, false otherwise
@@ -36,17 +40,15 @@ NodeIdType getNodeIdTypeNumber(void) {
        return nodeIdType;
 }
 
-int setNodeIdType(const char *value, void *data __attribute__ ((unused)),
-               set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       static const char * valueName = PUD_NODE_ID_TYPE_NAME;
+static int setNodeIdType(const char *value, const char * valueName) {
        unsigned long long nodeIdTypeNew;
 
-       if (!readULL(valueName, value, &nodeIdTypeNew)) {
+       if (!readULL(valueName, value, &nodeIdTypeNew, 10)) {
                return true;
        }
 
        if (!isValidNodeIdType(nodeIdTypeNew)) {
-               pudError(false, "Value of parameter %s (%llu) is reserved", valueName,
+               pudError(false, "Value in parameter %s (%llu) is reserved", valueName,
                                nodeIdTypeNew);
                return true;
        }
@@ -73,14 +75,6 @@ static bool nodeIdSet = false;
 static nodeIdBinaryType nodeIdBinary;
 
 /**
- @return
- The node ID
- */
-unsigned char * getNodeId(void) {
-       return getNodeIdWithLength(NULL);
-}
-
-/**
  Get the nodeId and its length
 
  @param length
@@ -90,7 +84,7 @@ unsigned char * getNodeId(void) {
  @return
  The node ID
  */
-unsigned char * getNodeIdWithLength(size_t *length) {
+unsigned char * getNodeId(size_t *length) {
        if (!nodeIdSet) {
                setNodeId("", NULL, (set_plugin_parameter_addon) {.pc = NULL});
        }
@@ -118,23 +112,79 @@ nodeIdBinaryType * getNodeIdBinary(void) {
 
 int setNodeId(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) {
        size_t valueLength;
+       char * number;
+       char * identification;
 
        assert (value != NULL);
 
-       valueLength = strlen(value);
-       if (valueLength > (PUD_TX_NODEID_BUFFERSIZE - 1)) {
-               pudError(false, "Value of parameter %s is too long, maximum length is"
-                       " %u, current length is %lu", PUD_NODE_ID_NAME, (PUD_TX_NODEID_BUFFERSIZE - 1),
-                               (unsigned long) valueLength);
-               return true;
-       }
+  nodeId[0] = '\0';
+  nodeIdLength = 0;
+  nodeIdSet = false;
+  nodeIdBinary.set = false;
 
-       strcpy((char *) &nodeId[0], value);
-       nodeIdLength = valueLength;
-       nodeIdSet = true;
-       nodeIdBinary.set = false;
-
-       return false;
+       valueLength = strlen(value);
+  number = olsr_malloc(valueLength + 1, "setNodeId");
+  strcpy(number, value);
+
+  /* split "number,identification" */
+  identification = strchr(number, ',');
+  if (identification) {
+    *identification = '\0';
+    identification++;
+  }
+
+  /* parse number into nodeIdType (if present) */
+  valueLength = strlen(number);
+  if (valueLength && setNodeIdType(number, PUD_NODE_ID_NAME)) {
+    free(number);
+    return true;
+  }
+
+  /* copy identification into nodeId (if present) */
+  if (identification) {
+    valueLength = strlen(identification);
+    if (valueLength > (PUD_TX_NODEID_BUFFERSIZE - 1)) {
+      pudError(false, "Value in parameter %s is too long, maximum length is"
+        " %u, current length is %lu", PUD_NODE_ID_NAME, (PUD_TX_NODEID_BUFFERSIZE - 1),
+          (unsigned long) valueLength);
+      free(number);
+      return true;
+    }
+
+    if (valueLength) {
+      strcpy((char *) &nodeId[0], identification);
+      nodeIdLength = valueLength;
+      nodeIdSet = true;
+    }
+  }
+
+  free(number);
+
+  /* fill in automatic values */
+  if (!nodeIdSet) {
+    if (nodeIdType == PUD_NODEIDTYPE_DNS) {
+      memset(nodeId, 0, sizeof(nodeId));
+      errno = 0;
+      if (gethostname((char *)&nodeId[0], sizeof(nodeId) - 1) < 0) {
+        pudError(true, "Could not get the host name");
+        return true;
+      }
+
+      nodeIdLength = strlen((char *)nodeId);
+      nodeIdSet = true;
+    } else if ((nodeIdType != PUD_NODEIDTYPE_MAC) && (nodeIdType != PUD_NODEIDTYPE_IPV4)
+        && (nodeIdType != PUD_NODEIDTYPE_IPV6)) {
+      pudError(false, "No node ID set while one is required for nodeId type %u", nodeIdType);
+      return true;
+    }
+  }
+
+  if (!setupNodeIdBinaryAndValidate(nodeIdType)) {
+    pudError(false, "nodeId (type %u) is incorrectly configured", nodeIdType);
+    return true;
+  }
+
+  return false;
 }
 
 /*
@@ -174,19 +224,106 @@ static bool intSetupNodeIdBinaryMAC(void) {
  - false on failure
  */
 static bool intSetupNodeIdBinaryLongLong(unsigned long long min,
-               unsigned long long max, unsigned int bytes) {
-       unsigned long long longValue = 0;
-       if (!readULL(PUD_NODE_ID_NAME, (char *) getNodeId(), &longValue)) {
-               return false;
-       }
+    unsigned long long max, unsigned int bytes) {
+  unsigned long long longValue = 0;
+  if (!readULL(PUD_NODE_ID_NAME, (char *) getNodeId(NULL), &longValue, 10)) {
+    return false;
+  }
 
-       if ((longValue < min) || (longValue > max)) {
-               pudError(false, "%s value %llu is out of range [%llu,%llu]",
-                               PUD_NODE_ID_NAME, longValue, min, max);
-               return false;
-       }
+  if ((longValue < min) || (longValue > max)) {
+    pudError(false, "%s value %llu is out of range [%llu,%llu]",
+        PUD_NODE_ID_NAME, longValue, min, max);
+    return false;
+  }
 
-       return setupNodeIdBinaryLongLong(&nodeIdBinary, longValue, bytes);
+  return setupNodeIdBinaryLongLong(&nodeIdBinary, longValue, bytes);
+}
+
+/**
+ Validate whether the configured nodeId is valid w.r.t. the configured
+ nodeIdType, for types that fit in a double unsigned long long (128 bits) with
+ a certain split that defined by chars1
+
+ @param chars1
+ the number of characters of the first part
+ @param min1
+ the minimum value of the first part
+ @param max1
+ the maximum value of the first part
+ @param bytes1
+ the number of bytes of the first part in the buffer
+ @param min2
+ the minimum value of the second part
+ @param max2
+ the maximum value of the second part
+ @param bytes2
+ the number of bytes of the second part in the buffer
+ @param base
+ the base of the number conversion: 10 for decimal, 16 for hexadecimal
+
+ @return
+ - true when ok
+ - false on failure
+ */
+static bool intSetupNodeIdBinaryDoubleLongLong(
+    unsigned char * dst,
+    unsigned int chars1,
+    unsigned long long min1, unsigned long long max1,
+    unsigned int bytes1,
+               unsigned long long min2, unsigned long long max2,
+               unsigned int bytes2,
+               int base) {
+       unsigned long long longValue1 = 0;
+       unsigned long long longValue2 = 0;
+
+       unsigned char * node_id = getNodeId(NULL);
+       size_t node_id_len = strlen((char *)node_id);
+
+       assert(chars1 > 0);
+       assert(bytes1 > 0);
+       assert(bytes2 > 0);
+
+  /* part 1 */
+       if (node_id_len > 0) {
+    unsigned char first[chars1 + 1];
+    int cpylen = node_id_len < chars1 ? node_id_len : chars1;
+
+    memcpy(first, node_id, cpylen);
+    first[cpylen] = '\0';
+
+    if (!readULL(PUD_NODE_ID_NAME, (char *)first, &longValue1, base)) {
+      return false;
+    }
+
+    if ((longValue1 < min1) || (longValue1 > max1)) {
+      pudError(false, "First %u character(s) of %s value %llu are out of range [%llu,%llu]",
+          cpylen, PUD_NODE_ID_NAME, longValue1, min1, max1);
+      return false;
+    }
+       }
+
+  /* part 2 */
+       if (node_id_len > chars1) {
+    if (!readULL(PUD_NODE_ID_NAME, (char *)&node_id[chars1], &longValue2, base)) {
+      return false;
+    }
+
+    if ((longValue2 < min2) || (longValue2 > max2)) {
+      pudError(false, "Last %u character(s) of %s value %llu are out of range [%llu,%llu]",
+          (unsigned int)(node_id_len - chars1), PUD_NODE_ID_NAME, longValue2, min2, max2);
+      return false;
+    }
+  } else {
+    /* longvalue1 is the only value, so it is the least significant value:
+     * exchange the 2 values */
+    unsigned long long tmp = longValue1;
+    longValue1 = longValue2;
+    longValue2 = tmp;
+  }
+
+       return setupNodeIdBinaryDoubleLongLong(&nodeIdBinary,
+           longValue1, &dst[0], bytes1,
+           longValue2, &dst[bytes1], bytes2);
 }
 
 /**
@@ -200,7 +337,7 @@ static bool intSetupNodeIdBinaryLongLong(unsigned long long min,
 static bool intSetupNodeIdBinaryString(void) {
        char report[256];
        size_t nodeidlength;
-       char * nodeid = (char *)getNodeIdWithLength(&nodeidlength);
+       char * nodeid = (char *)getNodeId(&nodeidlength);
 
        if (nmea_parse_sentence_has_invalid_chars(nodeid, nodeidlength, PUD_NODE_ID_NAME, &report[0], sizeof(report))) {
                pudError(false, "%s", &report[0]);
@@ -261,6 +398,20 @@ static bool setupNodeIdBinaryAndValidate(NodeIdType nodeIdTypeNumber) {
                case PUD_NODEIDTYPE_DNS: /* DNS name */
                        return intSetupNodeIdBinaryString();
 
+               case PUD_NODEIDTYPE_IPV4: /* IPv4 address */
+               case PUD_NODEIDTYPE_IPV6: /* IPv6 address */
+                       return intSetupNodeIdBinaryIp();
+
+               case PUD_NODEIDTYPE_UUID: /* a UUID number */
+                       return intSetupNodeIdBinaryDoubleLongLong(
+                           &nodeIdBinary.buffer.uuid[0],
+                           PUD_NODEIDTYPE_UUID_CHARS1,
+                           PUD_NODEIDTYPE_UUID_MIN1, PUD_NODEIDTYPE_UUID_MAX1,
+                           PUD_NODEIDTYPE_UUID_BYTES1,
+                           PUD_NODEIDTYPE_UUID_MIN2, PUD_NODEIDTYPE_UUID_MAX2,
+                           PUD_NODEIDTYPE_UUID_BYTES - PUD_NODEIDTYPE_UUID_BYTES1,
+                           16);
+
                case PUD_NODEIDTYPE_MMSI: /* an AIS MMSI number */
                        return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_MMSI_MIN,
                                PUD_NODEIDTYPE_MMSI_MAX, PUD_NODEIDTYPE_MMSI_BYTES);
@@ -269,6 +420,16 @@ static bool setupNodeIdBinaryAndValidate(NodeIdType nodeIdTypeNumber) {
                        return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_URN_MIN,
                                PUD_NODEIDTYPE_URN_MAX, PUD_NODEIDTYPE_URN_BYTES);
 
+               case PUD_NODEIDTYPE_MIP: /* a MIP OID number */
+                       return intSetupNodeIdBinaryDoubleLongLong(
+                           &nodeIdBinary.buffer.mip[0],
+                           PUD_NODEIDTYPE_MIP_CHARS1,
+                           PUD_NODEIDTYPE_MIP_MIN1, PUD_NODEIDTYPE_MIP_MAX1,
+                           PUD_NODEIDTYPE_MIP_BYTES1,
+                           PUD_NODEIDTYPE_MIP_MIN2, PUD_NODEIDTYPE_MIP_MAX2,
+                           PUD_NODEIDTYPE_MIP_BYTES - PUD_NODEIDTYPE_MIP_BYTES1,
+                           10);
+
                case PUD_NODEIDTYPE_192:
                        return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_192_MIN,
                                PUD_NODEIDTYPE_192_MAX, PUD_NODEIDTYPE_192_BYTES);
@@ -281,10 +442,9 @@ static bool setupNodeIdBinaryAndValidate(NodeIdType nodeIdTypeNumber) {
                        return intSetupNodeIdBinaryLongLong(PUD_NODEIDTYPE_194_MIN,
                                PUD_NODEIDTYPE_194_MAX, PUD_NODEIDTYPE_194_BYTES);
 
-               case PUD_NODEIDTYPE_IPV4: /* IPv4 address */
-               case PUD_NODEIDTYPE_IPV6: /* IPv6 address */
-               default: /* unsupported */
-                       return intSetupNodeIdBinaryIp();
+               default:
+                 pudError(false, "nodeId type %u is not supported", nodeIdTypeNumber);
+                 return false;
        }
 
        return false;
@@ -597,7 +757,7 @@ int setPositionFilePeriod(const char *value, void *data __attribute__ ((unused))
 
        assert(value != NULL);
 
-       if (!readULL(valueName, value, &positionFilePeriodNew)) {
+       if (!readULL(valueName, value, &positionFilePeriodNew, 10)) {
                return true;
        }
 
@@ -1000,7 +1160,7 @@ int setUpdateIntervalStationary(const char *value, void *data __attribute__ ((un
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
        static const char * valueName = PUD_UPDATE_INTERVAL_STATIONARY_NAME;
 
-       if (!readULL(valueName, value, &updateIntervalStationary)) {
+       if (!readULL(valueName, value, &updateIntervalStationary, 10)) {
                return true;
        }
 
@@ -1031,7 +1191,7 @@ int setUpdateIntervalMoving(const char *value, void *data __attribute__ ((unused
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
        static const char * valueName = PUD_UPDATE_INTERVAL_MOVING_NAME;
 
-       if (!readULL(valueName, value, &updateIntervalMoving)) {
+       if (!readULL(valueName, value, &updateIntervalMoving, 10)) {
                return true;
        }
 
@@ -1062,7 +1222,7 @@ int setUplinkUpdateIntervalStationary(const char *value, void *data __attribute_
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
        static const char * valueName = PUD_UPLINK_UPDATE_INTERVAL_STATIONARY_NAME;
 
-       if (!readULL(valueName, value, &uplinkUpdateIntervalStationary)) {
+       if (!readULL(valueName, value, &uplinkUpdateIntervalStationary, 10)) {
                return true;
        }
 
@@ -1093,7 +1253,7 @@ int setUplinkUpdateIntervalMoving(const char *value, void *data __attribute__ ((
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
        static const char * valueName = PUD_UPLINK_UPDATE_INTERVAL_MOVING_NAME;
 
-       if (!readULL(valueName, value, &uplinkUpdateIntervalMoving)) {
+       if (!readULL(valueName, value, &uplinkUpdateIntervalMoving, 10)) {
                return true;
        }
 
@@ -1124,7 +1284,7 @@ int setGatewayDeterminationInterval(const char *value, void *data __attribute__
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
        static const char * valueName = PUD_GATEWAY_DETERMINATION_INTERVAL_NAME;
 
-       if (!readULL(valueName, value, &gatewayDeterminationInterval)) {
+       if (!readULL(valueName, value, &gatewayDeterminationInterval, 10)) {
                return true;
        }
 
@@ -1153,7 +1313,7 @@ unsigned long long getMovingSpeedThreshold(void) {
 
 int setMovingSpeedThreshold(const char *value, void *data __attribute__ ((unused)),
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       return !readULL(PUD_MOVING_SPEED_THRESHOLD_NAME, value, &movingSpeedThreshold);
+       return !readULL(PUD_MOVING_SPEED_THRESHOLD_NAME, value, &movingSpeedThreshold, 10);
 }
 
 /*
@@ -1173,7 +1333,7 @@ unsigned long long getMovingDistanceThreshold(void) {
 
 int setMovingDistanceThreshold(const char *value, void *data __attribute__ ((unused)),
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       return !readULL(PUD_MOVING_DISTANCE_THRESHOLD_NAME, value, &movingDistanceThreshold);
+       return !readULL(PUD_MOVING_DISTANCE_THRESHOLD_NAME, value, &movingDistanceThreshold, 10);
 }
 
 /*
@@ -1213,7 +1373,7 @@ unsigned long long getDefaultHdop(void) {
 
 int setDefaultHdop(const char *value, void *data __attribute__ ((unused)),
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       return !readULL(PUD_DEFAULT_HDOP_NAME, value, &defaultHdop);
+       return !readULL(PUD_DEFAULT_HDOP_NAME, value, &defaultHdop, 10);
 }
 
 /*
@@ -1233,7 +1393,7 @@ unsigned long long getDefaultVdop(void) {
 
 int setDefaultVdop(const char *value, void *data __attribute__ ((unused)),
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       return !readULL(PUD_DEFAULT_VDOP_NAME, value, &defaultVdop);
+       return !readULL(PUD_DEFAULT_VDOP_NAME, value, &defaultVdop, 10);
 }
 
 /*
@@ -1255,7 +1415,7 @@ int setAverageDepth(const char *value, void *data __attribute__ ((unused)),
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
        static const char * valueName = PUD_AVERAGE_DEPTH_NAME;
 
-       if (!readULL(valueName, value, &averageDepth)) {
+       if (!readULL(valueName, value, &averageDepth, 10)) {
                return true;
        }
 
@@ -1284,7 +1444,7 @@ unsigned long long getHysteresisCountToStationary(void) {
 
 int setHysteresisCountToStationary(const char *value, void *data __attribute__ ((unused)),
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       return !readULL(PUD_HYSTERESIS_COUNT_2STAT_NAME, value, &hysteresisCountToStationary);
+       return !readULL(PUD_HYSTERESIS_COUNT_2STAT_NAME, value, &hysteresisCountToStationary, 10);
 }
 
 /*
@@ -1304,7 +1464,7 @@ unsigned long long getHysteresisCountToMoving(void) {
 
 int setHysteresisCountToMoving(const char *value, void *data __attribute__ ((unused)),
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       return !readULL(PUD_HYSTERESIS_COUNT_2MOV_NAME, value, &hysteresisCountToMoving);
+       return !readULL(PUD_HYSTERESIS_COUNT_2MOV_NAME, value, &hysteresisCountToMoving, 10);
 }
 
 /*
@@ -1324,7 +1484,7 @@ unsigned long long getGatewayHysteresisCountToStationary(void) {
 
 int setGatewayHysteresisCountToStationary(const char *value, void *data __attribute__ ((unused)),
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       return !readULL(PUD_GAT_HYSTERESIS_COUNT_2STAT_NAME, value, &gatewayHysteresisCountToStationary);
+       return !readULL(PUD_GAT_HYSTERESIS_COUNT_2STAT_NAME, value, &gatewayHysteresisCountToStationary, 10);
 }
 
 /*
@@ -1344,7 +1504,7 @@ unsigned long long getGatewayHysteresisCountToMoving(void) {
 
 int setGatewayHysteresisCountToMoving(const char *value, void *data __attribute__ ((unused)),
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       return !readULL(PUD_GAT_HYSTERESIS_COUNT_2MOV_NAME, value, &gatewayHysteresisCountToMoving);
+       return !readULL(PUD_GAT_HYSTERESIS_COUNT_2MOV_NAME, value, &gatewayHysteresisCountToMoving, 10);
 }
 
 /*
@@ -1384,7 +1544,7 @@ unsigned long long getDeDupDepth(void) {
 
 int setDeDupDepth(const char *value, void *data __attribute__ ((unused)),
                set_plugin_parameter_addon addon __attribute__ ((unused))) {
-       return !readULL(PUD_DEDUP_DEPTH_NAME, value, &deDupDepth);
+       return !readULL(PUD_DEDUP_DEPTH_NAME, value, &deDupDepth, 10);
 }
 
 /*
@@ -1431,31 +1591,6 @@ unsigned int checkConfig(void) {
                retval = false;
        }
 
-       if (!nodeIdSet) {
-               if (nodeIdType == PUD_NODEIDTYPE_DNS) {
-                       char name[PUD_TX_NODEID_BUFFERSIZE];
-
-                       errno = 0;
-                       if (gethostname(&name[0], sizeof(name)) < 0) {
-                               pudError(true, "Could not get the host name");
-                               retval = false;
-                       } else {
-                               setNodeId(&name[0], NULL,
-                                               (set_plugin_parameter_addon) {.pc = NULL});
-                       }
-                       name[PUD_TX_NODEID_BUFFERSIZE - 1] = '\0';
-               } else if ((nodeIdType != PUD_NODEIDTYPE_MAC) && (nodeIdType
-                               != PUD_NODEIDTYPE_IPV4) && (nodeIdType != PUD_NODEIDTYPE_IPV6)) {
-                       pudError(false, "No node ID set while one is required for"
-                               " node type %u", nodeIdType);
-                       retval = false;
-               }
-       }
-
-       if (!setupNodeIdBinaryAndValidate(nodeIdType)) {
-               retval = false;
-       }
-
        if (updateIntervalMoving > updateIntervalStationary) {
                pudError(false,"The update interval for moving situations must not be"
                " larger than that for stationary situations");
index 402306e..8fddc50 100644 (file)
  * Global Parameters
  */
 
-/** The name of the nodeIdType plugin parameter */
-#define PUD_NODE_ID_TYPE_NAME                                  "nodeIdType"
-
 /** The default value of the nodeIdType plugin parameter */
 #define PUD_NODE_ID_TYPE_DEFAULT                               PUD_NODEIDTYPE_IPV4
 
 NodeIdType getNodeIdTypeNumber(void);
-int setNodeIdType(const char *value, void *data,
-               set_plugin_parameter_addon addon);
 
 /** The name of the nodeId plugin parameter */
 #define PUD_NODE_ID_NAME                                               "nodeId"
 
-unsigned char * getNodeId(void);
-unsigned char * getNodeIdWithLength(size_t *length);
+unsigned char * getNodeId(size_t *length);
 nodeIdBinaryType * getNodeIdBinary(void);
 int setNodeId(const char *value, void *data, set_plugin_parameter_addon addon);
 
index b5c6812..f4acb7e 100644 (file)
 unsigned char * getHardwareAddress(const char * ifName, int family,
                struct ifreq *ifr) {
        int fd;
-       int cpySize;
 
        assert(ifName != NULL);
-       assert(strlen(ifName) <= IFNAMSIZ);
+       assert(strlen(ifName) <= sizeof(ifr->ifr_name));
        assert((family == AF_INET) || (family == AF_INET6));
        assert(ifr != NULL);
 
@@ -42,9 +41,7 @@ unsigned char * getHardwareAddress(const char * ifName, int family,
 
        ifr->ifr_addr.sa_family = family;
        memset(ifr->ifr_name, 0, sizeof(ifr->ifr_name));
-       cpySize = (strlen(ifName) < sizeof(ifr->ifr_name)) ? strlen(ifName)
-                       : sizeof(ifr->ifr_name);
-       strncpy(ifr->ifr_name, ifName, cpySize);
+       strncpy(ifr->ifr_name, ifName, sizeof(ifr->ifr_name));
 
        errno = 0;
        if (ioctl(fd, SIOCGIFHWADDR, ifr) < 0) {
@@ -72,10 +69,9 @@ unsigned char * getHardwareAddress(const char * ifName, int family,
  */
 struct in_addr * getIPv4Address(const char * ifName, struct ifreq *ifr) {
        int fd;
-       int cpySize;
 
        assert(ifName != NULL);
-       assert(strlen(ifName) <= IFNAMSIZ);
+       assert(strlen(ifName) <= sizeof(ifr->ifr_name));
        assert(ifr != NULL);
 
        fd = socket(AF_INET, SOCK_DGRAM, 0);
@@ -86,9 +82,7 @@ struct in_addr * getIPv4Address(const char * ifName, struct ifreq *ifr) {
 
        ifr->ifr_addr.sa_family = AF_INET;
        memset(ifr->ifr_name, 0, sizeof(ifr->ifr_name));
-       cpySize = (strlen(ifName) < sizeof(ifr->ifr_name)) ? strlen(ifName)
-                       : sizeof(ifr->ifr_name);
-       strncpy(ifr->ifr_name, ifName, cpySize);
+       strncpy(ifr->ifr_name, ifName, sizeof(ifr->ifr_name));
 
        errno = 0;
        if (ioctl(fd, SIOCGIFADDR, ifr) < 0) {
index fe6c91f..eabc3f3 100644 (file)
@@ -173,75 +173,75 @@ static void updateCounters(PositionAverageList * positionAverageList,
        int amount = (add ? 1 : -1);
 
        /* present */
-       if ((present & SMASK) != 0) {
+       if (nmea_INFO_is_present(present, SMASK)) {
                assert(add ? (counters->smask < maxCount):(counters->smask > 0));
                counters->smask += amount;
        }
-       if ((present & UTCDATE) != 0) {
+       if (nmea_INFO_is_present(present, UTCDATE)) {
                assert(add ? (counters->utcdate < maxCount):(counters->utcdate > 0));
                counters->utcdate += amount;
        }
-       if ((present & UTCTIME) != 0) {
+       if (nmea_INFO_is_present(present, UTCTIME)) {
                assert(add ? (counters->utctime < maxCount):(counters->utctime > 0));
                counters->utctime += amount;
        }
-       if ((present & SIG) != 0) {
+       if (nmea_INFO_is_present(present, SIG)) {
                assert(add ? (counters->sig < maxCount):(counters->sig > 0));
                counters->sig += amount;
        }
-       if ((present & FIX) != 0) {
+       if (nmea_INFO_is_present(present, FIX)) {
                assert(add ? (counters->fix < maxCount):(counters->fix > 0));
                counters->fix += amount;
        }
-       if ((present & PDOP) != 0) {
+       if (nmea_INFO_is_present(present, PDOP)) {
                assert(add ? (counters->pdop < maxCount):(counters->pdop > 0));
                counters->pdop += amount;
        }
-       if ((present & HDOP) != 0) {
+       if (nmea_INFO_is_present(present, HDOP)) {
                assert(add ? (counters->hdop < maxCount):(counters->hdop > 0));
                counters->hdop += amount;
        }
-       if ((present & VDOP) != 0) {
+       if (nmea_INFO_is_present(present, VDOP)) {
                assert(add ? (counters->vdop < maxCount):(counters->vdop > 0));
                counters->vdop += amount;
        }
-       if ((present & LAT) != 0) {
+       if (nmea_INFO_is_present(present, LAT)) {
                assert(add ? (counters->lat < maxCount):(counters->lat > 0));
                counters->lat += amount;
        }
-       if ((present & LON) != 0) {
+       if (nmea_INFO_is_present(present, LON)) {
                assert(add ? (counters->lon < maxCount):(counters->lon > 0));
                counters->lon += amount;
        }
-       if ((present & ELV) != 0) {
+       if (nmea_INFO_is_present(present, ELV)) {
                assert(add ? (counters->elv < maxCount):(counters->elv > 0));
                counters->elv += amount;
        }
-       if ((present & SPEED) != 0) {
+       if (nmea_INFO_is_present(present, SPEED)) {
                assert(add ? (counters->speed < maxCount):(counters->speed > 0));
                counters->speed += amount;
        }
-       if ((present & TRACK) != 0) {
+       if (nmea_INFO_is_present(present, TRACK)) {
                assert(add ? (counters->track < maxCount):(counters->track > 0));
                counters->track += amount;
        }
-       if ((present & MTRACK) != 0) {
+       if (nmea_INFO_is_present(present, MTRACK)) {
                assert(add ? (counters->mtrack < maxCount):(counters->mtrack > 0));
                counters->mtrack += amount;
        }
-       if ((present & MAGVAR) != 0) {
+       if (nmea_INFO_is_present(present, MAGVAR)) {
                assert(add ? (counters->magvar < maxCount):(counters->magvar > 0));
                counters->magvar += amount;
        }
-       if ((present & SATINUSECOUNT) != 0) {
+       if (nmea_INFO_is_present(present, SATINUSECOUNT)) {
                assert(add ? (counters->satinusecount < maxCount):(counters->satinusecount > 0));
                counters->satinusecount += amount;
        }
-       if ((present & SATINUSE) != 0) {
+       if (nmea_INFO_is_present(present, SATINUSE)) {
                assert(add ? (counters->satinuse < maxCount):(counters->satinuse > 0));
                counters->satinuse += amount;
        }
-       if ((present & SATINVIEW) != 0) {
+       if (nmea_INFO_is_present(present, SATINVIEW)) {
                assert(add ? (counters->satinview < maxCount):(counters->satinview > 0));
                counters->satinview += amount;
        }
@@ -321,58 +321,58 @@ static void determineCumulativePresentSmaskSigFix(
        cumulative->nmeaInfo.present = 0;
 
        if (counters->smask >= count) {
-               cumulative->nmeaInfo.present |= SMASK;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, SMASK);
        }
        if (counters->utcdate >= count) {
-               cumulative->nmeaInfo.present |= UTCDATE;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, UTCDATE);
        }
        if (counters->utctime >= count) {
-               cumulative->nmeaInfo.present |= UTCTIME;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, UTCTIME);
        }
        if (counters->sig >= count) {
-               cumulative->nmeaInfo.present |= SIG;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, SIG);
        }
        if (counters->fix >= count) {
-               cumulative->nmeaInfo.present |= FIX;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, FIX);
        }
        if (counters->pdop >= count) {
-               cumulative->nmeaInfo.present |= PDOP;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, PDOP);
        }
        if (counters->hdop >= count) {
-               cumulative->nmeaInfo.present |= HDOP;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, HDOP);
        }
        if (counters->vdop >= count) {
-               cumulative->nmeaInfo.present |= VDOP;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, VDOP);
        }
        if (counters->lat >= count) {
-               cumulative->nmeaInfo.present |= LAT;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, LAT);
        }
        if (counters->lon >= count) {
-               cumulative->nmeaInfo.present |= LON;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, LON);
        }
        if (counters->elv >= count) {
-               cumulative->nmeaInfo.present |= ELV;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, ELV);
        }
        if (counters->speed >= count) {
-               cumulative->nmeaInfo.present |= SPEED;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, SPEED);
        }
        if (counters->track >= count) {
-               cumulative->nmeaInfo.present |= TRACK;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, TRACK);
        }
        if (counters->mtrack >= count) {
-               cumulative->nmeaInfo.present |= MTRACK;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, MTRACK);
        }
        if (counters->magvar >= count) {
-               cumulative->nmeaInfo.present |= MAGVAR;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, MAGVAR);
        }
        if (counters->satinusecount >= count) {
-               cumulative->nmeaInfo.present |= SATINUSECOUNT;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, SATINUSECOUNT);
        }
        if (counters->satinuse >= count) {
-               cumulative->nmeaInfo.present |= SATINUSE;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, SATINUSE);
        }
        if (counters->satinview >= count) {
-               cumulative->nmeaInfo.present |= SATINVIEW;
+         nmea_INFO_set_present(&cumulative->nmeaInfo.present, SATINVIEW);
        }
 
        /* smask */
index 66ea20e..692c9df 100644 (file)
@@ -154,6 +154,7 @@ bool packetReceivedFromOlsr(union olsr_message *olsrMessage,
        }
 
        transmitStringLength = gpsFromOlsr(olsrMessage, &buffer[0], sizeof(buffer));
+       assert(transmitStringLength <= sizeof(buffer));
        if (unlikely(transmitStringLength == 0)) {
                return false;
        }
index e746e17..ea4353e 100644 (file)
@@ -20,7 +20,6 @@
  */
 static const struct olsrd_plugin_parameters plugin_parameters[] = {
        /* ID */
-       {       .name = PUD_NODE_ID_TYPE_NAME, .set_plugin_parameter = &setNodeIdType, .data = NULL},
        {       .name = PUD_NODE_ID_NAME, .set_plugin_parameter = &setNodeId, .data = NULL},
 
        /* OLSR */
index eb29bff..b61e973 100644 (file)
@@ -795,7 +795,7 @@ bool startReceiver(void) {
 
        transmitGpsInformation.txGateway = olsr_cnf->main_addr;
        transmitGpsInformation.positionUpdated = false;
-       transmitGpsInformation.nodeId = getNodeId();
+       transmitGpsInformation.nodeId = getNodeId(NULL);
 
 #ifdef HTTPINFO_PUD
        olsr_cnf->pud_position = &transmitGpsInformation;
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 903cd3c..3525381 100644 (file)
@@ -48,8 +48,20 @@ public class WireFormatConstants {
        public static final int NODEIDTYPE_MAC_BYTES = PUD_NODEIDTYPE_MAC_BYTES;
        public static final int NODEIDTYPE_MSISDN_BYTES = PUD_NODEIDTYPE_MSISDN_BYTES;
        public static final int NODEIDTYPE_TETRA_BYTES = PUD_NODEIDTYPE_TETRA_BYTES;
+       public static final int NODEIDTYPE_UUID_BYTES  = PUD_NODEIDTYPE_UUID_BYTES;
+       public static final int NODEIDTYPE_UUID_BYTES1 = PUD_NODEIDTYPE_UUID_BYTES1;
+       public static final int NODEIDTYPE_UUID_BYTES2 = PUD_NODEIDTYPE_UUID_BYTES2;
+       public static final int NODEIDTYPE_UUID_CHARS  = PUD_NODEIDTYPE_UUID_CHARS;
+       public static final int NODEIDTYPE_UUID_CHARS1 = PUD_NODEIDTYPE_UUID_CHARS1;
+       public static final int NODEIDTYPE_UUID_CHARS2 = PUD_NODEIDTYPE_UUID_CHARS2;
        public static final int NODEIDTYPE_MMSI_BYTES = PUD_NODEIDTYPE_MMSI_BYTES;
        public static final int NODEIDTYPE_URN_BYTES = PUD_NODEIDTYPE_URN_BYTES;
+       public static final int NODEIDTYPE_MIP_BYTES  = PUD_NODEIDTYPE_MIP_BYTES;
+       public static final int NODEIDTYPE_MIP_BYTES1 = PUD_NODEIDTYPE_MIP_BYTES1;
+       public static final int NODEIDTYPE_MIP_BYTES2 = PUD_NODEIDTYPE_MIP_BYTES2;
+       public static final int NODEIDTYPE_MIP_CHARS  = PUD_NODEIDTYPE_MIP_CHARS;
+       public static final int NODEIDTYPE_MIP_CHARS1 = PUD_NODEIDTYPE_MIP_CHARS1;
+       public static final int NODEIDTYPE_MIP_CHARS2 = PUD_NODEIDTYPE_MIP_CHARS2;
        public static final int NODEIDTYPE_192_BYTES = PUD_NODEIDTYPE_192_BYTES;
        public static final int NODEIDTYPE_193_BYTES = PUD_NODEIDTYPE_193_BYTES;
        public static final int NODEIDTYPE_194_BYTES = PUD_NODEIDTYPE_194_BYTES;
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 4b59ff4..103e6ef 100644 (file)
@@ -16,6 +16,10 @@ bool setupNodeIdBinaryMAC(nodeIdBinaryType * nodeIdBinary, unsigned char * mac);
 bool setupNodeIdBinaryLongLong(nodeIdBinaryType * nodeIdBinary,
                unsigned long long longValue, size_t bytes);
 
+bool setupNodeIdBinaryDoubleLongLong(nodeIdBinaryType * nodeIdBinary,
+    unsigned long long value1, unsigned char * dst1, size_t bytes1,
+    unsigned long long value2, unsigned char * dst2, size_t bytes2);
+
 bool setupNodeIdBinaryString(nodeIdBinaryType * nodeIdBinary, char * nodeId,
                size_t nodeIdLength);
 
index c90e32e..efe96dd 100644 (file)
@@ -148,8 +148,8 @@ typedef enum _NodeIdType {
        /** IPv4 address, 32 bits, 4 bytes */
        PUD_NODEIDTYPE_IPV4 = 4,
 
-       /** gap 1 */
-       PUD_NODEIDTYPE_GAP1 = 5,
+       /** UUID, 32 hexadecimal digits, 128 bits, 16 bytes */
+       PUD_NODEIDTYPE_UUID = 5,
 
        /** IPv6 address, 128 bits, 16 bytes */
        PUD_NODEIDTYPE_IPV6 = 6,
@@ -160,8 +160,11 @@ typedef enum _NodeIdType {
        /** URN number, 24 bits, 3 bytes */
        PUD_NODEIDTYPE_URN = 8,
 
+       /** MIP OID number, 67 bits, 9 bytes */
+       PUD_NODEIDTYPE_MIP = 9,
+
        /** the last id of the globally unique node type IDs */
-       PUD_NODEIDTYPE_GLOBAL_LAST = PUD_NODEIDTYPE_URN,
+       PUD_NODEIDTYPE_GLOBAL_LAST = PUD_NODEIDTYPE_MIP,
 
        /** the first id of the locally unique node type IDs */
        PUD_NODEIDTYPE_LOCAL_FIRST = 192,
@@ -184,38 +187,62 @@ typedef enum _NodeIdType {
 
 /** the number of nodeId bytes for PUD_NODEIDTYPE_MSISDN */
 #define PUD_NODEIDTYPE_MSISDN_BYTES            7
-#define PUD_NODEIDTYPE_MSISDN_MIN              0LL
-#define PUD_NODEIDTYPE_MSISDN_MAX              999999999999999LL
+#define PUD_NODEIDTYPE_MSISDN_MIN              0LLU
+#define PUD_NODEIDTYPE_MSISDN_MAX              999999999999999LLU
 
 /** the number of nodeId bytes for PUD_NODEIDTYPE_TETRA */
 #define PUD_NODEIDTYPE_TETRA_BYTES             8
-#define PUD_NODEIDTYPE_TETRA_MIN               0LL
-#define PUD_NODEIDTYPE_TETRA_MAX               99999999999999999LL
+#define PUD_NODEIDTYPE_TETRA_MIN               0LLU
+#define PUD_NODEIDTYPE_TETRA_MAX               99999999999999999LLU
+
+/** the number of nodeId bytes for PUD_NODEIDTYPE_UUID */
+#define PUD_NODEIDTYPE_UUID_BYTES   16
+#define PUD_NODEIDTYPE_UUID_BYTES1  8
+#define PUD_NODEIDTYPE_UUID_BYTES2  (PUD_NODEIDTYPE_UUID_BYTES - PUD_NODEIDTYPE_UUID_BYTES1)
+#define PUD_NODEIDTYPE_UUID_CHARS   32
+#define PUD_NODEIDTYPE_UUID_CHARS1  16
+#define PUD_NODEIDTYPE_UUID_CHARS2  (PUD_NODEIDTYPE_UUID_CHARS - PUD_NODEIDTYPE_UUID_CHARS1)
+#define PUD_NODEIDTYPE_UUID_MIN1    0LLU
+#define PUD_NODEIDTYPE_UUID_MAX1    0xFFFFFFFFFFFFFFFFLLU
+#define PUD_NODEIDTYPE_UUID_MIN2    0LLU
+#define PUD_NODEIDTYPE_UUID_MAX2    0xFFFFFFFFFFFFFFFFLLU
 
 /** the number of nodeId bytes for PUD_NODEIDTYPE_MMSI */
 #define PUD_NODEIDTYPE_MMSI_BYTES              4
-#define PUD_NODEIDTYPE_MMSI_MIN                        0LL
-#define PUD_NODEIDTYPE_MMSI_MAX                        999999999LL
+#define PUD_NODEIDTYPE_MMSI_MIN                        0LLU
+#define PUD_NODEIDTYPE_MMSI_MAX                        999999999LLU
 
 /** the number of nodeId bytes for PUD_NODEIDTYPE_URN */
 #define PUD_NODEIDTYPE_URN_BYTES               3
-#define PUD_NODEIDTYPE_URN_MIN                 0LL
-#define PUD_NODEIDTYPE_URN_MAX                 16777215LL
+#define PUD_NODEIDTYPE_URN_MIN                 0LLU
+#define PUD_NODEIDTYPE_URN_MAX                 16777215LLU
+
+/** the number of nodeId bytes for PUD_NODEIDTYPE_MIP */
+#define PUD_NODEIDTYPE_MIP_BYTES    9
+#define PUD_NODEIDTYPE_MIP_BYTES1   1
+#define PUD_NODEIDTYPE_MIP_BYTES2   (PUD_NODEIDTYPE_MIP_BYTES - PUD_NODEIDTYPE_MIP_BYTES1)
+#define PUD_NODEIDTYPE_MIP_CHARS    20
+#define PUD_NODEIDTYPE_MIP_CHARS1   1
+#define PUD_NODEIDTYPE_MIP_CHARS2   (PUD_NODEIDTYPE_MIP_CHARS - PUD_NODEIDTYPE_MIP_CHARS1)
+#define PUD_NODEIDTYPE_MIP_MIN1     0LLU
+#define PUD_NODEIDTYPE_MIP_MAX1     9LLU
+#define PUD_NODEIDTYPE_MIP_MIN2     0LLU
+#define PUD_NODEIDTYPE_MIP_MAX2     9999999999999999999LLU
 
 /** the number of nodeId bytes for PUD_NODEIDTYPE_192 */
 #define PUD_NODEIDTYPE_192_BYTES               3
-#define PUD_NODEIDTYPE_192_MIN                 0LL
-#define PUD_NODEIDTYPE_192_MAX                 9999999LL
+#define PUD_NODEIDTYPE_192_MIN                 0LLU
+#define PUD_NODEIDTYPE_192_MAX                 9999999LLU
 
 /** the number of nodeId bytes for PUD_NODEIDTYPE_193 */
 #define PUD_NODEIDTYPE_193_BYTES               3
-#define PUD_NODEIDTYPE_193_MIN                 0LL
-#define PUD_NODEIDTYPE_193_MAX                 999999LL
+#define PUD_NODEIDTYPE_193_MIN                 0LLU
+#define PUD_NODEIDTYPE_193_MAX                 999999LLU
 
 /** the number of nodeId bytes for PUD_NODEIDTYPE_194 */
 #define PUD_NODEIDTYPE_194_BYTES               2
-#define PUD_NODEIDTYPE_194_MIN                 1LL
-#define PUD_NODEIDTYPE_194_MAX                 8191LL
+#define PUD_NODEIDTYPE_194_MIN                 1LLU
+#define PUD_NODEIDTYPE_194_MAX                 8191LLU
 
 /** the number of nodeId bytes for PUD_NODEIDTYPE_IPV4 (sizeof(struct in_addr)) */
 #define PUD_NODEIDTYPE_IPV4_BYTES              4
@@ -245,6 +272,8 @@ typedef struct _nodeIdBinaryType {
                                union olsr_ip_addr ip;
                                unsigned long long longValue;
                                unsigned char stringValue[PUD_TX_NODEID_BUFFERSIZE];
+                               unsigned char uuid[PUD_NODEIDTYPE_UUID_BYTES];
+                               unsigned char mip[PUD_NODEIDTYPE_MIP_BYTES];
                } buffer;
 } nodeIdBinaryType;
 
index 98f3540..2878046 100644 (file)
@@ -70,6 +70,37 @@ static char *getNodeIdNumberFromOlsr(unsigned char * buffer,
 }
 
 /**
+ Get a nodeId hexadecimal number (in string representation), using a certain
+ number of bytes, from the message of an OLSR message.
+
+ @param buffer
+ A pointer to the buffer that holds the nodeId
+ @param bufferSize
+ The number of bytes used by the number in the buffer
+ @param nodeIdBuffer
+ The buffer in which to place the nodeId number in string representation
+ @param nodeIdBufferSize
+ The size of the nodeIdbuffer
+
+ @return
+ A pointer to the nodeId string representation (&nodeIdBuffer[0])
+ */
+static char *getNodeIdHexNumberFromOlsr(unsigned char * buffer,
+               unsigned int bufferSize, char *nodeIdBuffer, socklen_t nodeIdBufferSize) {
+       unsigned long long val = 0;
+       unsigned int i = 0;
+
+       while (i < bufferSize) {
+               val <<= 8;
+               val += buffer[i];
+               i++;
+       }
+
+       snprintf(nodeIdBuffer, nodeIdBufferSize, "%llx", val);
+       return &nodeIdBuffer[0];
+}
+
+/**
  Convert the nodeId of an OLSR message into a string.
 
  @param ipVersion
@@ -121,7 +152,12 @@ void getNodeIdStringFromOlsr(int ipVersion, union olsr_message *olsrMessage,
                break;
 
        case PUD_NODEIDTYPE_DNS: /* DNS name */
-               *nodeIdStr = (char *) nodeId;
+               if (nodeIdSize >= nodeIdStrBufferSize) {
+                 nodeIdSize = nodeIdStrBufferSize - 1;
+               }
+               memcpy(nodeIdStrBuffer, nodeId, nodeIdSize);
+               nodeIdStrBuffer[nodeIdSize] = '\0';
+               *nodeIdStr = &nodeIdStrBuffer[0];
                break;
 
        case PUD_NODEIDTYPE_MSISDN: /* an MSISDN number */
@@ -135,6 +171,32 @@ void getNodeIdStringFromOlsr(int ipVersion, union olsr_message *olsrMessage,
                                nodeIdStrBuffer, nodeIdStrBufferSize);
                break;
 
+       case PUD_NODEIDTYPE_UUID: /* a UUID number */
+         *nodeIdStr = getNodeIdHexNumberFromOlsr(
+             &nodeId[0],
+             PUD_NODEIDTYPE_UUID_BYTES1,
+             &nodeIdStrBuffer[0],
+             PUD_NODEIDTYPE_UUID_CHARS1 + 1);
+         getNodeIdHexNumberFromOlsr(
+             &nodeId[PUD_NODEIDTYPE_UUID_BYTES1],
+             nodeIdSize - PUD_NODEIDTYPE_UUID_BYTES1,
+             &nodeIdStrBuffer[PUD_NODEIDTYPE_UUID_CHARS1],
+             nodeIdStrBufferSize - PUD_NODEIDTYPE_UUID_CHARS1);
+               break;
+
+       case PUD_NODEIDTYPE_MIP: /* a MIP OID number */
+         *nodeIdStr = getNodeIdNumberFromOlsr(
+             &nodeId[0],
+             PUD_NODEIDTYPE_MIP_BYTES1,
+             &nodeIdStrBuffer[0],
+             PUD_NODEIDTYPE_MIP_CHARS1 + 1);
+         getNodeIdNumberFromOlsr(
+             &nodeId[PUD_NODEIDTYPE_MIP_BYTES1],
+             nodeIdSize - PUD_NODEIDTYPE_MIP_BYTES1,
+             &nodeIdStrBuffer[PUD_NODEIDTYPE_MIP_CHARS1],
+             nodeIdStrBufferSize - PUD_NODEIDTYPE_MIP_CHARS1);
+         break;
+
        case PUD_NODEIDTYPE_IPV4: /* IPv4 address */
        case PUD_NODEIDTYPE_IPV6: /* IPv6 address */
        default: /* unsupported */
@@ -200,6 +262,56 @@ bool setupNodeIdBinaryLongLong(nodeIdBinaryType * nodeIdBinary,
 }
 
 /**
+ Convert two given unsigned long longs to the binary/wireformat representation
+ of them.
+
+ @param nodeIdBinary
+ a pointer to the buffer in which to store the binary/wireformat representation
+ @param value1
+ the first value to convert (in machine byte-order)
+ @param dst1
+ A pointer where to store the conversion of value1
+ @param bytes1
+ the number of bytes used by value1
+ @param value2
+ the second value to convert (in machine byte-order)
+ @param dst2
+ A pointer where to store the conversion of value2
+ @param bytes2
+ the number of bytes used by value2
+
+ @return
+ - true when ok
+ - false on failure
+ */
+bool setupNodeIdBinaryDoubleLongLong(nodeIdBinaryType * nodeIdBinary,
+    unsigned long long value1, unsigned char * dst1, size_t bytes1,
+    unsigned long long value2, unsigned char * dst2, size_t bytes2) {
+       unsigned long long longValue1 = value1;
+       unsigned long long longValue2 = value2;
+       int i1 = bytes1 - 1;
+       int i2 = bytes2 - 1;
+
+       while (i1 >= 0) {
+               dst1[i1] = longValue1 & 0xff;
+               longValue1 >>= 8;
+               i1--;
+       }
+       assert(longValue1 == 0);
+
+       while (i2 >= 0) {
+               dst2[i2] = longValue2 & 0xff;
+               longValue2 >>= 8;
+               i2--;
+       }
+       assert(longValue2 == 0);
+
+       nodeIdBinary->length = bytes1 + bytes2;
+       nodeIdBinary->set = true;
+       return true;
+}
+
+/**
  Convert a given string to the binary/wireformat representation of it.
 
  @param nodeIdBinary
index 6ae4098..62b595b 100644 (file)
@@ -13,10 +13,6 @@ bool isValidNodeIdType(unsigned long long nodeIdType) {
                        (/* (nodeIdType >= PUD_NODEIDTYPE_GLOBAL_FIRST) && */ (nodeIdType <= PUD_NODEIDTYPE_GLOBAL_LAST)) ||
                        (   (nodeIdType >= PUD_NODEIDTYPE_LOCAL_FIRST ) &&    (nodeIdType <= PUD_NODEIDTYPE_LOCAL_LAST ))
                )
-               &&
-               (
-                       (nodeIdType != PUD_NODEIDTYPE_GAP1)
-               )
        );
 }
 
@@ -715,10 +711,20 @@ void getPositionUpdateNodeId(int ipVersion, union olsr_message * olsrMessage,
                break;
 
        case PUD_NODEIDTYPE_DNS: /* DNS name */
-               *nodeIdSize = strlen((char *) *nodeId);
-               /* FIXME for no '\0' at the end, need to scan from the end until
-                * encountering a non-zero byte: end of string address and
-                * subtract the string start address */
+         {
+           unsigned int len = 0;
+           unsigned char * idx = *nodeId;
+           unsigned char * lastPayloadByte = &((unsigned char *)olsrMessage)[getOlsrMessageSize(ipVersion, olsrMessage) - 1];
+           while ((*idx != '\0') && (idx <= lastPayloadByte)) {
+             idx++;
+             len++;
+           }
+           *nodeIdSize = len;
+         }
+               break;
+
+       case PUD_NODEIDTYPE_UUID: /* a UUID number */
+               *nodeIdSize = PUD_NODEIDTYPE_UUID_BYTES;
                break;
 
        case PUD_NODEIDTYPE_MMSI: /* an AIS MMSI number */
@@ -729,6 +735,10 @@ void getPositionUpdateNodeId(int ipVersion, union olsr_message * olsrMessage,
                *nodeIdSize = PUD_NODEIDTYPE_URN_BYTES;
                break;
 
+       case PUD_NODEIDTYPE_MIP: /* a MIP OID number */
+               *nodeIdSize = PUD_NODEIDTYPE_MIP_BYTES;
+               break;
+
        case PUD_NODEIDTYPE_192:
                *nodeIdSize = PUD_NODEIDTYPE_192_BYTES;
                break;
@@ -781,7 +791,7 @@ void setPositionUpdateNodeId(
 /**
  Convert the node information to the node information for an OLSR message and
  put it in the PUD message in the OLSR message. Also updates the PUD message
- smask.
+ smask to signal whether or not an ID is in the message.
 
  @param ipVersion
  The IP version (AF_INET or AF_INET6)
@@ -810,8 +820,10 @@ size_t setPositionUpdateNodeInfo(int ipVersion,
        case PUD_NODEIDTYPE_MAC: /* hardware address */
        case PUD_NODEIDTYPE_MSISDN: /* an MSISDN number */
        case PUD_NODEIDTYPE_TETRA: /* a Tetra number */
+       case PUD_NODEIDTYPE_UUID: /* a UUID number */
        case PUD_NODEIDTYPE_MMSI: /* an AIS MMSI number */
        case PUD_NODEIDTYPE_URN: /* a URN number */
+       case PUD_NODEIDTYPE_MIP: /* a MIP OID number */
        case PUD_NODEIDTYPE_192:
        case PUD_NODEIDTYPE_193:
        case PUD_NODEIDTYPE_194:
@@ -830,6 +842,7 @@ size_t setPositionUpdateNodeInfo(int ipVersion,
                        length = charsAvailable;
                }
 
+               // FIXME do not pad with a null byte (compatibility breaking change!)
                setPositionUpdateNodeId(olsrGpsMessage, nodeId, length, true);
        }
                break;
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.