- killed hna_chgestruct to reduce malloc()/free() churn
authorBernd Petrovitsch <bernd@firmix.at>
Thu, 29 Nov 2007 23:03:07 +0000 (23:03 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Thu, 29 Nov 2007 23:03:07 +0000 (23:03 +0000)
src/lq_packet.h
src/packet.c
src/packet.h
src/process_package.c
src/rebuild_packet.c
src/rebuild_packet.h

index 564e1f7..ac9fb16 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: lq_packet.h,v 1.10 2007/11/16 22:56:54 bernd67 Exp $
+ * $Id: lq_packet.h,v 1.11 2007/11/29 23:03:07 bernd67 Exp $
  */
 
 #ifndef _OLSR_LQ_PACKET_H
@@ -45,6 +45,7 @@
 #include "olsr_types.h"
 #include "packet.h"
 #include "mantissa.h"
+#include "ipcalc.h"
 
 #define LQ_HELLO_MESSAGE      201
 #define LQ_TC_MESSAGE         202
@@ -141,15 +142,16 @@ struct lq_tc_header
   olsr_u16_t reserved;
 };
 
-static INLINE void        pkt_get_u8(const olsr_u8_t **p, olsr_u8_t  *var)         { *var =       *(const olsr_u8_t *)(*p);   *p += sizeof(olsr_u8_t); }
-static INLINE void       pkt_get_u16(const olsr_u8_t **p, olsr_u16_t *var)         { *var = ntohs(*(const olsr_u16_t *)(*p)); *p += sizeof(olsr_u16_t); }
-static INLINE void       pkt_get_u32(const olsr_u8_t **p, olsr_u32_t *var)         { *var = ntohl(*(const olsr_u32_t *)(p));  *p += sizeof(olsr_u32_t); }
-static INLINE void        pkt_get_s8(const olsr_u8_t **p, olsr_8_t  *var)          { *var =       *(const olsr_8_t *)(*p);    *p += sizeof(olsr_8_t); }
-static INLINE void       pkt_get_s16(const olsr_u8_t **p, olsr_16_t *var)          { *var = ntohs(*(const olsr_16_t *)(*p));  *p += sizeof(olsr_16_t); }
-static INLINE void       pkt_get_s32(const olsr_u8_t **p, olsr_32_t *var)          { *var = ntohl(*(const olsr_32_t *)(*p));  *p += sizeof(olsr_32_t); }
-static INLINE void    pkt_get_double(const olsr_u8_t **p, double *var)             { *var = me_to_double(**p);                *p += sizeof(olsr_u8_t); }
-static INLINE void pkt_get_ipaddress(const olsr_u8_t **p, union olsr_ip_addr *var) { memcpy(var, *p, olsr_cnf->ipsize);       *p += olsr_cnf->ipsize; }
-static INLINE void        pkt_get_lq(const olsr_u8_t **p, double *var)             { *var = (const double)**p / 255.0;        *p += sizeof(olsr_u8_t); }
+static INLINE void        pkt_get_u8(const olsr_u8_t **p, olsr_u8_t  *var)         { *var =       *(const olsr_u8_t *)(*p);          *p += sizeof(olsr_u8_t); }
+static INLINE void       pkt_get_u16(const olsr_u8_t **p, olsr_u16_t *var)         { *var = ntohs(*(const olsr_u16_t *)(*p));        *p += sizeof(olsr_u16_t); }
+static INLINE void       pkt_get_u32(const olsr_u8_t **p, olsr_u32_t *var)         { *var = ntohl(*(const olsr_u32_t *)(p));         *p += sizeof(olsr_u32_t); }
+static INLINE void        pkt_get_s8(const olsr_u8_t **p, olsr_8_t  *var)          { *var =       *(const olsr_8_t *)(*p);           *p += sizeof(olsr_8_t); }
+static INLINE void       pkt_get_s16(const olsr_u8_t **p, olsr_16_t *var)          { *var = ntohs(*(const olsr_16_t *)(*p));         *p += sizeof(olsr_16_t); }
+static INLINE void       pkt_get_s32(const olsr_u8_t **p, olsr_32_t *var)          { *var = ntohl(*(const olsr_32_t *)(*p));         *p += sizeof(olsr_32_t); }
+static INLINE void    pkt_get_double(const olsr_u8_t **p, double *var)             { *var = me_to_double(**p);                       *p += sizeof(olsr_u8_t); }
+static INLINE void pkt_get_ipaddress(const olsr_u8_t **p, union olsr_ip_addr *var) { memcpy(var, *p, olsr_cnf->ipsize);              *p += olsr_cnf->ipsize; }
+static INLINE void pkt_get_prefixlen(const olsr_u8_t **p, olsr_u8_t *var)          { *var = netmask_to_prefix(*p, olsr_cnf->ipsize); *p += olsr_cnf->ipsize; }
+static INLINE void        pkt_get_lq(const olsr_u8_t **p, double *var)             { *var = (const double)**p / 255.0;               *p += sizeof(olsr_u8_t); }
 
 static INLINE void        pkt_ignore_u8(const olsr_u8_t **p) { *p += sizeof(olsr_u8_t); }
 static INLINE void       pkt_ignore_u16(const olsr_u8_t **p) { *p += sizeof(olsr_u16_t); }
@@ -158,16 +160,18 @@ static INLINE void        pkt_ignore_s8(const olsr_u8_t **p) { *p += sizeof(olsr
 static INLINE void       pkt_ignore_s16(const olsr_u8_t **p) { *p += sizeof(olsr_16_t); }
 static INLINE void       pkt_ignore_s32(const olsr_u8_t **p) { *p += sizeof(olsr_32_t); }
 static INLINE void pkt_ignore_ipaddress(const olsr_u8_t **p) { *p += olsr_cnf->ipsize; }
-
-static INLINE void        pkt_put_u8(olsr_u8_t **p, const olsr_u8_t  var)         { *(olsr_u8_t *)(*p)  = var;        *p += sizeof(olsr_u8_t); }
-static INLINE void       pkt_put_u16(olsr_u8_t **p, const olsr_u16_t var)         { *(olsr_u16_t *)(*p) = htons(var); *p += sizeof(olsr_u16_t); }
-static INLINE void       pkt_put_u32(olsr_u8_t **p, const olsr_u32_t var)         { *(olsr_u32_t *)(*p) = htonl(var); *p += sizeof(olsr_u32_t); }
-static INLINE void        pkt_put_s8(olsr_u8_t **p, const olsr_8_t  var)          { *(olsr_8_t *)(*p)   = var;        *p += sizeof(olsr_8_t); }
-static INLINE void       pkt_put_s16(olsr_u8_t **p, const olsr_16_t var)          { *(olsr_16_t *)(*p)  = htons(var); *p += sizeof(olsr_16_t); }
-static INLINE void       pkt_put_s32(olsr_u8_t **p, const olsr_32_t var)          { *(olsr_32_t *)(*p)  = htonl(var); *p += sizeof(olsr_32_t); }
-static INLINE void    pkt_put_double(olsr_u8_t **p, const double var)             { **p = double_to_me(var);          *p += sizeof(olsr_u8_t); }
-static INLINE void pkt_put_ipaddress(olsr_u8_t **p, const union olsr_ip_addr var) { memcpy(*p, &var, olsr_cnf->ipsize); *p += olsr_cnf->ipsize; }
-static INLINE void        pkt_put_lq(olsr_u8_t **p, const double var)             { **p  = var * 255.0;               *p += sizeof(olsr_u8_t); }
+static INLINE void pkt_ignore_prefixlen(const olsr_u8_t **p) { *p += olsr_cnf->ipsize; }
+
+static INLINE void        pkt_put_u8(olsr_u8_t **p, olsr_u8_t  var)                { *(olsr_u8_t *)(*p)  = var;          *p += sizeof(olsr_u8_t); }
+static INLINE void       pkt_put_u16(olsr_u8_t **p, olsr_u16_t var)                { *(olsr_u16_t *)(*p) = htons(var);   *p += sizeof(olsr_u16_t); }
+static INLINE void       pkt_put_u32(olsr_u8_t **p, olsr_u32_t var)                { *(olsr_u32_t *)(*p) = htonl(var);   *p += sizeof(olsr_u32_t); }
+static INLINE void        pkt_put_s8(olsr_u8_t **p, olsr_8_t  var)                 { *(olsr_8_t *)(*p)   = var;          *p += sizeof(olsr_8_t); }
+static INLINE void       pkt_put_s16(olsr_u8_t **p, olsr_16_t var)                 { *(olsr_16_t *)(*p)  = htons(var);   *p += sizeof(olsr_16_t); }
+static INLINE void       pkt_put_s32(olsr_u8_t **p, olsr_32_t var)                 { *(olsr_32_t *)(*p)  = htonl(var);   *p += sizeof(olsr_32_t); }
+static INLINE void    pkt_put_double(olsr_u8_t **p, double var)                    { **p = double_to_me(var);            *p += sizeof(olsr_u8_t); }
+static INLINE void pkt_put_ipaddress(olsr_u8_t **p, const union olsr_ip_addr *var) { memcpy(*p, var, olsr_cnf->ipsize); *p += olsr_cnf->ipsize; }
+static INLINE void pkt_put_prefixlen(olsr_u8_t **p, olsr_u8_t var)                 { prefix_to_netmask(*p, olsr_cnf->ipsize, var); *p += olsr_cnf->ipsize; }
+static INLINE void        pkt_put_lq(olsr_u8_t **p, double var)                    { **p  = var * 255.0;                 *p += sizeof(olsr_u8_t); }
 
 void olsr_output_lq_hello(void *para);
 
index 1e3c09f..efe39b2 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: packet.c,v 1.28 2007/11/29 18:10:16 bernd67 Exp $
+ * $Id: packet.c,v 1.29 2007/11/29 23:03:07 bernd67 Exp $
  */
 
 
@@ -438,32 +438,6 @@ olsr_build_tc_packet(struct tc_message *message)
   return 0;
 }
 
-
-/**
- *Free the memory allocated for a HNA packet.
- *
- *@param message the pointer to the packet to erase
- *
- *@return nada
- */
-
-void
-olsr_free_hna_packet(struct hna_message *message)
-{
-  struct hna_net_addr  *hna_tmp, *hna_tmp2;
-
-  hna_tmp = message->hna_net;
-
-  while(hna_tmp)
-    {
-      hna_tmp2 = hna_tmp;
-      hna_tmp = hna_tmp->next;
-      free(hna_tmp2);
-    }
-}
-
-
-
 /**
  *Free the memory allocated for a MID packet.
  *
index 39b1dbb..b6c1eae 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: packet.h,v 1.19 2007/11/29 00:49:39 bernd67 Exp $
+ * $Id: packet.h,v 1.20 2007/11/29 23:03:07 bernd67 Exp $
  */
 
 #ifndef _OLSR_PACKET
@@ -89,33 +89,6 @@ struct tc_message
   struct tc_mpr_addr  *multipoint_relay_selector_address;
 };
 
-/*
- *HNA message format:
- *NET
- *NETMASK
- *NET
- *NETMASK
- *......
- */
-
-struct hna_net_addr
-{
-  union olsr_ip_addr  net;
-  olsr_u8_t           prefixlen;
-  struct hna_net_addr *next;
-};
-
-
-struct hna_message
-{
-  double               vtime;
-  union olsr_ip_addr   originator;
-  olsr_u16_t           packet_seq_number;
-  olsr_u8_t            hop_count;
-  struct hna_net_addr *hna_net;
-};
-
-
 /*
  *MID messages - format:
  *
@@ -166,7 +139,4 @@ olsr_build_tc_packet(struct tc_message *);
 void
 olsr_free_mid_packet(struct mid_message *);
 
-void
-olsr_free_hna_packet(struct hna_message *);
-
 #endif
index ab884c1..0e8654c 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: process_package.c,v 1.48 2007/11/29 18:10:17 bernd67 Exp $
+ * $Id: process_package.c,v 1.49 2007/11/29 23:03:07 bernd67 Exp $
  */
 
 #include "process_package.h"
@@ -55,6 +55,7 @@
 #include "scheduler.h"
 #include "net_olsr.h"
 
+#include <stddef.h>
 
 static void process_message_neighbors(struct neighbor_entry *, const struct hello_message *);
 
@@ -671,53 +672,104 @@ olsr_process_received_hna(union olsr_message *m,
                           struct interface *in_if,
                           union olsr_ip_addr *from_addr)
 {
-  struct hna_net_addr  *hna_tmp;
-  struct  hna_message message;
+
+  olsr_u8_t          olsr_msgtype;
+  double             vtime;
+  olsr_u16_t         olsr_msgsize;
+  union olsr_ip_addr originator;
+  //olsr_u8_t          ttl; unused
+  olsr_u8_t          hop_count;
+  olsr_u16_t         packet_seq_number;
+
+  int                hnasize;
+  const olsr_u8_t    *curr, *curr_end;
 
 #ifdef DEBUG
   OLSR_PRINTF(5, "Processing HNA\n");
 #endif
 
-  hna_chgestruct(&message, m);
+  /* Check if everyting is ok */
+  if (!m) {
+    return;
+  }
+  curr = (const olsr_u8_t *)m;
 
-  if(!olsr_validate_address(&message.originator)) {
-    olsr_free_hna_packet(&message);
+  /* olsr_msgtype */
+  pkt_get_u8(&curr, &olsr_msgtype);
+  if (olsr_msgtype != HNA_MESSAGE) {
+    OLSR_PRINTF(0, "not a HNA message!\n");
+    return;
+  }
+  /* Get vtime */
+  pkt_get_double(&curr, &vtime);
+
+  /* olsr_msgsize */
+  pkt_get_u16(&curr, &olsr_msgsize);
+  hnasize = olsr_msgsize - (olsr_cnf->ip_version == AF_INET ? offsetof(struct olsrmsg, message) : offsetof(struct olsrmsg6, message));
+  if (hnasize < 0) {
+    OLSR_PRINTF(0, "message size %d too small (at least %d)!\n", olsr_msgsize, (olsr_cnf->ip_version == AF_INET ? offsetof(struct olsrmsg, message) : offsetof(struct olsrmsg6, message)));
+    return;
+  }
+  if ((hnasize % (2 * olsr_cnf->ipsize)) != 0) {
+    OLSR_PRINTF(0, "Illegal message size %d!\n", olsr_msgsize);
     return;
   }
+  curr_end = (const olsr_u8_t *)m + olsr_msgsize;
 
-  if (olsr_check_dup_table_proc(&message.originator, 
-                                message.packet_seq_number)) {
+  /* validate originator */
+  pkt_get_ipaddress(&curr, &originator);
+  //printf("HNA from %s\n\n", olsr_ip_to_string(&buf, &originator));
+  if (!olsr_validate_address(&originator)) {
+    OLSR_PRINTF(0, "invalid address!\n");
+    return;
+  }
 
-    hna_tmp = message.hna_net;
+  /* ttl */
+  pkt_ignore_u8(&curr);
 
+  /* hopcnt */
+  pkt_get_u8(&curr, &hop_count);
+
+  /* seqno */
+  pkt_get_u16(&curr, &packet_seq_number);
+
+  if (olsr_check_dup_table_proc(&originator, packet_seq_number)) {
     /*
      *      If the sender interface (NB: not originator) of this message
      *      is not in the symmetric 1-hop neighborhood of this node, the
      *      message MUST be discarded.
      */
-    if(check_neighbor_link(from_addr) != SYM_LINK) {
+    if (check_neighbor_link(from_addr) != SYM_LINK) {
 #ifndef NODEBUG
       struct ipaddr_str buf;
 #endif
       OLSR_PRINTF(2, "Received HNA from NON SYM neighbor %s\n", olsr_ip_to_string(&buf, from_addr));
-      olsr_free_hna_packet(&message);
       return;
     }
-
+#if 1
+    while (curr < curr_end) {
+      union olsr_ip_addr net;
+      olsr_u8_t prefixlen;
+      struct ip_prefix_list *entry;
+
+      pkt_get_ipaddress(&curr, &net);
+      pkt_get_prefixlen(&curr, &prefixlen);
+      entry = ip_prefix_list_find(olsr_cnf->hna_entries, &net, prefixlen);
+      if (entry == NULL) {
+        /* only update if it's not from us */
+        olsr_update_hna_entry(&originator, &net, prefixlen, vtime);
+#else
     while (hna_tmp) {
       /* Don't add an HNA entry that we are advertising ourselves. */
       if (!ip_prefix_list_find(olsr_cnf->hna_entries, &hna_tmp->net, hna_tmp->prefixlen)) {
         olsr_update_hna_entry(&message.originator, &hna_tmp->net, hna_tmp->prefixlen, message.vtime);
+#endif
       }
-
-      hna_tmp = hna_tmp->next;
     }
   }
-
   olsr_forward_message(m, 
-                      &message.originator, 
-                      message.packet_seq_number, 
-                      in_if,
-                      from_addr);
-  olsr_free_hna_packet(&message);
+                       &originator, 
+                       packet_seq_number, 
+                       in_if,
+                       from_addr);
 }
index c198724..a4d1a42 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: rebuild_packet.c,v 1.27 2007/11/29 18:10:17 bernd67 Exp $
+ * $Id: rebuild_packet.c,v 1.28 2007/11/29 23:03:07 bernd67 Exp $
  */
 
-
 #include "rebuild_packet.h"
 #include "ipcalc.h"
 #include "defs.h"
 #include "mantissa.h"
 #include "net_olsr.h"
 
-/**
- *Process/rebuild HNA message. Converts the OLSR
- *packet to the internal hna_message format.
- *@param hmsg the hna_message struct in wich infomation
- *is to be put.
- *@param m the entire OLSR message revieved.
- *@return negative on error
- */
-
-void
-hna_chgestruct(struct hna_message *hmsg, const union olsr_message *m)
-{
-  struct hna_net_addr *hna_pairs, *tmp_pairs;
-  int no_pairs, i;
-
-  /*Check if everyting is ok*/
-  if ((!m) || (m->v4.olsr_msgtype != HNA_MESSAGE))
-    return;
-  
-
-  if(olsr_cnf->ip_version == AF_INET)
-    {
-      /* IPv4 */
-      const struct hnapair *haddr = m->v4.message.hna.hna_net;
-
-      /*
-       * How many HNA pairs?
-       * nextmsg contains size of
-       * the addresses + 12 bytes(nextmessage, from address and the header)
-       */
-      no_pairs = (ntohs(m->v4.olsr_msgsize) - 12) / 8;
-      
-      hmsg->originator.v4.s_addr = m->v4.originator;
-
-      hmsg->packet_seq_number = ntohs(m->v4.seqno);
-      hmsg->hop_count =  m->v4.hopcnt;
-
-      //printf("HNA from %s\n\n", olsr_ip_to_string(&buf, (union olsr_ip_addr *)&hmsg->originator));
-
-      /* Get vtime */
-      hmsg->vtime = me_to_double(m->v4.olsr_vtime);
-
-      tmp_pairs = NULL;
-      hna_pairs = NULL;
-
-      for(i = 0; i < no_pairs; i++) {    
-         hna_pairs = olsr_malloc(sizeof(struct hna_net_addr), "HNA chgestruct");
-         
-          hna_pairs->net.v4.s_addr = haddr->addr;
-          hna_pairs->prefixlen = olsr_netmask4_to_prefix(&haddr->netmask);
-
-         hna_pairs->next = tmp_pairs;    
-         tmp_pairs = hna_pairs;
-         haddr++;
-       }
-    }
-  else
-    {
-      /* IPv6 */
-      const struct hnapair6 *haddr6 = m->v6.message.hna.hna_net;
-
-      /*
-       * How many HNA pairs?
-       * nextmsg contains size of
-       * the addresses + 12 bytes(nextmessage, from address and the header)
-       */
-      no_pairs = (ntohs(m->v6.olsr_msgsize) - 24) / 32; /* NB 32 not 8 */
-      
-      hmsg->originator.v6 = m->v6.originator;
-      hmsg->packet_seq_number = ntohs(m->v6.seqno);
-      hmsg->hop_count =  m->v6.hopcnt;
-      
-      /* Get vtime */
-      hmsg->vtime = me_to_double(m->v6.olsr_vtime);
-      
-      tmp_pairs = NULL;
-      hna_pairs = NULL;
-      
-      for(i = 0; i < no_pairs; i++)
-       {
-         
-         hna_pairs = olsr_malloc(sizeof(struct hna_net_addr), "HNA chgestruct 2");       
-         
-         hna_pairs->net.v6 = haddr6->addr;
-          hna_pairs->prefixlen = olsr_netmask6_to_prefix(&haddr6->netmask);
-
-         hna_pairs->next = tmp_pairs;
-         
-         tmp_pairs = hna_pairs;
-         haddr6++;       
-       }
-    }      
-
-  /* 
-     tmp_pairs = hna_pairs;
-        
-     while(tmp_pairs)
-     {
-     printf("\t net: %s ", ip_to_string(&tmp_pairs->net));
-     printf("\t mask: %s\n", ip_to_string(&tmp_pairs->netmask));
-     tmp_pairs = tmp_pairs->next;
-     }
-     printf("\n");
-  */
-
-
-
-  hmsg->hna_net = hna_pairs;
-}
-
-
 /**
  *Process/rebuild MID message. Converts the OLSR
  *packet to the internal mid_message format.
index 765e693..6b3e393 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: rebuild_packet.h,v 1.10 2007/11/16 21:43:55 bernd67 Exp $
+ * $Id: rebuild_packet.h,v 1.11 2007/11/29 23:03:07 bernd67 Exp $
  */
 
 
@@ -48,9 +48,6 @@
 #include "olsr_protocol.h"
 #include "packet.h"
 
-void
-hna_chgestruct(struct hna_message *, const union olsr_message *);
-
 void
 mid_chgestruct(struct mid_message *, const union olsr_message *);