Merge branch 'release-0.6.7'
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 27 May 2015 13:22:44 +0000 (15:22 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 27 May 2015 13:22:44 +0000 (15:22 +0200)
* release-0.6.7:
  Rename 'struct interface' to 'struct interface_olsr'
  build: add some pud targets
  build: uberclean must also remove builddata.txt

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
92 files changed:
CHANGELOG
Makefile
README-Olsr-Extensions
android/README
android/regex/Makefile
contrib/netsimpcap/Makefile
contrib/netsimpcap/src/netsimpcap.c
files/.gitignore [new file with mode: 0644]
files/README [new file with mode: 0644]
files/generateEffectiveConfigurationFile [new file with mode: 0755]
files/olsrd.conf.commotion
files/olsrd.conf.default.full
files/olsrd.conf.default.full.txt [new file with mode: 0644]
files/olsrd.conf.default.lq
files/olsrd.conf.default.lq-fisheye [deleted file]
files/olsrd.conf.default.rfc
files/olsrd.conf.funkfeuer
files/olsrd.conf.minimal_freifunk [deleted file]
gui/win32/Inst/installer.nsi
gui/win32/Main/Frontend.rc
lib/arprefresh/README_ARPREFRESH
lib/bmf/src/Address.c
lib/bmf/src/Bmf.c
lib/bmf/src/NetworkInterfaces.c
lib/dot_draw/src/olsrd_dot_draw.c
lib/dyn_gw/README_DYN_GW
lib/dyn_gw/src/olsrd_dyn_gw.c
lib/dyn_gw/src/olsrd_dyn_gw.h
lib/dyn_gw_plain/README_DYN_GW_PLAIN
lib/httpinfo/README_HTTPINFO
lib/httpinfo/src/olsrd_httpinfo.c
lib/jsoninfo/README_JSONINFO
lib/jsoninfo/src/olsrd_jsoninfo.c
lib/jsoninfo/src/olsrd_jsoninfo.h
lib/jsoninfo/src/olsrd_plugin.c
lib/mdns/src/mdns.c
lib/p2pd/src/p2pd.c
lib/pud/Makefile
lib/pud/README
lib/pud/doc/pud.odt
lib/pud/nmealib/doc/Makefile
lib/pud/nmealib/doc/nmea.doxygen
lib/pud/nmealib/src/generator.c
lib/pud/nmealib/src/random.h [new file with mode: 0644]
lib/pud/nmealib/src/tok.c
lib/pud/olsrd.conf.sample [deleted file]
lib/pud/src/configTools.c
lib/pud/wireformat-java/Makefile
lib/quagga/src/client.c
lib/secure/README_SECURE
lib/secure/src/olsrd_secure.c
lib/sgwdynspeed/src/configuration.c
lib/sgwdynspeed/src/sgwDynSpeed.c
lib/sgwdynspeed/src/speedFile.c
lib/txtinfo/README_TXTINFO
lib/txtinfo/src/olsrd_txtinfo.c
make/Makefile.android
src/bsd/net.c
src/build_msg.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/olsrd_conf.h
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/egressFile.c [new file with mode: 0644]
src/egressFile.h [new file with mode: 0644]
src/egressTypes.h [new file with mode: 0644]
src/gateway.c
src/gateway.h
src/gateway_costs.c
src/gateway_costs.h
src/gateway_default_handler.c
src/hna_set.c
src/interfaces.h
src/ipcalc.c
src/kernel_routes.h
src/linux/kernel_routes_nl.c
src/linux/net.c
src/main.c
src/mantissa.c
src/mantissa.h
src/net_olsr.c
src/olsr.c
src/olsr_cfg.h
src/olsr_random.h [new file with mode: 0644]
src/olsr_switch/link_rules.c
src/olsr_switch/olsr_host_switch.h
src/parser.c
src/scheduler.c
src/tc_set.c
src/unix/ifnet.c
src/win32/ifnet.c

index 0f5de9f..fd0444d 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,102 @@
+0.6.8 -------------------------------------------------------------------
+
+Ferry Huberts (81):
+      linux: increase the netlink buffer size
+      linux: fix using tables >= 256
+      linux: fix type of af_family
+      linux: do not try to set routes with negative metric
+      linux: add 'flags' parameter to olsr_new_netlink_route function
+      linux: add 'scope' parameter to olsr_new_netlink_route function
+      linux: make it possible to add/remove blackhole routes
+      linux: export the olsr_new_netlink_route function
+      Update version after branch of v0.6.7
+      android: use the machine specific NDK instead of always the 32bit variant
+      Merge branch 'linux-routes.v1'
+      android: fix build on 32 bit platform (see 0295e11)
+      linux: olsr_if_isup: fix return code in error path
+      conf parser: fix a warning
+      Merge branch 'release-0.6.7'
+      linux: fix a typo
+      sgw: move add/remove of ifchange handler to better place
+      sgw: export multi_gateway_mode method
+      sgw: make sure gw->ipv6 is always set for a new gateway
+      sgw: cost calculation can now directly account for interface up/down
+         status
+      config parser: minor improvement for SmartGatewayEgressInterfaces
+      pud: fix strto* result checking for out-of-range situations
+      sgwdynspeed: fix strto* result checking for out-of-range situations
+      Merge branch 'release-0.6.7'
+      Merge branch 'release-0.6.7'
+      release: fix up the CHANGELOG
+      Merge branch 'release-0.6.7'
+      sgw: fix deserialize_gw_speed
+      txtinfo: fix formatting in ipc_print_sgw
+      sgw: move 'struct sgw_egress_if' type into a separate include file
+      sgw: store table & rule numbers in the sgw_egress_if structure
+      sgw: add egress file reader settings
+      sgw: add egress file reader
+      sgw: track the interface index of an egress interface
+      sgw: track the up status of an egress interface
+      sgw: use the smartgw_tunnel_monitor to track up/down of egress interfaces
+      sgw: introduce function to process multi-sgw changes
+      sgw: determine best exit link in doRoutesMultiGw
+      sgw: determine best overall link in doRoutesMultiGw
+      sgw: add SmartGatewayStatusFile setting
+      sgw: add the smart gateway status file writer
+      sgw: add reportNewGateway function
+      sgw: program best overall link routes
+      sgw: program best egress link route
+      sgw: program egress link routes
+      sgwdynspeed: only allow the plugin in single-sgw mode
+      sgw: fix default path costs for egress interfaces
+      sgw: initialise the egress interfaces earlier
+      sgw: lazily determine the sgw costs weights
+      sgw: show all sgw tunnels in the output file instead of only the active
+         one
+      sgw: reset cached egress file timestamp on file access errors
+      sgw: do not prematurely exit doRoutesMultiGw
+      Merge branch 'msgw'
+      sgw: do not make the egress types available only on linux
+      sgw: initialise the egress best routes differently
+      sgw: remove an unused variable
+      sgw: unshadow a variable
+      sgw: change the cached timestamp
+      build: make TOPDIR an absolute path
+      sgw: android has no getline(), implement it
+      android: bump the NDK compiler version
+      android: fixup regex makefile
+      sgw: fix android build
+      pud: duplicate android regex trick from nameservice
+      sgw: always clear egress settings when this egress file is not readable
+      Revert "sgw: always clear egress settings when this egress file is not
+         readable"
+      sgw: always clear egress settings when this egress file is not readable
+      sgw: refresh the advertised speed when the best overall link changes
+      sgw: when there is no best overall link advertise 0 bandwidth
+      sgw: only advertise egress speeds
+      sgw: refactor egress file change detection
+      sgw: uplink and downlink fields can be 9 chars wide in the output file
+      sgw: tune the status file for IPv4, making it a bit more compact
+      sgw: use MAX_SMARTGW_SPEED instead of hard-coding it
+      sgw: fix cost calculation for advertised speeds greater or equal than MAX
+      sgw: the costs are signed numbers
+      sgw: react to path cost changes on all active gateways
+      txtinfo: fix output of /sgw command
+      build: uberclean must also remove builddata.txt
+      build: add some pud targets
+      Rename 'struct interface' to 'struct interface_olsr'
+
+Henning Rogge (6):
+      Update version after release of v0.6.7.1
+      Only use IPV6_TCLASS and IPV6_V6ONLY when defined
+      Merge branch 'master' of git://olsr.org/olsrd
+      Prevent memory leak when setting up new interface
+      Fix bug of former commit
+      Release v0.6.8
+
+Nico Geyso (1):
+      dyn gw plugin - add PingCmd parameter
+
 0.6.7.1 -------------------------------------------------------------------
 
 Ferry Huberts (6):
index 4bb4590..103aea3 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -39,9 +39,9 @@
 # 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.7.2
+VERS =         pre-0.6.9
 
-TOPDIR = .
+TOPDIR = $(shell pwd)
 INSTALLOVERWRITE ?=
 include Makefile.inc
 
@@ -71,7 +71,16 @@ endif
 .PHONY: default_target switch
 default_target: $(EXENAME)
 
-$(EXENAME):    $(OBJS) src/builddata.o
+ANDROIDREGEX=
+ifeq ($(OS),android)
+# On Android Google forgot to include regex engine code for Froyo version (but also there was
+# no support in older versions for it) so we have here this missing code.
+# http://groups.google.com/group/android-ndk/browse_thread/thread/5ea6f0650f0e3fc
+CFLAGS += -D__POSIX_VISIBLE
+ANDROIDREGEX=$(REGEX_LIB)
+endif
+
+$(EXENAME):    $(OBJS) $(ANDROIDREGEX) src/builddata.o
 ifeq ($(VERBOSE),0)
                @echo "[LD] $@"
 endif
@@ -350,9 +359,6 @@ mdns_uninstall:
 # no targets for mini: it's an example plugin
 #
 
-# nameserver uses regex, which was only recently added to Android.  On
-# Android, $(REGEX_OBJS) will have all of the files needed, on all
-# other platforms, it'll be empty and therefore ignored.
 nameservice:
                $(MAKECMDPREFIX)$(MAKECMD) -C lib/nameservice clean
                $(MAKECMDPREFIX)$(MAKECMD) -C lib/nameservice
index 52f1bea..b5ce50f 100644 (file)
@@ -278,26 +278,59 @@ All other parameters will be ignored if SmartGateway is set to "no"
    set). This setting can contain multiple interfaces, for example
      SmartGatewayEgressInterfaces "eth0" "eth1" "ppp0"
    The default setting is <not set>.
-5- SmartGatewayTablesOffset and SmartGatewayRulesOffset determine the ranges of
+5- SmartGatewayEgressFile declares the file that contains the bandwidth
+   parameters of the egress interfaces declared by SmartGatewayEgressInterfaces.
+   Every line in the file declares bandwidth parameters of an egress interface,
+   with the format:
+     # this is a comment
+     interface=upstream,downstream,pathcost,network/prefix,gateway
+   Only the upstream and downstream fields are mandatory, the other fields are
+   optional. An empty field signifies that its default should be used.
+   The field defaults are:
+     upstream           = 0 (Kbps)
+     downstream         = 0 (Kbps)
+     pathcost           = 0 (dimensionless, 1024 is equivalent to 1 hop)
+     network/prefix     = no default / not set
+                          - network is an IP address
+                          - prefix is a number in the range [0, 24] for IPv4
+                            and in the range [0, 128] for IPv6
+     gateway            = no default / not set (IP address)
+   Note that when an interface needs a gateway to properly transport traffic
+   then the gateway IP address field MUST be set; doing otherwise will
+   result in non-functional routes being programmed. When an interface doesn't
+   need a gateway (for example a ppp interface) then the gateway IP address
+   field must be left empty.
+   Also note that when an interface has an attached network (like an Ethernet
+   interface, but not like a ppp interface) then the network/prefix field must
+   be set in order for a network route to be programmed.
+   The default setting is "/var/run/olsrd-sgw-egress.conf".
+6- SmartGatewayEgressFilePeriod determines the period (in milliseconds) on which
+   the SmartGatewayEgressFile is checked for changes and processed if changed.
+   The default setting is 5000.
+7- SmartGatewayStatusFile declares the file that is written by olsrd to contain
+   the status of the smart gateways and is only relevant when
+   SmartGatewayUseCount is larger than 1.
+   The default setting is <not set>
+8- SmartGatewayTablesOffset and SmartGatewayRulesOffset determine the ranges of
    policy routing rule markings that are used in a multi-gateway setup (see the
    policy routing script for an explanation).
    The default settings are 90 and 0 respectively. The value of 0 for
    SmartGatewayRulesOffset will automatically align the table and rule numbers
    for the server tunnel, egress interfaces and gateway tunnel interfaces.
-6- SmartGatewayAllowNAT controls whether you want to allow the selection
+9- SmartGatewayAllowNAT controls whether you want to allow the selection
    of an outgoing ipv4 gateway with NAT (Network Address Translation).
    The default setting is "yes".
-7- SmartGatewayPeriod determines the period (in milliseconds) on which
+10-SmartGatewayPeriod determines the period (in milliseconds) on which
    a new smart gateway selection is performed.
    The default setting is 10000 milliseconds.
-8- SmartGatewayStableCount determines the number of times the same new gateway
+11-SmartGatewayStableCount determines the number of times the same new gateway
    must be chosen before that new smart gateway is actually selected.
    The default setting is 6.
-9- SmartGatewayThreshold (percentage) controls whether you want to allow
+12-SmartGatewayThreshold (percentage) controls whether you want to allow
    re-selection of a new outgoing gateway if its routing cost is lower or equal
    to the configured percentage of the routing cost of the current gateway.
    The default setting is 0, which disables it.
-10-SmartGatewayWeightExitLinkUp, SmartGatewayWeightExitLinkDown,
+13-SmartGatewayWeightExitLinkUp, SmartGatewayWeightExitLinkDown,
    SmartGatewayWeightEtx and SmartGatewayDividerEtx control the weighing
    of gateway bandwidth and ETX costs.
 
index 949de42..3382431 100644 (file)
@@ -9,20 +9,19 @@ Building olsrd for Android
 --------------------------
 
 In order to build olsrd and the plugins for Android, you will need to
-download the free (as in beer, and mostly as in speech) Android NDK.  NDK r8b
-or later is the best to have.  Almost everything can be built with NDK r6
-or maybe earlier. The pud plugin requires NDK r8.
+download the free (as in beer, and mostly as in speech) Android NDK.  NDK r10
+or later is the best to have.
 
 http://developer.android.com/sdk/ndk/index.html
 
 Once you have that installed, run this in your terminal:
 
-  make OS=android NDK_BASE=/path/to/your/android-ndk-r8b build_all
+  make OS=android NDK_BASE=/path/to/your/android-ndk-r10 build_all
 
 Then you can find olsrd in the root, and the plugin files in lib/*/*.so*
 
-If using NDK older than r8, you will need to set the NDK_COMPILER_VERSION to
-4.4.3 since the default compilter version, 4.6, was not included until NDK r8b.
+If using NDK older than r10, you will need to set the NDK_COMPILER_VERSION to
+4.4.3 since the default compiler version, 4.8, was not included until NDK r9.
 Here's how:
 
   make OS=android NDK_BASE=/path/to/your/android-ndk-r7 \
index 5ba4b61..1a24c96 100644 (file)
@@ -7,7 +7,7 @@ CFLAGS += -fPIC
 
 all: $(REGEX_LIB)
 
-.c.o:
+%.o: %.c
 ifeq ($(VERBOSE),0)
        @echo "[CC] $<"
 endif
index 3531a70..2f19ca8 100644 (file)
@@ -3,9 +3,9 @@ SRC +=  $(wildcard ./src/*.c)
 OBJS = $(SRC:.c=.o)
 
 CC = gcc
-CFLAGS = -c -g -Wall -Werror -I./src
+CFLAGS = -c -g -Wall -Werror -I./src -I../../src
 LFLAGS = -g -Wall 
-BUILDLIBS = -lpcap -Wl
+BUILDLIBS = -lpcap
 
 .c.o:
        ${CC} ${CFLAGS} -o $@ $^
index fae45b3..4da2666 100644 (file)
@@ -44,6 +44,7 @@
 
 #include "config.h"
 #include "network_tap.h"
+#include "olsr_random.h"
 
 int debugMode = 0;
 
@@ -202,7 +203,7 @@ capture_callback(u_char * args, const struct pcap_pkthdr *hdr, const u_char * pa
       prop = connBC[GRID(*index, i, deviceCount)];
     }
 
-    if (prop == 0 || prop < (rand() % (1 << 24))) {
+    if (prop == 0 || prop < (olsr_random() % (1 << 24))) {
       continue;
     }
 
diff --git a/files/.gitignore b/files/.gitignore
new file mode 100644 (file)
index 0000000..c47c727
--- /dev/null
@@ -0,0 +1,2 @@
+/olsrd.conf.*.txt
+!/olsrd.conf.default.full.txt
diff --git a/files/README b/files/README
new file mode 100644 (file)
index 0000000..cef02e9
--- /dev/null
@@ -0,0 +1,15 @@
+This directory contains a set of configuration files:
+* olsrd.conf.commotion
+* olsrd.conf.default.full
+* olsrd.conf.default.lq
+* olsrd.conf.default.rfc
+* olsrd.conf.funkfeuer
+
+
+To generate the corresponding effective configuration file (*.txt) with
+comments on the parameters, run olsrd with the configuration file or your
+choice and then use either of the following plugins:
+ * HTTPINFO
+   - run: wget -O olsrd.conf  http://localhost:1978/cfgfile
+ * JSONINFO
+   - run: echo "/olsrd.conf" | nc localhost 9090'
\ No newline at end of file
diff --git a/files/generateEffectiveConfigurationFile b/files/generateEffectiveConfigurationFile
new file mode 100755 (executable)
index 0000000..59be46b
--- /dev/null
@@ -0,0 +1,162 @@
+#!/bin/bash
+
+set -e
+set -u
+
+configFileTmp=""
+function exitTrapHandler() {
+  local -i exitCode=${?}
+
+  if [ -n "$configFileTmp" ]; then
+    rm -f "$configFileTmp"
+  fi
+
+  if [[ ${exitCode} -ne 0 ]]; then
+    echo "Exiting with code ${exitCode}"
+  fi
+  exit ${exitCode}
+}
+
+trap exitTrapHandler EXIT
+
+
+script="$0"
+scriptDir="$(dirname "$script")"
+pushd "$scriptDir" &> /dev/null
+scriptDir="$(pwd)"
+popd &> /dev/null
+baseDir="$(dirname "$scriptDir")"
+
+olsrd="$baseDir/olsrd"
+
+arprefreshLib="$baseDir/lib/arprefresh/olsrd_arprefresh.so.0.1"
+arprefreshLibDir="$(dirname "$arprefreshLib")"
+dyngwLib="$baseDir/lib/dyn_gw/olsrd_dyn_gw.so.0.5"
+dyngwLibDir="$(dirname "$dyngwLib")"
+httpinfoLib="$baseDir/lib/httpinfo/olsrd_httpinfo.so.0.1"
+httpinfoLibDir="$(dirname "$httpinfoLib")"
+jsoninfoLib="$baseDir/lib/jsoninfo/olsrd_jsoninfo.so.0.0"
+jsoninfoLibDir="$(dirname "$jsoninfoLib")"
+nameserviceLib="$baseDir/lib/nameservice/olsrd_nameservice.so.0.3"
+nameserviceLibDir="$(dirname "$nameserviceLib")"
+p2pdinfoLib="$baseDir/lib/p2pd/olsrd_p2pd.so.0.1.0"
+p2pdinfoLibDir="$(dirname "$p2pdinfoLib")"
+txtinfoLib="$baseDir/lib/txtinfo/olsrd_txtinfo.so.0.1"
+txtinfoLibDir="$(dirname "$txtinfoLib")"
+
+
+# Check root
+if [ ! "$(whoami)" = "root" ]; then
+  echo "ERROR: must be root."
+  exit 1
+fi
+
+
+# Check nc
+set +e
+nc="$(which nc 2> /dev/null)"
+set -e
+if [ -z "$nc" ]; then
+  echo "ERROR: nc doesn't seem to be installed."
+  exit 1
+fi
+
+
+# Check compiled
+for i in "$olsrd" \
+         "$arprefreshLib" \
+         "$dyngwLib" \
+         "$httpinfoLib" \
+         "$jsoninfoLib" \
+         "$nameserviceLib" \
+         "$p2pdinfoLib" \
+         "$txtinfoLib"; do
+  if [ ! -r "$i" ]; then
+    echo "ERROR: $i is not readable."
+    exit 1
+  fi
+done
+
+
+# Check parameters
+if [ $# -ne 2 ]; then
+  echo "ERROR: specify network interface and configuration file."
+  exit 1
+fi
+
+nwif="$1"
+configFile="$2"
+
+# Check network interfaces
+set +e
+nwifGrep="$(cat /proc/net/dev | grep -E "^[[:space:]]*$nwif[[:space:]]*:[[:space:]]+.*\$")"
+set -e
+
+if [ -z "$nwifGrep" ]; then
+  echo "ERROR: network interface $nwif doesn't exist."
+  exit 1
+fi
+
+
+# Check configuration file
+if [ ! -r "$configFile" ]; then
+  echo "ERROR: configuration file $configFile is not readable."
+  exit 1
+fi
+
+configFileDir="$(dirname "$configFile")"
+pushd "$configFileDir" &> /dev/null
+configFileDir="$(pwd)"
+popd &> /dev/null
+configFile="$configFileDir/$(basename "$configFile")"
+
+
+# Generate adjusted configuration file
+regex="^([[:space:]]*[Ii][Nn][Tt][Ee][Rr][Ff][Aa][Cc][Ee][[:space:]]+)"
+configFileTmp="$(mktemp)"
+sed -r "s/$regex\"wlan0\"/\1\"$nwif\"/" \
+       "$configFile" \
+       > "$configFileTmp"
+
+
+echo "Stopping all olsrd instances"
+set +e
+killall "$(basename "$olsrd")"
+set -e
+
+
+echo "Starting $(basename "$olsrd")"
+export LD_LIBRARY_PATH="$arprefreshLibDir:$dyngwLibDir:$httpinfoLibDir:$jsoninfoLibDir:$nameserviceLibDir:$p2pdinfoLibDir:$txtinfoLibDir"
+"$olsrd" -f "$configFileTmp" -nofork & #> /dev/null &
+
+
+sleep 1
+echo -n "Sleeping a bit "
+for i in 3 2 1; do
+  echo -n "$i"
+  sleep 1
+done
+echo ""
+
+
+echo "Generating effective configuration file"
+echo "  $configFile.txt"
+echo "/olsrd.conf" | \
+  nc localhost 9090 | \
+  tail -n +6 | \
+  sed -r "s/$regex\"$nwif\"/\1\"wlan0\"/" \
+  > "$configFile.txt"
+chown --reference="$configFile" "$configFile.txt"
+
+
+echo "Stopping all $(basename "$olsrd") instances"
+set +e
+killall "$(basename "$olsrd")"
+set -e
+
+
+rm -f "$configFileTmp"
+configFileTmp=""
+
+sleep 1
+echo ""
index 029e600..83711b1 100644 (file)
@@ -1,18 +1,21 @@
-
 # http://commotionwireless.net/
 
-DebugLevel 0
-AllowNoInt yes
-IpVersion 4
-LinkQualityLevel 2
-LinkQualityAlgorithm "etx_ffeth"
-SmartGateway yes
+DebugLevel                     0
+AllowNoInt                     yes
+IpVersion                      4
+LinkQualityLevel               2
+LinkQualityAlgorithm           "etx_ffeth"
+SmartGateway                   yes
 
 Hna4
 {
-#              101.149.21.0 255.255.255.0
-#              102.149.21.0 255.255.255.0
-#              103.149.21.0 255.255.255.0
+    # 101.149.21.0 255.255.255.0
+    # 102.149.21.0 255.255.255.0
+    # 103.149.21.0 255.255.255.0
+}
+
+Interface "wlan0"
+{
 }
 
 LoadPlugin "olsrd_arprefresh.so.0.1"
@@ -26,33 +29,32 @@ LoadPlugin "olsrd_dyn_gw.so.0.5"
 LoadPlugin "olsrd_nameservice.so.0.3"
 {
     # you should set this to your own node name
-       PlParam "name" "commotion-7814921"
-       PlParam "sighup-pid-file" "/var/run/dnsmasq.pid"
-       PlParam "suffix" ".mesh"
+    PlParam "name"             "commotion-7814921"
+    PlParam "sighup-pid-file"  "/var/run/dnsmasq.pid"
+    PlParam "suffix"           ".mesh"
 }
 
 LoadPlugin "olsrd_p2pd.so.0.1.0"
 {
-       PlParam "NonOlsrIf" "eth0"
-       PlParam "P2pdTtl" "5"
-       PlParam "UdpDestPort" "224.0.0.251 5353"
+    PlParam "NonOlsrIf"        "eth0"
+    PlParam "P2pdTtl"          "5"
+    PlParam "UdpDestPort"      "224.0.0.251 5353"
 }
 
 LoadPlugin "olsrd_jsoninfo.so.0.0"
 {
-#      PlParam "accept" "0.0.0.0"
+    # PlParam "accept"         "0.0.0.0"
 }
 
 LoadPlugin "olsrd_txtinfo.so.0.1"
 {
-#      PlParam "accept" "0.0.0.0"
+    # PlParam "accept"         "0.0.0.0"
 }
 
 InterfaceDefaults
 {
-    # if you using this on Mac OS X, then comment this out because Mac OS X
+    # If you using this on Mac OS X, then comment this out because Mac OS X
     # does weird things with 255.255.255.255. By commenting this out, olsrd
     # will use the broadcast that's assigned to the network interface
-       Ip4Broadcast 255.255.255.255
-}
-
+    Ip4Broadcast               255.255.255.255
+}
\ No newline at end of file
index f4fa14a..bb80d41 100644 (file)
-#
-# OLSR.org routing daemon config file
-# This file contains ALL available options and explanations about them
-#
-# Lines starting with a # are discarded
-#
-
-#### ATTENTION for IPv6 users ####
-# Because of limitations in the parser IPv6 addresses must NOT
-# begin with a ":", so please add a "0" as a prefix.
-
-###########################
-### Basic configuration ###
-###########################
-# keep this settings at the beginning of your first configuration file
-
-# Debug level (0-9)
-# If set to 0 the daemon runs in the background, unless "NoFork" is set to true
-# (Default is 1)
-
-# DebugLevel  1
-
-# IP version to use (4 or 6)
-# (Default is 4)
-
-# IpVersion 4
-
-#################################
-### OLSRd agent configuration ###
-#################################
-# this parameters control the settings of the routing agent which are not
-# related to the OLSR protocol and it's extensions
-
-# Clear the screen each time the internal state changes
-# (Default is yes)
-
-# ClearScreen     yes
-
-# Should olsrd keep on running even if there are
-# no interfaces available? This is a good idea
-# for a PCMCIA/USB hotswap environment.
-# (Default is yes)
-
-# AllowNoInt  yes
-
-# LockFile
-# The lockfile is used to prevent multiple OLSR instances running at the same
-# time.
-# (Linux/BSD default is "/var/run/olsrd-ipv(4/6).lock")
-# (Win32 default is "<configfile>-ipv(4/6).lock")
-
-# LockFile "olsrd.lock"
-
-# Polling rate for OLSR sockets in seconds (float). 
-# (Default is 0.05)
-
-# Pollrate  0.05
-
-# Interval to poll network interfaces for configuration changes (in seconds).
-# Linux systems can detect interface statechange via netlink sockets.
-# (Defaults is 2.5)
-
-# NicChgsPollInt  2.5
-
-# TOS(type of service) byte value for the IP header of control traffic.
-# Must be multiple of 4, because OLSR doesn't use ECN
-# (Default is 192, CS6 - Network Control)
-
-# TosValue 192
-
-# FIBMetric controls the metric value of the host-routes OLSRd sets.
-# - "flat" means that the metric value is always 2 (or as configured 
-#   with FIBMetricDefault). This is the preferred value because it helps 
-#   the linux kernel routing to clean up older routes.
-# - "correct" use the hopcount as the metric value.
-# - "approx" use the hopcount as the metric value too, but does only update the
-#   hopcount if the nexthop changes too
-# (Default is "flat")
-
-# FIBMetric "flat"
-# FIBMetricDefault 2
-
-#######################################
-### Linux specific OLSRd extensions ###
-#######################################
-# these parameters are only working on linux at the moment, but might become
-# useful on BSD in the future
-
-# SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip
-# of the node. In addition to this an additional localhost device is created
-# to make sure the returning traffic can be received.
-# (Default is "no")
-
-# SrcIpRoutes no
-
-# Specify the proto tag to be used for routes olsr inserts into kernel
-# currently only implemented for linux
-# valid values under linux are 1 .. 254
-# 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects)
-# 2 KERNEL routes (not very wise to use)
-# 3 BOOT (should in fact not be used by routing daemons)
-# 4 STATIC 
-# 8 .. 15 various routing daemons (gated, zebra, bird, & co)
-# (defaults to 0 which gets replaced by an OS-specific default value
-# under linux 3 (BOOT) (for backward compatibility)
-
-# RtProto 0
-
-# Specifies the routing Table olsr uses
-# RtTable is for host routes, RtTableDefault for the route to the default
-# internet gateway (2 in case of IPv6+NIIT) and RtTableTunnel is for
-# routes to the ipip tunnels, valid values are 1 to 254
-# There is a special parameter "auto" (choose default below)
-# (with smartgw: default is 254/223/224)
-# (without smartgw: default is 254/254/254, linux main table)
-
-# RtTable auto
-# RtTableDefault auto
-# RtTableTunnel auto
-
-# Specifies the policy rule priorities for the three routing tables and
-# a special rule for smartgateway routing (see README-Olsr-Extensions)
-# Priorities can only be set if three different routing tables are set.
-# if set the values must obey to condition
-# RtTablePriority < RtTableDefaultOlsrPriority
-# < RtTableTunnelPriority < RtTableDefaultPriority.
-# There are two special parameters, "auto" (choose fitting to SmartGW
-# mode) and "none" (do not set policy rule)
-# (with smartgw: default is none/32776/32776/32796)
-# (without smartgw: default is none/none/none/none)
-
-# RtTablePriority auto
-# RtTableDefaultOlsrPriority auto
-# RtTableTunnelPriority auto
-# RtTableDefaultPriority auto
-
-# Activates (in IPv6 mode) the automatic use of NIIT
-# (see README-Olsr-Extensions)
-# (default is "yes")
-
-# UseNiit yes
-
-# Activates the smartgateway ipip tunnel feature.
-# See README-Olsr-Extensions for a description of smartgateways.
-# (default is "no")
-
-# SmartGateway no
-
-# Signals that the server tunnel must always be removed on shutdown,
-# irrespective of the interface up/down state during startup.
-# (default is "no")
-
-# SmartGatewayAlwaysRemoveServerTunnel no
-
-# Determines the maximum number of gateways that can be in use at any given
-# time. This setting is used to mitigate the effects of breaking connections
-# (due to the selection of a new gateway) on a dynamic network.
-# (default is 1)
-
-# SmartGatewayUseCount 1
-
-# Determines the take-down percentage for a non-current smart gateway tunnel.
-# If the cost of the current smart gateway tunnel is less than this percentage
-# of the cost of the non-current smart gateway tunnel, then the non-current smart
-# gateway tunnel is taken down because it is then presumed to be 'too expensive'.
-# This setting is only relevant when SmartGatewayUseCount is larger than 1;
-# a value of 0 will result in the tunnels not being taken down proactively.
-# (default is 0)
-
-# SmartGatewayTakeDownPercentage 0
-
-# Determines the policy routing script that is executed during startup and
-# shutdown of olsrd. The script is only executed when SmartGatewayUseCount
-# is set to a value larger than 1. The script must setup policy routing
-# rules such that multi-gateway mode works. A sample script is included.
-# (default is not set)
-
-# SmartGatewayPolicyRoutingScript ""
-
-# Determines the egress interfaces that are part of the multi-gateway setup and
-# therefore only relevant when SmartGatewayUseCount is larger than 1 (in which
-# case it must be explicitly set).
-# (default is not set)
-
-# SmartGatewayEgressInterfaces ""
-
-# Determines the routing tables offset for multi-gateway policy routing tables
-# See the policy routing script for an explanation.
-# (default is 90)
-
-# SmartGatewayTablesOffset 90
-
-# Determines the policy routing rules offset for multi-gateway policy routing
-# rules. See the policy routing script for an explanation.
-# (default is 0, which indicates that the rules and tables should be aligned and
-# puts this value at SmartGatewayTablesOffset - # egress interfaces -
-# # olsr interfaces)
-
-# SmartGatewayRulesOffset 87
-
-# Allows the selection of a smartgateway with NAT (only for IPv4)
-# (default is "yes")
-
-# SmartGatewayAllowNAT yes
-
-# Determines the period (in milliseconds) on which a new smart gateway
-# selection is performed.
-# (default is 10000 milliseconds)
-
-# SmartGatewayPeriod 10000
-
-# Determines the number of times the link state database must be stable
-# before a new smart gateway is selected.
-# (default is 6)
-
-# SmartGatewayStableCount 6
-
-# When another gateway than the current one has a cost of less than the cost
-# of the current gateway multiplied by SmartGatewayThreshold then the smart
-# gateway is switched to the other gateway. The unit is percentage.
-# (defaults to 0)
-
-# SmartGatewayThreshold 0
-
-# The weighing factor for the gateway uplink bandwidth (exit link, uplink).
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 1)
-
-# SmartGatewayWeightExitLinkUp 1
-
-# The weighing factor for the gateway downlink bandwidth (exit link, downlink).
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 1)
-
-# SmartGatewayWeightExitLinkDown 1
-
-# The weighing factor for the ETX costs.
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 1)
-
-# SmartGatewayWeightEtx 1
-
-# The divider for the ETX costs.
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 0)
-
-# SmartGatewayDividerEtx 0
-
-# Defines what kind of Uplink this node will publish as a
-# smartgateway. The existence of the uplink is detected by
-# a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3.
-# possible values are "none", "ipv4", "ipv6", "both"
-# (default is "both")
-
-# SmartGatewayUplink "both"
-
-# Specifies if the local ipv4 uplink use NAT
-# (default is "yes")
-
-# SmartGatewayUplinkNAT yes
-
-# Specifies the speed of the uplink in kilobit/s.
-# First parameter is upstream, second parameter is downstream
-# (default is 128/1024)
-
-# SmartGatewaySpeed 128 1024
-
-# Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix
-# length of more than 64 is not allowed.
-# (default is 0::/0)
-
-# SmartGatewayPrefix 0::/0
-
-# Set to yes will make OLSRd to set the file 
-# /proc/sys/net/ipv4/ip_forward to 1 during startup. It will be
-# restored to the original value during shutdown
-# Set this to no makes OLSRd check the value, if its not 1
-# OLSRd will exit with an error.
-# (default is yes)
-
-# SetIpForward yes
-
-##############################
-### OLSR protocol settings ###
-##############################
-
-# For testing purposes it may be nice to use another port for olsrd
-# for using another port than the IANA assigned one 
-# for a production network, there should be a good reason!!
-# valid values are integers >1, please be careful with using reserved
-# port numbers
-# (default is 698, the IANA assigned olsr-port)
-
-# OlsrPort 698
-
-# Sets the main IP (originator ip) of the router. This IP will NEVER
-# change during the uptime of olsrd.
-# (default is 0.0.0.0, which triggers usage of the IP of the first interface)
-
-# MainIp 10.0.0.1
-
-# The fixed willingness to use (0-7)
-# If not set willingness will be calculated
-# dynamically based on battery/power status
-# (default is 3)
-
-# Willingness     3
-
-# HNA (Host network association) allows the OLSR to announce
-# additional IPs or IP subnets to the net that are reachable
-# through this node.
-# Syntax for HNA4 is "network-address    network-mask"
-# Syntax for HNA6 is "network-address    prefix-length"
-# (default is no HNA)
-Hna4
-{
-# Internet gateway
-# 0.0.0.0   0.0.0.0
-# specific small networks reachable through this node
-# 15.15.0.0 255.255.255.0
-}
-Hna6
+Interface "wlan0"
 {
-# Internet gateway
-#   0::                     0
-# specific small networks reachable through this node
-#   fec0:2200:106:0:0:0:0:0 48
 }
 
-
-# Hysteresis for link sensing (only for hopcount metric)
-# Hysteresis adds more robustness to the link sensing
-# but delays neighbor registration.
-# (defaults to yes)
-
-# UseHysteresis yes
-
-# Hysteresis parameters (only for hopcount metric)
-# Do not alter these unless you know what you are doing!
-# Set to auto by default. Allowed values are floating point
-# values in the interval 0,1
-# THR_LOW must always be lower than THR_HIGH!!
-# (default is 0.5/0.8/0.3)
-
-# HystScaling  0.50
-# HystThrHigh  0.80
-# HystThrLow 0.30
-
-# TC redundancy
-# Specifies how much neighbor info should be sent in
-# TC messages. Because of a design problem in the 0.5.x
-# dijkstra implementation this value must be set to 2.
-# 2 - send all neighbors
-# (default is 2)
-
-# TcRedundancy  2
-
-# MPR coverage specifies how many MPRs a node should
-# try select to reach every 2 hop neighbor. Because of
-# a design problem in the 0.5.x lq mpr selection algorithm
-# this value should be set to 7.
-# (default is 7)
-
-# MprCoverage 7
-
-################################
-### OLSR protocol extensions ###
-################################
-
-# Link quality level switch between hopcount and 
-# cost-based (mostly ETX) routing. Because of
-# a design problem in the 0.5.x dijkstra algorithm this
-# value should not be set to 1.
-# 0 = do not use link quality
-# 2 = use link quality for MPR selection and routing
-# (default is 2)
-
-# LinkQualityLevel 2
-
-# Link quality algorithm (only for lq level 2)
-# (see README-Olsr-Extensions)
-# - "etx_float", a floating point  ETX with exponential aging
-# - "etx_fpm", same as ext_float, but with integer arithmetic
-# - "etx_ff" (ETX freifunk), an etx variant which use all OLSR
-#   traffic (instead of only hellos) for ETX calculation
-# - "etx_ffeth", an incompatible variant of etx_ff that allows
-#   ethernet links with ETX 0.1.
-# (defaults to "etx_ff")
-
-# LinkQualityAlgorithm    "etx_ff"
-
-# Link quality aging factor (only for lq level 2)
-# Tuning parameter for etx_float and etx_fpm, smaller values
-# mean slower changes of ETX value. (allowed values are
-# between 0.01 and 1.0)
-# (default is 0.05)
-
-# LinkQualityAging 0.05
-
-# Fisheye mechanism for TCs (0 meansoff, 1 means on)
-# (default is 1)
-
-# LinkQualityFishEye  1
-
-#
-# NatThreshold 
-#
-# (currently this is only in the freifunk firmware)
-# If the NAT-Endpoint (the preferred 0/0 HNA emitting node)
-# is to be changed, the ETX value of the current 0/0 is 
-# multiplied with the NatThreshold value before being
-# compared to the new one.
-# The parameter can be a value between 0.1 and 1.0, but
-# should be close to 1.0 if changed.
-# WARNING: This parameter should not be used together with
-# the etx_ffeth metric !!
-# (defaults to 1.0)
-
-# NatThreshold  1.0
-
-#############################################################
-### Configuration of the IPC to the windows GUI interface ###
-#############################################################
-
-IpcConnect
-{
-     # Determines how many simultaneously
-     # IPC connections that will be allowed
-     # Setting this to 0 disables IPC
-
-     # MaxConnections  0
-
-     # By default only 127.0.0.1 is allowed
-     # to connect. Here allowed hosts and networks can
-     # be added
-
-     # Host            127.0.0.1
-     # Host            10.0.0.5
-     # Net             192.168.1.0 255.255.255.0     
-}
-
-#####################################
-### Example plugin configurations ###
-#####################################
-# Olsrd plugins to load
-# This must be the absolute path to the file
-# or the loader will use the following scheme:
-# - Try the paths in the LD_LIBRARY_PATH 
-#   environment variable.
-# - The list of libraries cached in /etc/ld.so.cache
-# - /lib, followed by /usr/lib
-#
-# the examples in this list are for linux, so check if the plugin is
-# available if you use windows/BSD.
-# each plugin should have a README file in it's lib subfolder
-
-# LoadPlugin "olsrd_httpinfo.dll"
 LoadPlugin "olsrd_httpinfo.so.0.1"
 {
-    # port number the httpinfo plugin will be listening, default 1978
-#   PlParam     "port"   "8000"
-    
-    # ip address that can access the plugin, use "0.0.0.0"
-    # to allow everyone
-    PlParam     "Host"   "127.0.0.1"
-#   PlParam     "Host"   "80.23.53.22"
-    
-    # networks that can access the plugin (ip/netmask)
-    # careful with 0.0.0.0/0, makes (ddos) attacks poss.
-#   PlParam     "Net"    "0.0.0.0 0.0.0.0"
-    PlParam     "Net"    "104.0.0.0 255.255.0.0"
-    PlParam     "Net"    "192.168.0.0 255.255.0.0"
-}
-
-# LoadPlugin "olsrd_txtinfo.dll"
-LoadPlugin "olsrd_txtinfo.so.0.1"
-{
-    # the default port is 2006 but you can change it like this:
-    #PlParam     "port"   "8080"
-
-    # You can set a "accept" single address to allow to connect to
-    # txtinfo. If no address is specified, then localhost (127.0.0.1)
-    # is allowed by default.  txtinfo will only use the first "accept"
-    # parameter specified and will ignore the rest.
-
-    # to allow a specific host:
-    #PlParam      "accept" "172.29.44.23"
-    # if you set it to 0.0.0.0, it will accept all connections
-    #PlParam      "accept" "0.0.0.0"
 }
 
-# LoadPlugin "olsrd_jsoninfo.dll"
 LoadPlugin "olsrd_jsoninfo.so.0.0"
 {
-    # the default port is 2006 but you can change it like this:
-    #PlParam     "port"   "8080"
-
-    # You can set a "accept" single address to allow to connect to
-    # jsoninfo. If no address is specified, then localhost (127.0.0.1)
-    # is allowed by default.  jsoninfo will only use the first "accept"
-    # parameter specified and will ignore the rest.
-
-    # to allow a specific host:
-    #PlParam      "accept" "172.29.44.23"
-    # if you set it to 0.0.0.0, it will accept all connections
-    #PlParam      "accept" "0.0.0.0"
-
-    # specify a UUID for this node to track it for debugging
-    #PlParam      "UUIDFile" "/etc/olsrd/olsrd.uuid"
-}
-
-#LoadPlugin "olsrd_secure.so.0.3"
-#{
-    # define source of keyfile for secure plugin
-    # see lib/secure/README_SECURE for more information
-    
-#   PlParam     "Keyfile"   "/etc/olsr-keyfile.txt"
-#}
-
-#LoadPlugin "olsrd_dyn_gw.so.0.5"
-#{
-    # The plugin check interval can be set here in milliseconds.
-    # The default is 1000 ms (1 second).
-#    PlParam     "CheckInterval"  "5000"
-    
-    # The ping check interval in case there is any pinged host specified.
-    # The default is 5 seconds.
-#    PlParam     "PingInterval"   "40"
-    
-    # If one or more IPv4 addresses are given, do a ping on these in
-    # descending order to validate that there is not only an entry in
-    # routing table, but also a real network connection. If any of
-    # these addresses could be pinged successfully, the test was
-    # succesful, i.e. if the ping on the 1st address was successful,the
-    # 2nd won't be pinged.
-    #
-    # The Ping list applies to the group of HNAs specified above or to the 
-               # default internet gateway when no HNA is specified.
-               #
-               # Running the plugin without parameters acts as the 'old' dyn_gw_plain.
-    
-    #   The following ping entries for the internet gateway
-#    PlParam "Ping"   "141.1.1.1"
-#    PlParam "Ping"   "194.25.2.129"
-    
-    #   First group of HNAs with related ping host
-#    PlParam   "HNA"      "192.168.80.0 255.255.255.0"
-#    PlParam   "HNA"      "192.168.81.0 255.255.255.0"
-#    PlParam   "Ping"   "192.168.81.12"
-    
-    #   Second HNA group with multiple related ping hosts.
-    #   Specifying multiple ping hosts provides redundancy.
-#    PlParam "HNA"    "192.168.100.0 255.255.255.0"
-#    PlParam "HNA"    "192.168.101.0 255.255.255.0"
-#    PlParam "HNA"    "192.168.102.0 255.255.255.0"
-#    PlParam "Ping"   "192.168.100.10"
-#    PlParam "Ping"   "192.168.101.10"
-    
-    #   Third HNA group without ping check
-#    PlParam "HNA"    "192.168.200.0 255.255.255.0"
-#    PlParam "HNA"    "192.168.201.0 255.255.255.0"
-#    PlParam "HNA"    "192.168.202.0 255.255.255.0"
-#}
-
-#LoadPlugin "olsrd_dyn_gw_plain.so.0.4"
-#{
-#}
-
-#############################################
-### OLSRD default interface configuration ###
-#############################################
-# the default interface section can have the same values as the following
-# interface configuration. It will allow you so set common options for all
-# interfaces.
-
-InterfaceDefaults {
-    # Ip4Broadcast      255.255.255.255
-}
-
-######################################
-### OLSRd Interfaces configuration ###
-######################################
-# multiple interfaces can be specified for a single configuration block
-# multiple configuration blocks can be specified
-
-# WARNING, don't forget to insert your interface names here !
-Interface "<OLSRd-Interface1>" "<OLSRd-Interface2>"
-{
-    # Interface Mode is used to prevent unnecessary
-    # packet forwarding on switched ethernet interfaces
-    # valid Modes are "mesh" and "ether"
-    # (default is "mesh")
-
-    # Mode "mesh"
-
-    # IPv4 broadcast address for outgoing OLSR packets.
-    # One useful example would be 255.255.255.255
-    # The second useful value would be to
-    # specify the peer address of an ptp-tunnel.
-    # another name of this parameter is "IPv4Multicast"
-    # (default is 0.0.0.0, which triggers the usage of the
-    # interface broadcast IP)
-    
-    # Ip4Broadcast      0.0.0.0
-
-    # IPv6 multicast address
-    # (default is FF02::6D, the manet-router linklocal multicast)
-
-    # IPv6Multicast    FF02::6D
-
-    # IPv4 src address for outgoing OLSR packages
-    # (default is 0.0.0.0, which triggers usage of the interface IP)
-
-    # IPv4Src 0.0.0.0
-
-    # IPv6 src prefix. OLSRd will choose one of the interface IPs
-    # which matches the prefix of this parameter.
-    # (default is 0::/0, which triggers the usage
-    # of a not-linklocal interface IP)
-
-    # IPv6Src 0::/0
-    
-    # Emission intervals in seconds.
-    # If not defined, Freifunk network defaults are used
-    # (default is 2.0/20.0 for Hello and 5.0/300.0 for Tc/Mid/Hna)
-
-    # HelloInterval       2.0
-    # HelloValidityTime  20.0
-    # TcInterval          5.0
-    # TcValidityTime    300.0
-    # MidInterval         5.0
-    # MidValidityTime   300.0
-    # HnaInterval         5.0
-    # HnaValidityTime   300.0
-    
-    # When multiple links exist between hosts
-    # the weight of interface is used to determine
-    # the link to use. Normally the weight is
-    # automatically calculated by olsrd based
-    # on the characteristics of the interface,
-    # but here you can specify a fixed value.
-    # Olsrd will choose links with the lowest value.
-    # Note:
-    # Interface weight is used only when LinkQualityLevel is set to 0.
-    # For any other value of LinkQualityLevel, the interface ETX
-    # value is used instead.
-    # Weight 0
-
-    # If a certain route should be preferred 
-    # or ignored by the mesh, the Link Quality 
-    # value of a node can be multiplied with a factor 
-    # entered here. In the example the route 
-    # using 192.168.0.1 would rather be ignored.
-    # A multiplier of 0.5 will result in a small
-    # (bad) LinkQuality value and a high (bad)
-    # ETX value.
-    # Note:
-    # Link quality multiplier is used only when
-    # LinkQualityLevel is > 0.
-
-    # example 1: reduce LQ to 192.168.0.1 by half
-    # LinkQualityMult 192.168.0.1 0.5
-
-    # example 2: reduce LQ to all nodes on this interface by 20%
-    # LinkQualityMult default 0.8
-}
+}
\ No newline at end of file
diff --git a/files/olsrd.conf.default.full.txt b/files/olsrd.conf.default.full.txt
new file mode 100644 (file)
index 0000000..f5c1058
--- /dev/null
@@ -0,0 +1,592 @@
+# OLSR.org routing daemon config file
+# This file contains ALL available options and explanations about them
+#
+# Lines starting with a # are discarded
+#
+
+#### ATTENTION for IPv6 users ####
+# Because of limitations in the parser IPv6 addresses must NOT
+# begin with a ":", so please add a "0" as a prefix.
+
+###########################
+### Basic configuration ###
+###########################
+# keep this settings at the beginning of your first configuration file
+
+# Debug level (0-9)
+# If set to 0 the daemon runs in the background, unless "NoFork" is set to true
+# (default is 1)
+
+# DebugLevel  1
+
+# IP version to use (4 or 6)
+# (default is 4)
+
+# IpVersion 4
+
+#################################
+### OLSRd agent configuration ###
+#################################
+# this parameters control the settings of the routing agent which are not
+# related to the OLSR protocol and it's extensions
+
+# Clear the screen each time the internal state changes
+# (default is yes)
+
+# ClearScreen     yes
+
+# Should olsrd keep on running even if there are
+# no interfaces available? This is a good idea
+# for a PCMCIA/USB hotswap environment.
+# (default is yes)
+
+# AllowNoInt  yes
+
+# LockFile
+# The lockfile is used to prevent multiple OLSR instances running at the same
+# time.
+# (Linux/BSD default is "/var/run/olsrd-ipv(4/6).lock")
+# (Win32     default is "configfile-ipv(4/6).lock")
+
+# LockFile "/var/run/olsrd-ipv4.lock"
+
+# Polling rate for OLSR sockets in seconds (float).
+# (default is 0.05)
+
+# Pollrate  0.05
+
+# Interval to poll network interfaces for configuration changes (in seconds).
+# Linux systems can detect interface statechange via netlink sockets.
+# (default is 2.5)
+
+# NicChgsPollInt  2.5
+
+# TOS(type of service) value for the IP header of control traffic.
+# (default is 192)
+
+# TosValue 192
+
+# FIBMetric controls the metric value of the host-routes OLSRd sets.
+# - "flat" means that the metric value is always 2 (or as configured
+#   with FIBMetricDefault). This is the preferred value because it helps
+#   the linux kernel routing to clean up older routes
+# - "correct" use the hopcount as the metric value.
+# - "approx" use the hopcount as the metric value too, but does only update the
+#   hopcount if the nexthop changes too
+# (default is "flat")
+
+# FIBMetric "flat"
+
+# Default FIB metric.
+# The kernel FIB does not need to know the metric of a route.
+# This saves us from enqueuing/dequeueing hopcount only changes.
+# (default is 2)
+
+# FIBMetricDefault 2
+
+#######################################
+### Linux specific OLSRd extensions ###
+#######################################
+# these parameters are only working on linux at the moment, but might become
+# useful on BSD in the future
+
+# SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip
+# of the node. In addition to this an additional localhost device is created
+# to make sure the returning traffic can be received.
+# (default is "no")
+
+# SrcIpRoutes no
+
+# Specify the proto tag to be used for routes olsr inserts into kernel
+# currently only implemented for linux
+# valid values under linux are 1 .. 254
+# 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects)
+# 2 KERNEL routes (not very wise to use)
+# 3 BOOT (should in fact not be used by routing daemons)
+# 4 STATIC
+# 8 .. 15 various routing daemons (gated, zebra, bird, & co)
+# (default is 0 which gets replaced by an OS-specific default value;
+# 3 (BOOT) under linux (for backward compatibility)
+
+# RtProto 0
+
+# Specifies the routing Table olsr uses
+# RtTable is for host routes, RtTableDefault for the route to the default
+# internet gateway (2 in case of IPv6+NIIT) and RtTableTunnel is for
+# routes to the ipip tunnels, valid values are 1 to 254
+# There is a special parameter "auto" (choose default below)
+# (with    smartgw: default is 254/223/224)
+# (without smartgw: default is 254/254/254, linux main table)
+
+# RtTable        auto
+# RtTableDefault auto
+# RtTableTunnel  auto
+
+# Specifies the policy rule priorities for the three routing tables and
+# a special rule for smartgateway routing (see README-Olsr-Extensions)
+# Priorities can only be set if three different routing tables are set.
+# if set the values must obey to condition
+# RtTablePriority less than RtTableDefaultOlsrPriority
+# less than RtTableTunnelPriority less than RtTableDefaultPriority
+# There are two special parameters, "auto" (choose fitting to SmartGW
+# mode) and "none" (do not set policy rule)
+# (with    smartgw: default is  none/32776/32786/32796)
+# (without smartgw: default is  auto/auto /auto /auto )
+
+# RtTablePriority            auto
+# RtTableDefaultOlsrPriority auto
+# RtTableTunnelPriority      auto
+# RtTableDefaultPriority     auto
+
+# Activates (in IPv6 mode) the automatic use of NIIT
+# (see README-Olsr-Extensions)
+# (default is "no" in IPv4 mode, "yes" in IPv6 mode)
+
+# UseNiit no
+
+# Activates the smartgateway ipip tunnel feature.
+# See README-Olsr-Extensions for a description of smartgateways.
+# (default is "no")
+
+# SmartGateway no
+
+# Signals that the server tunnel must always be removed on shutdown,
+# irrespective of the interface up/down state during startup.
+# (default is "no")
+
+# SmartGatewayAlwaysRemoveServerTunnel no
+
+# Determines the maximum number of gateways that can be in use at any given
+# time. This setting is used to mitigate the effects of breaking connections
+# (due to the selection of a new gateway) on a dynamic network.
+# (default is 1)
+
+# SmartGatewayUseCount 1
+
+# Determines the take-down percentage for a non-current smart gateway tunnel.
+# If the cost of the current smart gateway tunnel is less than this percentage
+# of the cost of the non-current smart gateway tunnel, then the non-current smart
+# gateway tunnel is taken down because it is then presumed to be 'too expensive'.
+# This setting is only relevant when SmartGatewayUseCount is larger than 1;
+# a value of 0 will result in the tunnels not being taken down proactively.
+# (default is 25)
+
+# SmartGatewayTakeDownPercentage 25
+
+# Determines the policy routing script that is executed during startup and
+# shutdown of olsrd. The script is only executed when SmartGatewayUseCount
+# is set to a value larger than 1. The script must setup policy routing
+# rules such that multi-gateway mode works. A sample script is included.
+# (default is not set)
+
+# SmartGatewayPolicyRoutingScript ""
+
+# Determines the egress interfaces that are part of the multi-gateway setup and
+# therefore only relevant when SmartGatewayUseCount is larger than 1 (in which
+# case it must be explicitly set).
+# (default is not set)
+
+# SmartGatewayEgressInterfaces ""
+
+# SmartGatewayEgressFile declares the file that contains the bandwidth
+# parameters of the egress interfaces declared by SmartGatewayEgressInterfaces.
+# Every line in the file declares bandwidth parameters of an egress interface,
+# with the format:
+#   # this is a comment
+#   interface=upstream,downstream,pathcost,network/prefix,gateway
+# Only the upstream and downstream fields are mandatory, the other fields are
+# optional. An empty field signifies that its default should be used.
+# The field defaults are:
+#   upstream           = 0 (Kbps)
+#   downstream         = 0 (Kbps)
+#   pathcost           = 0 (dimensionless, 1024 is equivalent to 1 hop)
+#   network/prefix     = no default / not set
+#                        - network is an IP address
+#                        - prefix is a number in the range [0, 24] for IPv4
+#                          and in the range [0, 128] for IPv6
+#   gateway            = no default / not set (IP address)
+# (default is /var/run/olsrd-sgw-egress.conf)
+
+# SmartGatewayEgressFile "/var/run/olsrd-sgw-egress.conf"
+
+# Determines the period (in milliseconds) on which the SmartGatewayEgressFile
+# is checked for changes and processed if changed.
+# (default is 5000)
+
+# SmartGatewayEgressFilePeriod 5000
+
+# Declares the file that is written by olsrd to contain the status of the smart
+# gateways and is only relevant when SmartGatewayUseCount is larger than 1.
+# (default is <not set>)
+
+# SmartGatewayStatusFile <not set>
+
+# Determines the routing tables offset for multi-gateway policy routing tables
+# See the policy routing script for an explanation.
+# (default is 90)
+
+# SmartGatewayTablesOffset 90
+
+# Determines the policy routing rules offset for multi-gateway policy routing
+# rules. See the policy routing script for an explanation.
+# (default is 0, which indicates that the rules and tables should be aligned and
+# puts this value at SmartGatewayTablesOffset - # egress interfaces -
+# # olsr interfaces)
+
+# SmartGatewayRulesOffset 0
+
+# Allows the selection of a smartgateway with NAT (only for IPv4)
+# (default is "yes")
+
+# SmartGatewayAllowNAT yes
+
+# Determines the period (in milliseconds) on which a new smart gateway
+# selection is performed.
+# (default is 10000 milliseconds)
+
+# SmartGatewayPeriod 10000
+
+# Determines the number of times the link state database must be stable
+# before a new smart gateway is selected.
+# (default is 6)
+
+# SmartGatewayStableCount 6
+
+# When another gateway than the current one has a cost of less than the cost
+# of the current gateway multiplied by SmartGatewayThreshold then the smart
+# gateway is switched to the other gateway. The unit is percentage.
+# (default is 0)
+
+# SmartGatewayThreshold 0
+
+# The weighing factor for the gateway uplink bandwidth (exit link, uplink).
+# See README-Olsr-Extensions for a description of smart gateways.
+# (default is 1)
+
+# SmartGatewayWeightExitLinkUp 1
+
+# The weighing factor for the gateway downlink bandwidth (exit link, downlink).
+# See README-Olsr-Extensions for a description of smart gateways.
+# (default is 1)
+
+# SmartGatewayWeightExitLinkDown 1
+
+# The weighing factor for the ETX costs.
+# See README-Olsr-Extensions for a description of smart gateways.
+# (default is 1)
+
+# SmartGatewayWeightEtx 1
+
+# The divider for the ETX costs.
+# See README-Olsr-Extensions for a description of smart gateways.
+# (default is 0)
+
+# SmartGatewayDividerEtx 0
+
+# Defines what kind of Uplink this node will publish as a
+# smartgateway. The existence of the uplink is detected by
+# a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3.
+# possible values are "none", "ipv4", "ipv6", "both"
+# (default is "both")
+
+# SmartGatewayUplink "both"
+
+# Specifies if the local ipv4 uplink use NAT
+# (default is "yes")
+
+# SmartGatewayUplinkNAT yes
+
+# Specifies the speed of the uplink in kilobit/s.
+# First parameter is upstream, second parameter is downstream
+# (default is 128/1024)
+
+# SmartGatewaySpeed 128 1024
+
+# Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix
+# length of more than 64 is not allowed.
+# Only relevant when running in IPv6 mode.
+# (default is 0::/0)
+
+# SmartGatewayPrefix ::/0
+
+##############################
+### OLSR protocol settings ###
+##############################
+
+# For testing purposes it may be nice to use another port for olsrd
+# for using another port than the IANA assigned one
+# for a production network, there should be a good reason!!
+# valid values are integers greater than 1, please be careful with
+# using reserved port numbers
+# (default is 698, the IANA assigned olsr-port)
+
+# OlsrPort 698
+
+# Sets the main IP (originator ip) of the router. This IP will NEVER
+# change during the uptime of olsrd.
+# (default is 0.0.0.0, which triggers usage of the IP of the first interface)
+
+MainIp 192.168.181.102
+
+# The fixed willingness to use (0-7)
+# If not set willingness will be calculated
+# dynamically based on battery/power status
+# (default is 3)
+
+# Willingness     3
+
+# HNA (Host network association) allows the OLSR to announce
+# additional IPs or IP subnets to the net that are reachable
+# through this node.
+# Syntax for HNA4 is "network-address    network-mask"
+# Syntax for HNA6 is "network-address    prefix-length"
+# (default is no HNA)
+Hna4
+{
+# Internet gateway
+# 0.0.0.0   0.0.0.0
+# specific small networks reachable through this node
+# 15.15.0.0 255.255.255.0
+}
+Hna6
+{
+# Internet gateway
+#   0::                     0
+# specific small networks reachable through this node
+#   fec0:2200:106:0:0:0:0:0 48
+}
+
+# Hysteresis for link sensing (only for hopcount metric)
+# Hysteresis adds more robustness to the link sensing
+# but delays neighbor registration.
+# (default is no)
+
+# UseHysteresis no
+
+# Hysteresis parameters (only for hopcount metric)
+# Do not alter these unless you know what you are doing!
+# Set to auto by default. Allowed values are floating point
+# values in the interval 0,1
+# THR_LOW must always be lower than THR_HIGH!!
+# (default is 0.50/0.80/0.30)
+
+# HystScaling  0.50
+# HystThrHigh  0.80
+# HystThrLow   0.30
+
+# TC redundancy
+# Specifies how much neighbor info should be sent in
+# TC messages. Because of a design problem in the 0.5.x
+# dijkstra implementation this value must be set to 2.
+# 2 - send all neighbors
+# (default is 2)
+
+# TcRedundancy  2
+
+# MPR coverage specifies how many MPRs a node should
+# try select to reach every 2 hop neighbor. Because of
+# a design problem in the 0.5.x dijkstra algorithm this
+# value should be set to 7.
+# (default is 7)
+
+# MprCoverage 7
+
+################################
+### OLSR protocol extensions ###
+################################
+
+# Link quality level switch between hopcount and
+# cost-based (mostly ETX) routing. Because of
+# a design problem in the 0.5.x dijkstra algorithm this
+# value should not be set to 1.
+# 0 = do not use link quality
+# 2 = use link quality for MPR selection and routing
+# (default is 2)
+
+# LinkQualityLevel 2
+
+# Link quality algorithm (only for lq level 2)
+# (see README-Olsr-Extensions)
+# - "etx_float", a floating point  ETX with exponential aging
+# - "etx_fpm", same as ext_float, but with integer arithmetic
+# - "etx_ff" (ETX freifunk), an etx variant which use all OLSR
+#   traffic (instead of only hellos) for ETX calculation
+# - "etx_ffeth", an incompatible variant of etx_ff that allows
+#   ethernet links with ETX 0.1.
+# (default is "etx_ff")
+
+# LinkQualityAlgorithm    "etx_ff"
+
+# Link quality aging factor (only for lq level 2)
+# Tuning parameter for etx_float and etx_fpm, smaller values
+# mean slower changes of ETX value. (allowed values are
+# between 0.01 and 1.0)
+# (default is 0.05)
+
+# LinkQualityAging 0.05
+
+# Fisheye mechanism for TCs (0 meansoff, 1 means on)
+# (default is 1)
+
+# LinkQualityFishEye  1
+
+#
+# NatThreshold
+#
+# (currently this is only in the freifunk firmware)
+# If the NAT-Endpoint (the preferred 0/0 HNA emitting node)
+# is to be changed, the ETX value of the current 0/0 is
+# multiplied with the NatThreshold value before being
+# compared to the new one.
+# The parameter can be a value between 0.1 and 1.0, but
+# should be close to 1.0 if changed.
+# WARNING: This parameter should not be used together with
+# the etx_ffeth metric !!
+# (default is 1.0)
+
+# NatThreshold  1.0
+
+#############################################################
+### Configuration of the IPC to the windows GUI interface ###
+#############################################################
+
+IpcConnect
+{
+     # Determines how many simultaneously
+     # IPC connections that will be allowed
+     # Setting this to 0 disables IPC
+
+     # MaxConnections  0
+
+     # By default only 127.0.0.1 is allowed
+     # to connect. Here allowed hosts and networks can
+     # be added
+
+     # Host            127.0.0.1
+     # Host            10.0.0.5
+     # Net             192.168.1.0 255.255.255.0
+}
+
+#####################################
+### Example plugin configurations ###
+#####################################
+# Olsrd plugins to load
+# This must be the absolute path to the file
+# or the loader will use the following scheme:
+# - Try the paths in the LD_LIBRARY_PATH
+#   environment variable.
+# - The list of libraries cached in /etc/ld.so.cache
+# - /lib, followed by /usr/lib
+#
+
+# Check whether a plugin is available for your operating system.
+# Each plugin should have a README file in it's lib subfolder.
+
+LoadPlugin "olsrd_jsoninfo.so.0.0" {
+}
+
+LoadPlugin "olsrd_httpinfo.so.0.1" {
+}
+
+#############################################
+### OLSRD default interface configuration ###
+#############################################
+# the default interface section can have the same values as the following
+# interface configuration. It will allow you so set common options for all
+# interfaces.
+
+InterfaceDefaults
+{
+}
+
+######################################
+### OLSRd Interfaces configuration ###
+######################################
+# Multiple interfaces can be specified for a single configuration block, format:
+#   Interface "<OLSRd-Interface1>" "<OLSRd-Interface2>"
+#
+# Multiple configuration blocks can be specified.
+
+Interface "wlan0"
+{
+    # Interface Mode is used to prevent unnecessary
+    # packet forwarding on switched ethernet interfaces
+    # valid Modes are "mesh" and "ether"
+    # (default is "mesh")
+
+    # Mode "mesh"
+
+    # IPv4 broadcast address for outgoing OLSR packets.
+    # One useful example would be 255.255.255.255
+    # The second useful value would be to
+    # specify the peer address of an ptp-tunnel.
+    # another name of this parameter is "IPv4Multicast"
+    # (default is 0.0.0.0, which triggers the usage of the
+    # interface broadcast IP)
+
+    # Ip4Broadcast      0.0.0.0
+
+    # IPv6 multicast address
+    # (default is ff02::6d, the manet-router linklocal multicast)
+
+    # IPv6Multicast ff02::6d
+
+    # IPv4 src address for outgoing OLSR packages
+    # (default is 0.0.0.0, which triggers usage of the interface IP)
+
+    # IPv4Src 0.0.0.0
+
+    # IPv6 src prefix. OLSRd will choose one of the interface IPs
+    # which matches the prefix of this parameter.
+    # (default is 0::/0, which triggers the usage
+    # of a not-linklocal interface IP)
+
+    # IPv6Src ::/0
+
+    # Emission intervals in seconds.
+    # If not defined, Freifunk network defaults are used.
+    # (defaults: Hello = 2.0/20.0,  TC  = 5.0/300.0,
+    #            MID   = 5.0/300.0, HNA = 5.0/300.0)
+
+    # HelloInterval       2.0
+    # HelloValidityTime   20.0
+    # TcInterval          5.0
+    # TcValidityTime      300.0
+    # MidInterval         5.0
+    # MidValidityTime     300.0
+    # HnaInterval         5.0
+    # HnaValidityTime     300.0
+
+    # When multiple links exist between hosts
+    # the weight of interface is used to determine
+    # the link to use. Normally the weight is
+    # automatically calculated by olsrd based
+    # on the characteristics of the interface,
+    # but here you can specify a fixed value.
+    # Olsrd will choose links with the lowest value.
+    # Note:
+    # Interface weight is used only when LinkQualityLevel is set to 0.
+    # For any other value of LinkQualityLevel, the interface ETX
+    # value is used instead.
+    # Weight 0
+
+    # If a certain route should be preferred
+    # or ignored by the mesh, the Link Quality
+    # value of a node can be multiplied with a factor
+    # entered here. In the example the route
+    # using 192.168.0.1 would rather be ignored.
+    # A multiplier of 0.5 will result in a small
+    # (bad) LinkQuality value and a high (bad)
+    # ETX value.
+    # Note:
+    # Link quality multiplier is used only when
+    # LinkQualityLevel is greater than 0.
+
+    # example 1: reduce LQ to 192.168.0.1 by half
+    # LinkQualityMult 192.168.0.1 0.5
+
+    # example 2: reduce LQ to all nodes on this interface by 20%
+    # LinkQualityMult default 0.8
+}
+
+# END AUTOGENERATED CONFIG
index e694e3d..f7c8946 100644 (file)
-#
-# OLSR.org routing daemon config file
-# This file contains the usual options for an ETX based
-# stationary network without fisheye
-# (for other options see olsrd.conf.default.full)
-#
-# Lines starting with a # are discarded
-#
+LinkQualityFishEye             0
 
-#### ATTENTION for IPv6 users ####
-# Because of limitations in the parser IPv6 addresses must NOT
-# begin with a ":", so please add a "0" as a prefix.
-
-###########################
-### Basic configuration ###
-###########################
-# keep this settings at the beginning of your first configuration file
-
-# Debug level (0-9)
-# If set to 0 the daemon runs in the background, unless "NoFork" is set to true
-# (Default is 1)
-
-# DebugLevel  1
-
-# IP version to use (4 or 6)
-# (Default is 4)
-
-# IpVersion 4
-
-#################################
-### OLSRd agent configuration ###
-#################################
-# this parameters control the settings of the routing agent which are not
-# related to the OLSR protocol and it's extensions
-
-# FIBMetric controls the metric value of the host-routes OLSRd sets.
-# - "flat" means that the metric value is always 2. This is the preferred value
-#   because it helps the linux kernel routing to clean up older routes
-# - "correct" use the hopcount as the metric value.
-# - "approx" use the hopcount as the metric value too, but does only update the
-#   hopcount if the nexthop changes too
-# (Default is "flat")
-
-# FIBMetric "flat"
-
-#######################################
-### Linux specific OLSRd extensions ###
-#######################################
-# these parameters are only working on linux at the moment, but might become
-# useful on BSD in the future
-
-# SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip
-# of the node. In addition to this an additional localhost device is created
-# to make sure the returning traffic can be received.
-# (Default is "no")
-
-# SrcIpRoutes no
-
-# Specify the proto tag to be used for routes olsr inserts into kernel
-# currently only implemented for linux
-# valid values under linux are 1 .. 254
-# 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects)
-# 2 KERNEL routes (not very wise to use)
-# 3 BOOT (should in fact not be used by routing daemons)
-# 4 STATIC 
-# 8 .. 15 various routing daemons (gated, zebra, bird, & co)
-# (defaults to 0 which gets replaced by an OS-specific default value
-# under linux 3 (BOOT) (for backward compatibility)
-
-# RtProto 0
-
-# Activates (in IPv6 mode) the automatic use of NIIT
-# (see README-Olsr-Extensions)
-# (default is "yes")
-
-# UseNiit yes
-
-# Activates the smartgateway ipip tunnel feature.
-# See README-Olsr-Extensions for a description of smartgateways.
-# (default is "no")
-
-# SmartGateway no
-
-# Signals that the server tunnel must always be removed on shutdown,
-# irrespective of the interface up/down state during startup.
-# (default is "no")
-
-# SmartGatewayAlwaysRemoveServerTunnel no
-
-# Determines the maximum number of gateways that can be in use at any given
-# time. This setting is used to mitigate the effects of breaking connections
-# (due to the selection of a new gateway) on a dynamic network.
-# (default is 1)
-
-# SmartGatewayUseCount 1
-
-# Determines the take-down percentage for a non-current smart gateway tunnel.
-# If the cost of the current smart gateway tunnel is less than this percentage
-# of the cost of the non-current smart gateway tunnel, then the non-current smart
-# gateway tunnel is taken down because it is then presumed to be 'too expensive'.
-# This setting is only relevant when SmartGatewayUseCount is larger than 1;
-# a value of 0 will result in the tunnels not being taken down proactively.
-# (default is 0)
-
-# SmartGatewayTakeDownPercentage 0
-
-# Determines the policy routing script that is executed during startup and
-# shutdown of olsrd. The script is only executed when SmartGatewayUseCount
-# is set to a value larger than 1. The script must setup policy routing
-# rules such that multi-gateway mode works. A sample script is included.
-# (default is not set)
-
-# SmartGatewayPolicyRoutingScript ""
-
-# Determines the egress interfaces that are part of the multi-gateway setup and
-# therefore only relevant when SmartGatewayUseCount is larger than 1 (in which
-# case it must be explicitly set).
-# (default is not set)
-
-# SmartGatewayEgressInterfaces ""
-
-# Determines the routing tables offset for multi-gateway policy routing tables
-# See the policy routing script for an explanation.
-# (default is 90)
-
-# SmartGatewayTablesOffset 90
-
-# Determines the policy routing rules offset for multi-gateway policy routing
-# rules. See the policy routing script for an explanation.
-# (default is 0, which indicates that the rules and tables should be aligned and
-# puts this value at SmartGatewayTablesOffset - # egress interfaces -
-# # olsr interfaces)
-
-# SmartGatewayRulesOffset 87
-
-# Allows the selection of a smartgateway with NAT (only for IPv4)
-# (default is "yes")
-
-# SmartGatewayAllowNAT yes
-
-# Determines the period (in milliseconds) on which a new smart gateway
-# selection is performed.
-# (default is 10000 milliseconds)
-
-# SmartGatewayPeriod 10000
-
-# Determines the number of times the link state database must be stable
-# before a new smart gateway is selected.
-# (default is 6)
-
-# SmartGatewayStableCount 6
-
-# When another gateway than the current one has a cost of less than the cost
-# of the current gateway multiplied by SmartGatewayThreshold then the smart
-# gateway is switched to the other gateway. The unit is percentage.
-# (defaults to 0)
-
-# SmartGatewayThreshold 0
-
-# The weighing factor for the gateway uplink bandwidth (exit link, uplink).
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 1)
-
-# SmartGatewayWeightExitLinkUp 1
-
-# The weighing factor for the gateway downlink bandwidth (exit link, downlink).
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 1)
-
-# SmartGatewayWeightExitLinkDown 1
-
-# The weighing factor for the ETX costs.
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 1)
-
-# SmartGatewayWeightEtx 1
-
-# The divider for the ETX costs.
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 0)
-
-# SmartGatewayDividerEtx 0
-
-# Defines what kind of Uplink this node will publish as a
-# smartgateway. The existence of the uplink is detected by
-# a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3.
-# possible values are "none", "ipv4", "ipv6", "both"
-# (default is "both")
-
-# SmartGatewayUplink "both"
-
-# Specifies if the local ipv4 uplink use NAT
-# (default is "yes")
-
-# SmartGatewayUplinkNAT yes
-
-# Specifies the speed of the uplink in kilobit/s.
-# First parameter is upstream, second parameter is downstream
-# (default is 128/1024)
-
-# SmartGatewaySpeed 128 1024
-
-# Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix
-# length of more than 64 is not allowed.
-# (default is 0::/0
-
-# SmartGatewayPrefix 0::/0
-
-##############################
-### OLSR protocol settings ###
-##############################
-
-# HNA (Host network association) allows the OLSR to announce
-# additional IPs or IP subnets to the net that are reachable
-# through this node.
-# Syntax for HNA4 is "network-address    network-mask"
-# Syntax for HNA6 is "network-address    prefix-length"
-# (default is no HNA)
-Hna4
+Interface "wlan0"
 {
-# Internet gateway
-# 0.0.0.0   0.0.0.0
-# specific small networks reachable through this node
-# 15.15.0.0 255.255.255.0
 }
-Hna6
-{
-# Internet gateway
-#   0::                     0
-# specific small networks reachable through this node
-#   fec0:2200:106:0:0:0:0:0 48
-}
-
-################################
-### OLSR protocol extensions ###
-################################
-
-# Link quality algorithm (only for lq level 2)
-# (see README-Olsr-Extensions)
-# - "etx_float", a floating point  ETX with exponential aging
-# - "etx_fpm", same as ext_float, but with integer arithmetic
-# - "etx_ff" (ETX freifunk), an etx variant which use all OLSR
-#   traffic (instead of only hellos) for ETX calculation
-# - "etx_ffeth", an incompatible variant of etx_ff that allows
-#   ethernet links with ETX 0.1.
-# (defaults to "etx_ff")
-
-# LinkQualityAlgorithm    "etx_ff"
-
-# Fisheye mechanism for TCs (0 meansoff, 1 means on)
-# (default is 1)
-
-LinkQualityFishEye  0
 
-#####################################
-### Example plugin configurations ###
-#####################################
-# Olsrd plugins to load
-# This must be the absolute path to the file
-# or the loader will use the following scheme:
-# - Try the paths in the LD_LIBRARY_PATH 
-#   environment variable.
-# - The list of libraries cached in /etc/ld.so.cache
-# - /lib, followed by /usr/lib
-#
-# the examples in this list are for linux, so check if the plugin is
-# available if you use windows/BSD.
-# each plugin should have a README file in it's lib subfolder
-
-# LoadPlugin "olsrd_txtinfo.dll"
-LoadPlugin "olsrd_txtinfo.so.0.1"
+LoadPlugin "olsrd_httpinfo.so.0.1"
 {
-    # the default port is 2006 but you can change it like this:
-    #PlParam     "port"   "8080"
-
-    # You can set a "accept" single address to allow to connect to
-    # txtinfo. If no address is specified, then localhost (127.0.0.1)
-    # is allowed by default.  txtinfo will only use the first "accept"
-    # parameter specified and will ignore the rest.
-
-    # to allow a specific host:
-    #PlParam      "accept" "172.29.44.23"
-    # if you set it to 0.0.0.0, it will accept all connections
-    #PlParam      "accept" "0.0.0.0"
 }
 
-#############################################
-### OLSRD default interface configuration ###
-#############################################
-# the default interface section can have the same values as the following
-# interface configuration. It will allow you so set common options for all
-# interfaces.
-
-InterfaceDefaults {
-    # Ip4Broadcast      255.255.255.255
-}
-
-######################################
-### OLSRd Interfaces configuration ###
-######################################
-# multiple interfaces can be specified for a single configuration block
-# multiple configuration blocks can be specified
-
-# WARNING, don't forget to insert your interface names here !
-Interface "<OLSRd-Interface1>" "<OLSRd-Interface2>"
+LoadPlugin "olsrd_jsoninfo.so.0.0"
 {
-    # Interface Mode is used to prevent unnecessary
-    # packet forwarding on switched ethernet interfaces
-    # valid Modes are "mesh" and "ether"
-    # (default is "mesh")
-
-    # Mode "mesh"
-}
+}
\ No newline at end of file
diff --git a/files/olsrd.conf.default.lq-fisheye b/files/olsrd.conf.default.lq-fisheye
deleted file mode 100644 (file)
index 2b5587b..0000000
+++ /dev/null
@@ -1,313 +0,0 @@
-#
-# OLSR.org routing daemon config file
-# This file contains the usual options for an ETX based
-# stationary network with fisheye
-# (for other options see olsrd.conf.default.full)
-#
-# Lines starting with a # are discarded
-#
-
-#### ATTENTION for IPv6 users ####
-# Because of limitations in the parser IPv6 addresses must NOT
-# begin with a ":", so please add a "0" as a prefix.
-
-###########################
-### Basic configuration ###
-###########################
-# keep this settings at the beginning of your first configuration file
-
-# Debug level (0-9)
-# If set to 0 the daemon runs in the background, unless "NoFork" is set to true
-# (Default is 1)
-
-# DebugLevel  1
-
-# IP version to use (4 or 6)
-# (Default is 4)
-
-# IpVersion 4
-
-#################################
-### OLSRd agent configuration ###
-#################################
-# this parameters control the settings of the routing agent which are not
-# related to the OLSR protocol and it's extensions
-
-# FIBMetric controls the metric value of the host-routes OLSRd sets.
-# - "flat" means that the metric value is always 2. This is the preferred value
-#   because it helps the linux kernel routing to clean up older routes
-# - "correct" use the hopcount as the metric value.
-# - "approx" use the hopcount as the metric value too, but does only update the
-#   hopcount if the nexthop changes too
-# (Default is "flat")
-
-# FIBMetric "flat"
-
-#######################################
-### Linux specific OLSRd extensions ###
-#######################################
-# these parameters are only working on linux at the moment, but might become
-# useful on BSD in the future
-
-# SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip
-# of the node. In addition to this an additional localhost device is created
-# to make sure the returning traffic can be received.
-# (Default is "no")
-
-# SrcIpRoutes no
-
-# Specify the proto tag to be used for routes olsr inserts into kernel
-# currently only implemented for linux
-# valid values under linux are 1 .. 254
-# 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects)
-# 2 KERNEL routes (not very wise to use)
-# 3 BOOT (should in fact not be used by routing daemons)
-# 4 STATIC 
-# 8 .. 15 various routing daemons (gated, zebra, bird, & co)
-# (defaults to 0 which gets replaced by an OS-specific default value
-# under linux 3 (BOOT) (for backward compatibility)
-
-# RtProto 0
-
-# Activates (in IPv6 mode) the automatic use of NIIT
-# (see README-Olsr-Extensions)
-# (default is "yes")
-
-# UseNiit yes
-
-# Activates the smartgateway ipip tunnel feature.
-# See README-Olsr-Extensions for a description of smartgateways.
-# (default is "no")
-
-# SmartGateway no
-
-# Signals that the server tunnel must always be removed on shutdown,
-# irrespective of the interface up/down state during startup.
-# (default is "no")
-
-# SmartGatewayAlwaysRemoveServerTunnel no
-
-# Determines the maximum number of gateways that can be in use at any given
-# time. This setting is used to mitigate the effects of breaking connections
-# (due to the selection of a new gateway) on a dynamic network.
-# (default is 1)
-
-# SmartGatewayUseCount 1
-
-# Determines the take-down percentage for a non-current smart gateway tunnel.
-# If the cost of the current smart gateway tunnel is less than this percentage
-# of the cost of the non-current smart gateway tunnel, then the non-current smart
-# gateway tunnel is taken down because it is then presumed to be 'too expensive'.
-# This setting is only relevant when SmartGatewayUseCount is larger than 1;
-# a value of 0 will result in the tunnels not being taken down proactively.
-# (default is 0)
-
-# SmartGatewayTakeDownPercentage 0
-
-# Determines the policy routing script that is executed during startup and
-# shutdown of olsrd. The script is only executed when SmartGatewayUseCount
-# is set to a value larger than 1. The script must setup policy routing
-# rules such that multi-gateway mode works. A sample script is included.
-# (default is not set)
-
-# SmartGatewayPolicyRoutingScript ""
-
-# Determines the egress interfaces that are part of the multi-gateway setup and
-# therefore only relevant when SmartGatewayUseCount is larger than 1 (in which
-# case it must be explicitly set).
-# (default is not set)
-
-# SmartGatewayEgressInterfaces ""
-
-# Determines the routing tables offset for multi-gateway policy routing tables
-# See the policy routing script for an explanation.
-# (default is 90)
-
-# SmartGatewayTablesOffset 90
-
-# Determines the policy routing rules offset for multi-gateway policy routing
-# rules. See the policy routing script for an explanation.
-# (default is 0, which indicates that the rules and tables should be aligned and
-# puts this value at SmartGatewayTablesOffset - # egress interfaces -
-# # olsr interfaces)
-
-# SmartGatewayRulesOffset 87
-
-# Allows the selection of a smartgateway with NAT (only for IPv4)
-# (default is "yes")
-
-# SmartGatewayAllowNAT yes
-
-# Determines the period (in milliseconds) on which a new smart gateway
-# selection is performed.
-# (default is 10000 milliseconds)
-
-# SmartGatewayPeriod 10000
-
-# Determines the number of times the link state database must be stable
-# before a new smart gateway is selected.
-# (default is 6)
-
-# SmartGatewayStableCount 6
-
-# When another gateway than the current one has a cost of less than the cost
-# of the current gateway multiplied by SmartGatewayThreshold then the smart
-# gateway is switched to the other gateway. The unit is percentage.
-# (defaults to 0)
-
-# SmartGatewayThreshold 0
-
-# The weighing factor for the gateway uplink bandwidth (exit link, uplink).
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 1)
-
-# SmartGatewayWeightExitLinkUp 1
-
-# The weighing factor for the gateway downlink bandwidth (exit link, downlink).
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 1)
-
-# SmartGatewayWeightExitLinkDown 1
-
-# The weighing factor for the ETX costs.
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 1)
-
-# SmartGatewayWeightEtx 1
-
-# The divider for the ETX costs.
-# See README-Olsr-Extensions for a description of smart gateways.
-# (default is 0)
-
-# SmartGatewayDividerEtx 0
-
-# Defines what kind of Uplink this node will publish as a
-# smartgateway. The existence of the uplink is detected by
-# a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3.
-# possible values are "none", "ipv4", "ipv6", "both"
-# (default is "both")
-
-# SmartGatewayUplink "both"
-
-# Specifies if the local ipv4 uplink use NAT
-# (default is "yes")
-
-# SmartGatewayUplinkNAT yes
-
-# Specifies the speed of the uplink in kilobit/s.
-# First parameter is upstream, second parameter is downstream
-# (default is 128/1024)
-
-# SmartGatewaySpeed 128 1024
-
-# Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix
-# length of more than 64 is not allowed.
-# (default is 0::/0
-
-# SmartGatewayPrefix 0::/0
-
-##############################
-### OLSR protocol settings ###
-##############################
-
-# HNA (Host network association) allows the OLSR to announce
-# additional IPs or IP subnets to the net that are reachable
-# through this node.
-# Syntax for HNA4 is "network-address    network-mask"
-# Syntax for HNA6 is "network-address    prefix-length"
-# (default is no HNA)
-Hna4
-{
-# Internet gateway
-# 0.0.0.0   0.0.0.0
-# specific small networks reachable through this node
-# 15.15.0.0 255.255.255.0
-}
-Hna6
-{
-# Internet gateway
-#   0::                     0
-# specific small networks reachable through this node
-#   fec0:2200:106:0:0:0:0:0 48
-}
-
-################################
-### OLSR protocol extensions ###
-################################
-
-# Link quality algorithm (only for lq level 2)
-# (see README-Olsr-Extensions)
-# - "etx_float", a floating point  ETX with exponential aging
-# - "etx_fpm", same as ext_float, but with integer arithmetic
-# - "etx_ff" (ETX freifunk), an etx variant which use all OLSR
-#   traffic (instead of only hellos) for ETX calculation
-# - "etx_ffeth", an incompatible variant of etx_ff that allows
-#   ethernet links with ETX 0.1.
-# (defaults to "etx_ff")
-
-# LinkQualityAlgorithm    "etx_ff"
-
-# Fisheye mechanism for TCs (0 meansoff, 1 means on)
-# (default is 1)
-
-# LinkQualityFishEye  1
-
-#####################################
-### Example plugin configurations ###
-#####################################
-# Olsrd plugins to load
-# This must be the absolute path to the file
-# or the loader will use the following scheme:
-# - Try the paths in the LD_LIBRARY_PATH 
-#   environment variable.
-# - The list of libraries cached in /etc/ld.so.cache
-# - /lib, followed by /usr/lib
-#
-# the examples in this list are for linux, so check if the plugin is
-# available if you use windows/BSD.
-# each plugin should have a README file in it's lib subfolder
-
-# LoadPlugin "olsrd_txtinfo.dll"
-LoadPlugin "olsrd_txtinfo.so.0.1"
-{
-    # the default port is 2006 but you can change it like this:
-    #PlParam     "port"   "8080"
-
-    # You can set a "accept" single address to allow to connect to
-    # txtinfo. If no address is specified, then localhost (127.0.0.1)
-    # is allowed by default.  txtinfo will only use the first "accept"
-    # parameter specified and will ignore the rest.
-
-    # to allow a specific host:
-    #PlParam      "accept" "172.29.44.23"
-    # if you set it to 0.0.0.0, it will accept all connections
-    #PlParam      "accept" "0.0.0.0"
-}
-
-#############################################
-### OLSRD default interface configuration ###
-#############################################
-# the default interface section can have the same values as the following
-# interface configuration. It will allow you so set common options for all
-# interfaces.
-
-InterfaceDefaults {
-    # Ip4Broadcast      255.255.255.255
-}
-
-######################################
-### OLSRd Interfaces configuration ###
-######################################
-# multiple interfaces can be specified for a single configuration block
-# multiple configuration blocks can be specified
-
-# WARNING, don't forget to insert your interface names here !
-Interface "<OLSRd-Interface1>" "<OLSRd-Interface2>"
-{
-    # Interface Mode is used to prevent unnecessary
-    # packet forwarding on switched ethernet interfaces
-    # valid Modes are "mesh" and "ether"
-    # (default is "mesh")
-
-    # Mode "mesh"
-}
index 1c0db04..d816256 100644 (file)
-#
-# OLSR.org routing daemon config file
-# This file contains the necessary config options
-# for an RFC compatible mesh
-# (for other options see olsrd.conf.default.full)
-#
-# Lines starting with a # are discarded
-#
+UseNiit                        no
+LinkQualityLevel               0
+LinkQualityFishEye             0
 
-#### ATTENTION for IPv6 users ####
-# Because of limitations in the parser IPv6 addresses must NOT
-# begin with a ":", so please add a "0" as a prefix.
-
-###########################
-### Basic configuration ###
-###########################
-# keep this settings at the beginning of your first configuration file
-
-# Debug level (0-9)
-# If set to 0 the daemon runs in the background, unless "NoFork" is set to true
-# (Default is 1)
-
-# DebugLevel  1
-
-# IP version to use (4 or 6)
-# (Default is 4)
-
-# IpVersion 4
-
-#################################
-### OLSRd agent configuration ###
-#################################
-# this parameters control the settings of the routing agent which are not
-# related to the OLSR protocol and it's extensions
-
-# FIBMetric controls the metric value of the host-routes OLSRd sets.
-# - "flat" means that the metric value is always 2. This is the preferred value
-#   because it helps the linux kernel routing to clean up older routes
-# - "correct" use the hopcount as the metric value.
-# - "approx" use the hopcount as the metric value too, but does only update the
-#   hopcount if the nexthop changes too
-# (Default is "flat")
-
-# FIBMetric "flat"
-
-#######################################
-### Linux specific OLSRd extensions ###
-#######################################
-# these parameters are only working on linux at the moment, but might become
-# useful on BSD in the future
-
-# Activates (in IPv6 mode) the automatic use of NIIT
-# (see README-Olsr-Extensions)
-# (default is "yes")
-
-UseNiit no
-
-# Activates the smartgateway ipip tunnel feature.
-# See README-Olsr-Extensions for a description of smartgateways.
-# (default is "yes")
-
-SmartGateway no
-
-##############################
-### OLSR protocol settings ###
-##############################
-
-# For testing purposes it may be nice to use another port for olsrd
-# for using another port than the IANA assigned one 
-# for a production network, there should be a good reason!!
-# valid values are integers >1, please be careful with using reserved
-# port numbers
-# (default is 698, the IANA assigned olsr-port)
-
-# OlsrPort 698
-
-# The fixed willingness to use (0-7)
-# If not set willingness will be calculated
-# dynamically based on battery/power status
-# (default is 3)
-
-# Willingness     3
-
-# HNA (Host network association) allows the OLSR to announce
-# additional IPs or IP subnets to the net that are reachable
-# through this node.
-# Syntax for HNA4 is "network-address    network-mask"
-# Syntax for HNA6 is "network-address    prefix-length"
-# (default is no HNA)
-Hna4
-{
-# Internet gateway
-# 0.0.0.0   0.0.0.0
-# specific small networks reachable through this node
-# 15.15.0.0 255.255.255.0
-}
-Hna6
+Interface "wlan0"
 {
-# Internet gateway
-#   0::                     0
-# specific small networks reachable through this node
-#   fec0:2200:106:0:0:0:0:0 48
 }
 
-# Hysteresis for link sensing (only for hopcount metric)
-# Hysteresis adds more robustness to the link sensing
-# but delays neighbor registration.
-# (defaults to yes)
-
-# UseHysteresis yes
-
-# Hysteresis parameters (only for hopcount metric)
-# Do not alter these unless you know what you are doing!
-# Set to auto by default. Allowed values are floating point
-# values in the interval 0,1
-# THR_LOW must always be lower than THR_HIGH!!
-# (default is 0.5/0.8/0.3)
-
-# HystScaling  0.50
-# HystThrHigh  0.80
-# HystThrLow 0.30
-
-# TC redundancy
-# Specifies how much neighbor info should be sent in
-# TC messages. Because of a design problem in the 0.5.x
-# dijkstra implementation this value must be set to 2.
-# 2 - send all neighbors
-# (default is 2)
-
-# TcRedundancy  2
-
-# MPR coverage specifies how many MPRs a node should
-# try select to reach every 2 hop neighbor. Because of
-# a design problem in the 0.5.x dijkstra algorithm this
-# value should be set to 7.
-# (default is 7)
-
-# MprCoverage 7
-
-################################
-### OLSR protocol extensions ###
-################################
-
-# Link quality level switch between hopcount and 
-# cost-based (mostly ETX) routing. Because of
-# a design problem in the 0.5.x dijkstra algorithm this
-# value should not be set to 1.
-# 0 = do not use link quality
-# 2 = use link quality for MPR selection and routing
-# (default is 2)
-
-LinkQualityLevel 0
-
-# Fisheye mechanism for TCs (0 meansoff, 1 means on)
-# (default is 1)
-
-LinkQualityFishEye  0
-
-#####################################
-### Example plugin configurations ###
-#####################################
-# Olsrd plugins to load
-# This must be the absolute path to the file
-# or the loader will use the following scheme:
-# - Try the paths in the LD_LIBRARY_PATH 
-#   environment variable.
-# - The list of libraries cached in /etc/ld.so.cache
-# - /lib, followed by /usr/lib
-#
-# the examples in this list are for linux, so check if the plugin is
-# available if you use windows/BSD.
-# each plugin should have a README file in it's lib subfolder
-
-# LoadPlugin "olsrd_txtinfo.dll"
-LoadPlugin "olsrd_txtinfo.so.0.1"
+LoadPlugin "olsrd_httpinfo.so.0.1"
 {
-    # the default port is 2006 but you can change it like this:
-    #PlParam     "port"   "8080"
-
-    # You can set a "accept" single address to allow to connect to
-    # txtinfo. If no address is specified, then localhost (127.0.0.1)
-    # is allowed by default.  txtinfo will only use the first "accept"
-    # parameter specified and will ignore the rest.
-
-    # to allow a specific host:
-    #PlParam      "accept" "172.29.44.23"
-    # if you set it to 0.0.0.0, it will accept all connections
-    #PlParam      "accept" "0.0.0.0"
 }
 
-######################################
-### OLSRd Interfaces configuration ###
-######################################
-# multiple interfaces can be specified for a single configuration block
-# multiple configuration blocks can be specified
-
-# WARNING, don't forget to insert your interface names here !
-Interface "<OLSRd-Interface1>" "<OLSRd-Interface2>"
+LoadPlugin "olsrd_jsoninfo.so.0.0"
 {
-    # Emission intervals in seconds.
-    # If not defined, Freifunk network defaults are used
-    # (default is 2.0/20.0 for Hello and 5.0/300.0 for Tc/Mid/Hna)
-
-    # HelloInterval       2.0
-    # HelloValidityTime   6.0
-    # TcInterval          5.0
-    # TcValidityTime     30.0
-    # MidInterval         5.0
-    # MidValidityTime    30.0
-    # HnaInterval         5.0
-    # HnaValidityTime    30.0
-}
+}
\ No newline at end of file
index 8b9b498..b5a0f55 100644 (file)
@@ -1,34 +1,45 @@
 #
-# sourced from: http://wiki.funkfeuer.at/index.php/OLSR-Konfiguration
+# Copied from http://wiki.funkfeuer.at/index.php/OLSR-Konfiguration
 #
+# jsoninfo plugin added to be able to generate the effective configuration
+# file easily
+#
+
+DebugLevel                     0
+IpVersion                      4
+AllowNoInt                     yes
+FIBMetric                      "flat"
+TcRedundancy                   2
+MprCoverage                    5
+LinkQualityFishEye             1
+LinkQualityAlgorithm           "etx_ff"
+LinkQualityLevel               2
+UseHysteresis                  no
 
-DebugLevel              0
-IpVersion               4
-AllowNoInt              yes
-FIBMetric               "flat"
-TcRedundancy            2
-MprCoverage             5
-LinkQualityFishEye      1
-LinkQualityAlgorithm    "etx_ff"  
-LinkQualityLevel 2
-UseHysteresis no
+Interface "wlan0"
+{
+}
 
 LoadPlugin "olsrd_httpinfo.so.0.1"
 {
-       PlParam     "port"   "80"
-       PlParam     "Net"    "0.0.0.0 0.0.0.0"
+    PlParam "port"             "80"
+    PlParam "Net"              "0.0.0.0 0.0.0.0"
+}
+
+LoadPlugin "olsrd_jsoninfo.so.0.0"
+{
 }
 
 #Trage hier deine OLSR-Interfaces (funk, lan, tunnel, etc,..) ein
 InterfaceDefaults
 {
-       Ip4Broadcast 255.255.255.255
-       HelloInterval           5.0
-       HelloValidityTime       100.0
-       TcInterval              3.0
-       TcValidityTime          500.0
-       MidInterval             30.0
-       MidValidityTime         500.0
-       HnaInterval             30.0
-       HnaValidityTime         500.0
-}
+    Ip4Broadcast               255.255.255.255
+    HelloInterval              5.0
+    HelloValidityTime          100.0
+    TcInterval                 3.0
+    TcValidityTime             500.0
+    MidInterval                30.0
+    MidValidityTime            500.0
+    HnaInterval                30.0
+    HnaValidityTime            500.0
+}
\ No newline at end of file
diff --git a/files/olsrd.conf.minimal_freifunk b/files/olsrd.conf.minimal_freifunk
deleted file mode 100644 (file)
index 29f12df..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# OLSR.org routing daemon config file
-#
-# Lines starting with a # are discarded
-#
-
-Interface "wlan0"
-{
-}
-
index 19d7100..2e08bda 100644 (file)
@@ -54,7 +54,7 @@ UninstPage uninstConfirm
 UninstPage instfiles
 
 Function .onInit
-        MessageBox MB_YESNO "This will install olsr.org pre-0.6.7.2 on your computer. Continue?" IDYES NoAbort
+        MessageBox MB_YESNO "This will install olsr.org pre-0.6.9 on your computer. Continue?" IDYES NoAbort
         Abort
 NoAbort:
 FunctionEnd
index f35cd56..2a07f82 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.7.2"
+CAPTION "olsr.org Switch pre-0.6.9"
 FONT 8, "MS Sans Serif", 0, 0, 0x1\r
 BEGIN\r
     CONTROL         "Tab1",IDC_TAB1,"SysTabControl32",0x0,7,7,383,256\r
index b624611..4941d6a 100644 (file)
@@ -3,13 +3,14 @@ ARP REFRESH PLUGIN FOR OLSRD
 by Sven-Ola Tuecke <sven-ola-aet-gmx.de>
 ---------------------------------------------------------------------
 
-This plugin listens to all received UDP packets and maintains an
-internal list of MAC addresses extracted from these. By hitchhiking
-the set-route-function, the kernel ARP cache will be refreshed from
-this list if a direct-neighbor host route is configured. Result:
-no more ARP lookups if you use a larger routing chain - e.g. fetch
-a web site 8 olsr-hops away does not show the typical 8-nodes-need
-to ARP first delay.
+The plugin listens to all received UDP packets on port 698 and maintains
+an internal list of MAC addresses extracted from these. The kernel ARP
+cache will be refreshed from this list if a direct-neighbor host route is
+configured. Result: no more ARP lookups if you use a larger routing
+chain - e.g. fetch a web site 8 olsr-hops away does not show the typical
+8-nodes-need-to-ARP first delay.
+IPv4 only.
+Does not support VLANs.
 
 ---------------------------------------------------------------------
 PLUGIN PARAMETERS (PlParam)
@@ -23,7 +24,7 @@ SAMPLE CONFIG
 
 add in /etc/olsrd/olsrd.conf:
 
-LoadPlugin "arprefresh.so.0.1"
+LoadPlugin "olsrd_arprefresh.so.0.1"
 {
 }
 
index 67e7499..45bae3e 100644 (file)
@@ -142,7 +142,11 @@ int IsOlsrOrBmfPacket(unsigned char* ipPacket)
 
   /* Go into the UDP header and check port number */
   udpHeader = (struct udphdr*) ARM_NOWARN_ALIGN((ipPacket + ipHeaderLen));
+#if defined(__GLIBC__) || defined(__BIONIC__)
   destPort = ntohs(udpHeader->dest);
+#else
+  destPort = ntohs(udpHeader->uh_dport);
+#endif
 
   if (destPort == olsr_cnf->olsrport || destPort == BMF_ENCAP_PORT || destPort == 51698)
       /* TODO: #define for 51698 */
index 9bbce42..9f630b0 100644 (file)
@@ -1028,7 +1028,11 @@ BMF_handle_listeningFd(int skfd, void *data, unsigned int flags __attribute__ ((
   }
 
   udpHeader = (struct udphdr*) ARM_NOWARN_ALIGN((rxBuffer + headerLength));
+#if defined(__GLIBC__) || defined(__BIONIC__)
   destPort = ntohs(udpHeader->dest);
+#else
+  destPort = ntohs(udpHeader->uh_dport);
+#endif
   if (destPort != BMF_ENCAP_PORT)
   {
     /* Not BMF */
index 49a35a5..5c00792 100644 (file)
@@ -50,6 +50,7 @@
 #include <assert.h> /* assert() */
 #include <net/if.h> /* socket(), ifreq, if_indextoname(), if_nametoindex() */
 #include <netinet/in.h> /* htons() */
+#include <netinet/udp.h> /* struct udphdr */
 #include <linux/if_ether.h> /* ETH_P_IP */
 #include <linux/if_packet.h> /* packet_mreq, PACKET_MR_PROMISC, PACKET_ADD_MEMBERSHIP */
 #include <linux/if_tun.h> /* IFF_TAP */
@@ -1893,7 +1894,11 @@ void CheckAndUpdateLocalBroadcast(unsigned char* ipPacket, union olsr_ip_addr* b
 
       /* RFC 1624, Eq. 3: HC' = ~(~HC - m + m') */
 
+#if defined(__GLIBC__) || defined(__BIONIC__)
       check = ntohs(udph->check);
+#else
+      check = ntohs(udph->uh_sum);
+#endif
 
       check = ~ (~ check - ((origDaddr >> 16) & 0xFFFF) + ((newDaddr >> 16) & 0xFFFF));
       check = ~ (~ check - (origDaddr & 0xFFFF) + (newDaddr & 0xFFFF));
@@ -1901,7 +1906,11 @@ void CheckAndUpdateLocalBroadcast(unsigned char* ipPacket, union olsr_ip_addr* b
       /* Add carry */
       check = check + (check >> 16);
 
+#if defined(__GLIBC__) || defined(__BIONIC__)
       udph->check = htons(check);
+#else
+      udph->uh_sum = htons(check);
+#endif
      } /* if */
   } /* if */
 } /* CheckAndUpdateLocalBroadcast */
index b6a7392..a56b72e 100644 (file)
@@ -300,7 +300,7 @@ dotdraw_write_data(void *foo __attribute__ ((unused))) {
     if (result > 0)
       abuf_pull(&outbuffer, result);
 
-    if (result <= 0) {
+    if (result < 0) {
       /* close this socket and cleanup*/
       close(outbuffer_socket);
       abuf_free(&outbuffer);
@@ -309,14 +309,6 @@ dotdraw_write_data(void *foo __attribute__ ((unused))) {
       outbuffer_socket = -1;
     }
   }
-  if (outbuffer.len == 0) {
-    /* close this socket and cleanup*/
-    close(outbuffer_socket);
-    abuf_free(&outbuffer);
-    olsr_stop_timer(writetimer_entry);
-    writetimer_entry = NULL;
-    outbuffer_socket = -1;
-  }
 }
 
 /**
index 0aea1f9..efc664d 100644 (file)
@@ -46,14 +46,16 @@ HOW TO USE (version 0.5)
 
 LoadPlugin "olsrd_dyn_gw.so.0.5"
 {
-    # The plugin check interval can be set here in milliseconds.
-    # The default is 1000 ms (1 second).
-    PlParam     "CheckInterval"  "5000"
-    
-    # The ping check interval in case there is any pinged host specified.
-    # The default is 5 seconds.
-    PlParam     "PingInterval"   "40"
-    
+    # The plugin check interval in milliseconds.
+    # PlParam     "checkinterval"      "1000"
+
+    # The ping check interval in seconds when any pinged host specified.
+    # PlParam     "interval"           "5"
+    # PlParam     "pinginterval"       "5"
+
+    # The ping command to use when any pinged host specified.
+    # PlParam     "pingcmd"            "ping -c 1 -q %s"
+
     # If one or more IPv4 addresses are given, do a ping on these in
     # descending order to validate that there is not only an entry in
     # routing table, but also a real network connection. If any of
@@ -61,32 +63,35 @@ LoadPlugin "olsrd_dyn_gw.so.0.5"
     # succesful, i.e. if the ping on the 1st address was successful,the
     # 2nd won't be pinged.
     #
-    # The Ping list applies to the group of HNAs specified above or to the 
-               # default internet gateway when no HNA is specified.
-               #
-               # Running the plugin without parameters acts as the 'old' dyn_gw_plain.
-    
-    #   The following ping entries for the internet gateway
-    PlParam "Ping"   "141.1.1.1"
-    PlParam "Ping"   "194.25.2.129"
-    
-    #   First group of HNAs with related ping host
-    PlParam    "HNA"      "192.168.80.0 255.255.255.0"
-    PlParam    "HNA"      "192.168.81.0 255.255.255.0"
-    PlParam    "Ping"   "192.168.81.12"
-    
-    #   Second HNA group with multiple related ping hosts.
-    #   Specifying multiple ping hosts provides redundancy.
-    PlParam "HNA"    "192.168.100.0 255.255.255.0"
-    PlParam "HNA"    "192.168.101.0 255.255.255.0"
-    PlParam "HNA"    "192.168.102.0 255.255.255.0"
-    PlParam "Ping"   "192.168.100.10"
-    PlParam "Ping"   "192.168.101.10"
-    
-    #   Third HNA group without ping check
-    PlParam "HNA"    "192.168.200.0 255.255.255.0"
-    PlParam "HNA"    "192.168.201.0 255.255.255.0"
-    PlParam "HNA"    "192.168.202.0 255.255.255.0"
+    # The Ping list applies to the group of HNAs specified above or to the
+    # default internet gateway when no HNA is specified.
+    #
+    # Running the plugin without parameters acts as the 'old' dyn_gw_plain.
+
+    # The following ping entries for the internet gateway
+    # PlParam     "ping"               "141.1.1.1"
+    # PlParam     "ping"               "194.25.2.129"
+
+    # First group of HNAs with related ping host
+    # PlParam     "hna"                "192.168.80.0   255.255.255.0"
+    # PlParam     "hna"                "192.168.81.0   255.255.255.0"
+    # PlParam     "ping"               "192.168.81.12"
+
+    # Second HNA group with multiple related ping hosts.
+    # Specifying multiple ping hosts provides redundancy.
+    # PlParam     "hna"                "192.168.100.0  255.255.255.0"
+    # PlParam     "hna"                "192.168.101.0  255.255.255.0"
+    # PlParam     "hna"                "192.168.102.0  255.255.255.0"
+    # PlParam     "ping"               "192.168.100.10"
+    # PlParam     "ping"               "192.168.101.10"
+
+    # Third HNA group without ping check
+    # PlParam     "hna"                "192.168.200.0  255.255.255.0"
+    # PlParam     "hna"                "192.168.201.0  255.255.255.0"
+    # PlParam     "hna"                "192.168.202.0  255.255.255.0"
+
+    # Set custom ping command - %s will be replaced with the IP address to ping
+    # PlParam     "pingcmd"            "ping -c 1 -q -I vpn %s"
 }
 
 --------------------------------------------------------------------------------
index 074e4d3..e098bbe 100644 (file)
@@ -129,6 +129,8 @@ static bool check_gw(union olsr_ip_addr *, uint8_t, struct ping_list *);
 
 static int ping_is_possible(struct ping_list *);
 
+static char ping_cmd[PING_CMD_MAX_LEN] = { DEFAULT_PING_CMD };
+
 /* Event function to register with the scheduler */
 static void olsr_event_doing_hna(void *);
 
@@ -206,12 +208,27 @@ set_plugin_hna(const char *value, void *data __attribute__ ((unused)), set_plugi
   return 0;
 }
 
+static int
+set_plugin_cmd(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused)))
+{
+  size_t len = strlen(value);
+
+  if (len < PING_CMD_MAX_LEN) {
+    strncpy(ping_cmd, value, MAX(sizeof(ping_cmd), PING_CMD_MAX_LEN - 1));
+    ping_cmd[PING_CMD_MAX_LEN - 1] = '\0';
+    return 0;
+  }
+
+  return 1;
+}
+
 static const struct olsrd_plugin_parameters plugin_parameters[] = {
   {.name = "interval",      .set_plugin_parameter = &set_plugin_int,  .data = &ping_check_interval  },
   {.name = "pinginterval",  .set_plugin_parameter = &set_plugin_int,  .data = &ping_check_interval  },
   {.name = "checkinterval", .set_plugin_parameter = &set_plugin_int,  .data = &hna_check_interval   },
   {.name = "ping",          .set_plugin_parameter = &set_plugin_ping, .data = NULL                  },
   {.name = "hna",           .set_plugin_parameter = &set_plugin_hna,  .data = NULL                  },
+  {.name = "pingcmd",       .set_plugin_parameter = &set_plugin_cmd,  .data = &ping_cmd             },
 };
 
 void
@@ -537,9 +554,9 @@ ping_is_possible(struct ping_list *the_ping_list)
 {
   struct ping_list *list;
   for (list = the_ping_list; list; list = list->next) {
-    char ping_command[50];
-    snprintf(ping_command, sizeof(ping_command), "ping -c 1 -q %s", list->ping_address);
-    olsr_printf(1, "\nDo ping on %s ...\n", list->ping_address);
+    char ping_command[sizeof(ping_cmd) + INET6_ADDRSTRLEN];
+    snprintf(ping_command, sizeof(ping_command), ping_cmd, list->ping_address);
+    olsr_printf(1, "\nDo ping on (%s) %s ...\n", ping_cmd, list->ping_address);
     if (system(ping_command) == 0) {
       olsr_printf(1, "...OK\n\n");
       return 1;
index 4db0838..5174c63 100644 (file)
@@ -54,6 +54,8 @@
 
 #define DEFAULT_HNA_CHECK_INTERVAL     1000
 #define DEFAULT_PING_CHECK_INTERVAL    5
+#define DEFAULT_PING_CMD            "ping -c 1 -q %s"
+#define PING_CMD_MAX_LEN            64
 
 int olsrd_plugin_init(void);
 
index dc53e8f..da6e62f 100644 (file)
@@ -2,6 +2,10 @@ DYNAMIC INTERNET GATEWAY PLAIN PLUGIN FOR olsr.org olsrd
 by Andreas Tonnesen(andreto@olsr.org)
 additions by Sven-Ola Tuecke
 
+Automatically adds a default gateway HNA when the node has such a route.
+Automatically removes a default gateway HNA when the node has no such route.
+IPv4 only.
+
 This plugin is without Ping/libthread. It is the plain dyn_gw!
 
 HOW TO USE
@@ -12,6 +16,7 @@ LoadPlugin "olsrd_dyn_gw_plain.so.0.4"
 {
 }
 
+
 ABOUT
 
 Plugin is IPv4 only.
index 2b96443..41c7997 100644 (file)
@@ -5,77 +5,68 @@ by Andreas Tonnesen(andreto@olsr.org)
 
  ABOUT
 
-This plugin implements a tiny HTTP server that
-will gespond to a GET request by returning a HTML
-formatted page contanin various information about
-the currently running olsrd process.
-This information includes detailed link status for
-all links and neighbors, all olsrd routes in the 
-kernel, local configuration, uptime and more. The
-plugin can also generate a olsrd configfile based
-on current running configuration.
-In adittion an experimental administrtion interface
-is available.
+This plugin implements a tiny HTTP server that will respond to a GET request
+by returning a HTML formatted page containing information about the currently
+running olsrd process.
+
+This information includes detailed link status for all links and neighbors, all
+olsrd routes in the kernel, local configuration, uptime and more. The plugin
+can also generate an olsrd configfile based on current running configuration.
+
+In adittion an experimental administrtion interface is available.
 
 -----------------------------------------------------
 
- PARAMETERS
-
-The plugin takes the parameter "Port" "[portnumber]" 
-to set the TCP port on which the server is to run. 
-It defaults to 1978.
-Now remember to open this port in your firewall if 
-planning to access the HTTP server from a remote host!
-The parameter "Host" "[IP address]" is used to allow
-access from a single host(muliple such entries can
-be set) and the parameter "Net" "[IP net] [IP mask]"
-is used to allow access from entire net-ranges.
-To allow access from all hosts do:
- PlParam   "Net" "0.0.0.0 0.0.0.0"
-
-A configuration example:
+Remember to open the port in your firewall if planning to access the HTTP
+server from a remote host!
+
 LoadPlugin "olsrd_httpinfo.so.0.1"
 {
-    PlParam     "port"   "80"
-    PlParam     "Host"   "163.24.87.3"
-    PlParam     "Host"   "80.23.53.22"
-    PlParam     "Net"    "10.0.0.0 255.0.0.0"
-    PlParam     "Net"    "192.168.0.0 255.255.0.0"
+    # The port number on which the plugin will be listening
+    # PlParam     "port"               "1978"
+
+    # IP addresses that can access the plugin, use "0.0.0.0" to allow everyone
+    # Access is always allowed from localhost (127.0.0.1).
+    # PlParam     "host"               "127.0.0.1"
+    # PlParam     "host"               "80.23.53.22"
+
+    # Networks that can access the plugin (ip/netmask), use 0.0.0.0/0 to allow
+    # everyone.
+    # Access is always allowed from localhost (127.0.0.1).
+    # PlParam     "net"                "0.0.0.0/0"
+    # PlParam     "net"                "104.0.0.0/16"
+    # PlParam     "net"                "192.168.0.0/16"
+
+    # Set to true to resolve host names
+    # PlParam     "resolve"            "false"
 }
 
-This will run the webserver on port 80(the normal
-HTTP port) and allow access from the hosts 163.24.87.3
-and 80.23.53.22 and the networks 10.0.0.0/8 and
-192.168.0.0/16.
-access is always allowed from 127.0.0.1(localhost).
-
 -----------------------------------------------------
 
  EXPERIMENTAL ADMIN INTERFACE
 
-The plugin can be compiled with a experimental 
-adminitrator interface. This is a web page that will
-let the user change olsrd settings in realtime.
-To compile with this feature pass ADMIN_INTERFACE=1
-as an argument to make(eg. make ADMIN_INTERFACE=1)
+The plugin can be compiled with a experimental administrator interface. This
+is a web page that will let the user change olsrd settings in real-time.
+
+To compile with this feature pass ADMIN_INTERFACE=1 as an argument to make
+(eg. make ADMIN_INTERFACE=1)
 
 -----------------------------------------------------
 
 NOTE!
-This plugin is very olsrd version sensitive. This means
-that to be sure everything woks as it is supposed to
-you should use the version of olsrd that the plugin 
-was shipped with. If using CVS you should check 
-out/update both olsrd and this plugin.
-
-The plugin should now compile on windows and FreeBSD
-as well.
+This plugin is very olsrd version sensitive. This means that to be sure
+everything works as it is supposed to you should use the version of olsrd that
+the plugin was shipped with. If using CVS you should check out/update both
+olsrd and this plugin.
+
+The plugin should now compile on windows and FreeBSD as well.
+
 To compile in windows:
-make OS=win32
-to compile in FreeBSD:
-gmake OS=fbsd
+  make OS=win32
+To compile in FreeBSD:
+  gmake OS=fbsd
 
-installation:
+Installation:
 make
 make install
 
index 5d609f2..f1a5bab 100644 (file)
@@ -1590,7 +1590,7 @@ static void sgw_ipvx(struct autobuf *abuf, bool ipv6) {
           abuf_appendf(abuf, "      <td>%u</td>\n", gw->gw->uplink);
           abuf_appendf(abuf, "      <td>%u</td>\n", gw->gw->downlink);
 
-          if (tc->path_cost == ROUTE_COST_BROKEN) {
+          if (!tc || tc->path_cost == ROUTE_COST_BROKEN) {
             abuf_appendf(abuf, "      <td>Unreachable</td>\n");
           } else {
             abuf_appendf(abuf, "      <td>%u</td>\n", etx);
index 2f6ea40..854f093 100644 (file)
@@ -60,33 +60,32 @@ futher parameters.  Here's an example configuration for UNIX systems
 
 LoadPlugin "olsrd_jsoninfo.so.0.0"
 {
-    # the default port is 9090 but you can change it like this:
-    #PlParam     "port"   "8080"
-
-    # You can set a "accept" single address to allow to connect to
-    # jsoninfo. If no address is specified, then localhost (127.0.0.1)
-    # is allowed by default.  jsoninfo will only use the first "accept"
-    # parameter specified and will ignore the rest.
-
-    # Set this parameter to activate the IPV6_V6ONLY flag for the plugin
-    # to prevent it from receiving IPv4 messages
-    #PlParam     "ipv6only"   "false"
-
-    # to allow a specific host:
-    #PlParam      "accept" "172.29.44.23"
-    # if you set it to 0.0.0.0, it will accept all connections
-    #PlParam      "accept" "0.0.0.0"
-
-    # The "httpheaders" parameter prepends HTTP headers to the reply.
-    # If not set it will default to "no" and have the same behaviour as before.
-    # Among with a minimal set of headers also Cross-origin resource sharing
-    # headers (CORS) are included in reply allowing the json retrieval by
-    # javascript applications not served by olsrd itself.
-    # You can enable it uncommenting the following line:
-    #PlParam      "httpheaders" "yes"
-
-    # specify a UUID for this node to track it for debugging
-    #PlParam      "UUIDFile" "/etc/olsrd/olsrd.uuid"
+    # The port number on which the plugin will be listening
+    # PlParam     "port"               "9090"
+
+    # You can set an "accept" IP address that is allowed to connect to
+    # the plugin. If no address is specified, then localhost (127.0.0.1)
+    # is allowed by default.  Only the last parameter specified will be used,
+    # others will be ignored.
+    # Use 0.0.0.0 to accept all connections
+    # PlParam     "accept"             "127.0.0.1"
+
+    # You can set a "listen" IP address that is used to determine the interface
+    # on which the plugin will be listening. If no address is specified, then
+    # the plugin will listen on all interfaes. Only the last parameter specified
+    # will be used, others will be ignored.
+    # PlParam     "listen"             "0.0.0.0"
+
+    # The first line of the specified file will be read. This line will then be
+    # included in the JSON reply as the value of the 'uuid' field.
+    # Mainly used for debugging.
+    # PlParam     "uuidfile"           "uuid.txt"
+
+    # Set to true to prepend HTTP headers before the JSON reply
+    # PlParam     "httpheaders"        "false"
+
+    # Set to true to only listen on IPv6 addresses when running in IPv6 mode.
+    # PlParam     "ipv6only"           "false"
 }
 
 
index d421f7d..111dde0 100644 (file)
@@ -48,7 +48,6 @@
  * Dynamic linked library for the olsr.org olsr daemon
  */
 
-
 #include <sys/types.h>
 #include <sys/socket.h>
 #ifndef _WIN32
@@ -66,6 +65,7 @@
 #include <errno.h>
 #include <ctype.h>
 #include <libgen.h>
+#include <assert.h>
 
 #ifdef __linux__
 #include <fcntl.h>
@@ -86,6 +86,7 @@
 #include "lq_plugin.h"
 #include "common/autobuf.h"
 #include "gateway.h"
+#include "egressTypes.h"
 
 #include "olsrd_jsoninfo.h"
 #include "olsrd_plugin.h"
@@ -104,33 +105,10 @@ static int plugin_ipc_init(void);
 
 static int read_uuid_from_file(const char *file);
 
-static void abuf_json_open_object(struct autobuf *abuf, const char* header);
-static void abuf_json_close_object(struct autobuf *abuf);
-static void abuf_json_open_array(struct autobuf *abuf, const char* header);
-static void abuf_json_close_array(struct autobuf *abuf);
-static void abuf_json_open_array_entry(struct autobuf *abuf);
-static void abuf_json_close_array_entry(struct autobuf *abuf);
-static void abuf_json_boolean(struct autobuf *abuf, const char* key, int value);
-static void abuf_json_string(struct autobuf *abuf, const char* key, const char* value);
-static void abuf_json_int(struct autobuf *abuf, const char* key, long value);
-static void abuf_json_float(struct autobuf *abuf, const char* key, float value);
-
 static void send_info(unsigned int /*send_what*/, int /*socket*/);
 static void ipc_action(int, void *, unsigned int);
-static void ipc_print_neighbors(struct autobuf *);
-static void ipc_print_links(struct autobuf *);
-static void ipc_print_routes(struct autobuf *);
-static void ipc_print_topology(struct autobuf *);
-static void ipc_print_hna(struct autobuf *);
-static void ipc_print_mid(struct autobuf *);
-static void ipc_print_gateways(struct autobuf *);
-static void ipc_print_config(struct autobuf *);
-static void ipc_print_interfaces(struct autobuf *);
-static void ipc_print_plugins(struct autobuf *);
-static void ipc_print_olsrd_conf(struct autobuf *abuf);
-
-static size_t build_http_header(const char *status, const char *mime,
-  uint32_t msgsize, char *buf, uint32_t bufsize);
+
+static size_t build_http_header(const char *status, const char *mime, uint32_t msgsize, char *buf, uint32_t bufsize);
 
 /*
  * this is the size of the buffer used for build_http_header
@@ -152,18 +130,21 @@ static size_t build_http_header(const char *status, const char *mime,
 #define SIW_TOPOLOGY 0x0020
 #define SIW_GATEWAYS 0x0040
 #define SIW_INTERFACES 0x0080
-#define SIW_RUNTIME_ALL 0x00FF
+#define SIW_2HOP 0x0100
+#define SIW_SGW 0x0200
+#define SIW_RUNTIME_ALL (SIW_NEIGHBORS | SIW_LINKS | SIW_ROUTES | SIW_HNA | SIW_MID | SIW_TOPOLOGY | SIW_GATEWAYS | SIW_INTERFACES | SIW_2HOP | SIW_SGW)
 
 /* these only change at olsrd startup */
-#define SIW_CONFIG 0x0100
-#define SIW_PLUGINS 0x0200
-#define SIW_STARTUP_ALL 0x0F00
+#define SIW_VERSION 0x0400
+#define SIW_CONFIG 0x0800
+#define SIW_PLUGINS 0x1000
+#define SIW_STARTUP_ALL (SIW_VERSION | SIW_CONFIG | SIW_PLUGINS)
 
 /* this is everything in JSON format */
-#define SIW_ALL 0x0FFF
+#define SIW_ALL (SIW_RUNTIME_ALL | SIW_STARTUP_ALL)
 
 /* this data is not JSON format but olsrd.conf format */
-#define SIW_OLSRD_CONF 0x1000
+#define SIW_OLSRD_CONF 0x2000
 
 #define MAX_CLIENTS 3
 
@@ -179,144 +160,130 @@ char uuidfile[FILENAME_MAX];
 static struct timeval start_time;
 static struct timer_entry *writetimer_entry;
 
-
 /* JSON support functions */
 
 /* JSON does not allow commas dangling at the end of arrays, so we need to
  * count which entry number we're at in order to make sure we don't tack a
  * dangling comma on at the end */
-static int entrynumber[5] = {0,0,0,0,0};
+static int entrynumber[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 static int currentjsondepth = 0;
 
-static void
-abuf_json_open_object(struct autobuf *abuf, const char* header)
-{
-  abuf_appendf(abuf, "\"%s\": {", header);
-  entrynumber[currentjsondepth]++;
-  currentjsondepth++;
-  entrynumber[currentjsondepth] = 0;
-}
+static void abuf_json_new_indent(struct autobuf *abuf) {
+  int i = currentjsondepth;
 
-static void
-abuf_json_close_object(struct autobuf *abuf)
-{
-  abuf_appendf(abuf, "\t}\n");
-  currentjsondepth--;
-}
+  if (!i) {
+    return;
+  }
 
-static void
-abuf_json_open_array(struct autobuf *abuf, const char* header)
-{
-  if (entrynumber[currentjsondepth])
-    abuf_appendf(abuf, ",\n\t");
-  abuf_appendf(abuf, "\"%s\": [\n", header);
-  entrynumber[currentjsondepth]++;
-  currentjsondepth++;
-  entrynumber[currentjsondepth] = 0;
+  abuf_puts(abuf, "\n");
+  while (i-- > 0) {
+    abuf_puts(abuf, "  ");
+  }
 }
 
-static void
-abuf_json_close_array(struct autobuf *abuf)
-{
-  abuf_appendf(abuf, "]\n");
-  entrynumber[currentjsondepth] = 0;
-  currentjsondepth--;
+static void abuf_json_mark_output(bool open, struct autobuf *abuf) {
+  if (open) {
+    assert(!currentjsondepth);
+    abuf_json_new_indent(abuf);
+    abuf_puts(abuf, "{");
+    currentjsondepth++;
+    entrynumber[currentjsondepth] = 0;
+  } else {
+    entrynumber[currentjsondepth] = 0;
+    currentjsondepth--;
+    assert(!currentjsondepth);
+    abuf_json_new_indent(abuf);
+    abuf_puts(abuf, "\n}");
+  }
 }
 
-static void
-abuf_json_open_array_entry(struct autobuf *abuf)
-{
-  if (entrynumber[currentjsondepth])
-    abuf_appendf(abuf, ",\n{");
-  else
-    abuf_appendf(abuf, "{");
-  entrynumber[currentjsondepth]++;
-  currentjsondepth++;
-  entrynumber[currentjsondepth] = 0;
+static void abuf_json_mark_object(bool open, bool array, struct autobuf *abuf, const char* header) {
+  if (open) {
+    if (entrynumber[currentjsondepth]) {
+      abuf_appendf(abuf, ",");
+    }
+    abuf_json_new_indent(abuf);
+    if (header) {
+      abuf_appendf(abuf, "\"%s\": %s", header, array ? "[" : "{");
+    } else {
+      abuf_appendf(abuf, "%s", array ? "[" : "{");
+    }
+    entrynumber[currentjsondepth]++;
+    currentjsondepth++;
+    entrynumber[currentjsondepth] = 0;
+  } else {
+    entrynumber[currentjsondepth] = 0;
+    currentjsondepth--;
+    abuf_json_new_indent(abuf);
+    abuf_appendf(abuf, "%s", array ? "]" : "}");
+  }
 }
 
-static void
-abuf_json_close_array_entry(struct autobuf *abuf)
-{
-  abuf_appendf(abuf, "}");
-  entrynumber[currentjsondepth] = 0;
-  currentjsondepth--;
+static void abuf_json_mark_array_entry(bool open, struct autobuf *abuf) {
+  abuf_json_mark_object(open, false, abuf, NULL);
 }
 
-static void
-abuf_json_insert_comma(struct autobuf *abuf)
-{
+static void abuf_json_insert_comma(struct autobuf *abuf) {
   if (entrynumber[currentjsondepth])
-    abuf_appendf(abuf, ",\n");
-  else
-    abuf_appendf(abuf, "\n");
-  entrynumber[currentjsondepth]++;
+    abuf_appendf(abuf, ",");
 }
 
-static void
-abuf_json_boolean(struct autobuf *abuf, const char* key, int value)
-{
+static void abuf_json_boolean(struct autobuf *abuf, const char* key, int value) {
   abuf_json_insert_comma(abuf);
-  abuf_appendf(abuf, "\t\"%s\": %s", key, value ? "true" : "false");
+  abuf_json_new_indent(abuf);
+  abuf_appendf(abuf, "\"%s\": %s", key, value ? "true" : "false");
+  entrynumber[currentjsondepth]++;
 }
 
-static void
-abuf_json_string(struct autobuf *abuf, const char* key, const char* value)
-{
+static void abuf_json_string(struct autobuf *abuf, const char* key, const char* value) {
   abuf_json_insert_comma(abuf);
-  abuf_appendf(abuf, "\t\"%s\": \"%s\"", key, value);
+  abuf_json_new_indent(abuf);
+  abuf_appendf(abuf, "\"%s\": \"%s\"", key, value);
+  entrynumber[currentjsondepth]++;
 }
 
-static void
-abuf_json_int(struct autobuf *abuf, const char* key, long value)
-{
+static void abuf_json_int(struct autobuf *abuf, const char* key, long value) {
   abuf_json_insert_comma(abuf);
-  abuf_appendf(abuf, "\t\"%s\": %li", key, value);
+  abuf_json_new_indent(abuf);
+  abuf_appendf(abuf, "\"%s\": %li", key, value);
+  entrynumber[currentjsondepth]++;
 }
 
-static void
-abuf_json_float(struct autobuf *abuf, const char* key, float value)
-{
+static void abuf_json_float(struct autobuf *abuf, const char* key, float value) {
   abuf_json_insert_comma(abuf);
-  abuf_appendf(abuf, "\t\"%s\": %.03f", key, (double)value);
+  abuf_json_new_indent(abuf);
+  abuf_appendf(abuf, "\"%s\": %.03f", key, (double) value);
+  entrynumber[currentjsondepth]++;
 }
 
-
-
 /* Linux specific functions for getting system info */
 
 #ifdef __linux__
-static int get_string_from_file(const char* filename, char* buf, int len)
-{
+static int get_string_from_file(const char* filename, char* buf, int len) {
   int bytes = -1;
   int fd = open(filename, O_RDONLY);
   if (fd > -1) {
     bytes = read(fd, buf, len);
     if (bytes < len)
-      buf[bytes-1] = '\0'; // remove trailing \n
+      buf[bytes - 1] = '\0'; // remove trailing \n
     else
-      buf[len-1] = '\0';
+      buf[len - 1] = '\0';
     close(fd);
   }
   return bytes;
 }
 
-static int
-abuf_json_sysdata(struct autobuf *abuf, const char* key, const char* syspath)
-{
+static int abuf_json_sysdata(struct autobuf *abuf, const char* key, const char* syspath) {
   int ret = -1;
   char buf[256];
   *buf = 0;
   ret = get_string_from_file(syspath, buf, 256);
-  if (*buf != 0)
+  if (*buf)
     abuf_json_string(abuf, key, buf);
   return ret;
 }
 
-static void
-abuf_json_sys_class_net(struct autobuf *abuf, const char* key,
-                        const char* ifname, const char* datapoint)
-{
+static void abuf_json_sys_class_net(struct autobuf *abuf, const char* key, const char* ifname, const char* datapoint) {
   char filename[256];
   snprintf(filename, 255, "/sys/class/net/%s/%s", ifname, datapoint);
   abuf_json_sysdata(abuf, key, filename);
@@ -324,17 +291,13 @@ abuf_json_sys_class_net(struct autobuf *abuf, const char* key,
 
 #endif /* __linux__ */
 
-
-
 /**
  *Do initialization here
  *
  *This function is called by the my_init
  *function in uolsrd_plugin.c
  */
-int
-olsrd_plugin_init(void)
-{
+int olsrd_plugin_init(void) {
   /* Initial IPC value */
   ipc_socket = -1;
 
@@ -352,16 +315,12 @@ olsrd_plugin_init(void)
 /**
  * destructor - called at unload
  */
-void
-olsr_plugin_exit(void)
-{
+void olsr_plugin_exit(void) {
   if (ipc_socket != -1)
     close(ipc_socket);
 }
 
-static int
-plugin_ipc_init(void)
-{
+static int plugin_ipc_init(void) {
   union olsr_sockaddr sst;
   uint32_t yes = 1;
   socklen_t addrlen;
@@ -373,7 +332,7 @@ plugin_ipc_init(void)
 #endif /* NODEBUG */
     return 0;
   } else {
-    if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) {
+    if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof(yes)) < 0) {
 #ifndef NODEBUG
       olsr_printf(1, "(JSONINFO) setsockopt()=%s\n", strerror(errno));
 #endif /* NODEBUG */
@@ -385,14 +344,14 @@ plugin_ipc_init(void)
       return 0;
     }
 #endif /* (defined __FreeBSD__ || defined __FreeBSD_kernel__) && defined SO_NOSIGPIPE */
-#if defined linux
+#if defined linux && defined IPV6_V6ONLY
     if (jsoninfo_ipv6_only && olsr_cnf->ip_version == AF_INET6) {
-      if (setsockopt(ipc_socket, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&yes, sizeof(yes)) < 0) {
+      if (setsockopt(ipc_socket, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &yes, sizeof(yes)) < 0) {
         perror("IPV6_V6ONLY failed");
         return 0;
       }
     }
-#endif /* defined linux */
+#endif /* defined linux && defined IPV6_V6ONLY */
     /* Bind the socket */
 
     /* complete the socket structure */
@@ -441,9 +400,7 @@ plugin_ipc_init(void)
   return 1;
 }
 
-static int
-read_uuid_from_file(const char *file)
-{
+static int read_uuid_from_file(const char *file) {
   FILE *f;
   char* end;
   int r = 0;
@@ -453,9 +410,8 @@ read_uuid_from_file(const char *file)
 
   f = fopen(file, "r");
   olsr_printf(1, "(JSONINFO) Reading UUID from '%s'\n", file);
-  if (f == NULL ) {
-    olsr_printf(1, "(JSONINFO) Could not open '%s': %s\n",
-                file, strerror(errno));
+  if (f == NULL) {
+    olsr_printf(1, "(JSONINFO) Could not open '%s': %s\n", file, strerror(errno));
     return -1;
   }
   chars = fread(uuid, 1, UUIDLEN, f);
@@ -464,12 +420,11 @@ read_uuid_from_file(const char *file)
 
     /* we only use the first line of the file */
     end = strchr(uuid, '\n');
-    if(end)
+    if (end)
       *end = 0;
     r = 0;
   } else {
-    olsr_printf(1, "(JSONINFO) Could not read UUID from '%s': %s\n",
-                file, strerror(errno));
+    olsr_printf(1, "(JSONINFO) Could not read UUID from '%s': %s\n", file, strerror(errno));
     r = -1;
   }
 
@@ -477,9 +432,7 @@ read_uuid_from_file(const char *file)
   return r;
 }
 
-static void
-ipc_action(int fd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused)))
-{
+static void ipc_action(int fd, void *data __attribute__ ((unused)), unsigned int flags __attribute__ ((unused))) {
   union olsr_sockaddr pin;
 
   char addr[INET6_ADDRSTRLEN];
@@ -505,11 +458,11 @@ ipc_action(int fd, void *data __attribute__ ((unused)), unsigned int flags __att
 #ifdef JSONINFO_ALLOW_LOCALHOST
       if (pin.in4.sin_addr.s_addr != INADDR_LOOPBACK) {
 #endif /* JSONINFO_ALLOW_LOCALHOST */
-        olsr_printf(1, "(JSONINFO) From host(%s) not allowed!\n", addr);
-        close(ipc_connection);
-        return;
+      olsr_printf(1, "(JSONINFO) From host(%s) not allowed!\n", addr);
+      close(ipc_connection);
+      return;
 #ifdef JSONINFO_ALLOW_LOCALHOST
-      }
+    }
 #endif /* JSONINFO_ALLOW_LOCALHOST */
     }
   } else {
@@ -529,229 +482,236 @@ ipc_action(int fd, void *data __attribute__ ((unused)), unsigned int flags __att
 
   /* purge read buffer to prevent blocking on linux */
   FD_ZERO(&rfds);
-  FD_SET((unsigned int)ipc_connection, &rfds);  /* Win32 needs the cast here */
+  FD_SET((unsigned int )ipc_connection, &rfds); /* Win32 needs the cast here */
   if (0 <= select(ipc_connection + 1, &rfds, NULL, NULL, &tv)) {
     char requ[1024];
-    ssize_t s = recv(ipc_connection, (void *)&requ, sizeof(requ)-1, 0);   /* Win32 needs the cast here */
+    ssize_t s = recv(ipc_connection, (void *) &requ, sizeof(requ) - 1, 0); /* Win32 needs the cast here */
 
-    if (s == sizeof(requ)-1) {
+    if (s == sizeof(requ) - 1) {
       /* input was too much long, just skip the rest */
       char dummy[1024];
 
-      while (recv(ipc_connection, (void *)&dummy, sizeof(dummy), 0) == sizeof(dummy));
+      while (recv(ipc_connection, (void *) &dummy, sizeof(dummy), 0) == sizeof(dummy))
+        ;
     }
+
     if (0 < s) {
       requ[s] = 0;
       /* print out the requested tables */
-      if (0 != strstr(requ, "/olsrd.conf"))
+      if (strstr(requ, "/olsrd.conf"))
         send_what |= SIW_OLSRD_CONF;
-      else if (0 != strstr(requ, "/all"))
+      else if (strstr(requ, "/all"))
         send_what = SIW_ALL;
       else {
         // these are the two overarching categories
-        if (0 != strstr(requ, "/runtime")) send_what |= SIW_RUNTIME_ALL;
-        if (0 != strstr(requ, "/startup")) send_what |= SIW_STARTUP_ALL;
+        if (strstr(requ, "/runtime"))
+          send_what |= SIW_RUNTIME_ALL;
+        if (strstr(requ, "/startup"))
+          send_what |= SIW_STARTUP_ALL;
+
         // these are the individual sections
-        if (0 != strstr(requ, "/neighbors")) send_what |= SIW_NEIGHBORS;
-        if (0 != strstr(requ, "/links")) send_what |= SIW_LINKS;
-        if (0 != strstr(requ, "/routes")) send_what |= SIW_ROUTES;
-        if (0 != strstr(requ, "/hna")) send_what |= SIW_HNA;
-        if (0 != strstr(requ, "/mid")) send_what |= SIW_MID;
-        if (0 != strstr(requ, "/topology")) send_what |= SIW_TOPOLOGY;
-        if (0 != strstr(requ, "/gateways")) send_what |= SIW_GATEWAYS;
-        if (0 != strstr(requ, "/interfaces")) send_what |= SIW_INTERFACES;
-        if (0 != strstr(requ, "/config")) send_what |= SIW_CONFIG;
-        if (0 != strstr(requ, "/plugins")) send_what |= SIW_PLUGINS;
+        if (strstr(requ, "/neighbors"))
+          send_what |= SIW_NEIGHBORS;
+        if (strstr(requ, "/links"))
+          send_what |= SIW_LINKS;
+        if (strstr(requ, "/routes"))
+          send_what |= SIW_ROUTES;
+        if (strstr(requ, "/hna"))
+          send_what |= SIW_HNA;
+        if (strstr(requ, "/mid"))
+          send_what |= SIW_MID;
+        if (strstr(requ, "/topology"))
+          send_what |= SIW_TOPOLOGY;
+        if (strstr(requ, "/gateways"))
+          send_what |= SIW_GATEWAYS;
+        if (strstr(requ, "/interfaces"))
+          send_what |= SIW_INTERFACES;
+        if (strstr(requ, "/2hop"))
+          send_what |= SIW_2HOP;
+        if (strstr(requ, "/sgw"))
+          send_what |= SIW_SGW;
+
+        // specials
+        if (strstr(requ, "/version"))
+          send_what |= SIW_VERSION;
+        if (strstr(requ, "/config"))
+          send_what |= SIW_CONFIG;
+        if (strstr(requ, "/plugins"))
+          send_what |= SIW_PLUGINS;
       }
     }
-    if ( send_what == 0 ) send_what = SIW_ALL;
+    if (!send_what)
+      send_what = SIW_ALL;
   }
 
   send_info(send_what, ipc_connection);
 }
 
-static void
-ipc_print_neighbors(struct autobuf *abuf)
-{
+static void ipc_print_neighbors(struct autobuf *abuf, bool list_2hop) {
   struct ipaddr_str buf1;
   struct neighbor_entry *neigh;
   struct neighbor_2_list_entry *list_2;
   int thop_cnt;
 
-  abuf_json_open_array(abuf, "neighbors");
+  if (!list_2hop)
+    abuf_json_mark_object(true, true, abuf, "neighbors");
+  else
+    abuf_json_mark_object(true, true, abuf, "2hop");
 
   /* Neighbors */
-  OLSR_FOR_ALL_NBR_ENTRIES(neigh) {
-    abuf_json_open_array_entry(abuf);
-    abuf_json_string(abuf, "ipv4Address",
-                     olsr_ip_to_string(&buf1, &neigh->neighbor_main_addr));
-    abuf_json_boolean(abuf, "symmetric", (neigh->status == SYM));
-    abuf_json_boolean(abuf, "multiPointRelay", neigh->is_mpr);
-    abuf_json_boolean(abuf, "multiPointRelaySelector",
-                      olsr_lookup_mprs_set(&neigh->neighbor_main_addr) != NULL);
-    abuf_json_int(abuf, "willingness", neigh->willingness);
-    abuf_appendf(abuf, ",\n");
-
-    thop_cnt = 0;
-    if (neigh->neighbor_2_list.next) {
-      abuf_appendf(abuf, "\t\"twoHopNeighbors\": [");
-      for (list_2 = neigh->neighbor_2_list.next; list_2 != &neigh->neighbor_2_list; list_2 = list_2->next) {
-        if (thop_cnt)
-          abuf_appendf(abuf, ", ");
-        abuf_appendf(abuf,
-                     "\"%s\"",
-                     olsr_ip_to_string(&buf1, &list_2->neighbor_2->neighbor_2_addr));
-        thop_cnt++;
-      }
-    }
-    abuf_appendf(abuf, "]");
-    abuf_json_int(abuf, "twoHopNeighborCount", thop_cnt);
-    abuf_json_close_array_entry(abuf);
-  }
-  OLSR_FOR_ALL_NBR_ENTRIES_END(neigh);
-  abuf_json_close_array(abuf);
+  OLSR_FOR_ALL_NBR_ENTRIES(neigh)
+      {
+        abuf_json_mark_array_entry(true, abuf);
+
+        abuf_json_string(abuf, "ipAddress", olsr_ip_to_string(&buf1, &neigh->neighbor_main_addr));
+        abuf_json_boolean(abuf, "symmetric", (neigh->status == SYM));
+        abuf_json_boolean(abuf, "multiPointRelay", neigh->is_mpr);
+        abuf_json_boolean(abuf, "multiPointRelaySelector", olsr_lookup_mprs_set(&neigh->neighbor_main_addr) != NULL);
+        abuf_json_int(abuf, "willingness", neigh->willingness);
+        thop_cnt = 0;
+
+        if (!list_2hop) {
+          for (list_2 = neigh->neighbor_2_list.next; list_2 != &neigh->neighbor_2_list; list_2 = list_2->next) {
+            thop_cnt++;
+          }
+          abuf_json_int(abuf, "twoHopNeighborCount", thop_cnt);
+        } else {
+          abuf_json_mark_object(true, true, abuf, "twoHopNeighbors");
+          for (list_2 = neigh->neighbor_2_list.next; list_2 != &neigh->neighbor_2_list; list_2 = list_2->next) {
+            abuf_json_mark_array_entry(true, abuf);
+            abuf_json_string(abuf, "ipAddress", olsr_ip_to_string(&buf1, &list_2->neighbor_2->neighbor_2_addr));
+            abuf_json_mark_array_entry(false, abuf);
+          }
+          abuf_json_mark_object(false, true, abuf, false);
+        }
+
+        abuf_json_mark_array_entry(false, abuf);
+      }OLSR_FOR_ALL_NBR_ENTRIES_END(neigh);
+  abuf_json_mark_object(false, true, abuf, NULL);
 }
 
-static void
-ipc_print_links(struct autobuf *abuf)
-{
+static void ipc_print_links(struct autobuf *abuf) {
   struct ipaddr_str buf1, buf2;
   struct lqtextbuffer lqbuffer1;
 
   struct link_entry *my_link = NULL;
 
-  abuf_json_open_array(abuf, "links");
-  OLSR_FOR_ALL_LINK_ENTRIES(my_link) {
-    const char* lqs;
-    int diff = (unsigned int)(my_link->link_timer->timer_clock - now_times);
-
-    abuf_json_open_array_entry(abuf);
-    abuf_json_string(abuf, "localIP",
-                     olsr_ip_to_string(&buf1, &my_link->local_iface_addr));
-    abuf_json_string(abuf, "remoteIP",
-                     olsr_ip_to_string(&buf2, &my_link->neighbor_iface_addr));
-    abuf_json_int(abuf, "validityTime", diff);
-    lqs = get_link_entry_text(my_link, '\t', &lqbuffer1);
-    abuf_json_float(abuf, "linkQuality", atof(lqs));
-    abuf_json_float(abuf, "neighborLinkQuality", atof(strrchr(lqs, '\t')));
-    if (my_link->linkcost >= LINK_COST_BROKEN)
-      abuf_json_int(abuf, "linkCost", LINK_COST_BROKEN);
-    else
-      abuf_json_int(abuf, "linkCost", my_link->linkcost);
-    abuf_json_close_array_entry(abuf);
-  }
-  OLSR_FOR_ALL_LINK_ENTRIES_END(my_link);
-  abuf_json_close_array(abuf);
+  abuf_json_mark_object(true, true, abuf, "links");
+
+  OLSR_FOR_ALL_LINK_ENTRIES(my_link)
+      {
+        const char* lqs;
+        int diff = (unsigned int) (my_link->link_timer->timer_clock - now_times);
+
+        abuf_json_mark_array_entry(true, abuf);
+        abuf_json_string(abuf, "localIP", olsr_ip_to_string(&buf1, &my_link->local_iface_addr));
+        abuf_json_string(abuf, "remoteIP", olsr_ip_to_string(&buf2, &my_link->neighbor_iface_addr));
+        abuf_json_int(abuf, "validityTime", diff);
+        lqs = get_link_entry_text(my_link, '\t', &lqbuffer1);
+        abuf_json_float(abuf, "linkQuality", atof(lqs));
+        abuf_json_float(abuf, "neighborLinkQuality", atof(strrchr(lqs, '\t')));
+        if (my_link->linkcost >= LINK_COST_BROKEN)
+          abuf_json_int(abuf, "linkCost", LINK_COST_BROKEN);
+        else
+          abuf_json_int(abuf, "linkCost", my_link->linkcost);
+        abuf_json_mark_array_entry(false, abuf);
+      }OLSR_FOR_ALL_LINK_ENTRIES_END(my_link);
+  abuf_json_mark_object(false, true, abuf, NULL);
 }
 
-static void
-ipc_print_routes(struct autobuf *abuf)
-{
+static void ipc_print_routes(struct autobuf *abuf) {
   struct ipaddr_str buf1, buf2;
   struct rt_entry *rt;
 
-  abuf_json_open_array(abuf, "routes");
+  abuf_json_mark_object(true, true, abuf, "routes");
 
   /* Walk the route table */
-  OLSR_FOR_ALL_RT_ENTRIES(rt) {
-    abuf_json_open_array_entry(abuf);
-    abuf_json_string(abuf, "destination",
-                     olsr_ip_to_string(&buf1, &rt->rt_dst.prefix));
-    abuf_json_int(abuf, "genmask", rt->rt_dst.prefix_len);
-    abuf_json_string(abuf, "gateway",
-                     olsr_ip_to_string(&buf2, &rt->rt_best->rtp_nexthop.gateway));
-    abuf_json_int(abuf, "metric", rt->rt_best->rtp_metric.hops);
-    if (rt->rt_best->rtp_metric.cost >= ROUTE_COST_BROKEN)
-      abuf_json_int(abuf, "rtpMetricCost", ROUTE_COST_BROKEN);
-    else
-      abuf_json_int(abuf, "rtpMetricCost", rt->rt_best->rtp_metric.cost);
-    abuf_json_string(abuf, "networkInterface",
-                     if_ifwithindex_name(rt->rt_best->rtp_nexthop.iif_index));
-    abuf_json_close_array_entry(abuf);
-  }
-  OLSR_FOR_ALL_RT_ENTRIES_END(rt);
+  OLSR_FOR_ALL_RT_ENTRIES(rt)
+      {
+        abuf_json_mark_array_entry(true, abuf);
+        abuf_json_string(abuf, "destination", olsr_ip_to_string(&buf1, &rt->rt_dst.prefix));
+        abuf_json_int(abuf, "genmask", rt->rt_dst.prefix_len);
+        abuf_json_string(abuf, "gateway", olsr_ip_to_string(&buf2, &rt->rt_best->rtp_nexthop.gateway));
+        abuf_json_int(abuf, "metric", rt->rt_best->rtp_metric.hops);
+        if (rt->rt_best->rtp_metric.cost >= ROUTE_COST_BROKEN)
+          abuf_json_int(abuf, "rtpMetricCost", ROUTE_COST_BROKEN);
+        else
+          abuf_json_int(abuf, "rtpMetricCost", rt->rt_best->rtp_metric.cost);
+        abuf_json_string(abuf, "networkInterface", if_ifwithindex_name(rt->rt_best->rtp_nexthop.iif_index));
+        abuf_json_mark_array_entry(false, abuf);
+      }OLSR_FOR_ALL_RT_ENTRIES_END(rt);
 
-  abuf_json_close_array(abuf);
+  abuf_json_mark_object(false, true, abuf, NULL);
 }
 
-static void
-ipc_print_topology(struct autobuf *abuf)
-{
+static void ipc_print_topology(struct autobuf *abuf) {
   struct tc_entry *tc;
 
-  abuf_json_open_array(abuf, "topology");
+  abuf_json_mark_object(true, true, abuf, "topology");
 
   /* Topology */
-  OLSR_FOR_ALL_TC_ENTRIES(tc) {
-    struct tc_edge_entry *tc_edge;
-    OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge) {
-      if (tc_edge->edge_inv) {
-        struct ipaddr_str dstbuf, addrbuf;
-        struct lqtextbuffer lqbuffer1;
-        uint32_t vt = tc->validity_timer != NULL ? (tc->validity_timer->timer_clock - now_times) : 0;
-        int diff = (int)(vt);
-        const char* lqs;
-        abuf_json_open_array_entry(abuf);
-        abuf_json_string(abuf, "destinationIP",
-                         olsr_ip_to_string(&dstbuf, &tc_edge->T_dest_addr));
-        abuf_json_string(abuf, "lastHopIP",
-                         olsr_ip_to_string(&addrbuf, &tc->addr));
-        lqs = get_tc_edge_entry_text(tc_edge, '\t', &lqbuffer1);
-        abuf_json_float(abuf, "linkQuality", atof(lqs));
-        abuf_json_float(abuf, "neighborLinkQuality", atof(strrchr(lqs, '\t')));
-        if (tc_edge->cost >= LINK_COST_BROKEN)
-          abuf_json_int(abuf, "tcEdgeCost", LINK_COST_BROKEN);
-        else
-          abuf_json_int(abuf, "tcEdgeCost", tc_edge->cost);
-        abuf_json_int(abuf, "validityTime", diff);
-        abuf_json_close_array_entry(abuf);
-      }
-    }
-    OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge);
-  }
-  OLSR_FOR_ALL_TC_ENTRIES_END(tc);
-
-  abuf_json_close_array(abuf);
+  OLSR_FOR_ALL_TC_ENTRIES(tc)
+      {
+        struct tc_edge_entry *tc_edge;
+        OLSR_FOR_ALL_TC_EDGE_ENTRIES(tc, tc_edge)
+            {
+              if (tc_edge->edge_inv) {
+                struct ipaddr_str dstbuf, addrbuf;
+                struct lqtextbuffer lqbuffer1;
+                uint32_t vt = tc->validity_timer != NULL ? (tc->validity_timer->timer_clock - now_times) : 0;
+                int diff = (int) (vt);
+                const char* lqs;
+                abuf_json_mark_array_entry(true, abuf);
+                abuf_json_string(abuf, "destinationIP", olsr_ip_to_string(&dstbuf, &tc_edge->T_dest_addr));
+                abuf_json_string(abuf, "lastHopIP", olsr_ip_to_string(&addrbuf, &tc->addr));
+                lqs = get_tc_edge_entry_text(tc_edge, '\t', &lqbuffer1);
+                abuf_json_float(abuf, "linkQuality", atof(lqs));
+                abuf_json_float(abuf, "neighborLinkQuality", atof(strrchr(lqs, '\t')));
+                if (tc_edge->cost >= LINK_COST_BROKEN)
+                  abuf_json_int(abuf, "tcEdgeCost", LINK_COST_BROKEN);
+                else
+                  abuf_json_int(abuf, "tcEdgeCost", tc_edge->cost);
+                abuf_json_int(abuf, "validityTime", diff);
+                abuf_json_mark_array_entry(false, abuf);
+              }
+            }OLSR_FOR_ALL_TC_EDGE_ENTRIES_END(tc, tc_edge);
+      }OLSR_FOR_ALL_TC_ENTRIES_END(tc);
+
+  abuf_json_mark_object(false, true, abuf, NULL);
 }
 
-static void
-ipc_print_hna(struct autobuf *abuf)
-{
+static void ipc_print_hna(struct autobuf *abuf) {
   struct hna_entry *tmp_hna;
   struct hna_net *tmp_net;
   struct ipaddr_str buf, mainaddrbuf;
 
-  abuf_json_open_array(abuf, "hna");
-
-  OLSR_FOR_ALL_HNA_ENTRIES(tmp_hna) {
-
-    /* Check all networks */
-    for (tmp_net = tmp_hna->networks.next; tmp_net != &tmp_hna->networks; tmp_net = tmp_net->next) {
-      uint32_t vt = tmp_net->hna_net_timer != NULL ? (tmp_net->hna_net_timer->timer_clock - now_times) : 0;
-      int diff = (int)(vt);
-      abuf_json_open_array_entry(abuf);
-      abuf_json_string(abuf, "destination",
-                       olsr_ip_to_string(&buf, &tmp_net->hna_prefix.prefix)),
-      abuf_json_int(abuf, "genmask", tmp_net->hna_prefix.prefix_len);
-      abuf_json_string(abuf, "gateway",
-                       olsr_ip_to_string(&mainaddrbuf, &tmp_hna->A_gateway_addr));
-      abuf_json_int(abuf, "validityTime", diff);
-      abuf_json_close_array_entry(abuf);
-    }
-  }
-  OLSR_FOR_ALL_HNA_ENTRIES_END(tmp_hna);
-
-  abuf_json_close_array(abuf);
+  abuf_json_mark_object(true, true, abuf, "hna");
+
+  OLSR_FOR_ALL_HNA_ENTRIES(tmp_hna)
+        {
+
+          /* Check all networks */
+          for (tmp_net = tmp_hna->networks.next; tmp_net != &tmp_hna->networks; tmp_net = tmp_net->next) {
+            uint32_t vt = tmp_net->hna_net_timer != NULL ? (tmp_net->hna_net_timer->timer_clock - now_times) : 0;
+            int diff = (int) (vt);
+            abuf_json_mark_array_entry(true, abuf);
+            abuf_json_string(abuf, "destination", olsr_ip_to_string(&buf, &tmp_net->hna_prefix.prefix)), abuf_json_int(abuf, "genmask",
+                tmp_net->hna_prefix.prefix_len);
+            abuf_json_string(abuf, "gateway", olsr_ip_to_string(&mainaddrbuf, &tmp_hna->A_gateway_addr));
+            abuf_json_int(abuf, "validityTime", diff);
+            abuf_json_mark_array_entry(false, abuf);
+          }
+        }OLSR_FOR_ALL_HNA_ENTRIES_END(tmp_hna);
+
+  abuf_json_mark_object(false, true, abuf, NULL);
 }
 
-static void
-ipc_print_mid(struct autobuf *abuf)
-{
+static void ipc_print_mid(struct autobuf *abuf) {
   int idx;
   struct mid_entry *entry;
   struct mid_address *alias;
 
-  abuf_json_open_array(abuf, "mid");
+  abuf_json_mark_object(true, true, abuf, "mid");
 
   /* MID */
   for (idx = 0; idx < HASHSIZE; idx++) {
@@ -759,35 +719,31 @@ ipc_print_mid(struct autobuf *abuf)
 
     while (entry != &mid_set[idx]) {
       struct ipaddr_str buf, buf2;
-      abuf_json_open_array_entry(abuf);
-      abuf_json_string(abuf, "ipAddress",
-                       olsr_ip_to_string(&buf, &entry->main_addr));
+      abuf_json_mark_array_entry(true, abuf);
+      abuf_json_string(abuf, "ipAddress", olsr_ip_to_string(&buf, &entry->main_addr));
 
-      abuf_json_open_array(abuf, "aliases");
+      abuf_json_mark_object(true, true, abuf, "aliases");
       alias = entry->aliases;
       while (alias) {
         uint32_t vt = alias->vtime - now_times;
-        int diff = (int)(vt);
+        int diff = (int) (vt);
 
-        abuf_json_open_array_entry(abuf);
-        abuf_json_string(abuf, "ipAddress",
-                         olsr_ip_to_string(&buf2, &alias->alias));
+        abuf_json_mark_array_entry(true, abuf);
+        abuf_json_string(abuf, "ipAddress", olsr_ip_to_string(&buf2, &alias->alias));
         abuf_json_int(abuf, "validityTime", diff);
-        abuf_json_close_array_entry(abuf);
+        abuf_json_mark_array_entry(false, abuf);
 
         alias = alias->next_alias;
       }
-      abuf_json_close_array(abuf); // aliases
-      abuf_json_close_array_entry(abuf);
+      abuf_json_mark_object(false, true, abuf, NULL); // aliases
+      abuf_json_mark_array_entry(false, abuf);
       entry = entry->next;
     }
   }
-  abuf_json_close_array(abuf); // mid
+  abuf_json_mark_object(false, true, abuf, NULL); // mid
 }
 
-static void
-ipc_print_gateways(struct autobuf *abuf)
-{
+static void ipc_print_gateways(struct autobuf *abuf) {
 #ifndef __linux__
   abuf_json_string(abuf, "error", "Gateway mode is only supported in Linux");
 #else /* __linux__ */
@@ -795,73 +751,67 @@ ipc_print_gateways(struct autobuf *abuf)
   struct ipaddr_str buf;
   struct gateway_entry *gw;
 
-  abuf_json_open_array(abuf, "gateways");
-  OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) {
-    const char *v4 = "", *v6 = "";
-    bool autoV4 = false, autoV6 = false;
-    const char *ipType = "";
-    struct tc_entry *tc;
+  abuf_json_mark_object(true, true, abuf, "gateways");
+  OLSR_FOR_ALL_GATEWAY_ENTRIES(gw)
+      {
+        const char *v4 = "", *v6 = "";
+        bool autoV4 = false, autoV6 = false;
+        const char *ipType = "";
+        struct tc_entry *tc;
 
-    if ((tc = olsr_lookup_tc_entry(&gw->originator)) == NULL) {
-      continue;
-    }
+        if ((tc = olsr_lookup_tc_entry(&gw->originator)) == NULL) {
+          continue;
+        }
 
-    if (gw == olsr_get_inet_gateway(false)) {
-      v4 = "s";
-    } else if (gw->ipv4 && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit)
-               && (olsr_cnf->smart_gw_allow_nat || !gw->ipv4nat)) {
-      v4 = "u";
-    }
+        if (gw == olsr_get_inet_gateway(false)) {
+          v4 = "s";
+        } else if (gw->ipv4 && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit) && (olsr_cnf->smart_gw_allow_nat || !gw->ipv4nat)) {
+          v4 = "u";
+        }
 
-    if (gw == olsr_get_inet_gateway(true)) {
-      v6 = "s";
-    } else if (gw->ipv6 && olsr_cnf->ip_version == AF_INET6) {
-      v6 = "u";
-    }
+        if (gw == olsr_get_inet_gateway(true)) {
+          v6 = "s";
+        } else if (gw->ipv6 && olsr_cnf->ip_version == AF_INET6) {
+          v6 = "u";
+        }
 
-    abuf_json_open_array_entry(abuf);
-    if (gw->ipv4) {
-      ipType = "ipv4";
-      abuf_json_string(abuf, "ipv4Status", v4);
-    } else if (gw->ipv6) {
-      ipType = "ipv6";
-      abuf_json_string(abuf, "ipv6Status", v6);
-    }
-    abuf_json_string(abuf, "ipType", ipType);
-    abuf_json_boolean(abuf, "ipv4", gw->ipv4);
-    abuf_json_boolean(abuf, "ipv4Nat", gw->ipv4nat);
-    abuf_json_boolean(abuf, "ipv6", gw->ipv6);
-    abuf_json_boolean(abuf, "autoIpv4", autoV4);
-    abuf_json_boolean(abuf, "autoIpv6", autoV6);
-    abuf_json_string(abuf, "ipAddress",
-                     olsr_ip_to_string(&buf, &gw->originator));
-    if (tc->path_cost >= ROUTE_COST_BROKEN)
-      abuf_json_int(abuf, "tcPathCost", ROUTE_COST_BROKEN);
-    else
-      abuf_json_int(abuf, "tcPathCost", tc->path_cost);
-    abuf_json_int(abuf, "hopCount", tc->hops);
-    abuf_json_int(abuf, "uplinkSpeed", gw->uplink);
-    abuf_json_int(abuf, "downlinkSpeed", gw->downlink);
-    if(gw->external_prefix.prefix_len == 0)
-      abuf_json_string(abuf, "externalPrefix",
-                       olsr_ip_prefix_to_string(&gw->external_prefix));
-    abuf_json_close_array_entry(abuf);
-  }
-  OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw)
-  abuf_json_close_array(abuf);
+        abuf_json_mark_array_entry(true, abuf);
+        if (gw->ipv4) {
+          ipType = "ipv4";
+          abuf_json_string(abuf, "ipv4Status", v4);
+        } else if (gw->ipv6) {
+          ipType = "ipv6";
+          abuf_json_string(abuf, "ipv6Status", v6);
+        }
+        abuf_json_string(abuf, "ipType", ipType);
+        abuf_json_boolean(abuf, "ipv4", gw->ipv4);
+        abuf_json_boolean(abuf, "ipv4Nat", gw->ipv4nat);
+        abuf_json_boolean(abuf, "ipv6", gw->ipv6);
+        abuf_json_boolean(abuf, "autoIpv4", autoV4);
+        abuf_json_boolean(abuf, "autoIpv6", autoV6);
+        abuf_json_string(abuf, "ipAddress", olsr_ip_to_string(&buf, &gw->originator));
+        if (tc->path_cost >= ROUTE_COST_BROKEN)
+          abuf_json_int(abuf, "tcPathCost", ROUTE_COST_BROKEN);
+        else
+          abuf_json_int(abuf, "tcPathCost", tc->path_cost);
+        abuf_json_int(abuf, "hopCount", tc->hops);
+        abuf_json_int(abuf, "uplinkSpeed", gw->uplink);
+        abuf_json_int(abuf, "downlinkSpeed", gw->downlink);
+        if (!gw->external_prefix.prefix_len)
+          abuf_json_string(abuf, "externalPrefix", olsr_ip_prefix_to_string(&gw->external_prefix));
+        abuf_json_mark_array_entry(false, abuf);
+      }OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw)
+  abuf_json_mark_object(false, true, abuf, NULL);
 #endif /* __linux__ */
 }
 
-
-static void
-ipc_print_plugins(struct autobuf *abuf)
-{
+static void ipc_print_plugins(struct autobuf *abuf) {
   struct plugin_entry *pentry;
   struct plugin_param *pparam;
-  abuf_json_open_array(abuf, "plugins");
+  abuf_json_mark_object(true, true, abuf, "plugins");
   if (olsr_cnf->plugins)
     for (pentry = olsr_cnf->plugins; pentry; pentry = pentry->next) {
-      abuf_json_open_array_entry(abuf);
+      abuf_json_mark_array_entry(true, abuf);
       abuf_json_string(abuf, "plugin", pentry->name);
       for (pparam = pentry->params; pparam; pparam = pparam->next) {
         int i, keylen = strlen(pparam->key);
@@ -875,27 +825,132 @@ ipc_print_plugins(struct autobuf *abuf)
         // test if a int/long and set as such in JSON
         value = atol(pparam->value);
         snprintf(valueTest, 255, "%li", value);
-        if (strcmp(valueTest, pparam->value) == 0)
+        if (!strcmp(valueTest, pparam->value))
           abuf_json_int(abuf, key, value);
         else
           abuf_json_string(abuf, key, pparam->value);
       }
-      abuf_json_close_array_entry(abuf);
+      abuf_json_mark_array_entry(false, abuf);
     }
-  abuf_json_close_array(abuf);
+  abuf_json_mark_object(false, true, abuf, NULL);
 }
 
+#ifdef __linux__
+
+/** interface names for smart gateway tunnel interfaces, IPv4 */
+extern struct interfaceName * sgwTunnel4InterfaceNames;
 
-static void
-ipc_print_config(struct autobuf *abuf)
-{
+/** interface names for smart gateway tunnel interfaces, IPv6 */
+extern struct interfaceName * sgwTunnel6InterfaceNames;
+
+/**
+ * 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) {
+  struct gateway_entry * current_gw = olsr_get_inet_gateway(ipv6);
+  struct interfaceName * sgwTunnelInterfaceNames = !ipv6 ? sgwTunnel4InterfaceNames : sgwTunnel6InterfaceNames;
+  int i;
+
+  abuf_json_mark_array_entry(true, abuf);
+
+  abuf_json_mark_object(true, true, abuf, ipv6 ? "ipv6" : "ipv4");
+
+  for (i = 0; i < olsr_cnf->smart_gw_use_count; i++) {
+    bool selected;
+    struct ipaddr_str originatorStr;
+    const char * originator;
+    struct ipaddr_str prefixIpStr;
+    const char * prefixIPStr;
+    union olsr_ip_addr netmask = { { 0 } };
+    struct ipaddr_str prefixMaskStr;
+    const char * prefixMASKStr;
+    struct interfaceName * node = &sgwTunnelInterfaceNames[i];
+    struct ipaddr_str tunnelGwStr;
+    const char * tunnelGw;
+
+    struct gateway_entry * gw = node->gw;
+    struct tc_entry* tc;
+
+    if (!gw) {
+      continue;
+    }
+
+    tc = olsr_lookup_tc_entry(&gw->originator);
+    if (!tc) {
+      continue;
+    }
+
+    selected = current_gw && (current_gw == gw);
+    originator = olsr_ip_to_string(&originatorStr, &gw->originator);
+    prefixIPStr = olsr_ip_to_string(&prefixIpStr, &gw->external_prefix.prefix);
+
+    prefix_to_netmask((uint8_t *) &netmask, !ipv6 ? sizeof(netmask.v4) : sizeof(netmask.v6), gw->external_prefix.prefix_len);
+    prefixMASKStr = olsr_ip_to_string(&prefixMaskStr, &netmask);
+
+    tunnelGw = olsr_ip_to_string(&tunnelGwStr, &gw->originator);
+
+    abuf_json_mark_array_entry(true, abuf);
+    {
+      char prefix[strlen(prefixIPStr) + 1 + strlen(prefixMASKStr) + 1];
+      snprintf(prefix, sizeof(prefix), "%s/%s", prefixIPStr, prefixMASKStr);
+
+      abuf_json_boolean(abuf, "selected", selected);
+      abuf_json_string(abuf, "originator", originator);
+      abuf_json_string(abuf, "prefix", prefix);
+      abuf_json_int(abuf, "uplink", gw->uplink);
+      abuf_json_int(abuf, "downlink", gw->downlink);
+      abuf_json_int(abuf, "pathcost", tc->path_cost);
+      abuf_json_boolean(abuf, "IPv4", gw->ipv4);
+      abuf_json_boolean(abuf, "IPv4-NAT", gw->ipv4nat);
+      abuf_json_boolean(abuf, "IPv6", gw->ipv6);
+      abuf_json_string(abuf, "tunnel", node->name);
+      abuf_json_string(abuf, "destination", tunnelGw);
+      abuf_json_int(abuf, "cost", gw->path_cost);
+    }
+    abuf_json_mark_array_entry(false, abuf);
+  }
+
+  abuf_json_mark_object(false, true, abuf, NULL);
+
+  abuf_json_mark_array_entry(false, abuf);
+}
+#endif /* __linux__ */
+
+static void ipc_print_sgw(struct autobuf *abuf) {
+#ifndef __linux__
+  abuf_json_string(abuf, "error", "Gateway mode is only supported in Linux");
+#else
+  abuf_json_mark_object(true, true, abuf, "sgw");
+
+  sgw_ipvx(abuf, false);
+  sgw_ipvx(abuf, true);
+
+  abuf_json_mark_object(false, true, abuf, NULL);
+#endif /* __linux__ */
+}
+
+static void ipc_print_version(struct autobuf *abuf) {
+  abuf_json_mark_object(true, false, abuf, "version");
+
+  abuf_json_string(abuf, "version", olsrd_version);
+  abuf_json_string(abuf, "date", build_date);
+  abuf_json_string(abuf, "host", build_host);
+
+  abuf_json_mark_object(false, false, abuf, NULL);
+}
+
+static void ipc_print_config(struct autobuf *abuf) {
   struct ip_prefix_list *hna;
   struct ipaddr_str buf, mainaddrbuf;
   struct ip_prefix_list *ipcn;
   struct olsr_lq_mult *mult;
-  char ipv6_buf[INET6_ADDRSTRLEN];                  /* buffer for IPv6 inet_htop */
+  char ipv6_buf[INET6_ADDRSTRLEN]; /* buffer for IPv6 inet_htop */
 
-  abuf_json_open_object(abuf, "config");
+  abuf_json_mark_object(true, false, abuf, "config");
 
   abuf_json_int(abuf, "olsrPort", olsr_cnf->olsrport);
   abuf_json_int(abuf, "debugLevel", olsr_cnf->debug_level);
@@ -920,74 +975,57 @@ ipc_print_config(struct autobuf *abuf)
 
   abuf_json_string(abuf, "fibMetrics", FIB_METRIC_TXT[olsr_cnf->fib_metric]);
 
-  abuf_json_string(abuf, "defaultIpv6Multicast",
-                   inet_ntop(AF_INET6, &olsr_cnf->interface_defaults->ipv6_multicast.v6,
-                             ipv6_buf, sizeof(ipv6_buf)));
+  abuf_json_string(abuf, "defaultIpv6Multicast", inet_ntop(AF_INET6, &olsr_cnf->interface_defaults->ipv6_multicast.v6, ipv6_buf, sizeof(ipv6_buf)));
   if (olsr_cnf->interface_defaults->ipv4_multicast.v4.s_addr)
-    abuf_json_string(abuf, "defaultIpv4Broadcast",
-                     inet_ntoa(olsr_cnf->interface_defaults->ipv4_multicast.v4));
+    abuf_json_string(abuf, "defaultIpv4Broadcast", inet_ntoa(olsr_cnf->interface_defaults->ipv4_multicast.v4));
   else
     abuf_json_string(abuf, "defaultIpv4Broadcast", "auto");
 
-  if (olsr_cnf->interface_defaults->mode==IF_MODE_ETHER)
+  if (olsr_cnf->interface_defaults->mode == IF_MODE_ETHER)
     abuf_json_string(abuf, "defaultInterfaceMode", "ether");
   else
     abuf_json_string(abuf, "defaultInterfaceMode", "mesh");
 
-  abuf_json_float(abuf, "defaultHelloEmissionInterval",
-                  olsr_cnf->interface_defaults->hello_params.emission_interval);
-  abuf_json_float(abuf, "defaultHelloValidityTime",
-                  olsr_cnf->interface_defaults->hello_params.validity_time);
-  abuf_json_float(abuf, "defaultTcEmissionInterval",
-                  olsr_cnf->interface_defaults->tc_params.emission_interval);
-  abuf_json_float(abuf, "defaultTcValidityTime",
-                  olsr_cnf->interface_defaults->tc_params.validity_time);
-  abuf_json_float(abuf, "defaultMidEmissionInterval",
-                  olsr_cnf->interface_defaults->mid_params.emission_interval);
-  abuf_json_float(abuf, "defaultMidValidityTime",
-                  olsr_cnf->interface_defaults->mid_params.validity_time);
-  abuf_json_float(abuf, "defaultHnaEmissionInterval",
-                  olsr_cnf->interface_defaults->hna_params.emission_interval);
-  abuf_json_float(abuf, "defaultHnaValidityTime",
-                  olsr_cnf->interface_defaults->hna_params.validity_time);
-  abuf_json_boolean(abuf, "defaultAutoDetectChanges",
-                    olsr_cnf->interface_defaults->autodetect_chg);
-
-  abuf_json_open_array(abuf, "defaultLinkQualityMultipliers");
-  for (mult = olsr_cnf->interface_defaults->lq_mult; mult != NULL; mult = mult->next) {
-    abuf_json_open_array_entry(abuf);
-    abuf_json_string(abuf, "route",
-                     inet_ntop(olsr_cnf->ip_version, &mult->addr, ipv6_buf, sizeof(ipv6_buf)));
+  abuf_json_float(abuf, "defaultHelloEmissionInterval", olsr_cnf->interface_defaults->hello_params.emission_interval);
+  abuf_json_float(abuf, "defaultHelloValidityTime", olsr_cnf->interface_defaults->hello_params.validity_time);
+  abuf_json_float(abuf, "defaultTcEmissionInterval", olsr_cnf->interface_defaults->tc_params.emission_interval);
+  abuf_json_float(abuf, "defaultTcValidityTime", olsr_cnf->interface_defaults->tc_params.validity_time);
+  abuf_json_float(abuf, "defaultMidEmissionInterval", olsr_cnf->interface_defaults->mid_params.emission_interval);
+  abuf_json_float(abuf, "defaultMidValidityTime", olsr_cnf->interface_defaults->mid_params.validity_time);
+  abuf_json_float(abuf, "defaultHnaEmissionInterval", olsr_cnf->interface_defaults->hna_params.emission_interval);
+  abuf_json_float(abuf, "defaultHnaValidityTime", olsr_cnf->interface_defaults->hna_params.validity_time);
+  abuf_json_boolean(abuf, "defaultAutoDetectChanges", olsr_cnf->interface_defaults->autodetect_chg);
+
+  abuf_json_mark_object(true, true, abuf, "defaultLinkQualityMultipliers");
+  for (mult = olsr_cnf->interface_defaults->lq_mult; mult != NULL ; mult = mult->next) {
+    abuf_json_mark_array_entry(true, abuf);
+    abuf_json_string(abuf, "route", inet_ntop(olsr_cnf->ip_version, &mult->addr, ipv6_buf, sizeof(ipv6_buf)));
     abuf_json_float(abuf, "multiplier", mult->value / 65535.0);
-    abuf_json_close_array_entry(abuf);
+    abuf_json_mark_array_entry(false, abuf);
   }
-  abuf_json_close_array(abuf);
+  abuf_json_mark_object(false, true, abuf, NULL);
 
-  abuf_json_open_array(abuf, "hna");
-  for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) {
-    abuf_json_open_array_entry(abuf);
-    abuf_json_string(abuf, "destination",
-                     olsr_ip_to_string(&buf, &hna->net.prefix));
+  abuf_json_mark_object(true, true, abuf, "hna");
+  for (hna = olsr_cnf->hna_entries; hna != NULL ; hna = hna->next) {
+    abuf_json_mark_array_entry(true, abuf);
+    abuf_json_string(abuf, "destination", olsr_ip_to_string(&buf, &hna->net.prefix));
     abuf_json_int(abuf, "genmask", hna->net.prefix_len);
-    abuf_json_string(abuf, "gateway",
-                     olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->main_addr));
-    abuf_json_close_array_entry(abuf);
+    abuf_json_string(abuf, "gateway", olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->main_addr));
+    abuf_json_mark_array_entry(false, abuf);
   }
-  abuf_json_close_array(abuf);
-
+  abuf_json_mark_object(false, true, abuf, NULL);
 
   abuf_json_int(abuf, "totalIpcConnectionsAllowed", olsr_cnf->ipc_connections);
-  abuf_json_open_array(abuf, "ipcAllowedAddresses");
+  abuf_json_mark_object(true, true, abuf, "ipcAllowedAddresses");
   if (olsr_cnf->ipc_connections) {
-    for (ipcn = olsr_cnf->ipc_nets; ipcn != NULL; ipcn = ipcn->next) {
-      abuf_json_open_array_entry(abuf);
-      abuf_json_string(abuf, "ipAddress",
-                       olsr_ip_to_string(&mainaddrbuf, &ipcn->net.prefix));
+    for (ipcn = olsr_cnf->ipc_nets; ipcn != NULL ; ipcn = ipcn->next) {
+      abuf_json_mark_array_entry(true, abuf);
+      abuf_json_string(abuf, "ipAddress", olsr_ip_to_string(&mainaddrbuf, &ipcn->net.prefix));
       abuf_json_int(abuf, "netmask", ipcn->net.prefix_len);
-      abuf_json_close_array_entry(abuf);
+      abuf_json_mark_array_entry(false, abuf);
     }
   }
-  abuf_json_close_array(abuf);
+  abuf_json_mark_object(false, true, abuf, NULL);
 
   // keep all time in ms, so convert these two, which are in seconds
   abuf_json_int(abuf, "pollRate", olsr_cnf->pollrate * 1000);
@@ -996,7 +1034,7 @@ ipc_print_config(struct autobuf *abuf)
   abuf_json_int(abuf, "tcRedundancy", olsr_cnf->tc_redundancy);
   abuf_json_int(abuf, "mprCoverage", olsr_cnf->mpr_coverage);
 
-  if (olsr_cnf->lq_level == 0) {
+  if (!olsr_cnf->lq_level) {
     abuf_json_boolean(abuf, "useHysteresis", olsr_cnf->use_hysteresis);
     if (olsr_cnf->use_hysteresis) {
       abuf_json_float(abuf, "hysteresisScaling", olsr_cnf->hysteresis_param.scaling);
@@ -1025,7 +1063,7 @@ ipc_print_config(struct autobuf *abuf)
       struct sgw_egress_if * egressif = olsr_cnf->smart_gw_egress_interfaces;
 
       abuf_init(&egressbuf, (olsr_cnf->smart_gw_egress_interfaces_count * IFNAMSIZ) /* interface names */
-          + (olsr_cnf->smart_gw_egress_interfaces_count - 1) /* commas */);
+      + (olsr_cnf->smart_gw_egress_interfaces_count - 1) /* commas */);
       while (egressif) {
         if (egressbuf.len) {
           abuf_puts(&egressbuf, ",");
@@ -1046,16 +1084,13 @@ ipc_print_config(struct autobuf *abuf)
     abuf_json_int(abuf, "smartGatewayUplink", olsr_cnf->smart_gw_uplink);
     abuf_json_int(abuf, "smartGatewayDownlink", olsr_cnf->smart_gw_downlink);
     abuf_json_int(abuf, "smartGatewayType", olsr_cnf->smart_gw_type);
-    abuf_json_string(abuf, "smartGatewayPrefix",
-                     olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->smart_gw_prefix.prefix));
+    abuf_json_string(abuf, "smartGatewayPrefix", olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->smart_gw_prefix.prefix));
     abuf_json_int(abuf, "smartGatewayPrefixLength", olsr_cnf->smart_gw_prefix.prefix_len);
   }
 #endif /* __linux__ */
 
-  abuf_json_string(abuf, "mainIpAddress",
-                   olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->main_addr));
-  abuf_json_string(abuf, "unicastSourceIpAddress",
-                   olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->unicast_src_ip));
+  abuf_json_string(abuf, "mainIpAddress", olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->main_addr));
+  abuf_json_string(abuf, "unicastSourceIpAddress", olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->unicast_src_ip));
 
   abuf_json_boolean(abuf, "useSourceIpRoutes", olsr_cnf->use_src_ip_routes);
 
@@ -1110,34 +1145,31 @@ ipc_print_config(struct autobuf *abuf)
 
   abuf_json_int(abuf, "startTime", start_time.tv_sec);
 
-  abuf_json_close_object(abuf);
+  abuf_json_mark_object(false, false, abuf, NULL);
 }
 
-static void
-ipc_print_interfaces(struct autobuf *abuf)
-{
+static void ipc_print_interfaces(struct autobuf *abuf) {
 #ifdef __linux__
   int linklen;
   char path[PATH_MAX], linkpath[PATH_MAX];
 #endif /* __linux__ */
-  char ipv6_buf[INET6_ADDRSTRLEN];                  /* buffer for IPv6 inet_htop */
+  char ipv6_buf[INET6_ADDRSTRLEN]; /* buffer for IPv6 inet_htop */
   struct olsr_lq_mult *mult;
   const struct olsr_if *ifs;
-  abuf_json_open_array(abuf, "interfaces");
-  for (ifs = olsr_cnf->interfaces; ifs != NULL; ifs = ifs->next) {
-    const struct interface_olsr *const rifs = ifs->interf;
-    abuf_json_open_array_entry(abuf);
+  abuf_json_mark_object(true, true, abuf, "interfaces");
+  for (ifs = olsr_cnf->interfaces; ifs != NULL ; ifs = ifs->next) {
+    const struct interface_olsr * const rifs = ifs->interf;
+    abuf_json_mark_array_entry(true, abuf);
     abuf_json_string(abuf, "name", ifs->name);
 
-    abuf_json_open_array(abuf, "linkQualityMultipliers");
-    for (mult = ifs->cnf->lq_mult; mult != NULL; mult = mult->next) {
-      abuf_json_open_array_entry(abuf);
-      abuf_json_string(abuf, "route",
-                       inet_ntop(olsr_cnf->ip_version, &mult->addr, ipv6_buf, sizeof(ipv6_buf)));
+    abuf_json_mark_object(true, true, abuf, "linkQualityMultipliers");
+    for (mult = ifs->cnf->lq_mult; mult != NULL ; mult = mult->next) {
+      abuf_json_mark_array_entry(true, abuf);
+      abuf_json_string(abuf, "route", inet_ntop(olsr_cnf->ip_version, &mult->addr, ipv6_buf, sizeof(ipv6_buf)));
       abuf_json_float(abuf, "multiplier", mult->value / 65535.0);
-      abuf_json_close_array_entry(abuf);
+      abuf_json_mark_array_entry(false, abuf);
     }
-    abuf_json_close_array(abuf);
+    abuf_json_mark_object(false, true, abuf, NULL);
 
     if (!rifs) {
       abuf_json_string(abuf, "state", "down");
@@ -1153,10 +1185,10 @@ ipc_print_interfaces(struct autobuf *abuf)
       abuf_json_int(abuf, "olsrInterfaceMetric", rifs->int_metric);
       abuf_json_int(abuf, "olsrMTU", rifs->int_mtu);
       abuf_json_int(abuf, "helloEmissionInterval", rifs->hello_etime);
-      abuf_json_int(abuf, "helloValidityTime", rifs->valtimes.hello);
-      abuf_json_int(abuf, "tcValidityTime", rifs->valtimes.tc);
-      abuf_json_int(abuf, "midValidityTime", rifs->valtimes.mid);
-      abuf_json_int(abuf, "hnaValidityTime", rifs->valtimes.hna);
+      abuf_json_int(abuf, "helloValidityTime", me_to_reltime(rifs->valtimes.hello));
+      abuf_json_int(abuf, "tcValidityTime", me_to_reltime(rifs->valtimes.tc));
+      abuf_json_int(abuf, "midValidityTime", me_to_reltime(rifs->valtimes.mid));
+      abuf_json_int(abuf, "hnaValidityTime", me_to_reltime(rifs->valtimes.hna));
       abuf_json_boolean(abuf, "wireless", rifs->is_wireless);
 
 #ifdef __linux__
@@ -1166,18 +1198,13 @@ ipc_print_interfaces(struct autobuf *abuf)
 
       if (olsr_cnf->ip_version == AF_INET) {
         struct ipaddr_str addrbuf, maskbuf, bcastbuf;
-        abuf_json_string(abuf, "ipv4Address",
-                             ip4_to_string(&addrbuf, rifs->int_addr.sin_addr));
-        abuf_json_string(abuf, "netmask",
-                             ip4_to_string(&maskbuf, rifs->int_netmask.sin_addr));
-        abuf_json_string(abuf, "broadcast",
-                             ip4_to_string(&bcastbuf, rifs->int_broadaddr.sin_addr));
+        abuf_json_string(abuf, "ipv4Address", ip4_to_string(&addrbuf, rifs->int_addr.sin_addr));
+        abuf_json_string(abuf, "netmask", ip4_to_string(&maskbuf, rifs->int_netmask.sin_addr));
+        abuf_json_string(abuf, "broadcast", ip4_to_string(&bcastbuf, rifs->int_broadaddr.sin_addr));
       } else {
         struct ipaddr_str addrbuf, maskbuf;
-        abuf_json_string(abuf, "ipv6Address",
-                             ip6_to_string(&addrbuf, &rifs->int6_addr.sin6_addr));
-        abuf_json_string(abuf, "multicast",
-                             ip6_to_string(&maskbuf, &rifs->int6_multaddr.sin6_addr));
+        abuf_json_string(abuf, "ipv6Address", ip6_to_string(&addrbuf, &rifs->int6_addr.sin6_addr));
+        abuf_json_string(abuf, "multicast", ip6_to_string(&maskbuf, &rifs->int6_multaddr.sin6_addr));
       }
     }
 #ifdef __linux__
@@ -1232,31 +1259,25 @@ ipc_print_interfaces(struct autobuf *abuf)
     abuf_json_sys_class_net(abuf, "wirelessRetries", ifs->name, "wireless/retries");
     abuf_json_sys_class_net(abuf, "wirelessStatus", ifs->name, "wireless/status");
 #endif /* __linux__ */
-    abuf_json_close_array_entry(abuf);
+    abuf_json_mark_array_entry(false, abuf);
   }
-  abuf_json_close_array(abuf);
+  abuf_json_mark_object(false, true, abuf, NULL);
 }
 
-
-static void
-ipc_print_olsrd_conf(struct autobuf *abuf)
-{
+static void ipc_print_olsrd_conf(struct autobuf *abuf) {
   olsrd_write_cnf_autobuf(abuf, olsr_cnf);
 }
 
-
-static void
-jsoninfo_write_data(void *foo __attribute__ ((unused)))
-{
+static void jsoninfo_write_data(void *foo __attribute__ ((unused))) {
   fd_set set;
   int result, i, j, max;
   struct timeval tv;
 
   FD_ZERO(&set);
   max = 0;
-  for (i=0; i<outbuffer_count; i++) {
+  for (i = 0; i < outbuffer_count; i++) {
     /* And we cast here since we get a warning on Win32 */
-    FD_SET((unsigned int)(outbuffer_socket[i]), &set);
+    FD_SET((unsigned int )(outbuffer_socket[i]), &set);
 
     if (outbuffer_socket[i] > max) {
       max = outbuffer_socket[i];
@@ -1271,12 +1292,9 @@ jsoninfo_write_data(void *foo __attribute__ ((unused)))
     return;
   }
 
-  for (i=0; i<outbuffer_count; i++) {
+  for (i = 0; i < outbuffer_count; i++) {
     if (FD_ISSET(outbuffer_socket[i], &set)) {
-      result = send(outbuffer_socket[i],
-                    outbuffer[i] + outbuffer_written[i],
-                    outbuffer_size[i] - outbuffer_written[i],
-                    0);
+      result = send(outbuffer_socket[i], outbuffer[i] + outbuffer_written[i], outbuffer_size[i] - outbuffer_written[i], 0);
       if (result > 0) {
         outbuffer_written[i] += result;
       }
@@ -1284,26 +1302,24 @@ jsoninfo_write_data(void *foo __attribute__ ((unused)))
       if (result <= 0 || outbuffer_written[i] == outbuffer_size[i]) {
         /* close this socket and cleanup*/
         close(outbuffer_socket[i]);
-        free (outbuffer[i]);
+        free(outbuffer[i]);
 
-        for (j=i+1; j<outbuffer_count; j++) {
-          outbuffer[j-1] = outbuffer[j];
-          outbuffer_size[j-1] = outbuffer_size[j];
-          outbuffer_socket[j-1] = outbuffer_socket[j];
-          outbuffer_written[j-1] = outbuffer_written[j];
+        for (j = i + 1; j < outbuffer_count; j++) {
+          outbuffer[j - 1] = outbuffer[j];
+          outbuffer_size[j - 1] = outbuffer_size[j];
+          outbuffer_socket[j - 1] = outbuffer_socket[j];
+          outbuffer_written[j - 1] = outbuffer_written[j];
         }
         outbuffer_count--;
       }
     }
   }
-  if (outbuffer_count == 0) {
+  if (!outbuffer_count) {
     olsr_stop_timer(writetimer_entry);
   }
 }
 
-static void
-send_info(unsigned int send_what, int the_socket)
-{
+static void send_info(unsigned int send_what, int the_socket) {
   struct autobuf abuf;
   size_t header_len = 0;
   char header_buf[MAX_HTTPHEADER_SIZE];
@@ -1315,38 +1331,51 @@ send_info(unsigned int send_what, int the_socket)
 
   abuf_init(&abuf, 32768);
 
- // only add if outputing JSON
-  if (send_what & SIW_ALL) abuf_puts(&abuf, "{");
-
-  if ((send_what & SIW_LINKS) == SIW_LINKS) ipc_print_links(&abuf);
-  if ((send_what & SIW_NEIGHBORS) == SIW_NEIGHBORS) ipc_print_neighbors(&abuf);
-  if ((send_what & SIW_TOPOLOGY) == SIW_TOPOLOGY) ipc_print_topology(&abuf);
-  if ((send_what & SIW_HNA) == SIW_HNA) ipc_print_hna(&abuf);
-  if ((send_what & SIW_MID) == SIW_MID) ipc_print_mid(&abuf);
-  if ((send_what & SIW_ROUTES) == SIW_ROUTES) ipc_print_routes(&abuf);
-  if ((send_what & SIW_GATEWAYS) == SIW_GATEWAYS) ipc_print_gateways(&abuf);
-  if ((send_what & SIW_INTERFACES) == SIW_INTERFACES) ipc_print_interfaces(&abuf);
-  if ((send_what & SIW_CONFIG) == SIW_CONFIG) {
-    if (send_what != SIW_CONFIG) abuf_puts(&abuf, ",");
-    ipc_print_config(&abuf);
-  }
-  if ((send_what & SIW_PLUGINS) == SIW_PLUGINS) ipc_print_plugins(&abuf);
-
-  /* output overarching meta data last so we can use abuf_json_* functions, they add a comma at the beginning */
+  // only add if outputing JSON
   if (send_what & SIW_ALL) {
+    abuf_json_mark_output(true, &abuf);
+
     abuf_json_int(&abuf, "systemTime", time(NULL));
     abuf_json_int(&abuf, "timeSinceStartup", now_times);
-    if (*uuid != 0)
+    if (*uuid)
       abuf_json_string(&abuf, "uuid", uuid);
-    abuf_puts(&abuf, "}\n");
-  }
 
-  /* this outputs the olsrd.conf text directly, not JSON */
-  if ((send_what & SIW_OLSRD_CONF) == SIW_OLSRD_CONF) {
+    if (send_what & SIW_NEIGHBORS)
+      ipc_print_neighbors(&abuf, false);
+    if (send_what & SIW_LINKS)
+      ipc_print_links(&abuf);
+    if (send_what & SIW_ROUTES)
+      ipc_print_routes(&abuf);
+    if (send_what & SIW_HNA)
+      ipc_print_hna(&abuf);
+    if (send_what & SIW_MID)
+      ipc_print_mid(&abuf);
+    if (send_what & SIW_TOPOLOGY)
+      ipc_print_topology(&abuf);
+    if (send_what & SIW_GATEWAYS)
+      ipc_print_gateways(&abuf);
+    if (send_what & SIW_INTERFACES)
+      ipc_print_interfaces(&abuf);
+    if (send_what & SIW_2HOP)
+      ipc_print_neighbors(&abuf, true);
+    if (send_what & SIW_SGW)
+      ipc_print_sgw(&abuf);
+
+    if (send_what & SIW_VERSION)
+      ipc_print_version(&abuf);
+    if (send_what & SIW_CONFIG)
+      ipc_print_config(&abuf);
+    if (send_what & SIW_PLUGINS)
+      ipc_print_plugins(&abuf);
+
+    abuf_json_mark_output(false, &abuf);
+    abuf_puts(&abuf, "\n");
+  } else if (send_what & SIW_OLSRD_CONF) {
+    /* this outputs the olsrd.conf text directly, not JSON */
     ipc_print_olsrd_conf(&abuf);
   }
 
-  if(http_headers) {
+  if (http_headers) {
     header_len = build_http_header(HTTP_200, content_type, abuf.len, header_buf, sizeof(header_buf));
   }
 
@@ -1360,21 +1389,15 @@ send_info(unsigned int send_what, int the_socket)
   outbuffer_count++;
 
   if (outbuffer_count == 1) {
-    writetimer_entry = olsr_start_timer(100,
-                                        0,
-                                        OLSR_TIMER_PERIODIC,
-                                        &jsoninfo_write_data,
-                                        NULL,
-                                        0);
+    writetimer_entry = olsr_start_timer(100, 0,
+    OLSR_TIMER_PERIODIC, &jsoninfo_write_data,
+    NULL, 0);
   }
 
   abuf_free(&abuf);
 }
 
-static size_t
-build_http_header(const char *status, const char *mime, uint32_t msgsize,
-  char *buf, uint32_t bufsize)
-{
+static size_t build_http_header(const char *status, const char *mime, uint32_t msgsize, char *buf, uint32_t bufsize) {
   time_t currtime;
   size_t size;
 
@@ -1391,7 +1414,7 @@ build_http_header(const char *status, const char *mime, uint32_t msgsize,
   size += snprintf(&buf[size], bufsize - size, "Connection: closed\r\n");
 
   /* MIME type */
-  if(mime != NULL) {
+  if (mime != NULL) {
     size += snprintf(&buf[size], bufsize - size, "Content-type: %s\r\n", mime);
   }
 
index 28e57e6..25ed487 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * The olsr.org Optimized Link-State Routing daemon(olsrd)
  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
index 13a4418..4868307 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * The olsr.org Optimized Link-State Routing daemon(olsrd)
  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
@@ -73,9 +72,7 @@ static void my_fini(void) __attribute__ ((destructor));
 /**
  *Constructor
  */
-static void
-my_init(void)
-{
+static void my_init(void) {
   /* Print plugin info to stdout */
   printf("%s\n", MOD_DESC);
 
@@ -99,9 +96,7 @@ my_init(void)
 /**
  *Destructor
  */
-static void
-my_fini(void)
-{
+static void my_fini(void) {
   /* Calls the destruction function
    * olsr_plugin_exit()
    * This function should be present in your
@@ -111,25 +106,19 @@ my_fini(void)
   olsr_plugin_exit();
 }
 
-int
-olsrd_plugin_interface_version(void)
-{
+int olsrd_plugin_interface_version(void) {
   return PLUGIN_INTERFACE_VERSION;
 }
 
-static int
-store_string(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused)))
-{
+static int store_string(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) {
   char *str = data;
   snprintf(str, FILENAME_MAX, "%s", value);
   return 0;
 }
 
-static int
-store_boolean(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused)))
-{
+static int store_boolean(const char *value, void *data, set_plugin_parameter_addon addon __attribute__ ((unused))) {
   bool *dest = data;
-  if(strcmp(value, "yes") == 0)
+  if (strcmp(value, "yes") == 0)
     *dest = true;
   else if (strcmp(value, "no") == 0)
     *dest = false;
@@ -139,18 +128,17 @@ store_boolean(const char *value, void *data, set_plugin_parameter_addon addon __
   return 0;
 }
 
-static const struct olsrd_plugin_parameters plugin_parameters[] = {
-  {.name = "port",.set_plugin_parameter = &set_plugin_port,.data = &ipc_port},
-  {.name = "accept",.set_plugin_parameter = &set_plugin_ipaddress,.data = &jsoninfo_accept_ip},
-  {.name = "listen",.set_plugin_parameter = &set_plugin_ipaddress,.data = &jsoninfo_listen_ip},
-  {.name = "uuidfile",.set_plugin_parameter = &store_string,.data = uuidfile},
-  {.name = "httpheaders",.set_plugin_parameter = &store_boolean,.data = &http_headers},
-  {.name = "ipv6only", .set_plugin_parameter = &set_plugin_boolean, .data = &jsoninfo_ipv6_only},
-};
-
-void
-olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
-{
+static const struct olsrd_plugin_parameters plugin_parameters[] = { //
+    //
+        { .name = "port", .set_plugin_parameter = &set_plugin_port, .data = &ipc_port }, //
+        { .name = "accept", .set_plugin_parameter = &set_plugin_ipaddress, .data = &jsoninfo_accept_ip }, //
+        { .name = "listen", .set_plugin_parameter = &set_plugin_ipaddress, .data = &jsoninfo_listen_ip }, //
+        { .name = "uuidfile", .set_plugin_parameter = &store_string, .data = uuidfile }, //
+        { .name = "httpheaders", .set_plugin_parameter = &store_boolean, .data = &http_headers }, //
+        { .name = "ipv6only", .set_plugin_parameter = &set_plugin_boolean, .data = &jsoninfo_ipv6_only } //
+    };
+
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size) {
   *params = plugin_parameters;
   *size = sizeof(plugin_parameters) / sizeof(*plugin_parameters);
 }
index 8fc20f7..901892b 100644 (file)
@@ -462,7 +462,11 @@ BmfPacketCaptured(
       return;                   /* for */
     }
     udpHeader = (struct udphdr *)ARM_NOWARN_ALIGN(encapsulationUdpData + GetIpHeaderLength(encapsulationUdpData));
+#if defined(__GLIBC__) || defined(__BIONIC__)
     destPort = ntohs(udpHeader->dest);
+#else
+    destPort = ntohs(udpHeader->uh_dport);
+#endif
     if (destPort != 5353) {
       return;
     }
@@ -498,7 +502,11 @@ BmfPacketCaptured(
       return;                   /* for */
     }
     udpHeader = (struct udphdr *)ARM_NOWARN_ALIGN(encapsulationUdpData + 40);
+#if defined(__GLIBC__) || defined(__BIONIC__)
     destPort = ntohs(udpHeader->dest);
+#else
+    destPort = ntohs(udpHeader->uh_dport);
+#endif
     if (destPort != 5353) {
       return;
     }
index 60c4f74..5ca27c0 100644 (file)
@@ -204,7 +204,11 @@ PacketReceivedFromOLSR(unsigned char *encapsulationUdpData, int len)
           udpHeader = (struct udphdr*) ARM_NOWARN_ALIGN((encapsulationUdpData +
                                        GetIpHeaderLength(encapsulationUdpData)));
           destAddr.v4.s_addr = ipHeader->ip_dst.s_addr;
+#if defined(__GLIBC__) || defined(__BIONIC__)
           destPort = htons(udpHeader->dest);
+#else
+          destPort = htons(udpHeader->uh_dport);
+#endif
           isInList = InUdpDestPortList(AF_INET, &destAddr, destPort);
 #ifdef INCLUDE_DEBUG_OUTPUT
           if (!isInList) {
@@ -223,7 +227,11 @@ PacketReceivedFromOLSR(unsigned char *encapsulationUdpData, int len)
         if (ip6Header->ip6_nxt == SOL_UDP && !IsIpv6Fragment(ip6Header)) {
           udpHeader = (struct udphdr*) ARM_NOWARN_ALIGN((encapsulationUdpData + 40));
           memcpy(&destAddr.v6, &ip6Header->ip6_dst, sizeof(struct in6_addr));
+#if defined(__GLIBC__) || defined(__BIONIC__)
           destPort = htons(udpHeader->dest);
+#else
+          destPort = htons(udpHeader->uh_dport);
+#endif
           isInList = InUdpDestPortList(AF_INET6, &destAddr, destPort);
 #ifdef INCLUDE_DEBUG_OUTPUT
           if (!isInList) {
@@ -695,7 +703,11 @@ P2pdPacketCaptured(unsigned char *encapsulationUdpData, int nBytes)
 
     udpHeader = (struct udphdr *) ARM_NOWARN_ALIGN((encapsulationUdpData +
                                   GetIpHeaderLength(encapsulationUdpData)));
+#if defined(__GLIBC__) || defined(__BIONIC__)
     destPort = ntohs(udpHeader->dest);
+#else
+    destPort = ntohs(udpHeader->uh_dport);
+#endif
 
     if (!InUdpDestPortList(AF_INET, &dst, destPort)) {
 #ifdef INCLUDE_DEBUG_OUTPUT
@@ -739,7 +751,11 @@ P2pdPacketCaptured(unsigned char *encapsulationUdpData, int nBytes)
       return;
 
     udpHeader = (struct udphdr *) ARM_NOWARN_ALIGN((encapsulationUdpData + 40));
+#if defined(__GLIBC__) || defined(__BIONIC__)
     destPort = ntohs(udpHeader->dest);
+#else
+    destPort = ntohs(udpHeader->uh_dport);
+#endif
 
     if (!InUdpDestPortList(AF_INET6, &dst, destPort)) {
 #ifdef INCLUDE_DEBUG_OUTPUT
index a543200..64e28c1 100644 (file)
@@ -59,6 +59,14 @@ CFLAGS += -DGIT_SHA=\"$(GIT_SHA)\" -DPLUGIN_VER=\"$(PLUGIN_VER)\"
 
 all: default_target
 
+ifeq ($(OS),android)
+# On Android Google forgot to include regex engine code for Froyo version (but also there was
+# no support in older versions for it) so we have here this missing code.
+# http://groups.google.com/group/android-ndk/browse_thread/thread/5ea6f0650f0e3fc
+OBJS +=     $(REGEX_LIB)
+CFLAGS += -D__POSIX_VISIBLE
+endif
+
 default_target: nmealib library $(PLUGIN_FULLNAME)
 
 # repeat from toplevel Makefile.inc, and adjust: we need the library includes
index 5d8f1e7..15751d0 100644 (file)
@@ -1,3 +1,361 @@
-This plugin depends on the NMEA parsing library that can be found at:
+This plugin depends on the (included) NMEA parsing library that can be found at:
 
        https://github.com/AHR-Project/nmealib
+
+See the document doc/pud.odt for a detailed specification of the module.
+
+LoadPlugin "<olsrd plugin library path>/olsrd_pud.so.2.2.0"
+{
+    # 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"
+
+
+    #
+    # RX Parameters
+    #
+
+    # rxNonOlsrIf is a network interface on the host on which the plugin will
+    #             listen for GPS multicasts. Multiple such interfaces can be
+    #             specified by specifying the parameter multiple times.
+    #
+    # Default: none
+    #
+    # PlParam     "rxNonOlsrIf"                  ""
+
+    # rxAllowedSourceIpAddress is an IP address from which the plugin is
+    #                          allowed to process/parse GPS sentences. When
+    #                          this parameter is not configured then GPS
+    #                          sentences from ALL IP addresses are processed.
+    #                          Multiple IP addresses can be specified by
+    #                          specifying the parameter multiple times.
+    #
+    # Default: none
+    #
+    # PlParam     "rxAllowedSourceIpAddress"     ""
+
+    # rxMcAddr is the multicast address on which the plugin will listen for GPS
+    #          multicasts.
+    #
+    # Default: 224.0.0.224 (IPv4) or FF02:0:0:0:0:0:0:1 (IPv6)
+    #
+    # PlParam     "rxMcAddr"                     "224.0.0.224"
+
+    # rxMcPort is the UDP port on which the plugin will listen for GPS
+    #          multicasts.
+    #
+    # Default: 2240
+    #
+    # PlParam     "rxMcPort"                     "2240"
+
+    # positionFile is the file that contains the position information that the
+    #              plugin should use. When this parameter is set then the
+    #              file is read during olsrd startup. An example file is
+    #              available in the doc directory of olsrd.
+    #
+    # Default: none
+    #
+    # PlParam     "positionFile"                 ""
+
+    # Specifies the period in milliseconds on which to read the positionFile
+    # (if it changed) and activate its new setting for the position.
+    # This setting is only relevant if positionFile has been configured.
+    # A setting of zero disables dynamic updates, the positionFile is then only
+    # read during olsrd startup.
+    #
+    # Default: 0
+    #
+    # PlParam     "positionFilePeriod" "0"
+
+
+    #
+    # TX Parameters
+    #
+
+    # txNonOlsrIf is a network interface on the host on which the plugin will
+    #             transmit GPS multicasts that were received through the OLSR
+    #             network. Multiple such interfaces can be specified by
+    #             specifying the parameter multiple times.
+    #
+    # Default: none
+    #
+    # PlParam     "txNonOlsrIf"                  ""
+
+    # txMcAddr is the multicast address on which the plugin will transmit GPS
+    #          multicasts that were received through the OLSR network.
+    #
+    # Default: 224.0.0.224 (IPv4) or FF02:0:0:0:0:0:0:1 (IPv6)
+    #
+    # PlParam     "txMcAddr"                     "224.0.0.224"
+
+    # txMcPort is the UDP port on which the plugin will transmit GPS multicasts
+    #          that were received through the OLSR network.
+    #
+    # Default: 2240
+    #
+    # PlParam     "txMcPort"                     "2240"
+
+    # txTtl is the TTL that is used when transmitting GPS multicasts that were
+    #       received through the OLSR network
+    #
+    # Default: 1
+    #
+    # PlParam     "txTtl"                        "1"
+
+    # txNmeaMessagePrefix is the NMEA message prefix of GPS multicasts that the
+    #                     plugin transmits. It must be exactly 4 characters
+    #                     long.
+    #
+    # Default: NBSX
+    #
+    # PlParam     "txNmeaMessagePrefix"          "NBSX"
+
+
+    #
+    # Uplink Parameters
+    #
+
+    # uplinkAddr is the IP address to which the plugin will transmit GPS
+    #            position updates. When not set, no uplink messages will be
+    #            sent.
+    #
+    # Default: none
+    #
+    # PlParam     "uplinkAddr"                   ""
+
+    # uplinkPort is the UDP port to which the plugin will transmit GPS position
+    #            updates. Can't be the same as the downlink port.
+    #
+    # Default: 2241
+    #
+    # PlParam     "uplinkPort"                   "2241"
+
+    # downlinkPort is the UDP port on which the plugin will receive GPS position
+    #              updates. Can't be the same as the uplink port.
+    #              The downlink is only active when a proper uplink has been
+    #              configured.
+    #
+    # Default: 2242
+    #
+    # PlParam     "downlinkPort"                 "2242"
+
+
+    #
+    # OLSR Parameters
+    #
+
+    # olsrTtl is the TTL that is used when sending messages over the OLSR
+    #         networks. Setting this to 0 (zero) will disable distribution
+    #         of position updates over the OLSR networks.
+    #
+    # Default: 64
+    #
+    # PlParam     "olsrTtl"                      "64"
+
+
+    #
+    # Update Parameters
+    #
+
+    # updateIntervalStationary is the interval (in seconds) between position
+    #                          updates sent over the OLSR network when the
+    #                          node is stationary
+    #
+    # Default: 60
+    #
+    # PlParam     "updateIntervalStationary"     "60"
+
+    # updateIntervalMoving is the interval (in seconds) between position
+    #                      updates sent over the OLSR network when the
+    #                      node is moving
+    #
+    # Default: 5
+    #
+    # PlParam     "updateIntervalMoving"         "5"
+
+    # uplinkUpdateIntervalStationary is the interval (in seconds) between
+    #                                position updates sent over the uplink when
+    #                                the node is stationary
+    #
+    # Default: 180
+    #
+    # PlParam     "uplinkUpdateIntervalStationary" "180"
+
+    # uplinkUpdateIntervalMoving is the interval (in seconds) between position
+    #                            updates sent over the OLSR network when the
+    #                            node is moving
+    #
+    # Default: 15
+    #
+    # PlParam     "uplinkUpdateIntervalMoving"   "15"
+
+    # gatewayDeterminationInterval is the interval (in seconds) on which
+    #                              determination of the best gateway is
+    #                              performed
+    #
+    # Default: 1
+    #
+    # PlParam     "gatewayDeterminationInterval" "1"
+
+    # movingSpeedThreshold is the speed from which we consider the node is
+    #                      moving
+    #
+    # Default: 9
+    #
+    # PlParam     "movingSpeedThreshold"         "9"
+
+    # movingDistanceThreshold is the distance from the previous position from
+    #                         which we consider the node is moving
+    #
+    # Default: 50
+    #
+    # PlParam     "movingDistanceThreshold"      "50"
+
+    # dopMultiplier One of the situations that is seen as movement is when the
+    #               current position with its uncertainty circle no longer
+    #               overlaps the last transmitted position with its uncertainty
+    #               circle. This parameter is used to adjust the sizes of these
+    #               uncertainty circles: setting it to a value less than 1.0
+    #               will make both uncertainty circles smaller by this factor,
+    #               resulting in earlier movement detection. Setting it to a
+    #               value larger than 1.0 will detect movement later.
+    #
+    # Default: 2.5
+    #
+    # PlParam     "dopMultiplier"                "2.5"
+
+    # defaultHdop is the default value that is taken for HDOP (in meters) in
+    #             determining whether we are moving when there is a position
+    #             available but no HDOP.
+    #
+    # Default: 50
+    #
+    # PlParam     "defaultHdop"                  "50"
+
+    # defaultVdop is the default value that is taken for VDOP (in meters) in
+    #             determining whether we are moving when there is a position
+    #             available but no VDOP.
+    #
+    # Default: 50
+    #
+    # PlParam     "defaultVdop"                  "50"
+
+    # averageDepth is the depth of the position average list, or the number
+    #              of positions that are averaged to obtain the average
+    #              position
+    #
+    # Default: 5
+    #
+    # PlParam     "averageDepth"                 "5"
+
+    # hysteresisCountToStationary is the number of position updates that
+    #                             effectuate a state transition from moving to
+    #                             stationary that must be received before the
+    #                             actual transition is taken
+    #
+    # Default: 17
+    #
+    # PlParam     "hysteresisCountToStationary"  "17"
+
+    # hysteresisCountToMoving is the number of position updates that effectuate
+    #                         a state transition from stationary to moving that
+    #                         must be received before the actual transition is
+    #                         taken
+    #
+    # Default: 5
+    #
+    # PlParam     "hysteresisCountToMoving"      "5"
+
+    # gatewayHysteresisCountToStationary is the number of times the gateway
+    #                             must be the same that effectuate a state transition from
+    #                             moving to stationary that must be received
+    #                             before the actual transition is taken
+    #
+    # Default: 17
+    #
+    # PlParam     "gatewayHysteresisCountToStationary" "17"
+
+    # gatewayHysteresisCountToMoving is the number of gateway updates that
+    #                         effectuate a state transition from stationary to
+    #                         moving that must be received before the actual
+    #                         transition is taken
+    #
+    # Default: 5
+    #
+    # PlParam     "gatewayHysteresisCountToMoving" "5"
+
+
+    #
+    # Other Plugin Parameters
+    #
+
+    # useDeDup determines whether duplicate message detection is to be
+    #          performed. When 0 then no such detection is performed, when 1
+    #          then the detection is performed 
+    #
+    # Default: true
+    #
+    # PlParam     "useDeDup"                     "true"
+
+    # deDupDepth the number of messages that are tracked to detect duplucates
+    #            messages received from the OLSR network
+    #
+    # Default: 256
+    #
+    # PlParam     "deDupDepth"                   "256"
+
+    # useLoopback determines whether the message that is sent over the OLSR
+    #             network should be immediately looped back, thus pretending
+    #             that the message (that is sent by this node) is received from
+    #             the OLSR network. When 0 then no loopback is performed, when
+    #             1 then the loopback is performed
+    #
+    # Default: false
+    #
+    # PlParam     "useLoopback"                  "true"
+}
index 52cd26d..5595a1a 100755 (executable)
Binary files a/lib/pud/doc/pud.odt and b/lib/pud/doc/pud.odt differ
index a5b2cd2..923ed7c 100644 (file)
@@ -15,14 +15,14 @@ ifeq ($(VERBOSE),0)
 endif
        $(MAKECMDPREFIX)doxygen nmea.doxygen.temp
        $(MAKECMDPREFIX)rm nmea.doxygen.temp
-ifeq ($(VERBOSE),0)
-       @echo "Generating PDF..."
-       @$(MAKE) -C latex -s > /dev/null 2>&1
-else
-       $(MAKE) -C latex
-endif
-       $(MAKECMDPREFIX)mv latex/refman.pdf nmealib.pdf
-       $(MAKECMDPREFIX)rm -fr latex
+#ifeq ($(VERBOSE),0)
+#      @echo "Generating PDF..."
+#      @$(MAKE) -C latex -s > /dev/null 2>&1
+#else
+#      $(MAKE) -C latex
+#endif
+#      $(MAKECMDPREFIX)mv latex/refman.pdf nmealib.pdf
+#      $(MAKECMDPREFIX)rm -fr latex
 ifeq ($(VERBOSE),0)
        @echo "Done"
 endif
index eb6d5b7..8eba25f 100644 (file)
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.6
+# Doxyfile 1.8.9.1
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project.
@@ -46,10 +46,10 @@ PROJECT_NUMBER         =
 
 PROJECT_BRIEF          =
 
-# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
-# the documentation. The maximum height of the logo should not exceed 55 pixels
-# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
-# to the output directory.
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
 
 PROJECT_LOGO           =
 
@@ -60,7 +60,7 @@ PROJECT_LOGO           =
 
 OUTPUT_DIRECTORY       =
 
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
 # directories (in 2 levels) under the output directory of each output format and
 # will distribute the generated files over these directories. Enabling this
 # option can be useful when feeding doxygen a huge amount of source files, where
@@ -70,6 +70,14 @@ OUTPUT_DIRECTORY       =
 
 CREATE_SUBDIRS         = NO
 
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
 # The OUTPUT_LANGUAGE tag is used to specify the language in which all
 # documentation generated by doxygen is written. Doxygen will use this
 # information to generate all constant output in the proper language.
@@ -85,14 +93,14 @@ CREATE_SUBDIRS         = NO
 
 OUTPUT_LANGUAGE        = English
 
-# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
 # descriptions after the members that are listed in the file and class
 # documentation (similar to Javadoc). Set to NO to disable this.
 # The default value is: YES.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
 # description of a member or function before the detailed description
 #
 # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
@@ -127,7 +135,7 @@ ALWAYS_DETAILED_SEC    = NO
 
 INLINE_INHERITED_MEMB  = NO
 
-# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
 # before files name in the file list and in the header files. If set to NO the
 # shortest path that makes the file name unique will be used
 # The default value is: YES.
@@ -197,9 +205,9 @@ MULTILINE_CPP_IS_BRIEF = NO
 
 INHERIT_DOCS           = YES
 
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
-# new page for each member. If set to NO, the documentation of a member will be
-# part of the file/class/namespace that contains it.
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
 # The default value is: NO.
 
 SEPARATE_MEMBER_PAGES  = NO
@@ -261,11 +269,14 @@ OPTIMIZE_OUTPUT_VHDL   = NO
 # extension. Doxygen has a built-in mapping, but you can override or extend it
 # using this tag. The format is ext=language, where ext is a file extension, and
 # language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
-# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
-# (default is Fortran), use: inc=Fortran f=C.
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
 #
-# Note For files without extension you can use no_extension as a placeholder.
+# Note: For files without extension you can use no_extension as a placeholder.
 #
 # Note that for custom extensions you also need to set FILE_PATTERNS otherwise
 # the files are not read by doxygen.
@@ -284,8 +295,8 @@ MARKDOWN_SUPPORT       = YES
 
 # When enabled doxygen tries to link words that correspond to documented
 # classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by by putting a % sign in front of the word
-# or globally by setting AUTOLINK_SUPPORT to NO.
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
 # The default value is: YES.
 
 AUTOLINK_SUPPORT       = YES
@@ -325,7 +336,7 @@ SIP_SUPPORT            = NO
 IDL_PROPERTY_SUPPORT   = YES
 
 # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
+# tag is set to YES then doxygen will reuse the documentation of the first
 # member in the group (if any) for the other members of the group. By default
 # all members of a group must be documented explicitly.
 # The default value is: NO.
@@ -390,7 +401,7 @@ LOOKUP_CACHE_SIZE      = 0
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
 # documentation are documented, even if no documentation was available. Private
 # class members and static file members will be hidden unless the
 # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
@@ -400,35 +411,35 @@ LOOKUP_CACHE_SIZE      = 0
 
 EXTRACT_ALL            = YES
 
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
 # be included in the documentation.
 # The default value is: NO.
 
 EXTRACT_PRIVATE        = YES
 
-# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
 # scope will be included in the documentation.
 # The default value is: NO.
 
 EXTRACT_PACKAGE        = NO
 
-# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
 # included in the documentation.
 # The default value is: NO.
 
 EXTRACT_STATIC         = YES
 
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
-# locally in source files will be included in the documentation. If set to NO
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
 # only classes defined in header files are included. Does not have any effect
 # for Java sources.
 # The default value is: YES.
 
 EXTRACT_LOCAL_CLASSES  = YES
 
-# This flag is only useful for Objective-C code. When set to YES local methods,
+# This flag is only useful for Objective-C code. If set to YES, local methods,
 # which are defined in the implementation section but not in the interface are
-# included in the documentation. If set to NO only methods in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
 # included.
 # The default value is: NO.
 
@@ -453,21 +464,21 @@ HIDE_UNDOC_MEMBERS     = NO
 
 # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
 # undocumented classes that are normally visible in the class hierarchy. If set
-# to NO these classes will be included in the various overviews. This option has
-# no effect if EXTRACT_ALL is enabled.
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
 # The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = NO
 
 # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO these declarations will be
+# (class|struct|union) declarations. If set to NO, these declarations will be
 # included in the documentation.
 # The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
 # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
-# documentation blocks found inside the body of a function. If set to NO these
+# documentation blocks found inside the body of a function. If set to NO, these
 # blocks will be appended to the function's detailed documentation block.
 # The default value is: NO.
 
@@ -481,7 +492,7 @@ HIDE_IN_BODY_DOCS      = NO
 INTERNAL_DOCS          = NO
 
 # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES upper-case letters are also
+# names in lower-case letters. If set to YES, upper-case letters are also
 # allowed. This is useful if you have classes or files whose names only differ
 # in case and if your file system supports case sensitive file names. Windows
 # and Mac users are advised to set this option to NO.
@@ -490,12 +501,19 @@ INTERNAL_DOCS          = NO
 CASE_SENSE_NAMES       = YES
 
 # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
-# their full class and namespace scopes in the documentation. If set to YES the
+# their full class and namespace scopes in the documentation. If set to YES, the
 # scope will be hidden.
 # The default value is: NO.
 
 HIDE_SCOPE_NAMES       = NO
 
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
 # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
 # the files that are included by a file in the documentation of that file.
 # The default value is: YES.
@@ -523,14 +541,14 @@ INLINE_INFO            = YES
 
 # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
 # (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO the members will appear in declaration order.
+# name. If set to NO, the members will appear in declaration order.
 # The default value is: YES.
 
 SORT_MEMBER_DOCS       = YES
 
 # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
 # descriptions of file, namespace and class members alphabetically by member
-# name. If set to NO the members will appear in declaration order. Note that
+# name. If set to NO, the members will appear in declaration order. Note that
 # this will also influence the order of the classes in the class list.
 # The default value is: NO.
 
@@ -575,27 +593,25 @@ SORT_BY_SCOPE_NAME     = NO
 
 STRICT_PROTO_MATCHING  = NO
 
-# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
-# todo list. This list is created by putting \todo commands in the
-# documentation.
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
 # The default value is: YES.
 
 GENERATE_TODOLIST      = YES
 
-# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
-# test list. This list is created by putting \test commands in the
-# documentation.
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
 # The default value is: YES.
 
 GENERATE_TESTLIST      = YES
 
-# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
 # list. This list is created by putting \bug commands in the documentation.
 # The default value is: YES.
 
 GENERATE_BUGLIST       = YES
 
-# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
 # the deprecated list. This list is created by putting \deprecated commands in
 # the documentation.
 # The default value is: YES.
@@ -620,8 +636,8 @@ ENABLED_SECTIONS       =
 MAX_INITIALIZER_LINES  = 30
 
 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
-# the bottom of the documentation of classes and structs. If set to YES the list
-# will mention the files that were used to generate the documentation.
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
 # The default value is: YES.
 
 SHOW_USED_FILES        = YES
@@ -669,8 +685,7 @@ LAYOUT_FILE            =
 # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
 # For LaTeX the style of the bibliography can be controlled using
 # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
-# search path. Do not use file names with spaces, bibtex cannot handle them. See
-# also \cite for info how to create references.
+# search path. See also \cite for info how to create references.
 
 CITE_BIB_FILES         =
 
@@ -686,7 +701,7 @@ CITE_BIB_FILES         =
 QUIET                  = YES
 
 # The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
 # this implies that the warnings are on.
 #
 # Tip: Turn warnings on while writing the documentation.
@@ -694,7 +709,7 @@ QUIET                  = YES
 
 WARNINGS               = YES
 
-# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
 # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
 # will automatically be disabled.
 # The default value is: YES.
@@ -711,8 +726,8 @@ WARN_IF_DOC_ERROR      = YES
 
 # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
 # are documented, but have no documentation for their parameters or return
-# value. If set to NO doxygen will only warn about wrong or incomplete parameter
-# documentation, but not about the absence of documentation.
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
 # The default value is: NO.
 
 WARN_NO_PARAMDOC       = YES
@@ -862,7 +877,7 @@ INPUT_FILTER           =
 FILTER_PATTERNS        =
 
 # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER ) will also be used to filter the input files that are used for
+# INPUT_FILTER) will also be used to filter the input files that are used for
 # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
 # The default value is: NO.
 
@@ -922,7 +937,7 @@ REFERENCED_BY_RELATION = YES
 REFERENCES_RELATION    = YES
 
 # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
-# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
 # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
 # link to the documentation.
 # The default value is: YES.
@@ -999,8 +1014,8 @@ IGNORE_PREFIX          =
 # Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
-# The default value is: YES.
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: NO.
 
 GENERATE_HTML          = YES
 
@@ -1061,13 +1076,15 @@ HTML_FOOTER            =
 
 HTML_STYLESHEET        =
 
-# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
-# defined cascading style sheet that is included after the standard style sheets
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
 # created by doxygen. Using this option one can overrule certain style aspects.
 # This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefor more robust against future updates.
-# Doxygen will copy the style sheet file to the output directory. For an example
-# see the documentation.
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_EXTRA_STYLESHEET  =
@@ -1083,7 +1100,7 @@ HTML_EXTRA_STYLESHEET  =
 HTML_EXTRA_FILES       =
 
 # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the stylesheet and background images according to
+# will adjust the colors in the style sheet and background images according to
 # this color. Hue is specified as an angle on a colorwheel, see
 # http://en.wikipedia.org/wiki/Hue for more information. For instance the value
 # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
@@ -1115,7 +1132,7 @@ HTML_COLORSTYLE_GAMMA  = 80
 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
 # page will contain the date and time when the page was generated. Setting this
 # to NO can help when comparing the output of multiple runs.
-# The default value is: YES.
+# The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_TIMESTAMP         = YES
@@ -1211,28 +1228,29 @@ GENERATE_HTMLHELP      = NO
 CHM_FILE               = nmealib.chm
 
 # The HHC_LOCATION tag can be used to specify the location (absolute path
-# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
 # doxygen will try to run the HTML help compiler on the generated index.hhp.
 # The file has to be specified with full path.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 HHC_LOCATION           =
 
-# The GENERATE_CHI flag controls if a separate .chi index file is generated (
-# YES) or that it should be included in the master .chm file ( NO).
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 GENERATE_CHI           = NO
 
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
 # and project file content.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 CHM_INDEX_ENCODING     =
 
-# The BINARY_TOC flag controls whether a binary table of contents is generated (
-# YES) or a normal table of contents ( NO) in the .chm file.
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
@@ -1345,7 +1363,7 @@ DISABLE_INDEX          = NO
 # index structure (just like the one that is generated for HTML Help). For this
 # to work a browser that supports JavaScript, DHTML, CSS and frames is required
 # (i.e. any modern browser). Windows users are probably better off using the
-# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
 # further fine-tune the look of the index. As an example, the default style
 # sheet generated by doxygen has an example that shows how to put an image at
 # the root of the tree instead of the PROJECT_NAME. Since the tree basically has
@@ -1373,7 +1391,7 @@ ENUM_VALUES_PER_LINE   = 4
 
 TREEVIEW_WIDTH         = 250
 
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
 # external symbols imported via tag files in a separate window.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1402,7 +1420,7 @@ FORMULA_TRANSPARENT    = YES
 
 # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
 # http://www.mathjax.org) which uses client side Javascript for the rendering
-# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
 # installed or if you want to formulas look prettier in the HTML output. When
 # enabled you may also need to install MathJax separately and configure the path
 # to it using the MATHJAX_RELPATH option.
@@ -1472,11 +1490,11 @@ SEARCHENGINE           = YES
 
 # When the SERVER_BASED_SEARCH tag is enabled the search engine will be
 # implemented using a web server instead of a web client using Javascript. There
-# are two flavours of web server based searching depending on the
-# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
-# searching and an index file used by the script. When EXTERNAL_SEARCH is
-# enabled the indexing and searching needs to be provided by external tools. See
-# the section "External Indexing and Searching" for details.
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
 # The default value is: NO.
 # This tag requires that the tag SEARCHENGINE is set to YES.
 
@@ -1488,7 +1506,7 @@ SERVER_BASED_SEARCH    = NO
 # external search engine pointed to by the SEARCHENGINE_URL option to obtain the
 # search results.
 #
-# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
 # Xapian (see: http://xapian.org/).
 #
@@ -1501,7 +1519,7 @@ EXTERNAL_SEARCH        = NO
 # The SEARCHENGINE_URL should point to a search engine hosted by a web server
 # which will return the search results when EXTERNAL_SEARCH is enabled.
 #
-# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
 # Xapian (see: http://xapian.org/). See the section "External Indexing and
 # Searching" for details.
@@ -1539,7 +1557,7 @@ EXTRA_SEARCH_MAPPINGS  =
 # Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
 # The default value is: YES.
 
 GENERATE_LATEX         = YES
@@ -1570,7 +1588,7 @@ LATEX_CMD_NAME         = latex
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
 # documents. This may be useful for small projects and may help to save some
 # trees in general.
 # The default value is: NO.
@@ -1604,23 +1622,36 @@ EXTRA_PACKAGES         =
 #
 # Note: Only use a user-defined header if you know what you are doing! The
 # following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
-# replace them by respectively the title of the page, the current date and time,
-# only the current date, the version number of doxygen, the project name (see
-# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HEADER           =
 
 # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
 # generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer.
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
 #
 # Note: Only use a user-defined footer if you know what you are doing!
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_FOOTER           =
 
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
 # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
 # other source files which should be copied to the LATEX_OUTPUT output
 # directory. Note that the files will be copied as-is; there are no commands or
@@ -1638,8 +1669,8 @@ LATEX_EXTRA_FILES      =
 
 PDF_HYPERLINKS         = YES
 
-# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
 # higher quality PDF documentation.
 # The default value is: YES.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -1684,7 +1715,7 @@ LATEX_BIB_STYLE        = plain
 # Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
 # RTF output is optimized for Word 97 and may not look too pretty with other RTF
 # readers/editors.
 # The default value is: NO.
@@ -1699,7 +1730,7 @@ GENERATE_RTF           = NO
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
 # documents. This may be useful for small projects and may help to save some
 # trees in general.
 # The default value is: NO.
@@ -1736,11 +1767,21 @@ RTF_STYLESHEET_FILE    =
 
 RTF_EXTENSIONS_FILE    =
 
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
 #---------------------------------------------------------------------------
 # Configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
 # classes and files.
 # The default value is: NO.
 
@@ -1764,6 +1805,13 @@ MAN_OUTPUT             = man
 
 MAN_EXTENSION          = .3
 
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
 # If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
 # will generate one additional man file for each entity documented in the real
 # man page(s). These additional files only source the real man page, but without
@@ -1777,7 +1825,7 @@ MAN_LINKS              = YES
 # Configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
 # captures the structure of the code including all documentation.
 # The default value is: NO.
 
@@ -1791,19 +1839,7 @@ GENERATE_XML           = NO
 
 XML_OUTPUT             = xml
 
-# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
-# validating XML parser to check the syntax of the XML files.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_SCHEMA             =
-
-# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
-# validating XML parser to check the syntax of the XML files.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_DTD                =
-
-# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
 # listings (including syntax highlighting and cross-referencing information) to
 # the XML output. Note that enabling this will significantly increase the size
 # of the XML output.
@@ -1816,7 +1852,7 @@ XML_PROGRAMLISTING     = YES
 # Configuration options related to the DOCBOOK output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
 # that can be used to generate PDF.
 # The default value is: NO.
 
@@ -1830,14 +1866,23 @@ GENERATE_DOCBOOK       = NO
 
 DOCBOOK_OUTPUT         = docbook
 
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
 #---------------------------------------------------------------------------
 # Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
-# Definitions (see http://autogen.sf.net) file that captures the structure of
-# the code including all documentation. Note that this feature is still
-# experimental and incomplete at the moment.
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
 # The default value is: NO.
 
 GENERATE_AUTOGEN_DEF   = NO
@@ -1846,7 +1891,7 @@ GENERATE_AUTOGEN_DEF   = NO
 # Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
 # file that captures the structure of the code including all documentation.
 #
 # Note that this feature is still experimental and incomplete at the moment.
@@ -1854,7 +1899,7 @@ GENERATE_AUTOGEN_DEF   = NO
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
 # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
 # output from the Perl module output.
 # The default value is: NO.
@@ -1862,9 +1907,9 @@ GENERATE_PERLMOD       = NO
 
 PERLMOD_LATEX          = NO
 
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
 # formatted so it can be parsed by a human reader. This is useful if you want to
-# understand what is going on. On the other hand, if this tag is set to NO the
+# understand what is going on. On the other hand, if this tag is set to NO, the
 # size of the Perl module output will be much smaller and Perl will parse it
 # just the same.
 # The default value is: YES.
@@ -1884,14 +1929,14 @@ PERLMOD_MAKEVAR_PREFIX =
 # Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
 # C-preprocessor directives found in the sources and include files.
 # The default value is: YES.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
-# in the source code. If set to NO only conditional compilation will be
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
 # performed. Macro expansion can be done in a controlled way by setting
 # EXPAND_ONLY_PREDEF to YES.
 # The default value is: NO.
@@ -1907,7 +1952,7 @@ MACRO_EXPANSION        = YES
 
 EXPAND_ONLY_PREDEF     = YES
 
-# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
 # INCLUDE_PATH will be searched if a #include is found.
 # The default value is: YES.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
@@ -1949,9 +1994,9 @@ PREDEFINED             = "__attribute__(x)="
 EXPAND_AS_DEFINED      =
 
 # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
-# remove all refrences to function-like macros that are alone on a line, have an
-# all uppercase name, and do not end with a semicolon. Such function macros are
-# typically used for boiler-plate code, and will confuse the parser if not
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
 # removed.
 # The default value is: YES.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
@@ -1971,7 +2016,7 @@ SKIP_FUNCTION_MACROS   = YES
 # where loc1 and loc2 can be relative or absolute paths or URLs. See the
 # section "Linking to external documentation" for more information about the use
 # of tag files.
-# Note: Each tag file must have an unique name (where the name does NOT include
+# Note: Each tag file must have a unique name (where the name does NOT include
 # the path). If a tag file is not located in the directory in which doxygen is
 # run, you must also specify the path to the tagfile here.
 
@@ -1983,20 +2028,21 @@ TAGFILES               =
 
 GENERATE_TAGFILE       =
 
-# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
-# class index. If set to NO only the inherited external classes will be listed.
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
 # The default value is: NO.
 
 ALLEXTERNALS           = NO
 
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
-# the modules index. If set to NO, only the current project's groups will be
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
 # listed.
 # The default value is: YES.
 
 EXTERNAL_GROUPS        = YES
 
-# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
 # the related pages index. If set to NO, only the current project's pages will
 # be listed.
 # The default value is: YES.
@@ -2013,7 +2059,7 @@ PERL_PATH              = /usr/bin/perl
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
 # (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
 # NO turns the diagrams off. Note that this option also works with HAVE_DOT
 # disabled, but it is recommended to install and use dot, since it yields more
@@ -2038,7 +2084,7 @@ MSCGEN_PATH            =
 
 DIA_PATH               =
 
-# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# If set to YES the inheritance and collaboration graphs will hide inheritance
 # and usage relations if the target is undocumented or is not a class.
 # The default value is: YES.
 
@@ -2063,7 +2109,7 @@ HAVE_DOT               = YES
 
 DOT_NUM_THREADS        = 0
 
-# When you want a differently looking font n the dot files that doxygen
+# When you want a differently looking font in the dot files that doxygen
 # generates you can specify the font name using DOT_FONTNAME. You need to make
 # sure dot is able to find the font, which can be done by putting it in a
 # standard location or by setting the DOTFONTPATH environment variable or by
@@ -2111,7 +2157,7 @@ COLLABORATION_GRAPH    = YES
 
 GROUP_GRAPHS           = YES
 
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
 # collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
 # The default value is: NO.
@@ -2244,6 +2290,19 @@ MSCFILE_DIRS           =
 
 DIAFILE_DIRS           =
 
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
 # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
 # that will be shown in the graph. If the number of nodes in a graph becomes
 # larger than this value, doxygen will truncate the graph, which is visualized
@@ -2280,7 +2339,7 @@ MAX_DOT_GRAPH_DEPTH    = 0
 
 DOT_TRANSPARENT        = YES
 
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
 # files in one run (i.e. multiple -o and -T options on the command line). This
 # makes dot run faster, but since only newer versions of dot (>1.8.10) support
 # this, this feature is disabled by default.
@@ -2297,7 +2356,7 @@ DOT_MULTI_TARGETS      = YES
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
 # files that are used to generate the various graphs.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
index ddff086..26edd3a 100644 (file)
 #include <nmea/gmath.h>
 #include <nmea/generate.h>
 
+#include "random.h"
+
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
 
-/**
- * Generate a random number in the range [min, max]
- *
- * @param min the minimum
- * @param max the maximum
- * @return a random number
- */
-static double nmea_random(const double min, const double max) {
-       static double rand_max = RAND_MAX;
-       double rand_val = rand();
-       double bounds = max - min;
-       return min + (rand_val * bounds) / rand_max;
-}
-
 /**
  * Initialise the generator
  *
@@ -53,6 +41,8 @@ int nmea_gen_init(nmeaGENERATOR *gen, nmeaINFO *info) {
        int smask = info->smask;
        nmeaGENERATOR *igen = gen;
 
+       nmea_init_random();
+
        nmea_zero_INFO(info);
        info->present = present;
        info->smask = smask;
@@ -317,7 +307,7 @@ static int nmea_igen_static_init(nmeaGENERATOR *gen, nmeaINFO *info) {
 static int nmea_igen_rotate_loop(nmeaGENERATOR *gen __attribute__ ((unused)), nmeaINFO *info) {
        int it;
        int count = info->satinfo.inview;
-       double deg = 360 / (count ? count : 1);
+       double deg = 360.0 / (count ? count : 1);
        double srt = (count ? (info->satinfo.sat[0].azimuth) : 0) + 5;
 
        nmea_time_now(&info->utc, &info->present);
diff --git a/lib/pud/nmealib/src/random.h b/lib/pud/nmealib/src/random.h
new file mode 100644 (file)
index 0000000..f7e9759
--- /dev/null
@@ -0,0 +1,42 @@
+#ifndef _NMEA_RANDOM_H
+#define _NMEA_RANDOM_H
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <time.h>
+
+#define NMEA_RANDOM_MAX INT32_MAX
+
+static inline long int nmea_random(const double min, const double max) {
+  int32_t value;
+  int randomFile;
+  double range = abs(max - min);
+
+#ifdef _WIN32
+  value = random();
+#else
+
+  randomFile = open("/dev/urandom", O_RDONLY);
+  if (randomFile == -1) {
+    randomFile = open("/dev/random", O_RDONLY);
+  }
+
+  if ((randomFile == -1) || (read(randomFile, &value, sizeof(value)) != sizeof(value))) {
+    value = random();
+  }
+
+  if (randomFile != -1) {
+    close(randomFile);
+  }
+#endif /* _WIN32 */
+
+  return min + ((abs(value) * range) / NMEA_RANDOM_MAX);
+}
+
+static inline void nmea_init_random(void) {
+  srandom(time(NULL));
+}
+
+#endif /* _NMEA_RANDOM_H */
index 931c4bf..261c232 100644 (file)
@@ -172,7 +172,7 @@ int nmea_scanf(const char *s, int len, const char *format, ...) {
                        if (isdigit(*format))
                                break;
                        {
-                               tok_type = NMEA_TOKS_TYPE;
+                               /* No need to do 'tok_type = NMEA_TOKS_TYPE' since we'll do a fall-through */
                                if (format > beg_fmt)
                                        width = nmea_atoi(beg_fmt, (int) (format - beg_fmt), 10);
                        }
diff --git a/lib/pud/olsrd.conf.sample b/lib/pud/olsrd.conf.sample
deleted file mode 100644 (file)
index 906d5c2..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
-LoadPlugin "<olsrd plugin library path>/olsrd_pud.so.1.1.0"
-{
-    # 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"
-
-
-    #
-    # RX Parameters
-    #
-
-    # rxNonOlsrIf is a network interface on the host on which the plugin will
-    #             listen for GPS multicasts. Multiple such interfaces can be
-    #             specified by specifying the parameter multiple times.
-    #
-    # Default: none
-    #
-    #PlParam     "rxNonOlsrIf"                  ""
-
-    # rxAllowedSourceIpAddress is an IP address from which the plugin is
-    #                          allowed to process/parse GPS sentences. When
-    #                          this parameter is not configured then GPS
-    #                          sentences from ALL IP addresses are processed.
-    #                          Multiple IP addresses can be specified by
-    #                          specifying the parameter multiple times.
-    #
-    # Default: none
-    #
-    #PlParam     "rxAllowedSourceIpAddress"     ""
-
-    # rxMcAddr is the multicast address on which the plugin will listen for GPS
-    #          multicasts.
-    #
-    # Default: 224.0.0.224 (IPv4) or FF02:0:0:0:0:0:0:1 (IPv6)
-    #
-    #PlParam     "rxMcAddr"                     "224.0.0.224"
-
-    # rxMcPort is the UDP port on which the plugin will listen for GPS
-    #          multicasts.
-    #
-    # Default: 2240
-    #
-    #PlParam     "rxMcPort"                     "2240"
-
-    # positionFile is the file that contains the position information that the
-    #              plugin should use. When this parameter is set then the
-    #              file is read during olsrd startup. An example file is
-    #              available in the doc directory of olsrd.
-    #
-    # Default: none
-    #
-    #PlParam "positionFile"                     ""
-
-    # Specifies the period in milliseconds on which to read the positionFile
-    # (if it changed) and activate its new setting for the position.
-    # This setting is only relevant if positionFile has been configured.
-    # A setting of zero disables dynamic updates, the positionFile is then only
-    # read during olsrd startup.
-    #
-    # Default: 0
-    #
-    #PlParam "positionFilePeriod" "0"
-
-
-    #
-    # TX Parameters
-    #
-
-    # txNonOlsrIf is a network interface on the host on which the plugin will
-    #             transmit GPS multicasts that were received through the OLSR
-    #             network. Multiple such interfaces can be specified by
-    #             specifying the parameter multiple times.
-    #
-    # Default: none
-    #
-    #PlParam     "txNonOlsrIf"                  ""
-
-    # txMcAddr is the multicast address on which the plugin will transmit GPS
-    #          multicasts that were received through the OLSR network.
-    #
-    # Default: 224.0.0.224 (IPv4) or FF02:0:0:0:0:0:0:1 (IPv6)
-    #
-    #PlParam     "txMcAddr"                     "224.0.0.224"
-
-    # txMcPort is the UDP port on which the plugin will transmit GPS multicasts
-    #          that were received through the OLSR network.
-    #
-    # Default: 2240
-    #
-    #PlParam     "txMcPort"                     "2240"
-
-    # txTtl is the TTL that is used when transmitting GPS multicasts that were
-    #       received through the OLSR network
-    #
-    # Default: 1
-    #
-    #PlParam     "txTtl"                        "1"
-
-    # txNmeaMessagePrefix is the NMEA message prefix of GPS multicasts that the
-    #                     plugin transmits. It must be exactly 4 characters
-    #                     long.
-    #
-    # Default: NBSX
-    #
-    #PlParam     "txNmeaMessagePrefix"          "NBSX"
-
-
-    #
-    # Uplink Parameters
-    #
-
-    # uplinkAddr is the IP address to which the plugin will transmit GPS
-    #            position updates. When not set, no uplink messages will be
-    #            sent.
-    #
-    # Default: none
-    #
-    #PlParam     "uplinkAddr"                   ""
-
-    # uplinkPort is the UDP port to which the plugin will transmit GPS position
-    #            updates. Can't be the same as the downlink port.
-    #
-    # Default: 2241
-    #
-    #PlParam     "uplinkPort"                   "2241"
-
-    # downlinkPort is the UDP port on which the plugin will receive GPS position
-    #              updates. Can't be the same as the uplink port.
-    #              The downlink is only active when a proper uplink has been
-    #              configured.
-    #
-    # Default: 2242
-    #
-    #PlParam     "downlinkPort"                 "2242"
-
-
-    #
-    # OLSR Parameters
-    #
-
-    # olsrTtl is the TTL that is used when sending messages over the OLSR
-    #         networks. Setting this to 0 (zero) will disable distribution
-    #         of position updates over the OLSR networks.
-    #
-    # Default: 64
-    #
-    #PlParam     "olsrTtl"                      "64"
-
-
-    #
-    # Update Parameters
-    #
-
-    # updateIntervalStationary is the interval (in seconds) between position
-    #                          updates sent over the OLSR network when the
-    #                          node is stationary
-    #
-    # Default: 60
-    #
-    #PlParam     "updateIntervalStationary"     "60"
-
-    # updateIntervalMoving is the interval (in seconds) between position
-    #                      updates sent over the OLSR network when the
-    #                      node is moving
-    #
-    # Default: 5
-    #
-    #PlParam     "updateIntervalMoving"         "5"
-
-    # uplinkUpdateIntervalStationary is the interval (in seconds) between
-    #                                position updates sent over the uplink when
-    #                                the node is stationary
-    #
-    # Default: 180
-    #
-    #PlParam     "uplinkUpdateIntervalStationary"  "180"
-
-    # uplinkUpdateIntervalMoving is the interval (in seconds) between position
-    #                            updates sent over the OLSR network when the
-    #                            node is moving
-    #
-    # Default: 15
-    #
-    #PlParam     "uplinkUpdateIntervalMoving"      "15"
-
-    # gatewayDeterminationInterval is the interval (in seconds) on which
-    #                              determination of the best gateway is
-    #                              performed
-    #
-    # Default: 1
-    #
-    #PlParam     "gatewayDeterminationInterval"    "1"
-
-    # movingSpeedThreshold is the speed from which we consider the node is
-    #                      moving
-    #
-    # Default: 9
-    #
-    #PlParam     "movingSpeedThreshold"         "9"
-
-    # movingDistanceThreshold is the distance from the previous position from
-    #                         which we consider the node is moving
-    #
-    # Default: 50
-    #
-    #PlParam     "movingDistanceThreshold"      "50"
-
-    # dopMultiplier One of the situations that is seen as movement is when the
-    #               current position with its uncertainty circle no longer
-    #               overlaps the last transmitted position with its uncertainty
-    #               circle. This parameter is used to adjust the sizes of these
-    #               uncertainty circles: setting it to a value less than 1.0
-    #               will make both uncertainty circles smaller by this factor,
-    #               resulting in earlier movement detection. Setting it to a
-    #               value larger than 1.0 will detect movement later.
-    #
-    # Default: 2.5
-    #
-    #PlParam     "dopMultiplier"                "2.5"
-
-    # defaultHdop is the default value that is taken for HDOP (in meters) in
-    #             determining whether we are moving when there is a position
-    #             available but no HDOP.
-    #
-    # Default: 50
-    #
-    #PlParam     "defaultHdop"                  "50"
-
-    # defaultVdop is the default value that is taken for VDOP (in meters) in
-    #             determining whether we are moving when there is a position
-    #             available but no VDOP.
-    #
-    # Default: 50
-    #
-    #PlParam     "defaultVdop"                  "50"
-
-    # averageDepth is the depth of the position average list, or the number
-    #              of positions that are averaged to obtain the average
-    #              position
-    #
-    # Default: 5
-    #
-    #PlParam     "averageDepth"                 "5"
-
-    # hysteresisCountToStationary is the number of position updates that
-    #                             effectuate a state transition from moving to
-    #                             stationary that must be received before the
-    #                             actual transition is taken
-    #
-    # Default: 17
-    #
-    #PlParam     "hysteresisCountToStationary"  "17"
-
-    # hysteresisCountToMoving is the number of position updates that effectuate
-    #                         a state transition from stationary to moving that
-    #                         must be received before the actual transition is
-    #                         taken
-    #
-    # Default: 5
-    #
-    #PlParam     "hysteresisCountToMoving"      "5"
-
-    # gatewayHysteresisCountToStationary is the number of times the gateway
-    #                             must be the same that effectuate a state transition from
-    #                             moving to stationary that must be received
-    #                             before the actual transition is taken
-    #
-    # Default: 17
-    #
-    #PlParam     "gatewayHysteresisCountToStationary"  "17"
-
-    # gatewayHysteresisCountToMoving is the number of gateway updates that
-    #                         effectuate a state transition from stationary to
-    #                         moving that must be received before the actual
-    #                         transition is taken
-    #
-    # Default: 5
-    #
-    #PlParam     "gatewayHysteresisCountToMoving"      "5"
-
-
-    #
-    # Other Plugin Parameters
-    #
-
-    # useDeDup determines whether duplicate message detection is to be
-    #          performed. When 0 then no such detection is performed, when 1
-    #          then the detection is performed 
-    #
-    # Default: true
-    #
-    #PlParam     "useDeDup"                     "true"
-
-    # deDupDepth the number of messages that are tracked to detect duplucates
-    #            messages received from the OLSR network
-    #
-    # Default: 256
-    #
-    #PlParam     "deDupDepth"                   "256"
-
-    # useLoopback determines whether the message that is sent over the OLSR
-    #             network should be immediately looped back, thus pretending
-    #             that the message (that is sent by this node) is received from
-    #             the OLSR network. When 0 then no loopback is performed, when
-    #             1 then the loopback is performed
-    #
-    # Default: false
-    #
-    #PlParam     "useLoopback"                  "true"
-}
index 40610e0..b047a9c 100644 (file)
@@ -63,7 +63,7 @@ bool readBool(const char * parameterName, const char * str, bool * dst) {
        errno = 0;
        value = strtoul(str, &endPtr, 10);
 
-       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str);
                retVal = false;
@@ -109,7 +109,7 @@ bool readUC(const char * parameterName, const char * str, unsigned char * dst) {
        errno = 0;
        value = strtoul(str, &endPtr, 10);
 
-       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str);
                return false;
@@ -150,7 +150,7 @@ bool readUS(const char * parameterName, const char * str, unsigned short * dst)
        errno = 0;
        value = strtoul(str, &endPtr, 10);
 
-       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str);
                return false;
@@ -194,7 +194,7 @@ bool readULL(const char * parameterName, const char * str, unsigned long long *
        errno = 0;
        value = strtoull(str, &endPtr, base);
 
-       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                pudError(false, "Value of parameter %s (%s) could not be converted to a number (base %d)", parameterName, str, base);
                return false;
@@ -230,7 +230,7 @@ bool readULL(const char * parameterName, const char * str, unsigned long long *
        errno = 0;
        value = strtod(str, &endPtr);
 
-       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str);
                return false;
index 5e9ee89..c62614a 100644 (file)
@@ -57,37 +57,29 @@ LIBDIR_BUILD = lib
 INC_DIR_WIREFORMAT = ../wireformat/include
 INC_DIR_WIREFORMAT_FULL = $(INC_DIR_WIREFORMAT)/$(WIREFORMAT_PROJECT)
 
-ifneq ($(wildcard /usr/lib/jvm/java),)
-  INC_DIR_JVM = /usr/lib/jvm/java/include
+
+JAVAHOMEREGEX = ^[[:space:]]*java\.home[[:space:]]*=[[:space:]]*(.+)[[:space:]]*$$
+JAVAHOME = $(shell java -XshowSettings 2>&1 | grep -E '$(JAVAHOMEREGEX)' | sed -r 's/$(JAVAHOMEREGEX)/\1/')
+
+ifeq ($(JAVAHOME),)
+  $(error No java detected)
+endif
+
+INC_DIR_JVM = $(JAVAHOME)/../include
+
+ifeq ($(wildcard $(INC_DIR_JVM)),)
+  $(error No java include directory detected at $(INC_DIR_JVM))
+endif
+
+ifeq ($(OS),android)
+  INC_DIR_JVM_OS = $(INC_DIR_JVM)/linux
 else
-  ifneq ($(wildcard /usr/lib/jvm/java-1.7.0-openjdk$(ARCH)),)
-    INC_DIR_JVM = /usr/lib/jvm/java-1.7.0-openjdk$(ARCH)/include
-  else
-    ifneq ($(wildcard /usr/lib/jvm/java-1.7.0-openjdk$(ARCH2)),)
-      INC_DIR_JVM = /usr/lib/jvm/java-1.7.0-openjdk$(ARCH2)/include
-    else
-      ifneq ($(wildcard /usr/lib/jvm/java-1.7.0-openjdk),)
-        INC_DIR_JVM = /usr/lib/jvm/java-1.7.0-openjdk/include
-      else
-        ifneq ($(wildcard /usr/lib/jvm/java-1.6.0-openjdk$(ARCH)),)
-          INC_DIR_JVM = /usr/lib/jvm/java-1.6.0-openjdk$(ARCH)/include
-        else
-          ifneq ($(wildcard /usr/lib/jvm/java-1.6.0-openjdk$(ARCH2)),)
-            INC_DIR_JVM = /usr/lib/jvm/java-1.6.0-openjdk$(ARCH2)/include
-          else
-            ifneq ($(wildcard /usr/lib/jvm/java-1.6.0-openjdk),)
-              INC_DIR_JVM = /usr/lib/jvm/java-1.6.0-openjdk/include
-            else
-              $(error No java detected)
-            endif
-          endif
-        endif
-      endif
-    endif
-  endif
+  INC_DIR_JVM_OS = $(INC_DIR_JVM)/$(OS)
 endif
 
-INC_DIR_JVM_OS = $(INC_DIR_JVM)/$(OS)
+ifeq ($(wildcard $(INC_DIR_JVM_OS)),)
+  $(error No java OS include directory detected at $(INC_DIR_JVM_OS))
+endif
 
 
 SRC_DIR_C = src/main/c
index 9653f94..1297692 100644 (file)
@@ -194,11 +194,11 @@ zclient_read(ssize_t * size)
 
     /* detect zebra packet fragmentation */
     do {
-      memcpy(&length, buf + offset, sizeof length);
+      memcpy(&length, buf + offset, sizeof(length));
       length = ntohs(length);
       offset += length;
     }
-    while (*size >= (ssize_t) (offset + sizeof length));
+    while (*size >= (ssize_t) (offset + sizeof(length)));
     /* set blocking socket on fragmented packet */
     if (*size != offset)
       (void)fcntl(zebra.sock, F_SETFL, sockstatus);
index 9be038e..2ae9384 100644 (file)
@@ -41,7 +41,7 @@ USAGE
 
 LoadPlugin "olsrd_secure.so.0.6"
 {
-    PlParam     "Keyfile"   "FILENAME"
+    # PlParam     "keyfile"            "/etc/olsr-keyfile.txt"
 }
 
   replacing FILENAME with the full path of the file
index 2664516..0e3b59c 100644 (file)
@@ -61,6 +61,7 @@
 #include "parser.h"
 #include "scheduler.h"
 #include "net_olsr.h"
+#include "olsr_random.h"
 
 #ifdef USE_OPENSSL
 
@@ -535,8 +536,8 @@ send_challenge(struct interface_olsr *olsr_if, const union olsr_ip_addr *new_hos
 
   /* Set the size including OLSR packet size */
 
-  challenge = rand() << 16;
-  challenge |= rand();
+  challenge = olsr_random() << 16;
+  challenge |= olsr_random();
 
   /* initialise rrmsg */
   memset(&cmsg, 0, sizeof(cmsg));
@@ -889,8 +890,8 @@ send_cres(struct interface_olsr *olsr_if, union olsr_ip_addr *to, union olsr_ip_
 
   olsr_printf(1, "[ENC]Building CRESPONSE message\n");
 
-  challenge = rand() << 16;
-  challenge |= rand();
+  challenge = olsr_random() << 16;
+  challenge |= olsr_random();
 
   entry->challenge = challenge;
 
index 32a0fc6..363aa67 100644 (file)
@@ -39,7 +39,7 @@ static bool readULL(const char * valueName, const char * value, unsigned long lo
        errno = 0;
        valueNew = strtoull(value, &endPtr, 10);
 
-       if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                sgwDynSpeedError(true, "Configured %s (%s) could not be converted to a number", valueName, value);
                return false;
index 28f6a2a..b780e36 100644 (file)
@@ -8,6 +8,8 @@
 #include "olsr.h"
 #include "olsr_cookie.h"
 #include "scheduler.h"
+#include "log.h"
+#include "gateway.h"
 
 /* System includes */
 
@@ -78,6 +80,11 @@ static struct timer_entry * smartgw_speed_file_timer = NULL;
  */bool initSgwDynSpeed(void) {
        char * speedFile;
 
+       if (multi_gateway_mode()) {
+         olsr_syslog(OLSR_LOG_ERR, "sgwDynSpeed plugin can't be enabled in multi-smart-gateway mode");
+         return false;
+       }
+
        if (!startSpeedFile()) {
                return false;
        }
index ef9a8df..0937da2 100644 (file)
@@ -76,7 +76,7 @@ static bool readUL(const char * valueName, const char * value, unsigned long * v
        errno = 0;
        valueNew = strtoul(value, &endPtr, 10);
 
-       if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                sgwDynSpeedError(false, "Value of parameter %s (%s) could not be converted to a number", valueName, value);
                return false;
@@ -264,10 +264,10 @@ void readSpeedFile(char * fileName) {
        fp = NULL;
 
        if (uplinkSet) {
-               olsr_cnf->smart_gw_uplink = uplink;
+         smartgw_set_uplink(olsr_cnf, uplink);
        }
        if (downlinkSet) {
-               olsr_cnf->smart_gw_downlink = downlink;
+         smartgw_set_downlink(olsr_cnf, downlink);
        }
        if (uplinkSet || downlinkSet) {
          refresh_smartgw_netmask();
index c08c140..219ed5a 100644 (file)
@@ -55,20 +55,22 @@ futher parameters.  Here's an example configuration for UNIX systems
 
 LoadPlugin "olsrd_txtinfo.so.0.1"
 {
-    # the default port is 2006 but you can change it like this:
-    #PlParam     "port"   "8080"
-
-    # You can set a "accept" single address to allow to connect to
-    # txtinfo. If no address is specified, then localhost (127.0.0.1)
-    # is allowed by default.  txtinfo will only use the first "accept"
-    # parameter specified and will ignore the rest.
-
-    # Set this parameter to activate the IPV6_V6ONLY flag for the plugin
-    # to prevent it from receiving IPv4 messages
-    #PlParam     "ipv6only"   "false"
-
-    # to allow a specific host:
-    #PlParam      "accept" "172.29.44.23"
-    # if you set it to 0.0.0.0, it will accept all connections
-    #PlParam      "accept" "0.0.0.0"
-}
+    # The port number on which the plugin will be listening
+    # PlParam     "port"               "2006"
+
+    # You can set an "accept" IP address that is allowed to connect to
+    # the plugin. If no address is specified, then localhost (127.0.0.1)
+    # is allowed by default.  Only the last parameter specified will be used,
+    # others will be ignored.
+    # Use 0.0.0.0 to accept all connections
+    # PlParam     "accept"             "127.0.0.1"
+
+    # You can set a "listen" IP address that is used to determine the interface
+    # on which the plugin will be listening. If no address is specified, then
+    # the plugin will listen on all interfaes. Only the last parameter specified
+    # will be used, others will be ignored.
+    # PlParam     "listen"             "0.0.0.0"
+
+    # Set to true to only listen on IPv6 addresses when running in IPv6 mode.
+    # PlParam     "ipv6only"           "false"
+}
\ No newline at end of file
index 615fd81..ddb706e 100644 (file)
@@ -198,14 +198,14 @@ plugin_ipc_init(void)
       return 0;
     }
 #endif /* (defined __FreeBSD__ || defined __FreeBSD_kernel__) && defined SO_NOSIGPIPE */
-#if defined linux
+#if defined linux && defined IPV6_V6ONLY
     if (txtinfo_ipv6_only && olsr_cnf->ip_version == AF_INET6) {
       if (setsockopt(ipc_socket, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&yes, sizeof(yes)) < 0) {
         perror("IPV6_V6ONLY failed");
         return 0;
       }
     }
-#endif /* defined linux */
+#endif /* defined linux && defined IPV6_V6ONLY */
     /* Bind the socket */
 
     /* complete the socket structure */
@@ -522,6 +522,14 @@ ipc_print_hna(struct autobuf *abuf)
 
 
 #ifdef __linux__
+
+/** interface names for smart gateway tunnel interfaces, IPv4 */
+extern struct interfaceName * sgwTunnel4InterfaceNames;
+
+/** interface names for smart gateway tunnel interfaces, IPv6 */
+extern struct interfaceName * sgwTunnel6InterfaceNames;
+
+
 /**
  * Construct the sgw table for a given ip version
  *
@@ -530,61 +538,66 @@ ipc_print_hna(struct autobuf *abuf)
  * @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;
-
-  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;
-    olsr_linkcost pc = 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 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, "# Table: Smart Gateway IPv%s\n", ipv6 ? "6" : "4");
-    abuf_appendf(abuf, fmth, "#", "Originator", "Prefix", "Uplink", "Downlink", "PathCost", "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) {
-          struct tc_entry* tc = olsr_lookup_tc_entry(&gw->gw->originator);
-
-          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));
-          prefix[sizeof(prefix) - 1] = '\0';
-          uplink = gw->gw->uplink;
-          downlink = gw->gw->downlink;
-          pc = tc ?tc->path_cost : ROUTE_COST_BROKEN;
-          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 int)gw->gw->path_cost;
-        }
-        abuf_appendf(abuf, fmtv, current, originator, prefix, uplink, downlink, pc, sipv4, sipv4nat, sipv6, if_name, destination, cost);
-      }
-    } OLSR_FOR_ALL_GWS_END(gw);
+  struct gateway_entry * current_gw = olsr_get_inet_gateway(ipv6);
+  struct interfaceName * sgwTunnelInterfaceNames = !ipv6 ? sgwTunnel4InterfaceNames : sgwTunnel6InterfaceNames;
+  int i = 0;
+
+  abuf_appendf(abuf, "# Table: Smart Gateway IPv%s\n", ipv6 ? "6" : "4");
+  abuf_appendf(abuf, fmth, "#", "Originator", "Prefix", "Uplink", "Downlink", "PathCost", "IPv4", "IPv4-NAT", "IPv6", "Tunnel-Name", "Destination", "Cost");
+
+  for (i = 0; i < olsr_cnf->smart_gw_use_count; i++) {
+    bool selected;
+    struct ipaddr_str originatorStr;
+    const char * originator;
+    struct ipaddr_str prefixIpStr;
+    const char * prefixIPStr;
+    union olsr_ip_addr netmask = { { 0 } };
+    struct ipaddr_str prefixMaskStr;
+    const char * prefixMASKStr;
+    struct interfaceName * node = &sgwTunnelInterfaceNames[i];
+    struct ipaddr_str tunnelGwStr;
+    const char * tunnelGw;
+
+    struct gateway_entry * gw = node->gw;
+    struct tc_entry* tc;
+
+    if (!gw) {
+      continue;
+    }
+
+    tc = olsr_lookup_tc_entry(&gw->originator);
+    if (!tc) {
+      continue;
+    }
+
+    selected = current_gw && (current_gw == gw);
+    originator = olsr_ip_to_string(&originatorStr, &gw->originator);
+    prefixIPStr = olsr_ip_to_string(&prefixIpStr, &gw->external_prefix.prefix);
+
+    prefix_to_netmask((uint8_t *) &netmask, !ipv6 ? sizeof(netmask.v4) : sizeof(netmask.v6), gw->external_prefix.prefix_len);
+    prefixMASKStr = olsr_ip_to_string(&prefixMaskStr, &netmask);
+
+    tunnelGw = olsr_ip_to_string(&tunnelGwStr, &gw->originator);
+
+    {
+      char prefix[strlen(prefixIPStr) + 1 + strlen(prefixMASKStr) + 1];
+      snprintf(prefix, sizeof(prefix), "%s/%s", prefixIPStr, prefixMASKStr);
+
+      abuf_appendf(abuf, fmtv, //
+          selected ? "*" : " ", // selected
+          originator, // Originator
+          prefix, // Prefix IP / Prefix Mask
+          gw->uplink, // Uplink
+          gw->downlink, // Downlink
+          tc->path_cost, // PathCost
+          gw->ipv4 ? "Y" : "N", // IPv4
+          gw->ipv4nat ? "Y" : "N", // IPv4-NAT
+          gw->ipv6 ? "Y" : "N", // IPv6
+          node->name, // Tunnel-Name
+          tunnelGw, // Destination
+          gw->path_cost // Cost
+          );
+    }
   }
 }
 #endif /* __linux__ */
@@ -596,15 +609,19 @@ ipc_print_sgw(struct autobuf *abuf)
   abuf_puts(abuf, "Gateway mode is only supported in linux\n");
 #else
 
-  static const char * fmth4 = "%s%-16s %-33s %-8s %-8s %-8s %-4s %-8s %-4s %-16s %-16s %s\n";
-  static const char * fmtv4 = "%s%-16s %-33s %-8u %-8u %-8u %-4s %-8s %-4s %-16s %-16s %lld\n";
-  static const char * fmth6 = "%s%-46s %-93s %-8s %-8s %-8s %-4s %-8s %-4s %-16s %-46s %s\n";
-  static const char * fmtv6 = "%s%-46s %-93s %-8u %-8u %-8u %-4s %-8s %-4s %-16s %-46s %lld\n";
+  static const char * fmth4 = "%s%-15s %-31s %-9s %-9s %-10s %-4s %-8s %-4s %-15s %-15s %s\n";
+  static const char * fmtv4 = "%s%-15s %-31s %-9u %-9u %-10u %-4s %-8s %-4s %-15s %-15s %lld\n";
+#if 0
+  static const char * fmth6 = "%s%-45s %-91s %-9s %-9s %-10s %-4s %-8s %-4s %-15s %-45s %s\n";
+  static const char * fmtv6 = "%s%-45s %-91s %-9u %-9u %-10u %-4s %-8s %-4s %-15s %-45s %lld\n";
+#endif
 
   sgw_ipvx(abuf, false, fmth4, fmtv4);
   abuf_puts(abuf, "\n");
+#if 0
   sgw_ipvx(abuf, true, fmth6, fmtv6);
   abuf_puts(abuf, "\n");
+#endif
 #endif /* __linux__ */
 }
 
index 0cd5065..6bc1a6a 100644 (file)
@@ -6,7 +6,7 @@
 #    (e.g. into to /opt, otherwise call 'make NDK_BASE=')
 #
 # 2) Compile olsrd with the make command:
-#    make OS=android DEBUG=0 NDK_BASE=/opt/android-ndk-r8
+#    make OS=android DEBUG=0 NDK_BASE=/opt/android-ndk-r10
 #
 # 3) Install olsrd on your local PC, e.g.
 #    sudo make OS=android DEBUG=0 install_all
@@ -103,9 +103,9 @@ NDK_ABI=arm
 NDK_ABIDIR=linux-androideabi
 NDK_SYSROOT=$(NDK_BASE)/platforms/android-$(NDK_PLATFORM_LEVEL)/arch-$(NDK_ABI)
 NDK_UNAME=$(shell uname -s | tr '[A-Z]' '[a-z]')
-# if you are using NDK older than r8, you must use 4.4.3:
+# if you are using NDK older than r10, you must use 4.4.3:
 #NDK_COMPILER_VERSION=4.4.3
-NDK_COMPILER_VERSION=4.6
+NDK_COMPILER_VERSION=4.8
 NDK_TOOLCHAIN=$(NDK_BASE)/toolchains/$(NDK_ABI)-$(NDK_ABIDIR)-$(NDK_COMPILER_VERSION)/prebuilt/$(NDK_UNAME)-$(NDK_ARCH)
 CROSS_COMPILE = $(NDK_TOOLCHAIN)/bin/$(NDK_ABI)-$(NDK_ABIDIR)-
 
index a0726d2..2953f37 100644 (file)
@@ -594,7 +594,7 @@ olsr_sendto(int s, const void *buf, size_t len, int flags __attribute__ ((unused
 
   /* initialize IP ID field if necessary */
   if (ip_id == 0) {
-    ip_id = (u_int16_t) (arc4random() & 0xffff);
+    ip_id = (u_int16_t) (olsr_random() & 0xffff);
   }
 
   udp_tag = libnet_build_udp(olsr_cnf->olsrport,        /* src port */
index 9a8ab23..281148b 100644 (file)
@@ -80,7 +80,7 @@ static bool serialize_tc4(struct tc_message *, struct interface_olsr *);
 
 static bool serialize_mid4(struct interface_olsr *);
 
-static bool serialize_hna4(struct interface_olsr *);
+static bool serialize_hna4(struct ip_prefix_list *h, struct interface_olsr *, bool is_zero_bw);
 
 /* IPv6 */
 
@@ -90,7 +90,7 @@ static bool serialize_tc6(struct tc_message *, struct interface_olsr *);
 
 static bool serialize_mid6(struct interface_olsr *);
 
-static bool serialize_hna6(struct interface_olsr *);
+static bool serialize_hna6(struct ip_prefix_list *h, struct interface_olsr *, bool is_zero_bw);
 
 /**
  * Set the timer that controls the generation of
@@ -215,10 +215,10 @@ queue_hna(struct interface_olsr * ifp)
 
   switch (olsr_cnf->ip_version) {
   case (AF_INET6):
-    return serialize_hna6(ifp);
+    return serialize_hna6(olsr_cnf->hna_entries, ifp, false);
   case (AF_INET):
   default:
-    return serialize_hna4(ifp);
+    return serialize_hna4(olsr_cnf->hna_entries, ifp, false);
   }
   return false;
 }
@@ -971,6 +971,62 @@ serialize_mid6(struct interface_olsr *ifp)
   return true;
 }
 
+static void appendHNAEntry(struct interface_olsr *ifp, struct ip_prefix_list *h, uint16_t * remainsize, uint16_t * curr_size,
+    union olsr_message *m, struct hnapair **pair, bool zero
+#ifndef __linux__
+__attribute__((unused))
+#endif
+  , bool * sgw_set
+#ifndef __linux__
+__attribute__((unused))
+#endif
+  ) {
+  union olsr_ip_addr ip_addr;
+#ifdef __linux__
+  bool is_def_route = is_prefix_inetgw(&h->net);
+#endif
+
+#ifdef __linux__
+  if (!zero && olsr_cnf->smart_gw_active && is_def_route && smartgw_is_zero_bandwidth(olsr_cnf)) {
+    /* this is the default route, with zero bandwidth, do not append it */
+    return;
+  }
+#endif /* __linux__ */
+
+  if ((*curr_size + (2 * olsr_cnf->ipsize)) > *remainsize) {
+    /* Only add HNA message if it contains data */
+    if (*curr_size > OLSR_HNA_IPV4_HDRSIZE) {
+#ifdef DEBUG
+      OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", *curr_size, *remainsize);
+#endif /* DEBUG */
+      m->v4.olsr_msgsize = htons(*curr_size);
+      m->v4.seqno = htons(get_msg_seqno());
+      net_outbuffer_push(ifp, msg_buffer, *curr_size);
+      *curr_size = OLSR_HNA_IPV4_HDRSIZE;
+      *pair = m->v4.message.hna.hna_net;
+    }
+    net_output(ifp);
+    *remainsize = net_outbuffer_bytes_left(ifp);
+    check_buffspace(*curr_size + (2 * olsr_cnf->ipsize), *remainsize, "HNA2");
+  }
+#ifdef DEBUG
+  OLSR_PRINTF(BMSG_DBGLVL, "\tNet: %s\n", olsr_ip_prefix_to_string(&h->net));
+#endif /* DEBUG */
+
+  olsr_prefix_to_netmask(&ip_addr, h->net.prefix_len);
+#ifdef __linux__
+  if (olsr_cnf->smart_gw_active && is_def_route) {
+    /* this is the default route, overwrite it with the smart gateway */
+    olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len, zero);
+    *sgw_set = true;
+  }
+#endif /* __linux__ */
+  (*pair)->addr = h->net.prefix.v4.s_addr;
+  (*pair)->netmask = ip_addr.v4.s_addr;
+  *pair = &(*pair)[1];
+  *curr_size += (2 * olsr_cnf->ipsize);
+}
+
 /**
  *IP version 4
  *
@@ -978,23 +1034,24 @@ serialize_mid6(struct interface_olsr *ifp)
  *@return nada
  */
 static bool
-serialize_hna4(struct interface_olsr *ifp)
+serialize_hna4(struct ip_prefix_list *h, struct interface_olsr *ifp, bool is_zero_bw)
 {
   uint16_t remainsize, curr_size, needsize;
   /* preserve existing data in output buffer */
   union olsr_message *m;
   struct hnapair *pair;
-  struct ip_prefix_list *h;
+  bool h_empty = !h;
+  bool sgw_set = false;
 
-  /* No hna nets */
   if (ifp == NULL) {
     return false;
   }
+
   if (olsr_cnf->ip_version != AF_INET) {
     return false;
   }
-  h = olsr_cnf->hna_entries;
-  if (h == NULL) {
+
+  if (h_empty && !ifp->sgw_sgw_zero_bw_timeout) {
     return false;
   }
 
@@ -1002,77 +1059,136 @@ serialize_hna4(struct interface_olsr *ifp)
 
   curr_size = OLSR_HNA_IPV4_HDRSIZE;
 
-  /* calculate size needed for HNA */
   needsize = curr_size;
-  while (h) {
-    needsize += olsr_cnf->ipsize*2;
-    h = h->next;
-  }
 
-  h = olsr_cnf->hna_entries;
+  if (!h_empty) {
+    /* calculate size needed for HNA */
+    struct ip_prefix_list *h_tmp = h;
+    while (h_tmp) {
+      needsize += olsr_cnf->ipsize*2;
+      h_tmp = h_tmp->next;
+    }
 
-  /* Send pending packet if not room in buffer */
-  if (needsize > remainsize) {
-    net_output(ifp);
-    remainsize = net_outbuffer_bytes_left(ifp);
-  }
-  check_buffspace(curr_size, remainsize, "HNA");
+    /* Send pending packet if not room in buffer */
+    if (needsize > remainsize) {
+      net_output(ifp);
+      remainsize = net_outbuffer_bytes_left(ifp);
+    }
+    check_buffspace(curr_size, remainsize, "HNA");
 
-  m = (union olsr_message *)msg_buffer;
+    m = (union olsr_message *)msg_buffer;
 
-  /* Fill header */
-  m->v4.originator = olsr_cnf->main_addr.v4.s_addr;
-  m->v4.hopcnt = 0;
-  m->v4.ttl = MAX_TTL;
-  m->v4.olsr_msgtype = HNA_MESSAGE;
-  m->v4.olsr_vtime = ifp->valtimes.hna;
+    /* Fill header */
+    m->v4.olsr_msgtype = HNA_MESSAGE;
+    m->v4.olsr_vtime = is_zero_bw ? reltime_to_me(ifp->sgw_sgw_zero_bw_timeout) : ifp->valtimes.hna;
+    // olsr_msgsize
+    m->v4.originator = olsr_cnf->main_addr.v4.s_addr;
+    m->v4.ttl = MAX_TTL;
+    m->v4.hopcnt = 0;
+    // seqno
 
-  pair = m->v4.message.hna.hna_net;
+    pair = m->v4.message.hna.hna_net;
 
-  for (; h != NULL; h = h->next) {
-    union olsr_ip_addr ip_addr;
-    if ((curr_size + (2 * olsr_cnf->ipsize)) > remainsize) {
-      /* Only add HNA message if it contains data */
-      if (curr_size > OLSR_HNA_IPV4_HDRSIZE) {
-#ifdef DEBUG
-        OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", curr_size, remainsize);
-#endif /* DEBUG */
-        m->v4.seqno = htons(get_msg_seqno());
-        m->v4.olsr_msgsize = htons(curr_size);
-        net_outbuffer_push(ifp, msg_buffer, curr_size);
-        curr_size = OLSR_HNA_IPV4_HDRSIZE;
-        pair = m->v4.message.hna.hna_net;
-      }
-      net_output(ifp);
-      remainsize = net_outbuffer_bytes_left(ifp);
-      check_buffspace(curr_size + (2 * olsr_cnf->ipsize), remainsize, "HNA2");
+    for (; h != NULL; h = h->next) {
+      appendHNAEntry(ifp, h, &remainsize, &curr_size, m, &pair, is_zero_bw, &sgw_set);
     }
-#ifdef DEBUG
-    OLSR_PRINTF(BMSG_DBGLVL, "\tNet: %s\n", olsr_ip_prefix_to_string(&h->net));
-#endif /* DEBUG */
 
-    olsr_prefix_to_netmask(&ip_addr, h->net.prefix_len);
+    m->v4.olsr_msgsize = htons(curr_size);
+    m->v4.seqno = htons(get_msg_seqno());
+
+    net_outbuffer_push(ifp, msg_buffer, curr_size);
+
 #ifdef __linux__
-    if (olsr_cnf->smart_gw_active && is_prefix_inetgw(&h->net)) {
-      /* this is the default route, overwrite it with the smart gateway */
-      olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len);
+    if (sgw_set && !is_zero_bw) {
+      /* (re)set zero bandwidth sgw HNAs timeout */
+      ifp->sgw_sgw_zero_bw_timeout = ifp->valtimes.hna_reltime;
     }
-#endif /* __linux__ */
-    pair->addr = h->net.prefix.v4.s_addr;
-    pair->netmask = ip_addr.v4.s_addr;
-    pair++;
-    curr_size += (2 * olsr_cnf->ipsize);
+#endif
   }
 
-  m->v4.seqno = htons(get_msg_seqno());
-  m->v4.olsr_msgsize = htons(curr_size);
-
-  net_outbuffer_push(ifp, msg_buffer, curr_size);
+#ifdef __linux__
+  if (olsr_cnf->smart_gw_active /* sgw is active */
+      && (h_empty || !sgw_set) /* there are no HNAs at all or no sgw HNA */
+      && ifp->sgw_sgw_zero_bw_timeout /* the zero bandwidth sgw HNA window is still valid */
+      && !is_zero_bw /* prevent infinite recursion */
+      ) {
+    struct ip_prefix_list h_zero;
+
+    memset(&h_zero, 0, sizeof(h_zero));
+    serialize_hna4(&h_zero, ifp, true);
+
+    /* decrement the window validity time */
+    {
+      unsigned int hna_period = ifp->hna_gen_timer->timer_period;
+      if (ifp->sgw_sgw_zero_bw_timeout <= hna_period) {
+        ifp->sgw_sgw_zero_bw_timeout = 0;
+      } else {
+        ifp->sgw_sgw_zero_bw_timeout -= hna_period;
+      }
+    }
+  }
+#endif /* __linux__ */
 
   //printf("Sending HNA (%d bytes)...\n", outputsize);
   return false;
 }
 
+static void appendHNA6Entry(struct interface_olsr *ifp, struct ip_prefix_list *h, uint16_t * remainsize, uint16_t * curr_size,
+    union olsr_message *m, struct hnapair6 **pair, bool zero
+#ifndef __linux__
+__attribute__((unused))
+#endif
+  , bool * sgw_set
+#ifndef __linux__
+__attribute__((unused))
+#endif
+  ) {
+  union olsr_ip_addr ip_addr;
+#ifdef __linux__
+  bool is_def_route = is_prefix_inetgw(&h->net);
+#endif
+
+#ifdef __linux__
+  if (!zero && olsr_cnf->smart_gw_active && is_def_route && smartgw_is_zero_bandwidth(olsr_cnf)) {
+    /* this is the default route, with zero bandwidth, do not append it */
+    return;
+  }
+#endif /* __linux__ */
+
+  if ((*curr_size + (2 * olsr_cnf->ipsize)) > *remainsize) {
+    /* Only add HNA message if it contains data */
+    if (*curr_size > OLSR_HNA_IPV6_HDRSIZE) {
+#ifdef DEBUG
+      OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", *curr_size, *remainsize);
+#endif /* DEBUG */
+      m->v6.olsr_msgsize = htons(*curr_size);
+      m->v6.seqno = htons(get_msg_seqno());
+      net_outbuffer_push(ifp, msg_buffer, *curr_size);
+      *curr_size = OLSR_HNA_IPV6_HDRSIZE;
+      *pair = m->v6.message.hna.hna_net;
+    }
+    net_output(ifp);
+    *remainsize = net_outbuffer_bytes_left(ifp);
+    check_buffspace(*curr_size + (2 * olsr_cnf->ipsize), *remainsize, "HNA2");
+  }
+#ifdef DEBUG
+  OLSR_PRINTF(BMSG_DBGLVL, "\tNet: %s\n", olsr_ip_prefix_to_string(&h->net));
+#endif /* DEBUG */
+
+  olsr_prefix_to_netmask(&ip_addr, h->net.prefix_len);
+#ifdef __linux__
+  if (olsr_cnf->smart_gw_active && is_def_route) {
+    /* this is the default route, overwrite it with the smart gateway */
+    olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len, zero);
+    *sgw_set = true;
+  }
+#endif /* __linux__ */
+  (*pair)->addr = h->net.prefix.v6;
+  (*pair)->netmask = ip_addr.v6;
+  *pair = &(*pair)[1];
+  *curr_size += (2 * olsr_cnf->ipsize);
+}
+
 /**
  *IP version 6
  *
@@ -1080,90 +1196,103 @@ serialize_hna4(struct interface_olsr *ifp)
  *@return nada
  */
 static bool
-serialize_hna6(struct interface_olsr *ifp)
+serialize_hna6(struct ip_prefix_list *h, struct interface_olsr *ifp, bool is_zero_bw)
 {
   uint16_t remainsize, curr_size, needsize;
   /* preserve existing data in output buffer */
   union olsr_message *m;
-  struct hnapair6 *pair6;
-  union olsr_ip_addr tmp_netmask;
-  struct ip_prefix_list *h = olsr_cnf->hna_entries;
+  struct hnapair6 *pair;
+  bool h_empty = !h;
+  bool sgw_set = false;
 
-  /* No hna nets */
-  if ((olsr_cnf->ip_version != AF_INET6) || (!ifp) || h == NULL)
+  if (ifp == NULL) {
     return false;
+  }
+
+  if (olsr_cnf->ip_version != AF_INET6) {
+    return false;
+  }
+
+  if (h_empty && !ifp->sgw_sgw_zero_bw_timeout) {
+    return false;
+  }
 
   remainsize = net_outbuffer_bytes_left(ifp);
 
   curr_size = OLSR_HNA_IPV6_HDRSIZE;
 
-  /* calculate size needed for HNA */
   needsize = curr_size;
-  while (h) {
-    needsize += olsr_cnf->ipsize*2;
-    h = h->next;
-  }
 
-  h = olsr_cnf->hna_entries;
+  if (!h_empty) {
+    /* calculate size needed for HNA */
+    struct ip_prefix_list *h_tmp = h;
+    while (h_tmp) {
+      needsize += olsr_cnf->ipsize*2;
+      h_tmp = h_tmp->next;
+    }
 
-  /* Send pending packet if not room in buffer */
-  if (needsize > remainsize) {
-    net_output(ifp);
-    remainsize = net_outbuffer_bytes_left(ifp);
-  }
-  check_buffspace(curr_size, remainsize, "HNA");
+    /* Send pending packet if not room in buffer */
+    if (needsize > remainsize) {
+      net_output(ifp);
+      remainsize = net_outbuffer_bytes_left(ifp);
+    }
+    check_buffspace(curr_size, remainsize, "HNA");
 
-  m = (union olsr_message *)msg_buffer;
+    m = (union olsr_message *)msg_buffer;
 
-  /* Fill header */
-  m->v6.originator = olsr_cnf->main_addr.v6;
-  m->v6.hopcnt = 0;
-  m->v6.ttl = MAX_TTL;
-  m->v6.olsr_msgtype = HNA_MESSAGE;
-  m->v6.olsr_vtime = ifp->valtimes.hna;
+    /* Fill header */
+    m->v6.olsr_msgtype = HNA_MESSAGE;
+    m->v6.olsr_vtime = is_zero_bw ? reltime_to_me(ifp->sgw_sgw_zero_bw_timeout) : ifp->valtimes.hna;
+    // olsr_msgsize
+    m->v6.originator = olsr_cnf->main_addr.v6;
+    m->v6.ttl = MAX_TTL;
+    m->v6.hopcnt = 0;
+    // seqno
 
-  pair6 = m->v6.message.hna.hna_net;
+    pair = m->v6.message.hna.hna_net;
 
-  while (h) {
-    if ((curr_size + (2 * olsr_cnf->ipsize)) > remainsize) {
-      /* Only add HNA message if it contains data */
-      if (curr_size > OLSR_HNA_IPV6_HDRSIZE) {
-#ifdef DEBUG
-        OLSR_PRINTF(BMSG_DBGLVL, "Sending partial(size: %d, buff left:%d)\n", curr_size, remainsize);
-#endif /* DEBUG */
-        m->v6.seqno = htons(get_msg_seqno());
-        m->v6.olsr_msgsize = htons(curr_size);
-        net_outbuffer_push(ifp, msg_buffer, curr_size);
-        curr_size = OLSR_HNA_IPV6_HDRSIZE;
-        pair6 = m->v6.message.hna.hna_net;
-      }
-      net_output(ifp);
-      remainsize = net_outbuffer_bytes_left(ifp);
-      check_buffspace(curr_size + (2 * olsr_cnf->ipsize), remainsize, "HNA2");
+    for (; h != NULL; h = h->next) {
+      appendHNA6Entry(ifp, h, &remainsize, &curr_size, m, &pair, is_zero_bw, &sgw_set);
     }
-#ifdef DEBUG
-    OLSR_PRINTF(BMSG_DBGLVL, "\tNet: %s\n", olsr_ip_prefix_to_string(&h->net));
-#endif /* DEBUG */
-    olsr_prefix_to_netmask(&tmp_netmask, h->net.prefix_len);
+
+    m->v6.olsr_msgsize = htons(curr_size);
+    m->v6.seqno = htons(get_msg_seqno());
+
+    net_outbuffer_push(ifp, msg_buffer, curr_size);
+
 #ifdef __linux__
-    if (olsr_cnf->smart_gw_active && is_prefix_inetgw(&h->net)) {
-      /* this is the default gateway, so overwrite it with the smart one */
-      olsr_modifiy_inetgw_netmask(&tmp_netmask, h->net.prefix_len);
+    if (sgw_set && !is_zero_bw) {
+      /* (re)set zero bandwidth sgw HNAs timeout */
+      ifp->sgw_sgw_zero_bw_timeout = ifp->valtimes.hna_reltime;
     }
-#endif /* __linux__ */
-    pair6->addr = h->net.prefix.v6;
-    pair6->netmask = tmp_netmask.v6;
-    pair6++;
-    curr_size += (2 * olsr_cnf->ipsize);
-    h = h->next;
+#endif
   }
 
-  m->v6.olsr_msgsize = htons(curr_size);
-  m->v6.seqno = htons(get_msg_seqno());
+#ifdef __linux__
+  if (olsr_cnf->smart_gw_active /* sgw is active */
+      && (h_empty || !sgw_set) /* there are no HNAs at all or no sgw HNA */
+      && ifp->sgw_sgw_zero_bw_timeout /* the zero bandwidth sgw HNA window is still valid */
+      && !is_zero_bw /* prevent infinite recursion */
+      ) {
+    struct ip_prefix_list h_zero;
+
+    memset(&h_zero, 0, sizeof(h_zero));
+    serialize_hna6(&h_zero, ifp, true);
+
+    /* decrement the window validity time */
+    {
+      unsigned int hna_period = ifp->hna_gen_timer->timer_period;
+      if (ifp->sgw_sgw_zero_bw_timeout <= hna_period) {
+        ifp->sgw_sgw_zero_bw_timeout = 0;
+      } else {
+        ifp->sgw_sgw_zero_bw_timeout -= hna_period;
+      }
+    }
+  }
+#endif /* __linux__ */
 
-  net_outbuffer_push(ifp, msg_buffer, curr_size);
+  //printf("Sending HNA (%d bytes)...\n", outputsize);
   return false;
-
 }
 
 /*
index bb2b007..3cf85b4 100644 (file)
@@ -43,6 +43,7 @@
 #include "../ipcalc.h"
 #include "../net_olsr.h"
 #include "../common/autobuf.h"
+#include "../egressTypes.h"
 
 #include <stdarg.h>
 #include <stdio.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
+#ifdef __linux__
+#include <linux/rtnetlink.h>
+#else
+#define RTPROT_BOOT 3
+#endif
+
 int olsrd_write_cnf(struct olsrd_config *cnf, const char *fname) {
   FILE *fd;
   struct autobuf abuf;
@@ -102,7 +109,36 @@ if_appendf(struct autobuf *autobuf, bool comments, const char *fmt, ...)
   return rv;
 }
 
-static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options *cnfi, bool comments) {
+static void olsrd_write_hna_autobuf(int ip_version, struct ip_prefix_list *hna, struct autobuf *out, struct olsrd_config *cnf) {
+  struct ip_prefix_list *hna1 = (cnf->ip_version == ip_version) ? hna : NULL;
+
+  abuf_appendf(out, "Hna%u\n"
+    "{\n",
+    ip_version == AF_INET ? 4 : 6);
+
+  if (!hna1) {
+    if (ip_version == AF_INET)
+      abuf_puts(out,
+          "# Internet gateway\n"
+          "# 0.0.0.0   0.0.0.0\n"
+          "# specific small networks reachable through this node\n"
+          "# 15.15.0.0 255.255.255.0\n");
+    else
+      abuf_puts(out,
+          "# Internet gateway\n"
+          "#   0::                     0\n"
+          "# specific small networks reachable through this node\n"
+          "#   fec0:2200:106:0:0:0:0:0 48\n");
+  } else
+    while (hna1) {
+      struct ipaddr_str strbuf;
+      abuf_appendf(out, "    %s\n", olsr_ip_prefix_to_string(&hna1->net));
+      hna1 = hna1->next;
+    }
+  abuf_appendf(out, "}\n");
+}
+
+static void olsrd_write_if_autobuf(struct autobuf *out, struct olsrd_config *cnf, struct if_config_options *cnfi, bool comments) {
   struct ipaddr_str ipbuf;
   struct olsr_lq_mult *mult;
 
@@ -112,12 +148,12 @@ static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options
     "    # packet forwarding on switched ethernet interfaces\n"
     "    # valid Modes are \"mesh\" and \"ether\"\n"
     "    # (default is \"%s\")\n"
-    "    \n", OLSR_IF_MODE[DEF_IF_MODE]);
+    "\n", OLSR_IF_MODE[DEF_IF_MODE]);
   if_appendf(out, comments, "    %sMode \"%s\"\n",
       cnfi->mode == DEF_IF_MODE ? "# " : "",
       OLSR_IF_MODE[cnfi->mode]);
   if (comments) abuf_puts(out,
-    "    \n"
+    "\n"
     "    # IPv4 broadcast address for outgoing OLSR packets.\n"
     "    # One useful example would be 255.255.255.255\n"
     "    # The second useful value would be to\n"
@@ -125,43 +161,48 @@ static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options
     "    # another name of this parameter is \"IPv4Multicast\"\n"
     "    # (default is 0.0.0.0, which triggers the usage of the\n"
     "    # interface broadcast IP)\n"
-    "    \n");
+    "\n");
   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_appendf(out,
-    "    \n"
+    "\n"
     "    # IPv6 multicast address\n"
     "    # (default is %s, the manet-router linklocal multicast)\n"
-    "    \n", inet_ntop(AF_INET6, &ipv6_def_multicast, ipbuf.buf, sizeof(ipbuf)));
+    "\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)));
   if (comments) abuf_puts(out,
-    "    \n"
+    "\n"
     "    # IPv4 src address for outgoing OLSR packages\n"
     "    # (default is 0.0.0.0, which triggers usage of the interface IP)\n"
-    "    \n");
+    "\n");
   if_appendf(out, comments, "    %sIPv4Src %s\n",
       cnfi->ipv4_src.v4.s_addr == 0 ? "# " : "",
       inet_ntop(AF_INET, &cnfi->ipv4_src, ipbuf.buf, sizeof(ipbuf)));
   if (comments) abuf_puts(out,
-    "    \n"
+    "\n"
     "    # IPv6 src prefix. OLSRd will choose one of the interface IPs\n"
     "    # which matches the prefix of this parameter.\n"
     "    # (default is 0::/0, which triggers the usage\n"
     "    # of a not-linklocal interface IP)\n"
-    "    \n");
-  if_appendf(out, comments, "    %sIPv6Src %s\n",
+    "\n");
+  {
+    int saved = cnf->ip_version;
+    cnf->ip_version = AF_INET6;
+    if_appendf(out, comments, "    %sIPv6Src %s\n",
       cnfi->ipv6_src.prefix_len == 0 ? "# " : "",
-      inet_ntop(AF_INET6, &cnfi->ipv6_src, ipbuf.buf, sizeof(ipbuf)));
+          olsr_ip_prefix_to_string(&cnfi->ipv6_src));
+    cnf->ip_version = saved;
+  }
   if (comments) abuf_appendf(out,
-    "    \n"
+    "\n"
     "    # Emission intervals in seconds.\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",
+    "\n",
     (double)HELLO_INTERVAL, (double)NEIGHB_HOLD_TIME,
     (double)TC_INTERVAL,    (double)TOP_HOLD_TIME,
     (double)MID_INTERVAL,   (double)MID_HOLD_TIME,
@@ -192,7 +233,7 @@ static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options
       cnfi->hna_params.validity_time == HNA_HOLD_TIME ? "# " : "",
       (double)cnfi->hna_params.validity_time);
   if (comments) abuf_puts(out,
-    "    \n"
+    "\n"
     "    # When multiple links exist between hosts\n"
     "    # the weight of interface is used to determine\n"
     "    # the link to use. Normally the weight is\n"
@@ -208,7 +249,7 @@ static void olsrd_write_if_autobuf(struct autobuf *out, struct if_config_options
       !cnfi->weight.fixed ? "# " : "",
       cnfi->weight.value);
   if (comments) abuf_puts(out,
-    "    \n"
+    "\n"