Repair ipc-msg-tap, repair skip-fwd of msg-input, repair fwd unknown msgs, repair...
authorSven-Ola Tuecke <sven-ola@gmx.de>
Wed, 26 Nov 2008 16:42:40 +0000 (17:42 +0100)
committerSven-Ola Tuecke <sven-ola@gmx.de>
Wed, 26 Nov 2008 16:42:40 +0000 (17:42 +0100)
17 files changed:
lib/nameservice/src/nameservice.c
lib/nameservice/src/nameservice.h
lib/tas/src/plugin.c
src/duplicate_set.c
src/duplicate_set.h
src/hna_set.c
src/hna_set.h
src/ipc_frontend.c
src/mid_set.c
src/mid_set.h
src/olsr.c
src/parser.c
src/parser.h
src/process_package.c
src/process_package.h
src/tc_set.c
src/tc_set.h

index 5818fcc..92fab53 100644 (file)
@@ -637,7 +637,7 @@ olsr_namesvc_gen(void *foo __attribute__((unused)))
 /**
  * Parse name olsr message of NAME type
  */
-void
+olsr_bool
 olsr_parser(union olsr_message *m,
                        struct interface *in_if __attribute__((unused)),
                        union olsr_ip_addr *ipaddr)
@@ -672,17 +672,20 @@ olsr_parser(union olsr_message *m,
        /* Check if message originated from this node.
        If so - back off */
        if(ipequal(&originator, &olsr_cnf->main_addr))
-               return;
+               return OLSR_FALSE;
 
        /* Check that the neighbor this message was received from is symmetric.
        If not - back off*/
        if(check_neighbor_link(ipaddr) != SYM_LINK) {
                struct ipaddr_str strbuf;
                OLSR_PRINTF(3, "NAME PLUGIN: Received msg from NON SYM neighbor %s\n", olsr_ip_to_string(&strbuf, ipaddr));
-               return;
+               return OLSR_FALSE;
        }
 
        update_name_entry(&originator, namemessage, size, vtime);
+
+       /* Forward the message */
+       return OLSR_TRUE;
 }
 
 /**
index 1a1ecb4..e64abcf 100644 (file)
@@ -125,7 +125,7 @@ void olsr_expire_write_file_timer(void *);
 void olsr_namesvc_delete_db_entry(struct db_entry *);
 
 /* Parser function to register with the sceduler */
-void
+olsr_bool
 olsr_parser(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 /* callback for periodic timer */
index fe780a7..fc0fbc4 100644 (file)
@@ -318,7 +318,7 @@ void iterTcTabInit(void)
   iterTcTab = (node ? vertex_tree2tc(node) : NULL);
 }
 
-static void parserFunc(union olsr_message *msg,
+static olsr_bool parserFunc(union olsr_message *msg,
                        struct interface *inInt __attribute__((unused)),
                        union olsr_ip_addr *neighIntAddr)
 {
@@ -329,18 +329,18 @@ static void parserFunc(union olsr_message *msg,
   int i;
 
   if (memcmp(orig, &olsr_cnf->main_addr, olsr_cnf->ipsize) == 0)
-    return;
+    return OLSR_FALSE;
 
   if (check_neighbor_link(neighIntAddr) != SYM_LINK)
   {
     error("TAS message not from symmetric neighbour\n");
-    return;
+    return OLSR_FALSE;
   }
 
   if (len < (int)olsr_cnf->ipsize + 8 + 2)
   {
     error("short TAS message received (%d bytes)\n", len);
-    return;
+    return OLSR_FALSE;
   }
 
     len -= olsr_cnf->ipsize + 8;
@@ -351,13 +351,13 @@ static void parserFunc(union olsr_message *msg,
     if (i++ == len)
     {
       error("TAS message has unterminated service string\n");
-      return;
+      return OLSR_FALSE;
     }
 
     if (i == len)
     {
       error("TAS message lacks payload string\n");
-      return;
+      return OLSR_FALSE;
     }
 
     string = service + i;
@@ -368,10 +368,13 @@ static void parserFunc(union olsr_message *msg,
     if (i == len)
     {
       error("TAS message has unterminated payload string\n");
-      return;
+      return OLSR_FALSE;
     }
 
     httpAddTasMessage(service, string, rawIpAddrToString(orig, olsr_cnf->ipsize));
+
+    /* Forward the message */
+    return OLSR_TRUE;
 }
 
 void sendMessage(const char *service, const char *string)
index 0745799..5ac1507 100644 (file)
@@ -82,7 +82,7 @@ olsr_init_duplicate_set(void)
 }
 
 struct dup_entry *
-olsr_create_duplicate_entry(void *ip, olsr_u16_t seqnr)
+olsr_create_duplicate_entry(union olsr_ip_addr *ip, olsr_u16_t seqnr)
 {
   struct dup_entry *entry;
   entry = olsr_cookie_malloc(duplicate_mem_cookie);
@@ -93,8 +93,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;
 }
@@ -113,23 +112,22 @@ olsr_cleanup_duplicate_entry(void __attribute__ ((unused)) * unused)
 }
 
 int
-olsr_message_is_duplicate(union olsr_message *m, bool forwarding)
+olsr_message_is_duplicate(union olsr_message *m)
 {
   struct dup_entry *entry;
   int diff;
-  void *mainIp;
+  union olsr_ip_addr *mainIp;
   clock_t valid_until;
-  olsr_u32_t *array;
   struct ipaddr_str buf;
   olsr_u16_t seqnr;
-  void *ip;
+  union olsr_ip_addr *ip;
 
   if (olsr_cnf->ip_version == AF_INET) {
     seqnr = ntohs(m->v4.seqno);
-    ip = &m->v4.originator;
+    ip = (union olsr_ip_addr *)&m->v4.originator;
   } else {
     seqnr = ntohs(m->v6.seqno);
-    ip = &m->v6.originator;
+    ip = (union olsr_ip_addr *)&m->v6.originator;
   }
 
   // get main address
@@ -161,7 +159,6 @@ olsr_message_is_duplicate(union olsr_message *m, bool forwarding)
     diff -= (1 << 16);
   }
 
-  array = forwarding ? &entry->forwardedArray : &entry->processedArray;
   if (diff < -31) {
     entry->too_low_counter++;
 
@@ -169,7 +166,7 @@ olsr_message_is_duplicate(union olsr_message *m, bool forwarding)
     if (entry->too_low_counter > 16) {
       entry->too_low_counter = 0;
       entry->seqnr = seqnr;
-      *array = 1;
+      entry->array = 1;
       return false; /* start with a new sequence number, so NO duplicate */
     }
     OLSR_PRINTF(9, "blocked %x from %s\n", seqnr,
@@ -181,20 +178,20 @@ olsr_message_is_duplicate(union olsr_message *m, bool forwarding)
   if (diff <= 0) {
     olsr_u32_t bitmask = 1 << ((olsr_u32_t) (-diff));
 
-    if (((*array) & bitmask) != 0) {
+    if ((entry->array & bitmask) != 0) {
       OLSR_PRINTF(9, "blocked %x (diff=%d,mask=%08x) from %s\n", seqnr, diff,
-          *array, olsr_ip_to_string(&buf, mainIp));
+          entry->array, olsr_ip_to_string(&buf, mainIp));
       return true; /* duplicate ! */
     }
-    *array |= bitmask;
+    entry->array |= bitmask;
     OLSR_PRINTF(9, "processed %x from %s\n", seqnr, olsr_ip_to_string(&buf, mainIp));
     return 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));
@@ -220,7 +217,7 @@ olsr_print_duplicate_table(void)
                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 1bf7a1b..166dbf1 100644 (file)
@@ -56,15 +56,15 @@ 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;
 };
 
 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, bool forwarding);
+struct dup_entry *olsr_create_duplicate_entry(union olsr_ip_addr *ip, olsr_u16_t seqnr);
+int olsr_message_is_duplicate(union olsr_message *m);
 void olsr_print_duplicate_table(void);
 
 #define OLSR_FOR_ALL_DUP_ENTRIES(dup) \
index c2ad206..e7c09fa 100644 (file)
@@ -239,7 +239,7 @@ olsr_print_hna_set(void)
  * Process incoming HNA message.
  * Forwards the message if that is to be done.
  */
-void
+olsr_bool
 olsr_input_hna(union olsr_message *msg,
                struct interface *in_if __attribute__((unused)),
                union olsr_ip_addr *from_addr)
@@ -251,12 +251,12 @@ olsr_input_hna(union olsr_message *msg,
   int hnasize;
 
   if (!(curr = olsr_parse_msg_hdr(msg, &msg_hdr))) {
-    return;
+    return OLSR_FALSE;
   }
 
   /* We are only interested in HNA message types. */
   if (msg_hdr.type != HNA_MESSAGE) {
-    return;
+    return OLSR_FALSE;
   }
 
   hnasize = msg_hdr.size - (olsr_cnf->ip_version == AF_INET ?
@@ -268,12 +268,12 @@ olsr_input_hna(union olsr_message *msg,
                 (unsigned long)(olsr_cnf->ip_version == AF_INET ?
                                 offsetof(struct olsrmsg, message) :
                                 offsetof(struct olsrmsg6, message)));
-    return;
+    return OLSR_FALSE;
   }
 
   if ((hnasize % (2 * olsr_cnf->ipsize)) != 0) {
     OLSR_PRINTF(0, "HNA message size %d illegal!\n", msg_hdr.size);
-    return;
+    return OLSR_FALSE;
   }
 
   /*
@@ -284,7 +284,7 @@ olsr_input_hna(union olsr_message *msg,
   if (check_neighbor_link(from_addr) != SYM_LINK) {
     OLSR_PRINTF(2, "Received HNA from NON SYM neighbor %s\n",
                 olsr_ip_to_string(&buf, from_addr));
-    return;
+    return OLSR_FALSE;
   }
 
   OLSR_PRINTF(1, "Processing HNA from %s, seq 0x%04x\n",
@@ -307,6 +307,8 @@ olsr_input_hna(union olsr_message *msg,
       olsr_update_hna_entry(&msg_hdr.originator, &prefix, msg_hdr.vtime);
     }
   }
+  /* Forward the message */
+  return OLSR_TRUE;
 }
 
 /*
index bd2acea..41fa29b 100644 (file)
@@ -68,7 +68,7 @@ AVLNODE2STRUCT(hna_tc_tree2hna, struct hna_net, hna_tc_node);
 #define OLSR_FOR_ALL_TC_HNA_ENTRIES_END(tc, hna_net) }}
 
 /* HNA msg input parser */
-void olsr_input_hna(union olsr_message *, struct interface *,
+olsr_bool olsr_input_hna(union olsr_message *, struct interface *,
                     union olsr_ip_addr *);
 
 void olsr_init_hna_set(void);
index 8698361..c93903b 100644 (file)
@@ -119,7 +119,7 @@ ipc_input(int);
 static olsr_bool
 ipc_check_allowed_ip(const union olsr_ip_addr *);
 
-static void
+static olsr_bool
 frontend_msgparser(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 
@@ -255,13 +255,13 @@ ipc_input(int sock)
  *
  *@param olsr the olsr struct representing the packet
  *
- *@return negative on error
+ *@return true for not preventing forwarding
  */
-static void
+static olsr_bool
 frontend_msgparser(union olsr_message *msg, struct interface *in_if __attribute__((unused)), union olsr_ip_addr *from_addr __attribute__((unused)))
 {
   if (ipc_conn < 0) {
-    return;
+    return OLSR_TRUE;
   }
   if (send(ipc_conn,
           (void *)msg,
@@ -270,6 +270,7 @@ frontend_msgparser(union olsr_message *msg, struct interface *in_if __attribute_
     OLSR_PRINTF(1, "(OUTPUT)IPC connection lost!\n");
     CLOSE(ipc_conn);
   }
+  return OLSR_TRUE;
 }
 
 
index cdb29bb..fe92b3c 100644 (file)
@@ -478,7 +478,7 @@ olsr_print_mid_set(void)
 /**
  * Process an incoming MID message.
  */
-void
+olsr_bool
 olsr_input_mid(union olsr_message *msg,
                struct interface *input_if __attribute__ ((unused)),
                union olsr_ip_addr *from_addr)
@@ -493,13 +493,13 @@ olsr_input_mid(union olsr_message *msg,
 
   curr = (void *)msg;
   if (!msg) {
-    return;
+    return OLSR_FALSE;
   }
 
   /* We are only interested in MID message types. */
   pkt_get_u8(&curr, &type);
   if (type != MID_MESSAGE) {
-    return;
+    return OLSR_FALSE;
   }
 
   pkt_get_reltime(&curr, &vtime);
@@ -513,7 +513,7 @@ olsr_input_mid(union olsr_message *msg,
   pkt_get_u16(&curr, &msg_seq);
 
   if (!olsr_validate_address(&originator)) {
-    return;
+    return OLSR_FALSE;
   }
 
   /*
@@ -524,7 +524,7 @@ olsr_input_mid(union olsr_message *msg,
   if (check_neighbor_link(from_addr) != SYM_LINK) {
     OLSR_PRINTF(2, "Received MID from NON SYM neighbor %s\n",
                olsr_ip_to_string(&buf, from_addr));
-    return;
+    return OLSR_FALSE;
   }
 
   OLSR_PRINTF(1, "Processing MID from %s, seq 0x%04x\n",
@@ -548,6 +548,9 @@ olsr_input_mid(union olsr_message *msg,
    * Prune the aliases that did not get refreshed by this advertisment.
    */
   olsr_prune_mid_entries(&originator, msg_seq);
+
+  /* Forward the message */
+  return OLSR_TRUE;
 }
 
 /*
index 6e5f409..c88297c 100644 (file)
@@ -81,7 +81,7 @@ extern struct avl_tree mid_tree;
 struct mid_alias;
 
 /* MID msg input parser */
-void olsr_input_mid(union olsr_message *, struct interface *,
+olsr_bool olsr_input_mid(union olsr_message *, struct interface *,
                     union olsr_ip_addr *);
 
 void olsr_init_mid_set(void);
index 4b698c3..fa35a24 100644 (file)
@@ -354,7 +354,7 @@ olsr_forward_message(union olsr_message *m,
     }
 
   /* check if we already forwarded this message */
-  if (olsr_message_is_duplicate(m, true)) {
+  if (olsr_message_is_duplicate(m)) {
     return 0; /* it's a duplicate, forget about it */
   }
 
index f7eeecb..99800fa 100644 (file)
@@ -248,7 +248,6 @@ static void parse_packet(struct olsr *olsr, int size, struct interface *in_if, u
 {
   union olsr_message *m = (union olsr_message *)olsr->olsr_msg;
   int msgsize;
-  int processed;
   struct parse_function_entry *entry;
   struct packetparser_function_entry *packetparser;
   int count = size - ((char *)m - (char *)olsr);
@@ -287,7 +286,8 @@ static void parse_packet(struct olsr *olsr, int size, struct interface *in_if, u
   }
 
   for (; count > 0; m = (union olsr_message *)((char *)m + msgsize)) {
-    processed = 0;
+    olsr_bool forward = OLSR_TRUE;
+    
     if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version)) {
       break;
     }
@@ -306,38 +306,6 @@ static void parse_packet(struct olsr *olsr, int size, struct interface *in_if, u
       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
      *  '0' (zero), or if the message was sent by the receiving node
@@ -357,45 +325,18 @@ static void parse_packet(struct olsr *olsr, int size, struct interface *in_if, u
       continue;
     }
 
-    //printf("MESSAGETYPE: %d\n", m->v4.olsr_msgtype);
-
-    /* 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 */
-
-        /* Promiscuous or exact match */
-        if ((entry->type == PROMISCUOUS) || (entry->type == m->v4.olsr_msgtype)) {
-          entry->function(m, in_if, from_addr);
-          processed = 1;
-        }
+    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)) {
+        if (!entry->function(m, in_if, from_addr))
+          forward = OLSR_FALSE;
       }
     }
-    /* UNKNOWN PACKETTYPE */
-    if (processed == 0) {
-      union olsr_ip_addr originator;
-      //struct unknown_message unkpacket;
-      struct ipaddr_str buf;
-      if (olsr_cnf->ip_version == AF_INET) {
-        originator.v4.s_addr = m->v4.originator;
-      } else {
-        originator.v6 = m->v6.originator;
-      }
 
-      OLSR_PRINTF(3, "Unknown type: %d, size %d, from %s\n",
-                  m->v4.olsr_msgtype,
-                  size,
-                  olsr_ip_to_string(&buf, &originator));
-      /* forward the unknown package if necessary */
+    if (forward) {
       olsr_forward_message(m, from_addr);
-
-      /* Cancel loop here, otherwise olsrd just hangs forever at this point */
-      break;
     }
-
-    /* now call function to check for forwarding */
-    olsr_forward_message(m, from_addr);
   } /* for olsr_msg */
 }
 
index 2a3a224..b7a7469 100644 (file)
@@ -49,7 +49,8 @@
 
 #define MIN_PACKET_SIZE(ver)   ((int)(sizeof(olsr_u8_t) * (((ver) == AF_INET) ? 4 : 7)))
 
-typedef void parse_function(union olsr_message *, struct interface *, union olsr_ip_addr *);
+/* Function returns false if the message should not be forwarded */
+typedef olsr_bool parse_function(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 struct parse_function_entry {
   olsr_u32_t type;       /* If set to PROMISCUOUS all messages will be received */
index 073f412..7e2ca33 100644 (file)
@@ -312,9 +312,14 @@ lookup_mpr_status(const struct hello_message *message,
 void
 olsr_init_package_process(void)
 {
-  olsr_parser_add_function(&olsr_input_hello, HELLO_MESSAGE);
-  olsr_parser_add_function(&olsr_input_hello, LQ_HELLO_MESSAGE);
-  olsr_parser_add_function(&olsr_input_tc, TC_MESSAGE);
+  if (olsr_cnf->lq_level == 0) {
+    olsr_parser_add_function(&olsr_input_hello, HELLO_MESSAGE);
+    olsr_parser_add_function(&olsr_input_tc, TC_MESSAGE);
+  }
+  else {
+    olsr_parser_add_function(&olsr_input_hello, LQ_HELLO_MESSAGE);
+    olsr_parser_add_function(&olsr_input_tc, TC_MESSAGE);
+  }
   olsr_parser_add_function(&olsr_input_tc, LQ_TC_MESSAGE);
   olsr_parser_add_function(&olsr_input_mid, MID_MESSAGE);
   olsr_parser_add_function(&olsr_input_hna, HNA_MESSAGE);
@@ -441,17 +446,20 @@ hello_tap(struct hello_message *message,
   olsr_free_hello_packet(message);
 }
 
-void olsr_input_hello(union olsr_message *msg, struct interface *inif, union olsr_ip_addr *from)
+olsr_bool olsr_input_hello(union olsr_message *msg, struct interface *inif, union olsr_ip_addr *from)
 {
   struct hello_message hello;
 
   if (msg == NULL) {
-    return;
+    return OLSR_FALSE;
   }
   if (deserialize_hello(&hello, msg) != 0) {
-    return;
+    return OLSR_FALSE;
   }
   hello_tap(&hello, inif, from);
+
+  /* Do not forward hello messages */
+  return OLSR_FALSE;
 }
 
 /*
index cf74be8..509526d 100644 (file)
@@ -44,7 +44,7 @@
 
 #include "olsr_protocol.h"
 
-void
+olsr_bool
 olsr_input_hello(union olsr_message *ser, struct interface *inif, union olsr_ip_addr *from);
 
 void
index 648744f..85ca757 100644 (file)
@@ -742,7 +742,7 @@ olsr_calculate_tc_border(olsr_u8_t lower_border,
  * as every call to pkt_get increases the packet offset and
  * hence the spot we are looking at.
  */
-void
+olsr_bool
 olsr_input_tc(union olsr_message *msg,
              struct interface *input_if __attribute__ ((unused)),
              union olsr_ip_addr *from_addr)
@@ -760,13 +760,13 @@ olsr_input_tc(union olsr_message *msg,
 
   curr = (void *)msg;
   if (!msg) {
-    return;
+    return OLSR_FALSE;
   }
 
   /* We are only interested in TC message types. */
   pkt_get_u8(&curr, &type);
   if ((type != LQ_TC_MESSAGE) && (type != TC_MESSAGE)) {
-    return;
+    return OLSR_FALSE;
   }
 
   pkt_get_reltime(&curr, &vtime);
@@ -796,7 +796,7 @@ olsr_input_tc(union olsr_message *msg,
        * Ignore already seen seq/ansn values (small window for mesh memory)
        */
       if ((tc->msg_seq == msg_seq) || (tc->ignored++ < 32)) {
-       return;
+       return OLSR_FALSE;
       }
 
       OLSR_PRINTF(1, "Ignored to much LQTC's for %s, restarting\n",
@@ -820,7 +820,7 @@ olsr_input_tc(union olsr_message *msg,
        tc->err_seq_valid = OLSR_TRUE;
       }
       if (tc->err_seq == msg_seq) {
-       return;
+       return OLSR_FALSE;
       }
 
       OLSR_PRINTF(2, "Detected node restart for %s\n",
@@ -852,7 +852,7 @@ olsr_input_tc(union olsr_message *msg,
   if (check_neighbor_link(from_addr) != SYM_LINK) {
     OLSR_PRINTF(2, "Received TC from NON SYM neighbor %s\n",
                olsr_ip_to_string(&buf, from_addr));
-    return;
+    return OLSR_FALSE;
   }
 
   OLSR_PRINTF(1, "Processing TC from %s, seq 0x%04x\n",
@@ -906,6 +906,9 @@ olsr_input_tc(union olsr_message *msg,
                   OLSR_TC_EDGE_GC_JITTER, OLSR_TIMER_ONESHOT,
                   &olsr_expire_tc_edge_gc, tc, tc_edge_gc_timer_cookie->ci_id);
   }
+
+  /* Forward the message */
+  return OLSR_TRUE;
 }
 
 /*
index b1c7f01..e08ffae 100644 (file)
@@ -152,7 +152,7 @@ void olsr_print_tc_table(void);
 void olsr_time_out_tc_set(void);
 
 /* tc msg input parser */
-void olsr_input_tc(union olsr_message *, struct interface *,
+olsr_bool olsr_input_tc(union olsr_message *, struct interface *,
                   union olsr_ip_addr *from);
 
 /* tc_entry manipulation */