* applied patches from Sebastian Hagen <sebastian_hagen@memespace.net>
authorBernd Petrovitsch <bernd@firmix.at>
Thu, 14 Dec 2006 11:29:20 +0000 (11:29 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Thu, 14 Dec 2006 11:29:20 +0000 (11:29 +0000)
src/build_msg.c
src/hysteresis.c
src/hysteresis.h
src/link_set.c
src/link_set.h
src/lq_route.c
src/mid_set.c
src/parser.c
src/process_routes.c
src/routing_table.c

index 8f0c2d4..f8cb817 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: build_msg.c,v 1.32 2006/01/07 08:16:19 kattemat Exp $
+ * $Id: build_msg.c,v 1.33 2006/12/14 11:29:19 bernd67 Exp $
  */
 
 
@@ -921,7 +921,8 @@ serialize_mid4(struct interface *ifp)
   m->v4.olsr_msgsize = htons(curr_size);
 
   //printf("Sending MID (%d bytes)...\n", outputsize);
-  net_outbuffer_push(ifp, msg_buffer, curr_size);
+  if(curr_size > OLSR_MID_IPV4_HDRSIZE)
+    net_outbuffer_push(ifp, msg_buffer, curr_size);
 
 
   return OLSR_TRUE;
@@ -1018,7 +1019,8 @@ serialize_mid6(struct interface *ifp)
   m->v6.seqno = htons(get_msg_seqno());/* seqnumber */
 
   //printf("Sending MID (%d bytes)...\n", outputsize);
-  net_outbuffer_push(ifp, msg_buffer, curr_size);
+  if(curr_size > OLSR_MID_IPV6_HDRSIZE)
+    net_outbuffer_push(ifp, msg_buffer, curr_size);
 
   return OLSR_TRUE;
 }
index 6a52096..974aaac 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.16 2005/02/27 10:43:38 kattemat Exp $
+ * $Id: hysteresis.c,v 1.17 2006/12/14 11:29:19 bernd67 Exp $
  */
 
 
@@ -162,7 +162,7 @@ olsr_update_hysteresis_hello(struct link_entry *entry, double htime)
 
 
 void
-update_hysteresis_incoming(union olsr_ip_addr *remote, union olsr_ip_addr *local, olsr_u16_t seqno)
+update_hysteresis_incoming(union olsr_ip_addr *remote, struct interface *local, olsr_u16_t seqno)
 {
   struct link_entry *link;
 
index b557189..998a02d 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: hysteresis.h,v 1.7 2005/03/06 19:33:35 kattemat Exp $
+ * $Id: hysteresis.h,v 1.8 2006/12/14 11:29:19 bernd67 Exp $
  */
 
 
@@ -60,6 +60,6 @@ void
 olsr_update_hysteresis_hello(struct link_entry *, double);
 
 void
-update_hysteresis_incoming(union olsr_ip_addr *, union olsr_ip_addr *, olsr_u16_t);
+update_hysteresis_incoming(union olsr_ip_addr *, struct interface *, olsr_u16_t);
 
 #endif
index 4deb6b3..30e7f65 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.63 2006/01/07 08:16:20 kattemat Exp $
+ * $Id: link_set.c,v 1.64 2006/12/14 11:29:19 bernd67 Exp $
  */
 
 
@@ -69,7 +69,7 @@ olsr_time_out_hysteresis(void);
 static void olsr_time_out_packet_loss(void);
 
 static struct link_entry *
-add_new_entry(union olsr_ip_addr *, union olsr_ip_addr *, union olsr_ip_addr *, double, double);
+add_new_entry(union olsr_ip_addr *, union olsr_ip_addr *, union olsr_ip_addr *, double, double, struct interface *);
 
 static void
 olsr_time_out_link_set(void);
@@ -202,7 +202,7 @@ get_neighbor_status(union olsr_ip_addr *address)
 
       //printf("\tChecking %s->", olsr_ip_to_string(&ifs->ip_addr));
       //printf("%s : ", olsr_ip_to_string(main_addr)); 
-      if((link = lookup_link_entry(main_addr, &ifs->ip_addr)) != NULL)
+      if((link = lookup_link_entry(main_addr, ifs)) != NULL)
        {
          //printf("%d\n", lookup_link_status(link));
          if(lookup_link_status(link) == SYM_LINK)
@@ -215,7 +215,7 @@ get_neighbor_status(union olsr_ip_addr *address)
        {
          //printf("\tChecking %s->", olsr_ip_to_string(&ifs->ip_addr));
          //printf("%s : ", olsr_ip_to_string(&aliases->address)); 
-         if((link = lookup_link_entry(&aliases->alias, &ifs->ip_addr)) != NULL)
+         if((link = lookup_link_entry(&aliases->alias, ifs)) != NULL)
            {
              //printf("%d\n", lookup_link_status(link));
 
@@ -271,7 +271,8 @@ get_best_link_to_neighbor(union olsr_ip_addr *remote)
 
       // find the interface for the link - we select the link with the
       // best local interface metric
-      tmp_if = if_ifwithaddr(&walker->local_iface_addr);
+      tmp_if = walker->if_name ? if_ifwithname(walker->if_name) :
+              if_ifwithaddr(&walker->local_iface_addr);
 
       if(!tmp_if)
        continue;
@@ -389,23 +390,16 @@ static void set_loss_link_multiplier(struct link_entry *entry)
  *@param remote_main teh remote nodes main address
  *@param vtime the validity time of the entry
  *@param htime the HELLO interval of the remote node
+ *@param local_if the local interface
  */
 
 static struct link_entry *
-add_new_entry(union olsr_ip_addr *local, union olsr_ip_addr *remote, union olsr_ip_addr *remote_main, double vtime, double htime)
+add_new_entry(union olsr_ip_addr *local, union olsr_ip_addr *remote, union olsr_ip_addr *remote_main, double vtime, double htime, struct interface *local_if)
 {
   struct link_entry *tmp_link_set, *new_link;
   struct neighbor_entry *neighbor;
 
-  tmp_link_set = link_set;
-
-  while(tmp_link_set)
-    {
-      if(COMP_IP(remote, &tmp_link_set->neighbor_iface_addr) &&
-        COMP_IP(local, &tmp_link_set->local_iface_addr))
-       return tmp_link_set;
-      tmp_link_set = tmp_link_set->next;
-    }
+  if((tmp_link_set = lookup_link_entry(remote, local_if))) return tmp_link_set;
 
   /*
    * if there exists no link tuple with
@@ -421,6 +415,15 @@ add_new_entry(union olsr_ip_addr *local, union olsr_ip_addr *remote, union olsr_
   new_link = olsr_malloc(sizeof(struct link_entry), "new link entry");
 
   memset(new_link, 0 , sizeof(struct link_entry));
+  
+  /* copy if_name, if it is defined */
+  if (local_if->int_name)
+    {
+      new_link->if_name = olsr_malloc(strlen(local_if->int_name)+1, "target of if_name in new link entry");
+      strcpy(new_link->if_name, local_if->int_name);
+    } else 
+      new_link->if_name = NULL;
+
   /*
    * L_local_iface_addr = Address of the interface
    * which received the HELLO message
@@ -559,7 +562,7 @@ check_neighbor_link(union olsr_ip_addr *int_addr)
  *@return the link entry if found, NULL if not
  */
 struct link_entry *
-lookup_link_entry(union olsr_ip_addr *remote, union olsr_ip_addr *local)
+lookup_link_entry(union olsr_ip_addr *remote, struct interface *local)
 {
   struct link_entry *tmp_link_set;
 
@@ -568,7 +571,10 @@ lookup_link_entry(union olsr_ip_addr *remote, union olsr_ip_addr *local)
   while(tmp_link_set)
     {
       if(COMP_IP(remote, &tmp_link_set->neighbor_iface_addr) &&
-        COMP_IP(local, &tmp_link_set->local_iface_addr))
+        (tmp_link_set->if_name ?
+         !strcmp(tmp_link_set->if_name, local->int_name) :
+         COMP_IP(&local->ip_addr, &tmp_link_set->local_iface_addr)
+        ))
        return tmp_link_set;
       tmp_link_set = tmp_link_set->next;
     }
@@ -604,7 +610,7 @@ update_link_entry(union olsr_ip_addr *local,
   struct link_entry *entry;
 
   /* Add if not registered */
-  entry = add_new_entry(local, remote, &message->source_addr, message->vtime, message->htime);
+  entry = add_new_entry(local, remote, &message->source_addr, message->vtime, message->htime, in_if);
 
   /* Update ASYM_time */
   //printf("Vtime is %f\n", message->vtime);
@@ -764,7 +770,7 @@ olsr_time_out_link_set()
 
              //olsr_delete_neighbor_if_no_link(&tmp_link_set->neighbor->neighbor_main_addr);
              changes_neighborhood = OLSR_TRUE;
-
+             free(tmp_link_set->if_name);
              free(tmp_link_set);
              tmp_link_set = last_link_entry;
            }
@@ -780,6 +786,7 @@ olsr_time_out_link_set()
 
              changes_neighborhood = OLSR_TRUE;
 
+             free(tmp_link_set->if_name);
              free(tmp_link_set);
              tmp_link_set = link_set;
              continue;
@@ -994,7 +1001,7 @@ void olsr_update_packet_loss_hello_int(struct link_entry *entry,
   entry->loss_hello_int = loss_hello_int;
 }
 
-void olsr_update_packet_loss(union olsr_ip_addr *rem, union olsr_ip_addr *loc,
+void olsr_update_packet_loss(union olsr_ip_addr *rem, struct interface *loc,
                              olsr_u16_t seqno)
 {
   struct link_entry *entry;
index 6fced50..63bb1c4 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: link_set.h,v 1.28 2005/10/23 20:58:14 tlopatic Exp $
+ * $Id: link_set.h,v 1.29 2006/12/14 11:29:19 bernd67 Exp $
  */
 
 
@@ -55,6 +55,7 @@ struct link_entry
 {
   union olsr_ip_addr local_iface_addr;
   union olsr_ip_addr neighbor_iface_addr;
+  char *if_name;
   clock_t SYM_time;
   clock_t ASYM_time;
   clock_t time;
@@ -120,7 +121,7 @@ struct link_entry *
 get_best_link_to_neighbor(union olsr_ip_addr *);
 
 struct link_entry *
-lookup_link_entry(union olsr_ip_addr *, union olsr_ip_addr *);
+lookup_link_entry(union olsr_ip_addr *, struct interface *);
 
 struct link_entry *
 update_link_entry(union olsr_ip_addr *, union olsr_ip_addr *, struct hello_message *, struct interface *);
@@ -139,7 +140,7 @@ void
 olsr_update_packet_loss_hello_int(struct link_entry *, double);
 
 void 
-olsr_update_packet_loss(union olsr_ip_addr *, union olsr_ip_addr *, olsr_u16_t);
+olsr_update_packet_loss(union olsr_ip_addr *, struct interface *, olsr_u16_t);
 
 void 
 olsr_print_link_set(void);
index ab0c311..4bbe3fc 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_route.c,v 1.41 2006/01/07 08:16:20 kattemat Exp $
+ * $Id: lq_route.c,v 1.42 2006/12/14 11:29:20 bernd67 Exp $
  */
 
 #include "defs.h"
@@ -562,8 +562,8 @@ void olsr_calculate_lq_routing_table(void)
     if (link != NULL)
     {
       // find the interface for the found link
-
-      inter = if_ifwithaddr(&link->local_iface_addr);
+      inter = link->if_name ? if_ifwithname(link->if_name) : 
+              if_ifwithaddr(&link->local_iface_addr);
 
       // we may see NULL here if the interface is down, but we have
       // links that haven't timed out, yet
index 4dd6d5c..af60caa 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: mid_set.c,v 1.15 2005/05/29 12:47:45 br1 Exp $
+ * $Id: mid_set.c,v 1.16 2006/12/14 11:29:20 bernd67 Exp $
  */
 
 #include "defs.h"
@@ -51,6 +51,7 @@
 struct mid_entry mid_set[HASHSIZE];
 struct mid_address reverse_mid_set[HASHSIZE];
 
+struct mid_entry *mid_lookup_entry_bymain(union olsr_ip_addr *adr);
 
 /**
  * Initialize the MID set
@@ -204,6 +205,9 @@ void
 insert_mid_alias(union olsr_ip_addr *main_add, union olsr_ip_addr *alias, float vtime)
 {
   struct mid_address *adr;
+  struct neighbor_entry *ne_old, *ne_new;
+  struct mid_entry *me_old;
+  int ne_ref_rp_count;
 
   adr = olsr_malloc(sizeof(struct mid_address), "Insert MID alias");
   
@@ -213,6 +217,28 @@ insert_mid_alias(union olsr_ip_addr *main_add, union olsr_ip_addr *alias, float
   COPY_IP(&adr->alias, alias);
   adr->next_alias = NULL;
   
+  // If we have an entry for this alias in neighbortable, we better adjust it's
+  // main address, because otherwise a fatal inconsistency between
+  // neighbortable and link_set will be created by way of this mid entry.
+  ne_old = olsr_lookup_neighbor_table_alias(alias);
+  if (ne_old != NULL) {
+     OLSR_PRINTF(2, "Remote main address change detected. Mangling neighbortable to replace %s with %s.\n", olsr_ip_to_string(alias), olsr_ip_to_string(main_add));
+     olsr_delete_neighbor_table(alias);
+     ne_new = olsr_insert_neighbor_table(main_add);
+     // adjust pointers to neighbortable-entry in link_set
+     ne_ref_rp_count = replace_neighbor_link_set(ne_old, ne_new);
+     if (ne_ref_rp_count > 0)
+        OLSR_PRINTF(2, "Performed %d neighbortable-pointer replacements (%p -> %p) in link_set.\n", ne_ref_rp_count, ne_old, ne_new);
+     
+     me_old = mid_lookup_entry_bymain(alias);
+     if (me_old) {
+        // we knew aliases to the previous main address; better forget about
+        // them now.
+        OLSR_PRINTF(2, "I already have an mid entry mapping addresses to this alias address. Removing existing mid entry to preserve consistency of mid_set.\n");
+        mid_delete_node(me_old);
+     }
+  }
+  
   insert_mid_tuple(main_add, adr, vtime);
   
   /*
@@ -255,17 +281,13 @@ mid_lookup_main_addr(union olsr_ip_addr *adr)
 }
 
 
-
-
-/*
- *Find all aliases for an address.
+/* Find mid entry to an address.
+ * @param adr the main address to search for
  *
- *@param adr the main address to search for
- *
- *@return a linked list of addresses structs
+ * @return a linked list of address structs
  */
-struct mid_address *
-mid_lookup_aliases(union olsr_ip_addr *adr)
+struct mid_entry *
+mid_lookup_entry_bymain(union olsr_ip_addr *adr)
 {
   struct mid_entry *tmp_list;
   olsr_u32_t hash;
@@ -280,7 +302,7 @@ mid_lookup_aliases(union olsr_ip_addr *adr)
       tmp_list = tmp_list->next)
     {
       if(COMP_IP(&tmp_list->main_addr, adr))
-       return tmp_list->aliases;
+       return tmp_list;
     }
 
 
@@ -288,6 +310,21 @@ mid_lookup_aliases(union olsr_ip_addr *adr)
 }
 
 
+/*
+ *Find all aliases for an address.
+ *
+ *@param adr the main address to search for
+ *
+ *@return a linked list of addresses structs
+ */
+inline struct mid_address *
+mid_lookup_aliases(union olsr_ip_addr *adr)
+{
+  struct mid_entry *tmp = mid_lookup_entry_bymain(adr);
+  return tmp ? tmp->aliases : NULL;
+}
+
+
 /**
  *Update the timer for an entry
  *
index a9070b8..1f804f7 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: parser.c,v 1.30 2006/01/07 08:16:20 kattemat Exp $
+ * $Id: parser.c,v 1.31 2006/12/14 11:29:20 bernd67 Exp $
  */
 
 #include "parser.h"
@@ -201,21 +201,21 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
        {
          /* IPv4 */
          update_hysteresis_incoming(from_addr, 
-                                    &in_if->ip_addr,
+                                    in_if,
                                     ntohs(olsr->olsr_seqno));
        }
       else
        {
          /* IPv6 */
          update_hysteresis_incoming(from_addr, 
-                                    &in_if->ip_addr
+                                    in_if
                                     ntohs(olsr->olsr_seqno));
        }
     }
 
   if (olsr_cnf->lq_level > 0)
     {
-      olsr_update_packet_loss(from_addr, &in_if->ip_addr,
+      olsr_update_packet_loss(from_addr, in_if,
                               ntohs(olsr->olsr_seqno));
     }
   
index bce5008..26f8007 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: process_routes.c,v 1.28 2006/11/01 09:20:13 kattemat Exp $
+ * $Id: process_routes.c,v 1.29 2006/12/14 11:29:20 bernd67 Exp $
  */
 
 
@@ -116,8 +116,8 @@ olsr_find_up_route(struct rt_entry *dst, struct rt_entry *table)
 
 
 /**
- *Create a list containing the entries in in_table
- *that does not exist in from_table
+ *Create a list containing the entries in from_table
+ *that do not exist in in_table
  *
  *@param from_table the table to use
  *@param in_table the routes already added
index 598cfe0..b1b0d49 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: routing_table.c,v 1.23 2005/11/16 23:55:54 tlopatic Exp $
+ * $Id: routing_table.c,v 1.24 2006/12/14 11:29:20 bernd67 Exp $
  */
 
 
@@ -282,7 +282,8 @@ olsr_fill_routing_table_with_neighbors()
 #endif
                  if(link)
                    {
-                     struct interface *iface = if_ifwithaddr(&link->local_iface_addr);
+                     struct interface *iface = link->if_name ? if_ifwithname(link->if_name) :
+                                               if_ifwithaddr(&link->local_iface_addr);
                      if(iface)
                        {
                          olsr_insert_routing_table(&addrs2->alias, 
@@ -396,7 +397,8 @@ olsr_fill_routing_table_with_two_hop_neighbors()
 #endif
                  if(link)
                    {
-                     struct interface *iface = if_ifwithaddr(&link->local_iface_addr);
+                   struct interface *iface = link->if_name ? if_ifwithname(link->if_name) :
+                                               if_ifwithaddr(&link->local_iface_addr);
                      if(iface)
                        {
                          struct rt_entry *new_route_entry =