Various headerfile inclusion cleanups
[olsrd.git] / src / olsr.c
index 54e5e74..6fe5130 100644 (file)
@@ -1,26 +1,42 @@
 /*
- * OLSR ad-hoc routing table management protocol
- * Copyright (C) 2004 Andreas T√łnnesen (andreto@ifi.uio.no)
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
+ * All rights reserved.
  *
- * This file is part of the olsr.org OLSR daemon.
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met:
  *
- * olsr.org is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * * 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.
  *
- * olsr.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * 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.
  *
- * You should have received a copy of the GNU General Public License
- * along with olsr.org; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
- * 
- * $Id: olsr.c,v 1.20 2004/11/09 21:09:58 kattemat Exp $
+ * 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: olsr.c,v 1.42 2005/02/27 18:39:43 kattemat Exp $
  */
 
 /**
 #include "mpr_selector_set.h"
 #include "mid_set.h"
 #include "mpr.h"
-#if defined USE_LINK_QUALITY
 #include "lq_mpr.h"
 #include "lq_route.h"
-#endif
 #include "scheduler.h"
-#include "generate_msg.h"
 #include "apm.h"
+#include "misc.h"
+#include "neighbor_table.h"
+#include "log.h"
 
 #include <stdarg.h>
 #include <signal.h>
 
 
 /**
- *Checks if a timer has timed out.
+ * Process changes functions
  */
 
+struct pcf
+{
+  int (*function)(int, int, int);
+  struct pcf *next;
+};
 
-/**
- *Initiates a "timer", wich is a timeval structure,
- *with the value given in time_value.
- *@param time_value the value to initialize the timer with
- *@param hold_timer the timer itself
- *@return nada
- */
-inline void
-olsr_init_timer(olsr_u32_t time_value, struct timeval *hold_timer)
-{ 
-  olsr_u16_t  time_value_sec;
-  olsr_u16_t  time_value_msec;
-
-  time_value_sec = time_value/1000;
-  time_value_msec = time_value-(time_value_sec*1000);
-
-  hold_timer->tv_sec = time_value_sec;
-  hold_timer->tv_usec = time_value_msec*1000;   
-}
-
-
-
-
-
-/**
- *Generaties a timestamp a certain number of milliseconds
- *into the future.
- *
- *@param time_value how many milliseconds from now
- *@param hold_timer the timer itself
- *@return nada
- */
-inline void
-olsr_get_timestamp(olsr_u32_t delay, struct timeval *hold_timer)
-{ 
-  hold_timer->tv_sec = now.tv_sec + delay / 1000;
-  hold_timer->tv_usec = now.tv_usec + (delay % 1000) * 1000;
-  
-  if (hold_timer->tv_usec > 1000000)
-    {
-      hold_timer->tv_sec++;
-      hold_timer->tv_usec -= 1000000;
-    }
-}
-
+static struct pcf *pcf_list;
 
+static olsr_u16_t message_seqno;
 
 /**
  *Initialize the message sequence number as a random value
@@ -126,7 +104,7 @@ register_pcf(int (*f)(int, int, int))
 {
   struct pcf *new_pcf;
 
-  olsr_printf(1, "Registering pcf function\n");
+  OLSR_PRINTF(1, "Registering pcf function\n")
 
   new_pcf = olsr_malloc(sizeof(struct pcf), "New PCF");
 
@@ -144,7 +122,7 @@ register_pcf(int (*f)(int, int, int))
  *update the routing table.
  *@return 0
  */
-inline void
+void
 olsr_process_changes()
 {
 
@@ -152,27 +130,30 @@ olsr_process_changes()
 
 #ifdef DEBUG
   if(changes_neighborhood)
-    olsr_printf(3, "CHANGES IN NEIGHBORHOOD\n");
+    OLSR_PRINTF(3, "CHANGES IN NEIGHBORHOOD\n")
   if(changes_topology)
-    olsr_printf(3, "CHANGES IN TOPOLOGY\n");
+    OLSR_PRINTF(3, "CHANGES IN TOPOLOGY\n")
   if(changes_hna)
-    olsr_printf(3, "CHANGES IN HNA\n");  
+    OLSR_PRINTF(3, "CHANGES IN HNA\n")
 #endif
-
+  
   if(!changes_neighborhood &&
      !changes_topology &&
      !changes_hna)
     return;
 
-  if(changes_neighborhood)
+  if (olsr_cnf->debug_level > 0 && olsr_cnf->clear_screen && isatty(1))
+  {
+      clear_console();
+      printf("%s", OLSRD_VERSION_DATE);
+  }
+
+  if (changes_neighborhood)
     {
       /* Calculate new mprs, HNA and routing table */
-#if defined USE_LINK_QUALITY
       if (olsr_cnf->lq_level < 1)
         {
-#endif
           olsr_calculate_mpr();
-#if defined USE_LINK_QUALITY
         }
 
       else
@@ -180,85 +161,66 @@ olsr_process_changes()
           olsr_calculate_lq_mpr();
         }
 
-
       if (olsr_cnf->lq_level < 2)
         {
-#endif
           olsr_calculate_routing_table();
-#if defined USE_LINK_QUALITY
+          olsr_calculate_hna_routes();
         }
 
       else
         {
           olsr_calculate_lq_routing_table();
         }
-#endif
-
-      olsr_calculate_hna_routes();
-      
-      /* Print updated info */
-      if(olsr_cnf->debug_level > 0) 
-       {
-#ifdef USE_LINK_QUALITY
-         olsr_print_link_set();
-#endif
-         olsr_print_neighbor_table();
-
-         if(olsr_cnf->debug_level > 1)
-           olsr_print_tc_table();
-
-         if(olsr_cnf->debug_level > 2) 
-           {
-             olsr_print_mprs_set();
-             olsr_print_mid_set();
-             olsr_print_duplicate_table();
-           }
-         if(changes_hna)
-           olsr_print_hna_set();
-
-       }
-      goto process_pcf;  
     }
   
-  if(changes_topology)
+  else if (changes_topology)
     {
       /* calculate the routing table and HNA */
-#if defined USE_LINK_QUALITY
+
       if (olsr_cnf->lq_level < 2)
         {
-#endif
           olsr_calculate_routing_table();
-#if defined USE_LINK_QUALITY
+          olsr_calculate_hna_routes();
         }
 
       else
         {
           olsr_calculate_lq_routing_table();
         }
-#endif
-      olsr_calculate_hna_routes();
-
-      /* Print updated info */
-      if(olsr_cnf->debug_level > 1)
-       olsr_print_tc_table();
-
-      if(changes_hna)
-       olsr_print_hna_set();
-
-      goto process_pcf;  
     }
 
-  if(changes_hna)
+  else if (changes_hna)
     {
-      /* Update HNA routes */
-      olsr_calculate_hna_routes();
+      /* update HNA routes */
 
-      olsr_print_hna_set();
+      if (olsr_cnf->lq_level < 2)
+        {
+          olsr_calculate_hna_routes();
+        }
 
-      goto process_pcf;
+      else
+        {
+          olsr_calculate_lq_routing_table();
+        }
     }
   
- process_pcf:
+  if (olsr_cnf->debug_level > 0)
+    {      
+      if (olsr_cnf->debug_level > 2) 
+        {
+          olsr_print_mid_set();
+         
+          if (olsr_cnf->debug_level > 3)
+            {
+              olsr_print_duplicate_table();
+              olsr_print_hna_set();
+            }
+        }
+      
+      olsr_print_link_set();
+      olsr_print_neighbor_table();
+      olsr_print_tc_table();
+    }
 
   for(tmp_pc_list = pcf_list; 
       tmp_pc_list != NULL;
@@ -323,9 +285,6 @@ olsr_init_tables()
 
   /* Initialize HNA set */
   olsr_init_hna_set();
-
-  /* Initialize ProcessChanges list */
-  ptf_list = NULL;
   
 }
 
@@ -360,7 +319,7 @@ olsr_forward_message(union olsr_message *m,
   if(!olsr_check_dup_table_fwd(originator, seqno, &in_if->ip_addr))
     {
 #ifdef DEBUG
-      olsr_printf(3, "Message already forwarded!\n");
+      OLSR_PRINTF(3, "Message already forwarded!\n")
 #endif
       return 0;
     }
@@ -384,7 +343,7 @@ olsr_forward_message(union olsr_message *m,
   if(olsr_lookup_mprs_set(src) == NULL)
     {
 #ifdef DEBUG
-      olsr_printf(5, "Forward - sender %s not MPR selector\n", olsr_ip_to_string(src));
+      OLSR_PRINTF(5, "Forward - sender %s not MPR selector\n", olsr_ip_to_string(src))
 #endif
       return 0;
     }
@@ -431,7 +390,7 @@ olsr_forward_message(union olsr_message *m,
              
              if(net_outbuffer_push(ifn, (olsr_u8_t *)m, msgsize) != msgsize)
                {
-                 olsr_printf(1, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msgsize);
+                 OLSR_PRINTF(1, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msgsize)
                  olsr_syslog(OLSR_LOG_ERR, "Received message to big to be forwarded on %s(%d bytes)!", ifn->int_name, msgsize);
                }
 
@@ -445,7 +404,7 @@ olsr_forward_message(union olsr_message *m,
          
          if(net_outbuffer_push(ifn, (olsr_u8_t *)m, msgsize) != msgsize)
            {
-             olsr_printf(1, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msgsize);
+             OLSR_PRINTF(1, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msgsize)
              olsr_syslog(OLSR_LOG_ERR, "Received message to big to be forwarded on %s(%d bytes)!", ifn->int_name, msgsize);
            }
        }
@@ -460,15 +419,12 @@ void
 set_buffer_timer(struct interface *ifn)
 {
   float jitter;
-  struct timeval jittertimer;
       
   /* Set timer */
   jitter = (float) random()/RAND_MAX;
   jitter *= max_jitter;
 
-  olsr_init_timer((olsr_u32_t) (jitter*1000), &jittertimer);
-
-  timeradd(&now, &jittertimer, &fwdtimer[ifn->if_nr]);
+  fwdtimer[ifn->if_nr] = GET_TIMESTAMP(jitter*1000);
 
 }
 
@@ -478,7 +434,8 @@ void
 olsr_init_willingness()
 {
   if(olsr_cnf->willingness_auto)
-    olsr_register_scheduler_event(&olsr_update_willingness, NULL, will_int, will_int, NULL);
+    olsr_register_scheduler_event(&olsr_update_willingness, 
+                                 NULL, will_int, will_int, NULL);
 }
 
 void
@@ -493,7 +450,7 @@ olsr_update_willingness(void *foo)
 
   if(tmp_will != olsr_cnf->willingness)
     {
-      olsr_printf(1, "Local willingness updated: old %d new %d\n", tmp_will, olsr_cnf->willingness);
+      OLSR_PRINTF(1, "Local willingness updated: old %d new %d\n", tmp_will, olsr_cnf->willingness)
     }
 }
 
@@ -515,8 +472,6 @@ olsr_calculate_willingness()
   if(!olsr_cnf->willingness_auto)
     return olsr_cnf->willingness;
 
-#warning CHANGES IN THE apm INTERFACE(0.4.8)!
-
   if(apm_read(&ainfo) < 1)
     return WILL_DEFAULT;
 
@@ -547,7 +502,7 @@ olsr_calculate_willingness()
 void
 olsr_exit(const char *msg, int val)
 {
-  olsr_printf(1, "OLSR EXIT: %s\n", msg);
+  OLSR_PRINTF(1, "OLSR EXIT: %s\n", msg)
   olsr_syslog(OLSR_LOG_ERR, "olsrd exit: %s\n", msg);
   fflush(stdout);
   exit_value = val;
@@ -572,7 +527,7 @@ olsr_malloc(size_t size, const char *id)
 
   if((ptr = malloc(size)) == 0) 
     {
-      olsr_printf(1, "OUT OF MEMORY: %s\n", strerror(errno));
+      OLSR_PRINTF(1, "OUT OF MEMORY: %s\n", strerror(errno))
       olsr_syslog(OLSR_LOG_ERR, "olsrd: out of memory!: %m\n");
       olsr_exit((char *)id, EXIT_FAILURE);
     }
@@ -591,18 +546,11 @@ olsr_printf(int loglevel, char *format, ...)
 {
   va_list arglist;
 
-  if(loglevel <= olsr_cnf->debug_level)
+  if((loglevel <= olsr_cnf->debug_level) && debug_handle)
     {
-
-      if(stdout_pulse_set)
-       {
-         printf("\b");
-         stdout_pulse_set = OLSR_FALSE;
-       }
-
       va_start(arglist, format);
       
-      vprintf(format, arglist);
+      vfprintf(debug_handle, format, arglist);
       
       va_end(arglist);
     }