Reparied picky duplicate filter
authorSven-Ola Tuecke <sven-ola@gmx.de>
Sun, 23 Nov 2008 19:33:24 +0000 (20:33 +0100)
committerSven-Ola Tuecke <sven-ola@gmx.de>
Sun, 23 Nov 2008 19:33:24 +0000 (20:33 +0100)
src/duplicate_set.c
src/duplicate_set.h
src/olsr.c
src/parser.c
src/parser.h
src/rebuild_packet.c
src/rebuild_packet.h

index 8c8ce2e..5415615 100644 (file)
@@ -71,8 +71,7 @@ olsr_create_duplicate_entry(void *ip, olsr_u16_t seqnr)
     entry->seqnr = seqnr;
     entry->too_low_counter = 0;
     entry->avl.key = &entry->ip;
-    entry->forwardedArray = 0;
-    entry->processedArray = 0;
+    entry->array = 0;
   }
   return entry;
 }
@@ -92,13 +91,12 @@ olsr_cleanup_duplicate_entry(void __attribute__ ((unused)) * unused)
 }
 
 int
-olsr_message_is_duplicate(union olsr_message *m, olsr_bool forwarding)
+olsr_message_is_duplicate(union olsr_message *m, olsr_bool update)
 {
-  struct dup_entry *entry;
+  struct dup_entry *entry, tmp_entry;
   int diff;
   void *mainIp;
   clock_t valid_until;
-  u_int32_t *array;
   struct ipaddr_str buf;
   u_int16_t seqnr;
   void *ip;
@@ -121,16 +119,27 @@ olsr_message_is_duplicate(union olsr_message *m, olsr_bool forwarding)
 
   entry = (struct dup_entry *)avl_find(&duplicate_set, ip);
   if (entry == NULL) {
-    entry = olsr_create_duplicate_entry(ip, seqnr);
-    if (entry != NULL) {
-      avl_insert(&duplicate_set, &entry->avl, 0);
-      entry->valid_until = valid_until;
+    if (!update) {
+      entry = olsr_create_duplicate_entry(ip, seqnr);
+      if (entry != NULL) {
+        avl_insert(&duplicate_set, &entry->avl, 0);
+        entry->valid_until = valid_until;
+      }
     }
     return OLSR_FALSE;          // okay, we process this package
   }
+  
+  if (!update) {
+    tmp_entry = *entry;
+    entry = &tmp_entry;
+  }
 
   diff = (int)seqnr - (int)(entry->seqnr);
 
+  printf ("sot-dup2: diff=%d, e.seqnr=%d, e.valid=%d, e.array=%x, e.toolow=%d\n",
+          diff, entry->seqnr, (int) entry->valid_until, entry->array,
+          entry->too_low_counter);
+
   // update timestamp
   if (valid_until > entry->valid_until) {
     entry->valid_until = valid_until;
@@ -140,7 +149,6 @@ olsr_message_is_duplicate(union olsr_message *m, olsr_bool forwarding)
     diff -= (1 << 16);
   }
 
-  array = forwarding ? &entry->forwardedArray : &entry->processedArray;
   if (diff < -31) {
     entry->too_low_counter++;
 
@@ -148,7 +156,7 @@ olsr_message_is_duplicate(union olsr_message *m, olsr_bool forwarding)
     if (entry->too_low_counter > 16) {
       entry->too_low_counter = 0;
       entry->seqnr = seqnr;
-      *array = 1;
+      entry->array = 1;
       return OLSR_FALSE;        /* start with a new sequence number, so NO duplicate */
     }
     OLSR_PRINTF(9, "blocked %x from %s\n", seqnr, olsr_ip_to_string(&buf, mainIp));
@@ -159,19 +167,19 @@ olsr_message_is_duplicate(union olsr_message *m, olsr_bool forwarding)
   if (diff <= 0) {
     olsr_u32_t bitmask = 1 << ((olsr_u32_t) (-diff));
 
-    if (((*array) & bitmask) != 0) {
-      OLSR_PRINTF(9, "blocked %x (diff=%d,mask=%08x) from %s\n", seqnr, diff, *array, olsr_ip_to_string(&buf, mainIp));
+    if ((entry->array & bitmask) != 0) {
+      OLSR_PRINTF(9, "blocked %x (diff=%d,mask=%08x) from %s\n", seqnr, diff, entry->array, olsr_ip_to_string(&buf, mainIp));
       return OLSR_TRUE;         /* duplicate ! */
     }
-    *array |= bitmask;
+    entry->array |= bitmask;
     OLSR_PRINTF(9, "processed %x from %s\n", seqnr, olsr_ip_to_string(&buf, mainIp));
     return OLSR_FALSE;          /* no duplicate */
   } else if (diff < 32) {
-    *array <<= (olsr_u32_t) diff;
+    entry->array <<= (olsr_u32_t) diff;
   } else {
-    *array = 0;
+    entry->array = 0;
   }
-  *array |= 1;
+  entry->array |= 1;
   entry->seqnr = seqnr;
   OLSR_PRINTF(9, "processed %x from %s\n", seqnr, olsr_ip_to_string(&buf, mainIp));
   return OLSR_FALSE;            /* no duplicate */
@@ -191,7 +199,7 @@ olsr_print_duplicate_table(void)
 
   OLSR_FOR_ALL_DUP_ENTRIES(entry) {
     OLSR_PRINTF(1, "%-*s %08x %s\n", ipwidth, olsr_ip_to_string(&addrbuf, (union olsr_ip_addr *)(entry->avl.key)),
-                entry->processedArray, olsr_clock_string(entry->valid_until));
+                entry->array, olsr_clock_string(entry->valid_until));
   } OLSR_FOR_ALL_DUP_ENTRIES_END(entry);
 #endif
 }
index db07c3c..f38ec9b 100644 (file)
@@ -56,7 +56,7 @@ struct dup_entry {
   union olsr_ip_addr ip;
   olsr_u16_t seqnr;
   olsr_u16_t too_low_counter;
-  olsr_u32_t processedArray, forwardedArray;
+  olsr_u32_t array;
   clock_t valid_until;
 };
 
@@ -64,7 +64,7 @@ AVLNODE2STRUCT(duptree2dupentry, struct dup_entry, avl);
 
 void olsr_init_duplicate_set(void);
 struct dup_entry *olsr_create_duplicate_entry(void *ip, olsr_u16_t seqnr);
-int olsr_message_is_duplicate(union olsr_message *m, olsr_bool forwarding);
+int olsr_message_is_duplicate(union olsr_message *m, olsr_bool update);
 void olsr_print_duplicate_table(void);
 
 #define OLSR_FOR_ALL_DUP_ENTRIES(dup) \
index fa9bd6f..c65375a 100644 (file)
@@ -277,7 +277,8 @@ olsr_init_tables(void)
  *Check if a message is to be forwarded and forward
  *it if necessary.
  *
- *@param m the OLSR message recieved
+ *@param m the OLSR message to be forwarded
+ *@param neighbour we received message from
  *
  *@returns positive if forwarded
  */
@@ -323,9 +324,8 @@ olsr_forward_message(union olsr_message *m, union olsr_ip_addr *from_addr)
     return 0;
   }
 
-  /* check if we already forwarded this message */
   if (olsr_message_is_duplicate(m, OLSR_TRUE)) {
-    return 0;                   /* it's a duplicate, forget about it */
+    return 0;
   }
 
   /* Treat TTL hopcnt */
index a3a0d9d..2dbc0e6 100644 (file)
@@ -250,12 +250,12 @@ void
 parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip_addr *from_addr)
 {
   union olsr_message *m = (union olsr_message *)olsr->olsr_msg;
-  struct unknown_message unkpacket;
+  int count;
   int msgsize;
-  int processed;
   struct parse_function_entry *entry;
   struct packetparser_function_entry *packetparser;
-  int count = size - ((char *)m - (char *)olsr);
+
+  count = size - ((char *)m - (char *)olsr);
 
   if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version))
     return;
@@ -303,7 +303,6 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
 
   for (; count > 0; m = (union olsr_message *)((char *)m + (msgsize))) {
 
-    processed = 0;
     if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version))
       break;
 
@@ -322,34 +321,6 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
       olsr_syslog(OLSR_LOG_ERR, " packet length error in  packet received from %s!", olsr_ip_to_string(&buf, from_addr));
       break;
     }
-#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) {
-      /* IPv4 */
-      if (m->v4.ttl <= 0 && olsr_cnf->lq_fish == 0) {
-        struct ipaddr_str buf;
-        OLSR_PRINTF(2, "Dropping packet type %d from neigh %s with TTL 0\n", m->v4.olsr_msgtype,
-                    olsr_ip_to_string(&buf, from_addr));
-        continue;
-      }
-    } else {
-      /* IPv6 */
-      if (m->v6.ttl <= 0 && olsr_cnf->lq_fish == 0) {
-        struct ipaddr_str buf;
-        OLSR_PRINTF(2, "Dropping packet type %d from %s with TTL 0\n", m->v4.olsr_msgtype, olsr_ip_to_string(&buf, from_addr));
-        continue;
-      }
-    }
-#endif
 
     /*RFC 3626 section 3.4:
      *  2    If the time to live of the message is less than or equal to
@@ -371,35 +342,29 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
 #endif
       continue;
     }
-    //printf("MESSAGETYPE: %d\n", m->v4.olsr_msgtype);
 
     /* check for message duplicates */
-    if (!olsr_message_is_duplicate(m, OLSR_FALSE)) {
-      processed = 0;
-      for (entry = parse_functions; entry != NULL; entry = entry->next) {
-        /* Should be the same for IPv4 and IPv6 */
-
-        /* Promiscuous or exact match */
-        if ((entry->type == PROMISCUOUS) || (entry->type == m->v4.olsr_msgtype)) {
-          entry->function(m, in_if, from_addr);
-          processed = 1;
-        }
+    if (olsr_message_is_duplicate(m, OLSR_FALSE))
+      continue;
+
+    entry = parse_functions;
+    while (entry) {
+      /* Should be the same for IPv4 and IPv6 */
+
+      /* Promiscuous or exact match */
+      if ((entry->type == PROMISCUOUS) || (entry->type == m->v4.olsr_msgtype)) {
+        entry->function(m, in_if, from_addr);
       }
+      entry = entry->next;
     }
-    /* UNKNOWN PACKETTYPE */
-    if (processed == 0) {
-      struct ipaddr_str buf;
-      unk_chgestruct(&unkpacket, m);
 
-      OLSR_PRINTF(3, "Unknown type: %d, size %d, from %s\n", m->v4.olsr_msgtype, size,
-                  olsr_ip_to_string(&buf, &unkpacket.originator));
-
-      /* Cancel loop here, otherwise olsrd just hangs forever at this point */
+    switch (olsr_cnf->ip_version == AF_INET ? m->v4.olsr_msgtype : m->v6.olsr_msgtype) {
+    case HELLO_MESSAGE:
+    case LQ_HELLO_MESSAGE:
       break;
+    default:
+      olsr_forward_message(m, from_addr);
     }
-
-    /* now call function to check for forwarding */
-    olsr_forward_message(m, from_addr);
   }                             /* for olsr_msg */
 }
 
@@ -454,8 +419,8 @@ olsr_input(int fd)
     }
 
 #ifdef DEBUG
-    OLSR_PRINTF(5, "Recieved a packet from %s\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)
-                                                                    &((struct sockaddr_in *)&from)->sin_addr.s_addr));
+    OLSR_PRINTF(5, "Recieved a packet from %s\n",
+                olsr_ip_to_string(&buf, (union olsr_ip_addr *)&((struct sockaddr_in *)&from)->sin_addr.s_addr));
 #endif
 
     if ((olsr_cnf->ip_version == AF_INET) && (fromlen != sizeof(struct sockaddr_in)))
index 1ec1bfd..28ac12f 100644 (file)
@@ -92,10 +92,3 @@ int olsr_packetparser_remove_function(packetparser_function * function);
 void parse_packet(struct olsr *, int, struct interface *, union olsr_ip_addr *);
 
 #endif
-
-/*
- * Local Variables:
- * c-basic-offset: 2
- * indent-tabs-mode: nil
- * End:
- */
index bbfe3c3..cce6970 100644 (file)
@@ -160,43 +160,6 @@ mid_chgestruct(struct mid_message *mmsg, const union olsr_message *m)
 
 }
 
-/**
- *Process/rebuild a message of unknown type. Converts the OLSR
- *packet to the internal unknown_message format.
- *@param umsg the unknown_message struct in wich infomation
- *is to be put.
- *@param m the entire OLSR message revieved.
- *@return negative on error
- */
-
-void
-unk_chgestruct(struct unknown_message *umsg, const union olsr_message *m)
-{
-
-  /* Checking if everything is ok */
-  if (!m)
-    return;
-
-  if (olsr_cnf->ip_version == AF_INET) {
-    /* IPv4 */
-    /* address */
-    umsg->originator.v4.s_addr = m->v4.originator;
-    /*seq number */
-    umsg->seqno = ntohs(m->v4.seqno);
-    /* type */
-    umsg->type = m->v4.olsr_msgtype;
-  } else {
-    /* IPv6 */
-    /* address */
-    umsg->originator.v6 = m->v6.originator;
-    /*seq number */
-    umsg->seqno = ntohs(m->v6.seqno);
-    /* type */
-    umsg->type = m->v4.olsr_msgtype;
-  }
-
-}
-
 /*
  * Local Variables:
  * c-basic-offset: 2
index 36ad180..26d05a2 100644 (file)
@@ -47,8 +47,6 @@
 
 void mid_chgestruct(struct mid_message *, const union olsr_message *);
 
-void unk_chgestruct(struct unknown_message *, const union olsr_message *);
-
 void hello_chgestruct(struct hello_message *, const union olsr_message *);
 
 #endif