Merged Windows changes into Bruno's new version.
authorThomas Lopatic <thomas@lopatic.de>
Tue, 1 Mar 2005 21:35:14 +0000 (21:35 +0000)
committerThomas Lopatic <thomas@lopatic.de>
Tue, 1 Mar 2005 21:35:14 +0000 (21:35 +0000)
lib/nameservice/Makefile
lib/nameservice/README
lib/nameservice/src/nameservice.c
lib/nameservice/src/nameservice.h
lib/nameservice/src/nameservice_msg.h
lib/nameservice/src/olsrd_copy.c
lib/nameservice/src/olsrd_copy.h
lib/nameservice/src/olsrd_plugin.c
lib/nameservice/src/olsrd_plugin.h

index 785f701..0576875 100644 (file)
 # to the project. For more information see the website or contact
 # the copyright holders.
 #
-# $Id: Makefile,v 1.7 2005/03/01 20:25:22 tlopatic Exp $
+# $Id: Makefile,v 1.8 2005/03/01 21:35:13 tlopatic Exp $
 
 PLUGIN_NAME =  olsrd_nameservice
-PLUGIN_VER =   0.1
+PLUGIN_VER =   0.2
 
 CC ?=          gcc
 STRIP ?=       strip
index e18b945..58cb1ba 100644 (file)
@@ -1,5 +1,7 @@
+---------------------------------------------------------------------
 NAMESERVICE PLUGIN FOR OLSRD
 by Bruno Randolf <bruno.randolf@4g-systems.biz>
+---------------------------------------------------------------------
 
 a simple DNS replacement for OLSR networks
 
@@ -12,22 +14,56 @@ 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
+---------------------------------------------------------------------
+PLUGIN PARAMETERS (PlParam)
+---------------------------------------------------------------------
 
-"filename"     which file to write to 
-               (default: /var/run/hosts_olsr)
+PlParam "name" "my-name.mesh"
 
+       the name of this OLSR node (main address).
+       can be specified multiple times
 
+PlParam "IP.ADDR" "another-name.mesh"
+
+       a name for a specified IP address.
+       the IP address has to be either from one of the olsr 
+       interfaces or within a HNA network we announce.
+       can be specified multiple times
+
+PlParam "filename" "/name/of/hosts_file"
+
+       which file to write to.
+       (default: /var/run/hosts_olsr)
+
+PlParam "interval" "SEC"
+
+       interval for sending NAME messages in seconds.
+       (default: 120 - 2 minutes)
+               
+PlParam "timeout" "SEC"
+
+       validity time for received NAME messages.
+       (default: 3600 - 1 hour)
+
+
+---------------------------------------------------------------------
 SAMPLE CONFIG
+---------------------------------------------------------------------
 
-activate in /etc/olsrd.conf:
+add in /etc/olsrd.conf:
 
-LoadPlugin "olsrd_nameservice.so.0.1"
+LoadPlugin "olsrd_nameservice.so.0.2"
 {
        PlParam "name" "thisismyname.mesh"
-       # optional:
-        #PlParam "filename" "/etc/hosts_olsr"
 }
-               
+
+
+---------------------------------------------------------------------
+TODO
+---------------------------------------------------------------------
+  
+ * implement a small DNS server into the plugin?
+
+---------------------------------------------------------------------
+EOF / 01.03.2005
\ No newline at end of file
index 23a6eb9..9c6c10f 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
 
-/* $Id: nameservice.c,v 1.3 2005/03/01 20:16:56 tlopatic Exp $ */
+/* $Id: nameservice.c,v 1.4 2005/03/01 21:35:14 tlopatic Exp $ */
 
 /*
  * Dynamic linked library for UniK OLSRd
 #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;
+/* config parameters */
 static char my_filename_buff[MAX_FILE + 1];
 char* my_filename = my_filename_buff;
+int my_interval = EMISSION_INTERVAL;
+double my_timeout = NAME_VALID_TIME;
+
+/* the database (using hashing) */
+struct db_entry* list[HASHSIZE];
+struct name_entry *my_names = NULL;
+olsr_bool name_table_changed = OLSR_TRUE;
+
+
+void 
+free_name_entry_list(struct name_entry **list) 
+{
+       struct name_entry **tmp = list;
+       struct name_entry *to_delete;
+       while (*tmp != NULL) {
+               to_delete = *tmp;
+               *tmp = (*tmp)->next;
+               free( to_delete->name );
+               free( to_delete );
+               to_delete = NULL;
+       }
+}
+
+
+olsr_bool
+allowed_ip(union olsr_ip_addr *addr)
+{
+       // we only allow names for IP addresses which announce
+       // so the IP must either be from one of the interfaces
+       // or inside a HNA which we have configured
+       
+       struct hna4_entry *hna4;
+       struct olsr_if *ifs;
+       
+       olsr_printf(6, "checking %s\n", olsr_ip_to_string(addr));
+       
+       for(ifs = cfg->interfaces; ifs; ifs = ifs->next)
+       {
+               struct interface *rifs = ifs->interf;
+               olsr_printf(6, "interface %s\n", olsr_ip_to_string(&rifs->ip_addr));
+               if (COMP_IP(&rifs->ip_addr, addr)) {
+                       olsr_printf(6, "MATCHED\n");
+                       return OLSR_TRUE;
+                       
+               }
+       }
+       
+       for (hna4 = cfg->hna4_entries; hna4; hna4 = hna4->next)
+       {
+               olsr_printf(6, "HNA %s/%s\n", 
+                       olsr_ip_to_string(&hna4->net),
+                       olsr_ip_to_string(&hna4->netmask));
+               
+               if ( hna4->netmask.v4 != 0 && (addr->v4 & hna4->netmask.v4) == hna4->net.v4 ) {
+                       olsr_printf(6, "MATCHED\n");
+                       return OLSR_TRUE;
+               }
+       }
+       return OLSR_FALSE;
+}
 
 
 /**
@@ -66,33 +120,50 @@ olsr_plugin_init()
        int i;
 #ifdef WIN32
        int len;
-#endif
 
-       /* 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);
-
-#ifdef WIN32
        GetWindowsDirectory(my_filename_buff, MAX_FILE - 12);
 
        len = strlen(my_filename_buff);
-
        if (my_filename_buff[len - 1] != '\\')
-               my_filename_buff[len++] = '\\';
-
+               my_filename_buff[len++] = '\\';
        strcpy(my_filename_buff + len, "olsrd.hosts");
 #else
        strcpy(my_filename_buff, "/var/run/hosts_olsr");
 #endif
 
+       /* Init list */
+       for(i = 0; i < HASHSIZE; i++) {
+               list[i] = NULL;
+       }
+       
+       /* fix received parameters */
+       // we have to do this here because some things like main_addr 
+       // are not known before
+       struct name_entry *name;
+       for (name = my_names; name != NULL; name = name->next) {
+               if (name->ip.v4 == 0) {
+                       // insert main_addr
+                       memcpy(&name->ip, main_addr, ipsize);
+               } else {
+                       // IP from config file
+                       // check if we are allowed to announce a name for this IP
+                       // we can only do this if we also announce the IP
+                        
+                       if (!allowed_ip(&name->ip)) {
+                               olsr_printf(1, "NAME PLUGIN: name for unknown IP %s not allowed, fix your config!\n", 
+                                       olsr_ip_to_string(&name->ip));
+                                       exit(-1);
+                       }       
+               }
+       }
+       
+       /* 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, my_interval, 0, NULL);
+
        return 1;
 }
 
@@ -104,23 +175,82 @@ void
 olsr_plugin_exit()
 {
        int i;
-       struct name_entry *tmp_list;
-       struct name_entry *entry_to_delete;
+       struct db_entry **tmp;
+       struct db_entry *to_delete;
+       
+       olsr_printf(2, "NAME PLUGIN: exit. cleaning up...\n");
+       
+       free_name_entry_list(&my_names);
        
        /* free list entries */
        for(i = 0; i < HASHSIZE; i++)
        {
-               tmp_list = list[i].next;
-               while(tmp_list != &list[i])
+               tmp = &list[i];
+               while(*tmp != NULL)
                {
-                       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);
+                       to_delete = *tmp;
+                       *tmp = (*tmp)->next;
+                       free_name_entry_list(&to_delete->names);
+                       free(to_delete);
+                       to_delete = NULL;
+               }
+       }
+}
+
+
+/**
+ * Called for all plugin parameters
+ */
+int
+register_olsr_param(char *key, char *value)
+{
+       if(!strcmp(key, "name")) {
+               // name for main address
+               struct name_entry *tmp;
+               tmp = malloc(sizeof(struct name_entry));
+               tmp->name = strndup( value, MAX_NAME );
+               tmp->len = strlen( tmp->name );
+               tmp->type = NAME_HOST;
+               // will be set to main_addr later
+               memset(&tmp->ip, 0, sizeof(tmp->ip));
+               tmp->next = my_names;
+               my_names = tmp;
+               
+               printf("\nNAME PLUGIN parameter name: %s (%s)\n", tmp->name, olsr_ip_to_string(&tmp->ip));
+       } 
+       else if(!strcmp(key, "filename")) {
+               my_filename = strndup( value, MAX_FILE );
+               printf("\nNAME PLUGIN parameter filename: %s\n", my_filename);
+       }
+       else if(!strcmp(key, "interval")) {
+               my_interval = atoi(value);
+               printf("\n(NAME PLUGIN parameter interval: %d\n", my_interval);
+       }
+       else if(!strcmp(key, "timeout")) {
+               my_timeout = atof(value);
+               printf("\nNAME PLUGIN parameter timeout: %f\n", my_timeout);
+       }
+       else {
+               // assume this is an IP address and hostname
+               // the IPs are validated later
+               struct name_entry *tmp;
+               tmp = malloc(sizeof(struct name_entry));
+               tmp->name = strndup( value, MAX_NAME );
+               tmp->len = strlen( tmp->name );
+               tmp->type = 0xbb;
+               struct in_addr ip;
+               if (!inet_aton(key, &ip)) {
+                       printf("\nNAME PLUGIN invalid IP %s, fix your config!\n", key);
+                       exit(-1);
                }
+               tmp->ip.v4 = ip.s_addr;
+               tmp->next = my_names;
+               my_names = tmp;
+               
+               printf("\nNAME PLUGIN parameter: %s (%s)\n", tmp->name, olsr_ip_to_string(&tmp->ip));
        }
+               
+       return 1;
 }
 
 
@@ -131,37 +261,33 @@ olsr_plugin_exit()
 void
 olsr_timeout()
 {
-       struct name_entry *tmp_list;
-       struct name_entry *entry_to_delete;
+       struct db_entry **tmp;
+       struct db_entry *to_delete;
        int index;
 
        for(index=0;index<HASHSIZE;index++)
        {
-               tmp_list = list[index].next;
-               while(tmp_list != &list[index])
+               for (tmp = &list[index]; *tmp != NULL; )
                {
-                       /*Check if the entry is timed out*/
-                       if(olsr_timed_out(&tmp_list->timer))
+                       /* check if the entry is timed out */
+                       if (olsr_timed_out(&(*tmp)->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);
+                               to_delete = *tmp;
+                               *tmp = (*tmp)->next;
                                
-                               name_table_changed = 1;
+                               olsr_printf(2, "NAME PLUGIN: %s timed out... deleting\n", 
+                                       olsr_ip_to_string(&to_delete->originator));
+       
+                               /* Delete */
+                               free_name_entry_list(&to_delete->names);
+                               free(to_delete);
+                               name_table_changed = OLSR_TRUE;
+                       } else {
+                               tmp = &(*tmp)->next;
                        }
-                       else
-                               tmp_list = tmp_list->next;
                }
        }
-       return;
+       write_name_table();
 }
 
 
@@ -180,19 +306,19 @@ olsr_event(void *foo)
        /* looping trough interfaces */
        for (ifn = ifs; ifn ; ifn = ifn->int_next) 
        {
-               olsr_printf(3, "[%s]  ", ifn->int_name);
-               /* Fill message */
+               olsr_printf(3, "[%s]\n", 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);
+                       message->v4.olsr_vtime = double_to_me(my_timeout);
                        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 = encap_namemsg(&message->v4.msg);
                        namesize = namesize + sizeof(struct olsrmsg);
                
                        message->v4.olsr_msgsize = htons(namesize);
@@ -201,33 +327,26 @@ olsr_event(void *foo)
                {
                        /* IPv6 */
                        message->v6.olsr_msgtype = MESSAGE_TYPE;
-                       message->v6.olsr_vtime = double_to_me(NAME_VALID_TIME);
+                       message->v6.olsr_vtime = double_to_me(my_timeout);
                        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 = encap_namemsg(&message->v6.msg);
                        namesize = namesize + sizeof(struct olsrmsg6);
          
                        message->v6.olsr_msgsize = htons(namesize);
                }
        
-               if (net_outbuffer_push(ifn, buffer, namesize) != namesize)
-               {
-                       /* Send data and try again */
+               if(net_outbuffer_push(ifn, (olsr_u8_t *)message, namesize) != namesize ) {
+                       /* send data and try again */
                        net_output(ifn);
-                       if (net_outbuffer_push(ifn, buffer, namesize) !=
-                               namesize)
-                       {
+                       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();
 }
 
 
@@ -275,14 +394,8 @@ olsr_parser(union olsr_message *m, struct interface *in_if, union olsr_ip_addr *
                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! */
@@ -290,70 +403,97 @@ forward:
 }
 
 
+#define roundup(x, y)  ((((x)+((y)-1))/(y))*(y))  /* to any y */
+#define padding(x,r)   (r)-(x)%(r);
+
 /**
- * Get a name message. This fills the namemsg struct
- * AND appends the name after that! 
+ * Encapsulate a name message into a packet. 
  *
  * It assumed that there is enough space in the buffer to do this!
  *
- * Returns: the length of the name that was appended
+ * Returns: the length of the message that was appended
  */
 int
-get_namemsg(struct namemsg *msg)
+encap_namemsg(struct namemsg* msg)
 {
-       int i;
-       char *txt;
-
-       msg->name_len = my_name_len;
-
-       msg->pad[0] = 0;
-       msg->pad[1] = 0;
-       msg->pad[2] = 0;
-
-       // msg + 1 == &msg[1]
-
-       txt = (char *)(msg + 1);
-
-       memcpy(txt, my_name, my_name_len); 
-
-       for (i = my_name_len; (i & 3) != 0; i++)
-               txt[i] = 0;
-
-       return i;
+       struct name_entry *my_name = my_names;
+       struct name* to_packet;
+       char* pos = (char*)msg + sizeof(struct namemsg);
+       short i=0;
+       while (my_name!=NULL) 
+       {
+               olsr_printf(3, "NAME PLUGIN: Announcing name %s (%s)\n", 
+                       my_name->name, olsr_ip_to_string(&my_name->ip));
+                       
+               to_packet = (struct name*)pos;
+               to_packet->type = htons(my_name->type);
+               to_packet->len = htons(my_name->len);
+               memcpy(&to_packet->ip, &my_name->ip, ipsize);
+               pos += sizeof(struct name);
+               strncpy(pos, my_name->name, my_name->len);
+               pos += my_name->len;
+               // padding to 4 byte boundaries
+               long pad = (long)pos + roundup(my_name->len, 4) - my_name->len;
+               while ((long)pos < pad) {
+                       *pos = '\0';
+                       pos++;
+               }
+               my_name = my_name->next;
+               i++;
+       }
+       msg->nr_names = htons(i);
+       msg->version = htons(NAME_PROTOCOL_VERSION);
+       return pos - (char*)msg; //length
 }
 
 
 /**
- * Read a name message and update name_entry if necessary
- *
- * Return: 1 if entry was changed
+ * decapsulate a name message and update name_entries if necessary
  */
-int
-read_namemsg(struct namemsg *msg, struct name_entry *to)
+void
+decap_namemsg( struct namemsg *msg, struct name_entry **to )
 {
-       char *txt;
-
-       // msg + 1 == &msg[1]
-
-       txt = (char*)(msg + 1);
-
-       if (to->name == NULL || 
-               strlen(to->name) != msg->name_len ||
-               memcmp(to->name, txt, msg->name_len) != 0)
-       {
-               if (to->name != NULL)
-                       free(to->name);
-
-               to->name = olsr_malloc(msg->name_len + 1,
-                       "new name_entry name");
-
-               memcpy(to->name, txt, msg->name_len);
-               to->name[msg->name_len] = '\0';
-
-               return 1;
+       char *pos;
+       struct name_entry *tmp;
+       struct name *from_packet; 
+       
+       olsr_printf(4, "NAME PLUGIN: decapsulating name msg\n");
+       
+       if (ntohs(msg->version) != NAME_PROTOCOL_VERSION) {
+               olsr_printf(3, "NAME PLUGIN: ignoring wrong version %d\n", msg->version);
+               return;
+       }
+       
+       // for now ist easier to just delete everything, than
+       // to update selectively
+       free_name_entry_list(to);
+       
+       /* now add the names from the message */
+       pos = (char*)msg + sizeof(struct namemsg);
+       int i;
+       for (i=ntohs(msg->nr_names); i >= 0; i--) {     
+               tmp = olsr_malloc(sizeof(struct name_entry), "new name_entry");
+               
+               from_packet = (struct name*)pos;
+               from_packet->type = ntohs(from_packet->type);
+               from_packet->len = ntohs(from_packet->len);
+               tmp->type = from_packet->type;
+               memcpy(&tmp->ip, &from_packet->ip, ipsize);
+               
+               tmp->name = olsr_malloc(from_packet->len+1, "new name_entry name");
+               strncpy(tmp->name, (char*)from_packet+sizeof(struct name), from_packet->len);
+               tmp->name[from_packet->len] = '\0';
+
+               olsr_printf(3, "NAME PLUGIN: New name %s (%s) %d\n", 
+                       tmp->name, olsr_ip_to_string(&tmp->ip), from_packet->len);
+                       
+               // queue to front
+               tmp->next = *to;
+               *to = tmp;
+
+               // next name from packet
+               pos += sizeof(struct name) + roundup(from_packet->len,4);
        }
-
-       return 0;       
 }
 
 
@@ -361,46 +501,48 @@ read_namemsg(struct namemsg *msg, struct name_entry *to)
  * Update or register a new name entry
  */
 void
-update_name_entry(union olsr_ip_addr *originator, struct namemsg *message, double vtime)
+update_name_entry(union olsr_ip_addr *originator, struct namemsg *msg, double vtime)
 {
        int hash;
-       struct name_entry *entry;
-       
-       hash = olsr_hashing(originator);
-       
-       // entry lookup
+       struct db_entry *entry;
 
-       for (entry = list[hash].next; entry != &list[hash]; entry = entry->next)
-               if (memcmp(originator, &entry->originator, ipsize) == 0)
-                       break;
+       olsr_printf(3, "NAME PLUGIN: Received Name Message from %s\n", 
+               olsr_ip_to_string(originator));
 
-       // no entry found
+       hash = olsr_hashing(originator);
 
-       if (entry == &list[hash])
+       /* find the entry for originator */
+       for (entry = list[hash]; entry != NULL; entry = entry->next)
        {
-               entry = olsr_malloc(sizeof(struct name_entry), "new name_entry");
-               entry->name = NULL;
-               memcpy(&entry->originator, originator, ipsize);
-
-               entry->next = list[hash].next->prev;
-               entry->prev = &list[hash];
-
-               list[hash].next->prev = entry;
-               list[hash].next = entry;
+               if (memcmp(originator, &entry->originator, ipsize) == 0) {
+                       // found
+                       olsr_printf(4, "NAME PLUGIN: %s found\n", 
+                               olsr_ip_to_string(originator));
+               
+                       decap_namemsg(msg, &entry->names);
+                       
+                       olsr_get_timestamp(vtime * 1000, &entry->timer);
+                       
+                       name_table_changed = OLSR_TRUE;
+                       return;
+               }
        }
 
-       // update entry's timestamp
-
+       olsr_printf(3, "NAME PLUGIN: New entry %s\n", 
+               olsr_ip_to_string(originator));
+               
+       /* insert a new entry */
+       entry = olsr_malloc(sizeof(struct db_entry), "new db_entry");
+       memcpy(&entry->originator, originator, ipsize);
        olsr_get_timestamp(vtime * 1000, &entry->timer);
+       entry->names = NULL;
+       // queue to front
+       entry->next = list[hash];
+       list[hash] = entry;
+       
+       decap_namemsg(msg, &entry->names);
 
-       // insert name into entry
-
-       if (read_namemsg(message, entry))
-       {
-               name_table_changed = 1;
-
-               olsr_printf(2, "NAME PLUGIN: Changed entry %s: %s\n", olsr_ip_to_string(originator), entry->name);
-       }
+       name_table_changed = OLSR_TRUE;
 }
 
 
@@ -411,31 +553,41 @@ void
 write_name_table()
 {
        int hash;
-       struct name_entry *entry;
+       struct name_entry *name;
+       struct db_entry *entry;
        FILE* hosts;
 
        if(!name_table_changed)
                return;
-             
-       olsr_printf(2, "NAME PLUGIN: writing hosts file %s\n", my_filename);
-       
-       hosts = fopen( my_filename, "w" );
 
-       if (hosts == NULL)
-               return;
+       olsr_printf(2, "NAME PLUGIN: writing hosts file\n");
+                     
+       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 );
-
+       
+       // write own names
+       for (name = my_names; name != NULL; name = name->next) {
+               fprintf(hosts, "%s\t%s\t# myself\n", olsr_ip_to_string(&name->ip), name->name );
+       }
+       
+       // write received names
        for(hash = 0; hash < HASHSIZE; hash++) 
        {
-               for(entry = list[hash].next; entry != &list[hash]; entry = entry->next) 
-                       fprintf(hosts, "%s\t%s\n", olsr_ip_to_string(&entry->originator), entry->name);
+               for(entry = list[hash]; entry != NULL; entry = entry->next)
+               {
+                       for (name = entry->names; name != NULL; name = name->next) 
+                       {
+                               olsr_printf(6, "%s\t%s", olsr_ip_to_string(&name->ip), name->name);
+                               olsr_printf(6, "\t#%s\n", olsr_ip_to_string(&entry->originator));
+                               
+                               fprintf(hosts, "%s\t%s", olsr_ip_to_string(&name->ip), name->name);
+                               fprintf(hosts, "\t# %s\n", olsr_ip_to_string(&entry->originator));
+                       }
+               }
        }
        
        fclose(hosts);
-
-       name_table_changed = 0;
+       name_table_changed = OLSR_FALSE;
 }
index 6b9f93e..dd438b7 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
 
-/* $Id: nameservice.h,v 1.2 2005/03/01 20:16:56 tlopatic Exp $ */
+/* $Id: nameservice.h,v 1.3 2005/03/01 21:35:14 tlopatic Exp $ */
  
 /*
  * Dynamic linked library for UniK OLSRd
 
 
 #define PLUGIN_NAME    "OLSRD nameservice plugin"
-#define PLUGIN_VERSION "0.1"
+#define PLUGIN_VERSION "0.2"
 #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 EMISSION_INTERVAL      120 /* two minutes */
+#define NAME_VALID_TIME                3600 /* one hour */
 
-#define MAX_NAME 255
-char* my_name;
-olsr_u8_t my_name_len;
+#define NAME_PROTOCOL_VERSION  1
 
+#define MAX_NAME 255
 #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 */
+       union olsr_ip_addr      ip;
+       olsr_u16_t              type;
+       char                    *name;
+       int                     len;
+       struct name_entry       *next;          /* linked list */
+};
+
+/* database entry */
+struct db_entry
+{
+       union olsr_ip_addr      originator;     /* IP address of the node this entry describes */
+       struct timeval          timer;          /* Validity time */
+       struct name_entry       *names;         /* list of names this originator declares */
+       struct db_entry         *next;          /* linked list */
 };
 
 
@@ -83,10 +90,10 @@ void
 olsr_event(void *);
 
 int
-get_namemsg(struct namemsg *);
+encap_namemsg(struct namemsg *);
 
-int
-read_namemsg(struct namemsg *, struct name_entry *);
+void
+decap_namemsg(struct namemsg *, struct name_entry**);
 
 void
 update_name_entry(union olsr_ip_addr *, struct namemsg *, double);
@@ -94,4 +101,13 @@ update_name_entry(union olsr_ip_addr *, struct namemsg *, double);
 void
 write_name_table(void);
 
+int
+register_olsr_param(char *key, char *value);
+
+void 
+free_name_entry_list(struct name_entry **list);
+
+olsr_bool
+allowed_ip(union olsr_ip_addr *addr);
+
 #endif
index 48624e9..a2cf609 100644 (file)
@@ -1,12 +1,71 @@
+/*
+ * 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_msg.h,v 1.3 2005/03/01 21:35:14 tlopatic Exp $ */
+
+/*
+ * Dynamic linked library for UniK OLSRd
+ */
 #ifndef _NAMESEVICE_MSG
 #define _NAMESEVICE_MSG
 
+
+typedef enum {
+       NAME_HOST = 0,
+       NAME_HNA = 1
+} NAME_TYPE;
+
+
+struct name
+{
+       olsr_u16_t              type;
+       olsr_u16_t              len;    // length of the name
+       union olsr_ip_addr      ip;
+       /*
+        * name is written in plain text after this struct and padded to 4 byte
+        */
+};
+
+
 struct namemsg
 {
-  olsr_u8_t name_len;          // length of the following name filed
-  olsr_u8_t pad[3];             // added by the compiler anyway
+       olsr_u16_t version;
+       olsr_u16_t nr_names;   // number of following name messages
+       /*
+        * at least one struct name following
+        */
 };
 
+
 /*
  * OLSR message (several can exist in one OLSR packet)
  */
index 783e33f..64a59c4 100644 (file)
@@ -1,3 +1,40 @@
+/*
+ * 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_copy.c,v 1.2 2005/03/01 21:35:14 tlopatic Exp $ */
+/*
+ * Dynamic linked library for UniK OLSRd
+ */
 /*************************************************************
  *                 TOOLS COPIED FROM OLSRD                   *
  *************************************************************/
index ec3f7fa..3896bd7 100644 (file)
@@ -1,9 +1,48 @@
+/*
+ * 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_copy.h,v 1.2 2005/03/01 21:35:14 tlopatic Exp $ */
+/*
+ * Dynamic linked library for UniK OLSRd
+ */
+
 #ifndef _OLSRD_COPY
 #define _OLSRD_COPY
 
 // these functions are copied from the main olsrd source
 // TODO: there must be a better way!!!
 
+#define COMP_IP(ip1, ip2) (!memcmp(ip1, ip2, ipsize))
+
 olsr_u32_t olsr_hashing(union olsr_ip_addr *address);
 
 int olsr_timed_out(struct timeval *timer);
index 1e4a804..5055a19 100644 (file)
  *
  */
 
-/* $Id: olsrd_plugin.c,v 1.6 2005/03/01 20:16:56 tlopatic Exp $ */
-
+/* $Id: olsrd_plugin.c,v 1.7 2005/03/01 21:35:14 tlopatic Exp $ */
 
 /*
- * Dynamic linked library example for UniK OLSRd
+ * Dynamic linked library for UniK OLSRd
  */
 
 #include <stdio.h>
 #include "nameservice.h"
 #include "plugin_loader.h"
 
-int
-register_olsr_param(char *, char *);
-
 #ifndef linux
 
-#include <stdlib.h>
-
-char *strndup(const char *ptr, size_t size);
-
 /* strndup() is a GNU extention */
 char *
 strndup(const char *ptr, size_t size)
@@ -70,7 +62,7 @@ strndup(const char *ptr, size_t size)
   if(!ret)
     return NULL;
 
-  memcpy(ret, ptr, len);
+  strncpy(ret, ptr, len);
   ret[len] = '\0';
 
   return ret;
@@ -146,23 +138,6 @@ plugin_io(int cmd, void *data, size_t size)
   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
@@ -351,5 +326,14 @@ fetch_olsrd_data()
     retval = 0;
   }
 
+  /* Configuration */
+  if(!olsr_plugin_io(GETD__OLSR_CNF, 
+                    &cfg, 
+                    sizeof(cfg)))
+    {
+      cfg = NULL;
+      retval = 0;
+    }
+    
   return retval;
 }
index 823d5ab..bc4bc56 100644 (file)
  *
  */
 
-/* $Id: olsrd_plugin.h,v 1.3 2005/02/21 19:47:29 kattemat Exp $ */
+/* $Id: olsrd_plugin.h,v 1.4 2005/03/01 21:35:14 tlopatic Exp $ */
 
 /*
- * Dynamic linked library example for UniK OLSRd
+ * Dynamic linked library for UniK OLSRd
  */
 
 #ifndef _OLSRD_PLUGIN_DEFS
 
 #include "olsr_plugin_io.h"
 #include "olsr_types.h"
+#include "olsr_cfg.h"
 #include "hashing.h"
 #include "interfaces.h"
 
+char *
+strndup(const char *ptr, size_t size);
+
+#ifndef linux
+#include <stdlib.h>
+#endif
+
 /* Use this as PARSER_TYPE to receive ALL messages! */
 #define PROMISCUOUS 0xffffffff
 
+/* Global config pointer */
+struct olsrd_config *cfg;
 
 /****************************************************************************
  *           Various datastructures and definitions from olsrd              *
@@ -227,7 +237,7 @@ get_plugin_interface_version(void);
  *                               Plugin data                                 *
  *****************************************************************************/
 
-#define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
+#define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION
 #define PLUGIN_INTERFACE_VERSION 2
 
 #endif