#
# OLSR.org routing daemon config file
#
# Lines starting with a # are discarded
#

# Debug level(0-9)
# If set to 0 the daemon runs in the background

DebugLevel	1

# IP version to use (4 or 6)

IpVersion	4

# FIBMetric ("flat", "correct", or "approx")
# Just use "flat", the others don't work very well

FIBMetric "flat"

# Clear the screen each time the internal state changes

ClearScreen     yes

# HNA IPv4 routes
# syntax: netaddr netmask
# Example Internet gateway:
# 0.0.0.0 0.0.0.0

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
#    15.16.0.0 255.255.255.0
}

# HNA IPv6 routes
# syntax: netaddr prefix
# Example Internet gateway:
#Hna6
#{
# Internet gateway
#     ::              0

# specific small networks reachable through this node
#    fec0:2200:106:0:0:0:0:0 48
#}

# Specify the routing Table olsr uses
# currently only implemented in linux versions, (bsd planned)
# useful for policyrouting, to ensure that olsr can use
# the table a policy rule with priority 65536 is auto-installed
# by olsrd if an value < 253 ist specified!
# value defaults to 253 (main table)
# valid values are 1 .. 254
# (freifunkfirmware uses 111 for its policy routing)

RtTable 255

#you may specify another table for the default route only
#if used no policy route will get auto-installed for this table,
#but the default route gets also inserted into table 254
#(the last table used in default linux policy routing)
#valid tables are the same as for RtTable

RtTableDefault 255

# Specify the proto tag to be used for routes olsr inserts into kernel
# currently only implemented for linux, defaults to 0 which gets replaced
# by an OS-specific default value under linux 3 (BOOT) gets used as default
# (for backward compatibility)
# 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)

# RtProto 111

# 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!!
# defaults to 698 (IANA assigned olsr-port)
# valid values are 698 or > 1000

# OlsrPort 698

# Should olsrd keep on running even if there are
# no interfaces available? This is a good idea
# for a PCMCIA/USB hotswap environment.
# "yes" OR "no"

AllowNoInt	yes

# TOS(type of service) value for
# the IP header of control traffic.
# If not set it will default to 16

#TosValue	16

# The fixed willingness to use(0-7)
# If not set willingness will be calculated
# dynammically based on battery/power status

#Willingness    4

# Allow processes like the GUI front-end
# to connect to the daemon.

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 can
     # be added

     Host            127.0.0.1
     # Host            10.0.0.5

     # Specify entire net-ranges that are
     # allowed to connect

     # Net             192.168.1.0 255.255.255.0
}

# Link quality level
# 0 = do not use link quality
# 1 = use link quality for MPR selection
# 2 = use link quality for MPR selection and routing
# Defaults to 2

#LinkQualityLevel	2

# Link quality algorithm (only for lq level 1 or 2)
# Defaults to "etx_ff" for fixpoint based etx algorithm

LinkQualityAlgorithm    "ett_ss"

# Link quality aging factor
# Defaults to 0.05, smaller values mean larger LQ window size
# Link quality aging does only apply to lq level 1 and 2

LinkQualityAging 0.05

# Fisheye mechanism for TC messages 0=off, 1=on
# default is 1

LinkQualityFishEye	0

# Wether to use hysteresis or not
# Hysteresis adds more robustness to the
# link sensing but delays neighbor registration.
# Used by default. 'yes' or 'no'

UseHysteresis	no

# Hysteresis parameters
# 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!!

#HystScaling	0.50
#HystThrHigh	0.80
#HystThrLow	0.30


# Polling rate in seconds(float).
# Default value 0.05 sec

Pollrate	0.05

# Interval to poll network interfaces for configuration
# changes. Defaults to 2.5 seconds

NicChgsPollInt  2.0


# TC redundancy
# Specifies how much neighbor info should
# be sent in TC messages
# Possible values are:
# 0 - only send MPR selectors
# 1 - send MPR selectors and MPRs
# 2 - send all neighbors
#
# defaults to 0

TcRedundancy	2

#
# 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
# compared to the new one. If the ETX difference is too small, the default
# route isn't changed. defaults to 1.0
# The configured route gets multiplied by the threshold,
# before comparing which route is better

# NatThreshold  0.9

#
# MPR coverage
# Specifies how many MPRs a node should
# try select to reach every 2 hop neighbor
#
# Can be set to any integer >0
#
# defaults to 1

MprCoverage	3


# 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.

# LoadPlugin "olsrd_httpinfo.dll"
# LoadPlugin "/system/lib/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 "/system/lib/olsrd_txtinfo.so.0.1"
#{
    # port number the txtinfo plugin will be listening, default 2006
#   PlParam     "port"   "81"
    # ip address that can access the plugin, use "0.0.0.0"
    # to allow everyone
#    PlParam     "Accept"   "127.0.0.1"
#}

#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.1"
#{
    # Here parameters are set to be sent to the
    # plugin. Theese are on the form "key" "value".
    # Parameters ofcause, differs from plugin to plugin.
    # Consult the documentation of your plugin for details.

    # Example: dyn_gw params

    # how often to check for Internet connectivity
    # defaults to 5 secs
#   PlParam     "Interval"   "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 internet 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
#   PlParam     "Ping"       "141.1.1.1"
#   PlParam     "Ping"       "194.25.2.129"
#}

# olsrd_dyn_gw_plain.so.0.4
# {
# }


# Interfaces and their rules
# Omitted options will be set to the
# default values.
# multiple interfaces can be speicified
Interface "wlan0"
{

    # IPv4 broadcast address to use. The
    # one usefull example would be 255.255.255.255
    # If not defined the broadcastaddress
    # every card is configured with is used
    # The second useful value would be to
    # specify the peer adress of an ptp-tunnel

    # Ip4Broadcast      255.255.255.255

    # Interface Mode is used to prevent unnecessary
    # packet forwarding on switched ethernet interfaces
    # valid Modes are "mesh" and "ether"
    # The default value is mesh!

    # Mode "mesh"

    # IPv6 address scope to use.
    # Must be 'site-local' or 'global'

    # Ip6AddrType		site-local

    # IPv6 multicast address to use when
    # using site-local addresses.
    # If not defined, ff05::15 is used

    # Ip6MulticastSite	ff05::11

    # IPv6 multicast address to use when
    # using global addresses
    # If not defined, ff0e::1 is used

    # Ip6MulticastGlobal	ff0e::1


    # Emission intervals.
    # If not defined, RFC proposed values will
    # be used in most cases.

    # Hello interval in seconds(float)
    HelloInterval    1.0

    # HELLO validity time
    HelloValidityTime	10.0

    # TC interval in seconds(float)
    TcInterval        1.0

    # TC validity time
    TcValidityTime	20.0

    # MID interval in seconds(float)
    # MidInterval	5.0

    # MID validity time
    # MidValidityTime	30.0

    # HNA interval in seconds(float)
    # HnaInterval	5.0

    # HNA validity time
    # HnaValidityTime    30.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.

    # LinkQualityMult 192.168.0.1 0.5

    # This multiplier applies to all other nodes
    # LinkQualityMult default 0.8
}

# another Interface (with different configs)
#Interface "eth1"
#{
    # IPv4 broadcast address to use.
    # One usefull example would be 255.255.255.255
    # If not defined the broadcastaddress of
    # every interface which has one configured gets used
    # The second useful value would be to
    # specify the peer adress of an ptp-tunnel

#    Ip4Broadcast	192.168.255.255

    # Interface Mode is used to prevent unnecessary
    # packet forwardin on switched ethernet interfaces
    # valid Modes are "mesh" and "ether"
    # The default value is mesh!

#    Mode "ether"
#}

#LoadPlugin "olsrd_bmf.so.1.7.0"
#{
    # Specify the name of the BMF network interface.
    # Defaults to "bmf0".
    #PlParam "BmfInterface" "bmf0"

    # Specify the IP address and mask for the BMF network interface.
    # By default, the IP address of the first OLSR interface is copied.
    # The default prefix length is 32.
    #PlParam "BmfInterfaceIp" "10.10.10.234/24"

    # Enable or disable marking the BMF network interface as persistent.
    # When the interface is persistent (default) then it will not be removed
    # when olsrd shuts down. This is to facilitate other programs (for example
    # multicast routing daemon mrouted) to continue using it.
    #PlParam "BmfInterfacePersistent" "yes"

    # Enable or disable the flooding of local broadcast packets
    # (e.g. packets with IP destination 192.168.1.255). Either "yes"
    # or "no". Defaults to "yes".
    # Note: all nodes in the same network should have the same setting for
    # this plugin parameter.
    #PlParam "DoLocalBroadcast" "yes"

    # Enable or disable the capturing packets on the OLSR-enabled
    # interfaces (in promiscuous mode). Either "yes" or "no". Defaults
    # to "no".
    # The multicast (and, if configured, local broadcast) packets sent on
    # the non-OLSR network interfaces and on the BMF network interface will
    # always be flooded over the OLSR network.
    # If this parameter is "yes", also the packets sent on the OLSR-enabled
    # network interfaces will be flooded over the OLSR network.
    # NOTE: This parameter should be set consistently on all hosts throughout
    # the network. If not, hosts may receive multicast packets in duplicate.
    #PlParam "CapturePacketsOnOlsrInterfaces" "yes"

    # The forwarding mechanism to use. Either "Broadcast" or
    # "UnicastPromiscuous". Defaults to "Broadcast".
    # In the "UnicastPromiscuous" mode, packets are forwarded (unicast) to the
    # best candidate neighbor; other neighbors listen promiscuously. IP-local
    # broadcast is not used. This saves air time on 802.11 WLAN networks,
    # on which unicast packets are usually sent at a much higher bit rate
    # than broadcast packets (which are sent at a basic bit rate).
    # Note: all nodes in the same network should have the same setting for
    # this plugin parameter.
    #PlParam "BmfMechanism" "Broadcast"

    # The number of times BMF will transmit the same packet whenever it decides
    # to use broadcast to forward a packet. Defaults to 1. Not used if
    # "BmfMechanism" is set to "UnicastPromiscuous".
    #PlParam "BroadcastRetransmitCount" "1"

    # If the number of neighbors to forward to is less than or equal to the
    # FanOutLimit, then packets to be relayed will be sent via unicast.
    # If the number is greater than the FanOutLimit the packet goes out
    # as broadcast. Legal values are 0...10. See MAX_UNICAST_NEIGHBORS
    # as defined in NetworkInterfaces.h . 0 means broadcast is always used,
    # even if there is only 1 neighbor to forward to. Defaults to 2.
    # This plugin parameter is not used if "BmfMechanism" is set to
    # "UnicastPromiscuous".
    #PlParam "FanOutLimit" "0"

    # List of non-OLSR interfaces to include
    #PlParam     "NonOlsrIf"  "eth2"
    #PlParam     "NonOlsrIf"  "eth3"
#}

LockFile "/data/local/olsrd.lock"
