Patch from Sven-Ola Tuecke <sven-ola@gmx.de> from
authorBernd Petrovitsch <bernd@firmix.at>
Thu, 29 Nov 2007 00:24:00 +0000 (00:24 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Thu, 29 Nov 2007 00:24:00 +0000 (00:24 +0000)
http://download-master.berlin.freifunk.net/sven-ola/nylon/packages/olsrd/files/132-save-the-fish.patch:
really savet he fish and avoid to forward invlaid messages from older olsrd versions

src/lq_packet.c
src/olsr.c
src/parser.c

index e0741ad..e3b30be 100644 (file)
@@ -38,7 +38,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_packet.c,v 1.31 2007/11/16 22:56:54 bernd67 Exp $
+ * $Id: lq_packet.c,v 1.32 2007/11/29 00:24:00 bernd67 Exp $
  */
 
 #include "olsr_protocol.h"
@@ -149,7 +149,7 @@ static void
 create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif)
 {
   int i;
-  static int ttl_list[] = { 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, MAX_TTL-1, 0};
+  static int ttl_list[] = { 2, 8, 2, 16, 2, 8, 2, MAX_TTL};
 
   // remember that we have generated an LQ TC message; this is
   // checked in net_output()
@@ -171,9 +171,6 @@ create_lq_tc(struct lq_tc_message *lq_tc, struct interface *outif)
     if (outif->ttl_index >= (int)(sizeof(ttl_list) / sizeof(ttl_list[0])))
       outif->ttl_index = 0;
     
-    if (ttl_list[outif->ttl_index] == 0)
-      outif->ttl_index = 0;
-  
     lq_tc->comm.ttl = ttl_list[outif->ttl_index++];
 
     OLSR_PRINTF(3, "Creating LQ TC with TTL %d.\n", lq_tc->comm.ttl);
index edc9850..7a58601 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsr.c,v 1.63 2007/11/16 19:12:55 bernd67 Exp $
+ * $Id: olsr.c,v 1.64 2007/11/29 00:24:00 bernd67 Exp $
  */
 
 /**
@@ -297,11 +297,21 @@ olsr_forward_message(union olsr_message *m,
   struct neighbor_entry *neighbor;
   int msgsize;
   struct interface *ifn;
-  const int ttl = olsr_cnf->ip_version == AF_INET ? m->v4.ttl : m->v6.ttl;
 
-  if (ttl < 2) {
-    return 0;
+  /*
+   * Sven-Ola: We should not flood the mesh with overdue messages. Because
+   * of a bug in parser.c:parse_packet, we have a lot of messages because
+   * all older olsrd's have lq_fish enabled.
+   */
+  if (AF_INET == olsr_cnf->ip_version)
+  {
+    if (2 > m->v4.ttl || 255 < (int)m->v4.hopcnt + (int)m->v4.ttl) return 0;
   }
+  else
+  {
+    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
index 4f49f9a..02c57f1 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.36 2007/11/08 22:47:41 bernd67 Exp $
+ * $Id: parser.c,v 1.37 2007/11/29 00:24:00 bernd67 Exp $
  */
 
 #include "parser.h"
@@ -256,6 +256,16 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
        }
 
 
+#if 0
+      /*
+       * Sven-Ola: This code leads to flooding our meshes with invalid /
+       * overdue messages if lq_fish is enabled (which is true since 2005)
+       * because there was no "do not forward"-check in olsr.c. If a message
+       * (yes: ttl=0 is invalid) is received, we should say: Welcome message,
+       * let us evaluate! But: if TTL < 2 or TTL + hopcount is higher than
+       * plausible, we should not forward. See olsr.c:olsr_forward_message()
+       */
+       
       /* Treat TTL hopcnt */
       if(olsr_cnf->ip_version == AF_INET)
        {
@@ -285,6 +295,7 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
              continue;
            }
        }
+#endif
 
       /*RFC 3626 section 3.4:
        *  2    If the time to live of the message is less than or equal to