Restore ability of message handlers to discard forwarding
authorSven-Ola Tuecke <sven-ola@gmx.de>
Wed, 26 Nov 2008 11:11:42 +0000 (12:11 +0100)
committerSven-Ola Tuecke <sven-ola@gmx.de>
Wed, 26 Nov 2008 11:11:42 +0000 (12:11 +0100)
20 files changed:
lib/nameservice/src/nameservice.c
lib/nameservice/src/nameservice.h
lib/tas/src/plugin.c
src/common/list.h
src/duplicate_set.c
src/duplicate_set.h
src/hna_set.c
src/hna_set.h
src/ipc_frontend.c
src/ipc_frontend.h
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/scheduler.c
src/tc_set.c
src/tc_set.h

index b0c82e5..d695224 100644 (file)
@@ -629,7 +629,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)
 {
   struct namemsg *namemessage;
@@ -661,17 +661,20 @@ olsr_parser(union olsr_message *m, struct interface *in_if __attribute__ ((unuse
   /* 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 5e97383..d11bb3b 100644 (file)
@@ -122,7 +122,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_parser(union olsr_message *, struct interface *, union olsr_ip_addr *);
+olsr_bool olsr_parser(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 /* callback for periodic timer */
 void olsr_namesvc_gen(void *);
index 5204f5d..d44c220 100644 (file)
@@ -317,7 +317,7 @@ iterTcTabInit(void)
   iterTcTab = (node ? vertex_tree2tc(node) : NULL);
 }
 
-static void
+static olsr_bool
 parserFunc(union olsr_message *msg, struct interface *inInt __attribute__ ((unused)), union olsr_ip_addr *neighIntAddr)
 {
   char *mess = (char *)msg;
@@ -327,16 +327,16 @@ parserFunc(union olsr_message *msg, struct interface *inInt __attribute__ ((unus
   int i;
 
   if (memcmp(orig, mainAddr, ipAddrLen) == 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 < ipAddrLen + 8 + 2) {
     error("short TAS message received (%d bytes)\n", len);
-    return;
+    return OLSR_FALSE;
   }
 
   len -= ipAddrLen + 8;
@@ -346,12 +346,12 @@ parserFunc(union olsr_message *msg, struct interface *inInt __attribute__ ((unus
 
   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;
@@ -361,10 +361,13 @@ parserFunc(union olsr_message *msg, struct interface *inInt __attribute__ ((unus
 
   if (i == len) {
     error("TAS message has unterminated payload string\n");
-    return;
+    return OLSR_FALSE;
   }
 
   httpAddTasMessage(service, string, rawIpAddrToString(orig, ipAddrLen));
+
+  /* Forward the message */
+  return OLSR_TRUE;
 }
 
 void
index 7eb6ef5..4d58583 100644 (file)
@@ -64,15 +64,16 @@ void list_remove(struct list_node *);
  * Merge elements of list_head2 at the end of list_head1.
  * list_head2 will be left empty.
  */
-static inline void list_merge(struct list_node *list_head1, struct list_node *list_head2) \
-{ \
-  if (!list_is_empty(list_head2)) {  \
-     list_head1->next->prev = list_head2->prev; \
-     list_head2->prev->next = list_head1->next; \
-     list_head1->next = list_head2->next; \
-     list_head2->next->prev = list_head1; \
-     list_head2->next = list_head2->prev = list_head2; \
-  } \
+static inline void
+list_merge(struct list_node *list_head1, struct list_node *list_head2)
+{
+  if (!list_is_empty(list_head2)) {
+    list_head1->next->prev = list_head2->prev;
+    list_head2->prev->next = list_head1->next;
+    list_head1->next = list_head2->next;
+    list_head2->next->prev = list_head1;
+    list_head2->next = list_head2->prev = list_head2;
+  }
 }
 
 /*
index 615ae2a..6c08fcf 100644 (file)
@@ -91,9 +91,9 @@ olsr_cleanup_duplicate_entry(void __attribute__ ((unused)) * unused)
 }
 
 int
-olsr_message_is_duplicate(union olsr_message *m, olsr_bool update)
+olsr_message_is_duplicate(union olsr_message *m)
 {
-  struct dup_entry *entry, tmp_entry;
+  struct dup_entry *entry;
   int diff;
   void *mainIp;
   clock_t valid_until;
@@ -119,20 +119,13 @@ olsr_message_is_duplicate(union olsr_message *m, olsr_bool update)
 
   entry = (struct dup_entry *)avl_find(&duplicate_set, ip);
   if (entry == NULL) {
-    if (!update) {
-      entry = olsr_create_duplicate_entry(ip, seqnr);
-      if (entry != NULL) {
-        avl_insert(&duplicate_set, &entry->avl, 0);
-        entry->valid_until = valid_until;
-      }
+    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);
 
index f38ec9b..a02a490 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(union olsr_message *m, olsr_bool update);
+int olsr_message_is_duplicate(union olsr_message *m);
 void olsr_print_duplicate_table(void);
 
 #define OLSR_FOR_ALL_DUP_ENTRIES(dup) \
index d783d13..f0ca052 100644 (file)
@@ -330,7 +330,7 @@ olsr_print_hna_set(void)
  *@return 1 on success
  */
 
-void
+olsr_bool
 olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((unused)), union olsr_ip_addr *from_addr)
 {
 
@@ -350,7 +350,7 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
 
   /* Check if everyting is ok */
   if (!m) {
-    return;
+    return OLSR_FALSE;
   }
   curr = (const olsr_u8_t *)m;
 
@@ -358,7 +358,7 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
   pkt_get_u8(&curr, &olsr_msgtype);
   if (olsr_msgtype != HNA_MESSAGE) {
     OLSR_PRINTF(0, "not a HNA message!\n");
-    return;
+    return OLSR_FALSE;
   }
   /* Get vtime */
   pkt_get_reltime(&curr, &vtime);
@@ -371,11 +371,11 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
     OLSR_PRINTF(0, "message size %d too small (at least %lu)!\n", olsr_msgsize,
                 (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, "Illegal message size %d!\n", olsr_msgsize);
-    return;
+    return OLSR_FALSE;
   }
   curr_end = (const olsr_u8_t *)m + olsr_msgsize;
 
@@ -400,7 +400,7 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
   if (check_neighbor_link(from_addr) != SYM_LINK) {
     struct ipaddr_str buf;
     OLSR_PRINTF(2, "Received HNA from NON SYM neighbor %s\n", olsr_ip_to_string(&buf, from_addr));
-    return;
+    return OLSR_FALSE;
   }
 #if 1
   while (curr < curr_end) {
@@ -424,6 +424,8 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
     }
   }
 #endif
+  /* Forward the message */
+  return OLSR_TRUE;
 }
 
 /*
index d4b01b9..96dc183 100644 (file)
@@ -94,7 +94,7 @@ void olsr_update_hna_entry(const union olsr_ip_addr *, const union olsr_ip_addr
 
 void olsr_print_hna_set(void);
 
-void olsr_input_hna(union olsr_message *, struct interface *, union olsr_ip_addr *);
+olsr_bool olsr_input_hna(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 #endif
 
index 69a871e..d308251 100644 (file)
@@ -208,16 +208,16 @@ ipc_input(int sock __attribute__ ((unused)))
  *
  *@param olsr the olsr struct representing the packet
  *
- *@return negative on error
+ *@return true for not preventing forwarding
  */
-void
-frontend_msgparser(union olsr_message *msg, struct interface *in_if __attribute__ ((unused)), union olsr_ip_addr *from_addr
+olsr_bool
+frontend_msgparser(union olsr_message * msg, struct interface * in_if __attribute__ ((unused)), union olsr_ip_addr * from_addr
                    __attribute__ ((unused)))
 {
   int size;
 
   if (!ipc_active)
-    return;
+    return OLSR_TRUE;
 
   if (olsr_cnf->ip_version == AF_INET)
     size = ntohs(msg->v4.olsr_msgsize);
@@ -229,6 +229,7 @@ frontend_msgparser(union olsr_message *msg, struct interface *in_if __attribute_
     CLOSE(ipc_conn);
     ipc_active = OLSR_FALSE;
   }
+  return OLSR_TRUE;
 }
 
 /**
index 2dddaa1..9cf3f91 100644 (file)
@@ -98,7 +98,7 @@ olsr_bool ipc_check_allowed_ip(const union olsr_ip_addr *);
 
 void ipc_accept(int);
 
-void frontend_msgparser(union olsr_message *, struct interface *, union olsr_ip_addr *);
+olsr_bool frontend_msgparser(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 int ipc_route_send_rtentry(const union olsr_ip_addr *, const union olsr_ip_addr *, int, int, const char *);
 
index 815117d..a9a5c7e 100644 (file)
@@ -525,7 +525,7 @@ olsr_print_mid_set(void)
  *@return 1 on success
  */
 
-void
+olsr_bool
 olsr_input_mid(union olsr_message *m, struct interface *in_if __attribute__ ((unused)), union olsr_ip_addr *from_addr)
 {
 #ifdef DEBUG
@@ -538,7 +538,7 @@ olsr_input_mid(union olsr_message *m, struct interface *in_if __attribute__ ((un
 
   if (!olsr_validate_address(&message.mid_origaddr)) {
     olsr_free_mid_packet(&message);
-    return;
+    return OLSR_FALSE;
   }
 #ifdef DEBUG
   OLSR_PRINTF(5, "Processing MID from %s...\n", olsr_ip_to_string(&buf, &message.mid_origaddr));
@@ -555,7 +555,7 @@ olsr_input_mid(union olsr_message *m, struct interface *in_if __attribute__ ((un
     struct ipaddr_str buf;
     OLSR_PRINTF(2, "Received MID from NON SYM neighbor %s\n", olsr_ip_to_string(&buf, from_addr));
     olsr_free_mid_packet(&message);
-    return;
+    return OLSR_FALSE;
   }
 
   /* Update the timeout of the MID */
@@ -573,6 +573,9 @@ olsr_input_mid(union olsr_message *m, struct interface *in_if __attribute__ ((un
 
   olsr_prune_aliases(&message.mid_origaddr, message.mid_addr);
   olsr_free_mid_packet(&message);
+
+  /* Forward the message */
+  return OLSR_TRUE;
 }
 
 /*
index 9880a68..a96649d 100644 (file)
@@ -84,7 +84,7 @@ void olsr_print_mid_set(void);
 void olsr_prune_aliases(const union olsr_ip_addr *, struct mid_alias *);
 int olsr_update_mid_table(const union olsr_ip_addr *, olsr_reltime);
 void olsr_delete_mid_entry(struct mid_entry *);
-void olsr_input_mid(union olsr_message *, struct interface *, union olsr_ip_addr *);
+olsr_bool olsr_input_mid(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 #endif
 
index c65375a..5e1a3f3 100644 (file)
@@ -324,7 +324,7 @@ olsr_forward_message(union olsr_message *m, union olsr_ip_addr *from_addr)
     return 0;
   }
 
-  if (olsr_message_is_duplicate(m, OLSR_TRUE)) {
+  if (olsr_message_is_duplicate(m)) {
     return 0;
   }
 
index 2dbc0e6..945503d 100644 (file)
@@ -302,6 +302,7 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
   }
 
   for (; count > 0; m = (union olsr_message *)((char *)m + (msgsize))) {
+    olsr_bool forward = OLSR_TRUE;
 
     if (count < MIN_PACKET_SIZE(olsr_cnf->ip_version))
       break;
@@ -343,26 +344,19 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
       continue;
     }
 
-    /* check for message duplicates */
-    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);
+        if (!entry->function(m, in_if, from_addr))
+          forward = OLSR_FALSE;
       }
       entry = entry->next;
     }
 
-    switch (olsr_cnf->ip_version == AF_INET ? m->v4.olsr_msgtype : m->v6.olsr_msgtype) {
-    case HELLO_MESSAGE:
-    case LQ_HELLO_MESSAGE:
-      break;
-    default:
+    if (forward) {
       olsr_forward_message(m, from_addr);
     }
   }                             /* for olsr_msg */
index 28ac12f..e23847f 100644 (file)
@@ -47,7 +47,8 @@
 
 #define PROMISCUOUS 0xffffffff
 
-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 caea57d..edc9eaa 100644 (file)
@@ -372,18 +372,21 @@ deserialize_hello(struct hello_message *hello, const void *ser)
   return 0;
 }
 
-void
-olsr_input_hello(union olsr_message *ser, struct interface *inif, union olsr_ip_addr *from)
+olsr_bool
+olsr_input_hello(union olsr_message * ser, struct interface * inif, union olsr_ip_addr * from)
 {
   struct hello_message hello;
 
   if (ser == NULL) {
-    return;
+    return OLSR_FALSE;
   }
   if (deserialize_hello(&hello, ser) != 0) {
-    return;
+    return OLSR_FALSE;
   }
   olsr_hello_tap(&hello, inif, from);
+
+  /* Do not forward hello messages */
+  return OLSR_FALSE;
 }
 
 /**
index 1d48319..466aef8 100644 (file)
 #include "packet.h"
 #include "neighbor_table.h"
 
-void olsr_input_hello(union olsr_message *ser, struct interface *inif, union olsr_ip_addr *from);
+olsr_bool olsr_input_hello(union olsr_message *, struct interface *, union olsr_ip_addr *);
 
 void olsr_init_package_process(void);
 
 void olsr_hello_tap(struct hello_message *, struct interface *, const union olsr_ip_addr *);
 
-void olsr_input_hello(union olsr_message *, struct interface *, union olsr_ip_addr *);
-
 #endif
 
 /*
index d1e6ebb..04c4de2 100644 (file)
@@ -338,9 +338,7 @@ olsr_walk_timers(clock_t * last_run)
 
     /* Walk all entries hanging off this hash bucket */
     list_head_init(&tmp_head_node);
-    for (timer_node = timer_head_node->next;
-         !list_is_empty(timer_head_node);
-         timer_node = timer_head_node->next) {
+    for (timer_node = timer_head_node->next; !list_is_empty(timer_head_node); timer_node = timer_head_node->next) {
 
       /*
        * Dequeue and insert to a temporary list.
index 4d104c5..bd9a1c6 100644 (file)
@@ -766,8 +766,8 @@ olsr_calculate_tc_border(olsr_u8_t lower_border, union olsr_ip_addr *lower_borde
  * as every call to pkt_get increases the packet offset and
  * hence the spot we are looking at.
  */
-void
-olsr_input_tc(union olsr_message *msg, struct interface *input_if __attribute__ ((unused)), union olsr_ip_addr *from_addr)
+olsr_bool
+olsr_input_tc(union olsr_message * msg, struct interface * input_if __attribute__ ((unused)), union olsr_ip_addr * from_addr)
 {
   struct ipaddr_str buf;
   olsr_u16_t size, msg_seq, ansn;
@@ -782,13 +782,13 @@ olsr_input_tc(union olsr_message *msg, struct interface *input_if __attribute__
 
   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);
@@ -816,7 +816,7 @@ olsr_input_tc(union olsr_message *msg, struct interface *input_if __attribute__
        * 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", olsr_ip_to_string(&buf, &originator));
@@ -833,7 +833,7 @@ olsr_input_tc(union olsr_message *msg, struct interface *input_if __attribute__
         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", olsr_ip_to_string(&buf, &originator));
@@ -863,7 +863,7 @@ olsr_input_tc(union olsr_message *msg, struct interface *input_if __attribute__
    */
   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", olsr_ip_to_string(&buf, &originator), tc->msg_seq);
@@ -913,6 +913,9 @@ olsr_input_tc(union olsr_message *msg, struct interface *input_if __attribute__
     olsr_set_timer(&tc->edge_gc_timer, OLSR_TC_EDGE_GC_TIME, 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 7c0cae9..d1b3250 100644 (file)
@@ -147,7 +147,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 *, union olsr_ip_addr *from);
+olsr_bool olsr_input_tc(union olsr_message *, struct interface *, union olsr_ip_addr *from);
 
 /* tc_entry manipulation */
 struct tc_entry *olsr_lookup_tc_entry(union olsr_ip_addr *);