* applied patches from the most recent FreiFunkFirmware (and fixed compile errors...
[olsrd.git] / src / parser.c
index 2390a78..f6fe3d6 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.28 2005/11/17 01:58:52 tlopatic Exp $
+ * $Id: parser.c,v 1.32 2007/01/31 12:36:50 bernd67 Exp $
  */
 
 #include "parser.h"
 #define strerror(x) StrError(x)
 #endif
 
+/* Sven-Ola: On very slow devices used in huge networks
+ * the amount of lq_tc messages is so high, that the 
+ * recv() loop never ends. This is a small hack to end
+ * the loop in this cases
+ */
+unsigned int cpu_overload_exit = 0;
+
 struct parse_function_entry *parse_functions;
 
 static char inbuf[MAXMESSAGESIZE+1];
 
+static olsr_bool disp_pack_in = OLSR_FALSE;
+
+void
+parser_set_disp_pack_in(olsr_bool val)
+{
+  disp_pack_in = val;
+}
+
 /**
  *Initialize the parser. 
  *
@@ -160,7 +176,7 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
 
   count = size - ((char *)m - (char *)olsr);
 
-  if (count < minsize)
+  if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version))
     return;
 
   if (ntohs(olsr->olsr_packlen) != size)
@@ -193,21 +209,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));
     }
   
@@ -215,7 +231,7 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
     {
 
       processed = 0;      
-      if (count < minsize)
+      if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version))
        break;
       
       if(olsr_cnf->ip_version == AF_INET)
@@ -270,7 +286,7 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
        */
 
       /* Should be the same for IPv4 and IPv6 */
-      if(COMP_IP(&m->v4.originator, &main_addr))
+      if(COMP_IP(&m->v4.originator, &olsr_cnf->main_addr))
        {
 #ifdef DEBUG
          OLSR_PRINTF(3, "Not processing message originating from us!\n")
@@ -310,7 +326,7 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
                      olsr_ip_to_string(&unkpacket.originator))
 
          /* Forward message */
-         if(!COMP_IP(&unkpacket.originator, &main_addr))
+         if(!COMP_IP(&unkpacket.originator, &olsr_cnf->main_addr))
            {         
              /* Forward */
              olsr_forward_message(m, 
@@ -343,13 +359,20 @@ olsr_input(int fd)
 {
   /* sockaddr_in6 is bigger than sockaddr !!!! */
   struct sockaddr_storage from;
-  size_t fromlen;
+  socklen_t fromlen;
   int cc;
   struct interface *olsr_in_if;
   union olsr_ip_addr from_addr;
-
+  cpu_overload_exit = 0;
+  
   for (;;) 
     {
+      if (32 < ++cpu_overload_exit)
+      {
+        OLSR_PRINTF(1, "CPU overload detected, ending olsr_input() loop\n")
+       break;
+      }
+      
       fromlen = sizeof(struct sockaddr_storage);
 
       cc = olsr_recvfrom(fd, 
@@ -431,7 +454,7 @@ olsr_input_hostemu(int fd)
 {
   /* sockaddr_in6 is bigger than sockaddr !!!! */
   struct sockaddr_storage from;
-  size_t fromlen;
+  socklen_t fromlen;
   int cc;
   struct interface *olsr_in_if;
   union olsr_ip_addr from_addr;
@@ -440,7 +463,7 @@ olsr_input_hostemu(int fd)
   /* Host emulator receives IP address first to emulate
      direct link */
 
-  if((cc = recv(fd, from_addr.v6.s6_addr, ipsize, 0)) != (int)ipsize)
+  if((cc = recv(fd, from_addr.v6.s6_addr, olsr_cnf->ipsize, 0)) != (int)olsr_cnf->ipsize)
     {
       fprintf(stderr, "Error receiving host-client IP hook(%d) %s!\n", cc, strerror(errno));
       COPY_IP(&from_addr, &((struct olsr *)inbuf)->olsr_msg->originator);