Fix logic but in forwarding sequence duplicate check
authorHenning Rogge <rogge@fgan.de>
Fri, 21 Nov 2008 15:30:25 +0000 (16:30 +0100)
committerHenning Rogge <rogge@fgan.de>
Fri, 21 Nov 2008 15:30:25 +0000 (16:30 +0100)
src/duplicate_set.c
src/duplicate_set.h
src/olsr.c
src/parser.c

index cf67149..66746b9 100644 (file)
@@ -114,7 +114,7 @@ olsr_cleanup_duplicate_entry(void __attribute__ ((unused)) * unused)
 }
 
 int
-olsr_message_is_duplicate(void *ip, olsr_u16_t seqnr, bool forwarding)
+olsr_message_is_duplicate(union olsr_message *m, bool forwarding)
 {
   struct dup_entry *entry;
   int diff;
@@ -122,6 +122,17 @@ olsr_message_is_duplicate(void *ip, olsr_u16_t seqnr, bool forwarding)
   clock_t valid_until;
   olsr_u32_t *array;
   struct ipaddr_str buf;
+  u_int16_t seqnr;
+  void *ip;
+
+  if (olsr_cnf->ip_version == AF_INET) {
+    seqnr = ntohs(m->v4.seqno);
+    ip = &m->v4.originator;
+  }
+  else {
+    seqnr = ntohs(m->v6.seqno);
+    ip = &m->v6.originator;
+  }
 
   // get main address
   mainIp = olsr_lookup_main_addr_by_alias(ip);
index 6c278f7..9572219 100644 (file)
@@ -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(void *ip, olsr_u16_t seqnr, bool forwarding);
+int olsr_message_is_duplicate(union olsr_message *m, bool forwarding);
 void olsr_print_duplicate_table(void);
 
 #define OLSR_FOR_ALL_DUP_ENTRIES(dup) \
index 7ceffb6..08c07cc 100644 (file)
@@ -305,8 +305,6 @@ olsr_init_tables(void)
  *it if necessary.
  *
  *@param m the OLSR message recieved
- *@param originator the originator of this message
- *@param seqno the seqno of the message
  *
  *@returns positive if forwarded
  */
@@ -356,16 +354,8 @@ olsr_forward_message(union olsr_message *m,
     }
 
   /* check if we already forwarded this message */
-  if (AF_INET == olsr_cnf->ip_version)
-  {
-    if (olsr_message_is_duplicate(from_addr, ntohs(m->v4.seqno), true)) {
-      return 0; /* it's a duplicate, forget about it */
-    }
-  }
-  else {
-    if (olsr_message_is_duplicate(from_addr, ntohs(m->v6.seqno), true)) {
-      return 0; /* it's a duplicate, forget about it */
-    }
+  if (olsr_message_is_duplicate(m, true)) {
+    return 0; /* it's a duplicate, forget about it */
   }
 
   /* Treat TTL hopcnt */
index c2008e5..44ee391 100644 (file)
@@ -251,7 +251,6 @@ static void parse_packet(struct olsr *olsr, int size, struct interface *in_if, u
   int processed;
   struct parse_function_entry *entry;
   struct packetparser_function_entry *packetparser;
-  bool isDuplicate;
   int count = size - ((char *)m - (char *)olsr);
 
   if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version)) {
@@ -358,18 +357,10 @@ static void parse_packet(struct olsr *olsr, int size, struct interface *in_if, u
       continue;
     }
 
-    /* check for message duplicates */
-    isDuplicate = false;
-    if (olsr_cnf->ip_version == AF_INET) {
-      /* IPv4 */
-      isDuplicate = olsr_message_is_duplicate(&m->v4.originator, ntohs(m->v4.seqno), false);
-    } else {
-      /* IPv6 */
-      isDuplicate = olsr_message_is_duplicate(&m->v6.originator, ntohs(m->v6.seqno), false);
-    }
-
     //printf("MESSAGETYPE: %d\n", m->v4.olsr_msgtype);
-    if (!isDuplicate) {
+
+    /* check for message duplicates */
+    if (!olsr_message_is_duplicate(m, false)) {
       processed = 0;
       for (entry = parse_functions; entry != NULL; entry = entry->next) {
         /* Should be the same for IPv4 and IPv6 */