Added nameservice plugin
authorAndreas Tonnesen <andreto@olsr.org>
Sun, 16 Jan 2005 13:06:11 +0000 (13:06 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Sun, 16 Jan 2005 13:06:11 +0000 (13:06 +0000)
lib/nameservice/Makefile [new file with mode: 0644]
lib/nameservice/README [new file with mode: 0644]
lib/nameservice/src/nameservice.c [new file with mode: 0644]
lib/nameservice/src/nameservice.h [new file with mode: 0644]
lib/nameservice/src/nameservice_msg.h [new file with mode: 0644]
lib/nameservice/src/olsr_plugin_io.h [new file with mode: 0644]
lib/nameservice/src/olsrd_copy.c [new file with mode: 0644]
lib/nameservice/src/olsrd_copy.h [new file with mode: 0644]
lib/nameservice/src/olsrd_plugin.c [new file with mode: 0644]
lib/nameservice/src/olsrd_plugin.h [new file with mode: 0644]
lib/nameservice/version-script.txt [new file with mode: 0644]

diff --git a/lib/nameservice/Makefile b/lib/nameservice/Makefile
new file mode 100644 (file)
index 0000000..bf8bde5
--- /dev/null
@@ -0,0 +1,30 @@
+CC ?= gcc
+STRIP ?= strip
+NAME = olsrd_nameservice.so.0.1
+LIBDIR ?= $(INSTALL_PREFIX)/usr/lib
+MYFLAGS = -Wall -fPIC -D_GNU_SOURCE
+LIBS ?= -lc -lm
+CFLAGS ?= -O2
+CFLAGS += $(MYFLAGS)
+
+SRCS = $(wildcard src/*.c)
+OBJS = $(patsubst %.c,%.o,$(SRCS))
+HDRS = $(wildcard src/*.c)
+
+all: plugin
+
+plugin: $(OBJS)
+       $(CC) $(LDFLAGS) $(MYFLAGS) -shared -Wl,-soname,$(NAME) \
+       -Wl,--version-script=version-script.txt \
+       -o $(NAME) $(OBJS) $(LIBS)
+
+install:
+       $(STRIP) $(NAME)
+       install -D -m 755 $(NAME) $(LIBDIR)/$(NAME)
+       /sbin/ldconfig -n $(LIBDIR)
+
+clean:
+       rm -f $(OBJS) $(NAME)
+
+src/olsrd_plugin.o: $(HDRS)
+src/nameservice.o: $(HDRS)
diff --git a/lib/nameservice/README b/lib/nameservice/README
new file mode 100644 (file)
index 0000000..e18b945
--- /dev/null
@@ -0,0 +1,33 @@
+NAMESERVICE PLUGIN FOR OLSRD
+by Bruno Randolf <bruno.randolf@4g-systems.biz>
+
+a simple DNS replacement for OLSR networks
+
+this plugin distributes host name information over OLSR
+and writes a file in /etc/hosts format. this file can be 
+used to resolve hostnames on the local system and/or be
+read by a DNS server like "dnsmasq", to make the names 
+available via ordinary DNS to other clients as well.
+
+the default location of the hosts file is
+/var/run/hosts_olsr 
+
+PLUGIN PARAMETERS
+
+"name"         the name of the OLSR node
+
+"filename"     which file to write to 
+               (default: /var/run/hosts_olsr)
+
+
+SAMPLE CONFIG
+
+activate in /etc/olsrd.conf:
+
+LoadPlugin "olsrd_nameservice.so.0.1"
+{
+       PlParam "name" "thisismyname.mesh"
+       # optional:
+        #PlParam "filename" "/etc/hosts_olsr"
+}
+               
diff --git a/lib/nameservice/src/nameservice.c b/lib/nameservice/src/nameservice.c
new file mode 100644 (file)
index 0000000..fc2928b
--- /dev/null
@@ -0,0 +1,387 @@
+/*
+ * Copyright (c) 2005, Bruno Randolf <bruno.randolf@4g-systems.biz>
+ * 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.
+ *
+ */
+
+/* $Id: nameservice.c,v 1.1 2005/01/16 13:06:00 kattemat Exp $ */
+
+/*
+ * Dynamic linked library for UniK OLSRd
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "nameservice.h"
+#include "olsrd_copy.h"
+
+
+/* The database - (using hashing) */
+struct name_entry list[HASHSIZE];
+
+/* send buffer: size of IPv6 message + the maximum size of the name */
+static char buffer[sizeof(struct olsrmsg6) + MAX_NAME];
+
+olsr_u8_t name_table_changed=0;
+
+char* my_name = "";
+olsr_u8_t my_name_len = 0;
+char* my_filename = "/var/run/hosts_olsr";
+
+
+/**
+ * Do initialization
+ */
+int
+olsr_plugin_init()
+{
+       int i;
+       /* Init list */
+       for(i = 0; i < HASHSIZE; i++)
+       {
+               list[i].next = &list[i];
+               list[i].prev = &list[i];
+       }
+       
+       /* Register functions with olsrd */
+       olsr_parser_add_function(&olsr_parser, PARSER_TYPE, 1);
+       olsr_register_timeout_function(&olsr_timeout);
+       olsr_register_scheduler_event(&olsr_event, NULL, EMISSION_INTERVAL, 0, NULL);
+
+       return 1;
+}
+
+
+/**
+ * Called at unload
+ */
+void
+olsr_plugin_exit()
+{
+       int i;
+       struct name_entry *tmp_list;
+       struct name_entry *entry_to_delete;
+       
+       /* free list entries */
+       for(i = 0; i < HASHSIZE; i++)
+       {
+               tmp_list = list[i].next;
+               while(tmp_list != &list[i])
+               {
+                       entry_to_delete = tmp_list;
+                       tmp_list = tmp_list->next;
+                       entry_to_delete->prev->next = entry_to_delete->next;
+                       entry_to_delete->next->prev = entry_to_delete->prev;
+                       free(entry_to_delete->name);
+                       free(entry_to_delete);
+               }
+       }
+}
+
+
+/**
+ * A timeout function called every time
+ * the scheduler is polled: time out old list entries
+ */
+void
+olsr_timeout()
+{
+       struct name_entry *tmp_list;
+       struct name_entry *entry_to_delete;
+       int index;
+
+       for(index=0;index<HASHSIZE;index++)
+       {
+               tmp_list = list[index].next;
+               while(tmp_list != &list[index])
+               {
+                       /*Check if the entry is timed out*/
+                       if(olsr_timed_out(&tmp_list->timer))
+                       {
+                               entry_to_delete = tmp_list;
+                               tmp_list = tmp_list->next;
+                               olsr_printf(2, "NAME PLUGIN: %s timed out.. deleting\n", 
+                                       olsr_ip_to_string(&entry_to_delete->originator));
+                               /* Dequeue */
+                               entry_to_delete->prev->next = entry_to_delete->next;
+                               entry_to_delete->next->prev = entry_to_delete->prev;
+
+                               /* Delete */
+                               free(entry_to_delete->name);
+                               free(entry_to_delete);
+                               
+                               name_table_changed = 1;
+                       }
+                       else
+                               tmp_list = tmp_list->next;
+               }
+       }
+       return;
+}
+
+
+/**
+ * Scheduled event: generate and send NAME packet
+ */
+void
+olsr_event(void *foo)
+{
+       union olsr_message *message = (union olsr_message*)buffer;
+       struct interface *ifn;
+       int namesize;
+  
+       olsr_printf(3, "NAME PLUGIN: Generating packet - ");
+
+       /* looping trough interfaces */
+       for (ifn = ifs; ifn ; ifn = ifn->int_next) 
+       {
+               olsr_printf(3, "[%s]  ", ifn->int_name);
+               /* Fill message */
+               if(ipversion == AF_INET)
+               {
+                       /* IPv4 */
+                       message->v4.olsr_msgtype = MESSAGE_TYPE;
+                       message->v4.olsr_vtime = double_to_me(NAME_VALID_TIME);
+                       memcpy(&message->v4.originator, main_addr, ipsize);
+                       message->v4.ttl = MAX_TTL;
+                       message->v4.hopcnt = 0;
+                       message->v4.seqno = htons(get_msg_seqno());
+               
+                       namesize = get_namemsg(&message->v4.msg);
+                       namesize = namesize + sizeof(struct olsrmsg);
+               
+                       message->v4.olsr_msgsize = htons(namesize);
+               }
+               else
+               {
+                       /* IPv6 */
+                       message->v6.olsr_msgtype = MESSAGE_TYPE;
+                       message->v6.olsr_vtime = double_to_me(NAME_VALID_TIME);
+                       memcpy(&message->v6.originator, main_addr, ipsize);
+                       message->v6.ttl = MAX_TTL;
+                       message->v6.hopcnt = 0;
+                       message->v6.seqno = htons(get_msg_seqno());
+         
+                       namesize = get_namemsg(&message->v6.msg);
+                       namesize = namesize + sizeof(struct olsrmsg6);
+         
+                       message->v6.olsr_msgsize = htons(namesize);
+               }
+       
+               if(net_outbuffer_push(ifn, (olsr_u8_t *)message, namesize) != namesize ) {
+                       /* Send data and try again */
+                       net_output(ifn);
+                       if(net_outbuffer_push(ifn, (olsr_u8_t *)message, namesize) != namesize ) {
+                               olsr_printf(1, "NAME PLUGIN: could not send on interface: %s\n", ifn->int_name);
+                       }
+               }
+       }
+       olsr_printf(3, "\n");
+       write_name_table();
+       return;
+}
+
+
+/**
+ * Parse name olsr message of NAME type
+ */
+void
+olsr_parser(union olsr_message *m, struct interface *in_if, union olsr_ip_addr *in_addr)
+{
+       struct  namemsg *message;
+       union olsr_ip_addr originator;
+       double vtime;
+
+       /* Fetch the originator of the messsage */
+       memcpy(&originator, &m->v4.originator, ipsize);
+               
+       /* Fetch the message based on IP version */
+       if(ipversion == AF_INET) {
+               message = &m->v4.msg;
+               vtime = me_to_double(m->v4.olsr_vtime);
+       }
+       else {
+               message = &m->v6.msg;
+               vtime = me_to_double(m->v6.olsr_vtime);
+       }
+
+       /* Check if message originated from this node. 
+       If so - back off */
+       if(memcmp(&originator, main_addr, ipsize) == 0)
+               return;
+
+       /* Check that the neighbor this message was received from is symmetric. 
+       If not - back off*/
+       if(check_neighbor_link(in_addr) != SYM_LINK) {
+               olsr_printf(3, "NAME PLUGIN: Received msg from NON SYM neighbor %s\n", olsr_ip_to_string(in_addr));
+               return;
+       }
+
+       /* Check if this message has been processed before
+       * Remeber that this also registeres the message as
+       * processed if nessecary
+       */
+       if(!check_dup_proc(&originator, ntohs(m->v4.seqno))) {
+               /* If so - do not process */
+               goto forward;
+       }
+
+       /* Process */
+       olsr_printf(3, "NAME PLUGIN: Processing NAME info from %s seqno: %d\n",
+               olsr_ip_to_string(&originator),
+               ntohs(m->v4.seqno));
+
+       update_name_entry(&originator, message, vtime);
+
+
+forward:
+       /* Forward the message if nessecary
+       * default_fwd does all the work for us! */
+       default_fwd(m, &originator, ntohs(m->v4.seqno), in_if, in_addr);
+}
+
+
+/**
+ * Get a name message. This fills the namemsg struct
+ * AND appends the name after that! 
+ *
+ * It assumed that there is enough space in the buffer to do this!
+ *
+ * Returns: the length of the name that was appended
+ */
+int
+get_namemsg(struct namemsg *msg)
+{
+       msg->name_len = my_name_len;
+       char* txt = (char*)(msg + sizeof(struct namemsg));
+       strncpy(txt, my_name, MAX_NAME); 
+       return my_name_len;
+}
+
+
+/**
+ * Read a name message and update name_entry if necessary
+ *
+ * Return: 1 if entry was changed
+ */
+int
+read_namemsg(struct namemsg *msg, struct name_entry *to)
+{
+       char* txt = (char*)(msg + sizeof(struct namemsg));
+       if (to->name == NULL || strncmp(to->name, txt, MAX_NAME) != 0) {
+               if (to->name != NULL) {
+                       free( to->name );
+               }
+               to->name = olsr_malloc(msg->name_len, "new name_entry name");
+               strncpy(to->name, txt, msg->name_len);
+               return 1;
+       }
+       return 0;       
+}
+
+
+/**
+ * Update or register a new name entry
+ */
+int
+update_name_entry(union olsr_ip_addr *originator, struct namemsg *message, double vtime)
+{
+       int hash;
+       struct name_entry *entry;
+       
+       hash = olsr_hashing(originator);
+       
+       /* Check for the entry */
+       for(entry = list[hash].next; entry != &list[hash]; entry = entry->next)
+       {
+               if(memcmp(originator, &entry->originator, ipsize) == 0) {
+                       if (read_namemsg( message, entry )) {
+                               name_table_changed = 1;
+                       }
+                       olsr_get_timestamp(vtime * 1000, &entry->timer);
+                       return 0;
+               }
+       }
+
+       entry = olsr_malloc(sizeof(struct name_entry), "new name_entry");
+       entry->name = NULL;
+       memcpy(&entry->originator, originator, ipsize);
+       olsr_get_timestamp(vtime * 1000, &entry->timer);
+       
+       read_namemsg( message, entry );
+
+       olsr_printf(2, "NAME PLUGIN: New entry %s: %s\n", olsr_ip_to_string(originator), entry->name);
+               
+       /* Queue */
+       entry->next = list[hash].next->prev;
+       entry->prev = &list[hash];
+       list[hash].next->prev = entry;
+       list[hash].next = entry;
+
+       name_table_changed = 1;
+       return 1;
+}
+
+
+/**
+ * write names to a file in /etc/hosts compatible format
+ */
+void
+write_name_table()
+{
+       int hash;
+       struct name_entry *entry;
+       char buf[MAX_NAME+17];
+       FILE* hosts;
+
+       olsr_printf(2, "NAME PLUGIN: writing hosts file\n");
+       
+       if(!name_table_changed)
+               return;
+             
+       hosts = fopen( my_filename, "w" );
+       
+       fprintf(hosts, "# this /etc/hosts file is overwritten regularly by olsrd\n");
+       fprintf(hosts, "# do not edit\n");
+       // add own IP and name
+       fprintf(hosts, "%s\t%s\n", olsr_ip_to_string(main_addr), my_name );
+
+       for(hash = 0; hash < HASHSIZE; hash++) 
+       {
+               for(entry = list[hash].next; entry != &list[hash]; entry = entry->next) 
+               {
+                       sprintf(buf, "%s\t%s\n", olsr_ip_to_string(&entry->originator), entry->name);
+                       fprintf(hosts, "%s", buf);
+               }
+       }
+       
+       fclose(hosts);
+       name_table_changed = 0;
+}
diff --git a/lib/nameservice/src/nameservice.h b/lib/nameservice/src/nameservice.h
new file mode 100644 (file)
index 0000000..3cadb79
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2005, Bruno Randolf <bruno.randolf@4g-systems.biz>
+ * 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.
+ *
+ */
+
+/* $Id: nameservice.h,v 1.1 2005/01/16 13:06:00 kattemat Exp $ */
+/*
+ * Dynamic linked library for UniK OLSRd
+ */
+
+#ifndef _NAMESERVICE_PLUGIN
+#define _NAMESERVICE_PLUGIN
+
+#include "olsrd_plugin.h"
+
+
+#define PLUGIN_NAME    "OLSRD nameservice plugin"
+#define PLUGIN_VERSION "0.1"
+#define PLUGIN_AUTHOR  "Bruno Randolf"
+
+
+#define MESSAGE_TYPE           129
+#define PARSER_TYPE            MESSAGE_TYPE
+#define EMISSION_INTERVAL      30
+#define NAME_VALID_TIME                90.0
+
+#define MAX_NAME 255
+char* my_name;
+olsr_u8_t my_name_len;
+
+#define MAX_FILE 255
+char* my_filename;
+
+
+/* Database entry */
+struct name_entry
+{
+  union olsr_ip_addr originator;  /* IP address of the node this entry describes */
+  struct timeval     timer;       /* Validity time */
+  char* name;
+  struct name_entry    *next;       /* Next element in line */
+  struct name_entry    *prev;       /* Previous elemnt in line */
+};
+
+
+/* Timeout function to register with the sceduler */
+void
+olsr_timeout(void);
+
+/* Parser function to register with the sceduler */
+void
+olsr_parser(union olsr_message *, struct interface *, union olsr_ip_addr *);
+
+/* Event function to register with the sceduler */
+void
+olsr_event(void *);
+
+int
+get_namemsg(struct namemsg *);
+
+int
+read_namemsg(struct namemsg *, struct name_entry *);
+
+int
+update_name_entry(union olsr_ip_addr *, struct namemsg *, double);
+
+void
+write_name_table(void);
+
+#endif
diff --git a/lib/nameservice/src/nameservice_msg.h b/lib/nameservice/src/nameservice_msg.h
new file mode 100644 (file)
index 0000000..dd5f057
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef _NAMESEVICE_MSG
+#define _NAMESEVICE_MSG
+
+struct namemsg
+{
+  olsr_u8_t name_len;          // length of the following name filed
+};
+
+/*
+ * 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;
+
+  /* YOUR PACKET GOES HERE */
+  struct namemsg msg;
+};
+
+/*
+ *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;
+
+  /* YOUR PACKET GOES HERE */
+  struct namemsg msg;
+
+};
+
+#endif
diff --git a/lib/nameservice/src/olsr_plugin_io.h b/lib/nameservice/src/olsr_plugin_io.h
new file mode 100644 (file)
index 0000000..139d85d
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas Tønnesen(andreto@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 olsr.org, olsrd nor the names of its 
+ *   contributors may be used to endorse or promote products derived 
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ * $Id: olsr_plugin_io.h,v 1.1 2005/01/16 13:06:00 kattemat Exp $
+ */
+
+
+/*
+ * 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
+ *         0.4.8 : GETF__APM_READ added
+ *                 GETD__OLSR_CNF added
+ *                 GETD_PACKET removed
+ *                 GETD_MAXMESSAGESIZE removed
+ *                 GETD_OUTPUTSIZE removed
+ *                 GETF__NET_OUTBUFFER_PUSH added
+ *                 GETD__ROUTINGTABLE added
+ *                 GETD__HNA_ROUTES added
+ *                 GETD__MID_SET added
+ *                 GETF__NET_RESERVE_BUFSPACE added 
+ *                 GETF__NET_OUTBUFFER_PUSH_RESERVED added
+ *                 - 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 (used to anyway) */
+#define GETD__IFNET                                102
+#define GETD__NOW                                  103
+#define GETD__PARSER_ENTRIES                       104
+#define GETD__OLSR_SOCKET_ENTRIES                  105
+#define GETD__NEIGHBORTABLE                        108
+#define GETD__TWO_HOP_NEIGHBORTABLE                109
+#define GETD__TC_TABLE                             110
+#define GETD__HNA_SET                              111
+#define GETD__OLSR_CNF                             112
+#define GETD__ROUTINGTABLE                         113
+#define GETD__HNA_ROUTES                           114
+#define GETD__MID_SET                              115
+
+/* 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
+#define GETF__APM_READ                             531
+#define GETF__NET_OUTBUFFER_PUSH                   532
+#define GETF__NET_RESERVE_BUFSPACE                 533
+#define GETF__NET_OUTBUFFER_PUSH_RESERVED          534
+
+#endif
diff --git a/lib/nameservice/src/olsrd_copy.c b/lib/nameservice/src/olsrd_copy.c
new file mode 100644 (file)
index 0000000..783e33f
--- /dev/null
@@ -0,0 +1,136 @@
+/*************************************************************
+ *                 TOOLS COPIED FROM OLSRD                   *
+ *************************************************************/
+
+// these functions are copied from the main olsrd source
+// TODO: there must be a better way!!!
+
+#include "olsrd_plugin.h"
+
+/**
+ *Hashing function. Creates a key based on
+ *an 32-bit address.
+ *@param address the address to hash
+ *@return the hash(a value in the 0-31 range)
+ */
+olsr_u32_t
+olsr_hashing(union olsr_ip_addr *address)
+{
+  olsr_u32_t hash;
+  char *tmp;
+
+  if(ipversion == AF_INET)
+    /* IPv4 */  
+    hash = (ntohl(address->v4));
+  else
+    {
+      /* IPv6 */
+      tmp = (char *) &address->v6;
+      hash = (ntohl(*tmp));
+    }
+
+  //hash &= 0x7fffffff; 
+  hash &= HASHMASK;
+
+  return hash;
+}
+
+
+
+/**
+ *Checks if a timer has times out. That means
+ *if it is smaller than present time.
+ *@param timer the timeval struct to evaluate
+ *@return positive if the timer has not timed out,
+ *0 if it matches with present time and negative
+ *if it is timed out.
+ */
+int
+olsr_timed_out(struct timeval *timer)
+{
+  return(timercmp(timer, now, <));
+}
+
+
+
+/**
+ *Initiates a "timer", wich is a timeval structure,
+ *with the value given in time_value.
+ *@param time_value the value to initialize the timer with
+ *@param hold_timer the timer itself
+ *@return nada
+ */
+void
+olsr_init_timer(olsr_u32_t time_value, struct timeval *hold_timer)
+{ 
+  olsr_u16_t  time_value_sec;
+  olsr_u16_t  time_value_msec;
+
+  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;   
+}
+
+
+
+
+
+/**
+ *Generaties a timestamp a certain number of milliseconds
+ *into the future.
+ *
+ *@param time_value how many milliseconds from now
+ *@param hold_timer the timer itself
+ *@return nada
+ */
+void
+olsr_get_timestamp(olsr_u32_t delay, struct timeval *hold_timer)
+{ 
+  olsr_u16_t  time_value_sec;
+  olsr_u16_t  time_value_msec;
+
+  time_value_sec = delay/1000;
+  time_value_msec= delay - (delay*1000);
+
+  hold_timer->tv_sec = now->tv_sec + time_value_sec;
+  hold_timer->tv_usec = now->tv_usec + (time_value_msec*1000);   
+}
+
+
+/**
+ *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;
+}
diff --git a/lib/nameservice/src/olsrd_copy.h b/lib/nameservice/src/olsrd_copy.h
new file mode 100644 (file)
index 0000000..ec3f7fa
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef _OLSRD_COPY
+#define _OLSRD_COPY
+
+// these functions are copied from the main olsrd source
+// TODO: there must be a better way!!!
+
+olsr_u32_t olsr_hashing(union olsr_ip_addr *address);
+
+int olsr_timed_out(struct timeval *timer);
+
+void olsr_init_timer(olsr_u32_t time_value, struct timeval *hold_timer);
+
+void olsr_get_timestamp(olsr_u32_t delay, struct timeval *hold_timer);
+
+char * olsr_ip_to_string(union olsr_ip_addr *addr);
+
+#endif
diff --git a/lib/nameservice/src/olsrd_plugin.c b/lib/nameservice/src/olsrd_plugin.c
new file mode 100644 (file)
index 0000000..3bdebbf
--- /dev/null
@@ -0,0 +1,335 @@
+/*
+ * Copyright (c) 2005, Bruno Randolf <bruno.randolf@4g-systems.biz>
+ * 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.
+ *
+ */
+
+/* $Id: olsrd_plugin.c,v 1.1 2005/01/16 13:06:00 kattemat Exp $ */
+
+
+/*
+ * Dynamic linked library example for UniK OLSRd
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "olsrd_plugin.h"
+#include "nameservice.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(void);
+
+/*
+ * Returns the version of the plugin interface that is used
+ * THIS IS NOT THE VERSION OF YOUR PLUGIN!
+ */
+int 
+get_plugin_interface_version()
+{
+  return PLUGIN_INTERFACE_VERSION;
+}
+
+/**
+ *Constructor
+ */
+void
+my_init()
+{
+  /* Print plugin info to stdout */
+  printf("%s\n", MOD_DESC);
+
+  ifs = NULL;
+
+  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;
+}
+
+/* Mulitpurpose funtion */
+int
+plugin_io(int cmd, void *data, size_t size)
+{
+
+  switch(cmd)
+    {
+    default:
+      return 0;
+    }
+  
+  return 1;
+}
+
+int
+register_olsr_param(char *key, char *value)
+{
+       if(!strcmp(key, "name")) {
+               my_name = strndup( value, MAX_NAME );
+               my_name_len = strlen( my_name );
+               printf("(NAME) name: %s\n", my_name);
+       }       
+       
+       if(!strcmp(key, "filename")) {
+               my_filename = strndup( value, MAX_FILE );
+               printf("(NAME) filename: %s\n", my_filename);
+       }
+       
+       return 1;
+}
+
+
+/**
+ *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;
+    }
+
+  return 1;
+}
+
+
+
+int
+fetch_olsrd_data()
+{
+  int retval = 1;
+
+
+  /* Packet buffer */
+  if(!olsr_plugin_io(GETF__NET_OUTBUFFER_PUSH, &net_outbuffer_push, sizeof(net_outbuffer_push)))
+  {
+    net_outbuffer_push = 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;
+  }
+
+  /* Parser registration */
+  if(!olsr_plugin_io(GETF__OLSR_PARSER_ADD_FUNCTION, 
+                    &olsr_parser_add_function, 
+                    sizeof(olsr_parser_add_function)))
+  {
+    olsr_parser_add_function = NULL;
+    retval = 0;
+  }
+
+  /* Scheduler timeout registration */
+  if(!olsr_plugin_io(GETF__OLSR_REGISTER_TIMEOUT_FUNCTION, 
+                    &olsr_register_timeout_function, 
+                    sizeof(olsr_register_timeout_function)))
+  {
+    olsr_register_timeout_function = NULL;
+    retval = 0;
+  }
+
+  /* Scheduler event registration */
+  if(!olsr_plugin_io(GETF__OLSR_REGISTER_SCHEDULER_EVENT, 
+                    &olsr_register_scheduler_event, 
+                    sizeof(olsr_register_scheduler_event)))
+  {
+    olsr_register_scheduler_event = NULL;
+    retval = 0;
+  }
+
+  /* Double to mantissa/exponent */
+  if(!olsr_plugin_io(GETF__DOUBLE_TO_ME, 
+                    &double_to_me, 
+                    sizeof(double_to_me)))
+  {
+    double_to_me = NULL;
+    retval = 0;
+  }
+
+
+
+  /* Mantissa/exponent to double conversion */
+  if(!olsr_plugin_io(GETF__ME_TO_DOUBLE, 
+                    &me_to_double, 
+                    sizeof(me_to_double)))
+  {
+    me_to_double = NULL;
+    retval = 0;
+  }
+
+
+  /* Interface list */
+  if(!olsr_plugin_io(GETD__IFNET, &ifs, sizeof(ifs)))
+  {
+    ifs = NULL;
+    retval = 0;
+  }
+
+  /* Messageseqno fetch function */
+  if(!olsr_plugin_io(GETF__GET_MSG_SEQNO, &get_msg_seqno, sizeof(get_msg_seqno)))
+  {
+    get_msg_seqno = NULL;
+    retval = 0;
+  }
+
+  /* Scheduler maintained timestamp */
+  if(!olsr_plugin_io(GETD__NOW, &now, sizeof(now)))
+  {
+    now = NULL;
+    retval = 0;
+  }
+
+  /* Output function */
+  if(!olsr_plugin_io(GETF__NET_OUTPUT, &net_output, sizeof(net_output)))
+  {
+    net_output = NULL;
+    retval = 0;
+  }
+
+  /* Duplicate check (for processing) */
+  if(!olsr_plugin_io(GETF__OLSR_CHECK_DUP_TABLE_PROC, &check_dup_proc, sizeof(check_dup_proc)))
+  {
+    check_dup_proc = NULL;
+    retval = 0;
+  }
+
+  /* Default forward function */
+  if(!olsr_plugin_io(GETF__OLSR_FORWARD_MESSAGE, &default_fwd, sizeof(default_fwd)))
+  {
+    default_fwd = 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;
+  }
+
+  /* Neighbor link status lookup */
+  if(!olsr_plugin_io(GETF__CHECK_NEIGHBOR_LINK, &check_neighbor_link, sizeof(check_neighbor_link)))
+  {
+    check_neighbor_link = NULL;
+    retval = 0;
+  }
+
+  return retval;
+}
diff --git a/lib/nameservice/src/olsrd_plugin.h b/lib/nameservice/src/olsrd_plugin.h
new file mode 100644 (file)
index 0000000..22d5930
--- /dev/null
@@ -0,0 +1,307 @@
+/*
+ * Copyright (c) 2005, Bruno Randolf <bruno.randolf@4g-systems.biz>
+ * 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.
+ *
+ */
+
+/* $Id: olsrd_plugin.h,v 1.1 2005/01/16 13:06:00 kattemat Exp $ */
+
+/*
+ * 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
+
+
+/****************************************************************************
+ *           Various datastructures and definitions from olsrd              *
+ ****************************************************************************/
+
+/*
+ * TYPES SECTION
+ */
+
+/* types */
+#include <sys/types.h>
+
+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;
+
+
+
+/*
+ * VARIOUS DEFINITIONS
+ */
+
+union olsr_ip_addr
+{
+  olsr_u32_t v4;
+  struct in6_addr 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
+
+
+
+/*
+ * Hashing
+ */
+
+#define        HASHSIZE        32
+#define        HASHMASK        (HASHSIZE - 1)
+
+#define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
+
+
+/****************************************************************************
+ *                          INTERFACE SECTION                               *
+ ****************************************************************************/
+struct vtimes
+{
+  olsr_u8_t hello;
+  olsr_u8_t tc;
+  olsr_u8_t mid;
+  olsr_u8_t hna;
+};
+
+/**
+ *A struct containing all necessary information about each
+ *interface participating in the OLSD routing
+ */
+struct interface 
+{
+  /* IP version 4 */
+  struct       sockaddr int_addr;              /* address */
+  struct       sockaddr int_netmask;           /* netmask */
+  struct       sockaddr int_broadaddr;         /* broadcast address */
+  /* IP version 6 */
+  struct        sockaddr_in6 int6_addr;         /* Address */
+  struct        sockaddr_in6 int6_multaddr;     /* Multicast */
+  /* IP independent */
+  union         olsr_ip_addr ip_addr;
+  int           olsr_socket;                    /* The broadcast socket for this interface */
+  int          int_metric;                     /* metric of interface */
+  int           int_mtu;                        /* MTU of interface */
+  int          int_flags;                      /* see below */
+  char         *int_name;                      /* from kernel if structure */
+  int           if_index;                       /* Kernels index of this interface */
+  int           if_nr;                          /* This interfaces index internally*/
+  int           is_wireless;                    /* wireless interface or not*/
+  olsr_u16_t    olsr_seqnum;                    /* Olsr message seqno */
+
+  float         hello_etime;
+  struct        vtimes valtimes;
+
+  struct       interface *int_next;
+};
+
+
+/****************************************************************************
+ *                            PACKET SECTION                                *
+ ****************************************************************************/
+
+ /**********************************
+ * DEFINE YOUR CUSTOM PACKET HERE *
+ **********************************/
+#include "nameservice_msg.h"
+
+/* 
+ * ALWAYS USE THESE WRAPPERS TO
+ * ENSURE IPv4 <-> IPv6 compability 
+ */
+
+union olsr_message
+{
+  struct olsrmsg v4;
+  struct olsrmsg6 v6;
+};
+
+
+
+
+/***************************************************************************
+ *                 Functions provided by uolsrd_plugin.c                   *
+ *                  Similar to their siblings in olsrd                     *
+ ***************************************************************************/
+
+char ipv6_buf[100]; /* buffer for IPv6 inet_htop */
+
+/* All these could optionally be fetched from olsrd */
+
+olsr_u32_t
+olsr_hashing(union olsr_ip_addr *);
+
+void
+olsr_get_timestamp(olsr_u32_t, struct timeval *);
+
+void
+olsr_init_timer(olsr_u32_t, struct timeval *);
+
+int
+olsr_timed_out(struct timeval *);
+
+char *
+olsr_ip_to_string(union olsr_ip_addr *);
+
+
+
+/****************************************************************************
+ *                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);
+
+/* add a prser function */
+void (*olsr_parser_add_function)(void (*)(union olsr_message *, struct interface *, union olsr_ip_addr *), int, int);
+
+/* Register a timeout function */
+int (*olsr_register_timeout_function)(void (*)(void));
+
+/* Register a scheduled event */
+int (*olsr_register_scheduler_event)(void (*)(void *), void *, float, float, olsr_u8_t *);
+
+/* Get the next message seqno in line */
+olsr_u16_t (*get_msg_seqno)(void);
+
+int (*net_outbuffer_push)(struct interface *, olsr_u8_t *, olsr_u16_t);
+
+/* Transmit package */
+int (*net_output)(struct interface*);
+
+/* Check the duplicate table for prior processing */
+int (*check_dup_proc)(union olsr_ip_addr *, olsr_u16_t);
+
+/* Default forward algorithm */
+int (*default_fwd)(union olsr_message *, 
+                  union olsr_ip_addr *, 
+                  olsr_u16_t,  
+                  struct interface *, 
+                  union olsr_ip_addr *);
+
+/* Add a socket to the main olsrd select loop */
+void (*add_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 *);
+
+
+/****************************************************************************
+ *                             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!!!                  *
+ ****************************************************************************/
+/**
+ * The interface list from olsrd
+ */
+
+struct interface   *ifs;
+
+/* 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 */
+
+
+/****************************************************************************
+ *                Functions that the plugin MUST provide                    *
+ ****************************************************************************/
+
+
+/* Initialization function */
+int
+olsr_plugin_init(void);
+
+/* Destructor function */
+void
+olsr_plugin_exit(void);
+
+/* Mulitpurpose funtion */
+int
+plugin_io(int, void *, size_t);
+
+/* Plugin interface version */
+int 
+get_plugin_interface_version(void);
+
+
+/*****************************************************************************
+ *                               Plugin data                                 *
+ *****************************************************************************/
+
+#define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
+#define PLUGIN_INTERFACE_VERSION 2
+
+#endif
diff --git a/lib/nameservice/version-script.txt b/lib/nameservice/version-script.txt
new file mode 100644 (file)
index 0000000..81f3f8e
--- /dev/null
@@ -0,0 +1,11 @@
+VERS_1.0
+{
+  global:
+    get_plugin_interface_version;
+    register_olsr_data;
+    plugin_io;
+    register_olsr_param;
+
+  local:
+    *;
+};