ARM crosscompiler fixes
[olsrd.git] / src / build_msg.c
index b70f25f..d8b569b 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: build_msg.c,v 1.11 2004/09/22 17:00:28 kattemat Exp $
+ * $Id: build_msg.c,v 1.17 2004/10/20 19:43:04 kattemat Exp $
  *
  */
 
@@ -96,7 +96,7 @@ hna_build6(struct interface *);
 void
 hello_build(struct hello_message *message, struct interface *ifp)
 {
-  switch(ipversion)
+  switch(olsr_cnf->ip_version)
     {
     case(AF_INET):
       hello_build4(message, ifp);
@@ -134,7 +134,7 @@ hello_build(struct hello_message *message, struct interface *ifp)
 void
 tc_build(struct tc_message *message, struct interface *ifp)           
 {
-  switch(ipversion)
+  switch(olsr_cnf->ip_version)
     {
     case(AF_INET):
       tc_build4(message, ifp);
@@ -160,7 +160,7 @@ tc_build(struct tc_message *message, struct interface *ifp)
 void
 mid_build(struct interface *ifn)
 {
-  switch(ipversion)
+  switch(olsr_cnf->ip_version)
     {
     case(AF_INET):
       mid_build4(ifn);
@@ -185,7 +185,7 @@ mid_build(struct interface *ifn)
 void
 hna_build(struct interface *ifp)
 {
-  switch(ipversion)
+  switch(olsr_cnf->ip_version)
     {
     case(AF_INET):
       hna_build4(ifp);
@@ -228,10 +228,10 @@ hello_build4(struct hello_message *message, struct interface *ifp)
   int i, j, sametype;
   int lastpacket = 0; /* number of neighbors with the same
                         greater link status in the last packet */
-  if((!message) || (!ifp) || (ipversion != AF_INET))
+  if((!message) || (!ifp) || (olsr_cnf->ip_version != AF_INET))
     return;
 
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   //printf("HELLO build outputsize: %d\n", outputsize);
 
@@ -244,7 +244,7 @@ hello_build4(struct hello_message *message, struct interface *ifp)
   if(curr_size > remainsize)
     {
       net_output(ifp);
-      remainsize = net_outbuffer_bytes_left();
+      remainsize = net_outbuffer_bytes_left(ifp);
     }
 
   h = &m->v4.message.hello;
@@ -260,11 +260,11 @@ hello_build4(struct hello_message *message, struct interface *ifp)
   /* Set source(main) addr */
   COPY_IP(&m->v4.originator, &main_addr);
 
-  m->v4.olsr_vtime = ifp->is_wireless ? hello_vtime : hello_nw_vtime;
+  m->v4.olsr_vtime = ifp->valtimes.hello;
 
   /* Fill HELLO header */
   h->willingness = message->willingness; 
-  h->htime = ifp->is_wireless ? htime : htime_nw;
+  h->htime = ifp->hello_etime;
 
   memset(&h->reserved, 0, sizeof(olsr_u16_t));
   
@@ -326,7 +326,7 @@ hello_build4(struct hello_message *message, struct interface *ifp)
                              hinfo->size = ntohs(hinfo->size);
                              
                              /* Send partial packet */
-                             net_outbuffer_push(msg_buffer, curr_size);
+                             net_outbuffer_push(ifp, msg_buffer, curr_size);
 
                              curr_size = 12; /* OLSR message header */
                              curr_size += 4; /* Hello header */
@@ -338,7 +338,7 @@ hello_build4(struct hello_message *message, struct interface *ifp)
 
                          net_output(ifp);                        
                          /* Reset size and pointers */
-                         remainsize = net_outbuffer_bytes_left();
+                         remainsize = net_outbuffer_bytes_left(ifp);
                        }
                      memset(&hinfo->reserved, 0, sizeof(olsr_u8_t));
                      /* Set link and status for this group of neighbors (this is the first) */
@@ -372,11 +372,11 @@ hello_build4(struct hello_message *message, struct interface *ifp)
                      hinfo->size = ntohs(hinfo->size);
                      
                      /* Send partial packet */
-                     net_outbuffer_push(msg_buffer, curr_size);
+                     net_outbuffer_push(ifp, msg_buffer, curr_size);
                      net_output(ifp);
                      
                      /* Reset size and pointers */
-                     remainsize = net_outbuffer_bytes_left();
+                     remainsize = net_outbuffer_bytes_left(ifp);
                      curr_size = 12; /* OLSR message header */
                      curr_size += 4; /* Hello header */
                      
@@ -426,7 +426,7 @@ hello_build4(struct hello_message *message, struct interface *ifp)
   m->v4.seqno = htons(get_msg_seqno());
   m->v4.olsr_msgsize = htons(curr_size);
   
-  net_outbuffer_push(msg_buffer, curr_size);
+  net_outbuffer_push(ifp, msg_buffer, curr_size);
 
   /*
    * Delete the list of neighbor messages.
@@ -470,11 +470,11 @@ hello_build6(struct hello_message *message, struct interface *ifp)
   int i, j, sametype;
   int lastpacket = 0; /* number of neighbors with the same
                         greater link status in the last packet */
-  if((!message) || (!ifp) || (ipversion != AF_INET6))
+  if((!message) || (!ifp) || (olsr_cnf->ip_version != AF_INET6))
     return;
 
 
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   //printf("HELLO build outputsize: %d\n", outputsize);
 
@@ -487,7 +487,7 @@ hello_build6(struct hello_message *message, struct interface *ifp)
   if(curr_size > remainsize)
     {
       net_output(ifp);
-      remainsize = net_outbuffer_bytes_left();
+      remainsize = net_outbuffer_bytes_left(ifp);
     }
 
   //printf("HELLO build outputsize: %d\n", outputsize);
@@ -503,12 +503,12 @@ hello_build6(struct hello_message *message, struct interface *ifp)
   COPY_IP(&m->v6.originator, &main_addr);
   m->v6.olsr_msgtype = HELLO_MESSAGE;
 
-  m->v6.olsr_vtime = ifp->is_wireless ? hello_vtime : hello_nw_vtime;
+  m->v6.olsr_vtime = ifp->valtimes.hello;
   
   /* Fill packet header */
   h6->willingness = message->willingness; 
 
-  h6->htime = ifp->is_wireless ? htime : htime_nw;
+  h6->htime = ifp->hello_etime;
 
   memset(&h6->reserved, 0, sizeof(olsr_u16_t));
   
@@ -554,7 +554,7 @@ hello_build6(struct hello_message *message, struct interface *ifp)
                              hinfo6->size = ntohs(hinfo6->size);
                              
                              /* Send partial packet */
-                             net_outbuffer_push(msg_buffer, curr_size);
+                             net_outbuffer_push(ifp, msg_buffer, curr_size);
                              curr_size = 24; /* OLSR message header */
                              curr_size += 4; /* Hello header */
                              
@@ -564,7 +564,7 @@ hello_build6(struct hello_message *message, struct interface *ifp)
                            }
                          net_output(ifp);
                          /* Reset size and pointers */
-                         remainsize = net_outbuffer_bytes_left();
+                         remainsize = net_outbuffer_bytes_left(ifp);
                        }
                      memset(&hinfo6->reserved, 0, sizeof(olsr_u8_t));
                      /* Set link and status for this group of neighbors (this is the first) */
@@ -598,7 +598,7 @@ hello_build6(struct hello_message *message, struct interface *ifp)
                      hinfo6->size = ntohs(hinfo6->size);
                      
                      /* Send partial packet */
-                         net_outbuffer_push(msg_buffer, curr_size);
+                         net_outbuffer_push(ifp, msg_buffer, curr_size);
                      curr_size = 24; /* OLSR message header */
                      curr_size += 4; /* Hello header */
                      
@@ -615,7 +615,7 @@ hello_build6(struct hello_message *message, struct interface *ifp)
 
                      net_output(ifp);                
                      /* Reset size */
-                     remainsize = net_outbuffer_bytes_left();
+                     remainsize = net_outbuffer_bytes_left(ifp);
                      
                    }
 
@@ -651,7 +651,7 @@ hello_build6(struct hello_message *message, struct interface *ifp)
   m->v6.seqno = htons(get_msg_seqno());
   m->v6.olsr_msgsize = htons(curr_size);
 
-  net_outbuffer_push(msg_buffer, curr_size);
+  net_outbuffer_push(ifp, msg_buffer, curr_size);
 
   /*
    * Delete the list of neighbor messages.
@@ -686,17 +686,17 @@ static void
 tc_build4(struct tc_message *message, struct interface *ifp)           
 {
 
-  int remainsize, curr_size;;
+  int remainsize, curr_size;
   struct tc_mpr_addr *mprs, *prev_mprs;
   union olsr_message *m;
   struct tcmsg *tc;
   struct neigh_info *mprsaddr; 
   int found = 0, partial_sent = 0;
 
-  if((!message) || (!ifp) || (ipversion != AF_INET))
+  if((!message) || (!ifp) || (olsr_cnf->ip_version != AF_INET))
     return;
 
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   m = (union olsr_message *)msg_buffer;
 
@@ -711,11 +711,11 @@ tc_build4(struct tc_message *message, struct interface *ifp)
   if(curr_size > remainsize)
     {
       net_output(ifp);
-      remainsize = net_outbuffer_bytes_left();
+      remainsize = net_outbuffer_bytes_left(ifp);
     }
 
   /* Fill header */
-  m->v4.olsr_vtime = tc_vtime;
+  m->v4.olsr_vtime = ifp->valtimes.tc;
   m->v4.olsr_msgtype = TC_MESSAGE;
   m->v4.hopcnt = message->hop_count;
   m->v4.ttl = message->ttl;
@@ -739,7 +739,7 @@ tc_build4(struct tc_message *message, struct interface *ifp)
              m->v4.olsr_msgsize = htons(curr_size);
              m->v4.seqno = htons(get_msg_seqno());
 
-             net_outbuffer_push(msg_buffer, curr_size);
+             net_outbuffer_push(ifp, msg_buffer, curr_size);
              
              /* Reset stuff */
              mprsaddr = tc->neigh;
@@ -750,7 +750,7 @@ tc_build4(struct tc_message *message, struct interface *ifp)
            }
 
          net_output(ifp);
-         remainsize = net_outbuffer_bytes_left();
+         remainsize = net_outbuffer_bytes_left(ifp);
 
        }
       found = 1;
@@ -767,7 +767,7 @@ tc_build4(struct tc_message *message, struct interface *ifp)
       m->v4.olsr_msgsize = htons(curr_size);
       m->v4.seqno = htons(get_msg_seqno());
       
-      net_outbuffer_push(msg_buffer, curr_size);
+      net_outbuffer_push(ifp, msg_buffer, curr_size);
 
     }
   else
@@ -779,7 +779,7 @@ tc_build4(struct tc_message *message, struct interface *ifp)
          m->v4.olsr_msgsize = htons(curr_size);
          m->v4.seqno = htons(get_msg_seqno());
 
-         net_outbuffer_push(msg_buffer, curr_size);
+         net_outbuffer_push(ifp, msg_buffer, curr_size);
 
        }
     }
@@ -818,17 +818,17 @@ static void
 tc_build6(struct tc_message *message, struct interface *ifp)           
 {
 
-  int remainsize, curr_size;;
+  int remainsize, curr_size;
   struct tc_mpr_addr *mprs, *prev_mprs;
   union olsr_message *m;
   struct tcmsg6 *tc6;
   struct neigh_info6 *mprsaddr6; 
   int found = 0, partial_sent = 0;
 
-  if ((!message) || (!ifp) || (ipversion != AF_INET6))
+  if ((!message) || (!ifp) || (olsr_cnf->ip_version != AF_INET6))
     return;
 
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   m = (union olsr_message *)msg_buffer;
 
@@ -842,11 +842,11 @@ tc_build6(struct tc_message *message, struct interface *ifp)
   if(curr_size > remainsize)
     {
       net_output(ifp);
-      remainsize = net_outbuffer_bytes_left();
+      remainsize = net_outbuffer_bytes_left(ifp);
     }
 
   /* Fill header */
-  m->v6.olsr_vtime = tc_vtime;
+  m->v6.olsr_vtime = ifp->valtimes.tc;
   m->v6.olsr_msgtype = TC_MESSAGE;
   m->v6.hopcnt = message->hop_count;
   m->v6.ttl = message->ttl;
@@ -870,7 +870,7 @@ tc_build6(struct tc_message *message, struct interface *ifp)
              m->v6.olsr_msgsize = htons(curr_size);
              m->v6.seqno = htons(get_msg_seqno());
 
-             net_outbuffer_push(msg_buffer, curr_size);
+             net_outbuffer_push(ifp, msg_buffer, curr_size);
              mprsaddr6 = tc6->neigh;
              curr_size = 24; /* OLSR message header */
              curr_size += 4; /* TC header */
@@ -878,7 +878,7 @@ tc_build6(struct tc_message *message, struct interface *ifp)
              partial_sent = 1;
            }
          net_output(ifp);
-         remainsize = net_outbuffer_bytes_left();
+         remainsize = net_outbuffer_bytes_left(ifp);
                
 
        }
@@ -887,6 +887,7 @@ tc_build6(struct tc_message *message, struct interface *ifp)
       //printf("mprsaddr6 is %x\n", (char *)mprsaddr6 - packet);
       //printf("Adding MPR-selector: %s\n", olsr_ip_to_string(&mprs->address));fflush(stdout);     
       COPY_IP(&mprsaddr6->addr, &mprs->address);
+      curr_size += ipsize;
 
       mprsaddr6++;
     }
@@ -896,7 +897,7 @@ tc_build6(struct tc_message *message, struct interface *ifp)
       m->v6.olsr_msgsize = htons(curr_size);
       m->v6.seqno = htons(get_msg_seqno());
 
-      net_outbuffer_push(msg_buffer, curr_size);
+      net_outbuffer_push(ifp, msg_buffer, curr_size);
 
     }
   else
@@ -908,7 +909,7 @@ tc_build6(struct tc_message *message, struct interface *ifp)
          m->v6.olsr_msgsize = htons(curr_size);
          m->v6.seqno = htons(get_msg_seqno());
 
-         net_outbuffer_push(msg_buffer, curr_size);
+         net_outbuffer_push(ifp, msg_buffer, curr_size);
        }
     }
 
@@ -948,11 +949,11 @@ mid_build4(struct interface *ifp)
   struct midaddr *addrs;
   struct interface *ifs;  
 
-  if((ipversion != AF_INET) || (!ifp) || (nbinterf <= 1))
+  if((olsr_cnf->ip_version != AF_INET) || (!ifp) || (ifnet == NULL || ifnet->int_next == NULL))
     return;
 
 
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   m = (union olsr_message *)msg_buffer;
 
@@ -962,7 +963,7 @@ mid_build4(struct interface *ifp)
   if(curr_size > remainsize)
     {
       net_output(ifp);
-      remainsize = net_outbuffer_bytes_left();
+      remainsize = net_outbuffer_bytes_left(ifp);
     }
 
   /* Fill header */
@@ -971,7 +972,7 @@ mid_build4(struct interface *ifp)
   /* Set main(first) address */
   COPY_IP(&m->v4.originator, &main_addr);
   m->v4.olsr_msgtype = MID_MESSAGE;
-  m->v4.olsr_vtime = mid_vtime;
+  m->v4.olsr_vtime = ifp->valtimes.mid;
  
   addrs = m->v4.message.mid.mid_addr;
 
@@ -990,12 +991,12 @@ mid_build4(struct interface *ifp)
                  m->v4.olsr_msgsize = htons(curr_size);
                  m->v4.seqno = htons(get_msg_seqno());/* seqnumber */
                  
-                 net_outbuffer_push(msg_buffer, curr_size);
+                 net_outbuffer_push(ifp, msg_buffer, curr_size);
                  curr_size = 12; /* OLSR message header */
                  addrs = m->v4.message.mid.mid_addr;
                }
              net_output(ifp);
-             remainsize = net_outbuffer_bytes_left();
+             remainsize = net_outbuffer_bytes_left(ifp);
            }
          
          COPY_IP(&addrs->addr, &ifs->ip_addr);
@@ -1009,7 +1010,7 @@ mid_build4(struct interface *ifp)
   m->v4.olsr_msgsize = htons(curr_size);
 
   //printf("Sending MID (%d bytes)...\n", outputsize);
-  net_outbuffer_push(msg_buffer, curr_size);
+  net_outbuffer_push(ifp, msg_buffer, curr_size);
 
 
   return;
@@ -1037,10 +1038,10 @@ mid_build6(struct interface *ifp)
   //printf("\t\tGenerating mid on %s\n", ifn->int_name);
 
 
-  if((ipversion != AF_INET6) || (!ifp) || (nbinterf <= 1))
+  if((olsr_cnf->ip_version != AF_INET6) || (!ifp) || (ifnet == NULL || ifnet->int_next == NULL))
     return;
 
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   curr_size = 24; /* OLSR message header */
 
@@ -1048,7 +1049,7 @@ mid_build6(struct interface *ifp)
   if(curr_size > remainsize)
     {
       net_output(ifp);
-      remainsize = net_outbuffer_bytes_left();
+      remainsize = net_outbuffer_bytes_left(ifp);
     }
 
   m = (union olsr_message *)msg_buffer;
@@ -1057,7 +1058,7 @@ mid_build6(struct interface *ifp)
   m->v6.hopcnt = 0;
   m->v6.ttl = MAX_TTL;      
   m->v6.olsr_msgtype = MID_MESSAGE;
-  m->v6.olsr_vtime = mid_vtime;
+  m->v6.olsr_vtime = ifp->valtimes.mid;
   /* Set main(first) address */
   COPY_IP(&m->v6.originator, &main_addr);
    
@@ -1078,12 +1079,12 @@ mid_build6(struct interface *ifp)
                  m->v6.olsr_msgsize = htons(curr_size);
                  m->v6.seqno = htons(get_msg_seqno());/* seqnumber */
                  
-                 net_outbuffer_push(msg_buffer, curr_size);
+                 net_outbuffer_push(ifp, msg_buffer, curr_size);
                  curr_size = 24; /* OLSR message header */
                  addrs6 = m->v6.message.mid.mid_addr;
                }
              net_output(ifp);
-             remainsize = net_outbuffer_bytes_left();
+             remainsize = net_outbuffer_bytes_left(ifp);
            }
 
          COPY_IP(&addrs6->addr, &ifs->ip_addr);
@@ -1096,7 +1097,7 @@ mid_build6(struct interface *ifp)
   m->v6.seqno = htons(get_msg_seqno());/* seqnumber */
 
   //printf("Sending MID (%d bytes)...\n", outputsize);
-  net_outbuffer_push(msg_buffer, curr_size);
+  net_outbuffer_push(ifp, msg_buffer, curr_size);
 
   return;
 }
@@ -1117,39 +1118,37 @@ hna_build4(struct interface *ifp)
   /* preserve existing data in output buffer */
   union olsr_message *m;
   struct hnapair *pair;
-  struct local_hna_entry *h;
+  struct hna4_entry *h = olsr_cnf->hna4_entries;
 
   /* No hna nets */
-  if((ipversion != AF_INET) || (!ifp) || (local_hna4_set.next == &local_hna4_set))
+  if((olsr_cnf->ip_version != AF_INET) || (!ifp) || h == NULL)
     return;
     
-  remainsize = net_outbuffer_bytes_left();
-
+  remainsize = net_outbuffer_bytes_left(ifp);
+  
   curr_size = 12; /* OLSR message header */
-
+  
   /* Send pending packet if not room in buffer */
   if(curr_size > remainsize)
     {
       net_output(ifp);
-      remainsize = net_outbuffer_bytes_left();
+      remainsize = net_outbuffer_bytes_left(ifp);
     }
-
+  
   m = (union olsr_message *)msg_buffer;
-    
-
+  
+  
   /* Fill header */
   COPY_IP(&m->v4.originator, &main_addr);
   m->v4.hopcnt = 0;
   m->v4.ttl = MAX_TTL;
   m->v4.olsr_msgtype = HNA_MESSAGE;
-  m->v4.olsr_vtime = hna_vtime;
-
+  m->v4.olsr_vtime = ifp->valtimes.hna;
+  
 
   pair = m->v4.message.hna.hna_net;
-
-  for(h = local_hna4_set.next;
-      h != &local_hna4_set;
-      h = h->next)
+  
+  while(h)
     {
       if((curr_size + (2 * ipsize)) > remainsize)
        {
@@ -1158,23 +1157,24 @@ hna_build4(struct interface *ifp)
            {
              m->v4.seqno = htons(get_msg_seqno());
              m->v4.olsr_msgsize = htons(curr_size);
-             net_outbuffer_push(msg_buffer, curr_size);
+             net_outbuffer_push(ifp, msg_buffer, curr_size);
              curr_size = 12; /* OLSR message header */
              pair = m->v4.message.hna.hna_net;
            }
          net_output(ifp);
-         remainsize = net_outbuffer_bytes_left();
+         remainsize = net_outbuffer_bytes_left(ifp);
        }
-      COPY_IP(&pair->addr, &h->A_network_addr);
-      COPY_IP(&pair->netmask, &h->A_netmask);
+      COPY_IP(&pair->addr, &h->net);
+      COPY_IP(&pair->netmask, &h->netmask);
       pair++;
       curr_size += (2 * ipsize);
+      h = h->next;
     }
 
   m->v4.seqno = htons(get_msg_seqno());
   m->v4.olsr_msgsize = htons(curr_size);
 
-  net_outbuffer_push(msg_buffer, curr_size);
+  net_outbuffer_push(ifp, msg_buffer, curr_size);
 
   //printf("Sending HNA (%d bytes)...\n", outputsize);
   return;
@@ -1198,14 +1198,14 @@ hna_build6(struct interface *ifp)
   union olsr_message *m;
   struct hnapair6 *pair6;
   union olsr_ip_addr tmp_netmask;
-  struct local_hna_entry *h;
+  struct hna6_entry *h = olsr_cnf->hna6_entries;
   
   /* No hna nets */
-  if((ipversion != AF_INET6) || (!ifp) || (local_hna6_set.next == &local_hna6_set))
+  if((olsr_cnf->ip_version != AF_INET6) || (!ifp) || h == NULL)
     return;
 
     
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   curr_size = 24; /* OLSR message header */
 
@@ -1213,7 +1213,7 @@ hna_build6(struct interface *ifp)
   if(curr_size > remainsize)
     {
       net_output(ifp);
-      remainsize = net_outbuffer_bytes_left();
+      remainsize = net_outbuffer_bytes_left(ifp);
     }
 
   m = (union olsr_message *)msg_buffer;   
@@ -1223,14 +1223,12 @@ hna_build6(struct interface *ifp)
   m->v6.hopcnt = 0;
   m->v6.ttl = MAX_TTL;
   m->v6.olsr_msgtype = HNA_MESSAGE;
-  m->v6.olsr_vtime = hna_vtime;
+  m->v6.olsr_vtime = ifp->valtimes.hna;
 
   pair6 = m->v6.message.hna.hna_net;
 
 
-  for(h = local_hna6_set.next;
-      h != &local_hna6_set;
-      h = h->next)
+  while(h)
     {
       if((curr_size + (2 * ipsize)) > remainsize)
        {
@@ -1239,26 +1237,27 @@ hna_build6(struct interface *ifp)
            {
              m->v6.seqno = htons(get_msg_seqno());
              m->v6.olsr_msgsize = htons(curr_size);
-             net_outbuffer_push(msg_buffer, curr_size);
+             net_outbuffer_push(ifp, msg_buffer, curr_size);
              curr_size = 24; /* OLSR message header */
              pair6 = m->v6.message.hna.hna_net;
            }
          net_output(ifp);
-         remainsize = net_outbuffer_bytes_left();
+         remainsize = net_outbuffer_bytes_left(ifp);
        }
-
+      
       //printf("Adding %s\n", olsr_ip_to_string(&h->hna_net.addr));
-      COPY_IP(&pair6->addr, &h->A_network_addr);
-      olsr_prefix_to_netmask(&tmp_netmask, h->A_netmask.v6);
+      COPY_IP(&pair6->addr, &h->net);
+      olsr_prefix_to_netmask(&tmp_netmask, h->prefix_len);
       COPY_IP(&pair6->netmask, &tmp_netmask);
       pair6++;
       curr_size += (2 * ipsize);
+      h = h->next;
     }
   
   m->v6.olsr_msgsize = htons(curr_size);
   m->v6.seqno = htons(get_msg_seqno());
-
-  net_outbuffer_push(msg_buffer, curr_size);
+  
+  net_outbuffer_push(ifp, msg_buffer, curr_size);
   
   //printf("Sending HNA (%d bytes)...\n", outputsize);
   return;