Keep all HNAs stored (even if the collide with local HNAs), just don't add the routes
authorHenning Rogge <hrogge@googlemail.com>
Sat, 8 May 2010 19:52:00 +0000 (21:52 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 8 May 2010 19:52:00 +0000 (21:52 +0200)
src/cfgparser/olsrd_conf.c
src/hna_set.c
src/olsr_spf.c

index dcb3b0c..66a52be 100644 (file)
@@ -993,6 +993,9 @@ static void update_has_gateway_fields(void) {
     olsr_cnf->has_ipv4_gateway |= ip_prefix_is_v4_inetgw(&h->net) || ip_prefix_is_mappedv4_inetgw(&h->net);
     olsr_cnf->has_ipv6_gateway |= ip_prefix_is_v6_inetgw(&h->net);
   }
+
+  /* force routing table upgrade */
+  olsr_calculate_routing_table(true);
 }
 
 void
index 99548f7..6f28400 100644 (file)
@@ -435,8 +435,6 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
   while (curr < curr_end) {
     struct olsr_ip_prefix prefix;
     union olsr_ip_addr mask;
-
-    struct ip_prefix_list *entry;
     struct interface *ifs;
     bool stop = false;
 
@@ -469,11 +467,7 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
       continue;
     }
 #endif
-    entry = ip_prefix_list_find(olsr_cnf->hna_entries, &prefix.prefix, prefix.prefix_len);
-    if (entry == NULL) {
-      /* only update if it's not from us */
-      olsr_update_hna_entry(&originator, &prefix.prefix, prefix.prefix_len, vtime);
-    }
+    olsr_update_hna_entry(&originator, &prefix.prefix, prefix.prefix_len, vtime);
   }
   /* Forward the message */
   return true;
index 10fffb4..386b5b8 100644 (file)
@@ -470,6 +470,11 @@ olsr_calculate_routing_table(bool force)
 
       rtp = rtp_prefix_tree2rtp(rtp_tree_node);
 
+      if (ip_prefix_list_find(olsr_cnf->hna_entries, &rtp->rtp_dst.prefix, rtp->rtp_dst.prefix_len)) {
+        /* do not add HNAs that collide with local entries to global RIB */
+        continue;
+      }
+
       if (rtp->rtp_rt) {
 
         /*