Initial import
authorAndreas Tonnesen <andreto@olsr.org>
Tue, 7 Sep 2004 16:10:42 +0000 (16:10 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Tue, 7 Sep 2004 16:10:42 +0000 (16:10 +0000)
177 files changed:
CHANGELOG [new file with mode: 0644]
Makefile [new file with mode: 0644]
Makefile.win32.in [new file with mode: 0644]
OLSRD_FAQ [new file with mode: 0644]
README [new file with mode: 0644]
README-WIN32.txt [new file with mode: 0644]
bin/olsrd [new file with mode: 0755]
files/olsrd.8.gz [new file with mode: 0644]
files/olsrd.conf.default [new file with mode: 0644]
files/olsrd.conf.default.win32 [new file with mode: 0644]
front-end/CHANGELOG [new file with mode: 0644]
front-end/Makefile [new file with mode: 0644]
front-end/Makefile.win32.in [new file with mode: 0644]
front-end/bin/olsrd-gui [new file with mode: 0755]
front-end/mkmf.sh [new file with mode: 0755]
front-end/src/callbacks.c [new file with mode: 0644]
front-end/src/callbacks.h [new file with mode: 0644]
front-end/src/common.h [new file with mode: 0644]
front-end/src/interface.c [new file with mode: 0644]
front-end/src/interface.h [new file with mode: 0644]
front-end/src/ipc.c [new file with mode: 0644]
front-end/src/ipc.h [new file with mode: 0644]
front-end/src/main.c [new file with mode: 0644]
front-end/src/main.h [new file with mode: 0644]
front-end/src/nodes.c [new file with mode: 0644]
front-end/src/nodes.h [new file with mode: 0644]
front-end/src/olsr.c [new file with mode: 0644]
front-end/src/olsr_protocol.h [new file with mode: 0644]
front-end/src/packet.c [new file with mode: 0644]
front-end/src/packet.h [new file with mode: 0644]
front-end/src/pixmaps.h [new file with mode: 0644]
front-end/src/pixmaps/logo.xpm [new file with mode: 0644]
front-end/src/routes.c [new file with mode: 0644]
front-end/src/routes.h [new file with mode: 0644]
front-end/src/win32/arpa/inet.h [new file with mode: 0644]
front-end/src/win32/compat.c [new file with mode: 0644]
front-end/src/win32/netdb.h [new file with mode: 0644]
front-end/src/win32/netinet/in.h [new file with mode: 0644]
front-end/src/win32/sys/socket.h [new file with mode: 0644]
front-end/src/win32/sys/time.h [new file with mode: 0644]
gpl.txt [new file with mode: 0644]
lib/dot_draw/Makefile [new file with mode: 0644]
lib/dot_draw/Makefile.win32.in [new file with mode: 0644]
lib/dot_draw/README_DOT_DRAW [new file with mode: 0644]
lib/dot_draw/mkmf.sh [new file with mode: 0755]
lib/dot_draw/olsrd_dot_draw.so.0.1 [new file with mode: 0755]
lib/dot_draw/src/olsr_plugin_io.h [new file with mode: 0644]
lib/dot_draw/src/olsrd_dot_draw.c [new file with mode: 0644]
lib/dot_draw/src/olsrd_dot_draw.h [new file with mode: 0644]
lib/dot_draw/src/olsrd_plugin.c [new file with mode: 0644]
lib/dot_draw/src/olsrd_plugin.h [new file with mode: 0644]
lib/dot_draw/src/olsrd_plugin_io.h [new file with mode: 0644]
lib/dyn_gw/Makefile [new file with mode: 0644]
lib/dyn_gw/README_DYN_GW [new file with mode: 0644]
lib/dyn_gw/src/olsr_plugin_io.h [new file with mode: 0644]
lib/dyn_gw/src/olsrd_dyn_gw.c [new file with mode: 0644]
lib/dyn_gw/src/olsrd_dyn_gw.h [new file with mode: 0644]
lib/dyn_gw/src/olsrd_plugin.c [new file with mode: 0644]
lib/dyn_gw/src/olsrd_plugin.h [new file with mode: 0644]
lib/dyn_gw/src/olsrd_plugin_io.h [new file with mode: 0644]
lib/dyn_gw/src/olsrd_power.c [new file with mode: 0644]
lib/powerinfo/Makefile [new file with mode: 0644]
lib/powerinfo/README_POWER [new file with mode: 0644]
lib/powerinfo/olsrd_power.so.0.1 [new file with mode: 0755]
lib/powerinfo/src/olsr_plugin_io.h [new file with mode: 0644]
lib/powerinfo/src/olsrd_plugin.c [new file with mode: 0644]
lib/powerinfo/src/olsrd_plugin.h [new file with mode: 0644]
lib/powerinfo/src/olsrd_plugin_io.h [new file with mode: 0644]
lib/powerinfo/src/olsrd_power.c [new file with mode: 0644]
lib/powerinfo/src/olsrd_power.h [new file with mode: 0644]
lib/secure/CHANGELOG [new file with mode: 0644]
lib/secure/Makefile [new file with mode: 0644]
lib/secure/SOLSR-README [new file with mode: 0644]
lib/secure/src/olsr_plugin_io.h [new file with mode: 0644]
lib/secure/src/olsrd_plugin.c [new file with mode: 0644]
lib/secure/src/olsrd_plugin.h [new file with mode: 0644]
lib/secure/src/olsrd_plugin_io.h [new file with mode: 0644]
lib/secure/src/olsrd_secure.c [new file with mode: 0644]
lib/secure/src/olsrd_secure.h [new file with mode: 0644]
mkmf.sh [new file with mode: 0755]
src/apm.h [new file with mode: 0644]
src/build_msg.c [new file with mode: 0644]
src/build_msg.h [new file with mode: 0644]
src/configfile.c [new file with mode: 0644]
src/configfile.h [new file with mode: 0644]
src/defs.h [new file with mode: 0644]
src/duplicate_set.c [new file with mode: 0644]
src/duplicate_set.h [new file with mode: 0644]
src/generate_msg.c [new file with mode: 0644]
src/generate_msg.h [new file with mode: 0644]
src/hashing.c [new file with mode: 0644]
src/hashing.h [new file with mode: 0644]
src/hna_set.c [new file with mode: 0644]
src/hna_set.h [new file with mode: 0644]
src/hysteresis.c [new file with mode: 0644]
src/hysteresis.h [new file with mode: 0644]
src/ifnet.h [new file with mode: 0644]
src/interfaces.c [new file with mode: 0644]
src/interfaces.h [new file with mode: 0644]
src/ipc_frontend.c [new file with mode: 0644]
src/ipc_frontend.h [new file with mode: 0644]
src/ipc_olsrset.h [new file with mode: 0644]
src/kernel_routes.h [new file with mode: 0644]
src/link_layer.h [new file with mode: 0644]
src/link_set.c [new file with mode: 0644]
src/link_set.h [new file with mode: 0644]
src/linux/apm.c [new file with mode: 0644]
src/linux/ifnet.c [new file with mode: 0644]
src/linux/kernel_routes.c [new file with mode: 0644]
src/linux/link_layer.c [new file with mode: 0644]
src/linux/net.c [new file with mode: 0644]
src/linux/net.h [new file with mode: 0644]
src/linux/tunnel.c [new file with mode: 0644]
src/linux/tunnel.h [new file with mode: 0644]
src/local_hna_set.c [new file with mode: 0644]
src/local_hna_set.h [new file with mode: 0644]
src/main.c [new file with mode: 0644]
src/main.h [new file with mode: 0644]
src/mantissa.c [new file with mode: 0644]
src/mantissa.h [new file with mode: 0644]
src/mid_set.c [new file with mode: 0644]
src/mid_set.h [new file with mode: 0644]
src/mpr.c [new file with mode: 0644]
src/mpr.h [new file with mode: 0644]
src/mpr_selector_set.c [new file with mode: 0644]
src/mpr_selector_set.h [new file with mode: 0644]
src/neighbor_table.c [new file with mode: 0644]
src/neighbor_table.h [new file with mode: 0644]
src/net.c [new file with mode: 0644]
src/net.h [new file with mode: 0644]
src/olsr.c [new file with mode: 0644]
src/olsr.h [new file with mode: 0644]
src/olsr_plugin_io.h [new file with mode: 0644]
src/olsr_protocol.h [new file with mode: 0644]
src/packet.c [new file with mode: 0644]
src/packet.h [new file with mode: 0644]
src/parser.c [new file with mode: 0644]
src/parser.h [new file with mode: 0644]
src/plugin.c [new file with mode: 0644]
src/plugin.h [new file with mode: 0644]
src/plugin_loader.c [new file with mode: 0644]
src/plugin_loader.h [new file with mode: 0644]
src/process_package.c [new file with mode: 0644]
src/process_package.h [new file with mode: 0644]
src/process_routes.c [new file with mode: 0644]
src/process_routes.h [new file with mode: 0644]
src/rebuild_packet.c [new file with mode: 0644]
src/rebuild_packet.h [new file with mode: 0644]
src/routing_table.c [new file with mode: 0644]
src/routing_table.h [new file with mode: 0644]
src/scheduler.c [new file with mode: 0644]
src/scheduler.h [new file with mode: 0644]
src/socket_parser.c [new file with mode: 0644]
src/socket_parser.h [new file with mode: 0644]
src/tc_set.c [new file with mode: 0644]
src/tc_set.h [new file with mode: 0644]
src/two_hop_neighbor_table.c [new file with mode: 0644]
src/two_hop_neighbor_table.h [new file with mode: 0644]
src/win32/apm.c [new file with mode: 0644]
src/win32/arpa/inet.h [new file with mode: 0644]
src/win32/compat.c [new file with mode: 0644]
src/win32/dlfcn.h [new file with mode: 0644]
src/win32/ifnet.c [new file with mode: 0644]
src/win32/kernel_routes.c [new file with mode: 0644]
src/win32/net.c [new file with mode: 0644]
src/win32/net/if.h [new file with mode: 0644]
src/win32/net/route.h [new file with mode: 0644]
src/win32/netinet/in.h [new file with mode: 0644]
src/win32/pthread.h [new file with mode: 0644]
src/win32/sys/ioctl.h [new file with mode: 0644]
src/win32/sys/socket.h [new file with mode: 0644]
src/win32/sys/time.h [new file with mode: 0644]
src/win32/sys/utsname.h [new file with mode: 0644]
src/win32/syslog.h [new file with mode: 0644]
src/win32/tunnel.c [new file with mode: 0644]
src/win32/tunnel.h [new file with mode: 0644]
src/win32/unistd.h [new file with mode: 0644]

diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644 (file)
index 0000000..9381a9a
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,655 @@
+This file states changes as of version 0.2.4:
+
+0.4.6 ---------------------------------------------------------------------
+
+WINDOWS PORT!
+
+Read the README-WIN32.txt file!
+
+DYNAMIC NETWORK INTERFACE UPDATES
+
+Network interfaces can now be updated and removed/added at
+runtime. Olsrd will check all interfaces specified in the config 
+file or on the command-line, every 5 seconds. If updates
+occure, olsrd will register this and update the necessary data.
+If interfaces are removed or added, olsrd will detect this
+and configure the interfaces. If an interface is removed
+olsrd will continue to check the interface, so if say, a PCMCIA
+card is removed and later on reinserted(and given the same name),
+olsrd will detect this and start running on it again.
+
+Note that olsrd will now run even if no interfaces are detected.
+
+ROUTE CALCULATION UPDATE
+
+All 1 hop neighbor addresses that are not directly reachable trough
+a symmetric link in the link set will now be added with a GW in the 
+routing table. this GW will be an interface address from a registered
+symmetric link to the neighbor.
+
+MID UPDATE
+
+Alias addresses are now registered in the link set processing
+if available. This is not to pretty(since the vtime has to
+be a mere guess) but it gives faster initial route updates.
+If a HELLO is received(at initial registration) from an IP 
+that is not the same as the one set as main address in the 
+received HELLO header, then the IP from which the HELLO was 
+received will be registered as an alias of the main address 
+set in the HELLO header. The default vtime is set to 15 secs.
+
+CODE RESTRUCTURING
+
+All OS dependent interface configuration code is now located in
+OS/ifnet.c(that would be linux/ifnet.c if using GNU/Linux).
+The functions are available trough the headerfile src/ifnet.h
+
+CODE CLEANUPS
+
+- Some timer issues fixed
+- Got rid of the global socket descriptors
+- Updated indexing of network interfaces
+- Introduced a global socket to use for ioctl calls(ioctl_s)
+- Removed upper limit for interfaces to use
+- Point-to-point interfaces are now allowed
+- The main select(2) loop now uses a timeout
+- A small bugfix in the select fd-set update code
+- Some bugfixes in the configuration file parsing
+- stdout/stderr are now set to not be buffered
+- A bugfix in the MID generation regarding seq. numbering
+
+PLUGIN INTERFCAE
+
+A new set of functions that are called whenever a change in the 
+interface configuration(update, addittion, removal) is made is 
+introduced.
+These functions are added and removed very much like the ptf
+functions. Available trough the functions add_ifchgf and del_ifchgf.
+
+OBS OBS OBS!!! PLUGIN DEVELOPERS READ THIS!!!!
+
+The interface struct(declared in interfaces.h) has changed.
+Plugin developers must update plugins that uses the interface
+struct!
+
+The headerfile olsr_plugin_io.h which contains the plugin interface
+commands now contains a revision list where all changes are
+stated.
+
+
+0.4.5 ---------------------------------------------------------------------
+
+PLUGIN: SECURE OLSR
+
+A plugin that generates and checks message signatures is added.
+Check lib/secure
+
+PLUGIN: TOPOLOGY GRAPH
+
+A plugin that generates output of the topology in the dot format
+is added. See lib/dot_draw
+
+OPTIMIZATIONS
+
+Some optimizations done that should cause fewer route recalculations.
+
+BUGFIXES
+
+Some bugs reported by Takafumi Tanaka fixed.
+
+RESTORATION OF NETWORK SETTINGS
+
+Network settings like disabling of ICMP redirects and spoof filter, are
+now restored at exit by olsrd.
+
+RFC COMPLIANCE FIX
+
+Nodes would in certain scenarios retransmit messages originating for
+themselves. This was a RFC incompliance. Reported by Ingmar Baumgart.
+
+NON-WLAN TIMERS
+
+No longer setting the HELLO interval of non-wlan interfaces as a multiplier
+of the wlan interval. The interval is set seperatly now.
+Due to this there are some updates in the configfile imperatives.
+
+CODE CLEANUPS
+
+Some new macros introduced for table insertion and removal and IP
+copying and comparision.
+
+FRONT END BUGFIXES
+
+IPv6 bugfixes in the GUI.
+
+
+0.4.4 ---------------------------------------------------------------------
+
+ROUTE CALCULATION
+
+Routes are no longer added via neighbors declaring a willingness
+of WILL_NEVER.
+
+LINK SENSING AND ROUTE CALCULATION
+
+Link sensing and route calculation has been updated to handle
+multiple links between hosts in a sane way.
+
+IP SPOOF FILTERING
+
+IP spoof filtering is disabled on the interfaces which olsrd runs.
+These settings are not restored!
+
+ICMP REDIRECTS
+
+ICMP redirect message generation is disabled on the interfaces
+which olsrd runs.
+These settings are not restored!
+
+CONFIGFILE OPTIONS FOR MID AND HNA ADDED
+
+Options to set the MID and HNA emission intervals and
+validitytime in the configfile added.
+
+IPv6 ADDRESS SCOPE
+
+Option to set what IPv6 address type(scope) to use in the 
+configfile added. It can be set to either global or site-local.
+
+IPv6 MULTICAST
+
+Options to set site-local and global multicast addresses
+in the configfile added.
+
+EMISSION INTERVAL FUNCTION
+
+Functions to set emission intervals at runtime added.
+
+LINK LAYER NOTIFICATIONS
+
+If started with the -llinfo switch olsrd will collect and display
+link-layer information on neighbors. This is no longer limited to
+one interface. But no action is taken based on this info - and
+there is a upper limit of 8 neighbors from which this info can
+be collected pr. interface. This limitation is inherited from the
+WLAN drivers and is not something imposed by the olsrd code!
+
+IPv6 HNA MESSAGE FORMAT
+
+IPv6 HNA messages now contains 128-bit netmask instead of prefix.
+
+PLUGIN FUNCTIONS
+
+Added "packet transform functions" which allow plugins to alter all
+outgoing OLSR traffic.
+
+RESTRUCTURING
+
+Moved most headers out of OS dependent directories. The tunneling
+and link-layer notification interface is not yet seperated from
+the /linux directory.
+
+MANUALPAGE
+
+A manpage(olsrd(8)) describing olsrd has been created. It is installed
+when using 'make install'.
+
+
+0.4.3 ---------------------------------------------------------------------
+
+PLUGIN SUPPORT
+
+Olsrd now supports runtime-loadable plugins! A couple of example plugins
+are located in the lib/ directory. Read the README files in the various 
+plugin directories for more info. A directive to load plugins have been
+added to the configfile as well. 
+Documentation of the plugin interface can be fount at http://www.olsr.org.
+
+The plugin interface is designed to be extendable. But it should _always_
+be backwards compatible with the interface used in this release!
+
+LINK-LAYER NOTIFICATION
+
+Some preliminary link-layer notification code has been added. Link quality
+can be written to stdout if olsrd is started with the -llinfo switch.
+No action is currently taken based on this info. And info will only
+be retreived from the interface named "eth1".
+This code is not usable for users as of yet!
+
+MPR UPDATES
+
+Neighbors with willingness set to WILL_ALWAYS is now always added. The
+MPR selection is optimized as described in RFC3626 section 8.3.1
+point 5.
+
+MPR BUGS
+
+There was a couple of bugs in the MPR selection code. All fixed.
+
+LINUX 2.6 BUG
+
+Users could not run olsrd on multiple inerface using the Linux 2.6 kernel
+series. This is now fixed.
+
+MINOR BUGS
+
+One small bug in link hysteresis initialization and one in HNA route
+deletion.
+
+MESSAGE-SEQUENCENUMBER INCOMPLIANCE
+
+Message-seqnos was implementaed on a pr. messagetype and pr. interface
+basis. This is not RFC3626 compliant and has been updates. All messages
+and interfaces now uses a global seuencenumber.
+
+RANDOM SEQUENCENUMBERS
+
+Sequencenumbers are now initialized using a random value.
+
+DAEMON MODE
+
+Fixes for running olsrd in daemon mode(debug 0).
+
+OPTIMIZATIONS
+
+Optimizations based on profiling implemented.
+
+SANITATION
+
+Message size is checked for every massege before passing it to the
+appropriate message persing function. If the size is bigger than the
+remaining size of the olsr packet then the message is discarded.
+
+GUI FRONT-END
+
+Some minor modifications done to the gui.
+
+INTERNAL CHANGES
+
+Lots of changes in handling of registration and unregistration of
+scheduler, socketparser, parser and local hna set.
+Some restructuring and movement of functions.
+
+
+0.4.2 ---------------------------------------------------------------------
+
+No public release
+
+0.4.1 ---------------------------------------------------------------------
+
+No public release
+
+0.4.0 ---------------------------------------------------------------------
+
+LINK HYSTERESIS
+
+Link hysteresis as described in the RFC added.
+
+TC REDUNDANCY
+
+TC redundancy as described in the RFC added
+
+MPR REDUNDANCY
+
+MPR redundancy as described in the RFC added
+
+SCHEDULER REWRITE
+
+The scheduler has been rewritten to register scheduled
+events(function pointers) dynamically.
+
+PARSER REWRITE
+
+The parser has been rewritten to register parse functions
+on a pr. messagetype dynamically
+
+MALLOC WRAPPER
+
+A wrapper for the malloc(3) syscal has been introduced.
+olsr_malloc(size_t, const char *) should ALWAYS be used.
+
+CODE RESTRUCTURING
+
+Lots of restructuring in headerfiles.
+Linux spesific code moved to subdirectory linux/
+FreeBSD code to be put in freebsd/
+LOTS of code restructured due to the rexrite of the scheduler
+and parser.
+
+MPR CALCULATION
+
+Optimizing the MPR set as suggested in the RFC section
+8.3.1 point 5 added.
+
+BUGFIXES
+
+Some bugs in MPR selection fixed.
+
+
+0.3.8 ---------------------------------------------------------------------
+
+CODE REWRITES
+
+HNA code completeley rewritten!
+The old code was really bad! Now it is much cleaner implemented and
+should work fine.
+One- and two-hop neighbor list structures rewritten. They now use
+the same hashed double-linked lists as the rest of the information
+sets use.
+
+CODE RESTRUCTURING
+
+Some code restructuing which resulted in the new files: timer.h,
+mantissa.c, mantissa.h, hashing.c, hashing.h, linux/net.c 
+linux/net.h, linux/kernel_routes.c, linux/kernel_routes.h and some 
+renamed files
+
+BUG FIXES
+
+The bug causing errormessages on exit is fixed.
+The bug that caused initial HNA routes in the GUI to display a hopcount
+of 0 fixed.
+IPv6 HNA netmasks were all added as /128. It's fixed now.
+
+IPv6
+
+Turns out sitelocal address had to be preferred to avoid IPv6 header
+messing up link-sensing. Bug fixed
+
+
+0.3.7 ---------------------------------------------------------------------
+
+CODE REWRITES
+
+The entire TC set and MPR selector set code rewritten. Hashing and
+double linked lists added to the MID code.
+Lots of HNA code has been rewriteen as well.
+
+HNA bugfix
+
+When a node lost connectivity to a HNA GW all HNA entries to that gw
+was deleted. This has been fixed - and HNA entries only gets deleted
+on timeout now.
+Other HNA bugs have been fixed as well. But the whole HNA implementation
+needs a rewrite!
+
+Holdingtime BUGfix
+
+There was a bug that caused holdingtime not to be properly recalculated
+when using non-default emission intervals.
+
+Forwarding and symmetric neighbors
+
+Seems I had misread the RFC on what a 1-hop symmetric neighbor is.
+Now the link-set is checked when a check for a symmetric neighbor
+is done. Not the 1 hop neighbor set as it used to be. This way
+the hack when receiving MID messages could be removed.
+
+IPv6
+
+Global addresses are now preferred. Sitelocal addresses are only used
+if no global adresses are found. There have been problems where
+the address set in the IP header of IPv6 packets do not match the
+address chosen by OLSR.
+
+GUI - 0.2.5
+
+The GUI is finally updated! It can now handle piggybacked messages
+and link sensing HELLO message format.
+
+
+0.3.6 ---------------------------------------------------------------------
+
+HNA support using IPv6
+
+HNA now works using IPv6 as well! Just add the netwrok address and
+prefix in the HNA6 section in the configfile. The IPv6 HNA packets differ
+some from the IPv4 as they don't send the netmask but the prefix.
+
+
+NEW FILENAME FOR THE BINARY AND CONFIG FILE
+
+They are now called olsrd and olsrd.conf. I figured I'd use the olsrd
+name before somebody else started using it ;-)
+
+
+Config file
+
+New options: DEBUG, HNA6 and IPC-CONNECT added to config file.
+
+
+Output
+
+A printf-wrapper hans been introduced - debug level output handeling
+is much more uniform now.
+The daemon sould run fine in detatched mode now(DEBUG 0)
+
+GUI front-end
+
+The GUI front-end can now connect and dissconnect at any time while the
+daemon is running, if started using the -ipc switch or with IPC set to
+'yes' in the configfile.
+
+
+BUGS
+
+A small HNA bug fixed.
+
+
+0.3.5 ---------------------------------------------------------------------
+
+Forwarding jitter
+
+Forwarding jitter added. Messages are piggibacked if they arrive(and are to 
+be forwarded) while there is data to be forwarded buffered.
+Added some bugfixes to support parsing of piggybacked messages as well.
+
+Route calculation
+
+Fixed route calculation so that 2 hop neighbors are added. This smooths
+changes from 1 hop to 2 hop neighbor out. The old way one had to wait for 
+a TC before the 2 hop neighbors were added.
+
+2 hop neighbor set
+
+All neighbors recieved in HELLO messages are added to the two hop 
+neighborhood. This helps smoothing out the 1-to-2 hop transition as well.
+
+MID calculation
+
+MID calculation had to be updated due to the registering of two hop neighbors
+that are already one hop neighbors. They sould not be considered when calculatin
+two hop coverage.
+
+Optimalizations
+
+Deletion of possible one hop neighbors registered on non main-addresses when
+first registering MID info from a node removed. This can not occure due
+to the fact that registering of neighbor nodes are done on main addresses
+from link-sensing
+Option to not forward messages on wired links on which they arrived removed.
+This is no longer usable to any degree when adding support for piggybacking
+of forwarded messages is to be implemented.
+
+Cleanups
+
+Some unused parameters and commandline options were removed.
+
+
+
+0.3.3 ---------------------------------------------------------------------
+
+TC MESSAGEING
+
+Added sending of empty TC messages if all MPR selectors are removed. Empty
+TC messages are sent for a TC_HOLD_TIME period as described in section
+9.3 in the RFC.
+
+HNA
+
+Fixed HNA route calculations for IPv6. I forgot to upgrade this in 0.3.2
+
+OPTIONS
+
+-hnaint and -midint command line optionas added to set the interval
+of HNA and MID generation.
+
+FORWARDING
+
+As an optimization messages have not been forwarded on the recieved interface
+if this is registered as a non-WLAN interface. This causes problems for
+people using ethernet-to-WLAN adapters. This optimalization is now turned
+off by default. It can be activated using the -nofwlan option.
+
+BUGS
+
+THERE ARE SOME NASTY BUGS IN 0.3.2!
+Fixed a bug that caused 2 hop neighbors not to time out.
+Fixed a bug that caused a 1 hop neighbor timeout not to recalculate
+the routing table.
+Fixed a small memleak in the MID set
+Fixed some smaller bugs.
+
+IPv6 functioning is not well tested in this release.
+
+0.3.2 ---------------------------------------------------------------------
+
+HNA
+
+Updated HNA to be RFC compliant. This means that all recieved HNA tuples
+are registered and only the subset of uniqe entries(net/netmask) with
+the smallest hocount is inserted into the routing table.
+
+Config file
+
+User can specify configfile name using the -f switch.
+
+Bugs
+
+Fixed a link-sensing bug that caused problems when using MID nodes.
+
+0.3.1 ---------------------------------------------------------------------
+
+MPR calculation
+
+MPR calculation is now based on the willingness announced by nodes.
+
+Neighbor set
+
+The neighbor set does not have timeouts on entries any more. Creation
+and deletion af neighbor entries is done from the link-set as suggested
+in the RFC.
+
+Cleanups
+
+Gotten rid of a lot of code that became more or less obsolete due to
+all the changes introduced in 0.3.0.
+
+Bugs
+
+Fixed a nasty bug concerning the sequence numbering of TC packets.
+Fixed some bugs regarding MPR calculation - and probably introduced 
+a whole new species when implementing the willingness-based calculation ;-)
+
+
+0.3.0 ---------------------------------------------------------------------
+
+Due to the extensive amount of updates this release is versioned 0.3.0
+
+Duplicate table and forwarding
+
+The duplicate table functionallity is totally rewritten in 100% RFC
+compliance. The forward algorithm specified in the RFC is implmented
+this meant rewriting much of the packet processing code. The daemon
+also forwards unknown packettypes now.
+
+Link sensing and neighbor processing
+
+Link sensing and neighbor processing was done in the same operation in the
+old code. Link sensing is now a mechanism of its own which is 100% RFC
+compliant. Neighbor processing and HELLO generation has been partly 
+rewritten to be RFC compliant. Neighbors are now registered as either
+SYN or NOT_SYM. The NOT_NEIGH, SYM_NEIGH and MPR_NEIGH values are only
+used when building HELLO messages. Links are in one of the following states:
+UNSPEC_LINK, ASYM_LINK or SYM_LINK.
+HELLO messages now advertise link status of neighbors on the interface
+the message is transmitted.
+
+Willingness
+
+A node now dynamically calculates willingness based on powersource and
+possibly battery power. If the node is AC powered it announces a willingness
+of 6. If batterypowered the willingness is calculated as:
+P / 26
+Where P is percentage of power left.
+
+Configuration file
+
+The daemon now tries to read its configuration from the file /etc/uolsrd.conf
+A "standard" configuration file is installed when doing 'make install'.
+This file should be edited to fit your needs.
+Command-line options can still be used to override the configuration form
+the file(ore if no config file is present).
+The -f switch can also be used to specify a configuration file.
+
+Willingness
+
+If AdvancedPowerManagemant(APM) is supported on your system the willingness
+of the node is dynamically calculated based upon the powerstatus of the node.
+MPR calculation based upon willingness is not done as of yet.
+
+TC ANSN
+
+A bugs in the TC processing fixed.
+
+HNA
+
+Some serious HNA bugs fixed. These bugs caused a node to always choos the 
+gateway with the larges hopcout :) More seriousley - a bug caused looping
+of HNA messages in certain scenarios.
+
+Package sequence numbers
+
+These were added. Not much use as of now - but they're there(as specified 
+in the RFC).
+
+Broadcast address
+
+Users can now specify the broadcast address to use. Usefull if one wishes to
+use the 255.255.255.255 broadcast.
+
+
+
+0.2.5 ---------------------------------------------------------------------
+
+Htime and Vtime
+
+Htime and Vtime processing and handeling added. Holding times used to be 
+a static value for all nodes. Now every node can signal its vlidity time
+to others.
+To achieve this mantissa/exponent calculation functionality was added.
+Messages now include Vtime(and Htime in HELLO) values in mantissa/exponent
+format instead of just zero. These values are as stated above, used as holding
+time for nodes.
+the GUI should be upgraded as well...
+
+Jitter
+
+The use of jitter in message generation intervals vere fixed.
+
+
+0.2.4 ---------------------------------------------------------------------
+
+Seqno bugs
+
+Some bugs concerning sequence numbers in HELLO and MID message handling 
+was fixed. Newly registered nodes in the neighbor and MID sets were
+initialized with a seqno of 0. When using a "wraparound" sequencenumber
+check(as defined in olsr_protocol.h) this can produce errors if a new
+node joins a network where existing nodes has seqnos >0x00FF.
+
+IPv6 related bugs
+
+Some checks and copying of node addresses where done using sizeof(u_olsr32_t)
+which is 32 bits. This caused only the 32 firs bits of IPv6 addresses to
+be copied and checked.
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..cb5499a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,91 @@
+CC ?= gcc
+
+CFLAGS ?= -Wall -O2 #-g #-pg -DDEBUG #-march=i686
+LIBS = -lpthread -lm -ldl
+INSTALL_PREFIX ?=
+
+
+# Keep OS specific files last
+
+SRCS=  src/interfaces.c src/parser.c src/build_msg.c \
+       src/scheduler.c src/main.c src/two_hop_neighbor_table.c \
+       src/neighbor_table.c src/mpr_selector_set.c src/duplicate_set.c \
+       src/tc_set.c src/routing_table.c src/packet.c src/olsr.c \
+       src/process_routes.c src/net.c src/mantissa.c \
+       src/hna_set.c src/mid_set.c src/ipc_frontend.c \
+       src/link_set.c src/configfile.c src/socket_parser.c \
+       src/process_package.c src/mpr.c src/local_hna_set.c \
+       src/hashing.c src/hysteresis.c src/generate_msg.c \
+       src/rebuild_packet.c src/plugin_loader.c src/plugin.c \
+       src/linux/net.c src/linux/apm.c src/linux/tunnel.c \
+       src/linux/kernel_routes.c src/linux/link_layer.c \
+       src/linux/ifnet.c
+
+OBJS=  src/interfaces.o src/parser.o src/build_msg.o \
+       src/scheduler.o src/main.o src/two_hop_neighbor_table.o \
+       src/neighbor_table.o src/mpr_selector_set.o src/duplicate_set.o \
+       src/tc_set.o src/routing_table.o src/packet.o src/olsr.o \
+       src/process_routes.o src/net.o src/mantissa.o \
+       src/hna_set.o src/mid_set.o src/ipc_frontend.o \
+       src/link_set.o src/configfile.o src/socket_parser.o \
+       src/process_package.o src/mpr.o src/local_hna_set.o\
+       src/hashing.o src/hysteresis.o src/generate_msg.o \
+       src/rebuild_packet.o src/plugin_loader.o src/plugin.o \
+       src/linux/net.o src/linux/apm.o src/linux/tunnel.o \
+       src/linux/kernel_routes.o src/linux/link_layer.o \
+       src/linux/ifnet.o
+
+HDRS=  src/defs.h src/interfaces.h src/packet.h src/build_msg.h \
+       src/olsr.h src/two_hop_neighbor_table.h olsr_plugin_io.h \
+       src/neighbor_table.h src/mpr_selector_set.h \
+       src/duplicate_set.h src/tc_set.h src/rtable.h \
+       src/process_routes.h src/net.h src/mantissa.h \
+       src/hna_set.h main.h src/mid_set.h src/ipc_frontend.h \
+       src/olsr_protocol.h src/link_set.h src/configfile.h \
+       src/process_package.h src/mpr.h src/ipc_olsrset.h \
+       src/local_hna_set.h src/hashing.h src/hysteresis.h \
+       src/generate_msg.h src/rebuild_packet.h src/plugin_loader.h \
+       src/plugin.h src/socket_parser.h src/ifnet.h\
+       src/kernel_routes.h \
+       src/apm.h src/linux/tunnel.h src/scheduler.h \
+       src/linux/net.h src/linux/link_layer.h
+
+all:   olsrd
+
+olsrd: $(OBJS)
+       $(CC) $(LIBS) -o bin/$@ $(OBJS)
+
+libs: 
+       for i in lib/*; do \
+               $(MAKE) -C $$i; \
+       done; 
+
+clean_libs: 
+       for i in lib/*; do \
+               $(MAKE) -C $$i clean; \
+       done; 
+
+.PHONY: clean
+clean:
+       -rm -f $(OBJS)
+
+install_libs:
+       for i in lib/*; do \
+               $(MAKE) -C $$i LIBDIR=$(INSTALL_PREFIX)/usr/lib install; \
+       done;   
+
+
+install_bin:
+       install -D -m 755 bin/olsrd $(INSTALL_PREFIX)/usr/sbin/olsrd
+
+install: install_bin
+       @echo olsrd uses the configfile $(INSTALL_PREFIX)/etc/olsr.conf
+       @echo a default configfile. A sample configfile
+       @echo can be installed
+       mkdir -p $(INSTALL_PREFIX)/etc
+       cp -i files/olsrd.conf.default $(INSTALL_PREFIX)/etc/olsrd.conf
+       @echo -------------------------------------------
+       @echo Edit $(INSTALL_PREFIX)/etc/olsrd.conf before running olsrd!!
+       @echo -------------------------------------------
+       mkdir -p $(INSTALL_PREFIX)/usr/share/man/man8/
+       cp files/olsrd.8.gz $(INSTALL_PREFIX)/usr/share/man/man8/olsrd.8.gz
diff --git a/Makefile.win32.in b/Makefile.win32.in
new file mode 100644 (file)
index 0000000..5f61ac1
--- /dev/null
@@ -0,0 +1,52 @@
+OBJS =         src/build_msg.o \
+               src/configfile.o \
+               src/duplicate_set.o \
+               src/generate_msg.o \
+               src/hashing.o \
+               src/hna_set.o \
+               src/hysteresis.o \
+               src/interfaces.o \
+               src/ipc_frontend.o \
+               src/link_set.o \
+               src/local_hna_set.o \
+               src/main.o \
+               src/mantissa.o \
+               src/mid_set.o \
+               src/mpr.o \
+               src/mpr_selector_set.o \
+               src/neighbor_table.o \
+               src/net.o \
+               src/olsr.o \
+               src/packet.o \
+               src/parser.o \
+               src/plugin.o \
+               src/plugin_loader.o \
+               src/process_package.o \
+               src/process_routes.o \
+               src/rebuild_packet.o \
+               src/routing_table.o \
+               src/scheduler.o \
+               src/socket_parser.o \
+               src/tc_set.o \
+               src/two_hop_neighbor_table.o \
+               src/win32/apm.o \
+               src/win32/compat.o \
+               src/win32/ifnet.o \
+               src/win32/kernel_routes.o \
+               src/win32/net.o \
+               src/win32/tunnel.o
+
+%.o:           %.c
+               gcc -mno-cygwin -O2 -Wall -c -DWIN32 \
+               -Isrc -Isrc/win32 -o$@ $<
+
+olsrd:         $(OBJS)
+               gcc -mno-cygwin -o olsrd.exe $(OBJS) -lws2_32 -liphlpapi
+
+clean:
+               rm -f olsrd.exe *.dll
+               find . -name \*~ -exec rm -f {} \;
+               find src -name \*.o -exec rm -f {} \;
+
+mclean:                clean
+               rm -f Makefile.win32
diff --git a/OLSRD_FAQ b/OLSRD_FAQ
new file mode 100644 (file)
index 0000000..ad36b0e
--- /dev/null
+++ b/OLSRD_FAQ
@@ -0,0 +1,60 @@
+THIS IS THE FAQ FROM THE OLSRd HOME PAGE(www.olsr.org):
+
+
+Q: When using 255.255.255.255 as broadcast address nodes with addresses from different subnets, but on the same link, don't hear eachother!
+A: To make this work you must disable ingress filtering on the interfaces. This is done by typing:
+echo "0" > /proc/sys/net/ipv4/conf/eth0/rp_filter
+in a shell. Replace eth0 with the interface you are using. From 0.4.4 this will be done automatically by olsrd.
+
+Q: When using IPv6 I get a Cannot assign requested address error.
+A: Olsrd uses a site-local multicast address for control traffic when using IPv6(since broadcast is not avalible in IPv6). If your interfaces are not configured with a site-local address then you should eiter configure them with a site-local address or use a global multicast address like ff0e::1. The multicast address to use can be set by the IP6MULTI directive in the config file.
+
+Q: I get a bind: Address already in use when trying to run OLSRd on multiple interfaces.
+A: If you are using a 2.6 kernel this will occure in all olsrd versions prior to 0.4.1. Either upgrade olsrd(preferred) or downgrade your kernel.
+
+Q: I change the uolsrd.conf file and nothing happens! Or: olsrd will no linger start when I run the uolsrd command!
+A: From release 0.3.6 the binary is named olsrd and the configfile is named olsrd.conf. You should remove old configfiles!
+
+Q: Does uOLSRd compile for strong-ARM architecture?
+A: Yes.Get this cross-compiler.
+ARM binaries can also be downloaded from the download section.
+
+Q: Can I use uOLSRd in simulators such as NS2?
+A: Not to my knowledge. There is no simulator specific code in uOLSRd.
+
+Q: Does uOLSRd have IPv6 support?
+A: Yes.
+
+Q: What keeps uOLSRd from compiling on, say, FreeBSD?
+A: Various issues prevents this - the main one is that when running on multiple interfaes uOLSRd sets up one socket on each interface to be able to control on what interfaces messages are sent. To do this the flag SO_BINDTODEVICE is set on the socket using the setsockopt(2) call. This flag, or any similar, does not exist in freeBSD.
+uOLSRd will work without SO_BINDTODEVICE if no two OLSR interfaces use tha same broadcastaddress. This is a unacceptable limitation IMO.
+I am going to look into BPF(BSD packet filter) one day - as this seem to might provide the functionallity needed.
+
+UPDATE:
+I have consulted the helpfull folks at the freebsd-net mailinglist, and I think this problem will be solved now! So a FreeBSD port will hopefully happen somwhere in the 0.4 branch.
+
+Q: I get uOLSRd up and running - but the nodes don't seem to "hear" eachother! Have I discovered a bug!?
+A: I would say with 99% certainty that this is a configuration problem. Here are the most common mistakes:
+
+    * If using IPv4 make sure the interfaces(that are supposed to be on the same network) are using a common broadcastaddress!
+    * If using WLAN interfaces make sure the ESSID/key match and that the cards are set in ad-hoc mode!
+    * Make sure you are not blocking UDP/698. If using netfilter run iptables -L as root to see what rules are set. iptables -F flushes all rules.
+
+
+
+Q: I can't get uOLSRd to start.... why oh why??
+A: Some things to check for:
+
+    * You must be root to run uOLSRd.
+    * Interfaces must be preconfigured with IP address and broadcast address for uOLSRd to use them. They must also be set UP and RUNNING(flags). Use the ifconfig tool to configure and check c onfiguration of interfaces.
+    * You must specify on which interface(s) uOLSRd should run(using the -i switch or configfile).
+    * uOLSRd can not run on alias interfaces i.e. interfaces with names containing : like eth0:0.
+
+
+
+Q: The GUI front-end failed to compile... why?
+A: You probably don't have GTK2.0 development libraries installed.
+
+Q: On what platforms does uOLSRd compile?
+A: As of yet uOLSRd compiles on the Linux(>=2.2) platform.
+
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..2e60220
--- /dev/null
+++ b/README
@@ -0,0 +1,130 @@
+
+UnikOLSR 0.4.6
+
+by Andreas Tonnesen(andreto@olsr.org)
+http://www.olsr.org
+
+04.08.04
+
+
+1. OLSR RFC COMPLIANCE
+
+  This version is RFC2636 compliant to my knowledge!
+
+  The OLSR-RFC definitions can be found in the olsr_protocol header file.
+
+
+2. EXTENTIONS
+
+  This version also has some extentions which are part of other projects:
+
+  Plugins:
+
+  - Secure OLSR plugin. This plugin adds a signature to all messages
+    to ensure data integrity. This way only nodes with access to the
+    shared key can participate in the routing.
+    The key is read as the first 128 bits from /root/.olsr/olsrd_secure_key
+    You need to have the OpenSSL libs installed to use this plugin.
+
+  - Powerplugin. A plugin that uses OLSRs MPR flooding to spread information
+    about the powerstatus of nodes.
+
+  - Dynamic Internet gateway. A plugin that dynamically adds and removes Internet
+    HNA transmissions based on if there exists a default gateway to Internet
+    with hopcount = 0(non OLSR gateway).
+
+  Built in:
+
+  - IPC to GUI front-end. A gui front-end can connect to the daemon
+    if started with the -ipc switch or set in the configfile.
+
+  - Gateway tunneling. This is not easly configurated! For testing purposes.
+    This functioning will be updated in a later version. Do not try to
+    use this except you are 100% sure you need it!!
+
+  - Optional deletion of default gateways when recieving a 0.0.0.0/0.0.0.0
+    gw(in HNA).
+
+
+3. COMPILING & INSTALLING
+
+  The makefile is updated in this version.
+  To install to a directoy different from / use INSTALL_PREFIX=targetdir
+  To use other compilers set CC=yourcompiler
+  All this can be done on the command line(or in scripts), so there should
+  not be any need to update the Makefile for different environments.
+
+  These changes also go for the pluginmakefiles.
+
+  To compile:
+  'make'
+
+  To install(you must be root):
+  'make install'
+
+  This also installs the standard configuration file((PREFIXDIR)/etc/olsrd.conf)
+  YOU MUST EDIT THIS FILE!
+
+  To clean up object files run
+  'make clean'
+
+
+  To compile and install the power plugin:
+  cd lib/power
+  make; make install
+
+  To compile and install the dynamic GW plugin:
+  cd lib/dyn_gw
+  make; make install
+
+4. CONFIGURING & RUNNING:
+
+  OBS!!!!
+  Edit the configuration file to fit your needs.
+
+  Options in the config file can also be overridden by command line 
+  options. See the manual page olsrd(8) for details.
+
+  To run the daemon you MUST specify which interface(s) to use either in
+  the config file or by using the -i option.
+
+  The binary is named 'olsrd' and is installed in (PREFIX)/usr/sbin. 
+  You must have root privelegies to run olsrd!
+
+  To run the daemon in the background you can either start olsrd
+  with the '-d 0' switch or set DEBUG to 0 in the config file.
+
+  To use plugins add them to the configfile as explained in the file.
+
+  4.1 SOME COMMAND-LINE OPTIONS:
+
+  DEPRECATED
+  See the manpage for command line options.
+
+5. BUGS
+
+  Problems have been reported when running in daemon mode(DEBUG 0). If this
+  causes problems and you need to run olsrd in the background you could
+  just redirect output to /dev/null( > /dev/null)
+
+
+6. FRONT-END
+
+  6.1 COMPILING
+
+    To compile:
+    cd fron-end
+    make
+    The binary is put in the bin directory
+
+  6.2 RUNNING
+
+    To run simply:
+    cd bin
+    ./olsrd-gui
+    REMEMBER olsrd must be started using the -ipc switch or the
+    IPC option must be set to yes to be able to use the GUI front-end
+
+  6.3 BUGS
diff --git a/README-WIN32.txt b/README-WIN32.txt
new file mode 100644 (file)
index 0000000..1397bfe
--- /dev/null
@@ -0,0 +1,197 @@
+
+                        UniK OLSR for Windows
+                        ---------------------
+
+Welcome to the first Windows release. Let's have a quick look at how
+this version is different from the original Linux version.
+
+                        ***** Stability *****
+
+  While the Windows version looks pretty stable in basic scenarios, it
+  hasn't yet received the extensive testing by the OLSR community that
+  the Linux version has gone through. So, if you experience any
+  strange behaviour, it's probably my fault. In this case please bear
+  with me and send me a bug report via the OLSR-users mailing
+  list. I'll then do my best to find and fix the problem with your
+  assistance.
+
+                    ***** Configuration file *****
+
+  If you do not specify a configuration file, the OLSR server by
+  default attempts to use "olsrd.conf" in your Windows directory,
+  e.g. "C:\WINDOWS\olsrd.conf".
+
+                     ***** Interface naming *****
+
+  On Linux network interfaces have nice names like "eth0". In
+  contrast, Windows internally identifies network interfaces by pretty
+  awkward names, for example:
+
+    "{EECD2AB6-C2FC-4826-B92E-CAA53B29D67C}"
+
+  Hence, the Windows version implements its own naming scheme that
+  maps each internal name to a made-up name like "if03", which is
+  easier to memorize. Simply invoke the OLSR executable as follows to
+  obtain the OLSR server's view of your interfaces:
+
+    olsrd.exe -int
+
+  This lists the made-up interface names along with their current IP
+  addresses to enable you to find out which made-up interface name
+  belongs to which of your physical interfaces.
+
+  For techies: The made-up names consist of the string "if" followed
+  by a two-digit hex representation of the least significant byte of
+  the Windows-internal interface index, which should be different for
+  each interface and thus make each made-up name unique. Again, this
+  is undocumented and this assumption may be wrong in certain
+  cases. So, if the "-int" option reports two interfaces that have the
+  same name, please do let me know.
+
+                     ***** Running the GUI *****
+
+  The GUI is a GTK+ application and thus requires the GTK+ runtime
+  environment to work. The Windows port of GTK+ is available from the
+  following URL:
+
+    http://www.gimp.org/~tml/gimp/win32/downloads.html
+
+  You need to download the following packages or newer versions of
+  these packages:
+
+    - atk-1.6.0.zip
+    - gettext-runtime-0.13.1.zip
+    - glib-2.4.5.zip
+    - gtk+-2.4.7.zip
+    - libiconv-1.9.1.bin.woe32.zip
+    - pango-1.4.1.zip
+
+  Simply unzip the files into a directory that you've created,
+  e.g. into "GUI". Then copy the "olsrd-gui.exe" file into the "bin"
+  subdirectory, e.g. into "GUI\bin", and run it from there.
+
+                     ***** Missing features *****
+
+  The Windows version currently does not implement the following
+  features known from the Linux release.
+
+    * IPv6. This will probably be in version 0.4.7.
+
+    * Link layer statistics.
+
+    * WLAN interface detection. The Windows port does not recognize
+      whether an interface is a WLAN interface or a wired LAN
+      interface.  All specified interfaces are assumed to be WLAN
+      interfaces. So, for example, specifying a different HELLO
+      interval for wired interfaces does not currently work. Instead,
+      the HELLO interval for WLAN interfaces is always used.
+
+    * Gateway tunnelling. This is currently experimental on
+      Windows. It is intended to work reliably on Windows 2000 and
+      Windows XP in version 0.4.7. It is based on the ipinip.sys
+      device driver that comes with these operating systems, but which
+      is completely undocumented. I've figured out how to use the
+      device driver, but it looks like I've still missed one or two
+      little things. So, tunnelling might work on your OS version, but
+      it might as well not work. Unfortunately, currently I do not
+      even know why it works on some systems and fails on other
+      systems.
+
+      If you are brave, do the following, but be prepared for a BSOD
+      (blue screen of death) as a worst-case scenario. This is nothing
+      for the faint of the heart. :-) Never try this on production
+      systems.
+
+        * Start the IP-in-IP tunnel driver before running the OLSR
+          server:
+
+            net start ipinip
+
+        * When the OLSR server reports that the tunnel has been
+          established, find out, which interface index the tunnel
+          device has been assigned:
+
+            route print
+
+        * Let's assume that the interface index is 0x1234 and the
+          gateway's IP address is 1.2.3.4. Manually add a default
+          route through the other end of the tunnel:
+
+            route add 0.0.0.0 mask 0.0.0.0 1.2.3.4 if 0x1234
+
+        * Try to ping somebody beyond the gateway and let me know
+          whether it works. If it doesn't and if you have time, please
+          do a packet dump for me to determine whether IP-in-IP
+          packets are leaving your system and, if yes, what they look
+          like.
+
+      If you know of any freely available tunnel driver for Windows,
+      please let me know. We could then think about switching from the
+      native ipinip.sys driver to an alternative driver, perhaps one
+      that also works on Windows 9x.
+
+      If you are the Microsoft person that is responsible for the
+      tunnel driver, please have a look at my code in
+      src/win32/tunnel.* and tell me what I'm missing.
+
+    * Multiple interfaces in the same subnet. As they all share the
+      same subnet broadcast address, there's no way to tell Windows
+      which of these interfaces to send OLSR packets through. I guess
+      that we'll have to come up with a device driver that sits
+      between the TCP/IP stack and the network adapters and that
+      directs outbound OLSR packets to the correct interface after
+      they've been routed by the TCP/IP stack. Looks like there isn't
+      any other solution on Windows.
+
+  There are also some Windows-specific features that I currently work
+  on, but which have not made it into this release.
+
+    * A nice installation package based on Inno Setup 4. However,
+      there will always be a ZIP archive available, too, for those who
+      do not like installation packages.
+
+    * The option to run the OLSR server as a Windows service on
+      Windows NT, 2000, and XP.
+
+  These features will probably be in 0.4.7.
+
+                        ***** Compiling *****
+
+  To compile the Windows version you need a Cygwin installation with a
+  current version of GCC and Mingw32. Currently the OLSR server, the
+  GUI, and the dot_draw plugin compile. Each of the corresponding
+  subdirectories contains a shell script named "mkmf.sh" that takes
+  "Makefile.win32.in" as its input, appends the dependencies, and
+  outputs "Makefile.win32". Then simply say
+
+    make -f Makefile.win32 clean
+
+  to remove any compiled files or
+
+    make -f Makefile.win32 mclean
+
+  to remove any compiled files and the generated makefile. Say
+
+    make -f Makefile.win32
+
+  to compile the source code.
+
+  To compile the GUI you additionally need the development packages of
+  the GTK+ Windows port. They are available from the same URL as the
+  GTK+ runtime environment. You need the following packages or newer
+  versions of these packages:
+
+    - atk-dev-1.6.0.zip
+    - glib-dev-2.4.5.zip
+    - gtk+-dev-2.4.7.zip
+    - pango-dev-1.4.1.zip
+
+  Simply unzip the files into a directory that you've created and make
+  the variable "GTKBASE" in "Makefile.win32" point to this directory.
+
+Well, thanks for using the initial release of a piece of software and
+please bear with me if there are any problems. Please do also feel
+free to suggest any features that you'd like to see in future
+releases.
+
+Thomas Lopatic <thomas@lopatic.de>, 2004-08-24
diff --git a/bin/olsrd b/bin/olsrd
new file mode 100755 (executable)
index 0000000..3e827c5
Binary files /dev/null and b/bin/olsrd differ
diff --git a/files/olsrd.8.gz b/files/olsrd.8.gz
new file mode 100644 (file)
index 0000000..69020dd
Binary files /dev/null and b/files/olsrd.8.gz differ
diff --git a/files/olsrd.conf.default b/files/olsrd.conf.default
new file mode 100644 (file)
index 0000000..a9f8f47
--- /dev/null
@@ -0,0 +1,205 @@
+#
+# UniK OLSR daemon config file
+#
+# This file was shipped with olsrd 0.4.6
+#
+# Lines starting with a # are discarded
+#
+
+# Debug level(0-9)
+# If set to 0 the daemon runs in the background
+
+DEBUG          1
+
+# IP version to use (4 or 6)
+
+IPVERSION      4
+
+# HNA IPv4 routes
+# syntax: netaddr netmask
+# Example Internet gateway:
+# HNA4 0.0.0.0 0.0.0.0
+
+#HNA4 15.15.0.0 255.255.255.0
+
+# HNA IPv6 routes
+# syntax: netaddr prefix
+# Example Internet gateway:
+#HNA6 :: 0
+
+#HNA6 fec0:2200:106:: 48
+
+# A list of whitespace separated interface names
+
+INTERFACES     eth1 eth0
+
+# 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"
+
+ALLOW_NO_INT   yes
+
+
+# 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
+#
+# ONE PLUGIN PR. LINE
+
+#LOAD_PLUGIN   olsrd_secure.so.0.3
+#LOAD_PLUGIN   olsrd_dyn_gw.so.0.1
+#LOAD_PLUGIN   olsrd_power.so.0.1
+
+# IPv4 broadcast address to use. The
+# one usefull example would be 255.255.255.255
+# 'auto' uses the broadcastaddress
+# every card is configured with
+
+IP4BROAD       auto
+
+# IPv6 address scope to use.
+# Must be 'site-local' or 'global'
+
+IP6ADDRTYPE    site-local
+
+# IPv6 multicast address to use when
+# using site-local addresses.
+# 'auto' uses the default ff05::15
+
+IP6MULTI-SITE  auto
+
+# IPv6 multicast address to use when
+# using global addresses
+# 'auto' uses the default ff0e::1
+
+IP6MULTI-GLOBAL        auto
+
+# Polling rate in seconds(float). 
+# Auto uses default value 0.1 sec
+
+POLLRATE       auto
+
+# Hello interval in seconds(float)
+# auto uses RFC proposed value
+
+HELLOINT       auto
+
+# HELLO hold time as a multiplier
+# of the HELLOINT. Auto is the
+# RFC proposed interval
+
+HELLOMULTI     auto
+
+# TC interval in seconds(float)
+# auto uses RFC proposed value
+
+TCINT          auto
+
+# TC hold time as a multiplier
+# of the TCINT. Auto is the
+# RFC proposed interval
+
+TCMULTI                auto
+
+# HELLO interval for sending
+# interval/holding time for wired
+# links. This is a multiplier of
+# the HELLOINT value. Auto is 2
+
+NWHELLOINT     auto
+
+# HELLO hold time for wired links,
+# as a multiplier of the NWHELLOINT. 
+# Auto is NWHELLOINT * 3.
+
+NWHELLOMULTI   auto
+
+# MID interval in seconds(float)
+# auto uses RFC proposed value
+
+MIDINT         auto
+
+# MID hold time as a multiplier
+# of the MIDINT. Auto is the
+# RFC proposed interval
+
+MIDMULTI       auto
+
+# HNA interval in seconds(float)
+# auto uses 3*TCINT
+
+HNAINT         auto
+
+# HNA hold time as a multiplier
+# of the HNAINT. Auto is the
+# RFC proposed interval
+
+HNAMULTI       auto
+
+# TOS(type of service) value for
+# the IP header of control traffic.
+# auto is 16
+
+TOSVALUE       auto
+
+# The fixed willingness to use(0-7)
+# or "auto" to set willingness dynammically
+# based on battery/power status
+
+WILLINGNESS            auto
+
+# Allow processes like the GUI front-end
+# to connect to the daemon. 'yes' or 'no'
+
+IPC-CONNECT            no
+
+
+# Wether to use hysteresis or not
+# Hysteresis adds more robustness to the
+# link sensing but delays neighbor registration.
+# Used by default. 'yes' or 'no'
+
+USE_HYSTERESIS yes
+
+# 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!!
+
+HYST_SCALING   auto
+HYST_THR_HIGH  auto
+HYST_THR_LOW   auto
+
+
+# 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
+#
+# auto - defaults to 0
+
+TC_REDUNDANCY  auto
+
+
+#
+# MPR redundancy
+# Specifies how many MPRs a node should
+# try select to reach every 2 hop neighbor
+#
+# Can be set to any integer >0
+#
+# auto - defaults to 1
+
+MPR_COVERAGE   auto
diff --git a/files/olsrd.conf.default.win32 b/files/olsrd.conf.default.win32
new file mode 100644 (file)
index 0000000..338b515
--- /dev/null
@@ -0,0 +1,196 @@
+#
+# UniK OLSR daemon config file
+#
+# Lines starting with a # are discarded
+#
+
+# Debug level(0-9)
+# If set to 0 the daemon runs in the background
+
+DEBUG          1
+
+# IP version to use (4 or 6)
+
+IPVERSION      4
+
+# HNA IPv4 routes
+# syntax: netaddr netmask
+# Example Internet gateway:
+# HNA4 0.0.0.0 0.0.0.0
+
+#HNA4 15.15.0.0 255.255.255.0
+
+# HNA IPv6 routes
+# syntax: netaddr prefix
+# Example Internet gateway:
+#HNA6 :: 0
+
+#HNA6 fec0:2200:106:: 48
+
+# A list of whitespace separated interface names
+
+INTERFACES     int65539
+
+
+# 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
+#
+# ONE PLUGIN PR. LINE
+
+#LOAD_PLUGIN   olsrd_secure.so.0.2
+#LOAD_PLUGIN   olsrd_dyn_gw.so.0.1
+#LOAD_PLUGIN   olsrd_power.so.0.1
+
+# IPv4 broadcast address to use. The
+# one usefull example would be 255.255.255.255
+# 'auto' uses the broadcastaddress
+# every card is configured with
+
+IP4BROAD       auto
+
+# IPv6 address scope to use.
+# Must be 'site-local' or 'global'
+
+IP6ADDRTYPE    site-local
+
+# IPv6 multicast address to use when
+# using site-local addresses.
+# 'auto' uses the default ff05::15
+
+IP6MULTI-SITE  auto
+
+# IPv6 multicast address to use when
+# using global addresses
+# 'auto' uses the default ff0e::1
+
+IP6MULTI-GLOBAL        auto
+
+# Polling rate in seconds(float). 
+# Auto uses default value 0.1 sec
+
+POLLRATE       auto
+
+# Hello interval in seconds(float)
+# auto uses RFC proposed value
+
+HELLOINT       auto
+
+# HELLO hold time as a multiplier
+# of the HELLOINT. Auto is the
+# RFC proposed interval
+
+HELLOMULTI     auto
+
+# TC interval in seconds(float)
+# auto uses RFC proposed value
+
+TCINT          auto
+
+# TC hold time as a multiplier
+# of the TCINT. Auto is the
+# RFC proposed interval
+
+TCMULTI                auto
+
+# HELLO interval for sending
+# interval/holding time for wired
+# links. This is a multiplier of
+# the HELLOINT value. Auto is 2
+
+NWHELLOINT     auto
+
+# HELLO hold time for wired links,
+# as a multiplier of the NWHELLOINT. 
+# Auto is NWHELLOINT * 3.
+
+NWHELLOMULTI   auto
+
+# MID interval in seconds(float)
+# auto uses RFC proposed value
+
+MIDINT         auto
+
+# MID hold time as a multiplier
+# of the MIDINT. Auto is the
+# RFC proposed interval
+
+MIDMULTI       auto
+
+# HNA interval in seconds(float)
+# auto uses 3*TCINT
+
+HNAINT         auto
+
+# HNA hold time as a multiplier
+# of the HNAINT. Auto is the
+# RFC proposed interval
+
+HNAMULTI       auto
+
+# TOS(type of service) value for
+# the IP header of control traffic.
+# auto is 16
+
+TOSVALUE       auto
+
+# The fixed willingness to use(0-7)
+# or "auto" to set willingness dynammically
+# based on battery/power status
+
+WILLINGNESS            auto
+
+# Allow processes like the GUI front-end
+# to connect to the daemon. 'yes' or 'no'
+
+IPC-CONNECT            no
+
+
+# Wether to use hysteresis or not
+# Hysteresis adds more robustness to the
+# link sensing but delays neighbor registration.
+# Used by default. 'yes' or 'no'
+
+USE_HYSTERESIS yes
+
+# 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!!
+
+HYST_SCALING   auto
+HYST_THR_HIGH  auto
+HYST_THR_LOW   auto
+
+
+# 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
+#
+# auto - defaults to 0
+
+TC_REDUNDANCY  auto
+
+
+#
+# MPR redundancy
+# Specifies how many MPRs a node should
+# try select to reach every 2 hop neighbor
+#
+# Can be set to any integer >0
+#
+# auto - defaults to 1
+
+MPR_COVERAGE   auto
diff --git a/front-end/CHANGELOG b/front-end/CHANGELOG
new file mode 100644 (file)
index 0000000..a65c586
--- /dev/null
@@ -0,0 +1,39 @@
+CHANGELOG AS OF 0.2.2
+
+0.2.6 -------------------------------------------------
+
+Minor updates
+
+UPDATES
+Some simple code rewrites and bugfixes.
+Route deletion using IPv6 should work now.
+
+
+0.2.5 -------------------------------------------------
+
+Lots of updates.
+
+REWRITES
+
+Rewritten queuing structure.
+Route information is removed from main tab.
+
+PIGGYBACKING
+
+The front-end now supports piggybacked messages.
+
+
+0.2.2 -------------------------------------------------
+
+HELLO PARSING ERROR
+
+The parsing of HELLO messages didnt handle grous of neighbors
+bigger than 1 if there existed more than one group. This because
+the implementation did not check for several IP addresses but
+just incremented the struct-array index. A kindof ugly hack fixed
+this.
+
+MESSAGE RECIEVING
+
+Recieving of messages not complete - fixed. One could risk just recieving
+half a message the way it used to be implemented.
diff --git a/front-end/Makefile b/front-end/Makefile
new file mode 100644 (file)
index 0000000..9377d05
--- /dev/null
@@ -0,0 +1,26 @@
+CC=    gcc
+#CC=     arm-linux-gcc
+
+CFLAGS= -Wall `pkg-config --cflags gtk+-2.0` #-g #to use GDB
+LFLAGS= `pkg-config --libs gtk+-2.0`
+
+SRCS=  src/main.c src/interface.c src/callbacks.c src/ipc.c \
+       src/packet.c src/nodes.c src/routes.c
+
+OBJS=  src/main.o src/interface.o src/callbacks.o src/ipc.o \
+       src/packet.o src/nodes.o src/routes.o
+
+HDRS=  src/main.h src/interface.h src/callbacks.h src/ipc.h \
+       src/olsr.h src/types.h src/packet.h src/nodes.h \
+       src/pixmaps.h src/routes.h
+
+all:   olsrd-gui
+
+olsrd-gui:     $(OBJS)
+       $(CC) $(LFLAGS) -o bin/$@ $(OBJS)
+
+clean:
+       rm -f $(OBJS)
+
+install:
+       cp ./bin/olsrd-gui /usr/bin/
diff --git a/front-end/Makefile.win32.in b/front-end/Makefile.win32.in
new file mode 100644 (file)
index 0000000..a151b50
--- /dev/null
@@ -0,0 +1,38 @@
+GTKBASE =      ../../gtk
+
+OBJS =         src/main.o \
+               src/interface.o \
+               src/callbacks.o \
+               src/ipc.o \
+               src/packet.o \
+               src/nodes.o \
+               src/routes.o \
+               src/win32/compat.o
+
+%.o:           %.c
+               gcc -mno-cygwin -mms-bitfields -O2 -Wall -c -DWIN32 \
+               -Isrc/win32 \
+                -I$(GTKBASE)/include/gtk-2.0 \
+                -I$(GTKBASE)/include/glib-2.0 \
+                -I$(GTKBASE)/lib/gtk-2.0/include \
+                -I$(GTKBASE)/lib/glib-2.0/include \
+                -I$(GTKBASE)/include/pango-1.0 \
+                -I$(GTKBASE)/include/atk-1.0 \
+                -o$@ $<
+
+olsrd-gui:     $(OBJS)
+               gcc -mno-cygwin -o olsrd-gui.exe $(OBJS) \
+                -lws2_32 \
+                -L$(GTKBASE)/lib \
+                -llibgtk-win32-2.0 \
+                -llibgdk-win32-2.0 \
+                -llibglib-2.0 \
+                -llibgobject-2.0
+
+clean:
+               rm -f olsrd-gui.exe
+               find . -name \*~ -exec rm -f {} \;
+               find src -name \*.o -exec rm -f {} \;
+
+mclean:                clean
+               rm -f Makefile.win32
diff --git a/front-end/bin/olsrd-gui b/front-end/bin/olsrd-gui
new file mode 100755 (executable)
index 0000000..cba62ab
Binary files /dev/null and b/front-end/bin/olsrd-gui differ
diff --git a/front-end/mkmf.sh b/front-end/mkmf.sh
new file mode 100755 (executable)
index 0000000..2acc4e2
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+srcs="\
+    src/main.c \
+    src/interface.c \
+    src/callbacks.c \
+    src/ipc.c \
+    src/packet.c \
+    src/nodes.c \
+    src/routes.c \
+    src/win32/compat.c \
+    "
+
+rm -f Makefile.win32
+cp Makefile.win32.in Makefile.win32
+
+echo >>Makefile.win32
+echo \# >>Makefile.win32
+echo \# DEPENDENCIES >>Makefile.win32
+echo \# >>Makefile.win32
+
+for f in $srcs; do
+    echo >>Makefile.win32
+    echo \# $f >>Makefile.win32
+    echo >>Makefile.win32
+
+    o=`echo $f | sed -e 's/c$/o/'`
+
+    gcc -MM -MT $o -mno-cygwin -mms-bitfields -O2 -Wall -c -DWIN32 -Isrc/win32 $f >>Makefile.win32
+done
diff --git a/front-end/src/callbacks.c b/front-end/src/callbacks.c
new file mode 100644 (file)
index 0000000..42bea34
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "common.h"
+
+
diff --git a/front-end/src/callbacks.h b/front-end/src/callbacks.h
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/front-end/src/common.h b/front-end/src/common.h
new file mode 100644 (file)
index 0000000..056abff
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ *Andreas Tønmnesen
+ */
+
+#ifndef _OLSRD_FORNTEND_COMMON
+#define _OLSRD_FORNTEND_COMMON
+
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <string.h>
+
+//#include "interface.h"
+#include "callbacks.h"
+//#include "types.h"
+#include "olsr_protocol.h"
+
+#define SOFTWARE_VERSION "uOLSRd GUI 0.2.6" 
+#define IPC_INTERVAL 500 //interval for IPC read timeout
+#define MAXPACKS 20
+#define BUFFSIZE 512
+
+
+extern int connected;
+extern struct timeval hold_time_nodes; /* Timeout for all nodes */
+extern struct timeval now;
+
+
+/* Our address */
+union olsr_ip_addr main_addr;
+union olsr_ip_addr null_addr;
+
+int ipversion;
+int ipsize;
+char ipv6_buf[100];      /* buffer for IPv6 inet_htop */
+
+int nodes_timeout;
+
+int freeze_packets;
+int display_dec;
+extern int timeouts;
+
+/*
+ *Node info
+ */
+
+
+struct mid
+{
+  union olsr_ip_addr alias;
+  struct mid *next;
+  struct mid *prev;
+};
+
+struct hna
+{
+  union olsr_ip_addr net;
+  union olsr_ip_addr mask;
+  struct hna *next;
+  struct hna *prev;
+};
+
+struct mpr
+{
+  union olsr_ip_addr addr;
+  struct timeval timer;
+  struct mpr *next;
+  struct mpr *prev;
+};
+
+
+struct node
+{
+  union olsr_ip_addr addr;
+  union olsr_ip_addr gw_addr;
+  int hopcount;
+  int display;
+  char dev[5];
+  struct mid mid;
+  struct hna hna;
+  struct mpr mpr;
+  struct timeval timer;
+  struct node *next;
+  struct node *prev;
+};
+
+
+
+
+
+
+/*
+ *Interface public
+ */
+
+
+GtkWidget * 
+create_main_window (void);
+
+
+void
+packet_list_add(char *, char *, char *);
+
+void
+route_list_add(char *, char *, char *, char *);
+
+int
+route_list_del(char *);
+
+void
+route_list_update(char *);
+
+
+void
+set_net_info(gchar *, int);
+
+void
+set_net_info_offline();
+
+void
+update_nodes_list(struct node *);
+
+int
+remove_nodes_list(union olsr_ip_addr *);
+
+/*
+ *IPC public
+ */
+int
+ipc_connect();
+
+int
+ipc_close();
+
+int
+ipc_read();
+
+int
+ipc_send();
+
+
+char *
+ip_to_string(union olsr_ip_addr *);
+
+int
+gui_itoa(int, char *);
+
+
+/*
+ *Packet.c public
+ */
+
+int
+add_packet_to_buffer(union olsr_message *, int);
+
+
+union olsr_message *
+get_packet(int);
+
+
+
+/*
+ *Nodes.c public
+ */
+
+
+
+void
+init_nodes();
+
+struct node *
+find_node(char *);
+
+struct node *
+find_node_t(union olsr_ip_addr *);
+
+int
+update_timer_node(union olsr_ip_addr *, olsr_u8_t);
+
+int
+add_hna_node(union olsr_ip_addr *, union olsr_ip_addr *, union olsr_ip_addr *, olsr_u8_t);
+
+int
+add_mid_node(union olsr_ip_addr *, union olsr_ip_addr *, olsr_u8_t);
+
+void
+init_timer(olsr_u32_t, struct timeval *);
+
+gint
+time_out_nodes(gpointer);
+
+int
+add_node(union olsr_ip_addr *, olsr_u8_t);
+
+int
+add_mpr(union olsr_ip_addr *, union olsr_ip_addr *, struct timeval *);
+
+int
+update_timer_mpr(union olsr_ip_addr *, union olsr_ip_addr *, olsr_u8_t);
+
+int
+time_out_mprs(union olsr_ip_addr *);
+
+
+
+#endif
diff --git a/front-end/src/interface.c b/front-end/src/interface.c
new file mode 100644 (file)
index 0000000..3c13690
--- /dev/null
@@ -0,0 +1,1545 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+#include "common.h"
+#include "interface.h"
+#include "pixmaps.h"
+
+/* Global widgets */
+/* GtkWidget *text1; */
+GtkWidget *net_label;
+GtkWidget *info_label;
+GtkTextBuffer *textBuffer;
+GtkWidget *connect_button;
+GtkWidget *packet_list;
+GtkWidget *packet_content_list;
+GtkWidget *packet_button;
+GtkWidget *packet_disp_button;
+GtkWidget *node_list;
+GtkWidget *mid_list;
+GtkWidget *mpr_list;
+GtkWidget *hna_list;
+GtkWidget *route_list;
+
+GdkBitmap *mask;
+
+int packet_list_size = 0;
+int route_list_size = 0;
+int node_list_size = 0;
+
+GtkWidget *main_window;
+
+GtkWidget*
+create_main_window (void)
+{
+  GtkWidget *notebook1;
+  GtkWidget *frame3;
+  GtkWidget *frame4;
+  GtkWidget *hbox1;
+  GtkWidget *vbox1;
+  GtkWidget *scrolledwindow1;
+  GtkWidget *node_label1;
+  GtkWidget *node_label2;
+  GtkWidget *node_label3;
+  GtkWidget *node_label4;
+  GtkWidget *node_label7;
+  GtkWidget *node_label8;
+  GtkWidget *node_label9;
+  GtkWidget *mid_frame;
+  GtkWidget *mpr_frame;
+  GtkWidget *hna_frame;
+  GtkWidget *mid_scrolledwindow;
+  GtkWidget *mpr_scrolledwindow;
+  GtkWidget *hna_scrolledwindow;
+  GtkWidget *Main;
+  GtkWidget *label_routes;
+  GtkWidget *hbox2;
+  GtkWidget *frame2;
+  GtkWidget *scrolledwindow4;
+  GtkWidget *label17;
+  GtkWidget *label18;
+  GtkWidget *label19;
+  GtkWidget *scrolledwindow3;
+  GtkWidget *label13;
+  GtkWidget *label14;
+  GtkWidget *label15;
+  GtkWidget *label16;
+  GtkWidget *label_packets;
+  //GtkWidget *empty_notebook_page2;
+  GtkWidget *label3;
+  GtkWidget *net_vbox;
+  GtkWidget *pack_vbox;
+  GtkWidget *pack_disp_vbox;
+  GtkWidget *disp_frame;
+  GtkWidget *route_frame;
+  GtkWidget *route_stats_frame;
+  GtkWidget *route_scrolledwindow;
+  GtkWidget *route_label1;
+  GtkWidget *route_label2;
+  GtkWidget *route_label3;
+  GtkWidget *route_label4;
+  GtkWidget *route_hbox1;
+
+  GtkWidget *traffic_label;
+
+  GtkWidget *settings_label;
+  GtkWidget *settings_hbox1;
+
+  GtkWidget *about_hbox1;
+  GtkWidget *about_label;
+
+  GtkWidget *empty1;
+
+  GdkPixmap *unik_logo_gdk;
+  GtkWidget *unik_logo;
+
+  /*
+   *The main window
+   */
+
+  main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_object_set_data (GTK_OBJECT (main_window), "main_window", main_window);
+  gtk_window_set_title (GTK_WINDOW (main_window), (SOFTWARE_VERSION));
+  gtk_window_set_default_size(GTK_WINDOW (main_window), 600, 550);
+  gtk_signal_connect(GTK_OBJECT(main_window),
+                    "destroy",
+                    GTK_SIGNAL_FUNC(gui_shutdown),
+                    //GTK_SIGNAL_FUNC(gtk_main_quit),
+                    NULL);
+  gtk_window_set_position(GTK_WINDOW(main_window), GTK_WIN_POS_CENTER); /* Position window in center */
+  gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, TRUE, TRUE); /* No user-resizing */
+
+  /*
+   *Initialize the pixmaps
+   */
+  unik_logo_gdk = gdk_pixmap_colormap_create_from_xpm_d (NULL, gtk_widget_get_colormap(main_window), &mask, NULL, (gchar **)logo_xpm);
+
+  unik_logo = gtk_pixmap_new(unik_logo_gdk, mask);
+
+  /*
+   *The notebook
+   */
+
+  notebook1 = gtk_notebook_new ();
+  gtk_widget_ref (notebook1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "notebook1", notebook1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (notebook1);
+  gtk_container_add (GTK_CONTAINER (main_window), notebook1);
+
+
+
+  /*
+   *The first vbox
+   */
+  vbox1 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (vbox1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox1", vbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (vbox1);
+  //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
+  gtk_container_add (GTK_CONTAINER (notebook1), vbox1);
+
+
+
+
+  /*
+   *The nodes frame
+   */
+  frame3 = gtk_frame_new ("Registered nodes:");
+  gtk_widget_ref (frame3);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "frame3", frame3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame3);
+  gtk_box_pack_start (GTK_BOX (vbox1), frame3, TRUE, TRUE, 0);
+  gtk_widget_set_size_request(frame3, -1, 300);
+  gtk_container_set_border_width (GTK_CONTAINER (frame3), 1);
+
+
+
+
+  /*
+   *The scrolled window to contain the node list
+   */
+
+  scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (scrolledwindow1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow1", scrolledwindow1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (scrolledwindow1);
+  gtk_container_add (GTK_CONTAINER (frame3), scrolledwindow1);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+  //gtk_box_pack_start (GTK_BOX (frame3), scrolledwindow1, TRUE, TRUE, 0);
+  //gtk_widget_set_usize (scrolledwindow1, -2, 332);
+
+  /*
+   *The node list
+   */
+  
+  node_list = gtk_clist_new (7);
+  gtk_widget_ref (node_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "node_list", node_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_list);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow1), node_list);
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 0, 150); /* IP */
+  //gtk_clist_set_column_justification(GTK_CLIST(node_list), 0, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 1, 150); /* gateway */
+  //gtk_clist_set_column_justification(GTK_CLIST(node_list), 1, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 2, 50); /* hopcount */
+  gtk_clist_set_column_justification(GTK_CLIST(node_list), 2, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 3, 80); /* dev */
+  gtk_clist_set_column_justification(GTK_CLIST(node_list), 3, GTK_JUSTIFY_CENTER);
+
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 4, 70); /* timer */
+  gtk_clist_set_column_justification(GTK_CLIST(node_list), 4, GTK_JUSTIFY_CENTER);
+  //gtk_clist_set_column_width (GTK_CLIST (node_list), 7, 100); /* last about */
+  //gtk_clist_set_column_justification(GTK_CLIST(node_list), 7, GTK_JUSTIFY_CENTER);
+
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 5, 40); /* MID */
+  gtk_clist_set_column_justification(GTK_CLIST(node_list), 5, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (node_list), 6, 40); /* HNA */
+  gtk_clist_set_column_justification(GTK_CLIST(node_list), 6, GTK_JUSTIFY_CENTER);
+
+  gtk_clist_column_titles_show (GTK_CLIST (node_list));
+
+  /*
+   *Row selection callback
+   */
+  gtk_signal_connect(GTK_OBJECT(node_list), "select_row",
+                    GTK_SIGNAL_FUNC(selection_made),
+                    NULL);
+
+  /*
+   *Column selection callback
+   */
+  gtk_signal_connect(GTK_OBJECT(node_list),
+                    "click_column",
+                    GTK_SIGNAL_FUNC(column_clicked_callback),
+                    NULL);
+
+  node_label1 = gtk_label_new ("Dest");
+  gtk_widget_ref (node_label1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "IP", node_label1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label1);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 0, node_label1);
+
+  node_label2 = gtk_label_new ("Gateway");
+  gtk_widget_ref (node_label2);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hops", node_label2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label2);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 1, node_label2);
+
+  node_label3 = gtk_label_new ("Metric");
+  gtk_widget_ref (node_label3);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "info", node_label3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label3);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 2, node_label3);
+
+  node_label4 = gtk_label_new ("Device");
+  gtk_widget_ref (node_label4);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "Device", node_label4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label4);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 3, node_label4);
+
+
+  node_label7 = gtk_label_new ("Timer");
+  gtk_widget_ref (node_label7);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "LMF", node_label7,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label7);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 4, node_label7);
+
+  /*
+  node_label8 = gtk_label_new ("LMA");
+  gtk_widget_ref (node_label8);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "LMA", node_label8,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label8);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 7, node_label8);
+  */
+
+  node_label8 = gtk_label_new ("MID");
+  gtk_widget_ref (node_label8);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "MID", node_label8,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label8);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 5, node_label8);
+
+  node_label9 = gtk_label_new ("HNA");
+  gtk_widget_ref (node_label9);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "HNA", node_label9,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (node_label9);
+  gtk_clist_set_column_widget (GTK_CLIST (node_list), 6, node_label9);
+
+
+
+  gtk_clist_column_titles_active(GTK_CLIST (node_list));
+
+
+  gtk_widget_show_now(node_list);
+
+
+
+  /*
+   *Row selection callback
+   */
+  gtk_signal_connect(GTK_OBJECT(node_list), "select_row",
+                    GTK_SIGNAL_FUNC(node_selection),
+                    NULL);
+
+
+
+
+
+  /*
+   *The first hbox
+   */
+  hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (hbox1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox1", hbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox1);
+  gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
+  //gtk_container_add (GTK_CONTAINER (notebook1), hbox1);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox1), 4);
+  gtk_widget_set_size_request(hbox1, -1, 200);
+
+
+
+  /*
+   *The net-info frame
+   */
+  frame4 = gtk_frame_new ("Info:");
+  gtk_widget_ref (frame4);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "frame4", frame4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame4);
+  gtk_box_pack_start (GTK_BOX (hbox1), frame4, TRUE, TRUE, 0);
+  //gtk_widget_set_size_request(frame4, 200, -1);
+  gtk_container_set_border_width (GTK_CONTAINER (frame4), 1);
+
+
+  /*
+   *The net-info hbox
+   */
+  net_vbox = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (net_vbox);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "net_vbox", net_vbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (net_vbox);
+  gtk_container_add (GTK_CONTAINER (frame4), net_vbox);
+
+
+  /*
+   *The net-info label field
+   */
+  net_label = gtk_label_new(NULL);
+  gtk_widget_ref (net_label);
+  gtk_misc_set_alignment((GtkMisc *)net_label, 0, 0);
+  //gtk_label_set_justify((GtkLabel *)net_label,GTK_JUSTIFY_LEFT);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "net_label", net_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  //set_net_info("Not connected...");
+  gtk_widget_show (net_label);
+  gtk_box_pack_start (GTK_BOX (net_vbox), net_label, TRUE, TRUE, 0);
+
+  //gtk_container_add (GTK_CONTAINER (frame4), net_label);
+
+  /*
+   *The connect button
+   */
+
+  connect_button = gtk_button_new_with_label ("Connect to localhost");
+  gtk_widget_ref (connect_button);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "connect_button", connect_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  /* Connect the "clicked" signal of the button to our callback */
+  gtk_signal_connect (GTK_OBJECT (connect_button), "clicked",
+                     GTK_SIGNAL_FUNC (connect_callback), NULL);
+  gtk_widget_show (connect_button);
+  gtk_box_pack_start (GTK_BOX (net_vbox), connect_button, FALSE, FALSE, 1);
+  gtk_container_set_border_width (GTK_CONTAINER (connect_button), 5);
+
+
+
+  /*
+   *The node MPR info frame
+   */
+  mpr_frame = gtk_frame_new ("MPR:");
+  gtk_widget_ref (mpr_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mpr_frame", mpr_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mpr_frame);
+  gtk_box_pack_start (GTK_BOX (hbox1), mpr_frame, FALSE, FALSE, 0);
+  //gtk_widget_set_size_request(mid_frame, 125, -1);
+  gtk_container_set_border_width (GTK_CONTAINER (mpr_frame), 1);
+
+  /*
+   *The scrolledwindow to contain the MPR node info
+   */
+  mpr_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (mpr_scrolledwindow);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mpr_scrolledwindow", mpr_scrolledwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  gtk_widget_show (mpr_scrolledwindow);
+  gtk_container_add (GTK_CONTAINER (mpr_frame), mpr_scrolledwindow);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (mpr_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+  gtk_container_set_border_width (GTK_CONTAINER (mpr_scrolledwindow), 3);
+
+
+  /*
+   *The node MID info frame
+   */
+  mid_frame = gtk_frame_new ("MID:");
+  gtk_widget_ref (mid_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mid_frame", mid_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mid_frame);
+  gtk_box_pack_start (GTK_BOX (hbox1), mid_frame, FALSE, FALSE, 0);
+  //gtk_widget_set_size_request(mid_frame, 125, -1);
+  gtk_container_set_border_width (GTK_CONTAINER (mid_frame), 1);
+
+  /*
+   *The scrolledwindow to contain the MID node info
+   */
+  mid_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (mid_scrolledwindow);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mid_scrolledwindow", mid_scrolledwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  gtk_widget_show (mid_scrolledwindow);
+  gtk_container_add (GTK_CONTAINER (mid_frame), mid_scrolledwindow);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (mid_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+  gtk_container_set_border_width (GTK_CONTAINER (mid_scrolledwindow), 3);
+
+
+
+  /*
+   *The MPR list
+   */
+  mpr_list = gtk_clist_new (1);
+  gtk_widget_ref (mpr_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mpr_list", mpr_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mpr_list);
+  gtk_container_add (GTK_CONTAINER (mpr_scrolledwindow), mpr_list);
+  gtk_clist_set_column_width (GTK_CLIST (mpr_list), 0, 120); /* IP */
+  gtk_clist_column_titles_hide (GTK_CLIST (mpr_list));
+
+
+  /*
+   *The MID list
+   */
+  mid_list = gtk_clist_new (1);
+  gtk_widget_ref (mid_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "mid_list", mid_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (mid_list);
+  gtk_container_add (GTK_CONTAINER (mid_scrolledwindow), mid_list);
+  gtk_clist_set_column_width (GTK_CLIST (mid_list), 0, 120); /* IP */
+  gtk_clist_column_titles_hide (GTK_CLIST (mid_list));
+
+
+
+
+  /*
+   *The node HNA info frame
+   */
+  hna_frame = gtk_frame_new ("HNA:");
+  gtk_widget_ref (hna_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hna_frame", hna_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hna_frame);
+  gtk_box_pack_start (GTK_BOX (hbox1), hna_frame, FALSE, FALSE, 0);
+  //gtk_widget_set_size_request(mid_frame, 125, -1);
+  gtk_container_set_border_width (GTK_CONTAINER (hna_frame), 1);
+
+
+
+  /*
+   *The HNA scrolled window
+   */
+  hna_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (hna_scrolledwindow);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hna_scrolledwindow", hna_scrolledwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  gtk_widget_show (hna_scrolledwindow);
+  gtk_container_add (GTK_CONTAINER (hna_frame), hna_scrolledwindow);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (hna_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+  gtk_container_set_border_width (GTK_CONTAINER (hna_scrolledwindow), 3);
+
+
+  /*
+   *The HNA list
+   */
+  hna_list = gtk_clist_new (1);
+  gtk_widget_ref (hna_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hna_list", hna_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hna_list);
+  gtk_container_add (GTK_CONTAINER (hna_scrolledwindow), hna_list);
+  gtk_clist_set_column_width (GTK_CLIST (hna_list), 0, 120); /* IP */
+  gtk_clist_column_titles_hide (GTK_CLIST (hna_list));
+
+
+
+
+
+  /*
+   *The "main" notebook page
+   */
+  Main = gtk_label_new ("Main");
+  gtk_widget_ref (Main);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "Main", Main,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (Main);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), Main);
+
+
+
+  /*
+   *The main hbox of the Packet page
+   */
+
+  hbox2 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (hbox2);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox2", hbox2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (hbox2);
+  gtk_container_add (GTK_CONTAINER (notebook1), hbox2);
+
+
+  /*
+   *The packet hbox
+   */
+  pack_vbox = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (pack_vbox);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "pack_vbox", pack_vbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (pack_vbox);
+  gtk_box_pack_start (GTK_BOX (hbox2), pack_vbox, TRUE, TRUE, 0);
+
+
+
+  /*
+   *The packet frame
+   */
+
+  frame2 = gtk_frame_new ("Packet");
+  gtk_widget_ref (frame2);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "frame2", frame2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (frame2);
+  gtk_box_pack_start (GTK_BOX (pack_vbox), frame2, TRUE, TRUE, 0); /* Do not expand */
+
+
+  /*
+   *Packet list scrolled window
+   */
+  scrolledwindow4 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (scrolledwindow4);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow4", scrolledwindow4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  gtk_widget_show (scrolledwindow4);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow4), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+  gtk_container_add (GTK_CONTAINER (frame2), scrolledwindow4);
+
+
+
+
+
+  /*
+   *The packet list
+   */
+
+  packet_list = gtk_clist_new (3);
+  gtk_widget_ref (packet_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "packet_list", packet_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (packet_list);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow4), packet_list);
+  gtk_clist_set_column_width (GTK_CLIST (packet_list), 0, 80); /* Type */
+  gtk_clist_set_column_width (GTK_CLIST (packet_list), 1, 150); /* Origin IP */
+  gtk_clist_set_column_width (GTK_CLIST (packet_list), 2, 20); /* size */
+  gtk_clist_column_titles_show (GTK_CLIST (packet_list));
+
+  label17 = gtk_label_new ("Type");
+  gtk_widget_ref (label17);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label17", label17,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label17);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_list), 0, label17);
+
+  label18 = gtk_label_new ("Origin");
+  gtk_widget_ref (label18);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label18", label18,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label18);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_list), 1, label18);
+
+  label19 = gtk_label_new ("Size");
+  gtk_widget_ref (label19);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label19", label19,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label19);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_list), 2, label19);
+
+
+
+  /*
+   *Row selection callback
+   */
+  gtk_signal_connect(GTK_OBJECT(packet_list), "select_row",
+                    GTK_SIGNAL_FUNC(packet_selection),
+                    NULL);
+
+
+
+  /*
+   *The packet button
+   */
+
+  packet_button = gtk_button_new_with_label ("Grab packets");
+  gtk_widget_ref (packet_button);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "packet_button", packet_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  /* Connect the "clicked" signal of the button to our callback */
+  gtk_signal_connect (GTK_OBJECT (packet_button), "clicked",
+                     GTK_SIGNAL_FUNC (packet_callback), NULL);
+  gtk_widget_show (packet_button);
+  gtk_box_pack_start (GTK_BOX (pack_vbox), packet_button, FALSE, FALSE, 5);
+
+
+
+
+
+
+  /*
+   *The packet disp hbox
+   */
+  pack_disp_vbox = gtk_vbox_new (FALSE, 0);
+  gtk_widget_ref (pack_disp_vbox);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "pack_disp_vbox", pack_disp_vbox,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (pack_disp_vbox);
+  gtk_box_pack_start (GTK_BOX (hbox2), pack_disp_vbox, TRUE, TRUE, 0);
+
+
+
+
+  /*
+   *The packet disp frame
+   */
+
+  disp_frame = gtk_frame_new ("Packet content");
+  gtk_widget_ref (disp_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "disp_frame", disp_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (disp_frame);
+  gtk_box_pack_start (GTK_BOX (pack_disp_vbox), disp_frame, TRUE, TRUE, 0); /* Do not expand */
+
+
+
+  /*
+   *Scrolled window for the packet display
+   *list
+   */
+
+  scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (scrolledwindow3);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow3", scrolledwindow3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (scrolledwindow3);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+  gtk_container_add (GTK_CONTAINER (disp_frame), scrolledwindow3);
+
+  //gtk_box_pack_start (GTK_BOX (disp_frame), scrolledwindow3, TRUE, TRUE, 0);
+
+
+  /*
+   *The packet display list
+   */
+  packet_content_list = gtk_clist_new (4);
+  gtk_widget_ref (packet_content_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "packet_content_list", packet_content_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+
+  gtk_widget_show (packet_content_list);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow3), packet_content_list);
+  gtk_clist_set_column_width (GTK_CLIST (packet_content_list), 0, 70); /* 0-7 */
+  gtk_clist_set_column_justification(GTK_CLIST (packet_content_list), 0, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (packet_content_list), 1, 70); /* 8-15 */
+  gtk_clist_set_column_justification(GTK_CLIST (packet_content_list), 1, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (packet_content_list), 2, 70); /* 16-23 */
+  gtk_clist_set_column_justification(GTK_CLIST (packet_content_list), 2, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (packet_content_list), 3, 70); /* 24-31 */
+  gtk_clist_set_column_justification(GTK_CLIST (packet_content_list), 3, GTK_JUSTIFY_CENTER);
+  gtk_clist_column_titles_show (GTK_CLIST (packet_content_list));
+
+  label13 = gtk_label_new ("0 - 7");
+  gtk_widget_ref (label13);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label13", label13,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label13);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_content_list), 0, label13);
+
+  label14 = gtk_label_new ("8 - 15");
+  gtk_widget_ref (label14);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label14", label14,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label14);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_content_list), 1, label14);
+
+  label15 = gtk_label_new ("16 - 23");
+  gtk_widget_ref (label15);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label15", label15,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label15);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_content_list), 2, label15);
+
+  label16 = gtk_label_new ("24 - 31");
+  gtk_widget_ref (label16);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label16", label16,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label16);
+  gtk_clist_set_column_widget (GTK_CLIST (packet_content_list), 3, label16);
+
+  //gtk_clist_set_selection_mode(GTK_CLIST (packet_content_list), GTK_SELECTION_NONE); /* no selections */
+
+
+
+  /*
+   *The packet button
+   */
+
+  packet_disp_button = gtk_button_new_with_label ("Display hex");
+  gtk_widget_ref (packet_disp_button);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "packet_disp_button", packet_disp_button,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  /* Connect the "clicked" signal of the button to our callback */
+  gtk_signal_connect (GTK_OBJECT (packet_disp_button), "clicked",
+                     GTK_SIGNAL_FUNC (packet_disp_callback), NULL);
+  gtk_widget_show (packet_disp_button);
+  gtk_box_pack_start (GTK_BOX (pack_disp_vbox), packet_disp_button, FALSE, FALSE, 5);
+
+
+  /*
+   *The "packets" notebook
+   */
+
+  label_packets = gtk_label_new ("Packets");
+  gtk_widget_ref (label_packets);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label_packets", label_packets,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label_packets);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), label_packets);
+
+
+
+
+
+
+  /*
+   *The route hbox
+   */
+  route_hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (route_hbox1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_hbox1", route_hbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_hbox1);
+  //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
+  gtk_container_add (GTK_CONTAINER (notebook1), route_hbox1);
+
+
+
+
+  /*
+   *The routes frame
+   */
+
+  route_frame = gtk_frame_new ("OLSR routes in kernel:");
+  gtk_widget_ref (route_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_frame", route_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_frame);
+
+  //gtk_container_add (GTK_CONTAINER (notebook1), route_frame);
+  gtk_widget_set_size_request(route_frame, 200, -1);
+  gtk_box_pack_start (GTK_BOX (route_hbox1), route_frame, TRUE, TRUE, 0); /* Do not expand */
+
+
+
+  /*
+   *Scrolled window for the packet display
+   *list
+   */
+
+  route_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_ref (route_scrolledwindow);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_scrolledwindow", route_scrolledwindow,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_scrolledwindow);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (route_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+  gtk_container_add (GTK_CONTAINER (route_frame), route_scrolledwindow);
+
+  //gtk_box_pack_start (GTK_BOX (route_frame), scrolledwindow3, TRUE, TRUE, 0);
+
+
+  /*
+   *The routes display list
+   */
+  route_list = gtk_clist_new (4);
+  gtk_widget_ref (route_list);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_list", route_list,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  gtk_widget_show (route_list);
+  gtk_container_add (GTK_CONTAINER (route_scrolledwindow), route_list);
+  gtk_clist_set_column_width (GTK_CLIST (route_list), 0, 120); /* dest */
+  //gtk_clist_set_column_justification(GTK_CLIST (route_list), 0, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (route_list), 1, 120); /* gw */
+  //gtk_clist_set_column_justification(GTK_CLIST (route_list), 1, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (route_list), 2, 50); /* weight */
+  gtk_clist_set_column_justification(GTK_CLIST (route_list), 2, GTK_JUSTIFY_CENTER);
+  gtk_clist_set_column_width (GTK_CLIST (route_list), 3, 70); /* interface */
+  gtk_clist_set_column_justification(GTK_CLIST (route_list), 3, GTK_JUSTIFY_CENTER);
+  gtk_clist_column_titles_show (GTK_CLIST (route_list));
+
+  route_label1 = gtk_label_new ("Destination");
+  gtk_widget_ref (route_label1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_label1", route_label1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_label1);
+  gtk_clist_set_column_widget (GTK_CLIST (route_list), 0, route_label1);
+
+  route_label2 = gtk_label_new ("Gateway");
+  gtk_widget_ref (route_label2);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_label2", route_label2,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_label2);
+  gtk_clist_set_column_widget (GTK_CLIST (route_list), 1, route_label2);
+
+  route_label3 = gtk_label_new ("Weight");
+  gtk_widget_ref (route_label3);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_label3", route_label3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_label3);
+  gtk_clist_set_column_widget (GTK_CLIST (route_list), 2, route_label3);
+
+  route_label4 = gtk_label_new ("Interface");
+  gtk_widget_ref (route_label4);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_label4", route_label4,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_label4);
+  gtk_clist_set_column_widget (GTK_CLIST (route_list), 3, route_label4);
+
+  //gtk_clist_set_selection_mode(GTK_CLIST (route_list), GTK_SELECTION_NONE); /* no selections */
+
+
+
+  /*
+   *The routes stats frame
+   */
+
+  route_stats_frame = gtk_frame_new ("Stats:");
+  gtk_widget_ref (route_stats_frame);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "route_stats_frame", route_stats_frame,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (route_stats_frame);
+
+  //gtk_container_add (GTK_CONTAINER (notebook1), route_frame);
+  gtk_box_pack_start (GTK_BOX (route_hbox1), route_stats_frame, TRUE, TRUE, 1);
+
+
+
+
+
+  /*
+   *The "routes" notebook
+   */
+  label_routes = gtk_label_new ("Routes");
+  gtk_widget_ref (label_routes);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "label_routes", label_routes,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label_routes);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), label_routes);
+
+
+
+
+  empty1 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (empty1);
+  gtk_container_add (GTK_CONTAINER (notebook1), empty1);
+
+
+
+
+
+
+
+  /*
+   *The "traffic" notebook
+   */
+  traffic_label = gtk_label_new ("Traffic");
+  gtk_widget_ref (traffic_label);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "traffic_label", traffic_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (traffic_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 3), traffic_label);
+  
+
+
+
+
+  /*
+   *The settings hbox
+   */
+  settings_hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (settings_hbox1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "settings_hbox1", settings_hbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (settings_hbox1);
+  //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
+  gtk_container_add (GTK_CONTAINER (notebook1), settings_hbox1);
+
+
+
+  /*
+   *The settings-info label field
+   */
+  info_label = gtk_label_new(NULL);
+  gtk_widget_ref (info_label);
+  gtk_misc_set_alignment((GtkMisc *)info_label, 0, 0);
+  //gtk_label_set_justify((GtkLabel *)net_label,GTK_JUSTIFY_LEFT);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "info_label", info_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  //set_net_info("Not connected...");
+  gtk_widget_show (info_label);
+  gtk_box_pack_start (GTK_BOX (settings_hbox1), info_label, TRUE, TRUE, 0);
+
+
+  /*
+   *The "settings" notebook
+   */
+  settings_label = gtk_label_new ("Settings");
+  gtk_widget_ref (settings_label);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "settings_label", settings_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (settings_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 4), settings_label);
+
+
+
+
+
+
+
+  /*
+   *The "about" hbox
+   */
+  about_hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_ref (about_hbox1);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "about_hbox1", about_hbox1,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (about_hbox1);
+  //gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 1);
+  gtk_container_add (GTK_CONTAINER (notebook1), about_hbox1);
+  gtk_container_set_border_width (GTK_CONTAINER (about_hbox1), 10);
+
+
+  /*
+   *The about label field
+   */
+  about_label = gtk_label_new(NULL);
+  gtk_widget_ref (about_label);
+  gtk_misc_set_alignment((GtkMisc *)about_label, 0, 0);
+  gtk_label_set_justify((GtkLabel *)about_label,GTK_JUSTIFY_CENTER);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "about_label", about_label,
+                            (GtkDestroyNotify) gtk_widget_unref);
+
+  //set_net_info("Not connected...");
+  gtk_widget_show (about_label);
+  gtk_box_pack_start (GTK_BOX (about_hbox1), unik_logo, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (about_hbox1), about_label, TRUE, TRUE, 0);
+  gtk_widget_show (unik_logo);
+
+
+  gtk_label_set_text((GtkLabel *)about_label, "OLSRD-GUI by Andreas Tonnesen (andreto@ifi.uio.no)");
+
+
+  /*
+   *The "about" notebook
+   */
+  label3 = gtk_label_new ("About");
+  gtk_widget_ref (label3);
+  gtk_object_set_data_full (GTK_OBJECT (main_window), "About", label3,
+                            (GtkDestroyNotify) gtk_widget_unref);
+  gtk_widget_show (label3);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 5), label3);
+
+
+
+  return main_window;
+
+}
+
+
+
+
+/*
+ *Add a node to the node list
+ */
+void
+route_list_add(char *dest, char *gw, char *metric, char *dev)
+{
+  gchar *tmp[4] = {dest, gw, dev, metric};
+  route_list_size++;
+
+  gtk_clist_freeze(GTK_CLIST(route_list));
+
+  gtk_clist_append(GTK_CLIST(route_list), tmp);
+
+  gtk_clist_thaw(GTK_CLIST(route_list));
+
+}
+
+
+/*
+ *Update the entyr with IP 'addr'
+ */
+void
+route_list_update(char *addr)
+{
+
+}
+
+
+/*
+ *Delete a node from the node list
+ */
+int
+route_list_del(char *dest)
+{
+  int i = 0;
+  char *ip;
+
+  gtk_clist_freeze(GTK_CLIST(route_list));
+
+  for(i = 0; i < route_list_size; i++)
+    {
+      gtk_clist_get_text(GTK_CLIST(route_list), i, 0, (gchar **) &ip);
+      if(strcmp(dest, ip) == 0)
+       {
+         //printf("Found %d\n", i);
+         gtk_clist_remove(GTK_CLIST(route_list), i);
+         route_list_size--;
+         gtk_clist_thaw(GTK_CLIST(route_list));
+         return 1;
+       }
+    }
+
+  gtk_clist_thaw(GTK_CLIST(route_list));
+  return 0;  
+}
+
+
+
+/*
+ *Remove a node from the list
+ */
+int
+remove_nodes_list(union olsr_ip_addr *node)
+{
+  char *ip;
+  char *in_ip = ip_to_string(node);
+  int i;
+
+  for(i = 0; i < node_list_size; i++)
+    {
+      gtk_clist_get_text(GTK_CLIST(node_list), i, 0, (gchar **) &ip);
+      if(strcmp(in_ip, ip) == 0)
+       {
+         //printf("Found entry!\n");
+         gtk_clist_remove(GTK_CLIST(node_list), i);
+         node_list_size--;
+         return 1;
+       }
+    }
+
+  return 0;
+}
+
+
+
+
+/*
+ *If the node passed as a parameter exists then
+ *update it. If not add it to the list
+ */
+void
+update_nodes_list(struct node *node)
+{
+  int i = 0;
+  char *ip;
+  int found = 0;
+  char *dest;
+  char *tmp[9] = {"","","","","","","","",""};
+  char timer[20];
+  struct tm *time_st;
+  char itoa_buf[10];
+
+  if(memcmp(&node->addr, &main_addr, ipsize) == 0)
+    dest = "localhost";
+  else
+    dest = ip_to_string(&node->addr);
+
+  gtk_clist_freeze(GTK_CLIST(node_list));
+
+  while((i < node_list_size) && !found)
+    {
+      gtk_clist_get_text(GTK_CLIST(node_list), i, 0, (gchar **) &ip);
+      if(strcmp(dest, ip) == 0)
+       found = 1;
+      i++;
+    }
+
+  /* Update node */
+  if(found)
+    {
+      i--; /* Go backt to the right row */
+      //printf("Updating %s\n\n", ip_to_string(&node->addr));
+      /* don't update main addr */
+      /* Gateway */
+      if(memcmp(&node->addr, &main_addr, ipsize) != 0)
+       {
+         if(memcmp(&node->gw_addr, &null_addr, ipsize) != 0)
+           gtk_clist_set_text(GTK_CLIST(node_list), i, 1, ip_to_string(&node->gw_addr));
+         /* Weigth */
+         if(node->hopcount != 0)
+           {
+             gui_itoa(node->hopcount, itoa_buf);
+             gtk_clist_set_text(GTK_CLIST(node_list), i, 2, itoa_buf);
+           }
+         /* Device */
+         gtk_clist_set_text(GTK_CLIST(node_list), i, 3, &node->dev[0]);
+       }
+
+
+      /* Timer */
+      if(node->timer.tv_usec)
+      {
+       memset(&timer[0], 0, 20);
+       time_st = gmtime((time_t *)&node->timer.tv_sec);
+       sprintf(&timer[0], "%02d:%02d:%02d", time_st->tm_hour, time_st->tm_min, time_st->tm_sec);
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 4, &timer[0]);
+      }
+
+
+      /* MID */
+      if(node->mid.next != &node->mid)
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "yes");
+      else
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "no");
+      /* HNA */
+      if(node->hna.next != &node->hna)
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "yes");
+      else
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "no");
+               
+    }
+  /* Add new node */
+  else
+    {
+      i = node_list_size;
+      /* Create entry */
+      gtk_clist_insert(GTK_CLIST(node_list), i, tmp);
+      /* Main address */
+      gtk_clist_set_text(GTK_CLIST(node_list), i, 0, dest);
+      if(memcmp(&node->addr, &main_addr, ipsize) == 0)
+       {
+         if(memcmp(&node->gw_addr, &null_addr, ipsize) != 0)
+           gtk_clist_set_text(GTK_CLIST(node_list), i, 1, ip_to_string(&node->gw_addr));
+         /* Weigth */
+         if(node->hopcount != 0)
+           {
+             gui_itoa(node->hopcount, itoa_buf);
+             gtk_clist_set_text(GTK_CLIST(node_list), i, 2, itoa_buf);
+           }
+         /* Device */
+         gtk_clist_set_text(GTK_CLIST(node_list), i, 3, &node->dev[0]);
+       }
+
+      /* MID */
+      if(node->mid.next != &node->mid)
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "yes");
+      else
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 5, "no");
+      /* HNA */
+      if(node->hna.next != &node->hna)
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "yes");
+      else
+       gtk_clist_set_text(GTK_CLIST(node_list), i, 6, "no");
+
+      node_list_size++;
+    }
+
+  gtk_clist_thaw(GTK_CLIST(node_list));
+
+
+}
+
+
+
+
+/*
+ *Add a packet to the packet list
+ */
+void
+packet_list_add(char *type, char *from, char *length)
+{
+  gchar *nfo[3] = {type, from, length};
+
+  //if(!freeze_packets)
+    //{
+      if(packet_list_size >= MAXPACKS)
+       gtk_clist_remove(GTK_CLIST(packet_list), MAXPACKS-1);
+      else
+       packet_list_size++;
+
+      gtk_clist_prepend(GTK_CLIST(packet_list), nfo );
+
+      //}
+
+}
+
+
+
+
+
+void selection_made( GtkWidget      *clist,
+                     gint            row,
+                     gint            column,
+                    GdkEventButton *event,
+                     gpointer        data )
+{
+    gchar *ip, *hops, *gw, *dev;
+    const gchar text[100];
+    /* Get the text that is stored in the selected row and column
+     * which was clicked in. We will receive it as a pointer in the
+     * argument text.
+     */
+    gtk_clist_get_text(GTK_CLIST(clist), row, 0, &ip);
+    gtk_clist_get_text(GTK_CLIST(clist), row, 1, &gw);
+    gtk_clist_get_text(GTK_CLIST(clist), row, 2, &hops);
+    gtk_clist_get_text(GTK_CLIST(clist), row, 3, &dev);
+
+    /* Just prints some information about the selected row */
+    sprintf((char *)&text[0], "IP:%s\nGATEWAY:%s\nHOPCOUNT:%s\nINTERFACE:%s\n",
+           ip, gw, hops, dev);
+
+    //gtk_text_buffer_set_text (textBuffer, text, -1);
+
+    //gtk_text_view_set_buffer((GtkTextView *)text1, textBuffer);
+
+    //gtk_widget_show (text1);
+
+
+    return;
+}
+
+
+
+
+
+
+
+void
+node_selection(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data)
+{
+
+  gchar *text;
+  struct node *host;
+  struct mid *mids;
+  struct mpr *mprs;
+  struct hna *hnas;
+  int i;
+  gchar *tmpshit[1] = {""};
+
+  /*
+   *Clear the lists
+   */
+  gtk_clist_clear(GTK_CLIST(mid_list));
+  gtk_clist_clear(GTK_CLIST(mpr_list));
+  gtk_clist_clear(GTK_CLIST(hna_list));
+  i = 0;
+
+  /*
+   *Get th IP address
+   */
+  gtk_clist_get_text(GTK_CLIST(node_list), row, 0, &text);
+
+  /* Get the node */
+  if(strncmp(text, "localhost", sizeof("localhost")) == 0)
+    host = find_node_t(&main_addr);
+  else
+    host = find_node(text);
+
+
+
+  if(host)
+    {
+      /* Timeout the registered MPRs for this node */
+      time_out_mprs(&host->addr);
+
+      /* Get mpr pointer AFTER timeout....(another waisted hour...) */ 
+      mprs = host->mpr.next;
+      mids = host->mid.next;
+      hnas = host->hna.next;
+
+      while (mids != &host->mid)
+       {
+         gtk_clist_append(GTK_CLIST(mid_list), tmpshit);
+         gtk_clist_set_text(GTK_CLIST(mid_list), i, 0, ip_to_string(&mids->alias));
+         i++;
+         mids = mids->next;
+       }
+
+      i = 0;
+
+
+      while (mprs != &host->mpr)
+       {
+         //printf("ADDING MPR : %s\n", ip_to_string(&mprs->addr));fflush(stdout);
+         gtk_clist_append(GTK_CLIST(mpr_list), tmpshit);
+         gtk_clist_set_text(GTK_CLIST(mpr_list), i, 0, ip_to_string(&mprs->addr));
+         i++;
+         mprs = mprs->next;
+       }
+      i = 0;
+
+      while (hnas != &host->hna)
+       {
+         gtk_clist_append(GTK_CLIST(hna_list), tmpshit);
+         gtk_clist_set_text(GTK_CLIST(hna_list), i, 0, ip_to_string(&hnas->net));
+         i++;
+         hnas = hnas->next;
+       }
+
+    }
+  else
+    {
+      printf("Could not find info about %s!\n", text);
+    }
+
+
+}
+
+
+
+
+void
+packet_selection(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data)
+{
+  /* Fetch the packet from the cache */
+  union olsr_message *pack;
+  char *packet;
+  int y, x;
+  short size;
+  char *content[4];
+  int mem_size = 10;
+
+  content[0] = (char *)malloc(mem_size);
+  content[1] = (char *)malloc(mem_size);
+  content[2] = (char *)malloc(mem_size);
+  content[3] = (char *)malloc(mem_size);
+
+
+  pack = get_packet(row);
+  packet = (char *)pack;
+
+  //printf("Got the packet at row %d...\n", row);
+
+  gtk_clist_clear(GTK_CLIST(packet_content_list));
+
+  size = ntohs(pack->v4.olsr_msgsize);
+  
+  for(y = 0; y < size;y += 4)
+    {
+
+      for(x = 0; x < 4; x++)
+       {
+         if(display_dec)
+           sprintf(content[x], "%03i", (u_char) packet[y+x]); /* Decimal format */
+         else
+           sprintf(content[x], "%02x", (u_char) packet[y+x]); /* Hex format */     
+       }
+
+      gtk_clist_append(GTK_CLIST(packet_content_list), content);
+    }
+
+  free(content[0]);
+  free(content[1]);
+  free(content[2]);
+  free(content[3]);
+
+}
+
+
+
+
+
+
+
+void
+set_net_info(gchar *info, int disp_button)
+{
+  gchar title[255];
+
+  memset(&title[0], 0, 255);
+  gtk_label_set_text((GtkLabel *)info_label, info); 
+  gtk_label_set_text((GtkLabel *)net_label, "Connected\nto localhost"); 
+
+  strcat(title, SOFTWARE_VERSION);
+  strcat(title, " - ");
+  strcat(title, ip_to_string(&main_addr));
+
+  gtk_window_set_title (GTK_WINDOW (main_window), title);
+
+  if(disp_button)
+    gtk_widget_show(connect_button);
+  else 
+    gtk_widget_hide(connect_button);
+}
+
+
+
+void
+set_net_info_offline()
+{
+  gtk_label_set_text((GtkLabel *)net_label, "Connection refused...");
+  gtk_widget_show(connect_button);
+}
+
+void
+set_net_info_connecting()
+{
+  gtk_label_set_text((GtkLabel *)net_label, "Connecting to localhost...");  
+}
+
+
+
+void
+column_clicked_callback(GtkWidget *list,gint column)
+{
+
+  //printf("You pressed %d\n",column);
+
+}
+
+
+/*
+ *Connect button callback
+ */
+void 
+connect_callback( GtkWidget *widget,
+                 gpointer   data )
+{
+  ipc_connect();
+}
+
+
+
+/*
+ *Packet button callback
+ */
+void 
+packet_callback( GtkWidget *widget,
+                 gpointer   data )
+{
+  if(freeze_packets)
+    {
+      freeze_packets = 0;
+      gtk_button_set_label(GTK_BUTTON(packet_button), "Freeze packets");
+    }
+  else
+    {
+      freeze_packets = 1;
+      gtk_button_set_label(GTK_BUTTON(packet_button), "Grab packets");
+    }
+}
+
+
+
+/*
+ *Packet display button callback
+ */
+void 
+packet_disp_callback( GtkWidget *widget,
+                 gpointer   data )
+{
+  if(display_dec)
+    {
+      display_dec = 0;
+      gtk_button_set_label(GTK_BUTTON(packet_disp_button), "Display decimal");
+    }
+  else
+    {
+      display_dec = 1;
+      gtk_button_set_label(GTK_BUTTON(packet_disp_button), "Display hex");
+    }
+}
+
+
+
+void
+gui_shutdown(GtkObject *object, gpointer user_data)
+{
+  printf("Shutting down...\n");
+
+  if(ipc_close() < 0)
+    printf("Could not close socket!\n");
+
+  printf("BYE-BYE!\n");
+  exit(0);
+
+}
+
+
diff --git a/front-end/src/interface.h b/front-end/src/interface.h
new file mode 100644 (file)
index 0000000..67fd124
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+
+
+
+void
+fill_clist(GtkCList *);
+
+
+void selection_made( GtkWidget      *clist,
+                     gint            row,
+                     gint            column,
+                    GdkEventButton *event,
+                     gpointer        data );
+
+
+void
+set_net_info_connecting();
+
+void
+column_clicked_callback(GtkWidget *,gint);
+
+
+void 
+connect_callback( GtkWidget *widget,
+                 gpointer   data );
+
+void 
+packet_callback( GtkWidget *widget,
+                 gpointer   data );
+
+void 
+packet_disp_callback( GtkWidget *widget,
+                 gpointer   data );
+
+
+void
+packet_selection(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data);
+
+
+void
+node_selection(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data);
+
+
+void
+gui_shutdown(GtkObject *, gpointer);
diff --git a/front-end/src/ipc.c b/front-end/src/ipc.c
new file mode 100644 (file)
index 0000000..40fc127
--- /dev/null
@@ -0,0 +1,771 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "common.h"
+#include "ipc.h"
+#include "packet.h"
+#include "routes.h"
+
+#ifdef WIN32
+#define close(x) closesocket(x)
+#undef errno
+#define errno WSAGetLastError()
+#undef strerror
+#define strerror(x) StrError(x)
+#define perror(x) WinSockPError(x)
+#endif
+
+int ipc_socket = 0;
+
+int
+ipc_get_socket()
+{
+  struct hostent *hp;
+  char *addr;
+  struct in_addr *in;
+  int sock;
+  //int flags;
+
+  
+  if ((hp = gethostbyname("localhost")) == 0) 
+    {
+      perror("gethostbyname");
+      exit(1);
+    }
+
+  in = (struct in_addr *) hp->h_addr;
+  addr = inet_ntoa(*in);
+  printf("Address: %s\n", addr);
+
+  /* fill in the socket structure with host information */
+  memset(&pin, 0, sizeof(pin));
+  pin.sin_family = AF_INET;
+  pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
+  pin.sin_port = htons(IPC_PORT);
+
+  /* grab an UNIX domain socket */
+  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
+    {
+      perror("socket");
+      exit(1);
+    }
+
+  printf("Socket: %d\n", sock);
+
+  /* Setting socket non-blocking */  
+  /*  
+  if ((flags = fcntl(sock, F_GETFL, 0)) < 0)
+    {
+      fprintf(stderr,"Error getting socket flags!\n");
+      exit(1);
+    }
+  
+  
+  if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0)
+    {
+      fprintf(stderr,"Error setting socket flags!\n");
+      exit(1);
+    }
+  */
+
+  return sock;
+
+}
+
+
+
+int
+ipc_close()
+{
+
+  if(close(ipc_socket))
+    return 1;
+  
+  return 0;
+}
+
+
+
+int
+ipc_connect()
+{
+#ifdef WIN32
+  int On = 1;
+  unsigned long Len;
+#else
+  int flags;
+#endif
+
+  connected = 0;
+
+  printf("Attempting connect...");
+
+  if(!ipc_socket)
+    ipc_socket = ipc_get_socket();
+
+  /* connect to PORT on HOST */
+  if (connect(ipc_socket,(struct sockaddr *)  &pin, sizeof(pin)) < 0) 
+    {
+      fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
+      set_net_info_offline();
+      printf("connection refused\n");
+    }
+  else 
+    {
+      set_net_info("Connected!", FALSE);
+      printf("Connected!!\n");
+
+      /* Setting socket non-blocking */  
+      
+#ifdef WIN32
+      if (WSAIoctl(ipc_socket, FIONBIO, &On, sizeof (On), NULL, 0, &Len,
+                   NULL, NULL) < 0)
+        {
+          fprintf(stderr, "Error while making socket non-blocking!\n");
+          exit(1);
+        }
+#else
+      if ((flags = fcntl(ipc_socket, F_GETFL, 0)) < 0)
+       {
+         fprintf(stderr,"Error getting socket flags!\n");
+         exit(1);
+       }
+      
+      
+      if (fcntl(ipc_socket, F_SETFL, flags | O_NONBLOCK) < 0)
+       {
+         fprintf(stderr,"Error setting socket flags!\n");
+         exit(1);
+       }
+#endif      
+      connected = 1;
+      
+      return 1;
+    }
+  
+  return 0;
+
+}
+
+
+int
+ipc_read()
+{
+  //int x, i;
+  int bytes, tmp_len;
+  char *tmp;
+  union olsr_message *msg;
+  union 
+  {
+    char       buf[BUFFSIZE+1];
+    union      olsr_message olsr_msg;
+  } inbuf;
+  //char buf[BUFFSIZE+1];
+
+  //printf(".");fflush(stdout);
+  memset(&inbuf, 0, sizeof(BUFFSIZE+1));
+  //buf[0] = '\0';
+
+  if(connected)
+    {
+      bytes = recv(ipc_socket, (char *)&inbuf, BUFFSIZE, 0);
+      if (bytes == 0)
+        {
+          shutdown(ipc_socket, SHUT_RDWR);
+         set_net_info("Disconnected from server...", TRUE);
+          connected = 0;
+         close(ipc_socket);
+        }
+     
+      if(bytes > 0)
+       {
+          
+         tmp = (char *) &inbuf.olsr_msg;
+       
+         /*    
+         x = 0;
+         printf("\n\t");
+         for(i = 0; i < bytes;i++)
+           {
+             if(x == 4)
+               {
+                 x = 0;
+                 printf("\n\t");
+               }
+             x++;
+             printf(" %03i", (u_char) tmp[i]);
+           }
+         
+         printf("\n\nBytes read: %d - msg_size: %d\n", bytes, ntohs(inbuf.olsr.v4.olsr_packlen));
+         */
+         
+         msg = &inbuf.olsr_msg;
+
+         /* There can be(there probably are!) several packets in the buffer */
+
+         /* Should be the same for v4 and v6 */
+         if(ntohs(inbuf.olsr_msg.v4.olsr_msgsize) < bytes)
+           {
+             //printf("chomping...\n");
+             while(ntohs(msg->v4.olsr_msgsize) < bytes)
+               {
+                 ipc_evaluate_message(msg);
+
+                 tmp_len = ntohs(msg->v4.olsr_msgsize);
+                 msg = (union olsr_message *) &tmp[tmp_len];
+                 tmp = &tmp[tmp_len];
+                 if(tmp_len == 0)
+                   break;
+                 bytes = bytes - tmp_len;
+
+                 tmp_len = ntohs(msg->v4.olsr_msgsize);
+
+                 //printf("%d/%d ", tmp_len, bytes);
+                 /* Copy to start of buffer */
+                 if(tmp_len > bytes)
+                   {
+                     /* Copy the buffer */
+                     //printf("READING END OF MESSAGE. %d bytes\n", tmp_len-bytes);
+                     //printf("\tCopying %d bytes\n", bytes);
+                     memcpy(&inbuf, tmp, bytes);
+                     //printf("\tRecieving %d bytes to buffer[%d]\n", tmp_len-bytes, bytes);
+                     bytes = recv(ipc_socket, (char *)&inbuf.buf[bytes], tmp_len-bytes, 0);
+                     //printf("\tBytes: %d Size: %d\n", bytes, ntohs(msgs->v4.olsr_packlen));
+                     tmp = (char *)&inbuf.olsr_msg;
+                     msg = (union olsr_message *) tmp;
+                   }
+               }
+             //printf("\n");
+           }
+         
+         /* Only one (or the last) message */
+         ipc_evaluate_message(msg);
+
+       }
+
+    }
+
+
+
+  return 1;
+}
+
+
+
+
+int
+ipc_send()
+{
+
+
+  return 1;
+}
+
+
+
+
+
+int
+ipc_evaluate_message(union olsr_message *olsr_in)
+{
+  int ipc_pack = 0;
+  olsr_u8_t type;
+  int msgsize;
+  char itoa_buf[10];
+  olsr_u8_t vtime;
+  union olsr_ip_addr *originator;
+
+  /* Find size, vtime, originator and type - same for IPv4 and 6 */
+  type = olsr_in->v4.olsr_msgtype;
+  msgsize = ntohs(olsr_in->v4.olsr_msgsize);
+  vtime = olsr_in->v4.olsr_vtime;
+  originator = (union olsr_ip_addr *)&olsr_in->v4.originator;
+
+  gui_itoa(msgsize, itoa_buf);
+
+  switch(type)
+    {
+    case HELLO_MESSAGE:
+      //printf("Recieved HELLO packet\n");
+      if(!freeze_packets)
+       packet_list_add("HELLO", ip_to_string(originator), itoa_buf);
+
+      if(ipversion == AF_INET)
+       {
+         process_hello(msgsize, vtime, originator, (union hello_message *)&olsr_in->v4.message.hello);
+       }
+      else
+       {
+         process_hello(msgsize, vtime, originator, (union hello_message *)&olsr_in->v6.message.hello);
+       }
+      break;
+
+    case TC_MESSAGE:
+      if(!freeze_packets)
+       packet_list_add("TC", ip_to_string(originator), itoa_buf);
+      
+      if(ipversion == AF_INET)
+       {
+         process_tc(msgsize, vtime, originator, (union tc_message *)&olsr_in->v4.message.tc);
+         //printf("Recieved TC packet from %s\n", ip_to_string(&m->olsr_tc->tc_origaddr));
+       }
+      else
+       {
+         process_tc(msgsize, vtime, originator, (union tc_message *)&olsr_in->v6.message.tc);
+         //printf("Recieved TC packet from %s\n", ip_to_string(&m->olsr_tc->tc_origaddr));
+       }
+      break;
+
+    case MID_MESSAGE:
+      if(!freeze_packets)
+       packet_list_add("MID", ip_to_string(originator), itoa_buf);
+      if(ipversion == AF_INET)
+       {
+         process_mid(msgsize, vtime, originator, (union mid_message *)&olsr_in->v4.message.mid);
+         //printf("Recieved MID packet from %s\n", ip_to_string(&m->olsr_mid->mid_origaddr));
+       }
+      else
+       {
+         process_mid(msgsize, vtime, originator, (union mid_message *)&olsr_in->v6.message.mid);
+         //printf("Recieved MID packet from %s\n", ip_to_string(&m->olsr_mid->mid_origaddr));
+       }
+      
+      break;
+
+    case HNA_MESSAGE:
+
+      if(!freeze_packets)
+       packet_list_add("HNA", ip_to_string(originator), itoa_buf);
+      if(ipversion == AF_INET)
+       {
+         process_hna(msgsize, vtime, originator, (union hna_message *)&olsr_in->v4.message.hna);
+         //printf("Recieved HNA packet\n");
+       }
+      else
+       {
+         process_hna(msgsize, vtime, originator, (union hna_message *)&olsr_in->v6.message.hna);
+         //printf("Recieved HNA packet\n");
+       }
+      
+      break;
+
+    case IPC_MESSAGE:
+      //printf("Recieved IPC packet\n");
+      ipc_pack = 1; /* Don't add to buffer */
+      ipc_eval_route_packet((struct routemsg *) olsr_in);      
+      break;
+    case IPC_NET:
+      //printf("Recieved IPC packet\n");
+      ipc_pack = 1; /* Don't add to buffer */
+      ipc_eval_net_info((struct netmsg *) olsr_in);      
+      break;
+    default:
+      if(!freeze_packets)
+       packet_list_add("UNKNOWN", "?", "?");
+
+       printf("Unknown packet type %d\n", type);
+      
+    }
+  
+  if(!freeze_packets && !ipc_pack)
+    {
+         add_packet_to_buffer(olsr_in, msgsize);
+    }
+
+
+  return 1;
+}
+
+
+
+int
+ipc_eval_net_info(struct netmsg *msg)
+{
+  char info[256];
+  printf("Evaluating NET info...\n");
+
+  /*
+  printf("\tMain address: %s\n", ip_to_string(&msg->main_addr));
+  printf("\tMid adresses: %d\n", msg->mids);
+  printf("\tHna adresses: %d\n", msg->hnas);
+  printf("\tHELLO interval: %f\n", (float)(ntohs(msg->hello_int)));
+  printf("\tHELLO LAN interval: %f\n", (float)(ntohs(msg->hello_lan_int)));
+  printf("\tTC interval: %d\n", ntohs(msg->tc_int));
+  printf("\tNeighbor hold time: %d\n", ntohs(msg->neigh_hold));
+  printf("\tTopology hold: %d\n", ntohs(msg->topology_hold));
+  */
+  if(msg->ipv6 == 0)
+    {
+      ipversion = AF_INET;
+      ipsize = sizeof(struct in_addr);
+      sprintf(&info[0],"IP version 4\nMain address: %s\nMid addresses: %d\nHna addresses: %d\nHELLO interval: %d\nHELLO LAN interval: %d\nTC interval: %d\nNeighbor hold time: %d\nTopology hold: %d\n", ip_to_string(&msg->main_addr), msg->mids, msg->hnas, ntohs(msg->hello_int), ntohs(msg->hello_lan_int), ntohs(msg->tc_int), ntohs(msg->neigh_hold), ntohs(msg->topology_hold));
+   }
+  else
+    {
+      ipversion = AF_INET6;
+      ipsize = sizeof(struct in6_addr);
+      sprintf(&info[0],"IP version 6\nMain address: %s\nMid addresses: %d\nHna addresses: %d\nHELLO interval: %d\nHELLO LAN interval: %d\nTC interval: %d\nNeighbor hold time: %d\nTopology hold: %d\n", ip_to_string(&msg->main_addr), msg->mids, msg->hnas, ntohs(msg->hello_int), ntohs(msg->hello_lan_int), ntohs(msg->tc_int), ntohs(msg->neigh_hold), ntohs(msg->topology_hold));
+    }
+
+
+
+  memcpy(&main_addr, &msg->main_addr, ipsize);
+
+  set_net_info(&info[0], 0);
+
+
+  return 0;
+}
+
+
+int
+ipc_eval_route_packet(struct routemsg *msg)
+{
+  struct route_entry rt_ent;
+  char dev[5];
+  char gw[16];
+  char itoa_buf[10];
+  dev[4] = '\0';
+  memset(&gw[0], 0, 16);
+
+  printf("Processing route packet\n"); 
+
+  memset(rt_ent.if_name, 0, MAX_IF_NAMESIZ);
+  
+  /* Fill struct */
+  
+  memcpy(&rt_ent.gw, &msg->gateway_addr, ipsize);
+  memcpy(&rt_ent.dst, &msg->target_addr, ipsize);
+  memcpy(rt_ent.if_name, msg->device, 4);
+  rt_ent.hopcnt = msg->metric;
+
+  if(msg->add)
+    {
+      memcpy(&dev[0], &msg->device[0], 4);
+
+      /*Add node to node list */
+      memcpy(&gw[0], ip_to_string(&msg->gateway_addr), 16);
+
+      gui_itoa(msg->metric, itoa_buf);
+
+      route_list_add(ip_to_string(&msg->target_addr),
+                    gw,
+                    dev,
+                    itoa_buf);
+
+      printf("\tRoute to %s(hc %d) added\n", ip_to_string(&msg->target_addr), rt_ent.hopcnt);
+
+      /*
+      printf("\tRoute to %s added\n", ip_to_string(&msg->target_addr));
+      printf("\tGateway %s\n", gw);
+      printf("\tInterface %s\n", msg->device);
+      printf("\tMetric %d\n", msg->metric);
+      */
+    }
+  else
+    {
+
+      if(route_list_del(ip_to_string(&msg->target_addr)) < 1)
+       printf("COULD NOT FIND ROUTE TO DELETE!\n\n");
+
+      printf("\tRoute to %s deleted\n", ip_to_string(&msg->target_addr));
+    }
+  return 1;
+}
+
+
+
+
+int
+process_hello(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union hello_message *m)
+{
+  struct hellinfo *neigh;
+  struct hellinfo6 *neigh6;
+  int i;
+  int nsize;
+  int type, link;
+
+
+  printf("Processing HELLO from %s size = %d\n", ip_to_string(originator), size);
+
+
+  if(!update_timer_node(originator, vtime))
+    add_node(originator, vtime);
+
+  /* Add neighbors if any */
+  size = size - 4 - 8 - ipsize; /* size of neighbors(size - olsrheder- helloheader) */
+
+  if(!size)
+    return 0;
+
+
+  /* Get the neighbortype-blocks start */
+  neigh = m->v4.hell_info;
+  neigh6 = m->v6.hell_info;
+
+  //printf("HELLO Size: %d\n", size);
+
+  while(size > 0)
+    {
+
+      //printf("\tNEIGH: 0x%x\n", (int)neigh);
+      if(ipversion == AF_INET)
+       {
+         nsize = ntohs(neigh->size);
+         type = EXTRACT_STATUS(ntohs(neigh->link_code));
+         link = EXTRACT_LINK(ntohs(neigh->link_code));
+         //printf("TYPE: %d\n", neigh->link_code);
+       }
+      else
+       {
+         nsize = ntohs(neigh6->size);
+         type = EXTRACT_STATUS(ntohs(neigh6->link_code));
+         link = EXTRACT_LINK(ntohs(neigh6->link_code));
+       }
+
+
+      size -= nsize;
+
+      nsize = nsize - 4; /* - hellinfo header */
+      //printf("Size left: %d Current hellinfo: %d\n", size, nsize);
+      i = 0;
+      while(nsize > 0)
+       {
+         //printf("Adding neighbor %s...\n", ip_to_string((union olsr_ip_addr *)&neigh->neigh_addr[i]));
+         /*
+          if(MPR)
+         update_timer_mpr((union olsr_ip_addr *)&mprsinfo->addr, originator);
+         */
+         
+         if(ipversion == AF_INET) /* Update MPRs */
+           {
+             if(type == MPR_NEIGH)
+               {
+                 //printf("MPR from HELLO\n");
+                 update_timer_mpr((union olsr_ip_addr *)&neigh->neigh_addr[i], originator, vtime);
+               }
+             add_node((union olsr_ip_addr *)&neigh->neigh_addr[i++], vtime);
+           }
+         else
+           {
+             if(type == MPR_NEIGH) /* Update MPRs */
+               {
+                 //printf("MPR from HELLO\n");
+                 update_timer_mpr((union olsr_ip_addr *)&neigh6->neigh_addr[i], originator, vtime);
+               }
+             add_node((union olsr_ip_addr *)&neigh6->neigh_addr[i++], vtime);
+           }
+
+         nsize = nsize - ipsize;
+         //printf("Nsize: %d\n", nsize);
+       }
+      neigh = (struct hellinfo *) &neigh->neigh_addr[i];
+      neigh6 = (struct hellinfo6 *) &neigh6->neigh_addr[i];
+
+      
+    }
+  //printf("DONE\n");
+
+  return 0;
+}
+
+
+
+
+int
+process_tc(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union tc_message *m)
+{
+
+  struct neigh_info *mprsinfo;
+  struct neigh_info6 *mprsinfo6;
+
+  printf("Processing TC from %s size = %d\n", ip_to_string(originator), size);
+
+  /* Updating timer */
+  if(!update_timer_node(originator, vtime))
+    add_node(originator, vtime);
+
+  /* Calculate size of the mprsinfo */
+  size = size - 4 - 8 - ipsize;
+
+  //printf("TC Size: %d\n", size);
+
+  if(ipversion == AF_INET)
+    mprsinfo =  &m->v4.neigh[0];
+  else
+    mprsinfo6 =  &m->v6.neigh[0];
+
+
+  while(size > 0)
+    {
+      if(ipversion == AF_INET)
+       {
+         //printf("\tprocessing TC: %s\n", ip_to_string((union olsr_ip_addr *)&mprsinfo->addr));
+         add_node((union olsr_ip_addr *)&mprsinfo->addr, vtime);
+         update_timer_mpr((union olsr_ip_addr *)&mprsinfo->addr, originator, vtime);
+         mprsinfo++;
+       }
+      else
+       {
+         //printf("\tprocessing TC: %s\n", ip_to_string((union olsr_ip_addr *)&mprsinfo6->addr));
+         //printf("TC: add node %s\n", ip_to_string((union olsr_ip_addr *)&mprsinfo6->addr));
+         add_node((union olsr_ip_addr *)&mprsinfo6->addr, vtime);
+         update_timer_mpr((union olsr_ip_addr *)&mprsinfo6->addr, originator, vtime);
+         mprsinfo6++;
+       }
+      size = size - ipsize;
+      //printf("\tsize: %d\n", size);
+    }
+  //printf("DONE\n");
+
+  return 0;
+}
+
+
+
+int
+process_mid(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union mid_message *m)
+{
+  struct midaddr *midaddr;
+  struct midaddr6 *midaddr6;
+
+
+  printf("Processing MID from %s size = %d\n", ip_to_string(originator), size);
+
+  /* Calculate size of the midinfo */
+  size = size - 4 - 4 - ipsize;
+
+  if(ipversion == AF_INET)
+    midaddr =  &m->v4.mid_addr[0];
+  else
+    midaddr6 =  &m->v6.mid_addr[0];
+
+  //printf("MID size: %d\n", size);
+
+  while(size > 0)
+    {
+      if(ipversion == AF_INET)
+       {
+         //printf("MID: add node %s\n", ip_to_string((union olsr_ip_addr *)&midaddr->addr));
+         add_mid_node(originator, (union olsr_ip_addr *)&midaddr->addr, vtime);
+         midaddr++;
+       }
+      else
+       {
+         add_mid_node(originator, (union olsr_ip_addr *)&midaddr6->addr, vtime);
+         //printf("MID: add node %s\n", ip_to_string((union olsr_ip_addr *)&midaddr6->addr));
+         midaddr6++;
+       }
+      size = size - ipsize;
+    }
+
+  //printf("DONE\n");
+  return 0;
+}
+
+
+
+
+int
+process_hna(int size, olsr_u8_t vtime, union olsr_ip_addr *originator, union hna_message *m)
+{
+
+
+  printf("Processing HNA size = %d\n", size);
+  struct hnapair *hnapairs;
+  struct hnapair6 *hnapairs6;
+
+  /* Calculate size of the hnainfo */
+  size = size - 4 - 4 - ipsize;
+
+  if(ipversion == AF_INET)
+    hnapairs =  &m->v4.hna_net[0];
+  else
+    hnapairs6 =  &m->v6.hna_net[0];
+
+
+  while(size > 0)
+    {
+      if(ipversion == AF_INET)
+       {
+         //printf("\tHNA:%s\n", ip_to_string((union olsr_ip_addr *)&hnapairs->addr));
+         add_hna_node(originator, (union olsr_ip_addr *)&hnapairs->addr, (union olsr_ip_addr *)&hnapairs->netmask, vtime);
+         hnapairs++;
+       }
+      else
+       {
+         add_hna_node(originator, (union olsr_ip_addr *)&hnapairs6->addr, (union olsr_ip_addr *)&hnapairs6->netmask, vtime);
+         hnapairs6++;
+       }
+
+      size = size - ipsize - ipsize;
+    }
+
+
+  return 0;
+}
+
+
+
+
+
+
+char *
+ip_to_string(union olsr_ip_addr *addr)
+{
+  char *ret;
+  struct in_addr in;
+  
+  if(ipversion == AF_INET)
+    {
+      in.s_addr=addr->v4;
+      ret = inet_ntoa(in);
+    }
+  else
+    {
+      /* IPv6 */
+      ret = (char *)inet_ntop(AF_INET6, &addr->v6, ipv6_buf, sizeof(ipv6_buf));
+    }
+
+  return ret;
+
+}
+
+
+
+
+int
+gui_itoa(int i, char *buf)
+{
+  char tmp[10];
+
+  if(sprintf(buf, "%hd", i))
+  {
+      /* This shitty string needs to be converted to UTF-8 */
+    strcpy(tmp, g_locale_to_utf8(buf, -1, NULL, NULL, NULL));
+    strcpy(buf, tmp);
+    return 1;
+    //return ret;
+  }
+  return 0;
+}
diff --git a/front-end/src/ipc.h b/front-end/src/ipc.h
new file mode 100644 (file)
index 0000000..02a60db
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "olsr_protocol.h"
+#include "packet.h"
+
+#define IPC_PORT 1212
+#define        IPC_MESSAGE 11    /* IPC to front-end telling of route changes */
+#define IPC_NET 12       /* IPC to front end net-info */
+
+
+//int ipc_socket;
+struct sockaddr_in pin;
+int connected;
+
+
+/*
+ *AND:
+ *IPC message sent to the front-end
+ *at every route update. Both delete
+ *and add
+ */
+
+struct routemsg 
+{
+  olsr_u8_t      msgtype;
+  olsr_u16_t     size;
+  olsr_u8_t      metric;
+  olsr_u8_t      add;
+  union olsr_ip_addr target_addr;
+  union olsr_ip_addr gateway_addr;
+  char           device[4];
+};
+
+
+struct netmsg
+{
+  olsr_u8_t      msgtype;
+  olsr_u16_t     size;
+  olsr_u8_t      mids; /* No. of extra interfaces */
+  olsr_u8_t      hnas; /* No. of HNA nets */
+  olsr_u8_t      unused1;
+  olsr_u16_t     hello_int;
+  olsr_u16_t     hello_lan_int;
+  olsr_u16_t     tc_int;
+  olsr_u16_t     neigh_hold;
+  olsr_u16_t     topology_hold;
+  olsr_u8_t      ipv6;
+  union olsr_ip_addr   main_addr;
+};
+
+/*
+ *Private functions
+ */
+
+int
+ipc_get_socket();
+
+int
+ipc_evaluate_message(union olsr_message *);
+
+int
+ipc_eval_route_packet(struct routemsg *);
+
+int
+ipc_eval_net_info(struct netmsg *);
+
+int
+process_hello(int, olsr_u8_t, union olsr_ip_addr *, union hello_message *);
+
+int
+process_tc(int, olsr_u8_t, union olsr_ip_addr *, union tc_message *);
+
+int
+process_mid(int, olsr_u8_t, union olsr_ip_addr *, union mid_message *);
+
+int
+process_hna(int, olsr_u8_t, union olsr_ip_addr *, union hna_message *);
diff --git a/front-end/src/main.c b/front-end/src/main.c
new file mode 100644 (file)
index 0000000..b368b56
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "common.h"
+#include "main.h"
+
+int
+main (int argc, char *argv[])
+{
+#ifdef WIN32
+  WSADATA WsaData;
+#endif
+  GtkWidget *main_window;
+
+#ifdef WIN32
+  if (WSAStartup(0x0202, &WsaData))
+    {
+      fprintf(stderr, "Could not initialize WinSock.\n");
+      exit(1);
+    }
+#endif
+
+  gtk_init (&argc, &argv);
+
+  init_nodes();
+
+  freeze_packets = 1;
+  display_dec = 1;
+
+  /* "Failsafe" values */
+  ipversion = AF_INET;
+  ipsize = sizeof(struct in_addr);
+
+  main_window = create_main_window ();
+  gtk_widget_show (main_window);
+
+  printf("Done building GUI\n");
+
+  memset(&main_addr, 0, sizeof(union olsr_ip_addr));
+  memset(&null_addr, 0, sizeof(union olsr_ip_addr));
+
+  /* Terminate signal */
+  signal(SIGINT, shutdown_);  
+
+  /* Init node timeout */
+  nodes_timeout = NEIGHB_HOLD_TIME_NW;
+  init_timer((olsr_u32_t) (nodes_timeout * 1000), &hold_time_nodes);
+
+  ipc_connect();
+
+  add_timeouts();
+
+  gtk_main ();
+  return 0;
+}
+
+
+
+/*
+ *Timeouts
+ */
+
+int
+add_timeouts()
+{
+
+  /*
+   *Check socket for messages every IPC_INTERVAL
+   *milliseconds
+   */
+  gtk_timeout_add(IPC_INTERVAL, ipc_timeout, NULL);
+
+
+  /*
+   *Time out nodes
+   */
+  timeouts = 5; /* Wait 5 times befor starting timing out nodes */
+  gtk_timeout_add(TOP_HOLD_TIME, time_out_nodes, NULL);
+
+
+ return 1;
+}
+
+
+
+gint ipc_timeout(gpointer data)
+{
+
+  ipc_read();
+  return 1;
+}
+
+
+
+void
+shutdown_(int signal)
+{
+  printf("Cleaning up...\n");
+
+  if(ipc_close() < 0)
+    printf("Could not close socket!\n");
+
+  printf("BYE-BYE!\n");
+  exit(signal);
+}
diff --git a/front-end/src/main.h b/front-end/src/main.h
new file mode 100644 (file)
index 0000000..f4b0488
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <signal.h>
+
+int timeouts;
+
+
+int
+add_timeouts();
+
+
+gint
+ipc_timeout(gpointer);
+
+
+void
+shutdown_(int);
diff --git a/front-end/src/nodes.c b/front-end/src/nodes.c
new file mode 100644 (file)
index 0000000..e466179
--- /dev/null
@@ -0,0 +1,739 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "common.h"
+#include "nodes.h"
+#include <math.h>
+
+
+void
+init_nodes()
+{
+
+  nodes.next = &nodes;
+  nodes.prev = &nodes;
+}
+
+/*
+ *Insert a new node in the list
+ *NB! The list is NOT checked for duplicates!!
+ */
+struct node *
+insert_node(struct node *n, olsr_u8_t vtime)
+{
+  struct node *new_node;
+
+  printf("Inserting node %s\n", ip_to_string((union olsr_ip_addr *)&n->addr));
+
+  if((new_node = malloc(sizeof(struct node))) == 0)
+    {
+      fprintf(stderr, "OUT OF MEMORY!\n");
+      exit(1);
+    }
+
+  memcpy(new_node, n, sizeof(struct node));
+  
+  /* queue */
+  nodes.next->prev = new_node;
+  new_node->next = nodes.next;
+  nodes.next = new_node;
+  new_node->prev = &nodes;
+
+  new_node->hna.next = &new_node->hna;
+  new_node->hna.prev = &new_node->hna;
+  new_node->mid.next = &new_node->mid;
+  new_node->mid.prev = &new_node->mid;
+  new_node->mpr.next = &new_node->mpr;
+  new_node->mpr.prev = &new_node->mpr;
+
+
+  update_timer_node(&n->addr, vtime);
+
+  return new_node;
+}
+
+
+/**
+ *Add a new node to the set
+ */
+int
+add_node(union olsr_ip_addr *node, olsr_u8_t vtime)
+{
+  struct node new;
+  struct node *tmp_nodes;
+  struct timeval tmp_timer;
+  double dbl_time;
+  olsr_u32_t time_value;
+  struct mid *tmp_mid;
+
+  dbl_time = me_to_double(vtime);
+  time_value = (olsr_u32_t) dbl_time*1000;
+
+  tmp_timer.tv_sec = time_value/1000;
+  tmp_timer.tv_usec = (time_value-(tmp_timer.tv_sec*1000)) * 1000;   
+
+  /* Check if node exists */
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         //printf("updating timer for node %s\n", ip_to_string(node));
+         //printf("Updatimng timer for: %s\n", ip_to_string(node));
+         //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec);
+         gettimeofday(&now, (struct timezone *)NULL);
+         timeradd(&now, &tmp_timer, &tmp_nodes->timer);
+         return 0; 
+       }
+      /* Check MID */
+      for(tmp_mid = tmp_nodes->mid.next;
+         tmp_mid != &tmp_nodes->mid;
+         tmp_mid = tmp_mid->next)
+       {
+         if(memcmp(&tmp_mid->alias, node, ipsize) == 0)
+           {
+             //printf("updating timer for node %s\n", ip_to_string(node));
+             //printf("Updatimng timer for (MID): %s\n", ip_to_string(&tmp_nodes->addr));
+             //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec);
+             gettimeofday(&now, (struct timezone *)NULL);
+             timeradd(&now, &tmp_timer, &tmp_nodes->timer);
+             return 0; 
+           }
+       }
+    }
+
+  /* New node */
+  memset(&new, 0, sizeof(struct node));
+  memcpy(&new.addr, node, ipsize);
+  new.display = 1;
+  printf("1:");
+  insert_node(&new, vtime);
+  update_nodes_list(&new);
+  return 1;
+}
+
+
+int
+update_timer_node(union olsr_ip_addr *node, olsr_u8_t vtime)
+{
+  struct node *tmp_nodes;
+  struct timeval tmp_timer;
+  double dbl_time;
+  olsr_u32_t time_value;
+
+  dbl_time = me_to_double(vtime);
+  time_value = (olsr_u32_t) dbl_time*1000;
+
+  tmp_timer.tv_sec = time_value/1000;
+  tmp_timer.tv_usec = (time_value-(tmp_timer.tv_sec*1000)) * 1000;   
+
+  //printf("Updatimng timer for: %s\n", ip_to_string(node));
+  //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec);
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         //printf("updating timer for node %s\n", ip_to_string(node));
+         gettimeofday(&now, (struct timezone *)NULL);
+         timeradd(&now, &tmp_timer, &tmp_nodes->timer);
+         if(tmp_nodes->display)
+           update_nodes_list(tmp_nodes);
+         return 1; 
+       }
+    }
+  
+  return 0;
+}
+
+
+/**
+ *Updates the hold time for the mpr 'mpr' registered on
+ *the node 'node'. Adds the mpr to the node if not already
+ *registered.
+ *@param node the node that has chosen the MPR
+ *@param mpr the MPR chosen by the node
+ *@return 0 if node was added, 1 if not
+ */
+int
+update_timer_mpr(union olsr_ip_addr *node, union olsr_ip_addr *mpr, olsr_u8_t vtime)
+{
+  struct node *tmp_nodes;
+  struct mpr *tmp_mpr;
+  struct timeval tmp_timer;
+  double dbl_time;
+  olsr_u32_t time_value;
+
+  dbl_time = me_to_double(vtime);
+  time_value = (olsr_u32_t) dbl_time*1000;
+
+  tmp_timer.tv_sec = time_value/1000;
+  tmp_timer.tv_usec = (time_value-(tmp_timer.tv_sec*1000)) * 1000;   
+
+  //printf("Updatimng MPR timer for: %s\n", ip_to_string(node));
+  //printf("Secs: %d, usecs: %d\n", (int)tmp_timer.tv_sec, (int)tmp_timer.tv_usec);
+
+  //printf("Updatimng timer for: %s\n", ip_to_string(node));
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         for(tmp_mpr = tmp_nodes->mpr.next;
+             tmp_mpr != &tmp_nodes->mpr;
+             tmp_mpr = tmp_mpr->next)
+           {
+             if(memcmp(&tmp_mpr->addr, mpr, ipsize) == 0)
+               {
+                 //printf("updating timer for MPR %s ", ip_to_string(mpr));
+                 //printf("node %s\n", ip_to_string(node));
+                 gettimeofday(&now, (struct timezone *)NULL);
+                 timeradd(&now, &tmp_timer, &tmp_mpr->timer);
+                 return 1; 
+               }
+           }
+         /* Only add if parent is added */
+         add_mpr(node, mpr, &tmp_timer);
+         return 0;
+       }
+    }
+
+  return 0;
+}
+
+
+
+
+int
+add_mid_node(union olsr_ip_addr *node, union olsr_ip_addr *alias, olsr_u8_t vtime)
+{
+
+  struct node *tmp_nodes;
+  struct mid *tmp_mid;
+  struct node new, *inserted;
+
+  //printf("MID_add: %s\n", ip_to_string(alias));
+
+  //update_timer_node(node, vtime);
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         for(tmp_mid = tmp_nodes->mid.next;
+             tmp_mid != &tmp_nodes->mid;
+             tmp_mid = tmp_mid->next)
+           {
+             if(memcmp(&tmp_mid->alias, alias, ipsize) == 0)
+               return 0;
+           }
+
+         /* we didn't find the address */
+         printf("(1)NEW MID %s ", ip_to_string(alias));
+         printf("ADDED FOR %s\n", ip_to_string(node));
+         if((tmp_mid = malloc(sizeof(struct mid))) == 0)
+           {
+             fprintf(stderr, "OUT OF MEMORY\n");
+             exit(1);
+           }
+
+         memcpy(&tmp_mid->alias, alias, ipsize);
+
+         tmp_nodes->mid.next->prev = tmp_mid;
+         tmp_mid->next = tmp_nodes->mid.next;
+         tmp_nodes->mid.next = tmp_mid;
+         tmp_mid->prev = &tmp_nodes->mid;
+
+         remove_node_addr(alias); // Remove if already registered as a node
+         
+         update_nodes_list(tmp_nodes);
+         return 1; 
+
+       }
+    }
+
+
+
+  /*New node */
+
+  printf("ADDING NEW NODE %s FROM MID...\n", ip_to_string(node));
+  /* We don't know wery much... */
+  memset(&new, 0, sizeof(struct node));
+  memcpy(&new.addr, node, ipsize);
+  inserted = insert_node(&new, vtime);
+
+  if((tmp_mid = malloc(sizeof(struct mid))) == 0)
+    {
+      fprintf(stderr, "OUT OF MEMORY!\n");
+      exit(1);
+    }
+
+  memcpy(&tmp_mid->alias, alias, ipsize);
+
+  tmp_mid->next = &inserted->mid;
+  tmp_mid->prev = &inserted->mid;
+  inserted->mid.next = tmp_mid;
+  inserted->mid.prev = tmp_mid;
+
+  update_nodes_list(inserted);
+
+  return 2;
+}
+
+
+int
+add_hna_node(union olsr_ip_addr *node, union olsr_ip_addr *net, union olsr_ip_addr *mask, olsr_u8_t vtime)
+{
+
+  struct node *tmp_nodes;
+  struct hna *tmp_hna;
+  struct node new, *inserted;
+
+  //printf("HNA: %s\n", ip_to_string(&net));
+
+  update_timer_node(node, vtime);
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         for(tmp_hna = tmp_nodes->hna.next;
+             tmp_hna != &tmp_nodes->hna;
+             tmp_hna = tmp_hna->next)
+           {
+             if((memcmp(&tmp_hna->net, net, ipsize) == 0) && (memcmp(&tmp_hna->mask, mask, ipsize) == 0))
+               return 0;
+           }
+
+         //printf("NEW HNA ADDED FOR %s ", ip_to_string(node));
+         //printf("net: %s \n", ip_to_string(&net));
+         /* we didn't find the address */
+         if((tmp_hna = malloc(sizeof(struct hna))) == 0)
+           {
+             fprintf(stderr, "OUT OF MEMORY\n");
+             exit(1);
+           }
+
+         memcpy(&tmp_hna->net, net, ipsize);
+         memcpy(&tmp_hna->mask, mask, ipsize);
+
+         /* queue */
+         tmp_nodes->hna.next->prev = tmp_hna;
+         tmp_hna->next = tmp_nodes->hna.next;
+         tmp_nodes->hna.next = tmp_hna;
+         tmp_hna->prev = &tmp_nodes->hna;
+         
+         update_nodes_list(tmp_nodes);
+         return 1; 
+       }
+    }
+
+
+
+  printf("ADDING NEW NODE %s FROM HNA...\n", ip_to_string(node));
+  /* We don't know wery much... */
+  memset(&new, 0, sizeof(struct node));
+  memcpy(&new.addr, node, ipsize);
+  inserted = insert_node(&new, vtime);
+
+  if((tmp_hna = malloc(sizeof(struct hna))) == 0)
+    {
+      fprintf(stderr, "OUT OF MEMORY!\n");
+      exit(1);
+    }
+
+  memcpy(&tmp_hna->net, net, ipsize);
+  memcpy(&tmp_hna->mask, mask, ipsize);
+
+  tmp_hna->next = &inserted->hna;
+  tmp_hna->prev = &inserted->hna;
+  inserted->hna.next = tmp_hna;
+  inserted->hna.prev = tmp_hna;
+
+  update_nodes_list(inserted);
+
+  return 2;
+}
+
+
+/**
+ *Add the MPR mpr to the node nodes selected MPRs.
+ *Nodes are NOT added if they are not yet registered!
+ *
+ *@param node the node that has chosen an MPR
+ *@param mpr the MPR choosen by node
+ *@return negative if node already registered or node not found
+ */
+int
+add_mpr(union olsr_ip_addr *node, union olsr_ip_addr *mpr, struct timeval *tmp_timer)
+{
+
+  struct node *tmp_nodes;
+  struct mpr *mprs;
+  struct mpr *tmp_mpr;
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         for(mprs = tmp_nodes->mpr.next;
+             mprs != &tmp_nodes->mpr;
+             mprs = mprs->next)
+           {
+             if(memcmp(&mprs->addr, mpr, ipsize) == 0)
+                 return 0;
+           }
+
+         //printf("Adding MPR %s to ", ip_to_string(mpr));
+         //printf("%s\n", ip_to_string(node));
+         /* Add mpr */
+
+         if((tmp_mpr = malloc(sizeof(struct mpr))) == 0)
+           {
+             fprintf(stderr, "OUT OF MEMORY\n");
+             exit(1);
+           }
+
+         memcpy(&tmp_mpr->addr, mpr, ipsize);
+
+         gettimeofday(&now, (struct timezone *)NULL);
+         timeradd(&now, tmp_timer, &tmp_mpr->timer);
+
+         /* queue */
+         tmp_nodes->mpr.next->prev = tmp_mpr;
+         tmp_mpr->next = tmp_nodes->mpr.next;
+         tmp_nodes->mpr.next = tmp_mpr;
+         tmp_mpr->prev = &tmp_nodes->mpr;
+
+         update_nodes_list(tmp_nodes);
+         return 1; 
+
+       }
+    }
+
+  return 1;
+}
+
+
+
+
+int
+remove_node(struct node *node)
+{
+  struct hna *tmp_hna, *tmp_hna2;
+  struct mid *tmp_mid, *tmp_mid2;
+  struct mpr *tmp_mpr, *tmp_mpr2;
+
+  printf("Remove node %s\n", ip_to_string(&node->addr));
+
+
+  tmp_hna = node->hna.next;
+  while(tmp_hna != &node->hna)
+    {
+      tmp_hna2 = tmp_hna;
+      tmp_hna = tmp_hna->next;
+      free(tmp_hna2);
+    }
+  tmp_mpr = node->mpr.next;
+  while(tmp_mpr != &node->mpr)
+    {
+      tmp_mpr2 = tmp_mpr;
+      tmp_mpr = tmp_mpr->next;
+      free(tmp_mpr2);
+    }
+  tmp_mid = node->mid.next;
+  while(tmp_mid != &node->mid)
+    {
+      tmp_mid2 = tmp_mid;
+      tmp_mid = tmp_mid->next;
+      free(tmp_mid2);
+    }
+  
+  /* Gemove form GUI */
+  remove_nodes_list(&node->addr);
+  
+  /* Dequeue */
+  node->prev->next = node->next;
+  node->next->prev = node->prev;
+  
+  free(node);
+
+  return 1;  
+}
+
+
+
+
+
+
+/*
+ * Remove based on address
+ */
+
+int
+remove_node_addr(union olsr_ip_addr *node)
+{
+  struct node *tmp_nodes;
+  struct hna *tmp_hna, *tmp_hna2;
+  struct mid *tmp_mid, *tmp_mid2;
+  struct mpr *tmp_mpr, *tmp_mpr2;
+
+  printf("Remove node %s\n", ip_to_string(node));
+
+
+  tmp_nodes = nodes.next;
+
+  while(tmp_nodes != &nodes)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         printf("(2)Deleting node %s\n", ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr));
+
+         tmp_hna = tmp_nodes->hna.next;
+         while(tmp_hna != &tmp_nodes->hna)
+           {
+             tmp_hna2 = tmp_hna;
+             tmp_hna = tmp_hna->next;
+             free(tmp_hna2);
+           }
+         tmp_mpr = tmp_nodes->mpr.next;
+         while(tmp_mpr != &tmp_nodes->mpr)
+           {
+             tmp_mpr2 = tmp_mpr;
+             tmp_mpr = tmp_mpr->next;
+             free(tmp_mpr2);
+           }
+         tmp_mid = tmp_nodes->mid.next;
+         while(tmp_mid != &tmp_nodes->mid)
+           {
+             tmp_mid2 = tmp_mid;
+             tmp_mid = tmp_mid->next;
+             free(tmp_mid2);
+           }
+
+         /* Gemove form GUI */
+         remove_nodes_list(&tmp_nodes->addr);
+
+         /* Dequeue */
+         tmp_nodes->prev->next = tmp_nodes->next;
+         tmp_nodes->next->prev = tmp_nodes->prev;
+
+         free(tmp_nodes);
+
+         return 1;
+       }
+
+      tmp_nodes = tmp_nodes->next;
+    }
+
+  return 0;
+}
+
+
+
+
+struct node *
+find_node(char *ip)
+{
+  struct node *tmp_nodes;
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(strcmp(ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr), ip) == 0)
+       return tmp_nodes;
+    }
+
+  return NULL;
+}
+
+
+struct node *
+find_node_t(union olsr_ip_addr *ip)
+{
+  struct node *tmp_nodes;
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, ip, ipsize) == 0)
+       return tmp_nodes;
+    }
+
+
+  return 0;
+}
+
+
+/*
+ *Remove timed out nodes
+ */
+gint
+time_out_nodes(gpointer data)
+{
+  struct node *tmp_nodes;
+  struct node *node_to_delete;
+
+  /* Wait before starting timing out */
+  if(timeouts)
+    {
+      timeouts--;
+      //printf("Waiting...\n");
+      return 1;
+    }
+
+  //printf("Timing out nodes...\n");
+  gettimeofday(&now, (struct timezone *)NULL);
+
+  tmp_nodes = nodes.next;
+
+  while(tmp_nodes != &nodes)
+    {
+      //printf("%s: %6d < %6d\n", ip_to_string(&tmp_nodes->addr), tmp_nodes->timer.tv_sec, now.tv_sec);
+      if(timercmp(&tmp_nodes->timer,&now,<))
+       {
+         printf("Node %s timed out...\n", ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr));
+         node_to_delete = tmp_nodes;
+
+         tmp_nodes = tmp_nodes->next;
+
+         remove_nodes_list(&node_to_delete->addr);
+         remove_node(node_to_delete);
+       } 
+      else
+       tmp_nodes = tmp_nodes->next;
+    }
+
+  return 1;
+}
+
+
+
+/**
+ *Timeout MPRs for a given node. Only called when user
+ *is to see the registered MPRs of the node.
+ *@param node the node whom MPRs should be timed out
+ *@return negative if node not found
+ */
+int
+time_out_mprs(union olsr_ip_addr *node)
+{
+
+  struct node *tmp_nodes;
+  struct mpr *mpr_to_delete;
+  struct mpr *tmp_mpr;
+
+  gettimeofday(&now, (struct timezone *)NULL);
+
+
+  /* W A R N I N G !
+   *
+   * THIS ALGORITHM HAS NOT BEEN TESTED PROPERLY!!!!!!
+   * -Andreas
+   */
+
+  for(tmp_nodes = nodes.next;
+      tmp_nodes != &nodes;
+      tmp_nodes = tmp_nodes->next)
+    {
+      if(memcmp(&tmp_nodes->addr, node, ipsize) == 0)
+       {
+         tmp_mpr = tmp_nodes->mpr.next;
+        
+         while(tmp_mpr != &tmp_nodes->mpr)
+           {
+             if(timercmp(&tmp_mpr->timer,&now,<))
+               {
+                 printf("MPR %s OF NODE ", ip_to_string((union olsr_ip_addr *)&tmp_mpr->addr));
+                 printf("%s TIMIED OUT ", ip_to_string((union olsr_ip_addr *)&tmp_nodes->addr));fflush(stdout);
+
+                 mpr_to_delete = tmp_mpr;
+                 tmp_mpr = tmp_mpr->next;
+
+                 /* Dequeue */
+                 mpr_to_delete->next->prev = mpr_to_delete->prev;
+                 mpr_to_delete->prev->next = mpr_to_delete->next;
+                 /* Delete */
+                 free(mpr_to_delete);
+               }
+             else
+               tmp_mpr = tmp_mpr->next;
+           }
+
+         return 1;
+       }
+    }
+
+  return 0;
+}
+
+
+
+void
+init_timer(olsr_u32_t time_value, struct timeval *hold_timer)
+{ 
+  olsr_u16_t  time_value_sec=0;
+  olsr_u16_t  time_value_msec=0;
+
+  time_value_sec=time_value/1000;
+  time_value_msec=time_value-(time_value_sec*1000);
+
+  hold_timer->tv_sec=time_value_sec;
+  hold_timer->tv_usec=time_value_msec*1000; 
+  
+}
+
+
+/**
+ *Function that converts a mantissa/exponent 8bit value back
+ *to double as described in RFC3626:
+ *
+ * value = C*(1+a/16)*2^b [in seconds]
+ *
+ *  where a is the integer represented by the four highest bits of the
+ *  field and b the integer represented by the four lowest bits of the
+ *  field.
+ *
+ *@param me the 8 bit mantissa/exponen value
+ *
+ *@return a double value
+ */
+double
+me_to_double(olsr_u8_t me)
+{
+  int a = me>>4;
+  int b = me - a*16;
+  return (double)(VTIME_SCALE_FACTOR*(1+(double)a/16)*(double)pow(2,b));
+}
diff --git a/front-end/src/nodes.h b/front-end/src/nodes.h
new file mode 100644 (file)
index 0000000..becfd0a
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ *Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ *Node information
+ */
+
+#include <sys/time.h>
+//#include <time.h>
+
+
+struct timeval now;
+struct timeval hold_time_nodes; /* Timeout for all nodes */
+
+/* The node list */
+struct node nodes;
+
+
+struct node *
+insert_node(struct node *, olsr_u8_t);
+
+
+int
+remove_node(struct node *);
+
+int
+remove_node_addr(union olsr_ip_addr *);
+
+double
+me_to_double(olsr_u8_t);
+
diff --git a/front-end/src/olsr.c b/front-end/src/olsr.c
new file mode 100644 (file)
index 0000000..42bea34
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "common.h"
+
+
diff --git a/front-end/src/olsr_protocol.h b/front-end/src/olsr_protocol.h
new file mode 100644 (file)
index 0000000..be074cd
--- /dev/null
@@ -0,0 +1,437 @@
+/*
+ * OLSR ad-hoc routing table management protocol
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of the UniK OLSR daemon.
+ *
+ * The UniK OLSR daemon is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * The UniK OLSR daemon is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the UniK OLSR daemon; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ *Values and packet formats as proposed in RFC3626 and misc. values and
+ *data structures used by the UniK olsr daemon.
+ */
+
+#ifndef _PROTOCOLS_OLSR_H
+#define        _PROTOCOLS_OLSR_H
+
+/* Port for OLSR to use */
+
+#define OLSRPORT       698
+
+/* Default IPv6 multicast address */
+
+#define OLSR_IPV6_MULTICAST_ADDR "ff05::15"
+
+/* types */
+#include <sys/types.h>
+
+#ifdef WIN32
+typedef unsigned char   olsr_u8_t;
+typedef unsigned short  olsr_u16_t;
+typedef unsigned int    olsr_u32_t;
+typedef char            olsr_8_t;
+typedef short           olsr_16_t;
+typedef int             olsr_32_t;
+#else
+typedef u_int8_t        olsr_u8_t;
+typedef u_int16_t       olsr_u16_t;
+typedef u_int32_t       olsr_u32_t;
+typedef int8_t          olsr_8_t;
+typedef int16_t         olsr_16_t;
+typedef int32_t         olsr_32_t;
+#endif
+
+/* IPv6 address format in6_addr */
+#include <netinet/in.h>
+
+union olsr_ip_addr
+{
+  olsr_u32_t v4;
+  struct in6_addr v6;
+};
+
+
+/*
+ *Emission Intervals
+ */
+
+#define HELLO_INTERVAL        2
+#define HELLO_INTERVAL_NW     HELLO_INTERVAL * 2
+#define REFRESH_INTERVAL      2
+#define TC_INTERVAL           5
+#define MID_INTERVAL          TC_INTERVAL
+#define HNA_INTERVAL          TC_INTERVAL
+
+/*
+ *Holding Time
+ */
+
+#define NEIGHB_HOLD_TIME      3 * REFRESH_INTERVAL
+/*extra: time to delete for non-wireless interfaces */
+#define NEIGHB_HOLD_TIME_NW   NEIGHB_HOLD_TIME * 2
+#define TOP_HOLD_TIME         3 * TC_INTERVAL
+#define DUP_HOLD_TIME         30
+#define MID_HOLD_TIME         3 * MID_INTERVAL
+#define HNA_HOLD_TIME         3 * HNA_INTERVAL
+
+/*
+ * Scaling factor
+ */
+
+#define VTIME_SCALE_FACTOR    0.0625
+
+/*
+ *Message Types
+ */
+
+#define HELLO_MESSAGE         1
+#define TC_MESSAGE            2
+#define MID_MESSAGE           3
+#define HNA_MESSAGE           4
+#define MAX_MESSAGE           4
+
+/*
+ *Link Types
+ */
+
+#define UNSPEC_LINK           0
+#define ASYM_LINK             1
+#define SYM_LINK              2
+#define LOST_LINK             3
+#define MAX_LINK              3
+
+/*
+ *Neighbor Types
+ */
+
+#define NOT_NEIGH             0
+#define SYM_NEIGH             1
+#define MPR_NEIGH             2
+#define MAX_NEIGH             2
+
+/*
+ *Neighbor status
+ */
+
+#define NOT_SYM               0
+#define SYM                   1
+
+/*
+ *Link Hysteresis
+ */
+
+#define HYST_THRESHOLD_HIGH   0.8
+#define HYST_THRESHOLD_LOW    0.3
+#define HYST_SCALING          0.5
+
+/*
+ *Willingness
+ */
+
+#define WILL_NEVER            0
+#define WILL_LOW              1
+#define WILL_DEFAULT          3
+#define WILL_HIGH             6
+#define WILL_ALWAYS           7
+
+/*
+ *Misc. Constants
+ */
+
+#define TC_REDUNDANCY         0
+#define MPR_COVERAGE          1
+#define MAXJITTER             HELLO_INTERVAL / 4
+#define MAX_TTL               0xff
+
+/*
+ *Sequence numbering
+ */
+
+/* Seqnos are 16 bit values */
+
+#define MAXVALUE 0xFFFF
+
+/* Macro for checking seqnos "wraparound" */
+#define SEQNO_GREATER_THAN(s1, s2)                \
+        (((s1 > s2) && (s1 - s2 <= (MAXVALUE/2))) \
+     || ((s2 > s1) && (s2 - s1 > (MAXVALUE/2))))
+
+
+
+/*
+ * Macros for creating and extracting the neighbor 
+ * and link type information from 8bit link_code
+ * data as passed in HELLO messages
+ */
+
+#define CREATE_LINK_CODE(status, link) (link | (status<<2))
+
+#define EXTRACT_STATUS(link_code) ((link_code & 0xC)>>2)
+
+#define EXTRACT_LINK(link_code) (link_code & 0x3)
+
+
+/***********************************************
+ *           OLSR packet definitions           *
+ ***********************************************/
+
+
+/*
+ *The HELLO message
+ */
+
+/*
+ *Hello info
+ */
+struct hellinfo 
+{
+  olsr_u8_t   link_code;
+  olsr_u8_t   reserved;
+  olsr_u16_t  size;
+  olsr_u32_t  neigh_addr[1]; /* neighbor IP address(es) */
+};
+
+struct hellomsg 
+{
+  olsr_u16_t      reserved;
+  olsr_u8_t       htime;
+  olsr_u8_t       willingness;
+  struct hellinfo hell_info[1];
+};
+
+/*
+ *IPv6
+ */
+
+struct hellinfo6
+{
+  olsr_u8_t       link_code;
+  olsr_u8_t       reserved;
+  olsr_u16_t      size;
+  struct in6_addr neigh_addr[1]; /* neighbor IP address(es) */
+};
+
+struct hellomsg6
+{
+  olsr_u16_t         reserved;
+  olsr_u8_t          htime;
+  olsr_u8_t          willingness;
+  struct hellinfo6 hell_info[1];
+};
+
+
+
+
+
+/*
+ * Topology Control packet
+ */
+
+struct neigh_info
+{
+  olsr_u32_t       addr;
+};
+
+
+struct tcmsg 
+{
+  olsr_u16_t        ansn;
+  olsr_u16_t        reserved;
+  struct neigh_info neigh[1];
+};
+
+
+/*
+ *IPv6
+ */
+
+struct neigh_info6
+{
+  struct in6_addr      addr;
+};
+
+
+struct tcmsg6
+{
+  olsr_u16_t           ansn;
+  olsr_u16_t           reserved;
+  struct neigh_info6 neigh[1];
+};
+
+
+
+
+
+/*
+ *Multiple Interface Declaration message
+ */
+
+/* 
+ * Defined as s struct for further expansion 
+ * For example: do we want to tell what type of interface
+ * is associated whit each address?
+ */
+struct midaddr
+{
+  olsr_u32_t addr;
+};
+
+
+struct midmsg 
+{
+  struct midaddr mid_addr[1];
+};
+
+
+/*
+ *IPv6
+ */
+struct midaddr6
+{
+  struct in6_addr addr;
+};
+
+
+struct midmsg6
+{
+  struct midaddr6 mid_addr[1];
+};
+
+
+
+
+
+
+/*
+ * Host and Network Association message
+ */
+struct hnapair
+{
+  olsr_u32_t   addr;
+  olsr_u32_t   netmask;
+};
+
+struct hnamsg
+{
+  struct hnapair hna_net[1];
+};
+
+/*
+ *IPv6
+ */
+
+struct hnapair6
+{
+  struct in6_addr   addr;
+  struct in6_addr   netmask;
+};
+
+struct hnamsg6
+{
+  struct hnapair6 hna_net[1];
+};
+
+
+
+
+
+/*
+ * OLSR message (several can exist in one OLSR packet)
+ */
+
+struct olsrmsg
+{
+  olsr_u8_t     olsr_msgtype;
+  olsr_u8_t     olsr_vtime;
+  olsr_u16_t    olsr_msgsize;
+  olsr_u32_t    originator;
+  olsr_u8_t     ttl;
+  olsr_u8_t     hopcnt;
+  olsr_u16_t    seqno;
+
+  union 
+  {
+    struct hellomsg hello;
+    struct tcmsg    tc;
+    struct hnamsg   hna;
+    struct midmsg   mid;
+  } message;
+
+};
+
+/*
+ *IPv6
+ */
+
+struct olsrmsg6
+{
+  olsr_u8_t        olsr_msgtype;
+  olsr_u8_t        olsr_vtime;
+  olsr_u16_t       olsr_msgsize;
+  struct in6_addr  originator;
+  olsr_u8_t        ttl;
+  olsr_u8_t        hopcnt;
+  olsr_u16_t       seqno;
+
+  union 
+  {
+    struct hellomsg6 hello;
+    struct tcmsg6    tc;
+    struct hnamsg6   hna;
+    struct midmsg6   mid;
+  } message;
+
+};
+
+
+
+/*
+ * Generic OLSR packet
+ */
+
+struct olsr 
+{
+  olsr_u16_t     olsr_packlen;         /* packet length */
+  olsr_u16_t     olsr_seqno;
+  struct olsrmsg  olsr_msg[1];          /* variable messages */
+};
+
+
+struct olsr6
+{
+  olsr_u16_t       olsr_packlen;        /* packet length */
+  olsr_u16_t       olsr_seqno;
+  struct olsrmsg6   olsr_msg[1];         /* variable messages */
+};
+
+
+/* IPv4 <-> IPv6 compability */
+
+union olsr_message
+{
+  struct olsrmsg v4;
+  struct olsrmsg6 v6;
+};
+
+union olsr_packet
+{
+  struct olsr v4;
+  struct olsr6 v6;
+};
+
+
+#endif
diff --git a/front-end/src/packet.c b/front-end/src/packet.c
new file mode 100644 (file)
index 0000000..dda9afc
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ *Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ *The list of cached packets
+ *
+ */
+
+#include "common.h"
+#include "packet.h"
+
+struct packnode *packets = NULL;
+int no_packets = 0;
+
+/*
+ *Add the contets of a packet to
+ *the cached packets
+ */
+int
+add_packet_to_buffer(union olsr_message *p, int size)
+{
+  struct packnode *tmp;
+  /* Should be the same for v4 and v6 */
+
+
+  /* If this is the first packet */
+  if(!packets)
+    {
+      //printf("Adding first packet\n");
+      packets = malloc(sizeof(struct packnode));
+      packets->packet = malloc(size);
+      memcpy(packets->packet, p, size);
+      packets->next = NULL;
+      no_packets++;
+      return 1;
+    }
+  else
+    {
+      /* If the buffer is not full */
+      if(no_packets < MAXPACKS)
+       {
+         //printf("Buffer not filled yet..\n");
+         tmp = packets;
+         packets = malloc(sizeof(struct packnode));
+         packets->packet = malloc(size);
+         memcpy(packets->packet, p, size);
+         packets->next = tmp;
+         no_packets++;
+         return 1;
+       }
+      /* If buffer is full */
+      else
+       {
+         //printf("Buffer full - deleting...\n");
+         tmp = packets;
+         /* Find second last packet */
+         while(tmp->next->next)
+           {
+             tmp = tmp->next;
+           }
+         /* Delete last packet */
+         free(tmp->next->packet);
+         free(tmp->next);
+         tmp->next = NULL;
+
+         /*Add the new packet */
+         tmp = packets;
+         packets = malloc(sizeof(struct packnode));
+         packets->packet = malloc(size);
+         memcpy(packets->packet, p, size);
+         packets->next = tmp;
+         return 1;
+       }
+
+    }
+  return 0;
+}
+
+
+
+/*
+ *Get the packet with index 'index'
+ */
+union olsr_message *
+get_packet(int index)
+{
+  int i = 0;
+  struct packnode *tmp;
+
+  if(index>MAXPACKS)
+    return 0;
+
+  if(index == 0)
+    return packets->packet;
+
+  tmp = packets;
+
+  while(i != index)
+    {
+      tmp = tmp->next;
+      i++;
+    }
+  return tmp->packet;
+
+}
diff --git a/front-end/src/packet.h b/front-end/src/packet.h
new file mode 100644 (file)
index 0000000..823128d
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ *Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ *The list of cached packets
+ *
+ */
+
+#ifndef _PACKET_H
+#define _PACKET_H
+
+struct packnode
+{
+  union olsr_message *packet;
+  struct packnode *next;
+};
+
+
+
+/*
+ * Unions for IPv4 <-> IPv6 compability
+ */
+
+union hello_message
+{
+  struct hellomsg v4;
+  struct hellomsg6 v6;
+};
+
+
+union tc_message
+{
+  struct tcmsg v4;
+  struct tcmsg6 v6;
+};
+
+
+union mid_message
+{
+  struct midmsg v4;
+  struct midmsg6 v6;
+};
+
+
+
+union hna_message
+{
+  struct hnamsg v4;
+  struct hnamsg6 v6;
+};
+
+
+
+
+#endif
diff --git a/front-end/src/pixmaps.h b/front-end/src/pixmaps.h
new file mode 100644 (file)
index 0000000..72a5832
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "pixmaps/logo.xpm"
diff --git a/front-end/src/pixmaps/logo.xpm b/front-end/src/pixmaps/logo.xpm
new file mode 100644 (file)
index 0000000..bd482b2
--- /dev/null
@@ -0,0 +1,2165 @@
+/* XPM */
+static char * logo_xpm[] = {
+"51 70 2092 2",
+"      c None",
+".     c #FFFFF4",
+"+     c #FEFFF8",
+"@     c #F4FBF4",
+"#     c #F9FFFF",
+"$     c #FBFFFF",
+"%     c #FBFCFF",
+"&     c #FDFCFF",
+"*     c #FDFDFF",
+"=     c #F5FFFF",
+"-     c #F7FFFF",
+";     c #F1FAF9",
+">     c #EEF7F6",
+",     c #F8FFFF",
+"'     c #FEFEFF",
+")     c #ECFCF9",
+"!     c #F3FFFF",
+"~     c #FCFFFF",
+"{     c #FFFEFF",
+"]     c #F7F8FA",
+"^     c #F8FEFE",
+"/     c #FAFEFF",
+"(     c #FFFFFF",
+"_     c #F6F7F9",
+":     c #F2FFFF",
+"<     c #F4FCFE",
+"[     c #FEFFFF",
+"}     c #FCF5FC",
+"|     c #FFFCFF",
+"1     c #FFFBFF",
+"2     c #FFFBFA",
+"3     c #FFF9FA",
+"4     c #FFFFFD",
+"5     c #FFFAFF",
+"6     c #F7FAF3",
+"7     c #FFFCF9",
+"8     c #EEF7F2",
+"9     c #A1B6AF",
+"0     c #A7C2BB",
+"a     c #97B0AA",
+"b     c #F0FFFF",
+"c     c #BDD4CA",
+"d     c #DEF8EB",
+"e     c #B6C9C5",
+"f     c #E6F5F2",
+"g     c #EFF8F7",
+"h     c #F5F6F8",
+"i     c #FAF4F8",
+"j     c #FFFDFF",
+"k     c #C8D9D3",
+"l     c #B0C9C3",
+"m     c #98BCB2",
+"n     c #AACEC4",
+"o     c #B7D4CF",
+"p     c #B1CAC6",
+"q     c #9DC0BA",
+"r     c #C1D4CE",
+"s     c #B4C7C1",
+"t     c #D2E7E0",
+"u     c #D0E3DD",
+"v     c #AFC0BA",
+"w     c #E8F7F2",
+"x     c #BDCCC7",
+"y     c #DDEEE8",
+"z     c #92C2B2",
+"A     c #A3CFC0",
+"B     c #98B9AE",
+"C     c #AAC1B9",
+"D     c #A8B7B2",
+"E     c #F8FCFB",
+"F     c #F2F0F1",
+"G     c #F4FFFF",
+"H     c #E5E7E6",
+"I     c #D4EBE3",
+"J     c #9EBCB2",
+"K     c #DCECE9",
+"L     c #A3CBC2",
+"M     c #DBF1EF",
+"N     c #AECDC8",
+"O     c #C7DCDD",
+"P     c #F4FAF0",
+"Q     c #C0E1D8",
+"R     c #568F80",
+"S     c #7ABFAC",
+"T     c #408572",
+"U     c #549881",
+"V     c #11573B",
+"W     c #297656",
+"X     c #568D7A",
+"Y     c #71A191",
+"Z     c #C7EDE0",
+"`     c #B1CCC3",
+" .    c #F0FFFB",
+"..    c #F3F5F4",
+"+.    c #D6F1E8",
+"@.    c #AAD0C3",
+"#.    c #83B3A3",
+"$.    c #A4D9C9",
+"%.    c #38685A",
+"&.    c #5E8C81",
+"*.    c #689A8E",
+"=.    c #518A7B",
+"-.    c #2C8162",
+";.    c #106345",
+">.    c #307F62",
+",.    c #5CAB8E",
+"'.    c #6AB69A",
+").    c #72BEA2",
+"!.    c #0F583D",
+"~.    c #549A80",
+"{.    c #548B76",
+"].    c #8EBFAC",
+"^.    c #8CB2A3",
+"/.    c #A3BFB3",
+"(.    c #CADBD3",
+"_.    c #F7FFFB",
+":.    c #FAFFFB",
+"<.    c #FEFFFD",
+"[.    c #E6F9F3",
+"}.    c #E4EDEC",
+"|.    c #799D93",
+"1.    c #81B1A3",
+"2.    c #A4CCC1",
+"3.    c #519580",
+"4.    c #487E6E",
+"5.    c #1A5948",
+"6.    c #79ABA0",
+"7.    c #EDFFFA",
+"8.    c #C0D5D0",
+"9.    c #528478",
+"0.    c #387868",
+"a.    c #71B09F",
+"b.    c #8CC7B3",
+"c.    c #45836C",
+"d.    c #579C7F",
+"e.    c #9FCFBF",
+"f.    c #92BCAE",
+"g.    c #AFCFC4",
+"h.    c #DBE1DF",
+"i.    c #F9F7F8",
+"j.    c #FFFAFD",
+"k.    c #D3F3E8",
+"l.    c #608C7D",
+"m.    c #4C8572",
+"n.    c #6AA893",
+"o.    c #76B19F",
+"p.    c #92CDBB",
+"q.    c #488877",
+"r.    c #4F9884",
+"s.    c #57A188",
+"t.    c #246851",
+"u.    c #9DDBC6",
+"v.    c #5A9581",
+"w.    c #478570",
+"x.    c #1E5945",
+"y.    c #ABE0CE",
+"z.    c #B5E4D4",
+"A.    c #83AF9E",
+"B.    c #D0F6E7",
+"C.    c #94B0A4",
+"D.    c #DCEDE5",
+"E.    c #F9FFFD",
+"F.    c #FFFEFC",
+"G.    c #FAF9F7",
+"H.    c #FBFBF9",
+"I.    c #D6E2DE",
+"J.    c #B3D8D0",
+"K.    c #A6D8CC",
+"L.    c #538979",
+"M.    c #337B63",
+"N.    c #5B9F86",
+"O.    c #8EC5B2",
+"P.    c #608880",
+"Q.    c #F0FDF6",
+"R.    c #FAFCFB",
+"S.    c #C7E6DE",
+"T.    c #4C8B7A",
+"U.    c #549F8B",
+"V.    c #65A896",
+"W.    c #6FA595",
+"X.    c #59907D",
+"Y.    c #56947D",
+"Z.    c #5C8678",
+"`.    c #E6FFFF",
+" +    c #95B3A9",
+".+    c #ECFFF9",
+"++    c #D6E1DD",
+"@+    c #FCFEFD",
+"#+    c #F8FFFD",
+"$+    c #D6EDE3",
+"%+    c #BFE3D7",
+"&+    c #93BDAF",
+"*+    c #76A094",
+"=+    c #82AEA1",
+"-+    c #76A99A",
+";+    c #417C6A",
+">+    c #71AC9A",
+",+    c #9DCDBF",
+"'+    c #4C7469",
+")+    c #9AC0B5",
+"!+    c #DDFFFB",
+"~+    c #497166",
+"{+    c #90AFA7",
+"]+    c #97ACA7",
+"^+    c #B5CAC3",
+"/+    c #E9F4F0",
+"(+    c #F7EEF1",
+"_+    c #FFFAFE",
+":+    c #F1FFFD",
+"<+    c #CADFD8",
+"[+    c #84ACA3",
+"}+    c #6C9A90",
+"|+    c #A4DCCF",
+"1+    c #73B8A3",
+"2+    c #6FB098",
+"3+    c #014C2E",
+"4+    c #5FA186",
+"5+    c #80A89F",
+"6+    c #AFD8CA",
+"7+    c #246E57",
+"8+    c #1C6E58",
+"9+    c #367968",
+"0+    c #508276",
+"a+    c #74A295",
+"b+    c #7CAF9E",
+"c+    c #EAFFFB",
+"d+    c #8EA39C",
+"e+    c #ECFDF7",
+"f+    c #C8D3CF",
+"g+    c #EFF5F3",
+"h+    c #FAFFFE",
+"i+    c #B5C2BB",
+"j+    c #DFFAF1",
+"k+    c #86A79C",
+"l+    c #CDEEE3",
+"m+    c #A6CAC0",
+"n+    c #679386",
+"o+    c #93C8B8",
+"p+    c #11503F",
+"q+    c #88BCAF",
+"r+    c #B8E2D8",
+"s+    c #588077",
+"t+    c #91BCB2",
+"u+    c #7FAAA0",
+"v+    c #E9FFFF",
+"w+    c #EEFFFF",
+"x+    c #CFE8E2",
+"y+    c #AABFBA",
+"z+    c #D3E2DF",
+"A+    c #F8FCFD",
+"B+    c #D0E5DC",
+"C+    c #79A198",
+"D+    c #B7D5D3",
+"E+    c #7FA49D",
+"F+    c #5E9786",
+"G+    c #91B7A8",
+"H+    c #427860",
+"I+    c #B9F1D6",
+"J+    c #77948F",
+"K+    c #B6D5CD",
+"L+    c #548D7C",
+"M+    c #478270",
+"N+    c #A9E2D1",
+"O+    c #336E5C",
+"P+    c #669C8C",
+"Q+    c #B1D9CE",
+"R+    c #B0DED1",
+"S+    c #CBE6DF",
+"T+    c #B5E1D4",
+"U+    c #F7FDFD",
+"V+    c #ECFFFD",
+"W+    c #FEFCFF",
+"X+    c #74AD9C",
+"Y+    c #89B3A7",
+"Z+    c #387965",
+"`+    c #89B5A8",
+" @    c #639687",
+".@    c #569381",
+"+@    c #84B2A5",
+"@@    c #8FB3A9",
+"#@    c #7CA499",
+"$@    c #A6DBCB",
+"%@    c #77AD9D",
+"&@    c #7CA89B",
+"*@    c #CBEAE2",
+"=@    c #F8FAF9",
+"-@    c #FEFEFE",
+";@    c #FBFBFB",
+">@    c #F3FCF9",
+",@    c #EAEEEF",
+"'@    c #04543B",
+")@    c #B5CCC6",
+"!@    c #B1CFC7",
+"~@    c #5C887B",
+"{@    c #528D7B",
+"]@    c #17654D",
+"^@    c #B0DBCA",
+"/@    c #FBFFFA",
+"(@    c #CAEBE2",
+"_@    c #5B9483",
+":@    c #67A08F",
+"<@    c #5F9484",
+"[@    c #8EC3B3",
+"}@    c #517F72",
+"|@    c #D9FDF3",
+"1@    c #5B8E7F",
+"2@    c #93B7AD",
+"3@    c #92C2B4",
+"4@    c #DFE0E2",
+"5@    c #699387",
+"6@    c #FFF0F9",
+"7@    c #E2E8E8",
+"8@    c #FDF4F9",
+"9@    c #B7C6C3",
+"0@    c #9CCABD",
+"a@    c #91C4B5",
+"b@    c #77BCA7",
+"c@    c #80AC9F",
+"d@    c #A1CDC0",
+"e@    c #8BB3A8",
+"f@    c #DAF9F1",
+"g@    c #A1BAB4",
+"h@    c #D7F0EA",
+"i@    c #CCEDE4",
+"j@    c #7EA89C",
+"k@    c #F6FAF9",
+"l@    c #EBEDEC",
+"m@    c #F6F6F6",
+"n@    c #FDFDFD",
+"o@    c #FAFEFD",
+"p@    c #F4FAF8",
+"q@    c #D5E0DC",
+"r@    c #E1F8F2",
+"s@    c #EBFFFB",
+"t@    c #C9F1E6",
+"u@    c #BFE0D7",
+"v@    c #266552",
+"w@    c #9EC6BB",
+"x@    c #558A7A",
+"y@    c #D0EFE7",
+"z@    c #19644D",
+"A@    c #92BBAB",
+"B@    c #F9FEF7",
+"C@    c #B5D6CD",
+"D@    c #154B3B",
+"E@    c #78AE9E",
+"F@    c #93C3B5",
+"G@    c #83B3A5",
+"H@    c #CBF5E9",
+"I@    c #628078",
+"J@    c #7FB4A4",
+"K@    c #C8ECE2",
+"L@    c #A0C8BD",
+"M@    c #A9C0BA",
+"N@    c #DBF2EC",
+"O@    c #FCF7FB",
+"P@    c #5C9D89",
+"Q@    c #69A291",
+"R@    c #427F6D",
+"S@    c #C9EDE3",
+"T@    c #C8E6DE",
+"U@    c #D6FCF1",
+"V@    c #D3EAE4",
+"W@    c #B2C1BE",
+"X@    c #C3DED7",
+"Y@    c #79A598",
+"Z@    c #D9ECE8",
+"`@    c #F4EEF2",
+" #    c #FBFDFC",
+".#    c #F1F5F4",
+"+#    c #F4FFFB",
+"@#    c #357D67",
+"##    c #8FCCBA",
+"$#    c #5A8F7F",
+"%#    c #E7E8EA",
+"&#    c #D8EBE7",
+"*#    c #1E5D4A",
+"=#    c #6DB29D",
+"-#    c #1E6851",
+";#    c #C9EFE0",
+">#    c #FCFFF8",
+",#    c #D5ECE6",
+"'#    c #B5E5D7",
+")#    c #417465",
+"!#    c #CDFBEE",
+"~#    c #8FC2B3",
+"{#    c #90BCAF",
+"]#    c #C1E2D9",
+"^#    c #6F8D85",
+"/#    c #508D7B",
+"(#    c #F2FBFA",
+"_#    c #528F7D",
+":#    c #CDD9D7",
+"<#    c #D3ECE6",
+"[#    c #FBF5F9",
+"}#    c #EEEFF1",
+"|#    c #F6FFFF",
+"1#    c #7DA197",
+"2#    c #528878",
+"3#    c #2C745E",
+"4#    c #87B1A5",
+"5#    c #A0C1B8",
+"6#    c #B6CDC7",
+"7#    c #D9E8E5",
+"8#    c #92A19E",
+"9#    c #BFD2CE",
+"0#    c #B0C5C0",
+"a#    c #E0F7F1",
+"b#    c #DCE7E3",
+"c#    c #CCDBD6",
+"d#    c #D0E7E1",
+"e#    c #7FADA0",
+"f#    c #35896F",
+"g#    c #2C765F",
+"h#    c #EAFFFF",
+"i#    c #A1C5BB",
+"j#    c #438B75",
+"k#    c #6D9183",
+"l#    c #FDFEF8",
+"m#    c #FFF8FF",
+"n#    c #CFDEDB",
+"o#    c #80AA9E",
+"p#    c #659386",
+"q#    c #8DBDAF",
+"r#    c #83B9A9",
+"s#    c #8CC1B1",
+"t#    c #82ACA0",
+"u#    c #B2D0C8",
+"v#    c #539D86",
+"w#    c #B7D2CB",
+"x#    c #62A18E",
+"y#    c #C6DDD7",
+"z#    c #DFE8E7",
+"A#    c #FAFFFF",
+"B#    c #E6F6F3",
+"C#    c #A2BDB6",
+"D#    c #859C96",
+"E#    c #B1C4C0",
+"F#    c #E0F9F3",
+"G#    c #92B1A9",
+"H#    c #C7EFE4",
+"I#    c #639184",
+"J#    c #9BC7BA",
+"K#    c #B6D7CE",
+"L#    c #CEDDDA",
+"M#    c #FBFCFE",
+"N#    c #F9F9F9",
+"O#    c #CFDBD7",
+"P#    c #F2FFFD",
+"Q#    c #9AAFAA",
+"R#    c #589381",
+"S#    c #66A18F",
+"T#    c #C8EEE3",
+"U#    c #F8F6F9",
+"V#    c #599684",
+"W#    c #97C7B9",
+"X#    c #16513F",
+"Y#    c #95DDC7",
+"Z#    c #688C7E",
+"`#    c #FFFFFA",
+" $    c #92BCB0",
+".$    c #AADACC",
+"+$    c #558E7D",
+"@$    c #588E7E",
+"#$    c #477366",
+"$$    c #C3D2CF",
+"%$    c #B7DDD2",
+"&$    c #96C0B4",
+"*$    c #6CA594",
+"=$    c #7EBDAA",
+"-$    c #C1D6D1",
+";$    c #C0D9D3",
+">$    c #FFF9FE",
+",$    c #E8F2F1",
+"'$    c #B7DBD1",
+")$    c #AACBC2",
+"!$    c #649A8A",
+"~$    c #689E8E",
+"{$    c #91CEBC",
+"]$    c #729A8F",
+"^$    c #EEFFFD",
+"/$    c #E9FEF9",
+"($    c #99BFB4",
+"_$    c #A4CEC2",
+":$    c #BDD8D1",
+"<$    c #F8F8F8",
+"[$    c #FCFCFC",
+"}$    c #E6F1ED",
+"|$    c #B5C4BF",
+"1$    c #F1FFFE",
+"2$    c #CCEBE3",
+"3$    c #D5DFDE",
+"4$    c #599E89",
+"5$    c #276B56",
+"6$    c #BAE2D7",
+"7$    c #99BAB1",
+"8$    c #86ACA1",
+"9$    c #267059",
+"0$    c #9DC3B4",
+"a$    c #FEFFFA",
+"b$    c #D1ECE5",
+"c$    c #4E8172",
+"d$    c #9CD1C1",
+"e$    c #8CBFB0",
+"f$    c #6FA293",
+"g$    c #B1DFD2",
+"h$    c #A2C6BC",
+"i$    c #DDF8F1",
+"j$    c #729C90",
+"k$    c #BCD7D0",
+"l$    c #347863",
+"m$    c #1F5C4A",
+"n$    c #E8E9EB",
+"o$    c #F1FFFF",
+"p$    c #FFF9FF",
+"q$    c #FAF8FB",
+"r$    c #BFD6D0",
+"s$    c #DFF6F0",
+"t$    c #A2B7B2",
+"u$    c #80A198",
+"v$    c #84B0A3",
+"w$    c #80AEA1",
+"x$    c #B0D6CB",
+"y$    c #E2F7F2",
+"z$    c #F3F9F7",
+"A$    c #CED9D5",
+"B$    c #EBFCF6",
+"C$    c #88ACA2",
+"D$    c #C4E8DE",
+"E$    c #94BEB2",
+"F$    c #93BDB1",
+"G$    c #387361",
+"H$    c #D6F1EA",
+"I$    c #438E77",
+"J$    c #D5FEEE",
+"K$    c #A8D0C5",
+"L$    c #92CBBA",
+"M$    c #6F9F91",
+"N$    c #82B0A3",
+"O$    c #8CB2A7",
+"P$    c #EDFFFF",
+"Q$    c #4E7C6F",
+"R$    c #ADD1C7",
+"S$    c #A6D4C7",
+"T$    c #CCDFDB",
+"U$    c #93BFB2",
+"V$    c #98C0B5",
+"W$    c #C0DBD4",
+"X$    c #DAF5EE",
+"Y$    c #DAE9E6",
+"Z$    c #7EA69B",
+"`$    c #CEF2E8",
+" %    c #B4DACF",
+".%    c #C5E0D9",
+"+%    c #E3F6F2",
+"@%    c #ACC3BD",
+"#%    c #E0FFF7",
+"$%    c #93AEA7",
+"%%    c #ECF5F4",
+"&%    c #FDFFFE",
+"*%    c #DAE6E2",
+"=%    c #576C65",
+"-%    c #CFE2DE",
+";%    c #8DC0B1",
+">%    c #77908A",
+",%    c #A9DCCD",
+"'%    c #91B2A9",
+")%    c #9FC7BC",
+"!%    c #16644C",
+"~%    c #517C6B",
+"{%    c #BACBC5",
+"]%    c #A8D2C4",
+"^%    c #74AB98",
+"/%    c #5B907E",
+"(%    c #A7D7C7",
+"_%    c #A4D3C3",
+":%    c #699888",
+"<%    c #94C0B3",
+"[%    c #C4DDD7",
+"}%    c #4F8474",
+"|%    c #E9FFFA",
+"1%    c #61A28E",
+"2%    c #8AB2A7",
+"3%    c #8FB7AC",
+"4%    c #E4EDEA",
+"5%    c #FBFFFE",
+"6%    c #E2E8E6",
+"7%    c #6B897F",
+"8%    c #C5E6DB",
+"9%    c #90B6A9",
+"0%    c #73998C",
+"a%    c #BDDBD1",
+"b%    c #EEFFF9",
+"c%    c #FFF9FD",
+"d%    c #FCFAFB",
+"e%    c #F0ECED",
+"f%    c #8CBBAB",
+"g%    c #E8FFFC",
+"h%    c #508E79",
+"i%    c #91B0A8",
+"j%    c #61897E",
+"k%    c #4D8071",
+"l%    c #BDDED5",
+"m%    c #6FAA98",
+"n%    c #77A396",
+"o%    c #70A595",
+"p%    c #81C2AC",
+"q%    c #9CC5B5",
+"r%    c #FFFDFB",
+"s%    c #C7DED6",
+"t%    c #8DB7A9",
+"u%    c #75A897",
+"v%    c #A3D6C5",
+"w%    c #2A5949",
+"x%    c #84B4A4",
+"y%    c #73A695",
+"z%    c #94BAAF",
+"A%    c #356B5B",
+"B%    c #E0E9E8",
+"C%    c #408872",
+"D%    c #CCE5DF",
+"E%    c #609384",
+"F%    c #6F847F",
+"G%    c #F5FEFB",
+"H%    c #F2F8F6",
+"I%    c #F4FDFA",
+"J%    c #CAEADF",
+"K%    c #B5D6CB",
+"L%    c #A4C4B9",
+"M%    c #B2C9C1",
+"N%    c #D8E4E0",
+"O%    c #FFFBFD",
+"P%    c #DDF7EE",
+"Q%    c #437665",
+"R%    c #548D7A",
+"S%    c #BBE1D6",
+"T%    c #A5D5C7",
+"U%    c #8EC1B2",
+"V%    c #508978",
+"W%    c #4A7669",
+"X%    c #5A8D7E",
+"Y%    c #C7FCEC",
+"Z%    c #377663",
+"`%    c #488973",
+" &    c #5D8678",
+".&    c #FFFBF8",
+"+&    c #F5FFFD",
+"@&    c #C9E0D8",
+"#&    c #A7CDC0",
+"$&    c #D1FBED",
+"%&    c #426B5D",
+"&&    c #E4FFFF",
+"*&    c #5B8778",
+"=&    c #A0D5C3",
+"-&    c #B2DED1",
+";&    c #B8E2D6",
+">&    c #87ADA2",
+",&    c #D8F6EE",
+"'&    c #8CB4A9",
+")&    c #6CA795",
+"!&    c #DDFCF4",
+"~&    c #F6FCFA",
+"{&    c #F7F9F8",
+"]&    c #E0E6E4",
+"^&    c #77978C",
+"/&    c #C0DED4",
+"(&    c #C5DFD6",
+"_&    c #F8FFFE",
+":&    c #F9FBFA",
+"<&    c #F7FBFA",
+"[&    c #F7F5F6",
+"}&    c #B3D4C9",
+"|&    c #1B6149",
+"1&    c #8BC0AE",
+"2&    c #679C8C",
+"3&    c #528576",
+"4&    c #97C5B8",
+"5&    c #80C5B0",
+"6&    c #41826E",
+"7&    c #83C4B0",
+"8&    c #7DB0A1",
+"9&    c #6EAF99",
+"0&    c #A9D3C5",
+"a&    c #FFFEFB",
+"b&    c #D4E5DF",
+"c&    c #C1D8D0",
+"d&    c #E3FAF2",
+"e&    c #CADDD7",
+"f&    c #C0D5CE",
+"g&    c #8CACA1",
+"h&    c #BBE5D7",
+"i&    c #3C7161",
+"j&    c #E2F5F1",
+"k&    c #9FCBBE",
+"l&    c #A3BAB4",
+"m&    c #8DB9AC",
+"n&    c #F3FDFC",
+"o&    c #89BEAE",
+"p&    c #F1F2F4",
+"q&    c #DDE3E1",
+"r&    c #B9D7CD",
+"s&    c #AFC9C0",
+"t&    c #ACBDB7",
+"u&    c #DEE7E4",
+"v&    c #E8ECEB",
+"w&    c #BBD9CF",
+"x&    c #687F77",
+"y&    c #377560",
+"z&    c #A5DCC9",
+"A&    c #5E9182",
+"B&    c #AEE3D3",
+"C&    c #17674E",
+"D&    c #77AC9C",
+"E&    c #4F8C7A",
+"F&    c #559481",
+"G&    c #357662",
+"H&    c #A2CBBD",
+"I&    c #F8F7F3",
+"J&    c #E3E9E7",
+"K&    c #F0F2F1",
+"L&    c #ABC2BA",
+"M&    c #5C8A7D",
+"N&    c #E8F4F2",
+"O&    c #D6E2E0",
+"P&    c #C1E5DB",
+"Q&    c #9EB7B1",
+"R&    c #F9FDFC",
+"S&    c #E1F8F0",
+"T&    c #D9EAE4",
+"U&    c #FFFDFE",
+"V&    c #FEFCFD",
+"W&    c #B5C1BD",
+"X&    c #C6F2E3",
+"Y&    c #ACCDC2",
+"Z&    c #85BCA9",
+"`&    c #54917F",
+" *    c #DAF8F0",
+".*    c #438470",
+"+*    c #68988A",
+"@*    c #9EBFB6",
+"#*    c #518E7C",
+"$*    c #BFE5D8",
+"%*    c #FFFFFB",
+"&*    c #FFF8FB",
+"**    c #F8F6F7",
+"=*    c #FFFBFE",
+"-*    c #F5FFFC",
+";*    c #F2FCFB",
+">*    c #D9F0EA",
+",*    c #FFF5FB",
+"'*    c #AED2C8",
+")*    c #D4DDDC",
+"!*    c #BAC4C3",
+"~*    c #ECEEED",
+"{*    c #FDFBFC",
+"]*    c #F6FFFC",
+"^*    c #F6F4F5",
+"/*    c #FFFCFD",
+"(*    c #E1F2EC",
+"_*    c #E6E6E6",
+":*    c #538272",
+"<*    c #F4FFFE",
+"[*    c #6F9E8E",
+"}*    c #BCDBD3",
+"|*    c #577F74",
+"1*    c #6BA191",
+"2*    c #679185",
+"3*    c #B0DACE",
+"4*    c #92B0A8",
+"5*    c #6C988B",
+"6*    c #75AA9A",
+"7*    c #407668",
+"8*    c #E9EFED",
+"9*    c #FFF5FC",
+"0*    c #ECFFFB",
+"a*    c #FAFAFC",
+"b*    c #DFE5E5",
+"c*    c #FAFAFA",
+"d*    c #FBF7F8",
+"e*    c #FAF8F9",
+"f*    c #EFF8F5",
+"g*    c #E0F5EE",
+"h*    c #C8DBD5",
+"i*    c #809B92",
+"j*    c #A7D1C5",
+"k*    c #51796E",
+"l*    c #DCFAF2",
+"m*    c #618D80",
+"n*    c #9CC8BB",
+"o*    c #599482",
+"p*    c #73A194",
+"q*    c #8DBDB1",
+"r*    c #A7C5BD",
+"s*    c #FFF9F9",
+"t*    c #F2FFFC",
+"u*    c #F8FEFC",
+"v*    c #FFF7FE",
+"w*    c #F4FDFC",
+"x*    c #C4DBD3",
+"y*    c #FFFCFE",
+"z*    c #EAF5F1",
+"A*    c #D0F1E8",
+"B*    c #95C3B6",
+"C*    c #A5C9BF",
+"D*    c #55907E",
+"E*    c #6F958A",
+"F*    c #A2DFCD",
+"G*    c #185744",
+"H*    c #C8F3E9",
+"I*    c #DDE6E5",
+"J*    c #B8C1C0",
+"K*    c #E5F1EF",
+"L*    c #E9F9F6",
+"M*    c #E5F5F2",
+"N*    c #EDFDFA",
+"O*    c #A7B6B1",
+"P*    c #D6E9E3",
+"Q*    c #B8CDC6",
+"R*    c #E0F7EF",
+"S*    c #D0DCD8",
+"T*    c #F6F6F8",
+"U*    c #F2F6F7",
+"V*    c #DEE4E4",
+"W*    c #F6FFFE",
+"X*    c #E4F0EC",
+"Y*    c #F9FFFB",
+"Z*    c #E8FFFF",
+"`*    c #7CA69A",
+" =    c #BEECDF",
+".=    c #B6E2D5",
+"+=    c #98C4B7",
+"@=    c #DFEBE7",
+"#=    c #F6FFFD",
+"$=    c #F5F7F6",
+"%=    c #FAFCF7",
+"&=    c #96ABA6",
+"*=    c #BCD5CF",
+"==    c #DDEDEA",
+"-=    c #CCDBD8",
+";=    c #FBF9FA",
+">=    c #F7F3F4",
+",=    c #FDF9FA",
+"'=    c #91BBAF",
+")=    c #AEDCCF",
+"!=    c #A8CEC3",
+"~=    c #AAC5BE",
+"{=    c #C1DFD7",
+"]=    c #BED8CF",
+"^=    c #B0C7BF",
+"/=    c #E8FBF5",
+"(=    c #BECFC9",
+"_=    c #CAD6D2",
+":=    c #F4F4F4",
+"<=    c #EAECEB",
+"[=    c #F8FAF5",
+"}=    c #C2D5D1",
+"|=    c #4C786B",
+"1=    c #66998A",
+"2=    c #8BB1A6",
+"3=    c #CAE3DD",
+"4=    c #DCF1EC",
+"5=    c #D6EFE9",
+"6=    c #EFFFFC",
+"7=    c #EAFBF5",
+"8=    c #EEFDF8",
+"9=    c #F5FBF9",
+"0=    c #EFF1F0",
+"a=    c #F6F8F7",
+"b=    c #F7FFFE",
+"c=    c #D1DCD8",
+"d=    c #E1F0EB",
+"e=    c #EAF9F4",
+"f=    c #F8FFFB",
+"g=    c #DDF4EE",
+"h=    c #8DC2B2",
+"i=    c #669487",
+"j=    c #A5C3BB",
+"k=    c #91AAA4",
+"l=    c #7A9890",
+"m=    c #BAE0D3",
+"n=    c #9DC3B6",
+"o=    c #A1C2B7",
+"p=    c #C1DFD5",
+"q=    c #7E988F",
+"r=    c #9FB2AC",
+"s=    c #DFF0EA",
+"t=    c #EFEFEF",
+"u=    c #F2F2F2",
+"v=    c #F5F5F5",
+"w=    c #F5F9F8",
+"x=    c #DDE1E0",
+"y=    c #E2E6E5",
+"z=    c #BFCEC9",
+"A=    c #C2D3CD",
+"B=    c #EDFFFB",
+"C=    c #A3BAB2",
+"D=    c #A9C7BD",
+"E=    c #8DA89F",
+"F=    c #EEFFF8",
+"G=    c #317661",
+"H=    c #1D6851",
+"I=    c #81BEAC",
+"J=    c #9BC5B9",
+"K=    c #C4EADF",
+"L=    c #9FC9BD",
+"M=    c #A7CBBF",
+"N=    c #A9CDC1",
+"O=    c #94B4A9",
+"P=    c #CFEAE1",
+"Q=    c #AEC5BD",
+"R=    c #F0FFFD",
+"S=    c #F1FFFC",
+"T=    c #EBFAF5",
+"U=    c #E1E7E5",
+"V=    c #EAF0EE",
+"W=    c #E0F1EB",
+"X=    c #B9CAC4",
+"Y=    c #DDF2EB",
+"Z=    c #CAE1D9",
+"`=    c #ECFFFE",
+" -    c #98B8AD",
+".-    c #DFFFF5",
+"+-    c #5F8377",
+"@-    c #90B9AB",
+"#-    c #8DB3A6",
+"$-    c #E8FFF8",
+"%-    c #BAD1CB",
+"&-    c #5F9283",
+"*-    c #6AAB97",
+"=-    c #96BEB3",
+"--    c #8BC0B0",
+";-    c #9FBAB3",
+">-    c #E9FFFD",
+",-    c #B7D0CA",
+"'-    c #A8C6BE",
+")-    c #8FA49F",
+"!-    c #C6DFD9",
+"~-    c #88A79F",
+"{-    c #B3BFBB",
+"]-    c #EEF7F4",
+"^-    c #CDDCD7",
+"/-    c #D6EDE7",
+"(-    c #88BBAC",
+"_-    c #A0BBB4",
+":-    c #EDFFFE",
+"<-    c #649285",
+"[-    c #C9E8E0",
+"}-    c #759F93",
+"|-    c #E1FAF4",
+"1-    c #6D998C",
+"2-    c #7BB6A4",
+"3-    c #206F50",
+"4-    c #8DBEA8",
+"5-    c #FBFEF3",
+"6-    c #6CA191",
+"7-    c #216B54",
+"8-    c #5F9585",
+"9-    c #1F6A53",
+"0-    c #A2CABF",
+"a-    c #5F9887",
+"b-    c #93B9AE",
+"c-    c #71A797",
+"d-    c #AAD2C7",
+"e-    c #B5D4CC",
+"f-    c #9BCEBF",
+"g-    c #D6FFF5",
+"h-    c #ACCAC2",
+"i-    c #A2D0C3",
+"j-    c #D8E7E2",
+"k-    c #F2FEFA",
+"l-    c #F0F4F3",
+"m-    c #E4EFEB",
+"n-    c #C6D9D3",
+"o-    c #C1D1CE",
+"p-    c #79A196",
+"q-    c #659A8A",
+"r-    c #B9D8D0",
+"s-    c #719F92",
+"t-    c #D8EFE9",
+"u-    c #6A9287",
+"v-    c #3F7A68",
+"w-    c #70A092",
+"x-    c #80A69B",
+"y-    c #CDECE4",
+"z-    c #316757",
+"A-    c #58A38C",
+"B-    c #0C563B",
+"C-    c #5B8A76",
+"D-    c #F1FBFA",
+"E-    c #BCD3CD",
+"F-    c #387563",
+"G-    c #9BBFB5",
+"H-    c #9BC9BC",
+"I-    c #D2E5E1",
+"J-    c #99CCBD",
+"K-    c #568275",
+"L-    c #80B3A4",
+"M-    c #B7D5CD",
+"N-    c #DEFFF6",
+"O-    c #D4EFE8",
+"P-    c #E9FCF6",
+"Q-    c #B4C5BF",
+"R-    c #C3D2CD",
+"S-    c #E1ECE8",
+"T-    c #EBF1EF",
+"U-    c #D5E1DD",
+"V-    c #7BA599",
+"W-    c #A0B0AD",
+"X-    c #8CB6AA",
+"Y-    c #CAE9E1",
+"Z-    c #B9D2CC",
+"`-    c #ACDFD0",
+" ;    c #A3D1C4",
+".;    c #3A7563",
+"+;    c #75A194",
+"@;    c #7CB5A4",
+"#;    c #4A8E79",
+"$;    c #74A999",
+"%;    c #519681",
+"&;    c #448571",
+"*;    c #86B0A2",
+"=;    c #F7FCF6",
+"-;    c #C9DED9",
+";;    c #629787",
+">;    c #1E6650",
+",;    c #72A596",
+"';    c #2A6F5A",
+");    c #49796B",
+"!;    c #65A290",
+"~;    c #2E725D",
+"{;    c #5F9A88",
+"];    c #578C7C",
+"^;    c #588D7D",
+"/;    c #78A699",
+"(;    c #609585",
+"_;    c #F4FFFC",
+":;    c #BCD6CD",
+"<;    c #D2E7E2",
+"[;    c #C3E9DE",
+"};    c #266351",
+"|;    c #6E988C",
+"1;    c #78A89A",
+"2;    c #C1F7E7",
+"3;    c #48907A",
+"4;    c #78AD9D",
+"5;    c #8BC1B1",
+"6;    c #7AA297",
+"7;    c #70AD9B",
+"8;    c #3E8670",
+"9;    c #609D8D",
+"0;    c #B9E1D6",
+"a;    c #FBFFFD",
+"b;    c #F7FBFC",
+"c;    c #EFFFFF",
+"d;    c #428A74",
+"e;    c #497E6E",
+"f;    c #7EC6B0",
+"g;    c #B2D6CC",
+"h;    c #86BBAB",
+"i;    c #A5C6BD",
+"j;    c #B4DED2",
+"k;    c #C2E0D8",
+"l;    c #C5E9DF",
+"m;    c #C2E1D9",
+"n;    c #98AFA9",
+"o;    c #B6D4CC",
+"p;    c #C0D7CF",
+"q;    c #DAEDE7",
+"r;    c #D5E4DF",
+"s;    c #E1EAE7",
+"t;    c #E6EAE9",
+"u;    c #B6D0C7",
+"v;    c #9FBDB3",
+"w;    c #AECFC6",
+"x;    c #A4D4C6",
+"y;    c #F9FDFE",
+"z;    c #6C9F90",
+"A;    c #7DAB9E",
+"B;    c #437969",
+"C;    c #598E7E",
+"D;    c #72AD9B",
+"E;    c #9CBDB4",
+"F;    c #78A497",
+"G;    c #7DAD9F",
+"H;    c #3C806B",
+"I;    c #67A495",
+"J;    c #F7FFFD",
+"K;    c #CFE4DF",
+"L;    c #6A9A8C",
+"M;    c #67A693",
+"N;    c #B3D9CE",
+"O;    c #548979",
+"P;    c #9EAAA8",
+"Q;    c #A3BCB6",
+"R;    c #A1D4C5",
+"S;    c #A1C2B9",
+"T;    c #76A497",
+"U;    c #518777",
+"V;    c #7DA79B",
+"W;    c #5C9584",
+"X;    c #B1CFC5",
+"Y;    c #AAC5BC",
+"Z;    c #AABFB8",
+"`;    c #F3FFFE",
+" >    c #EDF8F4",
+".>    c #B6C2BE",
+"+>    c #D1E6DF",
+"@>    c #D0EBE2",
+"#>    c #AFCEC6",
+"$>    c #C9D9D6",
+"%>    c #8FB0A7",
+"&>    c #9CBBB3",
+"*>    c #74AA9A",
+"=>    c #5E736E",
+"->    c #DDFEF5",
+";>    c #89B9AB",
+">>    c #B6D1CA",
+",>    c #508575",
+"'>    c #81A59B",
+")>    c #80BFAC",
+"!>    c #5C8C7E",
+"~>    c #3D7363",
+"{>    c #5DA08E",
+"]>    c #C3D6D2",
+"^>    c #699E8E",
+"/>    c #327D66",
+"(>    c #5A9785",
+"_>    c #4FA288",
+":>    c #67AB96",
+"<>    c #788F89",
+"[>    c #E6FFFD",
+"}>    c #8ABAAC",
+"|>    c #98C2B6",
+"1>    c #8CBCAE",
+"2>    c #E8FFFD",
+"3>    c #8EACA2",
+"4>    c #D6EDE5",
+"5>    c #DFEEE9",
+"6>    c #D1E8E0",
+"7>    c #AECCC2",
+"8>    c #78998E",
+"9>    c #C3E2DA",
+"0>    c #E6FBF6",
+"a>    c #87BAAB",
+"b>    c #88BEAE",
+"c>    c #E8F8F5",
+"d>    c #B3CEC7",
+"e>    c #609082",
+"f>    c #5D9886",
+"g>    c #C2E8DD",
+"h>    c #50786D",
+"i>    c #599281",
+"j>    c #5DB096",
+"k>    c #1A654E",
+"l>    c #4E8170",
+"m>    c #B7CAC6",
+"n>    c #92C5B6",
+"o>    c #3F836E",
+"p>    c #96C4B7",
+"q>    c #448370",
+"r>    c #7B948E",
+"s>    c #CBF3E8",
+"t>    c #CAEEE4",
+"u>    c #719D90",
+"v>    c #A2D5C6",
+"w>    c #639385",
+"x>    c #80B6A6",
+"y>    c #367562",
+"z>    c #6EA796",
+"A>    c #8DAEA3",
+"B>    c #9FB9B0",
+"C>    c #EAFDF7",
+"D>    c #E2EDE9",
+"E>    c #EBEBEB",
+"F>    c #B7CEC6",
+"G>    c #E2FFF7",
+"H>    c #6E9286",
+"I>    c #E4FBF5",
+"J>    c #648A7F",
+"K>    c #AEC1BD",
+"L>    c #3F6F61",
+"M>    c #A4D7C8",
+"N>    c #94B8AE",
+"O>    c #ADCBC3",
+"P>    c #D5D3D6",
+"Q>    c #88B6A9",
+"R>    c #C3EBE0",
+"S>    c #8DC8B6",
+"T>    c #8FD0BC",
+"U>    c #3F7464",
+"V>    c #2E7962",
+"W>    c #519B84",
+"X>    c #5AAD91",
+"Y>    c #5A917C",
+"Z>    c #F3FFF8",
+"`>    c #ACD2C7",
+" ,    c #64A893",
+".,    c #69978A",
+"+,    c #246C56",
+"@,    c #7AB7A5",
+"#,    c #85BBAB",
+"$,    c #659E8D",
+"%,    c #8EC4B4",
+"&,    c #8FBBAE",
+"*,    c #71978C",
+"=,    c #BBDFD5",
+"-,    c #7CA096",
+";,    c #ADD3C8",
+">,    c #97B8AD",
+",,    c #C5E9DD",
+"',    c #7FA095",
+"),    c #E9FEF7",
+"!,    c #FBF5F7",
+"~,    c #FEFAFB",
+"{,    c #D7D9D8",
+"],    c #B8CFC7",
+"^,    c #D3EEE5",
+"/,    c #8EBEB0",
+"(,    c #A5CFC3",
+"_,    c #20614D",
+":,    c #C2E6DC",
+"<,    c #7FB8A7",
+"[,    c #B0CBC4",
+"},    c #D2DBDA",
+"|,    c #EAFAF7",
+"1,    c #E2FFF8",
+"2,    c #B2C7C2",
+"3,    c #4C8977",
+"4,    c #18684F",
+"5,    c #367A63",
+"6,    c #9DCBC1",
+"7,    c #B1C6C1",
+"8,    c #D8F3EC",
+"9,    c #458A75",
+"0,    c #40846F",
+"a,    c #D5F4EC",
+"b,    c #CCEAE2",
+"c,    c #B9CEC9",
+"d,    c #9EC8BC",
+"e,    c #72AB9A",
+"f,    c #DCF5EF",
+"g,    c #DFF2EE",
+"h,    c #75998F",
+"i,    c #78A797",
+"j,    c #96C6B6",
+"k,    c #88A99E",
+"l,    c #B6C7C1",
+"m,    c #F1FAF7",
+"n,    c #D2E3DD",
+"o,    c #A7BEB6",
+"p,    c #E7FFF9",
+"q,    c #A9D3C7",
+"r,    c #ADBCB9",
+"s,    c #76AB9B",
+"t,    c #A8C1BB",
+"u,    c #5C9987",
+"v,    c #A6D6C8",
+"w,    c #58887A",
+"x,    c #A9BCB8",
+"y,    c #9AB5AE",
+"z,    c #397664",
+"A,    c #ABBBB8",
+"B,    c #649F8D",
+"C,    c #BEF1E2",
+"D,    c #25795F",
+"E,    c #50967E",
+"F,    c #538177",
+"G,    c #F9FFF9",
+"H,    c #66A391",
+"I,    c #488573",
+"J,    c #2F6E5B",
+"K,    c #508072",
+"L,    c #A4C3BB",
+"M,    c #5B8579",
+"N,    c #548778",
+"O,    c #7BB0A0",
+"P,    c #5B9C88",
+"Q,    c #7BAA9A",
+"R,    c #669988",
+"S,    c #B3E6D5",
+"T,    c #9CC2B5",
+"U,    c #DCF1EA",
+"V,    c #F7FDFB",
+"W,    c #DFE8E5",
+"X,    c #BBD2CA",
+"Y,    c #ACC7BE",
+"Z,    c #7AA498",
+"`,    c #C6ECE1",
+" '    c #669688",
+".'    c #BAD8D0",
+"+'    c #A6E5D2",
+"@'    c #86AAA0",
+"#'    c #AAD4C8",
+"$'    c #B8D6CE",
+"%'    c #1F6F56",
+"&'    c #559A85",
+"*'    c #236E57",
+"='    c #7EC4AC",
+"-'    c #7DA89F",
+";'    c #85CDB7",
+">'    c #87AFA4",
+",'    c #B6DCD1",
+"''    c #56A18A",
+")'    c #CFEEE6",
+"!'    c #ADC6C0",
+"~'    c #DEFDF5",
+"{'    c #B0DCCF",
+"]'    c #588B7C",
+"^'    c #9DC9BC",
+"/'    c #B2D6CA",
+"('    c #7DA799",
+"_'    c #ACD6C8",
+":'    c #E5FFFA",
+"<'    c #C3D4CE",
+"['    c #B5CFC6",
+"}'    c #7C9A90",
+"|'    c #DFFAF3",
+"1'    c #A5B4B1",
+"2'    c #8DB3A8",
+"3'    c #3E7B69",
+"4'    c #98CDBD",
+"5'    c #47917A",
+"6'    c #9FD4C4",
+"7'    c #76A295",
+"8'    c #9FD5C5",
+"9'    c #79B6A4",
+"0'    c #458672",
+"a'    c #5E9484",
+"b'    c #498A76",
+"c'    c #256D55",
+"d'    c #729D94",
+"e'    c #FEFFFB",
+"f'    c #B6CFC9",
+"g'    c #AAC1BB",
+"h'    c #8BBBAD",
+"i'    c #8CBAAD",
+"j'    c #8EA9A2",
+"k'    c #ABD7CA",
+"l'    c #578376",
+"m'    c #549581",
+"n'    c #498875",
+"o'    c #477C6C",
+"p'    c #7CAA9D",
+"q'    c #80B0A2",
+"r'    c #568C7C",
+"s'    c #A3C4B9",
+"t'    c #7BA496",
+"u'    c #618B7D",
+"v'    c #C9E7DD",
+"w'    c #9FBDB5",
+"x'    c #7AA699",
+"y'    c #AAE7D5",
+"z'    c #98B7AF",
+"A'    c #6B9186",
+"B'    c #73A999",
+"C'    c #407062",
+"D'    c #578779",
+"E'    c #3A7765",
+"F'    c #629D8B",
+"G'    c #7DB3A3",
+"H'    c #398169",
+"I'    c #A6CFC7",
+"J'    c #B1CAC4",
+"K'    c #6EA393",
+"L'    c #4A8B77",
+"M'    c #75B4A1",
+"N'    c #3F7565",
+"O'    c #D2F3EA",
+"P'    c #B4E0D3",
+"Q'    c #6F9B8E",
+"R'    c #A8D4C7",
+"S'    c #769C91",
+"T'    c #C8E3DC",
+"U'    c #C8DBD7",
+"V'    c #91BAAC",
+"W'    c #457565",
+"X'    c #A3D8C6",
+"Y'    c #649081",
+"Z'    c #90ABA2",
+"`'    c #90A39D",
+" )    c #C0DAD1",
+".)    c #BEDED3",
+"+)    c #D7EEE8",
+"@)    c #BACFCA",
+"#)    c #BFE9DD",
+"$)    c #92BEB1",
+"%)    c #478B76",
+"&)    c #56897A",
+"*)    c #6EA997",
+"=)    c #7CB2A2",
+"-)    c #4B937D",
+";)    c #98B1AB",
+">)    c #8FB9AD",
+",)    c #B2DACF",
+"')    c #327762",
+"))    c #1D654D",
+"!)    c #8EB7AF",
+"~)    c #FDFFFA",
+"{)    c #ACD0C6",
+"])    c #00593D",
+"^)    c #559280",
+"/)    c #005D40",
+"()    c #639E8C",
+"_)    c #A2CCC0",
+":)    c #064B36",
+"<)    c #5E9383",
+"[)    c #6B9589",
+"})    c #71B6A1",
+"|)    c #2E735E",
+"1)    c #A9D5C8",
+"2)    c #C5D5D2",
+"3)    c #A2C6BA",
+"4)    c #7FAB9C",
+"5)    c #417463",
+"6)    c #DAFFF6",
+"7)    c #E8FFF9",
+"8)    c #C4D0CC",
+"9)    c #A5B8B2",
+"0)    c #A4BFB6",
+"a)    c #70968B",
+"b)    c #8CC5B4",
+"c)    c #D4E4E1",
+"d)    c #618B7F",
+"e)    c #2C715C",
+"f)    c #E5FAF5",
+"g)    c #18624B",
+"h)    c #3D6D5F",
+"i)    c #59A18B",
+"j)    c #689B8C",
+"k)    c #387E66",
+"l)    c #9FC8C0",
+"m)    c #FCFFFB",
+"n)    c #94BCB1",
+"o)    c #95CEBD",
+"p)    c #285E4E",
+"q)    c #DDFFFC",
+"r)    c #78B3A1",
+"s)    c #346959",
+"t)    c #B6E0D4",
+"u)    c #7AA89B",
+"v)    c #C4F7E8",
+"w)    c #497F6F",
+"x)    c #ADE3D3",
+"y)    c #759B90",
+"z)    c #9EBEB3",
+"A)    c #89AFA2",
+"B)    c #C9E9DE",
+"C)    c #D9E8E3",
+"D)    c #F1FDF9",
+"E)    c #88A39A",
+"F)    c #C0E0D5",
+"G)    c #A9D1C6",
+"H)    c #C6EAE0",
+"I)    c #91AFA7",
+"J)    c #7EAEA0",
+"K)    c #084C37",
+"L)    c #C9E7DF",
+"M)    c #82AA9F",
+"N)    c #5BA68F",
+"O)    c #4D8A78",
+"P)    c #BEDCD4",
+"Q)    c #85B8A9",
+"R)    c #87BCAC",
+"S)    c #0B5F45",
+"T)    c #4F937E",
+"U)    c #5F9E8B",
+"V)    c #347861",
+"W)    c #A3CCC4",
+"X)    c #AEC9C2",
+"Y)    c #104B39",
+"Z)    c #98C6B9",
+"`)    c #1B654E",
+" !    c #6DA393",
+".!    c #B6E6D8",
+"+!    c #458270",
+"@!    c #B2C2BF",
+"#!    c #8DB5AA",
+"$!    c #76A698",
+"%!    c #96CCBC",
+"&!    c #609B89",
+"*!    c #BED7D1",
+"=!    c #93A6A2",
+"-!    c #EFFEFB",
+";!    c #FEF8FA",
+">!    c #DBD5D7",
+",!    c #DEFFF9",
+"'!    c #C7D6D1",
+")!    c #8BBBAB",
+"!!    c #ABDECF",
+"~!    c #96B7AE",
+"{!    c #ACD6CA",
+"]!    c #5D9383",
+"^!    c #6BA493",
+"/!    c #50917D",
+"(!    c #377C67",
+"_!    c #379074",
+":!    c #B1DDD0",
+"<!    c #387C67",
+"[!    c #2B8166",
+"}!    c #5EA38E",
+"|!    c #3F846F",
+"1!    c #58918B",
+"2!    c #F8FFF8",
+"3!    c #1C7056",
+"4!    c #1D654F",
+"5!    c #7BB4A3",
+"6!    c #44947B",
+"7!    c #317963",
+"8!    c #5FA08C",
+"9!    c #3F8771",
+"0!    c #7EAC9F",
+"a!    c #C9D5D3",
+"b!    c #F6FCFC",
+"c!    c #F1F7F5",
+"d!    c #CEE8DF",
+"e!    c #CDE0DA",
+"f!    c #5B7F73",
+"g!    c #B3D2CA",
+"h!    c #2F7761",
+"i!    c #8EACA4",
+"j!    c #C0CFCC",
+"k!    c #4E9E85",
+"l!    c #809E96",
+"m!    c #75BFA8",
+"n!    c #4B967F",
+"o!    c #206E56",
+"p!    c #1E6952",
+"q!    c #0A4332",
+"r!    c #004027",
+"s!    c #3D7A68",
+"t!    c #0E674B",
+"u!    c #2D6C59",
+"v!    c #589C87",
+"w!    c #659995",
+"x!    c #FAFFF6",
+"y!    c #A7CDC2",
+"z!    c #2A8065",
+"A!    c #488975",
+"B!    c #2B6050",
+"C!    c #6E9E90",
+"D!    c #266A55",
+"E!    c #B4E7D8",
+"F!    c #4F7F71",
+"G!    c #569B86",
+"H!    c #BADBD2",
+"I!    c #89C4B2",
+"J!    c #09513B",
+"K!    c #5BA991",
+"L!    c #649D8C",
+"M!    c #A9D9CB",
+"N!    c #E9F3F2",
+"O!    c #EDEFEE",
+"P!    c #DBEEE8",
+"Q!    c #9FAAA6",
+"R!    c #DFFDF3",
+"S!    c #6DA091",
+"T!    c #4A8F7A",
+"U!    c #89BFAF",
+"V!    c #81B6A6",
+"W!    c #36896F",
+"X!    c #328269",
+"Y!    c #185945",
+"Z!    c #9DC7BB",
+"`!    c #4B8C78",
+" ~    c #4B7B6D",
+".~    c #024732",
+"+~    c #4C8D79",
+"@~    c #558577",
+"#~    c #194F3F",
+"$~    c #51927C",
+"%~    c #588B86",
+"&~    c #F9FCF3",
+"*~    c #B3CCC6",
+"=~    c #1B6E54",
+"-~    c #2A7E64",
+";~    c #11674C",
+">~    c #015B3F",
+",~    c #93BBB0",
+"'~    c #538E7C",
+")~    c #1F5847",
+"!~    c #8FC5B5",
+"~~    c #68837C",
+"{~    c #88B8AA",
+"]~    c #4F8575",
+"^~    c #75AE9D",
+"/~    c #225D4B",
+"(~    c #69A895",
+"_~    c #BDDBD3",
+":~    c #EEF8F7",
+"<~    c #AEC7C1",
+"[~    c #F1FDFB",
+"}~    c #AAD6C7",
+"|~    c #E3F6F0",
+"1~    c #D8FCF2",
+"2~    c #276854",
+"3~    c #1D7056",
+"4~    c #0C4232",
+"5~    c #21624E",
+"6~    c #2E8469",
+"7~    c #5A9986",
+"8~    c #04573D",
+"9~    c #38836C",
+"0~    c #0A3F2F",
+"a~    c #126B4F",
+"b~    c #127A59",
+"c~    c #307560",
+"d~    c #004B30",
+"e~    c #70BAA3",
+"f~    c #185C45",
+"g~    c #97CEC8",
+"h~    c #FCFFF6",
+"i~    c #72B6A1",
+"j~    c #3C7765",
+"k~    c #3D7C69",
+"l~    c #0C6247",
+"m~    c #4F9982",
+"n~    c #004B33",
+"o~    c #2A6E59",
+"p~    c #89CAB6",
+"q~    c #2E7C64",
+"r~    c #C7EBE1",
+"s~    c #336959",
+"t~    c #84BAAA",
+"u~    c #3C7B68",
+"v~    c #589D88",
+"w~    c #89AFA4",
+"x~    c #FCFDFF",
+"y~    c #F0F9F6",
+"z~    c #E0EBE7",
+"A~    c #528171",
+"B~    c #E8FDF6",
+"C~    c #8BC2AF",
+"D~    c #E6FDF5",
+"E~    c #477D6D",
+"F~    c #76BEA8",
+"G~    c #2E886C",
+"H~    c #0D6C4E",
+"I~    c #13674D",
+"J~    c #025239",
+"K~    c #01553B",
+"L~    c #076044",
+"M~    c #377462",
+"N~    c #DCFDF4",
+"O~    c #33725F",
+"P~    c #36816A",
+"Q~    c #358069",
+"R~    c #1E6C54",
+"S~    c #01472D",
+"T~    c #599289",
+"U~    c #F4FFF2",
+"V~    c #B7CEC8",
+"W~    c #0D5D44",
+"X~    c #568B7B",
+"Y~    c #558B7B",
+"Z~    c #1F6751",
+"`~    c #296A56",
+" {    c #72B39F",
+".{    c #1D614C",
+"+{    c #1E7258",
+"@{    c #5D877B",
+"#{    c #326F5D",
+"${    c #4B8A77",
+"%{    c #4A8976",
+"&{    c #024A34",
+"*{    c #155944",
+"={    c #E0FFFF",
+"-{    c #A7CBC1",
+";{    c #5C8479",
+">{    c #DFE9E8",
+",{    c #F5FBFB",
+"'{    c #9FB0AA",
+"){    c #D4E9E2",
+"!{    c #87B7A7",
+"~{    c #ABD4C6",
+"{{    c #0F3F2F",
+"]{    c #678178",
+"^{    c #1C664F",
+"/{    c #217E61",
+"({    c #004F33",
+"_{    c #24745B",
+":{    c #2F6C5A",
+"<{    c #216F57",
+"[{    c #115F47",
+"}{    c #63A893",
+"|{    c #005B3A",
+"1{    c #004C34",
+"2{    c #3A7362",
+"3{    c #549380",
+"4{    c #619D84",
+"5{    c #86B9B0",
+"6{    c #F1FCEC",
+"7{    c #E7FFFF",
+"8{    c #5BA08B",
+"9{    c #075B41",
+"0{    c #0F5F46",
+"a{    c #59A38C",
+"b{    c #29775F",
+"c{    c #EAFFFD",
+"d{    c #F3FCFB",
+"e{    c #09573F",
+"f{    c #C5FBEB",
+"g{    c #DEFFFC",
+"h{    c #C0E8DD",
+"i{    c #F2FEFC",
+"j{    c #72A292",
+"k{    c #B9DACF",
+"l{    c #A7C2B9",
+"m{    c #B0D6C9",
+"n{    c #9FC9BB",
+"o{    c #3D7864",
+"p{    c #F8F3F7",
+"q{    c #003321",
+"r{    c #23795E",
+"s{    c #0B5B42",
+"t{    c #92A7A2",
+"u{    c #FBFBFD",
+"v{    c #E4FFFA",
+"w{    c #8DB1AD",
+"x{    c #B4C4C1",
+"y{    c #7E958F",
+"z{    c #427767",
+"A{    c #FEF9FD",
+"B{    c #277A60",
+"C{    c #619787",
+"D{    c #1A5543",
+"E{    c #52917E",
+"F{    c #A0CCBF",
+"G{    c #739F92",
+"H{    c #94C2B5",
+"I{    c #236951",
+"J{    c #C5F4E4",
+"K{    c #C7F0E2",
+"L{    c #073727",
+"M{    c #5E8276",
+"N{    c #529880",
+"O{    c #FDFBFE",
+"P{    c #BAF5E3",
+"Q{    c #12533F",
+"R{    c #08583F",
+"S{    c #106D50",
+"T{    c #13664C",
+"U{    c #B9D1C3",
+"V{    c #6E8384",
+"W{    c #FFFBF2",
+"X{    c #6CA18F",
+"Y{    c #52907B",
+"Z{    c #7CBAA5",
+"`{    c #44826D",
+" ]    c #5F9D88",
+".]    c #0F5940",
+"+]    c #ACD2C5",
+"@]    c #B5DFD1",
+"#]    c #2D755D",
+"$]    c #2E7E63",
+"%]    c #57B092",
+"&]    c #126F50",
+"*]    c #1A684E",
+"=]    c #A3CDBF",
+"-]    c #0F553D",
+";]    c #ACD8C9",
+">]    c #256F56",
+",]    c #006341",
+"']    c #2E6D58",
+")]    c #9FC8BA",
+"!]    c #3C826A",
+"~]    c #02583B",
+"{]    c #065037",
+"]]    c #18684D",
+"^]    c #ACCAC0",
+"/]    c #166351",
+"(]    c #63A792",
+"_]    c #B8D2C9",
+":]    c #70A593",
+"<]    c #518F7A",
+"[]    c #599883",
+"}]    c #79B7A2",
+"|]    c #54937E",
+"1]    c #16694D",
+"2]    c #184234",
+"3]    c #123C2E",
+"4]    c #094D36",
+"5]    c #0C543C",
+"6]    c #003C22",
+"7]    c #126549",
+"8]    c #145841",
+"9]    c #265D4A",
+"0]    c #00482D",
+"a]    c #0C4733",
+"b]    c #156B4E",
+"c]    c #006F48",
+"d]    c #2C8164",
+"e]    c #0A4531",
+"f]    c #0A281E",
+"g]    c #10271F",
+"h]    c #29493E",
+"i]    c #1E5D48",
+"j]    c #0E6145",
+"k]    c #0D4C37",
+"l]    c #19654B",
+"m]    c #FFF6FE",
+"n]    c #81B8A5",
+"o]    c #539A8A",
+"p]    c #7FBAA8",
+"q]    c #FFFEF8",
+"r]    c #98BEB1",
+"s]    c #71A694",
+"t]    c #1C5D47",
+"u]    c #A8E9D3",
+"v]    c #43826D",
+"w]    c #55947F",
+"x]    c #F7F7F7",
+"y]    c #136147",
+"z]    c #D1F2E7",
+"A]    c #DCF6ED",
+"B]    c #CAF4E6",
+"C]    c #D1FAEC",
+"D]    c #305C4D",
+"E]    c #699989",
+"F]    c #D5F6EB",
+"G]    c #B4C3BE",
+"H]    c #3D6658",
+"I]    c #68AE96",
+"J]    c #EFFFFD",
+"K]    c #FFFBFC",
+"L]    c #EAFFF8",
+"M]    c #7DB4A1",
+"N]    c #0D5B41",
+"O]    c #05442F",
+"P]    c #B0DFCF",
+"Q]    c #FFF3F8",
+"R]    c #005735",
+"S]    c #1D604F",
+"T]    c #FFF9F5",
+"U]    c #B4CEC5",
+"V]    c #93B9AC",
+"W]    c #72A795",
+"X]    c #32765F",
+"Y]    c #7CC2AA",
+"Z]    c #357660",
+"`]    c #3F806A",
+" ^    c #11523C",
+".^    c #C6CCCA",
+"+^    c #18533F",
+"@^    c #84B3A3",
+"#^    c #F2FDF9",
+"$^    c #94C3B3",
+"%^    c #216951",
+"&^    c #306E59",
+"*^    c #608F7F",
+"=^    c #005132",
+"-^    c #5EA593",
+";^    c #639A87",
+">^    c #FFFAF8",
+",^    c #8FB5A8",
+"'^    c #74A997",
+")^    c #004129",
+"!^    c #1E664E",
+"~^    c #5EA48C",
+"{^    c #31755E",
+"]^    c #41806B",
+"^^    c #FFF7FB",
+"/^    c #E6FFF7",
+"(^    c #6DAB96",
+"_^    c #427B68",
+":^    c #EFFAF6",
+"<^    c #9BC5B7",
+"[^    c #F8F2F4",
+"}^    c #D8F8ED",
+"|^    c #EEF9F5",
+"1^    c #E8FFF7",
+"2^    c #004B2E",
+"3^    c #689D8B",
+"4^    c #297761",
+"5^    c #3C7D67",
+"6^    c #2B775D",
+"7^    c #2B7159",
+"8^    c #1B674D",
+"9^    c #EDFCF7",
+"0^    c #A0C1B6",
+"a^    c #D6F6EB",
+"b^    c #9AC0B3",
+"c^    c #729B8D",
+"d^    c #FAF6F7",
+"e^    c #2B6F58",
+"f^    c #F2FBF8",
+"g^    c #FCF8F9",
+"h^    c #F3FEFA",
+"i^    c #F9F5F6",
+"j^    c #4D8C77",
+"k^    c #1E6C52",
+"l^    c #A7D1C3",
+"m^    c #287B61",
+"n^    c #3A8068",
+"o^    c #F6FFF8",
+"p^    c #B1CBC2",
+"q^    c #83A99C",
+"r^    c #003A20",
+"s^    c #0E5C42",
+"t^    c #246E55",
+"u^    c #1B694F",
+"v^    c #B1D1C6",
+"w^    c #417C68",
+"x^    c #407F6A",
+"y^    c #95BFB1",
+"z^    c #609382",
+"A^    c #9BC7B8",
+"B^    c #448A72",
+"C^    c #FFF5F9",
+"D^    c #2E6955",
+"E^    c #033C29",
+"F^    c #10513B",
+"G^    c #26715A",
+"H^    c #42866F",
+"I^    c #B3CDC4",
+"J^    c #82A89B",
+"K^    c #6DA290",
+"L^    c #004C32",
+"M^    c #0B593F",
+"N^    c #014B32",
+"O^    c #236B53",
+"P^    c #96BAAE",
+"Q^    c #51957E",
+"R^    c #357F66",
+"S^    c #90BCAD",
+"T^    c #4E8572",
+"U^    c #91C0B0",
+"V^    c #3F856D",
+"W^    c #073626",
+"X^    c #0E694A",
+"Y^    c #105540",
+"Z^    c #3A7863",
+"`^    c #FAFFFC",
+" /    c #AED4C7",
+"./    c #82AC9E",
+"+/    c #61A28C",
+"@/    c #06361C",
+"#/    c #003D1E",
+"$/    c #004A2A",
+"%/    c #2D644D",
+"&/    c #F4FFFA",
+"*/    c #FAF9FE",
+"=/    c #1E6E53",
+"-/    c #1A7053",
+";/    c #42836D",
+">/    c #95C4B4",
+",/    c #085038",
+"'/    c #FCFAFD",
+")/    c #FFFAFB",
+"!/    c #457F67",
+"~/    c #003B20",
+"{/    c #13513A",
+"]/    c #3E8371",
+"^/    c #AED2C6",
+"//    c #85AEA0",
+"(/    c #EFFBF7",
+"_/    c #FFF2F7",
+":/    c #7BA798",
+"</    c #002F13",
+"[/    c #004B2A",
+"}/    c #00502F",
+"|/    c #386F58",
+"1/    c #F2FFFA",
+"2/    c #FFF9FC",
+"3/    c #186249",
+"4/    c #94B5AA",
+"5/    c #0F6548",
+"6/    c #44856F",
+"7/    c #97C3B4",
+"8/    c #054B33",
+"9/    c #BED3CA",
+"0/    c #719587",
+"a/    c #FFFAFC",
+"b/    c #F3FFF9",
+"c/    c #D8F4E8",
+"d/    c #00371E",
+"e/    c #034329",
+"f/    c #2F7461",
+"g/    c #FFF8FD",
+"h/    c #81AD9E",
+"i/    c #1C4C36",
+"j/    c #003319",
+"k/    c #114F36",
+"l/    c #CDF4E2",
+"m/    c #FFF6F9",
+"n/    c #074D35",
+"o/    c #9BBCB1",
+"p/    c #003B26",
+"q/    c #0D6648",
+"r/    c #8FC6B3",
+"s/    c #40816B",
+"t/    c #96C0B2",
+"u/    c #00452D",
+"v/    c #BAD5C6",
+"w/    c #083F28",
+"x/    c #D0E8DB",
+"y/    c #FDFEFF",
+"z/    c #5C8A7F",
+"A/    c #002F14",
+"B/    c #418570",
+"C/    c #AAD3C5",
+"D/    c #649987",
+"E/    c #FFF7FD",
+"F/    c #EEFFF5",
+"G/    c #DBF5E8",
+"H/    c #E9FFF6",
+"I/    c #0B5139",
+"J/    c #00331D",
+"K/    c #096647",
+"L/    c #95C8B7",
+"M/    c #3D7C67",
+"N/    c #9BC1B4",
+"O/    c #00402A",
+"P/    c #B1D7C2",
+"Q/    c #002D16",
+"R/    c #45705C",
+"S/    c #FBFDFA",
+"T/    c #FFEFFC",
+"U/    c #043F23",
+"V/    c #3A7966",
+"W/    c #F8FAF7",
+"X/    c #B1DBCD",
+"Y/    c #1D5B46",
+"Z/    c #EBFFFC",
+"`/    c #FFFDFD",
+" (    c #FAFCF9",
+".(    c #5A8979",
+"+(    c #97C1B3",
+"@(    c #00301A",
+"#(    c #045D3F",
+"$(    c #94C0B1",
+"%(    c #3A7360",
+"&(    c #99B9AE",
+"*(    c #00311D",
+"=(    c #A9DBC2",
+"-(    c #052C17",
+";(    c #002F15",
+">(    c #C5E1D5",
+",(    c #FFF6FF",
+"'(    c #90BBA7",
+")(    c #AACABF",
+"!(    c #00321F",
+"~(    c #698F82",
+"{(    c #FCF6F8",
+"](    c #C9EFE2",
+"^(    c #002F1B",
+"/(    c #0E4D38",
+"((    c #98BCB0",
+"_(    c #003220",
+":(    c #105840",
+"<(    c #9CC0B4",
+"[(    c #568575",
+"}(    c #134635",
+"|(    c #A7D7C1",
+"1(    c #002A16",
+"2(    c #003019",
+"3(    c #34755D",
+"4(    c #F2F4F3",
+"5(    c #EEFFFA",
+"6(    c #7FA59A",
+"7(    c #FEF9F5",
+"8(    c #E7F2EE",
+"9(    c #6D9789",
+"0(    c #689284",
+"a(    c #D6DCDA",
+"b(    c #F3F9F9",
+"c(    c #ECF8F4",
+"d(    c #7D9B91",
+"e(    c #75A190",
+"f(    c #CCE3DB",
+"g(    c #7E9C92",
+"h(    c #CAE5DC",
+"i(    c #A4C8BC",
+"j(    c #D1E0DB",
+"k(    c #7CA899",
+"l(    c #E0F1E9",
+"m(    c #7CA293",
+"n(    c #719A8A",
+"o(    c #619481",
+"p(    c #FAFAF8",
+"q(    c #F6FFFB",
+"r(    c #E2F8F5",
+"s(    c #FFFCFA",
+"t(    c #E3FFFF",
+"u(    c #FBF9FE",
+"v(    c #F9F7FA",
+"w(    c #EFFFFA",
+"x(    c #FEF3F7",
+"y(    c #FFF7FA",
+"z(    c #E0FFFB",
+"A(    c #EBFFFF",
+"B(    c #EFFFFB",
+"C(    c #FFF7F8",
+". + @ # $ % & * = - ; $ $ $ > , ' # ) ! # % ~ , { ] ^ / ( { _ $ : : < [ { } | | 1 2 3 4 ( 1 | 5 ! = 6 ",
+"7 8 9 0 a b c d e f g h { i j j k l m n o p o q r s t u v w x y z A B C D # E ~ F G H I J K L M N O P ",
+"- Q R S T U V W X Y Z `  .# ~ ..+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.4 [.}.|.1.2.3.4.5.6.7.",
+"j 8.9.0.a.b.c.d.e.f.g. .h.i.j.1 k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.<.F.G.H.I.G J.K.L.M.N.O.P.Q.",
+"R.S.T.U.V.W.X.Y.Z.`. +.+++$ [ @+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+G /+[ { (+1 _+:+<+[+}+|+1+2+3+4+5+[ ",
+"#+6+7+8+9+0+a+b+c+d+e+f+# g+h+$ 4 i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+, # ~ A+~ B+, C+D+E+F+G+H+I+J+1 ",
+"[ K+L+M+N+O+P+=+Q+R+S+T+U+V+5 1 W+: : X+Y+Z+`+ @.@+@@@#@$@%@&@*@~ =@( -@;@[ $ >@,@8.'@)@!@w+~@{@]@^@/@",
+"U+(@_@:@<@[@}@|@1@2@3@4@5@6@b j [ 7@8@9@$ 0@a@b@c@d@e@f@g@h@i@j@k@l@m@n@( o@p@q@r@s@t@u@v@w@x@y@z@A@B@",
+"~ C@D@E@F@G@H@I@J@K@L@M@# N@O@- { b C@P@Q@R@S@T@U@V@W@X@Y@c@Z@`@o@..( (  #.## +#| @###$#%#&#*#=#-#;#>#",
+"j ,#'#)#!#~#{#]#^#/#(#_#:#<#, [ * ( [#}#|#1#2#3#4#5#6#7#8#9#0#a#[ =@-@-@ #$ b#c#d#e#~ f#Y+g#h#i#j#k#l#",
+"m#n#o#p#q#r#s#t#u#- v#w#x#y#z#1 [ A#B#: C#D#b E#F#G#H#I#J#K#L#M#R.( ( N#E # O#P#Q#R#S#T#U#V#W#X#Y#Z#`#",
+"m#B# $.$ @+$@$#$$$%$&$*$=$-$;$>${ O@- ,$'$)$!$~${$]$^$/$($_$:$, <$( [$[ ~ }$|$1$2$3$4$m+5$6$7$8$9$0$a$",
+"{ b$c$d$e$f$g$h$i$j$k$l$G m$n$o$~ j / p$, q$r$s$t$u$v$w$x$y$, $ ( -@-@R.z$A$B$o$C$D$_@~ E$F$G$H$I$J$B@",
+"|#K$;+L$M$N$O$P$Q$R$S$T$U$f V$W$' | - 1 X$Y$Z$`$ %.%+%@%#%$%%%| -@N#( &%$ *%: =%-%;%>%,%'%)%v$w#!%~%/@",
+"{ {%]%^%/%(%_%:%<%[%}%|%1%2%3%P$4%$ 5%@+[ ~ 6%# 7%8%9%0%a%b%( c%$ d%( z$e%f%g%h%i%j%b k%l%m%n%o%p%q%r%",
+"$ s%t%u%v%w%x%y%z%A%B%C%D%E%2%F%G%$ [ ( ;@ #H%I%J%v+K%L%M%N%@+O%~ [ { -@G P%Q%R%S%T%U%V%W%X%Y%Z%`% &.&",
+"+&@&#&$&%&&&*&=&-&;&>&,&'&)&U+!&~&$ {&;@[$[ ~&]&^&/&(&o$= _&:&( -@<&[&{ }&- |&1&Z+2&3&4&5&6&7&8&9&0&a&",
+"# b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&k@&%( ( [ ~ ~&r&s&t&u&v&&%[ E { [ ( ~ w&x&y&z&A&B&C&D&E&7$S#F&G&H&I&",
+"{ o@G%J&-@K&- L&P$M&N&O&P&Q&- B#g+E ( { { ( R&$ S&T&G%( U&V&[ R&[${ 5%W&, X&Y&Z&`&w@4& *.*+*E@@*#*$*%*",
+"&*i.[ **=*| ( -*]#( ;*>*,*'*)*!*5%~*;@{*V&( [ o@- ]*[ ^*{ { ;@[ [ /*o@(*_*:*<*[*}*|*1*2*3*4*5*6*7*u$2 ",
+"| ( 8*~ {*j [&$ ~ : 9*1 0*a*: b*~ {&( { { c*[ o@~ :&( { d*/*{ e*@+[ 5%4%f*g*h*i*j*k*l*m*n*o*'#p*q*r*s*",
+"{ z$= t*u*( [ $ # v*j v*{ |#, w*~ [ n@e*{ ;@[ 5%e*{ **{ { { O%j &%G%~ ( x*y*h#z*A*B*C*D*E*F*~#G*H*w#/*",
+", I*J*|#K*L*M*N*~ R&~ :&[  #[$( ( ( ( ( ( ( ( -@( ( ( ( ( ( ( (  #&%[ [ [ [ @+R.[ 5%q&, O*P*Q*R*S*c#_.",
+"{ * T*[ U*$ A#V*{ U&{ U&{ y*j O%n@n@n@-@-@( ( ( ( ( ( ( ( ( ( ( ( -@-@c*( ( ( c*&%@+~ $ # W*X*t*h+]*Y*",
+"Z*R$`* =n+&@.=+=*%@=}$#=f*$ u*~ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( { {*{ { { e*{ { -@[$( <$[ [ $=~ n@[ %=",
+"{ }.&=*=o$==-=G &%[${ V&j &*=*1 n@n@n@n@-@-@( ( ( ( ( ( ( ( ( ( { e*V&U&{ {*{ ;=U&{ { ;={ >={ ,=V&n@%*",
+"$ d#'=)=!=u#~={=s&]=^=/=(== _=, ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( {*{ { U&V&{ { {*[  #<$( -@( :={ <=5%[=",
+"j }=|=1=2=3=4=5=6=7=8=, 9=R&0=-@-@( ( ( ( ( ( -@( ( ( ( ( ( ( ( [ [ {&[ @+&%a=[ h+$ 4%# # b=c=-*d=e=f=",
+"j g=h=p.i=j=k=l=m=n=o=p=q=b r=s=t=u=v=N#n@( ( ( -@-@-@-@-@-@-@-@o@w=x=<&E 5%y=<&@=@=z=A=B=C=w+(&D=E=F=",
+"# !=G=H=I=J=K=L=M=N=O=P=Q=R=S=T=[$n@( ( ( ( ( -@-@-@-@-@-@-@-@-@U=$ H%$ V=~&6%$ W=X=Y=Z=`= -.-+-@-#-$-",
+", %-&-*-=---= ;->-9#,-'-)-!-~-d#<*{-, ]-~ :&{ { ( n@( m@~ , ^-R=/-r@(-Y+_-F$:-<-o$[-o$}-|-&-1-2-3-4-5-",
+"~ 8.6-7-8-9-0-a-b-c-d-e-f-g-h-i-W=j-k-]*~ [ ;@{ N#( ( [ l-m-G n-o-p-|-q-4=Q+r-s-t-u-v-w-x-y-z-A-B-C->#",
+"D-E-w-F-G-H-$ I-J-#%K-L-M-N-I#O-P-Q-R-S-T-&%( { ( ( -@ #$ U-/=9 B#V-W-X-Y-Z-`- ;.;+;@;S@#;$;%;m%&;*;=;",
+"~ -;;;>;,;';(@);!;~;{;];D*^;/;(;f&t G _;E.[ [$U&-@n@&%E f*|$o$:;!-<;[;n&J@<*};|;1;2;3;4;5;6;7;8;9;0;a;",
+"b;c;f-d;e;f;g;h;i;j;u$k;l;m;n;o;:-p;q;r;s;E ( { ( ;@&%t;, : u;v;w;U+x;y;z;b$A;V$'&B;C;D;E;F;G;H;I;[+J;",
+"# K;L;M;N;O;P;Q;R;S;T;U;@@V;W;O$X;Y;Z;`; >~ ( **( [ [ p@.>+>@>k.#>$>%>&> **>=>->B*;>>>,>'>)>!>~>{>m*#+",
+"( ]>^>/>(>_>f$:><>J=[>;$}>|>!&1>2>3>4>S=, R&c*{ ( R.5%# 5>6>7>8>H$9>0>a>y@b>c>= d>e>D;f>g>h>i>j>k>l>_.",
+"A+m>n>o>p>q>r>s>|>t>u>v>w>x>y>z>A>a%B>C>D>o@E>U&( [ ~ G%t*F>G>H>I>J>K>L>M>N>O>P>Q>R>S>5@T>U>V>W>X>Y>Z>",
+"= `> ,.,F;+,@,#,$,%,f$&,*,=,-,;,>,,,',),[ | !,{ ~,{ V&{,J;<*],^,/,(,k&w;_,:,<,[,},|,J=b 1,2,3,4,5,6,Y*",
+"5 7,8,9,0,a,<%b,c,d,e,A;f,g,h,X+i,j,_%k,l,~ ~ m,{ **{ [ ]*n,o,p,q,r,s,t,f>u,v,w,x,0@y,z,A,B,C,D,E,F,G,",
+"5 Z-H,I,B,J,K,L,N;M,B*N,O,1*F*P,Q,R,S,T,U,J;V,, {*{ N#&%W,G X,Y,F@3%Z,`,>+j$ '.'+'@'#'$'%'&'*',;='-'/@",
+"# )$;'>','''L+~#)'!'d#~'{']'^'n /'('_':'z=-@U&c*{ d%( ~ +#<'['}'==|'1'2'3'4'5'6'7'8'9'0'a'$,L+b'c'd'e'",
+"( f'g'h'i'j'G;k'l'5;m'n'o'p'q'r's't'u'l+<'@+{ { c*( c*~ +#n-w+v'3@w'x's>o#y'z'A'B'C' ;D'E'F'G'u>H'I'e'",
+"p$J'K'L'M'N' 'O'P'Q'R'p'd@S'T'U'V'W'X'Y'Z'-*E o@( N#[ p@+#`' ).)6#+)@)#)$)%)&)K'9>*)=)-);)>),)')))!)~)",
+"( {)])v@^)/)()_):)<)[)z;})|)1)2)3)4)5)6)7)# N#( n@(  #T-8)9)0)h#a)b)c)=)d)<%$)f'e)]$8-f)g)h)i)j)k)l)m)",
+"- '*n)o)p)q)r)s)t)u)v)w)x)1>y)O>0*z)A)B)C){ 1 >$( &%@+$ D): E)F)G)H)I)J)w;K)L)M)N)O)P)Q)R)S)T)U)V)W)/@",
+"= X)Y)Z)e$`)I, ,R@ !.!+!@!#!$!%!&!*!=!$>j $ -!| ;!1 **# >!,!'!)!!!z'T'~!{!]!^!+=/!(!_!:!<!9,[!}!|!1!2!",
+"| u#3!4!<@5!S$o*6!7!8!9!k=3*0! @e,i@o$a!~ b!$ | ( ;=( c![ d!e!f!g!h!i!j!k!:>l!m!n!o!p!q!r!s!t!u!v!w!x!",
+"$ y!z!A!1)B!C!D!E!F!X%G!H!I!J!K!L!M!Q&N!f # j j p@$ [ O!P!Q!R!U,S!T!U!V!W!X!Y!3!k>Z!`! ~.~+~@~#~$~%~&~",
+"{ *~=~-~;~>~o&,~'~)~!~9,~~{~]~^~/~(~_~:~<~[~p$j $ # :&[ /'E.}~|~<@1~2~3~4~5~6~7~8~9~0~a~b~c~d~e~f~g~h~",
+"o$C@i~j~k~l~m~n~o~p~P@q~r~2&s~t~u~v~w~t$G-y$j x~y~z~R&# A~B~C~D~E~F~G~H~I~J~K~L~M~N~O~P~Q~R~F;W>S~T~U~",
+"p$V~W~v!X~E&Y~Z~`~ {.{+{@{#{${%{&{*{={-{;{P)>{,{S&'{N%){!{~{{{]{p-^{/{({_{Z%:{<{.,[{}{|{1{2{3{~;4{5{6{",
+"# Z-b>c;{ o$7{8{9{0{a{b{o$c{= d{e{O)f{$#g{h{G#i{j{k{l{m{n{o{P$: j ~  @Y)# p{= / ^$q{r{s{t{P$u{w+v{w{. ",
+": x{0 1 1 -!, y{h=1>&,z{{ ~ A{1 B{C{D{E{F{G{H{! I{J{K{L{M{N{G%-*O{- P{Q{- j - x~|#R{S{T{[ W+5 { U{V{W{",
+"h+u;n=h+{ n@{ X{Y{Z{`{ ]{ N#{ -@.]+]@]#]$]%]&]*]=]-];]>],]'])]$ h#m=!]~]5%[ ~ _+- {]]]^]b=# | [$/](]>#",
+"$ _]n=$ { ( { :]<][]}]|]d%( e*( 1]2]3]4]5]6]7]8]9]0]a]b]c]d]e]f]g]h]i]j][ &%~ j.P#k]l]b=5%[ m]n]o]p]q]",
+"h+u;r]$ { n@{ s]t]u]v]w]( n@{ x]y]z]A]B]C]D]E]F]u*>-G]H]I]Y J]K]W*L]M]N]d%[$p@{ f*O]P]n@$ Q]j R]S]}%T]",
+"E.U]V]$ V&[${ W]X]Y]Z]`]( ( { (  ^T={ I%[ .^- ( U&- $ V++^@^_;{ [ #^$^%^{ ( # d%| &^~ &%, 5 *^=^-^;^>^",
+"$ u;,^$ { -@{ '^)^!^~^{^:&[ ;=U&]^, 1 y*^^{ # ;@( -*- /^(^_^: :^{ o@<^t.[^N#_&{ >$}^j [ |^1^2^3^4^5^`#",
+"$ U]A)$ { -@{ s].]6^%^7^~ @+{ { 8^7./*( U&9^0^a^5 ^^K][ b^c^d^{ O%~ &+e^j ( f^{ g^j h^i^[ j^k^l^m^n^o^",
+"h+p^q^$ U&n@U&X{r^s^t^#]~ [ { V&u^o$/*~ J;v^w^x^{ O%_&V,y^z^{ ~ U&E.A^B^!,d%$ { ~ C^- 1 [ D^E^F^G^H^f=",
+"$ I^J^$ { ( { K^L^M^N^O^~  #V&{ 4]_;1 U&$ P^Q^R^u*V&= , S^T^-@# n@, U^V^y*{ h+{ 5%$ e*j.J;d!W^X^Y^Z^`^",
+"d% /./b #=1 ~ +/@/#/$/%/&/p$5 */=/S=- ~ @+T,Y{-/# j O%~ C~;/n@5 j V,>/,/j ~,o@j B#'/: i.)/a&!/~/{/]/, ",
+"| ^///(/{ _/( :/</[/}/|/1/2/1 - 3/, ~ /*{ 4/x.5/# j j 5%O.6/~ 1 { $ 7/8/{ { $ { 9/0/+&+&a/b/c/d/e/f/, ",
+"g/^/h/$ Q]5 d%C>i/j/k/l/a;m/~ c;n/~&-@| | o/p/q/E j.{ <&r/s/# n@[$_&t/u/K]&%, ;=v/w/x/#+j y/{ z/A/B/h+",
+"1 C/D/, E/j w=&%F/G/H/E.K]c%# o;I/E.&%j ,=r]J/K/~ j { ~ L/M/, $ ~ u*N/O/{ E.- {*P/Q/R/S/~ T/1 |#U/V/W/",
+";=X/Y/Z/j 5%- { `/4  (2 1 U&0*.(u/, # [ 5%+(@(#([ j ( [ $(%(# # $ o@&(*({ ]*= { =(-(;(>($ ,(~ j '(z{%*",
+"~ )(!(~([ ~&= { {([$~ ( c*- ](^(/(h+_&V,$ ((_(:(R&U&-@c*<([(x]~ o@( C=}(2/J;t*{ |(1(2(3(4(# |## 5(6(7(",
+"@+8(9(0(a({ m,j { [ b(~ o@c(d(e(Q,j [ @+{ f(g(t%~ { [ /*h(i(=*{ [ j j(k(1 $ - | l(m(n(o(E.E.p(q([ r(s(",
+"{ a/P$t(E 1 ( 1 u(( [ v(j e*E.w(h#E/j { x(, -*o$$ c*[ y*b g%5 =*[ y(, z(5 5%, 1 p$<*A(~ B(C()/%*p$= T]"};
diff --git a/front-end/src/routes.c b/front-end/src/routes.c
new file mode 100644 (file)
index 0000000..91f838f
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+/*
+ * Route entries are registered
+ * separatly from the node set
+ *
+ * This set is not used for anything in particular
+ * intended for future use
+ */
+
+#include "routes.h"
+
+
+int
+init_route_entries()
+{
+  route_count = 0;
+
+  route_set.next = &route_set;
+  route_set.prev = &route_set;
+
+  return 1;
+}
+
+
+int
+add_route_entry(struct route_entry *entry)
+{
+  struct route_entry *new_entry;
+
+  if((new_entry = malloc(sizeof(struct route_entry))) == 0)
+    {
+      fprintf(stderr, "OUT OF MEMORY!\n");
+      exit(1);
+    }
+
+  /* queue */
+  new_entry->next = route_set.next;
+  route_set.next->prev = new_entry;
+  route_set.next = new_entry;
+  new_entry->prev = &route_set;
+
+  route_count++;
+
+  return 1;
+
+}
+
+int
+del_route_entry(struct route_entry *entry)
+{
+
+  route_count--;
+
+  return 1;
+}
diff --git a/front-end/src/routes.h b/front-end/src/routes.h
new file mode 100644 (file)
index 0000000..e504592
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * OLSR ad-hoc routing table management protocol GUI front-end
+ * Copyright (C) 2003 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * uolsrGUI is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * uolsrGUI is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+/*
+ * Route entries are registered
+ * separatly from the node set
+ *
+ * This set is not used for anything in particular
+ * intended for future use
+ */
+
+#ifndef _OLSRD_FRONTEND_ROUTE
+#define _OLSRD_FRONTEND_ROUTE
+
+#include "common.h"
+
+#define MAX_IF_NAMESIZ  10
+
+struct route_entry
+{
+  union olsr_ip_addr gw;
+  union olsr_ip_addr dst;
+  olsr_u16_t         hopcnt;
+  char               if_name[MAX_IF_NAMESIZ];
+  struct route_entry *next;
+  struct route_entry *prev;
+};
+
+/* List */
+struct route_entry route_set;
+
+/* Counter */
+olsr_u32_t route_count;
+
+/* Functions */
+
+int
+init_route_entries();
+
+int
+add_route_entry(struct route_entry *);
+
+int
+del_route_entry(struct route_entry *);
+
+
+#endif
diff --git a/front-end/src/win32/arpa/inet.h b/front-end/src/win32/arpa/inet.h
new file mode 100644 (file)
index 0000000..8e215d6
--- /dev/null
@@ -0,0 +1,14 @@
+#if !defined TL_ARPA_INET_H_INCLUDED
+
+#define TL_ARPA_INET_H_INCLUDED
+
+#define WIN32_LEAN_AND_MEAN
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#undef interface
+
+int inet_aton(char *cp, struct in_addr *addr);
+int inet_pton(int af, char *src, void *dst);
+char *inet_ntop(int af, void *src, char *dst, int size);
+
+#endif
diff --git a/front-end/src/win32/compat.c b/front-end/src/win32/compat.c
new file mode 100644 (file)
index 0000000..a1eff88
--- /dev/null
@@ -0,0 +1,221 @@
+/*
+ * Functions for the Windows port
+ * Copyright (C) 2004 Thomas Lopatic (thomas@lopatic.de)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * olsrd-unik is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * olsrd-unik is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <sys/time.h>
+#include <ctype.h>
+
+void gettimeofday(struct timeval *TVal, void *TZone)
+{
+  SYSTEMTIME SysTime;
+  FILETIME FileTime;
+  unsigned __int64 Ticks;
+
+  GetSystemTime(&SysTime);
+  SystemTimeToFileTime(&SysTime, &FileTime);
+
+  Ticks = ((__int64)FileTime.dwHighDateTime << 32) |
+    (__int64)FileTime.dwLowDateTime;
+
+  Ticks -= 116444736000000000LL;
+
+  TVal->tv_sec = (unsigned int)(Ticks / 10000000);
+  TVal->tv_usec = (unsigned int)(Ticks % 10000000) / 10;
+}
+
+char *StrError(unsigned int ErrNo)
+{
+  static char Msg[1000];
+  
+  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrNo,
+               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), Msg,
+               sizeof (Msg), NULL);
+       
+  return Msg;
+}
+
+void PError(char *Str)
+{
+  char Msg[1000];
+  int Len;
+
+  sprintf(Msg, "ERROR - %s: ", Str);
+
+  Len = strlen(Msg);
+
+  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
+                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), Msg + Len,
+                sizeof (Msg) - Len, NULL);
+
+  fprintf(stderr, "%s\n", Msg);
+}
+
+void WinSockPError(char *Str)
+{
+  char Msg[1000];
+  int Len;
+
+  sprintf(Msg, "ERROR - %s: ", Str);
+
+  Len = strlen(Msg);
+
+  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(),
+                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), Msg + Len,
+                sizeof (Msg) - Len, NULL);
+
+  fprintf(stderr, "%s\n", Msg);
+}
+
+#define NS_INADDRSZ 4
+#define NS_IN6ADDRSZ 16
+#define NS_INT16SZ 2
+
+static char *inet_ntop4(const unsigned char *src, char *dst, int size)
+{
+  static const char fmt[] = "%u.%u.%u.%u";
+  char tmp[sizeof "255.255.255.255"];
+
+  if (sprintf(tmp, fmt, src[0], src[1], src[2], src[3]) > size)
+    return (NULL);
+
+  return strcpy(dst, tmp);
+}
+
+static char *inet_ntop6(const unsigned char *src, char *dst, int size)
+{
+  char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
+  struct { int base, len; } best, cur;
+  u_int words[NS_IN6ADDRSZ / NS_INT16SZ];
+  int i;
+
+  memset(words, '\0', sizeof words);
+
+  for (i = 0; i < NS_IN6ADDRSZ; i += 2)
+    words[i / 2] = (src[i] << 8) | src[i + 1];
+
+  best.base = -1;
+  cur.base = -1;
+
+  for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
+  {
+    if (words[i] == 0)
+    {
+      if (cur.base == -1)
+        cur.base = i, cur.len = 1;
+
+      else
+        cur.len++;
+    }
+
+    else
+    {
+      if (cur.base != -1)
+      {
+        if (best.base == -1 || cur.len > best.len)
+          best = cur;
+
+        cur.base = -1;
+      }
+    }
+  }
+
+  if (cur.base != -1)
+  {
+    if (best.base == -1 || cur.len > best.len)
+      best = cur;
+  }
+
+  if (best.base != -1 && best.len < 2)
+    best.base = -1;
+
+  tp = tmp;
+
+  for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
+  {
+    if (best.base != -1 && i >= best.base && i < (best.base + best.len))
+    {
+      if (i == best.base)
+        *tp++ = ':';
+
+      continue;
+    }
+
+    if (i != 0)
+      *tp++ = ':';
+
+    
+    if (i == 6 && best.base == 0 &&
+        (best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
+    {
+      if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp)))
+        return (NULL);
+
+      tp += strlen(tp);
+
+      break;
+    }
+
+    tp += sprintf(tp, "%x", words[i]);
+  }
+
+  if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ))
+    *tp++ = ':';
+
+  *tp++ = '\0';
+
+  if ((tp - tmp) > size)
+    return (NULL);
+
+  return strcpy(dst, tmp);
+}
+
+char *inet_ntop(int af, void *src, char *dst, int size)
+{
+  switch (af)
+  {
+  case AF_INET:
+    return (inet_ntop4(src, dst, size));
+
+  case AF_INET6:
+    return (inet_ntop6(src, dst, size));
+
+  default:
+    return (NULL);
+  }
+}
diff --git a/front-end/src/win32/netdb.h b/front-end/src/win32/netdb.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/front-end/src/win32/netinet/in.h b/front-end/src/win32/netinet/in.h
new file mode 100644 (file)
index 0000000..cec124c
--- /dev/null
@@ -0,0 +1,10 @@
+#if !defined TL_NETINET_IN_H_INCLUDED
+
+#define TL_NETINET_IN_H_INCLUDED
+
+#define WIN32_LEAN_AND_MEAN
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#undef interface
+
+#endif
diff --git a/front-end/src/win32/sys/socket.h b/front-end/src/win32/sys/socket.h
new file mode 100644 (file)
index 0000000..3a1e8cb
--- /dev/null
@@ -0,0 +1,10 @@
+#if !defined TL_SYS_SOCKET_H_INCLUDED
+
+#define TL_SYS_SOCKET_H_INCLUDED
+
+#define MSG_NOSIGNAL 0
+#define SHUT_RDWR SD_BOTH
+
+void WinSockPError(char *);
+char *StrError(unsigned int ErrNo);
+#endif
diff --git a/front-end/src/win32/sys/time.h b/front-end/src/win32/sys/time.h
new file mode 100644 (file)
index 0000000..51e52ec
--- /dev/null
@@ -0,0 +1,27 @@
+#if !defined TL_SYS_TIME_H_INCLUDED
+
+#define TL_SYS_TIME_H_INCLUDED
+
+#define WIN32_LEAN_AND_MEAN
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#undef interface
+
+#define timeradd(x, y, z)                       \
+  do                                            \
+  {                                             \
+    (z)->tv_sec = (x)->tv_sec + (y)->tv_sec;    \
+                                                \
+    (z)->tv_usec = (x)->tv_usec + (y)->tv_usec; \
+                                                \
+    if ((z)->tv_usec >= 1000000)                \
+    {                                           \
+      (z)->tv_sec++;                            \
+      (z)->tv_usec -= 1000000;                  \
+    }                                           \
+  }                                             \
+  while (0)
+
+void gettimeofday(struct timeval *TVal, void *TZone);
+
+#endif
diff --git a/gpl.txt b/gpl.txt
new file mode 100644 (file)
index 0000000..5b6e7c6
--- /dev/null
+++ b/gpl.txt
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/lib/dot_draw/Makefile b/lib/dot_draw/Makefile
new file mode 100644 (file)
index 0000000..59fddc3
--- /dev/null
@@ -0,0 +1,44 @@
+
+#############################################
+# EXAMPLE MAKEFILE TO CREATE A OLSRD PLUGIN #
+#############################################
+
+#Alter this file to fit your needs
+
+CC ?= gcc
+NAME ?= olsrd_dot_draw.so.0.1
+LIBDIR ?= $(INSTALL_PREFIX)/usr/lib
+# -fPIC creates position independent code
+MYFLAGS ?= -Wall -fPIC -g # Uncomment -g for debugging
+LIBS ?= -lc -lm
+
+#Sourcefiles
+#add yours here
+SRCS=  src/olsrd_plugin.c src/olsrd_dot_draw.c
+
+#Objectfiles
+#add yours here
+OBJS=  src/olsrd_plugin.o src/olsrd_dot_draw.o
+
+#Headerfiles
+#add yours here
+HDRS=  src/olsrd_plugin.h src/olsrd_dot_draw.h
+
+# -Wl passes options to the linker(-soname,....)
+# Use -lc to link it against C library
+# not 100% sure if this is neccesary
+
+all: plugin
+
+
+plugin: $(OBJS)
+       $(CC) $(LDFLAGS) $(MYFLAGS) -g -shared -Wl,-soname,$(NAME) \
+       -o $(NAME) $(OBJS) $(LIBS)
+
+
+install:
+       install -D -m 755 $(NAME) $(LIBDIR)/$(NAME)
+       /sbin/ldconfig -n $(LIBDIR)
+
+clean:
+       rm -f $(OBJS) $(NAME)
diff --git a/lib/dot_draw/Makefile.win32.in b/lib/dot_draw/Makefile.win32.in
new file mode 100644 (file)
index 0000000..088c8c6
--- /dev/null
@@ -0,0 +1,22 @@
+OBJS =                 src/olsrd_plugin.o \
+                       src/olsrd_dot_draw.o
+
+%.o:                   %.c
+                       gcc -mno-cygwin -O2 -Wall -c -DWIN32 \
+                       -I../../src/win32 -o$@ $<
+
+olsrd_dot_draw.dll:    $(OBJS)
+                       gcc -mno-cygwin -shared -o olsrd_dot_draw.dll \
+                       $(OBJS) ../../src/win32/compat.o -lws2_32
+
+clean:
+                       rm -f olsrd_dot_draw.dll
+                       find . -name \*~ -exec rm -f {} \;
+                       find src -name \*.o -exec rm -f {} \;
+
+mclean:                        clean
+                       rm -f Makefile.win32
+
+install:
+                       cp olsrd_dot_draw.dll ../..
+
diff --git a/lib/dot_draw/README_DOT_DRAW b/lib/dot_draw/README_DOT_DRAW
new file mode 100644 (file)
index 0000000..8a5b6eb
--- /dev/null
@@ -0,0 +1,21 @@
+DOT DATA GENERATION PLUGIN FOR UNIK OLSRD
+by Andreas Tønnesen(andreto@olsr.org)
+
+29.06.2004
+
+ABOUT
+
+Note that this code is a quick hack done at the Wizards Of Oz 3
+
+The plugin generates output (over a TCP socket) in the dot format.
+The dot tool generates visual presentations of directed graphs.
+It can be downloaded as part of the GraphViz package from:
+http://www.graphviz.org/
+
+telet to 127.0.0.1 port 2004 to receive the data
+
+installation:
+make
+make install
+
+- Andreas T
diff --git a/lib/dot_draw/mkmf.sh b/lib/dot_draw/mkmf.sh
new file mode 100755 (executable)
index 0000000..ec23cc8
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+srcs="\
+    src/olsrd_plugin.c \
+    src/olsrd_dot_draw.c \
+    "
+
+rm -f Makefile.win32
+cp Makefile.win32.in Makefile.win32
+
+echo >>Makefile.win32
+echo \# >>Makefile.win32
+echo \# DEPENDENCIES >>Makefile.win32
+echo \# >>Makefile.win32
+
+for f in $srcs; do
+    echo >>Makefile.win32
+    echo \# $f >>Makefile.win32
+    echo >>Makefile.win32
+
+    o=`echo $f | sed -e 's/c$/o/'`
+
+    gcc -MM -MT $o -mno-cygwin -O2 -Wall -c -DWIN32 -I../../src/win32 $f >>Makefile.win32
+done
diff --git a/lib/dot_draw/olsrd_dot_draw.so.0.1 b/lib/dot_draw/olsrd_dot_draw.so.0.1
new file mode 100755 (executable)
index 0000000..a7a54ef
Binary files /dev/null and b/lib/dot_draw/olsrd_dot_draw.so.0.1 differ
diff --git a/lib/dot_draw/src/olsr_plugin_io.h b/lib/dot_draw/src/olsr_plugin_io.h
new file mode 100644 (file)
index 0000000..047797a
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * OLSR ad-hoc routing table management protocol
+ * Copyright (C) 2004 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * UniK olsrd is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * UniK olsrd is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ * REVISIONS(starting from 0.4.6):
+ * 0.4.5 - 0.4.6 : GETD_S removed. The socket entries now reside within the 
+ *                 interface struct.
+ *                 Added GETF__ADD_IFCHGF and GETF__DEL_IFCHGF.
+ *                 - Andreas
+ *
+ */
+
+/*
+ * IO commands
+ *
+ * NAMING CONVENTION:
+ * - DATAPOINTERS
+ *   Commands to get datapointers MUST have the prefix
+ *   GETD__ added to the full name of the variable/pointer
+ *   in all upper cases.
+ *   Example: A command to get a pointer to a variable called
+ *   "myvar" in olsrd must be called GETD__MYVAR
+ *
+ * - FUNCTIONS
+ *   Commands to get pointers to olsrd functions MUST have
+ *   the prefix GETF__ added to the full name of the runction
+ *   in uppercases.
+ *   Example: A command to get a pointer to the function
+ *   "my_function" must be named GETF__MY_FUNCTION
+ *
+ *
+ *   New commands can be added - BUT EXISTING COMMANDS MUST
+ *   _NEVER_ CHANGE VALUE!
+ */
+
+#ifndef _OLSR_PLUGIN_IO
+#define _OLSR_PLUGIN_IO
+
+/* Data fetching - starts at 100 */
+#define GETD__PACKET                               100                            
+#define GETD__OUTPUTSIZE                           101
+#define GETD__IFNET                                102
+#define GETD__NOW                                  103
+#define GETD__PARSER_ENTRIES                       104
+#define GETD__OLSR_SOCKET_ENTRIES                  105
+#define GETD__MAXMESSAGESIZE                       106
+#define GETD__NEIGHBORTABLE                        108
+#define GETD__TWO_HOP_NEIGHBORTABLE                109
+#define GETD__TC_TABLE                             110
+#define GETD__HNA_SET                              111
+
+/* Function fetching - starts at 500 */
+#define GETF__OLSR_REGISTER_SCHEDULER_EVENT        500
+#define GETF__OLSR_REMOVE_SCHEDULER_EVENT          501
+#define GETF__OLSR_PARSER_ADD_FUNCTION             502
+#define GETF__OLSR_PARSER_REMOVE_FUNCTION          503
+#define GETF__OLSR_REGISTER_TIMEOUT_FUNCTION       504
+#define GETF__OLSR_REMOVE_TIMEOUT_FUNCTION         505
+#define GETF__GET_MSG_SEQNO                        506
+#define GETF__OLSR_CHECK_DUP_TABLE_PROC            507
+#define GETF__NET_OUTPUT                           508
+#define GETF__OLSR_FORWARD_MESSAGE                 509
+#define GETF__ADD_OLSR_SOCKET                      510
+#define GETF__REMOVE_OLSR_SOCKET                   511
+#define GETF__CHECK_NEIGHBOR_LINK                  512
+#define GETF__OLSR_PRINTF                          513
+#define GETF__OLSR_MALLOC                          514
+#define GETF__DOUBLE_TO_ME                         515
+#define GETF__ME_TO_DOUBLE                         516
+#define GETF__ADD_LOCAL_HNA4_ENTRY                 517
+#define GETF__REMOVE_LOCAL_HNA4_ENTRY              518
+#define GETF__ADD_LOCAL_HNA6_ENTRY                 519
+#define GETF__REMOVE_LOCAL_HNA6_ENTRY              520
+#define GETF__OLSR_INPUT                           521
+#define GETF__ADD_PTF                              522
+#define GETF__DEL_PTF                              523
+#define GETF__IF_IFWITHSOCK                        524
+#define GETF__IF_IFWITHADDR                        525
+#define GETF__PARSE_PACKET                         526
+#define GETF__REGISTER_PCF                         527
+#define GETF__OLSR_HASHING                         528
+#define GETF__ADD_IFCHGF                           529
+#define GETF__DEL_IFCHGF                           530
+
+#endif
diff --git a/lib/dot_draw/src/olsrd_dot_draw.c b/lib/dot_draw/src/olsrd_dot_draw.c
new file mode 100644 (file)
index 0000000..bd5e410
--- /dev/null
@@ -0,0 +1,452 @@
+/*
+ * OLSR plugin
+ * Copyright (C) 2004 Andreas Tønnesen (andreto@olsr.org)
+ *
+ * This file is part of the olsrd dynamic gateway detection.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This plugin is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ * Dynamic linked library for UniK OLSRd
+ */
+
+#include "olsrd_dot_draw.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#ifdef WIN32
+#define close(x) closesocket(x)
+#endif
+
+int ipc_socket;
+int ipc_open;
+int ipc_connection;
+int ipc_socket_up;
+
+/**
+ *Do initialization here
+ *
+ *This function is called by the my_init
+ *function in uolsrd_plugin.c
+ */
+int
+olsr_plugin_init()
+{
+
+  /* Initial IPC value */
+  ipc_open = 0;
+  ipc_socket_up = 0;
+
+  /* Register the "ProcessChanges" function */
+  register_pcf(&pcf_event);
+
+  return 1;
+}
+
+int
+plugin_ipc_init()
+{
+  struct sockaddr_in sin;
+
+  /* Init ipc socket */
+  if ((ipc_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
+    {
+      olsr_printf(1, "(DOT DRAW)IPC socket %s\n", strerror(errno));
+      return 0;
+    }
+  else
+    {
+      /* Bind the socket */
+      
+      /* complete the socket structure */
+      memset(&sin, 0, sizeof(sin));
+      sin.sin_family = AF_INET;
+      sin.sin_addr.s_addr = INADDR_ANY;
+      sin.sin_port = htons(2004);
+      
+      /* bind the socket to the port number */
+      if (bind(ipc_socket, (struct sockaddr *) &sin, sizeof(sin)) == -1) 
+       {
+         olsr_printf(1, "(DOT DRAW)IPC bind %s\n", strerror(errno));
+         return 0;
+       }
+      
+      /* show that we are willing to listen */
+      if (listen(ipc_socket, 1) == -1) 
+       {
+         olsr_printf(1, "(DOT DRAW)IPC listen %s\n", strerror(errno));
+         return 0;
+       }
+
+
+      /* Register with olsrd */
+      add_olsr_socket(ipc_socket, &ipc_action);
+      ipc_socket_up = 1;
+    }
+
+  return 1;
+}
+
+void
+ipc_action(int fd)
+{
+  struct sockaddr_in pin;
+  socklen_t addrlen;
+  char *addr;  
+
+  addrlen = sizeof(struct sockaddr_in);
+
+  if ((ipc_connection = accept(ipc_socket, (struct sockaddr *)  &pin, &addrlen)) == -1)
+    {
+      olsr_printf(1, "(DOT DRAW)IPC accept: %s\n", strerror(errno));
+      exit(1);
+    }
+  else
+    {
+      addr = inet_ntoa(pin.sin_addr);
+      if(ntohl(pin.sin_addr.s_addr) != INADDR_LOOPBACK)
+       {
+         olsr_printf(1, "Front end-connection from foregin host(%s) not allowed!\n", addr);
+         close(ipc_connection);
+         return;
+       }
+      else
+       {
+         ipc_open = 1;
+         olsr_printf(1, "(DOT DRAW)IPC: Connection from %s\n",addr);
+       }
+    }
+
+}
+
+/*
+ * destructor - called at unload
+ */
+void
+olsr_plugin_exit()
+{
+  if(ipc_open)
+    close(ipc_socket);
+}
+
+
+
+/* Mulitpurpose funtion */
+int
+plugin_io(int cmd, void *data, size_t size)
+{
+
+  switch(cmd)
+    {
+    default:
+      return 0;
+    }
+  
+  return 1;
+}
+
+
+
+
+/**
+ *Scheduled event
+ */
+int
+pcf_event(int changes_neighborhood,
+         int changes_topology,
+         int changes_hna)
+{
+  int res;
+  olsr_u8_t index;
+  struct neighbor_entry *neighbor_table_tmp;
+  struct neighbor_2_list_entry *list_2;
+  struct tc_entry *entry;
+  struct topo_dst *dst_entry;
+  struct hna_entry *tmp_hna;
+  struct hna_net *tmp_net;
+
+  res = 0;
+
+  if(changes_neighborhood || changes_topology || changes_hna)
+    {
+      /* Print tables to IPC socket */
+
+      ipc_send("digraph topology\n{\n", strlen("digraph topology\n{\n"));
+
+      /* Neighbors */
+      for(index=0;index<HASHSIZE;index++)
+       {
+         
+         for(neighbor_table_tmp = neighbortable[index].next;
+             neighbor_table_tmp != &neighbortable[index];
+             neighbor_table_tmp = neighbor_table_tmp->next)
+           {
+             if(neighbor_table_tmp->is_mpr)
+               {
+                 ipc_print_mpr_link(main_addr, &neighbor_table_tmp->neighbor_main_addr);                 
+                 ipc_print_mpr_link(&neighbor_table_tmp->neighbor_main_addr, main_addr);
+               }
+             else
+               {
+                 ipc_print_neigh_link(main_addr, &neighbor_table_tmp->neighbor_main_addr);               
+                 ipc_print_neigh_link(&neighbor_table_tmp->neighbor_main_addr, main_addr);
+               }
+
+             for(list_2 = neighbor_table_tmp->neighbor_2_list.next;
+                 list_2 != &neighbor_table_tmp->neighbor_2_list;
+                 list_2 = list_2->next)
+               {
+                 ipc_print_2h_link(&neighbor_table_tmp->neighbor_main_addr, 
+                                   &list_2->neighbor_2->neighbor_2_addr);
+               }
+             
+           }
+       }
+
+      /* Topology */  
+      for(index=0;index<HASHSIZE;index++)
+       {
+         /* For all TC entries */
+         entry = tc_table[index].next;
+         while(entry != &tc_table[index])
+           {
+             /* For all destination entries of that TC entry */
+             dst_entry = entry->destinations.next;
+             while(dst_entry != &entry->destinations)
+               {
+                 ipc_print_tc_link(&entry->T_last_addr, &dst_entry->T_dest_addr);
+                 dst_entry = dst_entry->next;
+               }
+             entry = entry->next;
+           }
+         
+       }
+
+      /* HNA entries */
+      for(index=0;index<HASHSIZE;index++)
+       {
+         tmp_hna = hna_set[index].next;
+         /* Check all entrys */
+         while(tmp_hna != &hna_set[index])
+           {
+             /* Check all networks */
+             tmp_net = tmp_hna->networks.next;
+             
+             while(tmp_net != &tmp_hna->networks)
+               {
+                 ipc_print_net(&tmp_hna->A_gateway_addr, 
+                               &tmp_net->A_network_addr, 
+                               &tmp_net->A_netmask);
+                 tmp_net = tmp_net->next;
+               }
+             
+             tmp_hna = tmp_hna->next;
+           }
+       }
+
+
+      ipc_send("}\n\n", strlen("}\n\n"));
+
+      res = 1;
+    }
+
+
+  if(!ipc_socket_up)
+    plugin_ipc_init();
+
+  return res;
+}
+
+
+
+
+static void inline
+ipc_print_neigh_link(union olsr_ip_addr *from, union olsr_ip_addr *to)
+{
+  char *adr;
+
+  adr = olsr_ip_to_string(from);
+  ipc_send("\"", 1);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\" -> \"", strlen("\" -> \""));
+  adr = olsr_ip_to_string(to);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\"[label=\"neigh\", style=dashed];\n", strlen("\"[label=\"neigh\", style=dashed];\n"));
+
+}
+
+static void inline
+ipc_print_2h_link(union olsr_ip_addr *from, union olsr_ip_addr *to)
+{
+  char *adr;
+
+  adr = olsr_ip_to_string(from);
+  ipc_send("\"", 1);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\" -> \"", strlen("\" -> \""));
+  adr = olsr_ip_to_string(to);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\"[label=\"2 hop\"];\n", strlen("\"[label=\"2 hop\"];\n"));
+
+}
+
+static void inline
+ipc_print_mpr_link(union olsr_ip_addr *from, union olsr_ip_addr *to)
+{
+  char *adr;
+
+  adr = olsr_ip_to_string(from);
+  ipc_send("\"", 1);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\" -> \"", strlen("\" -> \""));
+  adr = olsr_ip_to_string(to);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\"[label=\"MPR\", style=dashed];\n", strlen("\"[label=\"MPR\", style=dashed]];\n"));
+
+}
+
+static void inline
+ipc_print_tc_link(union olsr_ip_addr *from, union olsr_ip_addr *to)
+{
+  char *adr;
+
+  adr = olsr_ip_to_string(from);
+  ipc_send("\"", 1);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\" -> \"", strlen("\" -> \""));
+  adr = olsr_ip_to_string(to);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\"[label=\"TC\"];\n", strlen("\"[label=\"TC\"];\n"));
+
+}
+
+static void inline
+ipc_print_net(union olsr_ip_addr *gw, union olsr_ip_addr *net, union hna_netmask *mask)
+{
+  char *adr;
+
+  adr = olsr_ip_to_string(gw);
+  ipc_send("\"", 1);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\" -> \"", strlen("\" -> \""));
+  adr = olsr_ip_to_string(net);
+  ipc_send(adr, strlen(adr));
+  ipc_send("/", 1);
+  adr = olsr_netmask_to_string(mask);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\"[label=\"HNA\"];\n", strlen("\"[label=\"HNA\"];\n"));
+  ipc_send("\"", 1);
+  adr = olsr_ip_to_string(net);
+  ipc_send(adr, strlen(adr));
+  ipc_send("/", 1);
+  adr = olsr_netmask_to_string(mask);
+  ipc_send(adr, strlen(adr));
+  ipc_send("\"", 1);
+  ipc_send("[shape=diamond];\n", strlen("[shape=diamond];\n"));
+}
+
+
+
+int
+ipc_send(char *data, int size)
+{
+  if(!ipc_open)
+    return 0;
+
+  if (send(ipc_connection, data, size, MSG_NOSIGNAL) < 0) 
+    {
+      olsr_printf(1, "(DOT DRAW)IPC connection lost!\n");
+      close(ipc_connection);
+      ipc_open = 0;
+      return -1;
+    }
+
+  return 1;
+}
+
+
+
+
+
+/**
+ *Converts a olsr_ip_addr to a string
+ *Goes for both IPv4 and IPv6
+ *
+ *NON REENTRANT! If you need to use this
+ *function twice in e.g. the same printf
+ *it will not work.
+ *You must use it in different calls e.g.
+ *two different printfs
+ *
+ *@param the IP to convert
+ *@return a pointer to a static string buffer
+ *representing the address in "dots and numbers"
+ *
+ */
+char *
+olsr_ip_to_string(union olsr_ip_addr *addr)
+{
+
+  char *ret;
+  struct in_addr in;
+  
+  if(ipversion == AF_INET)
+    {
+      in.s_addr=addr->v4;
+      ret = inet_ntoa(in);
+    }
+  else
+    {
+      /* IPv6 */
+      ret = (char *)inet_ntop(AF_INET6, &addr->v6, ipv6_buf, sizeof(ipv6_buf));
+    }
+
+  return ret;
+}
+
+
+
+
+/**
+ *This function is just as bad as the previous one :-(
+ */
+char *
+olsr_netmask_to_string(union hna_netmask *mask)
+{
+  char *ret;
+  struct in_addr in;
+  
+  if(ipversion == AF_INET)
+    {
+      in.s_addr = mask->v4;
+      ret = inet_ntoa(in);
+      return ret;
+
+    }
+  else
+    {
+      /* IPv6 */
+      sprintf(netmask, "%d", mask->v6);
+      return netmask;
+    }
+
+  return ret;
+}
+
+
diff --git a/lib/dot_draw/src/olsrd_dot_draw.h b/lib/dot_draw/src/olsrd_dot_draw.h
new file mode 100644 (file)
index 0000000..854acae
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * OLSR plugin
+ * Copyright (C) 2004 Andreas Tønnesen (andreto@olsr.org)
+ *
+ * This file is part of the olsrd dynamic gateway detection.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This plugin is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ * Dynamic linked library example for UniK OLSRd
+ */
+
+#ifndef _OLSRD_PLUGIN_TEST
+#define _OLSRD_PLUGIN_TEST
+
+#include "olsrd_plugin.h"
+
+
+char netmask[5];
+
+/* Event function to register with the sceduler */
+int
+pcf_event(int, int, int);
+
+void
+ipc_action(int);
+
+static void inline
+ipc_print_neigh_link(union olsr_ip_addr *, union olsr_ip_addr *);
+
+static void inline
+ipc_print_2h_link(union olsr_ip_addr *, union olsr_ip_addr *);
+
+static void inline
+ipc_print_mpr_link(union olsr_ip_addr *, union olsr_ip_addr *);
+
+static void inline
+ipc_print_tc_link(union olsr_ip_addr *, union olsr_ip_addr *);
+
+static void inline
+ipc_print_net(union olsr_ip_addr *, union olsr_ip_addr *, union hna_netmask *);
+
+int
+ipc_send(char *, int);
+
+char *
+olsr_ip_to_string(union olsr_ip_addr *);
+
+char *
+olsr_netmask_to_string(union hna_netmask *);
+
+
+#endif
diff --git a/lib/dot_draw/src/olsrd_plugin.c b/lib/dot_draw/src/olsrd_plugin.c
new file mode 100644 (file)
index 0000000..7ea08b4
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * OLSR plugin
+ * Copyright (C) 2004 Andreas Tønnesen (andreto@olsr.org)
+ *
+ * This file is part of the olsrd dynamic gateway detection.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This plugin is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ * Dynamic linked library example for UniK OLSRd
+ */
+
+
+#include "olsrd_plugin.h"
+#include <stdio.h>
+
+
+/* Data to sent to the plugin with the register_olsr_function call 
+ * THIS STRUCT MUST MATCH ITS SIBLING IN plugin_loader.h IN OLSRD
+ */
+struct olsr_plugin_data
+{
+  int ipversion;
+  union olsr_ip_addr *main_addr;
+  int (*olsr_plugin_io)(int, void *, size_t);
+};
+
+
+/**
+ * "Private" declarations
+ */
+
+void __attribute__ ((constructor)) 
+my_init(void);
+
+void __attribute__ ((destructor)) 
+my_fini(void);
+
+int
+register_olsr_data(struct olsr_plugin_data *);
+
+int
+fetch_olsrd_data();
+
+/*
+ * Defines the version of the plugin interface that is used
+ * THIS IS NOT THE VERSION OF YOUR PLUGIN!
+ * Do not alter unless you know what you are doing!
+ */
+int plugin_interface_version;
+
+/**
+ *Constructor
+ */
+void
+my_init()
+{
+  /* Print plugin info to stdout */
+  printf("%s\n", MOD_DESC);
+  /* Set interface version */
+  plugin_interface_version = PLUGIN_INTERFACE_VERSION;
+
+  return;
+}
+
+/**
+ *Destructor
+ */
+void
+my_fini()
+{
+
+  /* Calls the destruction function
+   * olsr_plugin_exit()
+   * This function should be present in your
+   * sourcefile and all data destruction
+   * should happen there - NOT HERE!
+   */
+  olsr_plugin_exit();
+
+  return;
+}
+
+
+/**
+ *Register needed functions and pointers
+ *
+ *This function should not be changed!
+ *
+ */
+int
+register_olsr_data(struct olsr_plugin_data *data)
+{
+  /* IPversion */
+  ipversion = data->ipversion;
+  /* Main address */
+  main_addr = data->main_addr;
+
+  /* Multi-purpose function */
+  olsr_plugin_io = data->olsr_plugin_io;
+
+  /* Set size of IP address */
+  if(ipversion == AF_INET)
+    {
+      ipsize = sizeof(olsr_u32_t);
+    }
+  else
+    {
+      ipsize = sizeof(struct in6_addr);
+    }
+
+  if(!fetch_olsrd_data())
+    {
+      fprintf(stderr, "Could not fetch the neccessary functions from olsrd!\n");
+      return 0;
+    }
+
+  /* Calls the initialization function
+   * olsr_plugin_init()
+   * This function should be present in your
+   * sourcefile and all data initialization
+   * should happen there - NOT HERE!
+   */
+  if(!olsr_plugin_init())
+    {
+      fprintf(stderr, "Could not initialize plugin!\n");
+      return 0;
+    }
+
+  if(!plugin_ipc_init())
+    {
+      fprintf(stderr, "Could not initialize plugin IPC!\n");
+      return 0;
+    }
+
+  return 1;
+
+}
+
+
+
+int
+fetch_olsrd_data()
+{
+  int retval = 1;
+
+  
+  /* Neighbor table */
+  if(!olsr_plugin_io(GETD__NEIGHBORTABLE, 
+                    &neighbortable, 
+                    sizeof(neighbortable)))
+  {
+    neighbortable = NULL;
+    retval = 0;
+  }
+  
+  /* Two hop neighbor table */
+  if(!olsr_plugin_io(GETD__TWO_HOP_NEIGHBORTABLE, 
+                    &two_hop_neighbortable, 
+                    sizeof(two_hop_neighbortable)))
+  {
+    two_hop_neighbortable = NULL;
+    retval = 0;
+  }
+
+  /* Topoloy table */
+  if(!olsr_plugin_io(GETD__TC_TABLE, 
+                    &tc_table, 
+                    sizeof(tc_table)))
+  {
+    tc_table = NULL;
+    retval = 0;
+  }
+
+  /* HNA table */
+  if(!olsr_plugin_io(GETD__HNA_SET, 
+                    &hna_set, 
+                    sizeof(hna_set)))
+  {
+    hna_set = NULL;
+    retval = 0;
+  }
+
+  /* Olsr debug output function */
+  if(!olsr_plugin_io(GETF__OLSR_PRINTF, 
+                    &olsr_printf, 
+                    sizeof(olsr_printf)))
+  {
+    olsr_printf = NULL;
+    retval = 0;
+  }
+
+  /* Olsr malloc wrapper */
+  if(!olsr_plugin_io(GETF__OLSR_MALLOC, 
+                    &olsr_malloc, 
+                    sizeof(olsr_malloc)))
+  {
+    olsr_malloc = NULL;
+    retval = 0;
+  }
+
+  /* "ProcessChanges" event registration */
+  if(!olsr_plugin_io(GETF__REGISTER_PCF, 
+                    &register_pcf, 
+                    sizeof(register_pcf)))
+  {
+    register_pcf = NULL;
+    retval = 0;
+  }
+
+
+
+  /* Add socket to OLSR select function */
+  if(!olsr_plugin_io(GETF__ADD_OLSR_SOCKET, &add_olsr_socket, sizeof(add_olsr_socket)))
+  {
+    add_olsr_socket = NULL;
+    retval = 0;
+  }
+
+  /* Remove socket from OLSR select function */
+  if(!olsr_plugin_io(GETF__REMOVE_OLSR_SOCKET, &remove_olsr_socket, sizeof(remove_olsr_socket)))
+  {
+    remove_olsr_socket = NULL;
+    retval = 0;
+  }
+
+  return retval;
+
+}
diff --git a/lib/dot_draw/src/olsrd_plugin.h b/lib/dot_draw/src/olsrd_plugin.h
new file mode 100644 (file)
index 0000000..9d9fbee
--- /dev/null
@@ -0,0 +1,351 @@
+
+
+/*
+ * Copyright (c) 2004, Andreas Tønnesen(andreto-at-olsr.org)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, 
+ *   this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice, 
+ *   this list of conditions and the following disclaimer in the documentation 
+ *   and/or other materials provided with the distribution.
+ * * Neither the name of the UniK olsr daemon nor the names of its contributors 
+ *   may be used to endorse or promote products derived from this software 
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/*
+ * Dynamic linked library example for UniK OLSRd
+ */
+
+#ifndef _OLSRD_PLUGIN_DEFS
+#define _OLSRD_PLUGIN_DEFS
+
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/time.h>
+#include <time.h>
+#include <math.h>
+
+#include "olsr_plugin_io.h"
+
+/* Use this as PARSER_TYPE to receive ALL messages! */
+#define PROMISCUOUS 0xffffffff
+
+
+/*****************************************************************************
+ *                               Plugin data                                 *
+ *                       ALTER THIS TO YOUR OWN NEED                         *
+ *****************************************************************************/
+
+#define PLUGIN_NAME    "OLSRD dot draw plugin"
+#define PLUGIN_VERSION "0.1"
+#define PLUGIN_AUTHOR   "Andreas Tønnesen"
+#define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
+#define PLUGIN_INTERFACE_VERSION 1
+
+/* The type of message you will use */
+#define MESSAGE_TYPE 128
+
+/* The type of messages we will receive - can be set to promiscuous */
+#define PARSER_TYPE MESSAGE_TYPE
+
+
+
+/****************************************************************************
+ *           Various datastructures and definitions from olsrd              *
+ ****************************************************************************/
+
+/*
+ * TYPES SECTION
+ */
+
+/* types */
+#include <sys/types.h>
+
+#ifndef WIN32
+typedef u_int8_t        olsr_u8_t;
+typedef u_int16_t       olsr_u16_t;
+typedef u_int32_t       olsr_u32_t;
+typedef int8_t          olsr_8_t;
+typedef int16_t         olsr_16_t;
+typedef int32_t         olsr_32_t;
+#else
+typedef unsigned char olsr_u8_t;
+typedef unsigned short olsr_u16_t;
+typedef unsigned int olsr_u32_t;
+typedef char olsr_8_t;
+typedef short olsr_16_t;
+typedef int olsr_32_t;
+#endif
+
+
+/*
+ * VARIOUS DEFINITIONS
+ */
+
+union olsr_ip_addr
+{
+  olsr_u32_t v4;
+  struct in6_addr v6;
+};
+
+union hna_netmask
+{
+  olsr_u32_t v4;
+  olsr_u16_t v6;
+};
+
+#define MAX_TTL               0xff
+
+
+/*
+ *Link Types
+ */
+
+#define UNSPEC_LINK           0
+#define ASYM_LINK             1
+#define SYM_LINK              2
+#define LOST_LINK             3
+#define HIDE_LINK             4
+#define MAX_LINK              4
+
+
+/*
+ * Mantissa scaling factor
+ */
+
+#define VTIME_SCALE_FACTOR    0.0625
+
+
+/*
+ * Hashing
+ */
+
+#define        HASHSIZE        32
+#define        HASHMASK        (HASHSIZE - 1)
+
+#define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
+
+
+
+/*
+ * Neighbor structures
+ */
+
+/* One hop neighbor */
+
+struct neighbor_2_list_entry 
+{
+  struct neighbor_2_entry      *neighbor_2;
+  struct timeval              neighbor_2_timer;
+  struct neighbor_2_list_entry *next;
+  struct neighbor_2_list_entry *prev;
+};
+
+struct neighbor_entry
+{
+  union olsr_ip_addr           neighbor_main_addr;
+  olsr_u8_t                    status;
+  olsr_u8_t                    willingness;
+  olsr_u8_t                    is_mpr;
+  olsr_u8_t                    was_mpr; /* Used to detect changes in MPR */
+  int                          neighbor_2_nocov;
+  int                          linkcount;
+  struct neighbor_2_list_entry neighbor_2_list; 
+  struct neighbor_entry        *next;
+  struct neighbor_entry        *prev;
+};
+
+
+/* Two hop neighbor */
+
+
+
+struct neighbor_list_entry 
+{
+  struct       neighbor_entry *neighbor;
+  struct       neighbor_list_entry *next;
+  struct       neighbor_list_entry *prev;
+};
+
+
+struct neighbor_2_entry
+{
+  union olsr_ip_addr         neighbor_2_addr;
+  olsr_u8_t                 mpr_covered_count;    /*used in mpr calculation*/
+  olsr_u8_t                 processed;            /*used in mpr calculation*/
+  olsr_16_t                  neighbor_2_pointer;   /* Neighbor count */
+  struct neighbor_list_entry neighbor_2_nblist; 
+  struct neighbor_2_entry    *prev;
+  struct neighbor_2_entry    *next;
+};
+
+/* Topology entry */
+
+struct topo_dst
+{
+  union olsr_ip_addr T_dest_addr;
+  struct timeval T_time;
+  olsr_u16_t T_seq;
+  struct topo_dst *next;
+  struct topo_dst *prev;
+};
+
+
+struct tc_entry
+{
+  union olsr_ip_addr T_last_addr;
+  struct topo_dst destinations;
+  struct tc_entry *next;
+  struct tc_entry *prev;
+};
+
+/* HNA */
+
+/* hna_netmask declared in packet.h */
+
+struct hna_net
+{
+  union olsr_ip_addr A_network_addr;
+  union hna_netmask  A_netmask;
+  struct timeval     A_time;
+  struct hna_net     *next;
+  struct hna_net     *prev;
+};
+
+struct hna_entry
+{
+  union olsr_ip_addr A_gateway_addr;
+  struct hna_net     networks;
+  struct hna_entry   *next;
+  struct hna_entry   *prev;
+};
+
+/* The lists */
+
+struct neighbor_entry *neighbortable;
+struct neighbor_2_entry *two_hop_neighbortable;
+struct tc_entry *tc_table;
+struct hna_entry *hna_set;
+
+
+/* Buffer for olsr_ip_to_string */
+
+char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
+
+
+/****************************************************************************
+ *                Function pointers to functions in olsrd                   *
+ *              These allow direct access to olsrd functions                *
+ ****************************************************************************/
+
+/* The multi-purpose funtion. All other functions are fetched trough this */
+int (*olsr_plugin_io)(int, void *, size_t);
+
+/* Register a scheduled event */
+int (*olsr_register_scheduler_event)(void (*)(), float, float, olsr_u8_t *);
+
+/* Register a "process changes" function */
+int (*register_pcf)(int (*)(int, int, int));
+
+/* Get the next message seqno in line */
+olsr_u16_t (*get_msg_seqno)();
+
+/* Check the duplicate table for prior processing */
+int (*check_dup_proc)(union olsr_ip_addr *, olsr_u16_t);
+
+
+/* Add a socket to the main olsrd select loop */
+void (*add_olsr_socket)(int, void(*)(int));
+
+/* Remove a socket from the main olsrd select loop */
+int (*remove_olsr_socket)(int, void(*)(int));
+
+/* get the link status to a neighbor */
+int (*check_neighbor_link)(union olsr_ip_addr *);
+
+/* Mantissa/exponen conversions */
+olsr_u8_t (*double_to_me)(double);
+
+double (*me_to_double)(olsr_u8_t);
+
+/* olsrd printf wrapper */
+int (*olsr_printf)(int, char *, ...);
+
+/* olsrd malloc wrapper */
+void *(*olsr_malloc)(size_t, const char *);
+
+/* Add hna net IPv4 */
+void (*add_local_hna4_entry)(union olsr_ip_addr *, union hna_netmask *);
+
+/* Remove hna net IPv4 */
+int (*remove_local_hna4_entry)(union olsr_ip_addr *, union hna_netmask *);
+
+/* Add hna net IPv6 */
+void (*add_local_hna6_entry)(union olsr_ip_addr *, union hna_netmask *);
+
+/* Remove hna net IPv6 */
+int (*remove_local_hna6_entry)(union olsr_ip_addr *, union hna_netmask *);
+
+
+/****************************************************************************
+ *                             Data from olsrd                              *
+ *           NOTE THAT POINTERS POINT TO THE DATA USED BY OLSRD!            *
+ *               NEVER ALTER DATA POINTED TO BY THESE POINTERS              * 
+ *                   UNLESS YOU KNOW WHAT YOU ARE DOING!!!                  *
+ ****************************************************************************/
+
+/* These two are set automatically by olsrd at load time */
+int                ipversion;  /* IPversion in use */
+union olsr_ip_addr *main_addr; /* Main address */
+
+
+size_t             ipsize;     /* Size of the ipadresses used */
+struct timeval     *now;       /* the olsrds schedulers idea of current time */
+
+/* Data that can be altered by your plugin */
+char               *buffer;    /* The packet buffer - put your packet here */
+int                *outputsize;/* Pointer to the outputsize - set the size of your packet here */
+
+
+/****************************************************************************
+ *                Functions that the plugin MUST provide                    *
+ ****************************************************************************/
+
+
+/* Initialization function */
+int
+olsr_plugin_init();
+
+/* IPC initialization function */
+int
+plugin_ipc_init();
+
+/* Destructor function */
+void
+olsr_plugin_exit();
+
+/* Mulitpurpose funtion */
+int
+plugin_io(int, void *, size_t);
+
+#endif
diff --git a/lib/dot_draw/src/olsrd_plugin_io.h b/lib/dot_draw/src/olsrd_plugin_io.h
new file mode 100644 (file)
index 0000000..e9326b8
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * OLSR ad-hoc routing table management protocol
+ * Copyright (C) 2004 Andreas Tønnesen (andreto@ifi.uio.no)
+ *
+ * This file is part of olsrd-unik.
+ *
+ * UniK olsrd is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * UniK olsrd is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with olsrd-unik; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/*
+ * IO commands
+ *
+ * NAMING CONVENTION:
+ * - DATAPOINTERS
+ *   Commands to get datapointers MUST have the prefix
+ *   GETD__ added to the full name of the variable/pointer
+ *   in all upper cases.
+ *   Example: A command to get a pointer to a variable called
+ *   "myvar" in olsrd must be called GETD__MYVAR
+ *
+ * - FUNCTIONS
+ *   Commands to get pointers to olsrd functions MUST have
+ *   the prefix GETF__ added to the full name of the runction
+ *   in uppercases.
+ *   Example: A command to get a pointer to the function
+ *   "my_function" must be named GETF__MY_FUNCTION
+ *
+ */
+
+
+/* Data fetching - starts at 100 */
+#define GETD__PACKET                               100                            
+#define GETD__OUTPUTSIZE                           101
+#define GETD__IFNET                                102
+#define GETD__NOW                                  103
+/* Function fetching - starts at 500 */
+#define GETF__OLSR_REGISTER_SCHEDULER_EVENT        500
+#define GETF__OLSR_PARSER_ADD_FUNCTION             501
+#define GETF__OLSR_REGISTER_TIMEOUT_FUNCTION       502
+#define GETF__GET_MSG_SEQNO                        503
+#define GETF__OLSR_CHECK_DUP_TABLE_PROC            504
+#define GETF__NET_OUTPUT                           505
+#define GETF__OLSR_FORWARD_MESSAGE                 506
+#define GETF__ADD_OLSR_SOCKET                     &