move avl and list library into src/common
[olsrd.git] / src / olsr.c
index 7a58601..6f638c3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * The olsr.org Optimized Link-State Routing daemon(olsrd)
- * Copyright (c) 2004, Andreas Tø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,6 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr.c,v 1.64 2007/11/29 00:24:00 bernd67 Exp $
  */
 
 /**
@@ -60,7 +59,7 @@
 #include "neighbor_table.h"
 #include "log.h"
 #include "lq_packet.h"
-#include "lq_avl.h"
+#include "common/avl.h"
 #include "net_olsr.h"
 
 #include <stdarg.h>
@@ -160,31 +159,18 @@ olsr_process_changes(void)
       printf("       *** %s (%s on %s) ***\n", olsrd_version, build_date, build_host);
   }
 
-  if (changes_neighborhood)
-    {
-      /* Calculate new mprs, HNA and routing table */
-      if (olsr_cnf->lq_level < 1)
-        {
-          olsr_calculate_mpr();
-        }
-
-      else
-        {
-          olsr_calculate_lq_mpr();
-        }
-
-      olsr_calculate_routing_table();
-      olsr_calculate_hna_routes();
-    }
-  
-  else if (changes_topology || changes_hna)
-    {
-      /* calculate the routing table and HNA */
-
-        olsr_calculate_routing_table();
-        olsr_calculate_hna_routes();
+  if (changes_neighborhood) {
+    if (olsr_cnf->lq_level < 1) {
+      olsr_calculate_mpr();
+    } else {
+      olsr_calculate_lq_mpr();
     }
+  }
 
+  /* calculate the routing table */
+  if (changes_neighborhood || changes_topology || changes_hna) {
+    olsr_calculate_routing_table(NULL);
+  }
   
   if (olsr_cnf->debug_level > 0)
     {      
@@ -201,11 +187,13 @@ olsr_process_changes(void)
               olsr_print_hna_set();
             }
         }
-      
+
+#if 1     
       olsr_print_link_set();
       olsr_print_neighbor_table();
       olsr_print_two_hop_neighbor_table();
       olsr_print_tc_table();
+#endif
     }
 
   for(tmp_pc_list = pcf_list; 
@@ -252,7 +240,7 @@ olsr_init_tables(void)
   olsr_init_link_set();
 
   /* Initialize duplicate table */
-  olsr_init_duplicate_table();
+  olsr_init_duplicate_set();
 
   /* Initialize neighbor table */
   olsr_init_neighbor_table();
@@ -274,6 +262,12 @@ olsr_init_tables(void)
 
   /* Initialize HNA set */
   olsr_init_hna_set();  
+
+  /* Start periodic SPF and RIB recalculation */
+  if (olsr_cnf->lq_dinter > 0.0) {
+    olsr_start_timer((unsigned int)(olsr_cnf->lq_dinter * MSEC_PER_SEC), 5,
+                     OLSR_TIMER_PERIODIC, &olsr_calculate_routing_table, NULL, 0);
+  }
 }
 
 /**
@@ -288,9 +282,6 @@ olsr_init_tables(void)
  */
 int
 olsr_forward_message(union olsr_message *m, 
-                    union olsr_ip_addr *originator, 
-                    olsr_u16_t seqno,
-                    struct interface *in_if, 
                     union olsr_ip_addr *from_addr)
 {
   union olsr_ip_addr *src;
@@ -312,14 +303,6 @@ olsr_forward_message(union olsr_message *m,
     if (2 > m->v6.ttl || 255 < (int)m->v6.hopcnt + (int)m->v6.ttl) return 0;
   }
 
-  if(!olsr_check_dup_table_fwd(originator, seqno, &in_if->ip_addr))
-    {
-#ifdef DEBUG
-      OLSR_PRINTF(3, "Message already forwarded!\n");
-#endif
-      return 0;
-    }
-
   /* Lookup sender address */
   src = mid_lookup_main_addr(from_addr);
   if(!src)
@@ -332,10 +315,6 @@ olsr_forward_message(union olsr_message *m,
   if(neighbor->status != SYM)
     return 0;
 
-  /* Update duplicate table interface */
-  olsr_update_dup_entry(originator, seqno, &in_if->ip_addr);
-
-  
   /* Check MPR */
   if(olsr_lookup_mprs_set(src) == NULL)
     {
@@ -362,9 +341,6 @@ olsr_forward_message(union olsr_message *m,
       m->v6.ttl--; 
     }
 
-  /* Update dup forwarded */
-  olsr_set_dup_forward(originator, seqno);
-
   /* Update packet data */
   msgsize = ntohs(m->v4.olsr_msgsize);
 
@@ -416,9 +392,14 @@ set_buffer_timer(struct interface *ifn)
 void
 olsr_init_willingness(void)
 {
-  if(olsr_cnf->willingness_auto)
-    olsr_register_scheduler_event(&olsr_update_willingness, 
-                                 NULL, olsr_cnf->will_int, olsr_cnf->will_int, NULL);
+  if (olsr_cnf->willingness_auto) {
+
+    /* Run it first and then periodic. */
+    olsr_update_willingness(NULL);
+
+    olsr_start_timer((unsigned int)olsr_cnf->will_int * MSEC_PER_SEC, 5,
+                     OLSR_TIMER_PERIODIC, &olsr_update_willingness, NULL, 0);
+  }
 }
 
 void
@@ -567,25 +548,32 @@ olsr_exit(const char *msg, int val)
 
 
 /**
- *Wrapper for malloc(3) that does error-checking
+ * Wrapper for malloc(3) that does error-checking
  *
- *@param size the number of bytes to allocalte
- *@param caller a string identifying the caller for
- *use in error messaging
+ * @param size the number of bytes to allocalte
+ * @param caller a string identifying the caller for
+ * use in error messaging
  *
- *@return a void pointer to the memory allocated
+ * @return a void pointer to the memory allocated
  */
 void *
 olsr_malloc(size_t size, const char *id)
 {
-  void *ptr = malloc(size);
-  if(ptr == 0) 
-    {
+  void *ptr;
+
+  /*
+   * Not all the callers do a proper cleaning of memory.
+   * Clean it on behalf of those.
+   */
+  ptr = calloc(1, size);
+
+  if (!ptr) {
       const char * const err_msg = strerror(errno);
       OLSR_PRINTF(1, "OUT OF MEMORY: %s\n", err_msg);
       olsr_syslog(OLSR_LOG_ERR, "olsrd: out of memory!: %s\n", err_msg);
       olsr_exit(id, EXIT_FAILURE);
-    }
+  }
+
   return ptr;
 }
 
@@ -608,3 +596,9 @@ olsr_printf(int loglevel, const char *format, ...)
     }
   return 0;
 }
+
+/*
+ * Local Variables:
+ * c-basic-offset: 2
+ * End:
+ */