Various headerfile inclusion cleanups
[olsrd.git] / src / olsr.c
index c926422..6fe5130 100644 (file)
@@ -1,23 +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 olsr.org.
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met:
  *
- * UniK olsrd 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.
  *
- * UniK olsrd 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
+ * 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"
+#include "lq_mpr.h"
+#include "lq_route.h"
 #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.
- */
-
-
-/**
- *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
+ * Process changes functions
  */
-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;   
-}
-
 
+struct pcf
+{
+  int (*function)(int, int, int);
+  struct pcf *next;
+};
 
+static struct pcf *pcf_list;
 
-
-/**
- *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 olsr_u16_t message_seqno;
 
 /**
  *Initialize the message sequence number as a random value
@@ -119,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");
 
@@ -137,7 +122,7 @@ register_pcf(int (*f)(int, int, int))
  *update the routing table.
  *@return 0
  */
-inline void
+void
 olsr_process_changes()
 {
 
@@ -145,46 +130,97 @@ 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 */
-      olsr_calculate_mpr();
-      olsr_calculate_routing_table();
-      olsr_calculate_hna_routes();
+      if (olsr_cnf->lq_level < 1)
+        {
+          olsr_calculate_mpr();
+        }
 
-      goto process_pcf;  
+      else
+        {
+          olsr_calculate_lq_mpr();
+        }
+
+      if (olsr_cnf->lq_level < 2)
+        {
+          olsr_calculate_routing_table();
+          olsr_calculate_hna_routes();
+        }
+
+      else
+        {
+          olsr_calculate_lq_routing_table();
+        }
     }
   
-  if(changes_topology)
+  else if (changes_topology)
     {
       /* calculate the routing table and HNA */
-      olsr_calculate_routing_table();
-      olsr_calculate_hna_routes();
 
-      goto process_pcf;  
+      if (olsr_cnf->lq_level < 2)
+        {
+          olsr_calculate_routing_table();
+          olsr_calculate_hna_routes();
+        }
+
+      else
+        {
+          olsr_calculate_lq_routing_table();
+        }
     }
 
-  if(changes_hna)
+  else if (changes_hna)
     {
-      /* Update HNA routes */
-      olsr_calculate_hna_routes();
+      /* update HNA routes */
 
-      goto process_pcf;
+      if (olsr_cnf->lq_level < 2)
+        {
+          olsr_calculate_hna_routes();
+        }
+
+      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;
@@ -195,9 +231,9 @@ olsr_process_changes()
                            changes_hna);
     }
 
-  changes_neighborhood = DOWN;
-  changes_topology = DOWN;
-  changes_hna = DOWN;
+  changes_neighborhood = OLSR_FALSE;
+  changes_topology = OLSR_FALSE;
+  changes_hna = OLSR_FALSE;
 
 
   return;
@@ -216,9 +252,9 @@ void
 olsr_init_tables()
 {
   
-  changes_topology = DOWN;
-  changes_neighborhood = DOWN;
-  changes_hna = DOWN;
+  changes_topology = OLSR_FALSE;
+  changes_neighborhood = OLSR_FALSE;
+  changes_hna = OLSR_FALSE;
 
   /* Initialize link set */
   olsr_init_link_set();
@@ -249,9 +285,6 @@ olsr_init_tables()
 
   /* Initialize HNA set */
   olsr_init_hna_set();
-
-  /* Initialize ProcessChanges list */
-  ptf_list = NULL;
   
 }
 
@@ -277,16 +310,16 @@ olsr_forward_message(union olsr_message *m,
                     struct interface *in_if, 
                     union olsr_ip_addr *from_addr)
 {
-  union olsr_message *om;
   union olsr_ip_addr *src;
   struct neighbor_entry *neighbor;
   int msgsize;
+  struct interface *ifn;
 
 
   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;
     }
@@ -310,14 +343,14 @@ 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;
     }
 
 
   /* Treat TTL hopcnt */
-  if(ipversion == AF_INET)
+  if(olsr_cnf->ip_version == AF_INET)
     {
       /* IPv4 */
       m->v4.hopcnt++;
@@ -340,77 +373,59 @@ olsr_forward_message(union olsr_message *m,
 
   msgsize = ntohs(m->v4.olsr_msgsize);
 
-  if(fwdsize)
-    {
-      /*
-       * Check if message is to big to be piggybacked
-       */
-      if((fwdsize + msgsize) > maxmessagesize)
+  /* looping trough interfaces */
+  for (ifn = ifnet; ifn ; ifn = ifn->int_next) 
+    { 
+      if(net_output_pending(ifn))
        {
-         olsr_printf(1, "Forwardbuffer full(%d + %d) - flushing!\n", fwdsize, msgsize);
-
-         /* Send */
-         net_forward();
-
-         /* Buffer message */
-         buffer_forward(m);
+         /*
+          * Check if message is to big to be piggybacked
+          */
+         if(net_outbuffer_push(ifn, (olsr_u8_t *)m, msgsize) != msgsize)
+           {
+             /* Send */
+             net_output(ifn);
+             /* Buffer message */
+             set_buffer_timer(ifn);
+             
+             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_syslog(OLSR_LOG_ERR, "Received message to big to be forwarded on %s(%d bytes)!", ifn->int_name, msgsize);
+               }
+
+           }
        }
+      
       else
        {
-#ifdef DEBUG
-         olsr_printf(3, "Piggybacking message - buffer: %d msg: %d\n", fwdsize, msgsize);
-#endif
-         /* piggyback message to outputbuffer */
-         om =  (union olsr_message *)((char*)fwdmsg + fwdsize);
-
-         memcpy(om, m, msgsize);
-         fwdsize += msgsize;
+         /* No forwarding pending */
+         set_buffer_timer(ifn);
+         
+         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_syslog(OLSR_LOG_ERR, "Received message to big to be forwarded on %s(%d bytes)!", ifn->int_name, msgsize);
+           }
        }
     }
 
-  else
-    {
-      /* No forwarding pending */
-      buffer_forward(m);
-    }
-
   return 1;
 
 }
 
 
-
-int
-buffer_forward(union olsr_message *m)
+void
+set_buffer_timer(struct interface *ifn)
 {
   float jitter;
-  struct timeval jittertimer;
-  int msgsize;
-
-  msgsize = ntohs(m->v4.olsr_msgsize);  
       
   /* Set timer */
   jitter = (float) random()/RAND_MAX;
   jitter *= max_jitter;
 
-  olsr_init_timer((olsr_u32_t) (jitter*1000), &jittertimer);
-  
-  timeradd(&now, &jittertimer, &fwdtimer);
-  
-  /* Add header and message */
-  fwdsize = sizeof(olsr_u16_t) + sizeof(olsr_u16_t) + msgsize;
-  
-  /* Set messagesize  - same for IPv4 and IPv6 */
-  fwdmsg->v4.olsr_packlen = htons(fwdsize);
-  
-#ifdef DEBUG
-  olsr_printf(3, "Adding jitter for forwarding: %f size: %d\n", jitter, fwdsize);
-#endif
-
-  /* Copy message to outputbuffer */
-  memcpy(fwdmsg->v4.olsr_msg, m, msgsize);
+  fwdtimer[ifn->if_nr] = GET_TIMESTAMP(jitter*1000);
 
-  return 1;
 }
 
 
@@ -418,23 +433,24 @@ buffer_forward(union olsr_message *m)
 void
 olsr_init_willingness()
 {
-  if(!willingness_set)
-    olsr_register_scheduler_event(&olsr_update_willingness, will_int, will_int, NULL);
+  if(olsr_cnf->willingness_auto)
+    olsr_register_scheduler_event(&olsr_update_willingness, 
+                                 NULL, will_int, will_int, NULL);
 }
 
 void
-olsr_update_willingness()
+olsr_update_willingness(void *foo)
 {
   int tmp_will;
 
-  tmp_will = my_willingness;
+  tmp_will = olsr_cnf->willingness;
 
   /* Re-calculate willingness */
-  my_willingness = olsr_calculate_willingness();
+  olsr_cnf->willingness = olsr_calculate_willingness();
 
-  if(tmp_will != my_willingness)
+  if(tmp_will != olsr_cnf->willingness)
     {
-      olsr_printf(1, "Local willingness updated: old %d new %d\n", tmp_will, my_willingness);
+      OLSR_PRINTF(1, "Local willingness updated: old %d new %d\n", tmp_will, olsr_cnf->willingness)
     }
 }
 
@@ -453,10 +469,8 @@ olsr_calculate_willingness()
   struct olsr_apm_info ainfo;
 
   /* If fixed willingness */
-  if(willingness_set)
-    return my_willingness;
-
-#warning CHANGES IN THE apm INTERFACE(0.4.8)!
+  if(!olsr_cnf->willingness_auto)
+    return olsr_cnf->willingness;
 
   if(apm_read(&ainfo) < 1)
     return WILL_DEFAULT;
@@ -488,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;
@@ -513,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);
     }
@@ -532,14 +546,15 @@ olsr_printf(int loglevel, char *format, ...)
 {
   va_list arglist;
 
-  va_start(arglist, format);
-
-  if(loglevel <= debug_level)
+  if((loglevel <= olsr_cnf->debug_level) && debug_handle)
     {
-      vprintf(format, arglist);
+      va_start(arglist, format);
+      
+      vfprintf(debug_handle, format, arglist);
+      
+      va_end(arglist);
     }
 
-  va_end(arglist);
 
   return 0;
 }