Cleanup of messageparser callback interface
authorHenning Rogge <rogge@stream.(none)>
Mon, 30 Nov 2009 09:41:22 +0000 (10:41 +0100)
committerHenning Rogge <rogge@stream.(none)>
Mon, 30 Nov 2009 09:41:22 +0000 (10:41 +0100)
17 files changed:
lib/debuginfo/src/olsrd_debuginfo.c
lib/mdns/src/mdns.c
lib/mdns/src/mdns.h
lib/nameservice/src/nameservice.c
lib/nameservice/src/nameservice.h
lib/obamp/src/obamp.c
lib/obamp/src/obamp.h
src/hna_set.c
src/hna_set.h
src/mid_set.c
src/mid_set.h
src/olsr_protocol.h
src/parser.c
src/parser.h
src/process_package.c
src/tc_set.c
src/tc_set.h

index b576cc8..0c0eaef 100644 (file)
@@ -83,7 +83,7 @@ static enum olsr_txtcommand_result debuginfo_cookies(struct comport_connection *
     const char *cmd, const char *param);
 
 static void update_statistics_ptr(void *);
-static void olsr_msg_statistics(struct olsr_message *, const uint8_t *, const uint8_t *,
+static void olsr_msg_statistics(struct olsr_message *,
     struct interface *, union olsr_ip_addr *, enum duplicate_status);
 static uint8_t *olsr_packet_statistics(uint8_t *binary,
     struct interface *interface, union olsr_ip_addr *ip, int *length);
@@ -312,7 +312,6 @@ update_statistics_ptr(void *data __attribute__ ((unused)))
 /* update message statistics */
 static void
 olsr_msg_statistics(struct olsr_message *msg,
-    const uint8_t *payload  __attribute__ ((unused)), const uint8_t *end  __attribute__ ((unused)),
     struct interface *input_if __attribute__ ((unused)),
     union olsr_ip_addr *from_addr __attribute__ ((unused)), enum duplicate_status status  __attribute__ ((unused)))
 {
index 80d9dac..02b31cb 100644 (file)
@@ -154,7 +154,6 @@ PacketReceivedFromOLSR(const uint8_t *encapsulationUdpData, int len)
 
 void
 olsr_parser(struct olsr_message *msg,
-    const uint8_t *payload, const uint8_t *end,
     struct interface *in_if __attribute__ ((unused)),
     union olsr_ip_addr *ipaddr, enum duplicate_status status __attribute__ ((unused)))
 {
@@ -172,7 +171,7 @@ olsr_parser(struct olsr_message *msg,
     return;
   }
 
-  PacketReceivedFromOLSR(payload, end - payload);
+  PacketReceivedFromOLSR(msg->payload, msg->end - msg->payload);
 }
 
 //Sends a packet in the OLSR network
index 0547440..cbcb371 100644 (file)
@@ -84,8 +84,7 @@ void CloseMDNS(void);
 void olsr_mdns_gen(unsigned char *packet, int len);
 
 /* Parser function to register with the scheduler */
-void olsr_parser(struct olsr_message *, const uint8_t *, const uint8_t *,
-    struct interface *, union olsr_ip_addr *, enum duplicate_status);
+void olsr_parser(struct olsr_message *, struct interface *, union olsr_ip_addr *, enum duplicate_status);
 
 #endif /* _MDNS_MDNS_H */
 
index 6123bc5..be90a87 100644 (file)
@@ -658,8 +658,7 @@ olsr_namesvc_gen(void *foo __attribute__ ((unused)))
  * Parse name olsr message of NAME type
  */
 void
-olsr_parser(struct olsr_message *msg, const uint8_t *payload, const uint8_t *end,
-    struct interface *in_if __attribute__ ((unused)),
+olsr_parser(struct olsr_message *msg, struct interface *in_if __attribute__ ((unused)),
     union olsr_ip_addr *ipaddr, enum duplicate_status status __attribute__ ((unused)))
 {
   const struct namemsg *namemessage;
@@ -677,8 +676,8 @@ olsr_parser(struct olsr_message *msg, const uint8_t *payload, const uint8_t *end
     return;
   }
 
-  namemessage = (const struct namemsg *)(ARM_CONST_NOWARN_ALIGN)payload;
-  update_name_entry(&msg->originator, namemessage, end, msg->vtime);
+  namemessage = (const struct namemsg *)(ARM_CONST_NOWARN_ALIGN)msg->payload;
+  update_name_entry(&msg->originator, namemessage, msg->end, msg->vtime);
 }
 
 /**
index 680efa8..db46414 100644 (file)
@@ -129,8 +129,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(struct olsr_message *, const uint8_t *, const uint8_t *,
-    struct interface *, union olsr_ip_addr *, enum duplicate_status);
+void olsr_parser(struct olsr_message *, struct interface *, union olsr_ip_addr *, enum duplicate_status);
 
 /* callback for periodic timer */
 void olsr_namesvc_gen(void *);
index 0cfb1aa..c42fd05 100644 (file)
@@ -1115,7 +1115,7 @@ PacketReceivedFromOLSR(union olsr_ip_addr *originator, const uint8_t *obamp_mess
 
 //OLSR parser, received OBAMP messages
 void
-olsr_parser(struct olsr_message *msg, const uint8_t *payload, const uint8_t*end, struct interface *in_if
+olsr_parser(struct olsr_message *msg, struct interface *in_if
             __attribute__ ((unused)), union olsr_ip_addr *ipaddr, enum duplicate_status status __attribute__ ((unused)))
 {
   //OLSR_DEBUG(LOG_PLUGINS, "OBAMP PLUGIN: Received msg in parser\n");
@@ -1136,7 +1136,7 @@ olsr_parser(struct olsr_message *msg, const uint8_t *payload, const uint8_t*end,
     return;
   }
 
-  PacketReceivedFromOLSR(&msg->originator, payload, end - payload);
+  PacketReceivedFromOLSR(&msg->originator, msg->payload, msg->end - msg->payload);
 }
 
 //Sends a packet in the OLSR network
index 2248e49..d5e2b94 100644 (file)
@@ -124,7 +124,7 @@ int addObampNode4(struct in_addr *ipv4, u_int8_t status);
 
 
 /* Parser function to register with the scheduler */
-void olsr_parser(struct olsr_message *, const uint8_t *, const uint8_t *, struct interface *, union olsr_ip_addr *, enum duplicate_status);
+void olsr_parser(struct olsr_message *, struct interface *, union olsr_ip_addr *, enum duplicate_status);
 
 //Struct to describe the other OBAMP nodes in the mesh network
 struct ObampNode {
index 6dd6f7e..f0bbc56 100644 (file)
@@ -267,7 +267,7 @@ olsr_prune_hna_entries(struct tc_entry *tc)
  * Forwards the message if that is to be done.
  */
 void
-olsr_input_hna(struct olsr_message *msg, const uint8_t *payload, const uint8_t *end,
+olsr_input_hna(struct olsr_message *msg,
     struct interface *in_if __attribute__ ((unused)),
     union olsr_ip_addr *from_addr, enum duplicate_status status)
 {
@@ -306,8 +306,8 @@ olsr_input_hna(struct olsr_message *msg, const uint8_t *payload, const uint8_t *
   /*
    * Now walk the list of HNA advertisements.
    */
-  curr = payload;
-  while (curr + 2*olsr_cnf->ipsize <= end) {
+  curr = msg->payload;
+  while (curr + 2*olsr_cnf->ipsize <= msg->end) {
     pkt_get_ipaddress(&curr, &prefix.prefix);
     pkt_get_prefixlen(&curr, &prefix.prefix_len);
 
index 159e5bf..e67fa62 100644 (file)
@@ -63,8 +63,7 @@ AVLNODE2STRUCT(hna_tc_tree2hna, hna_net, hna_tc_node)
 #define OLSR_FOR_ALL_TC_HNA_ENTRIES_END() OLSR_FOR_ALL_AVL_ENTRIES_END()
 
 /* HNA msg input parser */
-void olsr_input_hna(struct olsr_message *, const uint8_t *, const uint8_t *,
-    struct interface *, union olsr_ip_addr *, enum duplicate_status);
+void olsr_input_hna(struct olsr_message *, struct interface *, union olsr_ip_addr *, enum duplicate_status);
 
 void olsr_init_hna_set(void);
 void olsr_flush_hna_nets(struct tc_entry *tc);
index 4f5b7d5..add0f1b 100644 (file)
@@ -471,7 +471,7 @@ olsr_print_mid_set(void)
  * Process an incoming MID message.
  */
 void
-olsr_input_mid(struct olsr_message *msg, const uint8_t *payload, const uint8_t *end,
+olsr_input_mid(struct olsr_message *msg,
     struct interface *input_if __attribute__ ((unused)),
     union olsr_ip_addr *from_addr, enum duplicate_status status)
 {
@@ -508,16 +508,16 @@ olsr_input_mid(struct olsr_message *msg, const uint8_t *payload, const uint8_t *
   tc->mid_seq = msg->seqno;
 
   OLSR_DEBUG(LOG_MID, "Processing MID from %s with %d aliases, seq 0x%04x\n",
-             olsr_ip_to_string(&buf, &msg->originator), (int)((end - payload)/olsr_cnf->ipsize), msg->seqno);
+             olsr_ip_to_string(&buf, &msg->originator), (int)((msg->end - msg->payload)/olsr_cnf->ipsize), msg->seqno);
 
 
-  curr = payload;
+  curr = msg->payload;
 
 
   /*
    * Now walk the list of alias advertisements one by one.
    */
-  while (curr + olsr_cnf->ipsize <= end) {
+  while (curr + olsr_cnf->ipsize <= msg->end) {
     pkt_get_ipaddress(&curr, &alias);
     olsr_update_mid_entry(&msg->originator, &alias, msg->vtime, msg->seqno);
   }
index 6ab0d15..e458fe6 100644 (file)
@@ -69,8 +69,7 @@ AVLNODE2STRUCT(alias_tree2mid, mid_entry, mid_tc_node);
 extern struct avl_tree mid_tree;
 
 /* MID msg input parser */
-void olsr_input_mid(struct olsr_message *, const uint8_t *payload, const uint8_t *end,
-    struct interface *, union olsr_ip_addr *, enum duplicate_status);
+void olsr_input_mid(struct olsr_message *, struct interface *, union olsr_ip_addr *, enum duplicate_status);
 
 void olsr_init_mid_set(void);
 void olsr_delete_mid_entry(struct mid_entry *);
index b13f427..b882e0f 100644 (file)
@@ -334,6 +334,11 @@ struct olsr_message {
   uint8_t ttl;
   uint8_t hopcnt;
   uint16_t seqno;
+
+  /* pointer to original data, they are initialized by the header_read function */
+  const uint8_t *header;
+  const uint8_t *payload;
+  const uint8_t *end;
 };
 
 /*
index 7ad42cd..3dfe635 100644 (file)
@@ -198,6 +198,8 @@ olsr_parse_msg_hdr(const uint8_t **curr, struct olsr_message *msg)
   assert(curr);
   assert(msg);
 
+  msg->header = *curr;
+
   pkt_get_u8(curr, &msg->type);
   pkt_get_reltime(curr, &msg->vtime);
   pkt_get_u16(curr, &msg->size);
@@ -205,6 +207,9 @@ olsr_parse_msg_hdr(const uint8_t **curr, struct olsr_message *msg)
   pkt_get_u8(curr, &msg->ttl);
   pkt_get_u8(curr, &msg->hopcnt);
   pkt_get_u16(curr, &msg->seqno);
+
+  msg->payload = *curr;
+  msg->end = msg->header + msg->size;
 }
 
 /**
@@ -256,10 +261,7 @@ parse_packet(uint8_t *binary, int size, struct interface *in_if, union olsr_ip_a
 
   for (;curr <= end - MIN_MESSAGE_SIZE(); curr += msg.size) {
     const uint8_t *msg_payload = curr;
-    const uint8_t *msg_end;
-
     olsr_parse_msg_hdr(&msg_payload, &msg);
-    msg_end = curr + msg.size;
 
     /* Check size of message */
     if (curr + msg.size > end) {
@@ -301,7 +303,7 @@ parse_packet(uint8_t *binary, int size, struct interface *in_if, union olsr_ip_a
         /* Should be the same for IPv4 and IPv6 */
         /* Promiscuous or exact match */
         if ((entry->type == PROMISCUOUS) || (entry->type == msg.type)) {
-          entry->function(&msg, msg_payload, msg_end, in_if, from_addr, dup_status);
+          entry->function(&msg, in_if, from_addr, dup_status);
         }
       }
     }
index b66f89f..4b468cd 100644 (file)
@@ -52,8 +52,7 @@
 #define MIN_MESSAGE_SIZE()     ((int)(8 + olsr_cnf->ipsize))
 
 /* Function returns false if the message should not be forwarded */
-typedef void parse_function(struct olsr_message *, const uint8_t *payload, const uint8_t *end,
-    struct interface *, union olsr_ip_addr *, enum duplicate_status);
+typedef void parse_function(struct olsr_message *, struct interface *, union olsr_ip_addr *, enum duplicate_status);
 
 struct parse_function_entry {
   uint32_t type;                       /* If set to PROMISCUOUS all messages will be received */
index 85be1ec..11d94f2 100644 (file)
@@ -48,7 +48,7 @@
 #include "parser.h"
 #include "olsr_logging.h"
 
-static void olsr_input_hello(struct olsr_message *msg, const uint8_t *payload, const uint8_t *end,
+static void olsr_input_hello(struct olsr_message *msg,
     struct interface *, union olsr_ip_addr *, enum duplicate_status);
 
 static void process_message_neighbors(struct nbr_entry *, const struct lq_hello_message *);
@@ -205,9 +205,9 @@ olsr_deinit_package_process(void)
 }
 
 static bool
-deserialize_hello(struct lq_hello_message *hello, struct olsr_message *msg, const uint8_t *payload, const uint8_t *end)
+deserialize_hello(struct lq_hello_message *hello, struct olsr_message *msg)
 {
-  const uint8_t *curr = payload;
+  const uint8_t *curr = msg->payload;
   hello->comm = msg;
 
   /* parse HELLO specific header */
@@ -216,7 +216,7 @@ deserialize_hello(struct lq_hello_message *hello, struct olsr_message *msg, cons
   pkt_get_u8(&curr, &hello->will);
 
   hello->neigh = NULL;
-  while (curr < end) {
+  while (curr < msg->end) {
     const uint8_t *ptr, *limit2;
     uint8_t link_code;
     uint16_t size;
@@ -323,12 +323,11 @@ hello_tap(struct lq_hello_message *message, struct interface *in_if, const union
 }
 
 static void
-olsr_input_hello(struct olsr_message *msg, const uint8_t *payload, const uint8_t *end,
-    struct interface *inif, union olsr_ip_addr *from,
+olsr_input_hello(struct olsr_message *msg, struct interface *inif, union olsr_ip_addr *from,
     enum duplicate_status status __attribute__ ((unused)))
 {
   struct lq_hello_message hello;
-  if (!deserialize_hello(&hello, msg, payload, end)) {
+  if (!deserialize_hello(&hello, msg)) {
     hello_tap(&hello, inif, from);
   }
 }
index 411a92d..2f17183 100644 (file)
@@ -752,7 +752,7 @@ olsr_calculate_tc_border(uint8_t lower_border,
  */
 
 void
-olsr_input_tc(struct olsr_message * msg, const uint8_t *payload, const uint8_t *end,
+olsr_input_tc(struct olsr_message * msg,
     struct interface * input_if __attribute__ ((unused)),
     union olsr_ip_addr * from_addr, enum duplicate_status status)
 {
@@ -782,7 +782,7 @@ olsr_input_tc(struct olsr_message * msg, const uint8_t *payload, const uint8_t *
     return;
   }
 
-  curr = payload;
+  curr = msg->payload;
   pkt_get_u16(&curr, &ansn);
 
   /* Get borders */
@@ -822,7 +822,7 @@ olsr_input_tc(struct olsr_message * msg, const uint8_t *payload, const uint8_t *
 
   borderSet = 0;
   relevantTc = false;
-  while (curr + olsr_cnf->ipsize + olsr_sizeof_TCLQ() <= end) {
+  while (curr + olsr_cnf->ipsize + olsr_sizeof_TCLQ() <= msg->end) {
     if (olsr_tc_update_edge(tc, ansn, &curr, &upper_border_ip)) {
       relevantTc = true;
     }
index 4551d4c..1b31a39 100644 (file)
@@ -139,8 +139,7 @@ void olsr_print_tc_table(void);
 void olsr_time_out_tc_set(void);
 
 /* tc msg input parser */
-void olsr_input_tc(struct olsr_message *, const uint8_t *payload,
-    const uint8_t *end, struct interface *, union olsr_ip_addr *, enum duplicate_status);
+void olsr_input_tc(struct olsr_message *, struct interface *, union olsr_ip_addr *, enum duplicate_status);
 
 /* tc_entry manipulation */
 struct tc_entry *EXPORT(olsr_lookup_tc_entry) (const union olsr_ip_addr *);