Added code that generates LQ_HELLO and LQ_TC messages. Code compiles but
authorThomas Lopatic <thomas@lopatic.de>
Mon, 1 Nov 2004 19:27:11 +0000 (19:27 +0000)
committerThomas Lopatic <thomas@lopatic.de>
Mon, 1 Nov 2004 19:27:11 +0000 (19:27 +0000)
is completely untested.

src/build_msg.c
src/build_msg.h
src/generate_msg.c
src/link_set.h
src/olsr_protocol.h
src/packet.c
src/packet.h

index d8b569b..2be05fc 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: build_msg.c,v 1.17 2004/10/20 19:43:04 kattemat Exp $
+ * $Id: build_msg.c,v 1.18 2004/11/01 19:27:10 tlopatic Exp $
  *
  */
 
@@ -1264,3 +1264,378 @@ hna_build6(struct interface *ifp)
 
 }
 
+#if defined USE_LINK_QUALITY
+void
+lq_hello_build(struct lq_hello_message *msg, struct interface *outif)
+{
+  int off, rem, size, req;
+  union olsr_message *olsr_msg;
+  struct lq_hello_header *head;
+  struct lq_hello_info_header *info_head;
+  struct lq_hello_neighbor *neigh;
+  unsigned char *buff;
+  int is_first;
+  int i, j;
+
+  if (msg == NULL || outif == NULL)
+    return;
+
+  olsr_msg = (union olsr_message *)msg_buffer;
+
+  // initialize the OLSR header
+
+  if (olsr_cnf->ip_version == AF_INET)
+    {
+      olsr_msg->v4.olsr_msgtype = LQ_HELLO_MESSAGE;
+      olsr_msg->v4.olsr_vtime = outif->valtimes.hello;
+
+      COPY_IP(&olsr_msg->v4.originator, &msg->main);
+
+      olsr_msg->v4.ttl = msg->ttl;
+      olsr_msg->v4.hopcnt = msg->hops;
+    }
+
+  else
+    {
+      olsr_msg->v6.olsr_msgtype = LQ_HELLO_MESSAGE;
+      olsr_msg->v6.olsr_vtime = outif->valtimes.hello;
+
+      COPY_IP(&olsr_msg->v6.originator, &msg->main);
+
+      olsr_msg->v6.ttl = msg->ttl;
+      olsr_msg->v6.hopcnt = msg->hops;
+    }
+
+  off = 8 + ipsize;
+
+  // initialize the LQ_HELLO header
+
+  head = (struct lq_hello_header *)(msg_buffer + off);
+
+  head->reserved = 0;
+  head->htime = outif->hello_etime;
+  head->will = msg->will; 
+
+  // 'off' is the offset of the byte following the LQ_HELLO header
+
+  off += sizeof (struct lq_hello_header);
+
+  // our work buffer starts at 'off'...
+
+  buff = msg_buffer + off;
+
+  // ... that's why we start with a 'size' of 0 and subtract 'off' from
+  // the remaining bytes in the output buffer
+
+  size = 0;
+  rem = net_outbuffer_bytes_left(outif) - off;
+
+  // initially, we want to put at least an info header, an IP address,
+  // and the corresponding link quality into the message
+
+  if (rem < sizeof (struct lq_hello_info_header) + ipsize + 4)
+  {
+    net_output(outif);
+
+    rem = net_outbuffer_bytes_left(outif) - off;
+  }
+
+  info_head = NULL;
+
+  // iterate through all neighbor types ('i') and all link types ('j')
+
+  for (i = 0; i <= MAX_NEIGH; i++) 
+    {
+      for(j = 0; j <= MAX_LINK; j++)
+       {
+         if(j == HIDE_LINK)
+             continue;
+
+          is_first = 1;
+
+          // loop through neighbors
+
+         for (neigh = msg->neigh; neigh != NULL; neigh = neigh->next)
+           {  
+             if (neigh->neigh_type != i || neigh->link_type != j)
+                continue;
+
+              // we need space for an IP address plus link quality
+              // information
+
+              req = ipsize + 4;
+
+              // no, we also need space for an info header, as this is the
+              // first neighbor with the current neighor type and link type
+
+              if (is_first != 0)
+                req += sizeof (struct lq_hello_info_header);
+
+              // we do not have enough space left
+
+              if (size + req > rem)
+                {
+                  // finalize the OLSR header
+                  
+                  if (olsr_cnf->ip_version == AF_INET)
+                    {
+                      olsr_msg->v4.seqno = htons(get_msg_seqno());
+                      olsr_msg->v4.olsr_msgsize = htons(size + off);
+                    }
+
+                  else
+                    {
+                      olsr_msg->v6.seqno = htons(get_msg_seqno());
+                      olsr_msg->v6.olsr_msgsize = htons(size + off);
+                    }
+                             
+                  // finalize the info header
+
+                  info_head->size =
+                    ntohs(buff + size - (unsigned char *)info_head);
+                             
+                  // output packet
+
+                  net_outbuffer_push(outif, msg_buffer, size + off);
+
+                  net_output(outif);
+
+                  // move to the beginning of the buffer
+
+                  size = 0;
+                  rem = net_outbuffer_bytes_left(outif) - off;
+
+                  // we need a new info header
+
+                  is_first = 1;
+                }
+
+              // create a new info header
+
+              if (is_first != 0)
+                {
+                  info_head = (struct lq_hello_info_header *)(buff + size);
+                  size += sizeof (struct lq_hello_info_header);
+
+                  info_head->reserved = 0;
+                  info_head->link_code = CREATE_LINK_CODE(i, j);
+                }
+
+#ifdef DEBUG
+              olsr_printf(5, "\tLink status of %s: %d\n",
+                          olsr_ip_to_string(&neigh->address), neigh->link);
+#endif
+                 
+              // add the current neighbor's IP address
+
+              COPY_IP(buff + size, &neigh->addr);
+              size += ipsize;
+
+              // add the corresponding link quality
+
+              buff[size++] = (unsigned char)(neigh->link_quality * 256);
+
+              // pad
+
+              buff[size++] = 0;
+              buff[size++] = 0;
+              buff[size++] = 0;
+
+              is_first = 0;
+           }
+
+          // finalize the info header, if there are any neighbors with the
+          // current neighbor type and link type
+
+         if (is_first == 0)
+            info_head->size = ntohs(buff + size - (unsigned char *)info_head);
+       }
+    }
+
+  // finalize the OLSR header
+     
+  if (olsr_cnf->ip_version == AF_INET)
+    {
+      olsr_msg->v4.seqno = htons(get_msg_seqno());
+      olsr_msg->v4.olsr_msgsize = htons(size + off);
+    }
+
+  else
+    {
+      olsr_msg->v6.seqno = htons(get_msg_seqno());
+      olsr_msg->v6.olsr_msgsize = htons(size + off);
+    }
+                             
+  // move the message to the output buffer
+
+  net_outbuffer_push(outif, msg_buffer, size + off);
+
+  // clean-up
+
+  olsr_destroy_lq_hello_message(msg);
+}
+
+void
+lq_tc_build(struct lq_tc_message *msg, struct interface *outif)
+{
+  int off, rem, size;
+  union olsr_message *olsr_msg;
+  struct lq_tc_header *head;
+  struct lq_tc_neighbor *neigh;
+  unsigned char *buff;
+  int is_empty;
+
+  if (msg == NULL || outif == NULL)
+    return;
+
+  olsr_msg = (union olsr_message *)msg_buffer;
+
+  // initialize the OLSR header
+
+  if (olsr_cnf->ip_version == AF_INET)
+    {
+      olsr_msg->v4.olsr_msgtype = LQ_TC_MESSAGE;
+      olsr_msg->v4.olsr_vtime = outif->valtimes.tc;
+
+      COPY_IP(&olsr_msg->v4.originator, &msg->main);
+
+      olsr_msg->v4.ttl = msg->ttl;
+      olsr_msg->v4.hopcnt = msg->hops;
+    }
+
+  else
+    {
+      olsr_msg->v6.olsr_msgtype = LQ_TC_MESSAGE;
+      olsr_msg->v6.olsr_vtime = outif->valtimes.tc;
+
+      COPY_IP(&olsr_msg->v6.originator, &msg->main);
+
+      olsr_msg->v6.ttl = msg->ttl;
+      olsr_msg->v6.hopcnt = msg->hops;
+    }
+
+  off = 8 + ipsize;
+
+  // initialize the LQ_TC header
+
+  head = (struct lq_tc_header *)(msg_buffer + off);
+
+  head->ansn = htons(msg->ansn);
+  head->reserved = 0;
+
+  // 'off' is the offset of the byte following the LQ_TC header
+
+  off += sizeof (struct lq_tc_header);
+
+  // our work buffer starts at 'off'...
+
+  buff = msg_buffer + off;
+
+  // ... that's why we start with a 'size' of 0 and subtract 'off' from
+  // the remaining bytes in the output buffer
+
+  size = 0;
+  rem = net_outbuffer_bytes_left(outif) - off;
+
+  // initially, we want to put at least an IP address and the corresponding
+  // link quality into the message
+
+  if (rem < ipsize + 4)
+  {
+    net_output(outif);
+
+    rem = net_outbuffer_bytes_left(outif) - off;
+  }
+
+  // initially, we're empty
+
+  is_empty = 1;
+
+  // loop through neighbors
+
+  for (neigh = msg->neigh; neigh != NULL; neigh = neigh->next)
+    {  
+      // we need space for an IP address plus link quality
+      // information
+
+      if (size + ipsize + 4 > rem)
+        {
+          // finalize the OLSR header
+                  
+          if (olsr_cnf->ip_version == AF_INET)
+            {
+              olsr_msg->v4.seqno = htons(get_msg_seqno());
+              olsr_msg->v4.olsr_msgsize = htons(size + off);
+            }
+
+          else
+            {
+              olsr_msg->v6.seqno = htons(get_msg_seqno());
+              olsr_msg->v6.olsr_msgsize = htons(size + off);
+            }
+
+          // output packet
+
+          net_outbuffer_push(outif, msg_buffer, size + off);
+
+          net_output(outif);
+
+          // move to the beginning of the buffer
+
+          size = 0;
+          rem = net_outbuffer_bytes_left(outif) - off;
+        }
+
+      // add the current neighbor's IP address
+
+      COPY_IP(buff + size, &neigh->main);
+      size += ipsize;
+
+      // add the corresponding link quality
+
+      buff[size++] = (unsigned char)(neigh->link_quality * 256);
+
+      // pad
+
+      buff[size++] = 0;
+      buff[size++] = 0;
+      buff[size++] = 0;
+
+      // we're not empty any longer
+
+      is_empty = 0;
+    }
+
+  // finalize the OLSR header
+     
+  if (olsr_cnf->ip_version == AF_INET)
+    {
+      olsr_msg->v4.seqno = htons(get_msg_seqno());
+      olsr_msg->v4.olsr_msgsize = htons(size + off);
+    }
+
+  else
+    {
+      olsr_msg->v6.seqno = htons(get_msg_seqno());
+      olsr_msg->v6.olsr_msgsize = htons(size + off);
+    }
+                             
+  // if we did not advertise any neighbors, we might still want to
+  // send empty LQ_TC messages
+
+  if (is_empty != 0 && !TIMED_OUT(&send_empty_tc))
+  {
+    olsr_printf(1, "LQ_TC: Sending empty package\n");
+    is_empty = 0;
+  }
+
+  // move the message to the output buffer
+
+  if (is_empty == 0)
+    net_outbuffer_push(outif, msg_buffer, size + off);
+
+  // clean-up
+
+  olsr_destroy_lq_tc_message(msg);
+}
+#endif
index e3c0c57..6566c34 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: build_msg.h,v 1.7 2004/09/21 19:08:57 kattemat Exp $
+ * $Id: build_msg.h,v 1.8 2004/11/01 19:27:10 tlopatic Exp $
  *
  */
 
@@ -41,7 +41,12 @@ mid_build(struct interface *);
 void
 hna_build(struct interface *);
 
+#if defined USE_LINK_QUALITY
+void
+lq_hello_build(struct lq_hello_message *msg, struct interface *outif);
 
-
+void
+lq_tc_build(struct lq_tc_message *msg, struct interface *outif);
+#endif
 
 #endif
index cb55aaa..5c8d9ce 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: generate_msg.c,v 1.10 2004/10/20 17:11:33 tlopatic Exp $
+ * $Id: generate_msg.c,v 1.11 2004/11/01 19:27:10 tlopatic Exp $
  *
  */
 
@@ -70,6 +70,33 @@ generate_tc(void *p)
     }
 }
 
+#if defined USE_LINK_QUALITY
+void
+generate_lq_hello(void *para)
+{
+  struct lq_hello_message lq_hello;
+  struct interface *outif = (struct interface *)para;
+
+  olsr_build_lq_hello_packet(&lq_hello, outif);
+  lq_hello_build(&lq_hello, outif);
+      
+  if(net_output_pending(outif))
+    net_output(outif);
+}
+
+void
+generate_lq_tc(void *para)
+{
+  struct lq_tc_message lq_tc;
+  struct interface *outif = (struct interface *)para;
+
+  olsr_build_lq_tc_packet(&lq_tc);
+  lq_tc_build(&lq_tc, outif);
+
+  if(net_output_pending(outif) && TIMED_OUT(&fwdtimer[outif->if_nr]))
+    set_buffer_timer(outif);
+}
+#endif
 
 void
 generate_mid(void *p)
index 462f29f..0bcd4b0 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: link_set.h,v 1.9 2004/10/21 20:57:19 tlopatic Exp $
+ * $Id: link_set.h,v 1.10 2004/11/01 19:27:10 tlopatic Exp $
  *
  */
 
@@ -125,6 +125,7 @@ void olsr_update_packet_loss_hello_int(struct link_entry *entry, double htime);
 void olsr_update_packet_loss(union olsr_ip_addr *rem, union olsr_ip_addr *loc,
                         olsr_u16_t seqno);
 void olsr_print_link_set(void);
+float olsr_neighbor_best_link_quality(union olsr_ip_addr *main);
 #endif
 
 #endif
index bb7bd33..db4e383 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: olsr_protocol.h,v 1.5 2004/09/21 19:08:57 kattemat Exp $
+ * $Id: olsr_protocol.h,v 1.6 2004/11/01 19:27:10 tlopatic Exp $
  *
  */
 
@@ -125,7 +125,13 @@ union olsr_ip_addr
 #define TC_MESSAGE            2
 #define MID_MESSAGE           3
 #define HNA_MESSAGE           4
+#if !defined USE_LINK_QUALITY
 #define MAX_MESSAGE           4
+#else
+#define LQ_HELLO_MESSAGE      5
+#define LQ_TC_MESSAGE         6
+#define MAX_MESSAGE           6
+#endif
 
 /*
  *Link Types
@@ -270,9 +276,27 @@ struct hellomsg6
   struct hellinfo6   hell_info[1];
 };
 
+#if defined USE_LINK_QUALITY
+struct lq_hello_header
+{
+  olsr_u16_t reserved;
+  olsr_u8_t  htime;
+  olsr_u8_t  will;
+};
 
+struct lq_hello_info_header
+{
+  olsr_u8_t  link_code;
+  olsr_u8_t  reserved;
+  olsr_u16_t size;
+};
 
-
+struct lq_tc_header
+{
+  olsr_u16_t ansn;
+  olsr_u16_t reserved;
+};
+#endif
 
 /*
  * Topology Control packet
@@ -292,6 +316,7 @@ struct tcmsg
 };
 
 
+
 /*
  *IPv6
  */
@@ -406,6 +431,10 @@ struct olsrmsg
     struct tcmsg    tc;
     struct hnamsg   hna;
     struct midmsg   mid;
+#if defined USE_LINK_QUALITY
+    struct lq_hello_header lq_hello;
+    struct lq_tc_header    lq_tc;
+#endif
   } message;
 
 };
@@ -430,6 +459,10 @@ struct olsrmsg6
     struct tcmsg6    tc;
     struct hnamsg6   hna;
     struct midmsg6   mid;
+#if defined USE_LINK_QUALITY
+    struct lq_hello_header lq_hello;
+    struct lq_tc_header    lq_tc;
+#endif
   } message;
 
 };
index 790966b..7f72695 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: packet.c,v 1.7 2004/10/19 20:19:32 kattemat Exp $
+ * $Id: packet.c,v 1.8 2004/11/01 19:27:11 tlopatic Exp $
  *
  */
 
@@ -113,7 +113,6 @@ olsr_build_hello_packet(struct hello_message *message, struct interface *outif)
       /* Find the link status */
       message_neighbor->link = link;
 
-   
       /*
        * Calculate neighbor status
        */
@@ -494,4 +493,140 @@ olsr_destroy_mid_message(struct mid_message *message)
     }
 }
 
+#if defined USE_LINK_QUALITY
+int
+olsr_build_lq_hello_packet(struct lq_hello_message *msg,
+                           struct interface *outif)
+{
+  struct lq_hello_neighbor *neigh;
+  struct link_entry *walker;
+
+  olsr_printf(3, "\tBuilding LQ_HELLO on interface %d\n", outif->if_nr);
+
+  COPY_IP(&msg->main, &main_addr);
+
+  msg->seqno = 0;
+  msg->hops = 0;
+  msg->ttl = 1;
+  msg->will = olsr_cnf->willingness;
+  msg->neigh = NULL;
+  
+  for (walker = link_set; walker != NULL; walker = walker->next)
+    {
+      neigh = olsr_malloc(sizeof (struct lq_hello_neighbor), "Build LQ_HELLO");
+      
+      if(!COMP_IP(&walker->local_iface_addr, &outif->ip_addr))
+        neigh->link_type = UNSPEC_LINK;
+      
+      else
+        neigh->link_type = lookup_link_status(walker);
+
+      neigh->link_quality = walker->loss_link_quality;
+
+      if(walker->neighbor->is_mpr)
+        neigh->neigh_type = MPR_NEIGH;
+
+      else if (walker->neighbor->status == SYM)
+        neigh->neigh_type = SYM_NEIGH;
+
+      else if (walker->neighbor->status == NOT_SYM)
+        neigh->neigh_type = NOT_NEIGH;
+  
+      COPY_IP(&neigh->main, &walker->neighbor->neighbor_main_addr);
+      COPY_IP(&neigh->addr, &walker->neighbor_iface_addr);
+      
+      olsr_printf(5, "%s - ", olsr_ip_to_string(&neigh->addr));
+      olsr_printf(5, " neighbor type %d\n", neigh->neigh_type);
+      
+      neigh->next = msg->neigh;
+      msg->neigh = neigh;
+    }
+  
+  return 0;
+}
 
+void
+olsr_destroy_lq_hello_message(struct lq_hello_message *msg)
+{
+  struct lq_hello_neighbor *walker, *aux;
+
+  for (walker = msg->neigh; walker != NULL; walker = aux)
+    {
+      aux = walker->next;
+      free(walker);
+    }
+}
+
+int
+olsr_build_lq_tc_packet(struct lq_tc_message *msg)
+{
+  struct lq_tc_neighbor *neigh;
+  int i;
+  struct neighbor_entry *walker;
+  struct timeval timer;
+
+  COPY_IP(&msg->main, &main_addr);
+  COPY_IP(&msg->orig, &main_addr);
+  
+  msg->seqno = 0;
+  msg->hops = 0;
+  msg->ttl = MAX_TTL;
+  msg->ansn = ansn;
+  msg->neigh = NULL;
+  for(i = 0; i < HASHSIZE; i++)
+    {
+      for(walker = neighbortable[i].next; walker != &neighbortable[i];
+         walker = walker->next)
+       {
+         if(walker->status != SYM)
+           continue;
+
+          if (olsr_cnf->tc_redundancy == 1 && !walker->is_mpr &&
+              olsr_lookup_mprs_set(&walker->neighbor_main_addr) == NULL)
+            continue;
+
+          else if (olsr_cnf->tc_redundancy == 0 &&
+              olsr_lookup_mprs_set(&walker->neighbor_main_addr) == NULL)
+            continue;
+
+          neigh = olsr_malloc(sizeof (struct lq_tc_neighbor), "Build LQ_TC");
+               
+          COPY_IP(&neigh->main, &walker->neighbor_main_addr);
+
+          neigh->link_quality =
+            olsr_neighbor_best_link_quality(&neigh->main);
+
+          neigh->next = msg->neigh;
+          msg->neigh = neigh;
+        }
+    }
+
+  if (msg->neigh != NULL)
+    sending_tc = 1;
+
+  else if (sending_tc)
+    {
+      olsr_init_timer((olsr_u32_t)(max_tc_vtime * 3) * 1000, &timer);
+      timeradd(&now, &timer, &send_empty_tc);
+
+      olsr_printf(3, "No more MPR selectors - will send empty LQ_TCs\n");
+      
+      sending_tc = 0;
+    }
+
+  return 0;
+}
+
+void
+olsr_destroy_lq_tc_message(struct lq_tc_message *msg)
+{
+  struct lq_tc_neighbor *walker, *aux;
+
+  for (walker = msg->neigh; walker != NULL; walker = aux)
+    {
+      aux = walker->next;
+      free(walker);
+    }
+}
+#endif
index f81e24f..886b13f 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: packet.h,v 1.5 2004/09/21 19:08:57 kattemat Exp $
+ * $Id: packet.h,v 1.6 2004/11/01 19:27:11 tlopatic Exp $
  *
  */
 
@@ -48,8 +48,6 @@ struct hello_neighbor
   struct hello_neighbor *next;
 };
 
-
-
 struct hello_message
 {
   double                 vtime;
@@ -63,6 +61,29 @@ struct hello_message
   
 };
 
+#if defined USE_LINK_QUALITY
+struct lq_hello_neighbor
+{
+  olsr_u8_t                link_type;
+  olsr_u8_t                neigh_type;
+  double                   link_quality;
+  union olsr_ip_addr       main;
+  union olsr_ip_addr       addr;
+  struct lq_hello_neighbor *next;
+};
+
+struct lq_hello_message
+{
+  double                   vtime;
+  double                   htime;
+  union olsr_ip_addr       main;
+  olsr_u16_t               seqno;
+  olsr_u8_t                hops;
+  olsr_u8_t                ttl;
+  olsr_u8_t                will;
+  struct lq_hello_neighbor *neigh;
+};
+#endif
 
 struct tc_mpr_addr
 {
@@ -71,7 +92,6 @@ struct tc_mpr_addr
   struct tc_mpr_addr *next;
 };
 
-
 struct tc_message
 {
   double              vtime;
@@ -84,7 +104,26 @@ struct tc_message
   struct tc_mpr_addr  *multipoint_relay_selector_address;
 };
 
+#if defined USE_LINK_QUALITY
+struct lq_tc_neighbor
+{
+  double                link_quality;
+  union olsr_ip_addr    main;
+  struct lq_tc_neighbor *next;
+};
 
+struct lq_tc_message
+{
+  double                vtime;
+  union olsr_ip_addr    main;
+  union olsr_ip_addr    orig;
+  olsr_u16_t            seqno;
+  olsr_u8_t             hops;
+  olsr_u8_t             ttl;
+  olsr_u16_t            ansn;
+  struct lq_tc_neighbor *neigh;
+};
+#endif
 
 /*
  *HNA message format:
@@ -167,6 +206,18 @@ olsr_destroy_hna_message(struct hna_message *);
 void
 olsr_destroy_tc_message(struct tc_message *);
 
+#if defined USE_LINK_QUALITY
+int
+olsr_build_lq_hello_packet(struct lq_hello_message *, struct interface *);
+
+int
+olsr_build_lq_tc_packet(struct lq_tc_message *);
+
+void
+olsr_destroy_lq_hello_message(struct lq_hello_message *);
 
+void
+olsr_destroy_lq_tc_message(struct lq_tc_message *);
+#endif
 
 #endif