only write the 3 nearest (best ETX) nameservers to /etc/resolv.conf. updated README
authorBruno Randolf <br1@einfach.org>
Wed, 20 Apr 2005 17:57:00 +0000 (17:57 +0000)
committerBruno Randolf <br1@einfach.org>
Wed, 20 Apr 2005 17:57:00 +0000 (17:57 +0000)
lib/nameservice/README
lib/nameservice/src/nameservice.c
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 9c30a4a..45dcfff 100644 (file)
@@ -5,11 +5,19 @@ 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.
+this plugin distributes host name (DNS) information over OLSR. every 
+node which runs the olsr daemon can announce it's own name, names for
+other IP adresses it is associated with (HNAs) and if it is running
+a "real" nameserver which can resolve other (internet) names (upstream 
+dns server).
+
+the nodes in the network collect this information and write the host 
+names to a file (possibly /etc/hosts), and the 3 nearest upstream 
+nameservers to another file (possibly /etc/resolv.conf).
+
+these files 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 the ordinary DNS protocol to other clients as well.
 
 the default location of the hosts file is
 "/var/run/hosts_olsr" on unixes
@@ -21,60 +29,45 @@ PLUGIN PARAMETERS (PlParam)
 ---------------------------------------------------------------------
 
 PlParam "name" "my-name.mesh"
-
        the name of this OLSR node (main address).
        can be specified multiple times for different names.
 
-
 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 "hosts-file" "/path/to/hosts_file"
-
        which file to write to (usually /etc/hosts).
        (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 in seconds.
-       (default: 3600 - 1 hour)
-
-
 PlParam "suffix" ".olsr"
-
        local suffix which is appended to all received names.
        (default: "")
-       
 
 PlParam "add-hosts" "/path/to/file"
-
        copy contents of this additional hosts file to output file.
        this is practical if you alreay use your /etc/hosts file.
 
-
 PlParam "dns-server" "IP.ADDR"
        anounce that this IP has a full (upstream) DNS server. if 
        IP.ADDR is not specified (""), the main address is used.
        nodes which don't know a nameserver will automatically use
        this nameserver.
 
-
 PlParam "resolv-file" "/path/to/resolv.conf"
        path to resolv.conf file (usually /etc/resolv.conf)
-       if set, an the upstream nameserver annonced by another node
-       in the network is written to this file
+       if set, the 3 nearest (best ETX) upstream nameservers annonced 
+       by other nodes in the network are written to this file
+
+PlParam "interval" "SEC"
+       interval for sending NAME messages in seconds.
+       (default: 120 - 2 minutes)
+
+PlParam "timeout" "SEC"
+       validity time for received NAME messages in seconds.
+       (default: 3600 - 1 hour)
 
 
 ---------------------------------------------------------------------
@@ -85,7 +78,7 @@ add in /etc/olsrd.conf:
 
 LoadPlugin "olsrd_nameservice.so.0.2"
 {
-       PlParam "name" "thisismyname.mesh"
+       PlParam "name" "thisismyname"
        PlParam "hosts-file" "/etc/hosts"
        PlParam "resolv-file" "/etc/resolv.conf"
 }
@@ -102,31 +95,31 @@ UNIX VARIANTS:
 
 * overwrite /etc/hosts
        be sure you have nothing in /etc/hosts which you still need and
-       configure the plugin with PlParam "filename" "/etc/hosts"
-       
-* link /etc/hosts (only on unix variants)
+       configure the plugin with PlParam "host-file" "/etc/hosts"
+
+* link /etc/hosts
        ln -s /var/run/hosts_olsr /etc/hosts
-       
+
 * use dnsmasq
        if you want to make the names available via ordinary DNS
        you can use dnsmasq to read the hosts file and serve it to
-       users. add the following to dnsmasq.conf and restart dnsmasq
-       addn-hosts=/var/run/hosts_olsr
-       
+       users. add "addn-hosts=/var/run/hosts_olsr" to dnsmasq.conf 
+       and restart dnsmasq
+
 WINDOWS:
 
 * overwrite C:\WINDOWS\system32\drivers\etc\hosts
        be sure you have nothing in the file which you still need 
        and configure the plugin with
        PlParam "filename" "C:\WINDOWS\system32\drivers\etc\hosts"
-       
+
 
 ---------------------------------------------------------------------
 TODO
 ---------------------------------------------------------------------
   
- * implement a small DNS server into the plugin?
- * or make dynamic DNS updates for bind?
 * implement a small DNS server into the plugin?
 * or make dynamic DNS updates for bind?
 
 ---------------------------------------------------------------------
-EOF / 17.03.2005
+EOF / 20.04.2005
index 9b10148..27c6981 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
 
-/* $Id: nameservice.c,v 1.10 2005/03/17 21:41:30 br1 Exp $ */
+/* $Id: nameservice.c,v 1.11 2005/04/20 17:57:00 br1 Exp $ */
 
 /*
  * Dynamic linked library for UniK OLSRd
@@ -42,6 +42,7 @@
 #include "nameservice.h"
 #include "olsrd_copy.h"
 
+#include "routing_table.h"
 
 /* send buffer: huge */
 static char buffer[10240];
@@ -677,7 +678,10 @@ write_resolv_file()
        int hash;
        struct name_entry *name;
        struct db_entry *entry;
+       struct rt_entry *best_routes = NULL;
+       struct rt_entry *route, *tmp, *last;
        FILE* resolv;
+       int i=0;
        
        if (my_resolv_file[0] == '\0')
                return;
@@ -686,12 +690,6 @@ write_resolv_file()
                return;
 
        olsr_printf(2, "NAME PLUGIN: writing resolv file\n");
-                     
-       resolv = fopen( my_resolv_file, "w" );
-       if (resolv == NULL) {
-               olsr_printf(2, "NAME PLUGIN: cant write resolv file\n");
-               return;
-       }
 
        for (hash = 0; hash < HASHSIZE; hash++) 
        {
@@ -699,13 +697,70 @@ write_resolv_file()
                {
                        for (name = entry->names; name != NULL; name = name->next) 
                        {
-                               if (name->type == NAME_FORWARDER) {
-                                       //TODO: find the nearest one!!!
-                                       fprintf(resolv, "nameserver %s\n", olsr_ip_to_string(&name->ip));
+                               if (name->type != NAME_FORWARDER)
+                                       continue;
+                               
+                               /* find the nearest one */
+                               route = olsr_lookup_routing_table(&name->ip);
+                               if (route==NULL) // it's possible that route is not present yet
+                                       continue;
+                               
+                               if (best_routes == NULL || route->rt_etx < best_routes->rt_etx) {
+                                       olsr_printf(6, "NAME PLUGIN: best nameserver %s\n",
+                                               olsr_ip_to_string(&route->rt_dst));
+                                       if (best_routes!=NULL)
+                                               olsr_printf(6, "NAME PLUGIN: better than %f (%s)\n",
+                                                       best_routes->rt_etx,
+                                                       olsr_ip_to_string(&best_routes->rt_dst));
+                                       
+                                       tmp = olsr_malloc(sizeof(struct rt_entry), "new rt_entry");
+                                       memcpy(&tmp->rt_dst, &route->rt_dst, ipsize);
+                                       tmp->rt_etx = route->rt_etx;
+                                       tmp->next = best_routes;
+                                       best_routes = tmp;
+                               } else {
+                                       // queue in etx order
+                                       last = best_routes;
+                                       while ( last->next!=NULL && i<3 ) {
+                                               if (last->next->rt_etx > route->rt_etx)
+                                                       break;
+                                               last = last->next;
+                                               i++;
+                                       }
+                                       if (i<3) {
+                                               olsr_printf(6, "NAME PLUGIN: queue %f (%s)",
+                                                       route->rt_etx,
+                                                       olsr_ip_to_string(&route->rt_dst));
+                                               olsr_printf(6, " after %f (%s)\n", 
+                                                       last->rt_etx, olsr_ip_to_string(&last->rt_dst));
+                                               
+                                               tmp = olsr_malloc(sizeof(struct rt_entry), "new rt_entry");
+                                               memcpy(&tmp->rt_dst, &route->rt_dst, ipsize);
+                                               tmp->rt_etx = route->rt_etx;
+                                               tmp->next = last->next;
+                                               last->next = tmp;
+                                       } else {
+                                               olsr_printf(6, "NAME PLUGIN: don't need more than 3 nameservers\n");
+                                       }
                                }
                        }
                }
        }
+       if (best_routes==NULL)
+               return;
+                
+       /* write to file */
+       resolv = fopen( my_resolv_file, "w" );
+       if (resolv == NULL) {
+               olsr_printf(2, "NAME PLUGIN: can't write resolv file\n");
+               return;
+       }
+       i=0;
+       for (tmp=best_routes; tmp!=NULL && i<3; tmp=tmp->next) {
+               olsr_printf(6, "NAME PLUGIN: nameserver %s\n", olsr_ip_to_string(&tmp->rt_dst));
+               fprintf(resolv, "nameserver %s\n", olsr_ip_to_string(&tmp->rt_dst));
+               i++;
+       }
        fclose(resolv);
 }
 
index 64a59c4..d4e16ee 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
  
-/* $Id: olsrd_copy.c,v 1.2 2005/03/01 21:35:14 tlopatic Exp $ */
+/* $Id: olsrd_copy.c,v 1.3 2005/04/20 17:57:00 br1 Exp $ */
  
 /*
  * Dynamic linked library for UniK OLSRd
@@ -42,7 +42,9 @@
 // these functions are copied from the main olsrd source
 // TODO: there must be a better way!!!
 
+#include <string.h>
 #include "olsrd_plugin.h"
+#include "olsrd_copy.h"
 
 /**
  *Hashing function. Creates a key based on
@@ -171,3 +173,33 @@ olsr_ip_to_string(union olsr_ip_addr *addr)
 
   return ret;
 }
+
+
+/**
+ *Look up an entry in the routing table.
+ *
+ *@param dst the address of the entry
+ *
+ *@return a pointer to a rt_entry struct 
+ *representing the route entry.
+ */
+struct rt_entry *
+olsr_lookup_routing_table(union olsr_ip_addr *dst)
+{
+
+  struct rt_entry *rt_table;
+  olsr_u32_t      hash;
+
+  hash = olsr_hashing(dst);
+
+  for(rt_table = routingtable[hash].next;
+      rt_table != &routingtable[hash];
+      rt_table = rt_table->next)
+    {
+      if (COMP_IP(&rt_table->rt_dst, dst))
+       {
+         return(rt_table);
+       }
+    }
+  return(NULL); 
+}
index fdf08cf..235b24c 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
 
-/* $Id: olsrd_copy.h,v 1.3 2005/03/17 21:41:30 br1 Exp $ */
+/* $Id: olsrd_copy.h,v 1.4 2005/04/20 17:57:00 br1 Exp $ */
  
 /*
  * Dynamic linked library for UniK OLSRd
@@ -51,4 +51,7 @@ void olsr_get_timestamp(olsr_u32_t delay, struct timeval *hold_timer);
 
 char * olsr_ip_to_string(union olsr_ip_addr *addr);
 
+struct rt_entry *
+olsr_lookup_routing_table(union olsr_ip_addr *dst);
+
 #endif
index efa7d99..da6e52d 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
 
-/* $Id: olsrd_plugin.c,v 1.8 2005/03/02 22:59:55 tlopatic Exp $ */
+/* $Id: olsrd_plugin.c,v 1.9 2005/04/20 17:57:00 br1 Exp $ */
 
 /*
  * Dynamic linked library for UniK OLSRd
@@ -259,8 +259,6 @@ fetch_olsrd_data()
     retval = 0;
   }
 
-
-
   /* Mantissa/exponent to double conversion */
   if(!olsr_plugin_io(GETF__ME_TO_DOUBLE, 
                     &me_to_double, 
@@ -270,7 +268,6 @@ fetch_olsrd_data()
     retval = 0;
   }
 
-
   /* Interface list */
   if(!olsr_plugin_io(GETD__IFNET, &ifs, sizeof(ifs)))
   {
@@ -329,13 +326,15 @@ fetch_olsrd_data()
   }
 
   /* Configuration */
-  if(!olsr_plugin_io(GETD__OLSR_CNF, 
-                    &cfg, 
-                    sizeof(cfg)))
-    {
+  if(!olsr_plugin_io(GETD__OLSR_CNF, &cfg, sizeof(cfg))) {
       cfg = NULL;
       retval = 0;
-    }
-    
+  }
+  
+  if(!olsr_plugin_io(GETD__ROUTINGTABLE, &routingtable, sizeof(routingtable))) {
+    routingtable = NULL;
+    retval = 0;
+  }
+  
   return retval;
 }
index 0fd01bb..61f59fa 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
 
-/* $Id: olsrd_plugin.h,v 1.6 2005/04/10 11:45:35 kattemat Exp $ */
+/* $Id: olsrd_plugin.h,v 1.7 2005/04/20 17:57:00 br1 Exp $ */
 
 /*
  * Dynamic linked library for UniK OLSRd
@@ -52,6 +52,7 @@
 #include "olsr_cfg.h"
 #include "hashing.h"
 #include "interfaces.h"
+#include "routing_table.h"
 
 char *
 strndup(const char *ptr, size_t size);
@@ -65,6 +66,7 @@ strndup(const char *ptr, size_t size);
 
 /* Global config pointer */
 struct olsrd_config *cfg;
+struct rt_entry *routingtable;
 
 /****************************************************************************
  *           Various datastructures and definitions from olsrd              *