Major Changes:
authorBernd Petrovitsch <bernd@firmix.at>
Thu, 29 Nov 2007 00:49:42 +0000 (00:49 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Thu, 29 Nov 2007 00:49:42 +0000 (00:49 +0000)
- renamed "struct local_hna_entry" to "struct ip_prefix_list" since
  it is exactly that. Renamed the functions in src/local_hna_set.{c,h}
  in the same way.
- each IPv4 and IPv6 function pairs in src/local_hna_set.{c,h} is
  called from the same place and have the same signature. So I
  condensed each of them.
- Since we have only 3 functions left in src/local_hna_set.{c,h}
  and they are used for the configuration, the .h file is now part
  of src/olsr_cfg.h and the ,c file of src/cfgparser/olsrd_conf.c.
- replaced "struct ipc_net" with "struct ip_prefix_list" since it
  serves the same purpose as the "struct ip_prefix_list"
- replaced "struct ipc_host" with "struct ip_prefix_list" since it
  serves the same purpose as the "struct ip_prefix_list" and is
  just a special case. No need to duplicate code etc.
- removed "union hna_netmask" from src/olsr_types since we use the
  prefix_len everywhere (and that is an olsr_u8_t in several other
  struct's).
  That implies changes and simplifications in the code handling
  them (since the IPv4 is similar to IPv6).
- the config file parser now understands for IPv4 addresses also
  "/$prefix".
- On the output side, the patch generates only "/$prefix" which
  kills code since it is the same as the IPv6 handling.
- There are some netmask conversions left (mainly in the plugins)
  but that be cleaned up afterwards.
- extracted ip{,4,6}{cmp,equal} and formatting functions from
  net_olsr.{c,h} into src/ipcalc.{c,h} since net_olsr.h became
  IMHO to much of a "put anything in there".
- renamed "sockaddr_to_string()" to "sockaddr4_to_string()"
  since it is exactly that (unless I'm missing something).

Minor Changes:
- lib/httpinfo/src/admin_html.h contained just some variable
  definitions so it is now integrated in the only user:
  admin_interface.c
- olsrd_dot_draw.c got rid of two indicator variables if
  a socket is valid or not. Since sockets may use "-1" as the
  "not open", "invalid" value, there is no need for two more
  ints.
- and the dot_draw plugin is somewhat smaller and easier to read.
- const'ified some functions

54 files changed:
lib/bmf/src/Bmf.c
lib/bmf/src/NetworkInterfaces.c
lib/dot_draw/src/olsrd_dot_draw.c
lib/dyn_gw/src/olsrd_dyn_gw.c
lib/dyn_gw_plain/src/olsrd_dyn_gw_plain.c
lib/httpinfo/src/admin_html.h [deleted file]
lib/httpinfo/src/admin_interface.c
lib/httpinfo/src/olsrd_httpinfo.c
lib/nameservice/src/mapwrite.c
lib/nameservice/src/nameservice.c
lib/pgraph/src/olsrd_pgraph.c
lib/quagga/src/quagga.c
lib/secure/src/olsrd_secure.c
lib/txtinfo/src/olsrd_txtinfo.c
src/build_msg.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/duplicate_set.c
src/hna_set.c
src/hna_set.h
src/hysteresis.c
src/interfaces.c
src/ipc_frontend.c
src/ipcalc.c [new file with mode: 0644]
src/ipcalc.h [new file with mode: 0644]
src/link_set.c
src/linux/net.c
src/local_hna_set.c [deleted file]
src/local_hna_set.h [deleted file]
src/lq_avl.c
src/lq_packet.c
src/lq_route.c
src/main.c
src/mid_set.c
src/mpr.c
src/mpr_selector_set.c
src/neighbor_table.c
src/net_olsr.c
src/net_olsr.h
src/olsr_cfg.h
src/olsr_types.h
src/packet.c
src/packet.h
src/parser.c
src/print_packet.c
src/process_package.c
src/process_routes.c
src/rebuild_packet.c
src/routing_table.c
src/tc_set.c
src/two_hop_neighbor_table.c
src/unix/ifnet.c

index c498166..5ca6232 100644 (file)
@@ -57,6 +57,7 @@
 
 /* OLSRD includes */
 #include "defs.h" /* olsr_cnf, OLSR_PRINTF */
+#include "ipcalc.h"
 #include "olsr.h" /* olsr_printf */
 #include "scheduler.h" /* olsr_register_scheduler_event */
 #include "mid_set.h" /* mid_lookup_main_addr() */
index 0fcde9f..54272f5 100644 (file)
@@ -58,8 +58,8 @@
 
 /* OLSRD includes */
 #include "olsr.h" /* olsr_printf() */
+#include "ipcalc.h"
 #include "defs.h" /* olsr_cnf */
-#include "local_hna_set.h" /* add_local_hna4_entry() */
 #include "link_set.h" /* get_link_set() */
 #include "lq_route.h" /* MIN_LINK_QUALITY */
 #include "tc_set.h" /* olsr_lookup_tc_entry(), olsr_tc_lookup_dst() */
@@ -1355,11 +1355,9 @@ static int CreateLocalEtherTunTap(void)
   if (TunTapIpOverruled != 0)
   {
     union olsr_ip_addr temp_net;
-    union olsr_ip_addr temp_netmask;
 
     temp_net.v4.s_addr = htonl(EtherTunTapIp);
-    temp_netmask.v4.s_addr = htonl(0xFFFFFFFF);
-    add_local_hna4_entry(&temp_net, &temp_netmask);
+    ip_prefix_list_add(&olsr_cnf->hna_entries, &temp_net, 32);
   }
 
   close(ioctlSkfd);
index 7c59ded..4007d6b 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_dot_draw.c,v 1.34 2007/11/29 00:34:22 bernd67 Exp $
+ * $Id: olsrd_dot_draw.c,v 1.35 2007/11/29 00:49:40 bernd67 Exp $
  */
 
 /*
@@ -60,6 +60,7 @@
 #include <stdarg.h>
 
 #include "olsr.h"
+#include "ipcalc.h"
 #include "olsr_types.h"
 #include "neighbor_table.h"
 #include "two_hop_neighbor_table.h"
@@ -88,9 +89,6 @@ static int ipc_connection;
 static int
 plugin_ipc_init(void);
 
-static char*
-olsr_netmask_to_string(const union hna_netmask *mask);
-
 /* Event function to register with the sceduler */
 static int
 pcf_event(int, int, int);
@@ -105,7 +103,7 @@ static void
 ipc_print_tc_link(const struct tc_entry *entry, const struct tc_edge_entry *dst_entry);
 
 static void
-ipc_print_net(const union olsr_ip_addr *, const union olsr_ip_addr *, const union hna_netmask *);
+ipc_print_net(const union olsr_ip_addr *, const union olsr_ip_addr *, olsr_u8_t);
 
 static void
 ipc_send(const char *, int);
@@ -283,7 +281,7 @@ pcf_event(int changes_neighborhood,
     struct neighbor_entry *neighbor_table_tmp;
     struct tc_entry *tc;
     struct tc_edge_entry *tc_edge;
-    struct local_hna_entry *hna;
+    struct ip_prefix_list *hna;
     int idx;
     
     /* Print tables to IPC socket */
@@ -315,25 +313,16 @@ pcf_event(int changes_neighborhood,
         for (tmp_net = tmp_hna->networks.next; tmp_net != &tmp_hna->networks; tmp_net = tmp_net->next) {
           ipc_print_net(&tmp_hna->A_gateway_addr, 
                         &tmp_net->A_network_addr, 
-                        &tmp_net->A_netmask);
+                        tmp_net->prefixlen);
         }
       }
     }
 
     /* Local HNA entries */
     for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next) {
-      union hna_netmask hna_msk;
-      if (olsr_cnf->ip_version == AF_INET) {
-        union olsr_ip_addr netmask;
-        //hna_msk.v4 = hna4->netmask.v4;
-        olsr_prefix_to_netmask(&netmask, hna->net.prefix_len);
-        hna_msk.v4 = netmask.v4.s_addr;
-      } else {
-        hna_msk.v6 = hna->net.prefix_len;
-      }
       ipc_print_net(&olsr_cnf->main_addr,
                     &hna->net.prefix,
-                    &hna_msk);
+                    hna->net.prefix_len);
     }
     ipc_send_str("}\n\n");
 
@@ -359,18 +348,18 @@ ipc_print_tc_link(const struct tc_entry *entry, const struct tc_edge_entry *dst_
 
 
 static void
-ipc_print_net(const union olsr_ip_addr *gw, const union olsr_ip_addr *net, const union hna_netmask *mask)
+ipc_print_net(const union olsr_ip_addr *gw, const union olsr_ip_addr *net, olsr_u8_t prefixlen)
 {
   struct ipaddr_str gwbuf, netbuf;
 
-  ipc_send_fmt("\"%s\" -> \"%s/%s\"[label=\"HNA\"];\n",
+  ipc_send_fmt("\"%s\" -> \"%s/%d\"[label=\"HNA\"];\n",
                olsr_ip_to_string(&gwbuf, gw),
                olsr_ip_to_string(&netbuf, net),
-               olsr_netmask_to_string(mask));
+               prefixlen);
 
-  ipc_send_fmt("\"%s/%s\"[shape=diamond];\n",
+  ipc_send_fmt("\"%s/%d\"[shape=diamond];\n",
                olsr_ip_to_string(&netbuf, net),
-               olsr_netmask_to_string(mask));
+               prefixlen);
 }
 
 static void
@@ -402,21 +391,3 @@ ipc_send_fmt(const char *format, ...)
     ipc_send(buf, len);
   }
 }
-
-static char*
-olsr_netmask_to_string(const union hna_netmask *mask)
-{
-  char *ret;
-  struct in_addr in;
-
-  if (olsr_cnf->ip_version == AF_INET) {
-      in.s_addr = mask->v4;
-      ret = inet_ntoa(in);
-  } else {
-      /* IPv6 */
-      static char netmask[5];
-      sprintf(netmask, "%d", mask->v6);
-      ret = netmask;
-  }
-  return ret;
-}
index f558d45..a50ba3d 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_dyn_gw.c,v 1.26 2007/11/08 23:53:43 bernd67 Exp $
+ * $Id: olsrd_dyn_gw.c,v 1.27 2007/11/29 00:49:40 bernd67 Exp $
  */
 
 /*
- * -Threaded ping code added by Jens Nachitgall
+ * -Threaded ping code added by Jens Nachtigall
  * -HNA4 checking by bjoern riemer
  */
 
@@ -51,8 +51,8 @@
 #include "olsrd_dyn_gw.h"
 #include "scheduler.h"
 #include "olsr.h"
-#include "local_hna_set.h"
 #include "defs.h"
+#include "ipcalc.h"
 
 #include <stdio.h>
 #include <string.h>
@@ -105,7 +105,7 @@ add_to_ping_list(const char *, struct ping_list *);
 
 struct hna_list {
   union olsr_ip_addr hna_net;
-  union olsr_ip_addr hna_netmask;
+  olsr_u8_t hna_prefixlen;
   struct ping_list *ping_hosts;
   int hna_added;
   int probe_ok;
@@ -115,7 +115,7 @@ struct hna_list {
 static struct hna_list *
        add_to_hna_list(struct hna_list *,
                                union olsr_ip_addr *hna_net,
-                               union olsr_ip_addr *hna_netmask );
+                               olsr_u8_t hna_prefixlen );
 
 struct hna_list *the_hna_list = NULL;
 
@@ -123,7 +123,7 @@ static void
 looped_checks(void *) __attribute__((noreturn));
 
 static int
-check_gw(union olsr_ip_addr *, union olsr_ip_addr *,struct ping_list *);
+check_gw(union olsr_ip_addr *, olsr_u8_t,struct ping_list *);
 
 static int
 ping_is_possible(struct ping_list *);
@@ -167,7 +167,7 @@ static int set_plugin_ping(const char *value, void *data __attribute__((unused))
         union olsr_ip_addr temp_netmask;
         temp_net.v4.s_addr = INET_NET;
         temp_netmask.v4.s_addr = INET_PREFIX;
-        the_hna_list = add_to_hna_list(the_hna_list, &temp_net, &temp_netmask);
+        the_hna_list = add_to_hna_list(the_hna_list, &temp_net, olsr_netmask_to_prefix(&temp_netmask));
         if (the_hna_list == NULL) {
             return 1;
         }
@@ -204,7 +204,7 @@ static int set_plugin_hna(const char *value, void *data __attribute__((unused)),
 
     //printf("/%s(%08x)\n",inet_ntoa(foo_addr),foo_addr.s_addr);
     //printf("%s():got->%s/%s\n",__func__,olsr_ip_to_string((union olsr_ip_addr *)&));
-    the_hna_list = add_to_hna_list(the_hna_list, &temp_net, &temp_netmask);
+    the_hna_list = add_to_hna_list(the_hna_list, &temp_net, olsr_netmask_to_prefix(&temp_netmask));
     if (the_hna_list != NULL) {
         return 1;
     }
@@ -269,7 +269,7 @@ olsr_event_doing_hna(void *foo __attribute__((unused)))
        /*
   if (has_available_gw == 1 && gw_already_added == 0) {
     olsr_printf(1, "Adding OLSR local HNA entry for Internet\n");
-    add_local_hna4_entry(&gw_net, &gw_netmask);
+    add_local_hna_entry(&gw_net, &gw_netmask);
     gw_already_added = 1;
   } else if ((has_available_gw == 0) && (gw_already_added == 1)) {
     // Remove all local Inet HNA entries /
@@ -282,10 +282,10 @@ olsr_event_doing_hna(void *foo __attribute__((unused)))
        for(li=the_hna_list; li; li=li->next){
                if((li->probe_ok==1)&&(li->hna_added==0)){
                        olsr_printf(1, "Adding OLSR local HNA entry\n");
-                       add_local_hna4_entry(&li->hna_net, &li->hna_netmask);
+                       ip_prefix_list_add(&olsr_cnf->hna_entries, &li->hna_net, li->hna_prefixlen);
                        li->hna_added=1;
                }else if((li->probe_ok==0)&&(li->hna_added==1)){
-                       while(remove_local_hna4_entry(&li->hna_net, &li->hna_netmask)) {
+                       while(ip_prefix_list_remove(&olsr_cnf->hna_entries, &li->hna_net, li->hna_prefixlen)) {
                                olsr_printf(1, "Removing OLSR local HNA entry\n");
                        }
                        li->hna_added=0;
@@ -311,7 +311,7 @@ looped_checks(void *foo __attribute__((unused)))
 
     for(li = the_hna_list; li; li = li->next){
       /* check for gw in table entry and if Ping IPs are given also do pings */
-      li->probe_ok = check_gw(&li->hna_net,&li->hna_netmask,li->ping_hosts);
+      li->probe_ok = check_gw(&li->hna_net,li->hna_prefixlen,li->ping_hosts);
       //has_available_gw = check_gw(&gw_net, &gw_netmask);
     }
 
@@ -324,13 +324,14 @@ looped_checks(void *foo __attribute__((unused)))
 
 
 static int
-check_gw(union olsr_ip_addr *net, union olsr_ip_addr *mask, struct ping_list *the_ping_list)
+check_gw(union olsr_ip_addr *net, olsr_u8_t prefixlen, struct ping_list *the_ping_list)
 {
     char buf[1024], iface[16];
     olsr_u32_t gate_addr, dest_addr, netmask;
     unsigned int iflags;
     int metric, refcnt, use;
     int retval = 0;
+    union olsr_ip_addr mask;
 
     FILE *fp = fopen(PROCENTRY_ROUTE, "r");
     if (!fp) 
@@ -340,6 +341,7 @@ check_gw(union olsr_ip_addr *net, union olsr_ip_addr *mask, struct ping_list *th
        return -1;
       }    
 
+    olsr_prefix_to_netmask(&mask, prefixlen);
     /*
     olsr_printf(1, "Genmask         Destination     Gateway         "
                 "Flags Metric Ref    Use Iface\n");
@@ -364,10 +366,10 @@ check_gw(union olsr_ip_addr *net, union olsr_ip_addr *mask, struct ping_list *th
 
         if( (iflags & RTF_UP) &&
             (metric == 0) &&
-            (netmask == mask->v4.s_addr) && 
+            (netmask == mask.v4.s_addr) && 
             (dest_addr == net->v4.s_addr))
           {
-            if ( ((mask->v4.s_addr == INET_PREFIX)&&(net->v4.s_addr == INET_NET))&&(!(iflags & RTF_GATEWAY)))
+            if ( ((mask.v4.s_addr == INET_PREFIX)&&(net->v4.s_addr == INET_NET))&&(!(iflags & RTF_GATEWAY)))
               {
                 fclose(fp);  
                 return retval;
@@ -389,7 +391,7 @@ check_gw(union olsr_ip_addr *net, union olsr_ip_addr *mask, struct ping_list *th
     fclose(fp);      
     if(retval == 0){
       /* And we cast here since we get warnings on Win32 */
-      olsr_printf(1, "HNA[%08x/%08x] is invalid\n", (unsigned int)net->v4.s_addr, (unsigned int)mask->v4.s_addr);
+      olsr_printf(1, "HNA[%08x/%08x] is invalid\n", (unsigned int)net->v4.s_addr, (unsigned int)mask.v4.s_addr);
     }  
     return retval;
 }
@@ -429,7 +431,7 @@ add_to_ping_list(const char *ping_address, struct ping_list *the_ping_list)
 
 
 static struct hna_list *
-add_to_hna_list(struct hna_list * list_root, union olsr_ip_addr *hna_net, union olsr_ip_addr *hna_netmask )
+add_to_hna_list(struct hna_list * list_root, union olsr_ip_addr *hna_net, olsr_u8_t hna_prefixlen )
 {
   struct hna_list *new = malloc(sizeof(struct hna_list));
   if(new == NULL)
@@ -440,7 +442,7 @@ add_to_hna_list(struct hna_list * list_root, union olsr_ip_addr *hna_net, union
   //memcpy(&new->hna_net,hna_net,sizeof(union hna_net));
   //memcpy(&new->hna_netmask,hna_netmask,sizeof(union hna_netmask));
   new->hna_net.v4=hna_net->v4;
-  new->hna_netmask.v4=hna_netmask->v4;
+  new->hna_prefixlen=hna_prefixlen;
   new->hna_added=0;
   new->probe_ok=0;
   new->ping_hosts=NULL;
index 0ff9a5f..6782ced 100644 (file)
  * the copyright holders.
  */
 
-#include "olsr_types.h"
 #include "olsrd_dyn_gw_plain.h"
+#include "olsr_types.h"
+#include "ipcalc.h"
 #include "scheduler.h"
 #include "olsr.h"
-#include "local_hna_set.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -89,7 +90,7 @@ olsrd_plugin_init(void)
   has_inet_gateway = 0;
   
   /* Remove all local Inet HNA entries */
-  while(remove_local_hna4_entry(&gw_net, &gw_netmask)) {
+  while(ip_prefix_list_remove(&olsr_cnf->hna_entries, &gw_net, olsr_netmask_to_prefix(&gw_netmask))) {
     olsr_printf(DEBUGLEV, "HNA Internet gateway deleted\n");
   }
 
@@ -175,12 +176,12 @@ void olsr_event(void* foo __attribute__((unused)))
   int res = check_gw(&gw_net, &gw_netmask);
   if (1 == res && 0 == has_inet_gateway) {
     olsr_printf(DEBUGLEV, "Adding OLSR local HNA entry for Internet\n");
-    add_local_hna4_entry(&gw_net, &gw_netmask);
+    ip_prefix_list_add(&olsr_cnf->hna_entries, &gw_net, olsr_netmask_to_prefix(&gw_netmask));
     has_inet_gateway = 1;
   }
   else if (0 == res && 1 == has_inet_gateway) {
     /* Remove all local Inet HNA entries */
-    while(remove_local_hna4_entry(&gw_net, &gw_netmask)) {
+    while(ip_prefix_list_remove(&olsr_cnf->hna_entries, &gw_net, olsr_netmask_to_prefix(&gw_netmask))) {
       olsr_printf(DEBUGLEV, "Removing OLSR local HNA entry for Internet\n");
     }
     has_inet_gateway = 0;
diff --git a/lib/httpinfo/src/admin_html.h b/lib/httpinfo/src/admin_html.h
deleted file mode 100644 (file)
index 0b27e00..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * HTTP Info plugin for the olsr.org OLSR daemon
- * 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: admin_html.h,v 1.5 2007/10/20 20:41:04 bernd67 Exp $
- */
-
-/*
- * Dynamic linked library for the olsr.org olsr daemon
- */
-
-
-
-#ifndef ADMIN_HTML_H
-#define ADMIN_HTML_H
-
-static const char admin_frame_prolog[] =
-    "<strong>Administrator interface</strong><hr>\n"
-    "<h2>Change basic settings</h2>\n"
-    "<form action=\"set_values\" method=\"post\">\n"
-    "<table width=\"100%%\">\n";
-
-static const char admin_frame_mid[] =
-    "</table>\n<br>\n"
-    "<center><input type=\"submit\" value=\"Submit\" class=\"input_button\">\n"
-    "<input type=\"reset\" value=\"Reset\" class=\"input_button\"></center>\n"
-    "</form>\n"
-    "<h2>Add/remove local HNA entries</h2>\n"
-    "<form action=\"set_values\" method=\"post\">\n"
-    "<table width=\"100%%\"><tr><td><strong>Network:</strong></td>\n"
-    "<td><input type=\"text\" name=\"hna_new_net\" maxlength=\"16\" class=\"input_text\" value=\"0.0.0.0\"></td>\n"
-    "<td><strong>Netmask/Prefix:</strong></td>\n"
-    "<td><input type=\"text\" name=\"hna_new_netmask\" maxlength=\"16\" class=\"input_text\" value=\"0.0.0.0\"></td>\n"
-    "<td><input type=\"submit\" value=\"Add entry\" class=\"input_button\"></td></form>\n"
-    "</table><hr>\n"
-    "<form action=\"set_values\" method=\"post\">\n"
-    "<table width=\"100%%\">\n"
-  "<tr><th width=50 halign=\"middle\">Delete</th><th>Network</th><th>Netmask</th></tr>\n";
-
-static const char admin_frame_epilog[] =
-    "</table>\n<br>\n"
-    "<center><input type=\"submit\" value=\"Delete selected\" class=\"input_button\"></center>\n"
-    "</form>\n";
-
-static const char admin_basic_setting_int[] = "<td><strong>%s</strong></td>\n<td> <input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%d\"></td>\n";
-static const char admin_basic_setting_float[] = "<td><strong>%s</strong></td>\n<td> <input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%0.2f\"></td>\n";
-static const char admin_basic_setting_string[] = "<td><strong>%s</strong></td>\n<td> <input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%s\"></td>\n";
-
-#endif
index fd52db2..982a577 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: admin_interface.c,v 1.12 2007/11/08 22:47:40 bernd67 Exp $
+ * $Id: admin_interface.c,v 1.13 2007/11/29 00:49:41 bernd67 Exp $
  */
 
 /*
 #include "olsr.h"
 #include "olsrd_httpinfo.h"
 #include "olsr_cfg.h"
-#include "admin_html.h"
 #include "admin_interface.h"
-#include "local_hna_set.h" /* add_local_hna4_entry() */
 #include "net_olsr.h"
+#include "ipcalc.h"
 
 #include <stdio.h>
 #include <string.h>
 #define NETDIRECT
 #endif
 
+static const char admin_basic_setting_int[] = "<td><strong>%s</strong></td><td><input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%d\"></td>\n";
+static const char admin_basic_setting_float[] = "<td><strong>%s</strong></td><td><input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%0.2f\"></td>\n";
+static const char admin_basic_setting_string[] = "<td><strong>%s</strong></td><td><input type=\"text\" name=\"%s\" maxlength=\"%d\" class=\"input_text\" value=\"%s\"></td>\n";
+
+static const char admin_frame_prolog[] =
+    "<strong>Administrator interface</strong><hr>\n"
+    "<h2>Change basic settings</h2>\n"
+    "<form action=\"set_values\" method=\"post\">\n"
+    "<table width=\"100%%\">\n";
+
+static const char admin_frame_mid[] =
+    "</table>\n<br>\n"
+    "<center><input type=\"submit\" value=\"Submit\" class=\"input_button\">\n"
+    "<input type=\"reset\" value=\"Reset\" class=\"input_button\"></center>\n"
+    "</form>\n"
+    "<h2>Add/remove local HNA entries</h2>\n"
+    "<form action=\"set_values\" method=\"post\">\n"
+    "<table width=\"100%%\"><tr><td><strong>Network:</strong></td>\n"
+    "<td><input type=\"text\" name=\"hna_new_net\" maxlength=\"16\" class=\"input_text\" value=\"0.0.0.0\"></td>\n"
+    "<td><strong>Netmask/Prefix:</strong></td>\n"
+    "<td><input type=\"text\" name=\"hna_new_netmask\" maxlength=\"16\" class=\"input_text\" value=\"0.0.0.0\"></td>\n"
+    "<td><input type=\"submit\" value=\"Add entry\" class=\"input_button\"></td></form>\n"
+    "</table><hr>\n"
+    "<form action=\"set_values\" method=\"post\">\n"
+    "<table width=\"100%%\">\n"
+  "<tr><th width=50 halign=\"middle\">Delete</th><th>Network</th><th>Netmask</th></tr>\n";
+
+static const char admin_frame_epilog[] =
+    "</table>\n<br>\n"
+    "<center><input type=\"submit\" value=\"Delete selected\" class=\"input_button\"></center>\n"
+    "</form>\n";
 
 int
 build_admin_body(char *buf, olsr_u32_t bufsize __attribute__((unused)))
@@ -123,7 +153,7 @@ build_admin_body(char *buf, olsr_u32_t bufsize __attribute__((unused)))
 
   if(olsr_cnf->hna_entries) {
     if(olsr_cnf->ip_version == AF_INET) {
-      struct local_hna_entry *hna;
+      struct ip_prefix_list *hna;
       struct ipaddr_str netbuf, maskbuf;
       for(hna = olsr_cnf->hna_entries; hna; hna = hna->next) {
         union olsr_ip_addr netmask;
@@ -134,7 +164,7 @@ build_admin_body(char *buf, olsr_u32_t bufsize __attribute__((unused)))
                          olsr_ip_to_string(&maskbuf, &netmask));
       }
     } else {
-      struct local_hna_entry *hna;
+      struct ip_prefix_list *hna;
       for(hna = olsr_cnf->hna_entries; hna; hna = hna->next) {
         struct ipaddr_str netbuf;
         size += snprintf(&buf[size], bufsize-size,
index 1d8c829..467aa06 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_httpinfo.c,v 1.87 2007/11/16 19:12:55 bernd67 Exp $
+ * $Id: olsrd_httpinfo.c,v 1.88 2007/11/29 00:49:41 bernd67 Exp $
  */
 
 /*
@@ -62,6 +62,7 @@
 #include "net_olsr.h"
 #include "link_set.h"
 #include "socket_parser.h"
+#include "ipcalc.h"
 
 #include "olsrd_httpinfo.h"
 #include "admin_interface.h"
@@ -232,15 +233,9 @@ static const struct tab_entry tab_entries[] = {
 };
 
 static const struct static_bin_file_entry static_bin_files[] = {
-#if 0
-    {"favicon.ico", favicon_ico, 1406/*favicon_ico_len*/},
-    {"logo.gif", logo_gif, 2801/*logo_gif_len*/},
-    {"grayline.gif", grayline_gif, 43/*grayline_gif_len*/},
-#else
-    {"favicon.ico", favicon_ico, sizeof(favicon_ico)},
-    {"logo.gif", logo_gif, sizeof(logo_gif)},
+    {"favicon.ico",  favicon_ico, sizeof(favicon_ico)},
+    {"logo.gif",     logo_gif, sizeof(logo_gif)},
     {"grayline.gif", grayline_gif, sizeof(grayline_gif)},
-#endif
     {NULL, NULL, 0}
 };
 
@@ -258,32 +253,6 @@ static const struct dynamic_file_entry dynamic_files[] =
     {NULL, NULL}
   };
 
-/**
- *Do initialization here
- *
- *This function is called by the my_init
- *function in uolsrd_plugin.c
- */
-int
-olsrd_plugin_init(void)
-{
-  /* Get start time */
-  gettimeofday(&start_time, NULL);
-
-  curr_clients = 0;
-  /* set up HTTP socket */
-  http_socket = get_http_socket(http_port != 0 ? http_port :  DEFAULT_TCP_PORT);
-
-  if (http_socket < 0) {
-    fprintf(stderr, "(HTTPINFO) could not initialize HTTP socket\n");
-    exit(0);
-  }
-
-  /* Register socket */
-  add_olsr_socket(http_socket, &parse_http_request);
-
-  return 1;
-}
 
 static int
 get_http_socket(int port)
@@ -329,6 +298,32 @@ get_http_socket(int port)
   return s;
 }
 
+/**
+ *Do initialization here
+ *
+ *This function is called by the my_init
+ *function in uolsrd_plugin.c
+ */
+int
+olsrd_plugin_init(void)
+{
+  /* Get start time */
+  gettimeofday(&start_time, NULL);
+
+  curr_clients = 0;
+  /* set up HTTP socket */
+  http_socket = get_http_socket(http_port != 0 ? http_port :  DEFAULT_TCP_PORT);
+
+  if (http_socket < 0) {
+    fprintf(stderr, "(HTTPINFO) could not initialize HTTP socket\n");
+    exit(0);
+  }
+
+  /* Register socket */
+  add_olsr_socket(http_socket, &parse_http_request);
+
+  return 1;
+}
 
 /* Non reentrant - but we are not multithreaded anyway */
 void
@@ -488,9 +483,9 @@ parse_http_request(int fd)
                        "<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"%d\">\n"
                        "<tbody><tr bgcolor=\"#ffffff\">\n"
                        "<td align=\"left\" height=\"69\" valign=\"middle\" width=\"80%%\">\n"
-                       "<font color=\"black\" face=\"timesroman\" size=\"6\">&nbsp;&nbsp;&nbsp;olsr.org OLSR daemon</font></td>\n"
+                       "<font color=\"black\" face=\"timesroman\" size=\"6\">&nbsp;&nbsp;&nbsp;<a href=\"http://www.olsr.org/\">olsr.org OLSR daemon</a></font></td>\n"
                        "<td align=\"right\" height=\"69\" valign=\"middle\" width=\"20%%\">\n"
-                       "<img src=\"/logo.gif\" alt=\"olsrd logo\"></td>\n"
+                       "<a href=\"http://www.olsr.org/\"><img border=\"0\" src=\"/logo.gif\" alt=\"olsrd logo\"></a></td>\n"
                        "</tr>\n"
                        "</tbody>\n"
                        "</table>\n",
@@ -652,8 +647,8 @@ static int build_tabs(char *buf, const olsr_u32_t bufsize, int active)
 void
 olsr_plugin_exit(void)
 {
-  if (http_socket) {
-    close(http_socket);
+  if (http_socket >= 0) {
+    CLOSE(http_socket);
   }
 }
 
@@ -865,21 +860,18 @@ static int build_config_body(char *buf, olsr_u32_t bufsize)
 
     size += snprintf(&buf[size], bufsize-size, "<td>Willingness: %d %s</td>\n", olsr_cnf->willingness, olsr_cnf->willingness_auto ? "(auto)" : "");
     
-    size += snprintf(&buf[size], bufsize-size, "</tr>\n<tr>\n");
 
     if (olsr_cnf->lq_level == 0) {
-      size += snprintf(&buf[size], bufsize-size, "<td>Hysteresis: %s</td>\n", olsr_cnf->use_hysteresis ? "Enabled" : "Disabled");
+      size += snprintf(&buf[size], bufsize-size, "</tr>\n<tr>\n"
+                                                  "<td>Hysteresis: %s</td>\n", olsr_cnf->use_hysteresis ? "Enabled" : "Disabled");
       if (olsr_cnf->use_hysteresis) {
         size += snprintf(&buf[size], bufsize-size, "<td>Hyst scaling: %0.2f</td>\n", olsr_cnf->hysteresis_param.scaling);
         size += snprintf(&buf[size], bufsize-size, "<td>Hyst lower/upper: %0.2f/%0.2f</td>\n", olsr_cnf->hysteresis_param.thr_low, olsr_cnf->hysteresis_param.thr_high);
       }
-    } else {
-      size += snprintf(&buf[size], bufsize-size, "<td></td>\n");
     }
 
-    size += snprintf(&buf[size], bufsize-size, "</tr>\n<tr>\n");
-
-    size += snprintf(&buf[size], bufsize-size, "<td>LQ extension: %s</td>\n", olsr_cnf->lq_level ? "Enabled" : "Disabled");
+    size += snprintf(&buf[size], bufsize-size, "</tr>\n<tr>\n"
+                                               "<td>LQ extension: %s</td>\n", olsr_cnf->lq_level ? "Enabled" : "Disabled");
     if (olsr_cnf->lq_level) {
       size += snprintf(&buf[size], bufsize-size,
                        "<td>LQ level: %d</td>\n"
@@ -957,7 +949,7 @@ static int build_config_body(char *buf, olsr_u32_t bufsize)
 
     size += section_title(&buf[size], bufsize-size, "Announced HNA entries");
     if (olsr_cnf->hna_entries) {
-      struct local_hna_entry *hna;
+      struct ip_prefix_list *hna;
       if (olsr_cnf->ip_version == AF_INET) {
        size += snprintf(&buf[size], bufsize-size, "<tr><th>Network</th><th>Netmask</th></tr>\n");
        for (hna = olsr_cnf->hna_entries; hna; hna = hna->next) {
index 30b6173..bd2de91 100644 (file)
@@ -28,7 +28,7 @@
  *
  */
 
-/* $Id: mapwrite.c,v 1.1 2007/11/29 00:26:16 bernd67 Exp $ */
+/* $Id: mapwrite.c,v 1.2 2007/11/29 00:49:41 bernd67 Exp $ */
  
 #include <stdio.h>
 #include <string.h>
@@ -43,7 +43,7 @@
 #include "nameservice.h"
 #include "mid_set.h"
 #include "tc_set.h"
-#include "net_olsr.h"
+#include "ipcalc.h"
 #include "mapwrite.h"
 
 static char my_latlon_str[48];
index a56fde0..5d158e8 100644 (file)
@@ -31,7 +31,7 @@
  *
  */
 
-/* $Id: nameservice.c,v 1.39 2007/11/29 00:26:16 bernd67 Exp $ */
+/* $Id: nameservice.c,v 1.40 2007/11/29 00:49:41 bernd67 Exp $ */
 
 /*
  * Dynamic linked library for UniK OLSRd
@@ -46,6 +46,7 @@
 #include <regex.h>
 
 #include "olsr.h"
+#include "ipcalc.h"
 #include "net_olsr.h"
 #include "routing_table.h"
 #include "mantissa.h"
@@ -1277,7 +1278,7 @@ free_name_entry_list(struct name_entry **list)
 olsr_bool
 allowed_ip(const union olsr_ip_addr *addr)
 {
-       struct local_hna_entry *hna;
+       struct ip_prefix_list *hna;
        struct interface *iface;
        union olsr_ip_addr tmp_ip, tmp_msk;
 #ifndef NODEBUG
@@ -1430,7 +1431,7 @@ is_latlon_wellformed(const char *latlon_line)
  */
 olsr_bool get_isdefhna_latlon(void)
 {
-       struct local_hna_entry *hna;
+       struct ip_prefix_list *hna;
        for (hna = olsr_cnf->hna_entries; hna != NULL; hna = hna->next){
                if (hna->net.prefix_len == 0) {
                        return OLSR_TRUE;
index 8aebdc0..184b661 100755 (executable)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_pgraph.c,v 1.10 2007/11/08 22:47:40 bernd67 Exp $
+ * $Id: olsrd_pgraph.c,v 1.11 2007/11/29 00:49:42 bernd67 Exp $
  */
 
 /*
@@ -45,6 +45,7 @@
  */
 
 #include "olsrd_pgraph.h"
+#include "ipcalc.h"
 #include "socket_parser.h"
 #include "olsrd_plugin.h"
 #include "plugin_util.h"
@@ -140,18 +141,10 @@ static int pcf_event(int, int, int);
 
 static void ipc_action(int);
 
-#if 0
-static struct link_entry *olsr_neighbor_best_link(union olsr_ip_addr *main);
-#endif
-
 static void ipc_print_neigh_link(struct neighbor_entry *neighbor);
 
 static void ipc_print_tc_link(struct tc_entry *entry, struct tc_edge_entry *dst_entry);
 
-#if 0
-static void ipc_print_net(union olsr_ip_addr *, union olsr_ip_addr *, union hna_netmask *);
-#endif
-
 static int ipc_send(const char *, int);
 
 static void ipc_print_neigh_link(struct neighbor_entry *);
@@ -390,17 +383,6 @@ static int pcf_event(int changes_neighborhood,
   return res;
 }
 
-#if 0
-#define MIN_LINK_QUALITY 0.01
-static double calc_etx(double loss, double neigh_loss) 
-{
-  if (loss < MIN_LINK_QUALITY || neigh_loss < MIN_LINK_QUALITY)
-    return 0.0;
-  else
-    return 1.0 / (loss * neigh_loss);
-}
-#endif
-
 static void ipc_print_tc_link(struct tc_entry *entry, struct tc_edge_entry *dst_entry)
 {
   char buf[256];
@@ -414,34 +396,6 @@ static void ipc_print_tc_link(struct tc_entry *entry, struct tc_edge_entry *dst_
   ipc_send(buf, len);
 }
 
-#if 0
-static void
-ipc_print_net(union olsr_ip_addr *gw, union olsr_ip_addr *net, union hna_netmask *mask)
-{
-  const char *adr;
-
-  adr = olsr_ip_to_string(gw);
-  ipc_send("\"", 1);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\" -> \"", strlen("\" -> \""));
-  adr = olsr_ip_to_string(net);
-  ipc_send(adr, strlen(adr));
-  ipc_send("/", 1);
-  adr = olsr_netmask_to_string(mask);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\"[label=\"HNA\"];\n", strlen("\"[label=\"HNA\"];\n"));
-  ipc_send("\"", 1);
-  adr = olsr_ip_to_string(net);
-  ipc_send(adr, strlen(adr));
-  ipc_send("/", 1);
-  adr = olsr_netmask_to_string(mask);
-  ipc_send(adr, strlen(adr));
-  ipc_send("\"", 1);
-  ipc_send("[shape=diamond];\n", strlen("[shape=diamond];\n"));
-}
-#endif
-
-
 static int ipc_send(const char *data, int size)
 {
   if(ipc_connection == -1)
@@ -462,33 +416,3 @@ static int ipc_send(const char *data, int size)
 
   return 1;
 }
-
-#if 0
-static struct link_entry *olsr_neighbor_best_link(union olsr_ip_addr *main)
-{
-  struct link_entry *walker;
-  double best = 0.0;
-  double curr;
-  struct link_entry *res = NULL;
-
-  // loop through all links
-
-  for (walker = link_set; walker != NULL; walker = walker->next)
-  {
-    // check whether it's a link to the requested neighbor and
-    // whether the link's quality is better than what we have
-    if(ipequal(main, &walker->neighbor->neighbor_main_addr))
-    {
-      curr = walker->loss_link_quality * walker->neigh_link_quality;
-
-      if (curr >= best)
-      {
-        best = curr;
-        res = walker;
-      }
-    }
-  }
-
-  return res;
-}
-#endif
index 2d37285..60375de 100644 (file)
@@ -31,7 +31,6 @@
 #include "olsr.h"
 #include "log.h"
 #include "defs.h"
-#include "local_hna_set.h"
 #include "routing_table.h"
 
 #ifdef USE_UNIX_DOMAIN_SOCKET
@@ -76,7 +75,6 @@ static int parse_ipv6_route_add (unsigned char*, size_t);
 static void zebra_reconnect (void);
 static void zebra_connect (void);
 
-static uint32_t prefixlentomask (uint8_t);
 static void free_ipv4_route (struct ipv4_route);
 /* 
 static void update_olsr_zebra_routes (struct ipv4_route*, struct ipv4_route*);
@@ -672,44 +670,31 @@ int zebra_disable_redistribute (unsigned char type) {
 
 }
   
-static uint32_t prefixlentomask (uint8_t prefix) {
-  uint32_t mask = 0;
-
-  if (prefix) {
-    mask = 0xffffffff<<(32-prefix);
-    mask = ntohl(mask);
-  }
-
-  return mask;
-}
-
 int add_hna4_route (struct ipv4_route r) {
-  union olsr_ip_addr net, mask;
+  union olsr_ip_addr net;
   
 #ifdef MY_DEBUG
   dump_ipv4_route(r, "add_hna4_route");
 #endif
 
-  mask.v4.s_addr = prefixlentomask(r.prefixlen);
   net.v4.s_addr = r.prefix;
 
-  add_local_hna4_entry(&net, &mask);
+  ip_prefix_list_add(&olsr_cnf->hna_entries, &net, r.prefixlen);
   free_ipv4_route(r);
   return 0;
 }
 
 int delete_hna4_route (struct ipv4_route r) {
 
-  union olsr_ip_addr net, mask;
+  union olsr_ip_addr net;
 
 #ifdef MY_DEBUG
   dump_ipv4_route(r, "delete_hna4_route");
 #endif
 
-  mask.v4.s_addr = prefixlentomask(r.prefixlen);
   net.v4.s_addr = r.prefix;
 
-  remove_local_hna4_entry(&net, &mask) ? 0 : -1;
+  ip_prefix_list_remove(&olsr_cnf->hna_entries, &net, r.prefixlen) ? 0 : -1;
   free_ipv4_route(r);
   return 0;
 
index d79d425..07e11a0 100644 (file)
@@ -33,7 +33,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * $Id: olsrd_secure.c,v 1.30 2007/11/16 22:56:54 bernd67 Exp $
+ * $Id: olsrd_secure.c,v 1.31 2007/11/29 00:49:42 bernd67 Exp $
  */
 
 
@@ -54,6 +54,7 @@
 #include <signal.h>
 
 #include "defs.h"
+#include "ipcalc.h"
 #include "olsr.h"
 #include "socket_parser.h"
 #include "parser.h"
index 86e5031..4f20599 100644 (file)
@@ -40,7 +40,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_txtinfo.c,v 1.16 2007/11/29 00:10:17 bernd67 Exp $
+ * $Id: olsrd_txtinfo.c,v 1.17 2007/11/29 00:49:42 bernd67 Exp $
  */
 
 /*
@@ -65,6 +65,7 @@
 #include <unistd.h>
 #include <errno.h>
 
+#include "ipcalc.h"
 #include "olsr.h"
 #include "olsr_types.h"
 #include "neighbor_table.h"
@@ -402,7 +403,7 @@ static void ipc_print_hna(void)
 {
     int size;
     int index;
-    struct local_hna_entry *hna;
+    struct ip_prefix_list *hna;
 
     size = 0;
 
@@ -437,21 +438,12 @@ static void ipc_print_hna(void)
             /* Check all networks */
             struct hna_net *tmp_net;
             for (tmp_net = tmp_hna->networks.next; tmp_net != &tmp_hna->networks; tmp_net = tmp_net->next) {
-               if (olsr_cnf->ip_version == AF_INET) {
-                    struct ipaddr_str addrbuf, maskbuf, mainaddrbuf;
-                    const union olsr_ip_addr netmask = { .v4 = { .s_addr = tmp_net->A_netmask.v4 } };
-                    ipc_sendf("%s\t%s\t%s\n",
-                              olsr_ip_to_string(&addrbuf, &tmp_net->A_network_addr),
-                              olsr_ip_to_string(&maskbuf, &netmask),
-                              olsr_ip_to_string(&mainaddrbuf, &tmp_hna->A_gateway_addr));
-               } else {
-                    struct ipaddr_str addrbuf, mainaddrbuf;
-                    ipc_sendf("%s\t%d\t%s\n",
-                              olsr_ip_to_string(&addrbuf, &tmp_net->A_network_addr),
-                              tmp_net->A_netmask.v6,
-                              olsr_ip_to_string(&mainaddrbuf, &tmp_hna->A_gateway_addr));
-               }
-           }            
+                struct ipaddr_str addrbuf, mainaddrbuf;
+                ipc_sendf("%s\t%d\t%s\n",
+                          olsr_ip_to_string(&addrbuf, &tmp_net->A_network_addr),
+                          tmp_net->prefixlen,
+                          olsr_ip_to_string(&mainaddrbuf, &tmp_hna->A_gateway_addr));
+            }
        }
     }
     ipc_sendf("\n");
index 7c76d1c..fdaa6f0 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: build_msg.c,v 1.39 2007/11/16 19:12:55 bernd67 Exp $
+ * $Id: build_msg.c,v 1.40 2007/11/29 00:49:38 bernd67 Exp $
  */
 
-#include "defs.h"
+#include "build_msg.h"
+#include "ipcalc.h"
 #include "olsr.h"
 #include "log.h"
-#include "build_msg.h"
-#include "local_hna_set.h"
 #include "mantissa.h"
 #include "net_olsr.h"
 
@@ -1067,11 +1066,19 @@ serialize_hna4(struct interface *ifp)
   /* preserve existing data in output buffer */
   union olsr_message *m;
   struct hnapair *pair;
-  struct local_hna_entry *h = olsr_cnf->hna_entries;
+  struct ip_prefix_list *h;
 
   /* No hna nets */
-  if((olsr_cnf->ip_version != AF_INET) || (!ifp) || h == NULL)
+  if (ifp == NULL) {
+    return OLSR_FALSE;
+  }
+  if (olsr_cnf->ip_version != AF_INET) {
     return OLSR_FALSE;
+  }
+  h = olsr_cnf->hna_entries;
+  if (h == NULL) {
+    return OLSR_FALSE;
+  }
     
   remainsize = net_outbuffer_bytes_left(ifp);
   
@@ -1099,8 +1106,7 @@ serialize_hna4(struct interface *ifp)
 
   pair = m->v4.message.hna.hna_net;
   
-  while(h)
-    {
+  for (; h != NULL; h = h->next) {
       union olsr_ip_addr ip_addr;
       if((curr_size + (2 * olsr_cnf->ipsize)) > remainsize)
        {
@@ -1129,9 +1135,8 @@ serialize_hna4(struct interface *ifp)
       olsr_prefix_to_netmask(&ip_addr, h->net.prefix_len);
       pair->netmask = ip_addr.v4.s_addr;
       pair++;
-      curr_size += (2 * olsr_cnf->ipsize);
-      h = h->next;
-    }
+      curr_size += (2 * olsr_cnf->ipsize);    
+  }
 
   m->v4.seqno = htons(get_msg_seqno());
   m->v4.olsr_msgsize = htons(curr_size);
@@ -1157,7 +1162,7 @@ serialize_hna6(struct interface *ifp)
   union olsr_message *m;
   struct hnapair6 *pair6;
   union olsr_ip_addr tmp_netmask;
-  struct local_hna_entry *h = olsr_cnf->hna_entries;
+  struct ip_prefix_list *h = olsr_cnf->hna_entries;
   
   /* No hna nets */
   if((olsr_cnf->ip_version != AF_INET6) || (!ifp) || h == NULL)
index feef5bd..cec9394 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: cfgfile_gen.c,v 1.12 2007/11/16 22:56:54 bernd67 Exp $
+ * $Id: cfgfile_gen.c,v 1.13 2007/11/29 00:49:40 bernd67 Exp $
  */
 
+#include "olsrd_conf.h"
+#include "../ipcalc.h"
+#include "../net_olsr.h"
 
 #include <stdio.h>
 #include <string.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
-#include "olsrd_conf.h"
-#include "net_olsr.h"
-
 
 int
 olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
 {
-  struct local_hna_entry   *h  = cnf->hna_entries;
+  struct ip_prefix_list   *h  = cnf->hna_entries;
   struct olsr_if           *in = cnf->interfaces;
   struct plugin_entry      *pe = cnf->plugins;
   struct plugin_param      *pp;
-  struct ipc_host          *ih = cnf->ipc_hosts;
-  struct ipc_net           *ie = cnf->ipc_nets;
+  struct ip_prefix_list    *ie = cnf->ipc_nets;
   struct olsr_lq_mult      *mult;
 
   char ipv6_buf[100];             /* buffer for IPv6 inet_htop */
@@ -76,7 +75,7 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
 
   printf("Writing config to file \"%s\".... ", fname);
 
-  fprintf(fd, "#\n# Configuration file for olsr.org olsrd\n# automatically generated by olsrd-cnf %s\n#\n\n\n", PARSER_VERSION);
+  fprintf(fd, "#\n# Configuration file for s%s\n# automatically generated by olsrd-cnf parser v. %s\n#\n\n", olsrd_version, PARSER_VERSION);
 
   /* Debug level */
   fprintf(fd, "# Debug level(0-9)\n# If set to 0 the daemon runs in the background\n\nDebugLevel\t%d\n\n", cnf->debug_level);
@@ -85,17 +84,10 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
   fprintf(fd, "# IP version to use (4 or 6)\n\nIpVersion\t%d\n\n", cnf->ip_version == AF_INET ? 4 : 6);
 
   /* HNA IPv4 */
-  fprintf(fd, "# HNA IPv%1$d routes\n# syntax: netaddr netmask\n\nHna1$d\n{\n", cnf->ip_version == AF_INET ? 4 : 6);
+  fprintf(fd, "# HNA IPv%1$d routes\n# syntax: netaddr netmask\n\nHna1$d {\n", cnf->ip_version == AF_INET ? 4 : 6);
   while(h) {
-    struct ipaddr_str buf;
-    fprintf(fd, "    %s ", olsr_ip_to_string(&buf, &h->net.prefix));
-    if (cnf->ip_version == AF_INET) {
-      union olsr_ip_addr ip_addr;
-      olsr_prefix_to_netmask(&ip_addr, h->net.prefix_len);
-      fprintf(fd, "%s\n", olsr_ip_to_string(&buf, &ip_addr));
-    } else {
-      fprintf(fd, "%d\n", h->net.prefix_len);
-    }
+    struct ipaddr_str strbuf;
+    fprintf(fd, "    %s/%d", olsr_ip_to_string(&strbuf, &h->net.prefix), h->net.prefix_len);
     h = h->next;
   }
   fprintf(fd, "}\n\n");
@@ -113,36 +105,33 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
 
   /* RtTable */
   fprintf(fd, "# Policy Routing Table to use. Default is 254\n\n");
-  fprintf(fd, "RtTable\t%d\n\n", cnf->rttable);
+  fprintf(fd, "RtTable\t\t%d\n\n", cnf->rttable);
 
   /* Willingness */
   fprintf(fd, "# The fixed willingness to use(0-7)\n# If not set willingness will be calculated\n# dynammically based on battery/power status\n\n");
   if(cnf->willingness_auto)
     fprintf(fd, "#Willingness\t4\n\n");
   else
-    fprintf(fd, "Willingness%d\n\n", cnf->willingness);
+    fprintf(fd, "Willingness\t%d\n\n", cnf->willingness);
 
   /* IPC */
   fprintf(fd, "# Allow processes like the GUI front-end\n# to connect to the daemon.\n\n");
-  fprintf(fd, "IpcConnect\n{\n");
-  fprintf(fd, "   MaxConnections  %d\n", cnf->ipc_connections);
+  fprintf(fd, "IpcConnect {\n");
+  fprintf(fd, "    MaxConnections\t%d\n", cnf->ipc_connections);
 
-  while(ih)
-    {
-      fprintf(fd, "   Host          %s\n", inet_ntoa(ih->host.v4));
-      ih = ih->next;
-    }
   while(ie)
     {
-      fprintf(fd, "   Net           %s ", inet_ntoa(ie->net.v4));
-      fprintf(fd, "%s\n", inet_ntoa(ie->mask.v4));
+      struct ipaddr_str strbuf;
+      if (ie->net.prefix_len == olsr_cnf->maxplen) {
+          fprintf(fd, "    Host\t\t%s\n", olsr_ip_to_string(&strbuf, &ie->net.prefix));
+      } else {
+          fprintf(fd, "    Net\t\t\t%s/%d\n", olsr_ip_to_string(&strbuf, &ie->net.prefix), ie->net.prefix_len);
+      }
       ie = ie->next;
     }
 
   fprintf(fd, "}\n\n");
 
-
-
   /* Hysteresis */
   fprintf(fd, "# Hysteresis adds more robustness to the\n# link sensing.\n# Used by default. 'yes' or 'no'\n\n");
 
@@ -198,7 +187,7 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
     {
       while(pe)
        {
-         fprintf(fd, "LoadPlugin \"%s\"\n{\n", pe->name);
+         fprintf(fd, "LoadPlugin \"%s\" {\n", pe->name);
           pp = pe->params;
           while(pp)
             {
@@ -221,7 +210,7 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
     {
       while(in)
        {
-         fprintf(fd, "Interface \"%s\"\n{\n", in->name);
+         fprintf(fd, "Interface \"%s\" {\n", in->name);
          fprintf(fd, "\n");
       
          fprintf(fd, "    # IPv4 broadcast address to use. The\n    # one usefull example would be 255.255.255.255\n    # If not defined the broadcastaddress\n    # every card is configured with is used\n\n");
@@ -229,7 +218,7 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
 
          if(in->cnf->ipv4_broadcast.v4.s_addr)
            {
-             fprintf(fd, "    Ip4Broadcast\t %s\n\n", inet_ntoa(in->cnf->ipv4_broadcast.v4));
+             fprintf(fd, "    Ip4Broadcast\t%s\n\n", inet_ntoa(in->cnf->ipv4_broadcast.v4));
            }
          else
            {
@@ -356,12 +345,11 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
 int
 olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
 {
-  struct local_hna_entry   *h  = cnf->hna_entries;
+  struct ip_prefix_list   *h  = cnf->hna_entries;
   struct olsr_if           *in = cnf->interfaces;
   struct plugin_entry      *pe = cnf->plugins;
   struct plugin_param      *pp;
-  struct ipc_host          *ih = cnf->ipc_hosts;
-  struct ipc_net           *ie = cnf->ipc_nets;
+  struct ip_prefix_list    *ie = cnf->ipc_nets;
   struct olsr_lq_mult      *mult;
 
   int size = 0;
@@ -384,7 +372,7 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
   WRITE_TO_BUF("# IP version to use (4 or 6)\n\nIpVersion\t%d\n\n", cnf->ip_version == AF_INET ? 4 : 6);
 
   /* HNA IPv4 and IPv6 */
-  WRITE_TO_BUF("# HNA IPv%1$d routes\n# syntax: netaddr netmask\n\nHna%1$d\n{\n", cnf->ip_version == AF_INET ? 4 : 6);
+  WRITE_TO_BUF("# HNA IPv%1$d routes\n# syntax: netaddr netmask\n\nHna%1$d {\n", cnf->ip_version == AF_INET ? 4 : 6);
   while(h) {
     struct ipaddr_str strbuf;
     WRITE_TO_BUF("    %s ", olsr_ip_to_string(&strbuf, &h->net.prefix));
@@ -412,29 +400,27 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
 
   /* RtTable */
   WRITE_TO_BUF("# Policy Routing Tableto use. Default is 254\n\n");
-  WRITE_TO_BUF("RtTable\t%d\n\n", cnf->rttable);
+  WRITE_TO_BUF("RtTable\t\t%d\n\n", cnf->rttable);
 
   /* Willingness */
   WRITE_TO_BUF("# The fixed willingness to use(0-7)\n# If not set willingness will be calculated\n# dynammically based on battery/power status\n\n");
   if(cnf->willingness_auto)
     WRITE_TO_BUF("#Willingness\t4\n\n");
   else
-    WRITE_TO_BUF("Willingness%d\n\n", cnf->willingness);
+    WRITE_TO_BUF("Willingness\t%d\n\n", cnf->willingness);
 
   /* IPC */
   WRITE_TO_BUF("# Allow processes like the GUI front-end\n# to connect to the daemon.\n\n");
-  WRITE_TO_BUF("IpcConnect\n{\n");
-  WRITE_TO_BUF("   MaxConnections  %d\n", cnf->ipc_connections);
-
-  while(ih)
-    {
-      WRITE_TO_BUF("   Host          %s\n", inet_ntoa(ih->host.v4));
-      ih = ih->next;
-    }
+  WRITE_TO_BUF("IpcConnect {\n");
+  WRITE_TO_BUF("    MaxConnections\t%d\n", cnf->ipc_connections);
   while(ie)
     {
-      WRITE_TO_BUF("   Net           %s ", inet_ntoa(ie->net.v4));
-      WRITE_TO_BUF("%s\n", inet_ntoa(ie->mask.v4));
+      struct ipaddr_str strbuf;
+      if (ie->net.prefix_len == olsr_cnf->maxplen) {
+          WRITE_TO_BUF("    Host\t\t%s\n", olsr_ip_to_string(&strbuf, &ie->net.prefix));
+      } else {
+          WRITE_TO_BUF("    Net\t\t\t%s/%d\n", olsr_ip_to_string(&strbuf, &ie->net.prefix), ie->net.prefix_len);
+      }
       ie = ie->next;
     }
 
@@ -491,7 +477,7 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
     {
       while(pe)
        {
-         WRITE_TO_BUF("LoadPlugin \"%s\"\n{\n", pe->name);
+         WRITE_TO_BUF("LoadPlugin \"%s\" {\n", pe->name);
           pp = pe->params;
           while(pp)
             {
@@ -516,7 +502,7 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
       olsr_bool first = OLSR_TRUE;
       while(in)
        {
-         WRITE_TO_BUF("Interface \"%s\"\n{\n", in->name);
+         WRITE_TO_BUF("Interface \"%s\" {\n", in->name);
 
           if(first)
             WRITE_TO_BUF("    # IPv4 broadcast address to use. The\n    # one usefull example would be 255.255.255.255\n    # If not defined the broadcastaddress\n    # every card is configured with is used\n\n");
@@ -524,7 +510,7 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
 
          if(in->cnf->ipv4_broadcast.v4.s_addr)
            {
-             WRITE_TO_BUF("    Ip4Broadcast\t %s\n", inet_ntoa(in->cnf->ipv4_broadcast.v4));
+             WRITE_TO_BUF("    Ip4Broadcast\t%s\n", inet_ntoa(in->cnf->ipv4_broadcast.v4));
            }
          else
            {
index b0a8e7f..6711a93 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_conf.c,v 1.62 2007/11/22 11:43:36 bernd67 Exp $
+ * $Id: olsrd_conf.c,v 1.63 2007/11/29 00:49:40 bernd67 Exp $
  */
 
 
+#include "olsrd_conf.h"
+#include "ipcalc.h"
+#include "olsr_cfg.h"
+#include "defs.h"
+#include "net_olsr.h"
+#include "olsr.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
-#include "olsrd_conf.h"
-#include "olsr_cfg.h"
-#include "defs.h"
-#include "net_olsr.h"
-
 
 extern FILE *yyin;
 extern int yyparse(void);
@@ -361,7 +363,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
 void
 olsrd_free_cnf(struct olsrd_config *cnf)
 {
-  struct local_hna_entry   *hd,   *h = cnf->hna_entries;
+  struct ip_prefix_list   *hd,   *h = cnf->hna_entries;
   struct olsr_if           *ind, *in = cnf->interfaces;
   struct plugin_entry      *ped, *pe = cnf->plugins;
   struct olsr_lq_mult      *mult, *next_mult;
@@ -516,11 +518,10 @@ get_default_if_config(void)
 void
 olsrd_print_cnf(struct olsrd_config *cnf)
 {
-  struct local_hna_entry   *h  = cnf->hna_entries;
+  struct ip_prefix_list   *h  = cnf->hna_entries;
   struct olsr_if           *in = cnf->interfaces;
   struct plugin_entry      *pe = cnf->plugins;
-  struct ipc_host          *ih = cnf->ipc_hosts;
-  struct ipc_net           *ie = cnf->ipc_nets;
+  struct ip_prefix_list    *ie = cnf->ipc_nets;
   struct olsr_lq_mult      *mult;
   char ipv6_buf[100];             /* buffer for IPv6 inet_htop */
 
@@ -543,17 +544,14 @@ olsrd_print_cnf(struct olsrd_config *cnf)
     printf("Willingness      : %d\n", cnf->willingness);
 
   printf("IPC connections  : %d\n", cnf->ipc_connections);
-
-  while(ih)
-    {
-      printf("\tHost %s\n", inet_ntoa(ih->host.v4));
-      ih = ih->next;
-    }
-  
   while(ie)
     {
-      printf("\tNet %s/", inet_ntoa(ie->net.v4));
-      printf("%s\n", inet_ntoa(ie->mask.v4));
+      struct ipaddr_str strbuf;
+      if (ie->net.prefix_len == olsr_cnf->maxplen) {
+          printf("\tHost %s\n", olsr_ip_to_string(&strbuf, &ie->net.prefix));
+      } else {
+          printf("\tNet %s/%d\n", olsr_ip_to_string(&strbuf, &ie->net.prefix), ie->net.prefix_len);
+      }
       ie = ie->next;
     }
 
@@ -640,30 +638,6 @@ olsrd_print_cnf(struct olsrd_config *cnf)
     printf("Not using hysteresis\n");
   }
 
-#if 0
-  /* HNA IPv4 */
-  if(h4)
-    {
-
-      printf("HNA4 entries:\n");
-      while(h4)
-       {
-         printf("\t%s/", inet_ntoa(h4->net.v4));
-         printf("%s\n", inet_ntoa(h4->netmask.v4));
-         h4 = h4->next;
-       }
-    }
-
-  /* HNA IPv6 */
-  if(h6)
-    {
-      printf("HNA6 entries:\n");
-      while(h6)
-       {
-         printf("\t%s/%d\n", inet_ntop(AF_INET6, &h6->net.v6, ipv6_buf, sizeof(ipv6_buf)), h6->prefix_len);
-         h6 = h6->next;
-       }
-#else
   /* HNA IPv4 and IPv6 */
   if(h) {
     printf("HNA%d entries:\n", cnf->ip_version == AF_INET ? 4 : 6);
@@ -678,7 +652,6 @@ olsrd_print_cnf(struct olsrd_config *cnf)
         printf("%d\n", h->net.prefix_len);
       }
       h = h->next;
-#endif
     }
   }
 }
@@ -715,3 +688,53 @@ void win32_stdio_hack(unsigned int handle)
   setbuf(stderr, NULL);
 }
 #endif
+
+void ip_prefix_list_add(struct ip_prefix_list **list,
+                        const union olsr_ip_addr *net,
+                        olsr_u8_t prefix_len)
+{
+  struct ip_prefix_list *new_entry = olsr_malloc(sizeof(*new_entry), "Add local HNA entry");
+  
+  new_entry->net.prefix = *net;
+  new_entry->net.prefix_len = prefix_len;
+
+  /* Queue */
+  new_entry->next = *list;
+  *list = new_entry;
+}
+
+int ip_prefix_list_remove(struct ip_prefix_list **list,
+                          const union olsr_ip_addr *net,
+                          olsr_u8_t prefix_len)
+{
+  struct ip_prefix_list *h = *list, *prev = NULL;
+
+  while (h != NULL) {
+    if (ipequal(net, &h->net.prefix) && h->net.prefix_len == prefix_len) {
+      /* Dequeue */
+      if (prev == NULL) {
+        *list = h->next;
+      } else {
+        prev->next = h->next;
+      }
+      free(h);
+      return 1;
+    }
+    prev = h;
+    h = h->next;
+  }
+  return 0;
+}
+
+struct ip_prefix_list *ip_prefix_list_find(struct ip_prefix_list *list,
+                                           const union olsr_ip_addr *net,
+                                           olsr_u8_t prefix_len)
+{
+  struct ip_prefix_list *h;
+  for (h = list; h != NULL; h = h->next) {
+    if (prefix_len == h->net.prefix_len && ipequal(net, &h->net.prefix)) {
+      return h;
+    }
+  }
+  return NULL;
+}
index 8c59c5f..92096b6 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: oparse.y,v 1.39 2007/11/22 11:43:36 bernd67 Exp $
+ * $Id: oparse.y,v 1.40 2007/11/29 00:49:40 bernd67 Exp $
  */
 
 
+#include "olsrd_conf.h"
+#include "../defs.h"
+#include "../ipcalc.h"
+#include "../net_olsr.h"
+
 #include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <arpa/inet.h>
 #include <string.h>
 
-#include "olsrd_conf.h"
-#include "../defs.h"
-#include "../net_olsr.h"
-
 #define PARSER_DEBUG 0
 
 #if PARSER_DEBUG
@@ -71,6 +72,7 @@ int yylex(void);
 static int ifs_in_curr_cfg = 0;
 
 static int lq_mult_helper(YYSTYPE ip_addr_arg, YYSTYPE mult_arg);
+static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg);
 
 static int lq_mult_helper(YYSTYPE ip_addr_arg, YYSTYPE mult_arg)
 {
@@ -87,7 +89,7 @@ static int lq_mult_helper(YYSTYPE ip_addr_arg, YYSTYPE mult_arg)
   memset(&addr, 0, sizeof(addr));
 
   if (ip_addr_arg != NULL &&
-     inet_pton(olsr_cnf->ip_version, ip_addr_arg->string, &addr) < 0) {
+     inet_pton(olsr_cnf->ip_version, ip_addr_arg->string, &addr) <= 0) {
     fprintf(stderr, "Cannot parse IP address %s.\n", ip_addr_arg->string);
     return -1;
   }
@@ -119,8 +121,35 @@ static int lq_mult_helper(YYSTYPE ip_addr_arg, YYSTYPE mult_arg)
 
   return 0;
 }
+
+static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
+{
+  union olsr_ip_addr ipaddr;
+  PARSER_DEBUG_PRINTF("HNA IPv6 entry: %s/%d\n", ipaddr_arg->string, prefixlen_arg->integer);
+
+  if(inet_pton(AF_INET6, ipaddr_arg->string, &ipaddr) <= 0) {
+    fprintf(stderr, "ihna6entry: Failed converting IP address %s\n", ipaddr_arg->string);
+    return 1;
+  }
+
+  if (prefixlen_arg->integer > 128) {
+    fprintf(stderr, "ihna6entry: Illegal IPv6 prefix length %d\n", prefixlen_arg->integer);
+    return 1;
+  }
+
+  /* Queue */
+  ip_prefix_list_add(&olsr_cnf->hna_entries, &ipaddr, prefixlen_arg->integer);
+
+  free(ipaddr_arg->string);
+  free(ipaddr_arg);
+  free(prefixlen_arg);
+
+  return 0;
+}
+
 %}
 
+%token TOK_SLASH
 %token TOK_OPEN
 %token TOK_CLOSE
 
@@ -301,50 +330,65 @@ imaxipc: TOK_MAXIPC TOK_INTEGER
 
 ipchost: TOK_HOSTLABEL TOK_IP4_ADDR
 {
-  struct ipc_host *ipch = malloc(sizeof(struct ipc_host));
-
+  union olsr_ip_addr ipaddr;
   PARSER_DEBUG_PRINTF("\tIPC host: %s\n", $2->string);
   
-  if (inet_aton($2->string, &ipch->host.v4) == 0) {
+  if (inet_aton($2->string, &ipaddr.v4) == 0) {
     fprintf(stderr, "Failed converting IP address IPC %s\n", $2->string);
-    free(ipch);
-    return -1;
+    YYABORT;
   }
 
-  ipch->next = olsr_cnf->ipc_hosts;
-  olsr_cnf->ipc_hosts = ipch;
+  ip_prefix_list_add(&olsr_cnf->ipc_nets, &ipaddr, olsr_cnf->maxplen);
 
   free($2->string);
   free($2);
-
 }
 ;
 
 ipcnet: TOK_NETLABEL TOK_IP4_ADDR TOK_IP4_ADDR
 {
-  struct ipc_net *ipcn = malloc(sizeof(struct ipc_net));
+  union olsr_ip_addr ipaddr, netmask;
+
   PARSER_DEBUG_PRINTF("\tIPC net: %s/%s\n", $2->string, $3->string);
   
-  if (inet_aton($2->string, &ipcn->net.v4) == 0) {
+  if (inet_pton(AF_INET, $2->string, &ipaddr.v4) == 0) {
     fprintf(stderr, "Failed converting IP net IPC %s\n", $2->string);
-    free(ipcn);
-    return -1;
+    YYABORT;
   }
 
-  if (inet_aton($3->string, &ipcn->mask.v4) == 0) {
+  if (inet_pton(AF_INET, $3->string, &netmask.v4) == 0) {
     fprintf(stderr, "Failed converting IP mask IPC %s\n", $3->string);
-    free(ipcn);
-    return -1;
+    YYABORT;
   }
 
-  ipcn->next = olsr_cnf->ipc_nets;
-  olsr_cnf->ipc_nets = ipcn;
+  ip_prefix_list_add(&olsr_cnf->ipc_nets, &ipaddr, olsr_netmask_to_prefix(&netmask));
 
   free($2->string);
   free($2);
   free($3->string);
   free($3);
+}
+        |       TOK_NETLABEL TOK_IP4_ADDR TOK_SLASH TOK_INTEGER
+{
+  union olsr_ip_addr ipaddr;
+
+  PARSER_DEBUG_PRINTF("\tIPC net: %s/%s\n", $2->string, $3->string);
+  
+  if (inet_pton(AF_INET, $2->string, &ipaddr.v4) == 0) {
+    fprintf(stderr, "Failed converting IP net IPC %s\n", $2->string);
+    YYABORT;
+  }
+
+  if ($4->integer > olsr_cnf->maxplen) {
+    fprintf(stderr, "ipcnet: Prefix len %u > %d is not allowed!\n", $4->integer, olsr_cnf->maxplen);
+    YYABORT;
+  }
+
+  ip_prefix_list_add(&olsr_cnf->ipc_nets, &ipaddr, $4->integer);
 
+  free($2->string);
+  free($2);
+  free($4);
 }
 ;
 
@@ -377,7 +421,7 @@ isetip4br: TOK_IP4BROADCAST TOK_IP4_ADDR
 
   if (inet_aton($2->string, &in) == 0) {
     fprintf(stderr, "isetip4br: Failed converting IP address %s\n", $2->string);
-    return -1;
+    YYABORT;
   }
 
   while (ifcnt) {
@@ -425,9 +469,9 @@ isetip6mults: TOK_IP6MULTISITE TOK_IP6_ADDR
 
   PARSER_DEBUG_PRINTF("\tIPv6 site-local multicast: %s\n", $2->string);
 
-  if (inet_pton(AF_INET6, $2->string, &in6) < 0) {
+  if (inet_pton(AF_INET6, $2->string, &in6) <= 0) {
     fprintf(stderr, "isetip6mults: Failed converting IP address %s\n", $2->string);
-    return -1;
+    YYABORT;
   }
 
   while (ifcnt) {
@@ -451,9 +495,9 @@ isetip6multg: TOK_IP6MULTIGLOBAL TOK_IP6_ADDR
 
   PARSER_DEBUG_PRINTF("\tIPv6 global multicast: %s\n", $2->string);
 
-  if (inet_pton(AF_INET6, $2->string, &in6) < 0) {
+  if (inet_pton(AF_INET6, $2->string, &in6) <= 0) {
     fprintf(stderr, "isetip6multg: Failed converting IP address %s\n", $2->string);
-    return -1;
+    YYABORT;
   }
 
   while (ifcnt) {
@@ -667,77 +711,77 @@ iipversion:    TOK_IPVERSION TOK_INTEGER
 }
 ;
 
-
 ihna4entry:     TOK_IP4_ADDR TOK_IP4_ADDR
 {
-  struct local_hna_entry *h = malloc(sizeof(*h));
-  union olsr_ip_addr netmask;
+  union olsr_ip_addr ipaddr, netmask;
 
   PARSER_DEBUG_PRINTF("HNA IPv4 entry: %s/%s\n", $1->string, $2->string);
 
-  if (h == NULL) {
-    fprintf(stderr, "Out of memory(HNA4)\n");
+  if (inet_pton(AF_INET, $1->string, &ipaddr.v4) <= 0) {
+    fprintf(stderr, "ihna4entry: Failed converting IP address %s\n", $1->string);
     YYABORT;
   }
-
-  if (inet_aton($1->string, &h->net.prefix.v4) == 0) {
+  if (inet_pton(AF_INET, $2->string, &netmask.v4) <= 0) {
     fprintf(stderr, "ihna4entry: Failed converting IP address %s\n", $1->string);
-    free(h);
-    return -1;
+    YYABORT;
   }
-  if (inet_aton($2->string, &netmask.v4) == 0) {
-    fprintf(stderr, "ihna4entry: Failed converting IP address %s\n", $1->string);
-    free(h);
-    return -1;
+
+  /* check that the given IP address is actually a network address */
+  if ((ipaddr.v4.s_addr & ~netmask.v4.s_addr) != 0) {
+    fprintf(stderr, "ihna4entry: The ipaddress \"%s\" is not a network address!\n", $1->string);
+    YYABORT;
   }
-  h->net.prefix_len = olsr_netmask_to_prefix(&netmask);
-  h->net.prefix.v4.s_addr &= netmask.v4.s_addr;
 
   /* Queue */
-  h->next = olsr_cnf->hna_entries;
-  olsr_cnf->hna_entries = h;
+  ip_prefix_list_add(&olsr_cnf->hna_entries, &ipaddr, olsr_netmask_to_prefix(&netmask));
 
   free($1->string);
   free($1);
   free($2->string);
   free($2);
-
 }
-;
-
-ihna6entry:     TOK_IP6_ADDR TOK_INTEGER
+        |       TOK_IP4_ADDR TOK_SLASH TOK_INTEGER
 {
-  struct local_hna_entry *h = malloc(sizeof(*h));
+  union olsr_ip_addr ipaddr, netmask;
 
-  PARSER_DEBUG_PRINTF("HNA IPv6 entry: %s/%d\n", $1->string, $2->integer);
+  PARSER_DEBUG_PRINTF("HNA IPv4 entry: %s/%d\n", $1->string, $3->integer);
 
-  if (h == NULL) {
-    fprintf(stderr, "Out of memory(HNA6)\n");
+  if (inet_pton(AF_INET, $1->string, &ipaddr.v4) <= 0) {
+    fprintf(stderr, "ihna4entry: Failed converting IP address %s\n", $1->string);
     YYABORT;
   }
-
-  if(inet_pton(AF_INET6, $1->string, &h->net.prefix.v6) < 0)
-    {
-      fprintf(stderr, "ihna6entry: Failed converting IP address %s\n", $1->string);
-      return -1;
-    }
-
-  if ($2->integer > 128) {
-    fprintf(stderr, "ihna6entry: Illegal IPv6 prefix length %d\n", $2->integer);
-    free(h);
-    return -1;
+  if ($3->integer > olsr_cnf->maxplen) {
+    fprintf(stderr, "ihna4entry: Prefix len %u > %d is not allowed!\n", $3->integer, olsr_cnf->maxplen);
+    YYABORT;
   }
 
-  h->net.prefix_len = $2->integer;
+  /* check that the given IP address is actually a network address */
+  olsr_prefix_to_netmask(&netmask, $3->integer);
+  if ((ipaddr.v4.s_addr & ~netmask.v4.s_addr) != 0) {
+    fprintf(stderr, "ihna4entry: The ipaddress \"%s\" is not a network address!\n", $1->string);
+    YYABORT;
+  }
 
   /* Queue */
-  h->next = olsr_cnf->hna_entries;
-  olsr_cnf->hna_entries = h;
+  ip_prefix_list_add(&olsr_cnf->hna_entries, &ipaddr, $3->integer);
 
   free($1->string);
   free($1);
-  free($2);
+  free($3);
+}
+;
 
+ihna6entry:     TOK_IP6_ADDR TOK_INTEGER
+{
+  if (add_ipv6_addr($1, $2)) {
+    YYABORT;
+  }
+}
+        |       TOK_IP6_ADDR TOK_SLASH TOK_INTEGER
+{
+  if (add_ipv6_addr($1, $3)) {
+    YYABORT;
+  }
 }
 ;
 
index 26a3635..c022525 100644 (file)
@@ -38,7 +38,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: oscan.lex,v 1.27 2007/10/10 20:44:34 bernd67 Exp $
+ * $Id: oscan.lex,v 1.28 2007/11/29 00:49:40 bernd67 Exp $
  */
 
 
@@ -164,6 +164,11 @@ IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{
     return TOK_COMMENT;
 }
 
+\/ {
+    yylval = NULL;
+    return TOK_SLASH;
+}
+
 \{ {
     yylval = NULL;
     return TOK_OPEN;
@@ -199,7 +204,6 @@ IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{
     }
     return TOK_IP4_ADDR;
 }
-
 {IPV6ADDR} {
     yylval = get_string_token(yytext, yyleng + 1);
     if (yylval == NULL) {
index 0bdd508..23d9ee4 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: duplicate_set.c,v 1.19 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: duplicate_set.c,v 1.20 2007/11/29 00:49:38 bernd67 Exp $
  */
 
-
-
-#include "defs.h"
+#include "ipcalc.h"
 #include "duplicate_set.h"
 #include "scheduler.h"
 #include "olsr.h"
index c303265..5505efe 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: hna_set.c,v 1.25 2007/11/16 22:56:54 bernd67 Exp $
+ * $Id: hna_set.c,v 1.26 2007/11/29 00:49:38 bernd67 Exp $
  */
 
+#include "ipcalc.h"
 #include "defs.h"
 #include "olsr.h"
 #include "scheduler.h"
@@ -46,8 +47,6 @@
 
 
 struct hna_entry hna_set[HASHSIZE];
-static size_t netmask_size;
-
 
 /**
  *Initialize the HNA set
@@ -55,18 +54,8 @@ static size_t netmask_size;
 int
 olsr_init_hna_set(void)
 {
-
   int idx;
 
-  if(olsr_cnf->ip_version == AF_INET)
-    {
-      netmask_size = sizeof(olsr_u32_t);
-    }
-  else
-    {
-      netmask_size = sizeof(olsr_u16_t);
-    }
-
   /* Since the holdingtime is assumed to be rather large for 
    * HNA entries, the timeoutfunction is only ran once every second
    */
@@ -81,17 +70,6 @@ olsr_init_hna_set(void)
   return 1;
 }
 
-int
-olsr_get_hna_prefix_len(const struct hna_net *hna)
-{
-  if (olsr_cnf->ip_version == AF_INET) {
-    return olsr_netmask_to_prefix((const union olsr_ip_addr *)&hna->A_netmask.v4);
-  } else {
-    return hna->A_netmask.v6;
-  }
-}
-
-
 /**
  *Lookup a network entry in a networkentry list
  *
@@ -102,21 +80,15 @@ olsr_get_hna_prefix_len(const struct hna_net *hna)
  *@return the localted entry or NULL of not found
  */
 struct hna_net *
-olsr_lookup_hna_net(const struct hna_net *nets, const union olsr_ip_addr *net, const union hna_netmask *mask)
+olsr_lookup_hna_net(const struct hna_net *nets, const union olsr_ip_addr *net, olsr_u8_t prefixlen)
 {
-  struct hna_net *tmp_net;
-
-
+  struct hna_net *tmp;
   /* Loop trough entrys */
-  for(tmp_net = nets->next;
-      tmp_net != nets;
-      tmp_net = tmp_net->next)
-    { 
-      if(ipequal(&tmp_net->A_network_addr, net) &&
-        (memcmp(&tmp_net->A_netmask, mask, netmask_size) == 0))
-       return tmp_net;
+  for (tmp = nets->next; tmp != nets; tmp = tmp->next) { 
+    if (tmp->prefixlen == prefixlen && ipequal(&tmp->A_network_addr, net)) {
+      return tmp;
     }
-  
+  }
   /* Not found */
   return NULL;
 }
@@ -200,7 +172,7 @@ olsr_add_hna_entry(const union olsr_ip_addr *addr)
  *@return the newly created entry
  */
 struct hna_net *
-olsr_add_hna_net(struct hna_entry *hna_gw, const union olsr_ip_addr *net, const union hna_netmask *mask)
+olsr_add_hna_net(struct hna_entry *hna_gw, const union olsr_ip_addr *net, olsr_u8_t prefixlen)
 {
   /* Add the net */
   struct hna_net *new_net = olsr_malloc(sizeof(struct hna_net), "Add HNA net");
@@ -209,7 +181,7 @@ olsr_add_hna_net(struct hna_entry *hna_gw, const union olsr_ip_addr *net, const
   //COPY_IP(&new_net->A_network_addr, net);
   new_net->A_network_addr = *net;
   //memcpy(&new_net->A_netmask, mask, netmask_size);
-  new_net->A_netmask = *mask;
+  new_net->prefixlen = prefixlen;
 
   /* Queue */
   hna_gw->networks.next->prev = new_net;
@@ -237,25 +209,24 @@ olsr_add_hna_net(struct hna_entry *hna_gw, const union olsr_ip_addr *net, const
  *@return nada
  */
 void
-olsr_update_hna_entry(const union olsr_ip_addr *gw, const union olsr_ip_addr *net, const union hna_netmask *mask, const float vtime)
+olsr_update_hna_entry(const union olsr_ip_addr *gw, const union olsr_ip_addr *net, olsr_u8_t prefixlen, const float vtime)
 {
-  struct hna_entry *gw_entry;
+  struct hna_entry *gw_entry = olsr_lookup_hna_gw(gw);
   struct hna_net *net_entry;
 
-  if((gw_entry = olsr_lookup_hna_gw(gw)) == NULL)
+  if (gw_entry == NULL) {
     /* Need to add the entry */
     gw_entry = olsr_add_hna_entry(gw);
-  
-  if((net_entry = olsr_lookup_hna_net(&gw_entry->networks, net, mask)) == NULL)
-    {
-      /* Need to add the net */
-      net_entry = olsr_add_hna_net(gw_entry, net, mask);
-      changes_hna = OLSR_TRUE;
-    }
+  }
+  net_entry = olsr_lookup_hna_net(&gw_entry->networks, net, prefixlen);
+  if (net_entry == NULL)  {
+    /* Need to add the net */
+    net_entry = olsr_add_hna_net(gw_entry, net, prefixlen);
+    changes_hna = OLSR_TRUE;
+  }
 
   /* Update holdingtime */
   net_entry->A_time = GET_TIMESTAMP(vtime*1000);
-
 }
 
 
index 242490b..645fb0a 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: hna_set.h,v 1.16 2007/10/21 20:37:58 bernd67 Exp $
+ * $Id: hna_set.h,v 1.17 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 
 #include "hashing.h"
 #include "olsr_types.h"
 
+#include <time.h>
+
 /* hna_netmask declared in packet.h */
 
 struct hna_net
 {
   union olsr_ip_addr A_network_addr;
-  union hna_netmask  A_netmask;
+  olsr_u8_t          prefixlen;
   clock_t            A_time;
   struct hna_net     *next;
   struct hna_net     *prev;
@@ -72,11 +74,8 @@ extern struct hna_entry hna_set[HASHSIZE];
 int
 olsr_init_hna_set(void);
 
-int
-olsr_get_hna_prefix_len(const struct hna_net *);
-
 struct hna_net *
-olsr_lookup_hna_net(const struct hna_net *, const union olsr_ip_addr *, const union hna_netmask *);
+olsr_lookup_hna_net(const struct hna_net *, const union olsr_ip_addr *, olsr_u8_t);
 
 struct hna_entry *
 olsr_lookup_hna_gw(const union olsr_ip_addr *);
@@ -85,10 +84,10 @@ struct hna_entry *
 olsr_add_hna_entry(const union olsr_ip_addr *);
 
 struct hna_net *
-olsr_add_hna_net(struct hna_entry *, const union olsr_ip_addr *, const union hna_netmask *);
+olsr_add_hna_net(struct hna_entry *, const union olsr_ip_addr *, olsr_u8_t);
 
 void
-olsr_update_hna_entry(const union olsr_ip_addr *, const union olsr_ip_addr *, const union hna_netmask *, const float);
+olsr_update_hna_entry(const union olsr_ip_addr *, const union olsr_ip_addr *, olsr_u8_t, const float);
 
 void
 olsr_time_out_hna_set(void *);
index 9c02d83..0afb18a 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: hysteresis.c,v 1.22 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: hysteresis.c,v 1.23 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 
@@ -47,6 +47,7 @@
 #include "defs.h"
 #include "olsr.h"
 #include "net_olsr.h"
+#include "ipcalc.h"
 
 #define hscaling olsr_cnf->hysteresis_param.scaling
 #define hhigh    olsr_cnf->hysteresis_param.thr_high
index fb51ff1..8b00461 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: interfaces.c,v 1.37 2007/11/16 19:12:55 bernd67 Exp $
+ * $Id: interfaces.c,v 1.38 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 #include "defs.h"
@@ -45,6 +45,7 @@
 #include "scheduler.h"
 #include "olsr.h"
 #include "net_olsr.h"
+#include "ipcalc.h"
 
 static olsr_u32_t if_property_id;
 
index ca1cc2c..2169744 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: ipc_frontend.c,v 1.40 2007/11/20 23:20:23 bernd67 Exp $
+ * $Id: ipc_frontend.c,v 1.41 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 /*
@@ -52,8 +52,8 @@
 #include "log.h"
 #include "parser.h"
 #include "socket_parser.h"
-#include "local_hna_set.h"
 #include "net_olsr.h"
+#include "ipcalc.h"
 
 #ifdef WIN32
 #define close(x) closesocket(x)
@@ -179,27 +179,18 @@ ipc_accept(int fd)
 olsr_bool
 ipc_check_allowed_ip(const union olsr_ip_addr *addr)
 {
-  struct ipc_host *ipch = olsr_cnf->ipc_hosts;
-  struct ipc_net *ipcn = olsr_cnf->ipc_nets;
+  struct ip_prefix_list *ipcn;
 
-  if(addr->v4.s_addr == ntohl(INADDR_LOOPBACK))
+  if(addr->v4.s_addr == ntohl(INADDR_LOOPBACK)) {
     return OLSR_TRUE;
-
-  /* check hosts */
-  while(ipch)
-    {
-        if(ipequal(addr, &ipch->host))
-       return OLSR_TRUE;
-      ipch = ipch->next;
-    }
+  }
 
   /* check nets */
-  while(ipcn)
-    {
-      if((addr->v4.s_addr & ipcn->mask.v4.s_addr) == (ipcn->net.v4.s_addr & ipcn->mask.v4.s_addr))
-       return OLSR_TRUE;
-      ipcn = ipcn->next;
+  for (ipcn = olsr_cnf->ipc_nets; ipcn != NULL; ipcn = ipcn->next) {
+    if (ip_in_net(addr, &ipcn->net)) { 
+      return OLSR_TRUE;
     }
+  }
 
   return OLSR_FALSE;
 }
@@ -255,7 +246,6 @@ frontend_msgparser(union olsr_message *msg, struct interface *in_if __attribute_
     {
       OLSR_PRINTF(1, "(OUTPUT)IPC connection lost!\n");
       CLOSE(ipc_conn);
-      //olsr_cnf->open_ipc = 0;
       ipc_active = OLSR_FALSE;
     }
 }
@@ -280,13 +270,13 @@ ipc_route_send_rtentry(const union olsr_ip_addr *dst,
   struct ipcmsg packet;
   char *tmp;
 
-  if(!olsr_cnf->open_ipc) {
+  if (!olsr_cnf->open_ipc) {
     return -1;
   }
 
-  if(!ipc_active)
+  if (!ipc_active) {
     return 0;
-
+  }
   memset(&packet, 0, sizeof(struct ipcmsg));
   packet.size = htons(IPC_PACK_SIZE);
   packet.msgtype = ROUTE_IPC;
@@ -330,7 +320,6 @@ ipc_route_send_rtentry(const union olsr_ip_addr *dst,
       OLSR_PRINTF(1, "(RT_ENTRY)IPC connection lost!\n");
       CLOSE(ipc_conn);
 
-      //olsr_cnf->open_ipc = 0;
       ipc_active = OLSR_FALSE;
       return -1;
     }
@@ -455,7 +444,6 @@ ipc_send_net_info(int fd)
     {
       OLSR_PRINTF(1, "(NETINFO)IPC connection lost!\n");
       CLOSE(ipc_conn);
-      //olsr_cnf->open_ipc = 0;
       return -1;
     }
 
diff --git a/src/ipcalc.c b/src/ipcalc.c
new file mode 100644 (file)
index 0000000..0e95701
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2007, Bernd Petrovitsch <berndæfirmix.at>
+ * 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: ipcalc.c,v 1.1 2007/11/29 00:49:38 bernd67 Exp $
+ */
+
+#include "ipcalc.h"
+
+int
+prefix_to_netmask(olsr_u8_t *a, int len, olsr_u8_t prefixlen)
+{
+#if !defined(NODEBUG) && defined(DEBUG)
+  struct ipaddr_str buf;
+#endif
+  int p;
+  const olsr_u8_t *a_end;
+
+  a_end = a+len;
+  for (p = prefixlen; a < a_end && p > 8; p -= 8) {
+    *a++ = 0xff;
+  }
+  if (a >= a_end) {
+    return 0;
+  }
+  *a++ = 0xff << (8 - p);
+  while (a < a_end) {
+    *a++ = 0;
+  }
+
+#ifdef DEBUG
+  OLSR_PRINTF(3, "Prefix %d = Netmask: %s\n", prefix, olsr_ip_to_string(&buf, adr));
+#endif
+  return 1;
+}
+
+olsr_u8_t
+netmask_to_prefix(const olsr_u8_t *adr, int len)
+{
+#ifndef NODEBUG
+  struct ipaddr_str buf;
+#endif
+  const olsr_u8_t * const a_end = adr+len;
+  olsr_u16_t prefix = 0;
+  const olsr_u8_t *a;
+  for (a = adr; a < a_end && *a == 0xff; a++) {
+    prefix += 8;
+  }
+  if (a < a_end) {
+    /* handle the last byte */
+    switch (*a) {
+    case   0: prefix += 0; break;
+    case 128: prefix += 1; break;
+    case 192: prefix += 2; break;
+    case 224: prefix += 3; break;
+    case 240: prefix += 4; break;
+    case 248: prefix += 5; break;
+    case 252: prefix += 6; break;
+    case 254: prefix += 7; break;
+    case 255: prefix += 8; break; /* Shouldn't happen */
+    default:
+      OLSR_PRINTF(0, "%s: Got bogus netmask %s\n", __func__, olsr_ip_to_string(&buf, (const union olsr_ip_addr *)adr));
+      prefix = UCHAR_MAX;
+      *(int *)0 = 0;
+      break;
+    }
+  }
+#ifdef DEBUG
+  OLSR_PRINTF(3, "Netmask: %s = Prefix %d\n", olsr_ip_to_string(&buf, (const union olsr_ip_addr *)adr), prefix);
+#endif
+  return prefix;
+}
+
+const char *
+olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix)
+{
+  /* We need for IPv6 an IP address + '/' + prefix and for IPv4 an IP address + '/' + a netmask */
+  static char buf[MAX(INET6_ADDRSTRLEN + 1 + 3, INET_ADDRSTRLEN + 1 + INET_ADDRSTRLEN)];
+  const char *rv;
+
+  if(olsr_cnf->ip_version == AF_INET) {
+    /* IPv4 */
+    int len;
+    union olsr_ip_addr netmask;
+    rv = inet_ntop(AF_INET, &prefix->prefix.v4, buf, sizeof(buf));
+    len = strlen(buf);
+    buf[len++] = '/';
+    olsr_prefix_to_netmask(&netmask, prefix->prefix_len);
+    inet_ntop(AF_INET, &netmask.v4, buf+len, sizeof(buf)-len);
+  } else {
+    /* IPv6 */
+    int len;
+    rv = inet_ntop(AF_INET6, &prefix->prefix.v6, buf, sizeof(buf));
+    len = strlen(buf);
+    buf[len++] = '/';
+    snprintf(buf+len, sizeof(buf)-len, "/%d", prefix->prefix_len);
+  }
+  return rv;
+}
+
+
+/* see if the ipaddr is in the net. That is equivalent to the fact that the net part
+ * of both are equal. So we must compare the first <prefixlen> bits.
+ */
+int ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net)
+{
+  int rv;
+  if(olsr_cnf->ip_version == AF_INET) {
+    olsr_u32_t netmask = ~0 << (32 - net->prefix_len);
+    rv = (ipaddr->v4.s_addr & netmask) == (net->prefix.v4.s_addr & netmask);
+  } else {
+    /* IPv6 */
+    olsr_u32_t netmask;
+    const olsr_u32_t *i = (const olsr_u32_t *)&ipaddr->v6;
+    const olsr_u32_t *n = (const olsr_u32_t *)&net->prefix.v6;
+    unsigned int prefix_len;
+    for (prefix_len = net->prefix_len; prefix_len > 32; prefix_len -= 32) {
+      if (*i != *n) {
+        return OLSR_FALSE;
+      }
+      i++;
+      n++;
+    }
+    netmask = ~0 << (32 - prefix_len);
+    rv = (*i & netmask) == (*n & netmask);
+  }
+  return rv;
+}
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * End:
+ */
diff --git a/src/ipcalc.h b/src/ipcalc.h
new file mode 100644 (file)
index 0000000..5d4ab63
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2007, Bernd Petrovitsch <berndæfirmix.at>
+ * 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: ipcalc.h,v 1.1 2007/11/29 00:49:38 bernd67 Exp $
+ */
+
+#ifndef _IPCALC
+#define _IPCALC
+
+#include "olsr_types.h"
+#include "defs.h"
+
+#include <arpa/inet.h>
+
+struct ipaddr_str {
+    char buf[MAX(INET6_ADDRSTRLEN, INET_ADDRSTRLEN)];
+};
+
+/*
+ * Macros for comparing and copying IP addresses
+ */
+static INLINE int ip4cmp(const struct in_addr *a, const struct in_addr *b) { return a->s_addr > b->s_addr ? +1 : a->s_addr < b->s_addr ? -1 : 0; }
+static INLINE int ip4equal(const struct in_addr *a, const struct in_addr *b) { return a->s_addr == b->s_addr; }
+
+static INLINE int ip6cmp(const struct in6_addr *a, const struct in6_addr *b) { return memcmp(a, b, sizeof(*a)); }
+static INLINE int ip6equal(const struct in6_addr *a, const struct in6_addr *b) { return ip6cmp(a, b) == 0; }
+
+#if 0
+static INLINE int ipcmp(const union olsr_ip_addr *a, const union olsr_ip_addr *b) { return olsr_cnf->ip_version == AF_INET ? ip4cmp(&a->v4, &b->v4) : ip6cmp(&a->v6, &b->v6); }
+#endif
+static INLINE int ipequal(const union olsr_ip_addr *a, const union olsr_ip_addr *b) { return olsr_cnf->ip_version == AF_INET ? ip4equal(&a->v4, &b->v4) : ip6equal(&a->v6, &b->v6); }
+
+/* Do not use this - this is as evil as the COPY_IP() macro was and only used in
+ * source which also needs cleanups.
+ */
+static INLINE void genipcopy(void *dst, const void *src) { memcpy(dst, src, olsr_cnf->ipsize); }
+
+int ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net);
+
+
+int prefix_to_netmask(olsr_u8_t *, int, olsr_u8_t);
+
+static INLINE int olsr_prefix_to_netmask(union olsr_ip_addr *adr, olsr_u8_t prefixlen) { return prefix_to_netmask(adr->v6.s6_addr, olsr_cnf->ipsize, prefixlen); }
+
+olsr_u8_t netmask_to_prefix(const olsr_u8_t *, int);
+
+static INLINE olsr_u8_t olsr_netmask_to_prefix(const union olsr_ip_addr *adr) { return netmask_to_prefix(adr->v6.s6_addr, olsr_cnf->ipsize); }
+
+static INLINE olsr_u8_t olsr_netmask4_to_prefix(const olsr_u32_t *a) { return netmask_to_prefix((const olsr_u8_t *)a, sizeof(*a)); }
+static INLINE olsr_u8_t olsr_netmask6_to_prefix(const struct in6_addr *a) { return netmask_to_prefix((const olsr_u8_t *)a, sizeof(*a)); }
+
+static INLINE const char *ip4_to_string(struct ipaddr_str * const buf, const struct in_addr addr4) { return inet_ntop(AF_INET, &addr4, buf->buf, sizeof(buf->buf)); }
+
+static INLINE const char *ip6_to_string(struct ipaddr_str * const buf, const struct in6_addr * const addr6) {  return inet_ntop(AF_INET6, addr6, buf->buf, sizeof(buf->buf)); }
+
+static INLINE const char *olsr_ip_to_string(struct ipaddr_str * const buf, const union olsr_ip_addr *addr) { return inet_ntop(olsr_cnf->ip_version, addr, buf->buf, sizeof(buf->buf)); }
+
+const char *olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix);
+
+static INLINE const char *sockaddr4_to_string(struct ipaddr_str * const buf, const struct sockaddr * const addr) { const struct sockaddr_in * const addr4 = (const struct sockaddr_in *)addr; return ip4_to_string(buf, addr4->sin_addr); }
+
+
+#endif
index e8b424b..5f7c397 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: link_set.c,v 1.77 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: link_set.c,v 1.78 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 
@@ -54,6 +54,7 @@
 #include "scheduler.h"
 #include "lq_route.h"
 #include "net_olsr.h"
+#include "ipcalc.h"
 
 
 static clock_t hold_time_neighbor;
index 67c6f06..e1134e2 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.35 2007/11/08 22:47:42 bernd67 Exp $
+ * $Id: net.c,v 1.36 2007/11/29 00:49:40 bernd67 Exp $
  */
 
 
@@ -45,6 +45,7 @@
  */
 
 #include "net.h"
+#include "../ipcalc.h"
 #include "../defs.h"
 #include "../net_os.h"
 #include "../parser.h"
diff --git a/src/local_hna_set.c b/src/local_hna_set.c
deleted file mode 100644 (file)
index 405f606..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * 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: local_hna_set.c,v 1.16 2007/11/08 22:47:41 bernd67 Exp $
- */
-
-#include "defs.h"
-#include "local_hna_set.h"
-#include "olsr.h"
-#include "net_olsr.h"
-
-void
-add_local_hna4_entry(const union olsr_ip_addr *net, const union olsr_ip_addr *mask)
-{
-  struct local_hna_entry *new_entry = olsr_malloc(sizeof(struct local_hna_entry), "Add local HNA entry 4");
-  
-  new_entry->net.prefix.v4 = net->v4;
-  new_entry->net.prefix_len = olsr_netmask_to_prefix(mask);
-
-  /* Queue */
-  new_entry->next = olsr_cnf->hna_entries;
-  olsr_cnf->hna_entries = new_entry;
-}
-
-
-void
-add_local_hna6_entry(const union olsr_ip_addr *net, const olsr_u16_t prefix_len)
-{
-  struct local_hna_entry *new_entry = olsr_malloc(sizeof(struct local_hna_entry), "Add local HNA entry 6");
-  
-  memcpy(&new_entry->net, net, sizeof(struct in6_addr));
-  new_entry->net.prefix_len = prefix_len;
-
-  /* Queue */
-  new_entry->next = olsr_cnf->hna_entries;
-  olsr_cnf->hna_entries = new_entry;
-}
-
-
-int
-remove_local_hna4_entry(const union olsr_ip_addr *net, const union olsr_ip_addr *mask)
-{
-  struct local_hna_entry *h = olsr_cnf->hna_entries, *prev = NULL;
-  const olsr_u16_t prefix_len = olsr_netmask_to_prefix(mask);
-
-  while(h)
-    {
-      if((net->v4.s_addr == h->net.prefix.v4.s_addr) && 
-        (mask->v4.s_addr == prefix_len))
-       {
-         /* Dequeue */
-         if(prev == NULL)
-           olsr_cnf->hna_entries = h->next;
-         else
-           prev->next = h->next;
-
-         free(h);
-         return 1;
-       }
-      prev = h;
-      h = h->next;
-    }
-
-  return 0;
-}
-
-
-
-int
-remove_local_hna6_entry(const union olsr_ip_addr *net, const olsr_u16_t prefix_len)
-{
-  struct local_hna_entry *h = olsr_cnf->hna_entries, *prev = NULL;
-
-  while (h)
-    {
-      if((memcmp(net, &h->net.prefix, olsr_cnf->ipsize) == 0) && 
-        (prefix_len == h->net.prefix_len))
-       {
-         /* Dequeue */
-         if (prev == NULL)
-           olsr_cnf->hna_entries = h->next;
-         else
-           prev->next = h->next;
-         free(h);
-         return 1;
-       }
-      prev = h;
-      h = h->next;
-    }
-  return 0;
-}
-
-struct local_hna_entry *
-find_local_hna4_entry(const union olsr_ip_addr *net, const olsr_u32_t mask)
-{
-  struct local_hna_entry *h = olsr_cnf->hna_entries;
-  const union olsr_ip_addr ip_addr = { .v4 = { .s_addr = mask } };
-  const olsr_u16_t prefix_len = olsr_netmask_to_prefix(&ip_addr);
-  while(h)
-    {
-      if((net->v4.s_addr == h->net.prefix.v4.s_addr) && 
-        (prefix_len == h->net.prefix_len))
-       {
-         return h;
-       }
-      h = h->next;
-    }
-
-  return NULL;
-}
-
-
-
-struct local_hna_entry *
-find_local_hna6_entry(const union olsr_ip_addr *net, const olsr_u16_t prefix_len)
-{
-  struct local_hna_entry *h = olsr_cnf->hna_entries;
-  while(h)
-    {
-      if((memcmp(net, &h->net.prefix, olsr_cnf->ipsize) == 0) && 
-        (prefix_len == h->net.prefix_len))
-       {
-         return h;
-       }
-      h = h->next;
-    }
-
-  return NULL;
-}
-
-
-
-
-int
-check_inet_gw(void)
-{
-  if(olsr_cnf->ip_version == AF_INET)
-    {
-      struct local_hna_entry *h;
-      for(h = olsr_cnf->hna_entries; h != NULL; h = h->next)
-       {
-         if(h->net.prefix_len == 0 && h->net.prefix.v4.s_addr == 0)
-           return 1;
-       }
-    }
-  return 0;
-
-}
diff --git a/src/local_hna_set.h b/src/local_hna_set.h
deleted file mode 100644 (file)
index ae3dbfa..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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: local_hna_set.h,v 1.12 2007/11/05 15:32:55 bernd67 Exp $
- */
-
-
-
-#ifndef _OLSR_HNA_LOCAL
-#define _OLSR_HNA_LOCAL
-
-#include "olsr_types.h"
-
-void
-add_local_hna4_entry(const union olsr_ip_addr *, const union olsr_ip_addr *);
-
-void
-add_local_hna6_entry(const union olsr_ip_addr *, const olsr_u16_t);
-
-int
-remove_local_hna4_entry(const union olsr_ip_addr *, const union olsr_ip_addr *);
-
-int
-remove_local_hna6_entry(const union olsr_ip_addr *, const olsr_u16_t);
-
-struct local_hna_entry *
-find_local_hna4_entry(const union olsr_ip_addr *net, const olsr_u32_t mask);
-
-struct local_hna_entry *
-find_local_hna6_entry(const union olsr_ip_addr *net, const olsr_u16_t prefix_len);
-
-int
-check_inet_gw(void);
-
-#endif
index b86cff7..d509bd3 100755 (executable)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_avl.c,v 1.17 2007/11/18 20:35:59 bernd67 Exp $
+ * $Id: lq_avl.c,v 1.18 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 #include <stddef.h>
 #include <time.h>
 #include <string.h>
 
+#include "ipcalc.h"
 #include "lq_avl.h"
 #include "net_olsr.h"
 
index e3b30be..ff2076f 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_packet.c,v 1.32 2007/11/29 00:24:00 bernd67 Exp $
+ * $Id: lq_packet.c,v 1.33 2007/11/29 00:49:38 bernd67 Exp $
  */
 
+#include "ipcalc.h"
 #include "olsr_protocol.h"
 #include "defs.h"
 #include "lq_packet.h"
index dfe4365..795745a 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_route.c,v 1.60 2007/11/16 22:56:54 bernd67 Exp $
+ * $Id: lq_route.c,v 1.61 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 #define SPF_PROFILING 1
 
+#include "ipcalc.h"
 #include "defs.h"
 #include "olsr.h"
 #include "tc_set.h"
@@ -312,7 +313,7 @@ olsr_calculate_routing_table (void)
 {
   struct avl_tree cand_tree;
   struct list_node path_list;
-  int i, plen, path_count = 0;
+  int i, path_count = 0;
   struct tc_entry *tc;
   struct tc_edge_entry *tc_edge;
   struct tc_entry *vert;
@@ -463,12 +464,11 @@ olsr_calculate_routing_table (void)
       for (hna = hna_gw->networks.next;
            hna != &hna_gw->networks;
            hna = hna->next) {
-
-        plen = olsr_get_hna_prefix_len(hna);
-        if (vert->path_etx != INFINITE_ETX)
-        olsr_insert_routing_table(&hna->A_network_addr, plen, &vert->addr,
-                                  &link->neighbor_iface_addr, inter->if_index,
-                                  vert->hops, vert->path_etx);
+        if (vert->path_etx != INFINITE_ETX) {
+          olsr_insert_routing_table(&hna->A_network_addr, hna->prefixlen, &vert->addr,
+                                    &link->neighbor_iface_addr, inter->if_index,
+                                    vert->hops, vert->path_etx);
+        }
       }
     }
   }
index 3323b03..b634d75 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: main.c,v 1.105 2007/11/25 13:08:54 bernd67 Exp $
+ * $Id: main.c,v 1.106 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 #include <unistd.h>
@@ -44,6 +44,7 @@
 #include <sys/stat.h>
 #include <assert.h>
 
+#include "ipcalc.h"
 #include "defs.h"
 #include "olsr.h"
 #include "log.h"
index 2899318..27d5e0c 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: mid_set.c,v 1.24 2007/11/29 00:10:17 bernd67 Exp $
+ * $Id: mid_set.c,v 1.25 2007/11/29 00:49:38 bernd67 Exp $
  */
 
+#include "ipcalc.h"
 #include "defs.h"
 #include "two_hop_neighbor_table.h"
 #include "mid_set.h"
index 3a4b8d6..a6a777d 100644 (file)
--- a/src/mpr.c
+++ b/src/mpr.c
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: mpr.c,v 1.20 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: mpr.c,v 1.21 2007/11/29 00:49:38 bernd67 Exp $
  */
 
+#include "ipcalc.h"
 #include "defs.h"
 #include "mpr.h"
 #include "two_hop_neighbor_table.h"
index fec7917..7c92dcc 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: mpr_selector_set.c,v 1.20 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: mpr_selector_set.c,v 1.21 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 
+#include "ipcalc.h"
 #include "defs.h"
 #include "mpr_selector_set.h"
 #include "olsr.h"
index c7658b1..3baf33a 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: neighbor_table.c,v 1.35 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: neighbor_table.c,v 1.36 2007/11/29 00:49:38 bernd67 Exp $
  */
 
-
-
+#include "ipcalc.h"
 #include "defs.h"
 #include "two_hop_neighbor_table.h"
 #include "mid_set.h"
index a42c785..f4a8abd 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net_olsr.c,v 1.36 2007/11/20 23:16:17 bernd67 Exp $
+ * $Id: net_olsr.c,v 1.37 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 #include "net_olsr.h"
+#include "ipcalc.h"
 #include "log.h"
 #include "olsr.h"
 #include "net_os.h"
@@ -448,172 +449,6 @@ net_output(struct interface *ifp)
   return retval;
 }
 
-
-/**
- * Create a IPv4 or IPv6 netmask based on a prefix length
- *
- * @param allocated address to build the netmask in
- * @param prefix the prefix length
- *
- * @returns 1 on success 0 on failure
- */
-int
-olsr_prefix_to_netmask(union olsr_ip_addr *adr, const olsr_u16_t prefix)
-{
-#if !defined(NODEBUG) && defined(DEBUG)
-  struct ipaddr_str buf;
-#endif
-  int p;
-  const olsr_u8_t * const a_end = adr->v6.s6_addr+olsr_cnf->ipsize;
-  olsr_u8_t *a;
-
-  if (adr == NULL) {
-    return 0;
-  }
-
-  a = adr->v6.s6_addr;
-  for (p = prefix; a < a_end && p > 8; p -= 8) {
-    *a++ = 0xff;
-  }
-  *a++ = 0xff << (8 - p);
-  while (a < a_end) {
-    *a++ = 0;
-  }
-
-#ifdef DEBUG
-  OLSR_PRINTF(3, "Prefix %d = Netmask: %s\n", prefix, olsr_ip_to_string(&buf, adr));
-#endif
-  return 1;
-}
-
-
-
-/**
- * Calculate prefix length based on a netmask
- *
- * @param adr the address to use to calculate the prefix length
- *
- * @return the prefix length
- */
-olsr_u16_t
-olsr_netmask_to_prefix(const union olsr_ip_addr *adr)
-{
-#ifndef NODEBUG
-  struct ipaddr_str buf;
-#endif
-  olsr_u16_t prefix = 0;
-  const olsr_u8_t * const a_end = adr->v6.s6_addr+olsr_cnf->ipsize;
-  const olsr_u8_t *a;
-
-  for (a = adr->v6.s6_addr; a < a_end && *a == 0xff; a++) {
-    prefix += 8;
-  }
-  if (a < a_end) {
-    /* handle the last byte */
-    switch (*a) {
-    case   0: prefix += 0; break;
-    case 128: prefix += 1; break;
-    case 192: prefix += 2; break;
-    case 224: prefix += 3; break;
-    case 240: prefix += 4; break;
-    case 248: prefix += 5; break;
-    case 252: prefix += 6; break;
-    case 254: prefix += 7; break;
-    case 255: prefix += 8; break; /* Shouldn't happen */
-    default:
-      OLSR_PRINTF(0, "%s: Got bogus netmask %s\n", __func__, olsr_ip_to_string(&buf, adr));    
-      prefix = USHRT_MAX;
-      break;
-    }
-  }
-#ifdef DEBUG
-  OLSR_PRINTF(3, "Netmask: %s = Prefix %d\n", olsr_ip_to_string(&buf, adr), prefix);
-#endif
-  return prefix;
-}
-
-/**
- *Converts a sockaddr struct to a string representing
- *the IP address from the sockaddr struct
- *
- *@param address_to_convert the sockaddr struct to "convert"
- *@return a char pointer to the string containing the IP
- */
-const char *
-sockaddr_to_string(struct ipaddr_str * const buf, const struct sockaddr * const addr)
-{
-    const struct sockaddr_in * const addr4 = (const struct sockaddr_in *)addr;
-    return ip4_to_string(buf, addr4->sin_addr);
-}
-
-/**
- *Converts the 32bit olsr_u32_t datatype to
- *a char array.
- *
- *@param address the olsr_u32_t to "convert"
- *@return a char pointer to the string containing the IP
- */
-const char *
-ip4_to_string(struct ipaddr_str * const buf, const struct in_addr addr4)
-{
-    return inet_ntop(AF_INET, &addr4, buf->buf, sizeof(buf->buf));
-}
-
-/**
- *Converts the 32bit olsr_u32_t datatype to
- *a char array.
- *
- *@param addr6 the address to "convert"
- *@return a char pointer to the string containing the IP
- */
-const char *
-ip6_to_string(struct ipaddr_str * const buf, const struct in6_addr * const addr6)
-{
-  return inet_ntop(AF_INET6, addr6, buf->buf, sizeof(buf->buf));
-}
-
-const char *
-olsr_ip_to_string(struct ipaddr_str * const buf, const union olsr_ip_addr *addr)
-{
-#if 0
-    if (!addr) {
-        return "null";
-    }
-#endif
-    return inet_ntop(olsr_cnf->ip_version, addr, buf->buf, sizeof(buf->buf));
-}
-
-const char *
-olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix)
-{
-  /* We need for IPv6 an IP address + '/' + prefix and for IPv4 an IP address + '/' + a netmask */
-  static char buf[MAX(INET6_ADDRSTRLEN + 1 + 3, INET_ADDRSTRLEN + 1 + INET_ADDRSTRLEN)];
-  const char *rv;
-
-  if (prefix == NULL) {
-      return "null";
-  }
-  
-  if(olsr_cnf->ip_version == AF_INET) {
-    int len;
-    union olsr_ip_addr netmask;
-    rv = inet_ntop(AF_INET, &prefix->prefix.v4, buf, sizeof(buf));
-    len = strlen(buf);
-    buf[len++] = '/';
-    olsr_prefix_to_netmask(&netmask, prefix->prefix_len);
-    inet_ntop(AF_INET, &netmask.v4, buf+len, sizeof(buf)-len);
-  } else {
-    int len;
-    /* IPv6 */
-    rv = inet_ntop(AF_INET6, &prefix->prefix.v6, buf, sizeof(buf));
-    len = strlen(buf);
-    buf[len++] = '/';
-    snprintf(buf+len, sizeof(buf)-len, "/%d", prefix->prefix_len);
-  }
-  return rv;
-}
-
-
 void
 olsr_add_invalid_address(const union olsr_ip_addr *adr)
 {
index 9126367..4885e23 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net_olsr.h,v 1.18 2007/11/25 21:23:29 bernd67 Exp $
+ * $Id: net_olsr.h,v 1.19 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 
@@ -44,7 +44,7 @@
 #ifndef _NET_OLSR
 #define _NET_OLSR
 
-#include "defs.h"
+#include "olsr_types.h"
 #include "interfaces.h"
 #include "process_routes.h"
 
 
 typedef int (*packet_transform_function)(olsr_u8_t *, int *);
 
-struct ipaddr_str {
-    char buf[MAX(INET6_ADDRSTRLEN, INET_ADDRSTRLEN)];
-};
-
-/*
- * Macros for comparing and copying IP addresses
- */
-static INLINE int ip4cmp(const struct in_addr *a, const struct in_addr *b) { return a->s_addr > b->s_addr ? +1 : a->s_addr < b->s_addr ? -1 : 0; }
-static INLINE int ip4equal(const struct in_addr *a, const struct in_addr *b) { return a->s_addr == b->s_addr; }
-
-static INLINE int ip6cmp(const struct in6_addr *a, const struct in6_addr *b) { return memcmp(a, b, sizeof(*a)); }
-static INLINE int ip6equal(const struct in6_addr *a, const struct in6_addr *b) { return ip6cmp(a, b) == 0; }
-
-#if 0
-static INLINE int ipcmp(const union olsr_ip_addr *a, const union olsr_ip_addr *b) { return olsr_cnf->ip_version == AF_INET ? ip4cmp(&a->v4, &b->v4) : ip6cmp(&a->v6, &b->v6); }
-#endif
-static INLINE int ipequal(const union olsr_ip_addr *a, const union olsr_ip_addr *b) { return olsr_cnf->ip_version == AF_INET ? ip4equal(&a->v4, &b->v4) : ip6equal(&a->v6, &b->v6); }
-
-/* Do not use this - this is as evil as the COPY_IP() macro was and only used in
- * source which also needs cleanups.
- */
-static INLINE void genipcopy(void *dst, const void *src) { memcpy(dst, src, olsr_cnf->ipsize); }
-
-
 void
 net_set_disp_pack_out(olsr_bool);
 
@@ -111,30 +87,6 @@ int
 net_sendroute(struct rt_entry *, struct sockaddr *);
 
 int
-olsr_prefix_to_netmask(union olsr_ip_addr *, const olsr_u16_t);
-
-olsr_u16_t
-olsr_netmask_to_prefix(const union olsr_ip_addr *);
-
-const char *
-sockaddr_to_string(struct ipaddr_str * const , const struct sockaddr *);
-
-const char *
-ip4_to_string(struct ipaddr_str * const buf, const struct in_addr);
-
-const char *
-ip6_to_string(struct ipaddr_str * const buf, const struct in6_addr * const addr6);
-
-const char *
-olsr_ip_to_string(struct ipaddr_str * const buf, const union olsr_ip_addr *);
-
-const char *
-sockaddr_to_string(struct ipaddr_str * const buf, const struct sockaddr *);
-
-const char *
-olsr_ip_prefix_to_string(const struct olsr_ip_prefix *prefix);
-
-int
 add_ptf(packet_transform_function);
 
 int
index af1b520..ef37a96 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004, Andreas TÃ\83¸nnesen(andreto@olsr.org)
+ * Copyright (c) 2004, Andreas TÃ?¸nnesen(andreto@olsr.org)
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without 
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr_cfg.h,v 1.39 2007/11/25 21:38:13 bernd67 Exp $
+ * $Id: olsr_cfg.h,v 1.40 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 
@@ -146,10 +146,10 @@ struct olsr_if
   struct olsr_if           *next;
 };
 
-struct local_hna_entry
+struct ip_prefix_list
 {
   struct olsr_ip_prefix    net;
-  struct local_hna_entry  *next;
+  struct ip_prefix_list    *next;
 };
 
 struct hyst_param
@@ -173,18 +173,6 @@ struct plugin_entry
   struct plugin_entry      *next;
 };
 
-struct ipc_host
-{
-  union olsr_ip_addr       host;
-  struct ipc_host          *next;
-};
-
-struct ipc_net
-{
-  union olsr_ip_addr       net;
-  union olsr_ip_addr       mask;
-  struct ipc_net           *next;
-};
 
 /*
  * The config struct
@@ -206,9 +194,8 @@ struct olsrd_config
   olsr_bool                use_hysteresis;
   struct hyst_param        hysteresis_param;
   struct plugin_entry      *plugins;
-  struct local_hna_entry   *hna_entries;
-  struct ipc_host          *ipc_hosts;
-  struct ipc_net           *ipc_nets;
+  struct ip_prefix_list    *hna_entries;
+  struct ip_prefix_list    *ipc_nets;
   struct olsr_if           *interfaces;
   float                    pollrate;
   float                    nic_chgs_pollrate;
@@ -244,6 +231,18 @@ struct olsrd_config
 extern "C" {
 #endif
 
+
+/*
+ * List functions
+ */
+
+void ip_prefix_list_add(struct ip_prefix_list **, const union olsr_ip_addr *, olsr_u8_t);
+
+int ip_prefix_list_remove(struct ip_prefix_list **, const union olsr_ip_addr *, olsr_u8_t);
+
+struct ip_prefix_list *ip_prefix_list_find(struct ip_prefix_list *, const union olsr_ip_addr *net, olsr_u8_t prefix_len);
+
+
 /*
  * Interface to parser
  */
index 4a6a137..037f2c1 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr_types.h,v 1.12 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: olsr_types.h,v 1.13 2007/11/29 00:49:38 bernd67 Exp $
  */
 
 /*
@@ -74,6 +74,7 @@ typedef int32_t         olsr_32_t;
 /* IPv6 address format in6_addr */
 #include <netinet/in.h>
 
+
 union olsr_ip_addr {
   struct in_addr v4;
   struct in6_addr v6;
@@ -84,9 +85,4 @@ struct olsr_ip_prefix {
   olsr_u8_t prefix_len;
 };
 
-union hna_netmask {
-  olsr_u32_t v4;
-  olsr_u16_t v6;
-};
-
 #endif
index e7222a6..d5c975e 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: packet.c,v 1.26 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: packet.c,v 1.27 2007/11/29 00:49:39 bernd67 Exp $
  */
 
 
+#include "ipcalc.h"
 #include "defs.h"
 #include "link_set.h"
 #include "mpr_selector_set.h"
index f4c1b9f..39b1dbb 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: packet.h,v 1.18 2007/11/18 21:58:32 bernd67 Exp $
+ * $Id: packet.h,v 1.19 2007/11/29 00:49:39 bernd67 Exp $
  */
 
 #ifndef _OLSR_PACKET
@@ -101,7 +101,7 @@ struct tc_message
 struct hna_net_addr
 {
   union olsr_ip_addr  net;
-  union hna_netmask   netmask; /* IPv4 netmask */
+  olsr_u8_t           prefixlen;
   struct hna_net_addr *next;
 };
 
index 02c57f1..5870846 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: parser.c,v 1.37 2007/11/29 00:24:00 bernd67 Exp $
+ * $Id: parser.c,v 1.38 2007/11/29 00:49:39 bernd67 Exp $
  */
 
 #include "parser.h"
+#include "ipcalc.h"
 #include "defs.h"
 #include "process_package.h"
 #include "mantissa.h"
index 39e3176..d5dc8cd 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: print_packet.c,v 1.13 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: print_packet.c,v 1.14 2007/11/29 00:49:39 bernd67 Exp $
  */
 
 #include "print_packet.h"
+#include "ipcalc.h"
 #include "mantissa.h"
 #include "defs.h"
 #include "olsr.h"
index 7d82c08..7561c70 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: process_package.c,v 1.46 2007/11/18 22:28:35 bernd67 Exp $
+ * $Id: process_package.c,v 1.47 2007/11/29 00:49:39 bernd67 Exp $
  */
 
-
-#include "defs.h"
 #include "process_package.h"
+#include "ipcalc.h"
+#include "defs.h"
 #include "lq_packet.h"
 #include "hysteresis.h"
 #include "two_hop_neighbor_table.h"
@@ -53,9 +53,9 @@
 #include "duplicate_set.h"
 #include "rebuild_packet.h"
 #include "scheduler.h"
-#include "local_hna_set.h"
 #include "net_olsr.h"
 
+
 static void process_message_neighbors(struct neighbor_entry *, const struct hello_message *);
 
 static void linking_this_2_entries(struct neighbor_entry *, struct neighbor_2_entry *, float);
@@ -708,9 +708,8 @@ olsr_process_received_hna(union olsr_message *m,
 
     while (hna_tmp) {
       /* Don't add an HNA entry that we are advertising ourselves. */
-      if (!find_local_hna4_entry(&hna_tmp->net, hna_tmp->netmask.v4) &&
-          !find_local_hna6_entry(&hna_tmp->net, hna_tmp->netmask.v6)) {
-        olsr_update_hna_entry(&message.originator, &hna_tmp->net, &hna_tmp->netmask, (float)message.vtime);
+      if (!ip_prefix_list_find(olsr_cnf->hna_entries, &hna_tmp->net, hna_tmp->prefixlen)) {
+        olsr_update_hna_entry(&message.originator, &hna_tmp->net, hna_tmp->prefixlen, message.vtime);
       }
 
       hna_tmp = hna_tmp->next;
index ea23fce..cdd508a 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: process_routes.c,v 1.40 2007/11/29 00:18:53 bernd67 Exp $
+ * $Id: process_routes.c,v 1.41 2007/11/29 00:49:39 bernd67 Exp $
  */
 
+#include "ipcalc.h"
 #include "defs.h"
 #include "olsr.h"
 #include "log.h"
@@ -166,12 +167,10 @@ olsr_delete_kernel_route(struct rt_entry *rt)
 
     if(error < 0) {
       const char * const err_msg = strerror(errno);
+      const char * const routestr = olsr_rt_to_string(rt);
+      OLSR_PRINTF(1, "KERN: ERROR deleting %s: %s\n", routestr, err_msg);
 
-      OLSR_PRINTF(1, "KERN: ERROR deleting %s: %s\n",
-                  olsr_rt_to_string(rt), err_msg);
-
-      olsr_syslog(OLSR_LOG_ERR, "Delete route: %s", err_msg);
-
+      olsr_syslog(OLSR_LOG_ERR, "Delete route %s: %s", routestr, err_msg);
     }
   }
 }
@@ -191,10 +190,10 @@ olsr_add_kernel_route(struct rt_entry *rt)
 
     if(error < 0) {
       const char * const err_msg = strerror(errno);
-      OLSR_PRINTF(1, "KERN: ERROR adding %s: %s\n",
-                  olsr_rtp_to_string(rt->rt_best), err_msg);
+      const char * const routestr = olsr_rtp_to_string(rt->rt_best);
+      OLSR_PRINTF(1, "KERN: ERROR adding %s: %s\n", routestr, err_msg);
 
-      olsr_syslog(OLSR_LOG_ERR, "Add route: %s", err_msg);
+      olsr_syslog(OLSR_LOG_ERR, "Add route %s: %s", routestr, err_msg);
     } else {
 
       /* route addition has suceeded */
index 7964a7c..84de244 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: rebuild_packet.c,v 1.25 2007/11/16 22:56:54 bernd67 Exp $
+ * $Id: rebuild_packet.c,v 1.26 2007/11/29 00:49:39 bernd67 Exp $
  */
 
 
 #include "rebuild_packet.h"
+#include "ipcalc.h"
 #include "defs.h"
 #include "olsr.h"
 #include "mid_set.h"
@@ -93,17 +94,15 @@ hna_chgestruct(struct hna_message *hmsg, const union olsr_message *m)
       tmp_pairs = NULL;
       hna_pairs = NULL;
 
-      for(i = 0; i < no_pairs; i++)
-       {         
+      for(i = 0; i < no_pairs; i++) {    
          hna_pairs = olsr_malloc(sizeof(struct hna_net_addr), "HNA chgestruct");
          
          //COPY_IP(&hna_pairs->net, &haddr->addr);
           hna_pairs->net.v4.s_addr = haddr->addr;
          //COPY_IP(&hna_pairs->netmask, &haddr->netmask);
-          hna_pairs->netmask.v4 = haddr->netmask;
+          hna_pairs->prefixlen = olsr_netmask4_to_prefix(&haddr->netmask);
 
-         hna_pairs->next = tmp_pairs;
-         
+         hna_pairs->next = tmp_pairs;    
          tmp_pairs = hna_pairs;
          haddr++;
        }
@@ -138,7 +137,7 @@ hna_chgestruct(struct hna_message *hmsg, const union olsr_message *m)
          
          //COPY_IP(&hna_pairs->net, &haddr6->addr);
          hna_pairs->net.v6 = haddr6->addr;
-         hna_pairs->netmask.v6 = olsr_netmask_to_prefix((const union olsr_ip_addr *)&haddr6->netmask);
+          hna_pairs->prefixlen = olsr_netmask6_to_prefix(&haddr6->netmask);
 
          hna_pairs->next = tmp_pairs;
          
index 82cb8be..d50e945 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: routing_table.c,v 1.35 2007/11/14 11:03:52 bernd67 Exp $
+ * $Id: routing_table.c,v 1.36 2007/11/29 00:49:39 bernd67 Exp $
  */
 
+#include "routing_table.h"
+#include "ipcalc.h"
 #include "defs.h"
 #include "two_hop_neighbor_table.h"
 #include "tc_set.h"
@@ -47,7 +49,6 @@
 #include "neighbor_table.h"
 #include "olsr.h"
 #include "link_set.h"
-#include "routing_table.h"
 #include "lq_avl.h"
 #include "lq_route.h"
 #include "net_olsr.h"
@@ -521,7 +522,7 @@ olsr_calculate_hna_routes(void)
         if (rt != NULL) {
           /* update if better */
           olsr_insert_routing_table(&tmp_net->A_network_addr,
-                                    olsr_get_hna_prefix_len(tmp_net),
+                                    tmp_net->prefixlen,
                                     &tmp_hna->A_gateway_addr,
                                     &rt->rt_best->rtp_nexthop.gateway,
                                     rt->rt_best->rtp_nexthop.iif_index,
index 8e55cda..0d0ba4e 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: tc_set.c,v 1.37 2007/11/16 21:43:55 bernd67 Exp $
+ * $Id: tc_set.c,v 1.38 2007/11/29 00:49:39 bernd67 Exp $
  */
 
 #include "tc_set.h"
+#include "ipcalc.h"
 #include "mid_set.h"
 #include "link_set.h"
 #include "olsr.h"
index 19ebe3c..9ce1a6c 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: two_hop_neighbor_table.c,v 1.20 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: two_hop_neighbor_table.c,v 1.21 2007/11/29 00:49:39 bernd67 Exp $
  */
 
-
-
-#include "defs.h"
 #include "two_hop_neighbor_table.h"
+#include "ipcalc.h"
+#include "defs.h"
 #include "mid_set.h"
 #include "neighbor_table.h"
 #include "net_olsr.h"
index 8921e1c..d792679 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: ifnet.c,v 1.53 2007/11/08 22:47:42 bernd67 Exp $
+ * $Id: ifnet.c,v 1.54 2007/11/29 00:49:40 bernd67 Exp $
  */
 
 
@@ -44,8 +44,9 @@
 #define ifr_netmask ifr_addr
 #endif
 
-#include "interfaces.h"
 #include "ifnet.h"
+#include "ipcalc.h"
+#include "interfaces.h"
 #include "defs.h"
 #include "olsr.h"
 #include "net_os.h"
@@ -319,7 +320,7 @@ chk_if_changed(struct olsr_if *iface)
        }
 
 #ifdef DEBUG
-      OLSR_PRINTF(3, "\tAddress:%s\n", sockaddr_to_string(&buf, &ifr.ifr_addr));
+      OLSR_PRINTF(3, "\tAddress:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_addr));
 #endif
 
       if(memcmp(&((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr,
@@ -329,7 +330,7 @@ chk_if_changed(struct olsr_if *iface)
          /* New address */
          OLSR_PRINTF(1, "IPv4 address changed for %s\n", ifr.ifr_name);
          OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_addr.sin_addr));
-         OLSR_PRINTF(1, "\tNew:%s\n", sockaddr_to_string(&buf, &ifr.ifr_addr));
+         OLSR_PRINTF(1, "\tNew:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_addr));
 
          ifp->int_addr = *(struct sockaddr_in *)&ifr.ifr_addr;
 
@@ -337,8 +338,8 @@ chk_if_changed(struct olsr_if *iface)
                    &ifp->ip_addr,
                    olsr_cnf->ipsize) == 0)
            {
-             OLSR_PRINTF(1, "New main address: %s\n", sockaddr_to_string(&buf, &ifr.ifr_addr));
-             olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", sockaddr_to_string(&buf, &ifr.ifr_addr));
+             OLSR_PRINTF(1, "New main address: %s\n", sockaddr4_to_string(&buf, &ifr.ifr_addr));
+             olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", sockaddr4_to_string(&buf, &ifr.ifr_addr));
              memcpy(&olsr_cnf->main_addr, 
                     &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr, 
                     olsr_cnf->ipsize);
@@ -359,7 +360,7 @@ chk_if_changed(struct olsr_if *iface)
        }
 
 #ifdef DEBUG
-      OLSR_PRINTF(3, "\tNetmask:%s\n", sockaddr_to_string(&buf, &ifr.ifr_netmask));
+      OLSR_PRINTF(3, "\tNetmask:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_netmask));
 #endif
 
       if(memcmp(&((struct sockaddr_in *)&ifp->int_netmask)->sin_addr.s_addr,
@@ -372,7 +373,7 @@ chk_if_changed(struct olsr_if *iface)
          /* New address */
          OLSR_PRINTF(1, "IPv4 netmask changed for %s\n", ifr.ifr_name);
          OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_netmask.sin_addr));
-         OLSR_PRINTF(1, "\tNew:%s\n", sockaddr_to_string(&buf, &ifr.ifr_netmask));
+         OLSR_PRINTF(1, "\tNew:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_netmask));
 
          ifp->int_netmask = *(struct sockaddr_in *)&ifr.ifr_netmask;
 
@@ -389,7 +390,7 @@ chk_if_changed(struct olsr_if *iface)
            }
          
 #ifdef DEBUG
-         OLSR_PRINTF(3, "\tBroadcast address:%s\n", sockaddr_to_string(&buf, &ifr.ifr_broadaddr));
+         OLSR_PRINTF(3, "\tBroadcast address:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_broadaddr));
 #endif
          
          if(ifp->int_broadaddr.sin_addr.s_addr != ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr.s_addr)
@@ -400,7 +401,7 @@ chk_if_changed(struct olsr_if *iface)
              /* New address */
              OLSR_PRINTF(1, "IPv4 broadcast changed for %s\n", ifr.ifr_name);
              OLSR_PRINTF(1, "\tOld:%s\n", ip4_to_string(&buf, ifp->int_broadaddr.sin_addr));
-             OLSR_PRINTF(1, "\tNew:%s\n", sockaddr_to_string(&buf, &ifr.ifr_broadaddr));
+             OLSR_PRINTF(1, "\tNew:%s\n", sockaddr4_to_string(&buf, &ifr.ifr_broadaddr));
              
              ifp->int_broadaddr = *(struct sockaddr_in *)&ifr.ifr_broadaddr;
              if_changes = 1;