Outputbuffers are now set up on a pr interface basis - a full rewrite of the net...
authorAndreas Tonnesen <andreto@olsr.org>
Sat, 25 Sep 2004 21:06:07 +0000 (21:06 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Sat, 25 Sep 2004 21:06:07 +0000 (21:06 +0000)
src/build_msg.c
src/generate_msg.c
src/interfaces.h
src/linux/ifnet.c
src/net.c
src/net.h
src/olsr.c
src/olsr.h
src/scheduler.c

index b70f25f..8fbecc6 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.12 2004/09/25 21:06:07 kattemat Exp $
  *
  */
 
@@ -231,7 +231,7 @@ hello_build4(struct hello_message *message, struct interface *ifp)
   if((!message) || (!ifp) || (ipversion != 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;
@@ -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.
@@ -474,7 +474,7 @@ hello_build6(struct hello_message *message, struct interface *ifp)
     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);
@@ -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.
@@ -696,7 +696,7 @@ tc_build4(struct tc_message *message, struct interface *ifp)
   if((!message) || (!ifp) || (ipversion != AF_INET))
     return;
 
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   m = (union olsr_message *)msg_buffer;
 
@@ -711,7 +711,7 @@ 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 */
@@ -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);
 
        }
     }
@@ -828,7 +828,7 @@ tc_build6(struct tc_message *message, struct interface *ifp)
   if ((!message) || (!ifp) || (ipversion != AF_INET6))
     return;
 
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   m = (union olsr_message *)msg_buffer;
 
@@ -842,7 +842,7 @@ 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 */
@@ -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);
                
 
        }
@@ -896,7 +896,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 +908,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);
        }
     }
 
@@ -952,7 +952,7 @@ mid_build4(struct interface *ifp)
     return;
 
 
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   m = (union olsr_message *)msg_buffer;
 
@@ -962,7 +962,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 */
@@ -990,12 +990,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 +1009,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;
@@ -1040,7 +1040,7 @@ mid_build6(struct interface *ifp)
   if((ipversion != AF_INET6) || (!ifp) || (nbinterf <= 1))
     return;
 
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   curr_size = 24; /* OLSR message header */
 
@@ -1048,7 +1048,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;
@@ -1078,12 +1078,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 +1096,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;
 }
@@ -1123,7 +1123,7 @@ hna_build4(struct interface *ifp)
   if((ipversion != AF_INET) || (!ifp) || (local_hna4_set.next == &local_hna4_set))
     return;
     
-  remainsize = net_outbuffer_bytes_left();
+  remainsize = net_outbuffer_bytes_left(ifp);
 
   curr_size = 12; /* OLSR message header */
 
@@ -1131,7 +1131,7 @@ hna_build4(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;
@@ -1158,12 +1158,12 @@ 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);
@@ -1174,7 +1174,7 @@ 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);
 
   //printf("Sending HNA (%d bytes)...\n", outputsize);
   return;
@@ -1205,7 +1205,7 @@ hna_build6(struct interface *ifp)
     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;   
@@ -1239,12 +1239,12 @@ 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));
@@ -1258,7 +1258,7 @@ hna_build6(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);
   
   //printf("Sending HNA (%d bytes)...\n", outputsize);
   return;
index 1415f4f..b926f02 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: generate_msg.c,v 1.6 2004/09/22 17:00:28 kattemat Exp $
+ * $Id: generate_msg.c,v 1.7 2004/09/25 21:06:07 kattemat Exp $
  *
  */
 
@@ -261,7 +261,7 @@ generate_hello()
       olsr_build_hello_packet(&hellopacket, ifn);
       hello_build(&hellopacket, ifn);
       
-      if(net_output_pending())
+      if(net_output_pending(ifn))
        net_output(ifn);
       
     }
@@ -282,7 +282,7 @@ generate_hello_nw()
       olsr_build_hello_packet(&hellopacket, ifn);
       hello_build(&hellopacket, ifn);
 
-      if(net_output_pending())
+      if(net_output_pending(ifn))
        net_output(ifn);
 
     }
@@ -303,7 +303,7 @@ generate_tc()
       olsr_build_tc_packet(&tcpacket);
       tc_build(&tcpacket, ifn);
 
-      if(net_output_pending())
+      if(net_output_pending(ifn))
        net_output(ifn);
     }
 }
@@ -319,7 +319,7 @@ generate_mid()
     {
       //printf("\nSending MID seq: %i\n", ifn->seqnums.mid_seqnum);
       mid_build(ifn);
-      if(net_output_pending())
+      if(net_output_pending(ifn))
        net_output(ifn);
     }
 
@@ -338,7 +338,7 @@ generate_hna()
     { 
       hna_build(ifn);
       
-      if(net_output_pending())
+      if(net_output_pending(ifn))
        net_output(ifn);
     }
   return;
index ba08cb4..ed6c826 100644 (file)
@@ -20,7 +20,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: interfaces.h,v 1.6 2004/09/22 20:57:50 kattemat Exp $
+ * $Id: interfaces.h,v 1.7 2004/09/25 21:06:07 kattemat Exp $
  *
  */
 
@@ -80,7 +80,7 @@ struct interface
 };
 
 
-
+#define OLSR_DEFAULT_MTU             1500
 
 
 struct if_name
index 30b6631..05f3256 100644 (file)
@@ -20,7 +20,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: ifnet.c,v 1.8 2004/09/23 16:13:54 kattemat Exp $
+ * $Id: ifnet.c,v 1.9 2004/09/25 21:06:07 kattemat Exp $
  *
  */
 
@@ -124,7 +124,7 @@ chk_if_changed(struct if_name *iface)
   struct interface *ifp, *tmp_ifp;
   struct ifreq ifr;
   struct sockaddr_in6 tmp_saddr6;
-  int if_changes, smallest_mtu;
+  int if_changes;
   struct ifchgf *tmp_ifchgf_list;
   if_changes = 0;
 
@@ -198,9 +198,9 @@ chk_if_changed(struct if_name *iface)
       if(ifp->int_mtu != ifr.ifr_mtu)
        {
          ifp->int_mtu = ifr.ifr_mtu;
-         /* Update outputbuffer if needed */
-         if(net_get_maxmsgsize() > (ifp->int_mtu  - OLSR_HEADERSIZE - UDP_IP_HDRSIZE))
-           net_set_maxmsgsize(ifp->int_mtu - OLSR_HEADERSIZE - UDP_IP_HDRSIZE);
+         /* Create new outputbuffer */
+         net_remove_buffer(ifp); /* Remove old */
+         net_add_buffer(ifp);
        }
     }
 
@@ -403,26 +403,8 @@ chk_if_changed(struct if_name *iface)
     }
 
 
-  /* Recalculate output buffersize */
-  /* find the smallest MTU */
-  if(ifnet)
-    {
-      tmp_ifp = ifnet;
-      smallest_mtu = 100000; /* start with a large value */
-      while(tmp_ifp)
-       {
-         smallest_mtu = smallest_mtu > tmp_ifp->int_mtu ? tmp_ifp->int_mtu : smallest_mtu;
-         tmp_ifp = tmp_ifp->int_next;
-       }
-      /* Update outputbuffer if needed */
-      if(net_get_maxmsgsize() > (smallest_mtu  - OLSR_HEADERSIZE - UDP_IP_HDRSIZE))
-       net_set_maxmsgsize(smallest_mtu - OLSR_HEADERSIZE - UDP_IP_HDRSIZE);
-    }
-  else
-    {
-      /* set default if there are no more interfaces */
-      net_set_maxmsgsize(MAXMESSAGESIZE - OLSR_HEADERSIZE - UDP_IP_HDRSIZE);
-    }
+  /* Remove output buffer */
+  net_remove_buffer(ifp);
 
   /* Check main addr */
   if(COMP_IP(&main_addr, &ifp->ip_addr))
@@ -618,14 +600,13 @@ chk_if_up(struct if_name *iface, int debuglvl)
 
   /* Get MTU */
   if (ioctl(ioctl_s, SIOCGIFMTU, &ifr) < 0)
-    ifs.int_mtu = 0;
+    ifs.int_mtu = OLSR_DEFAULT_MTU;
   else
-    {
-      ifs.int_mtu = ifr.ifr_mtu;
-      /* Update outputbuffer if needed */
-      if(net_get_maxmsgsize() > (ifs.int_mtu  - OLSR_HEADERSIZE - UDP_IP_HDRSIZE))
-       net_set_maxmsgsize(ifs.int_mtu - OLSR_HEADERSIZE - UDP_IP_HDRSIZE);
-    }
+    ifs.int_mtu = ifr.ifr_mtu;
+
+  /* Set up buffer */
+  net_add_buffer(&ifs);
+              
   olsr_printf(1, "\tMTU: %d\n", ifs.int_mtu);
 
   olsr_syslog(OLSR_LOG_INFO, "Adding interface %s\n", iface->name);
index 2f405aa..1fcd9cc 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -20,7 +20,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: net.c,v 1.13 2004/09/25 11:13:28 kattemat Exp $
+ * $Id: net.c,v 1.14 2004/09/25 21:06:07 kattemat Exp $
  *
  */
 
@@ -34,22 +34,21 @@ void
 WinSockPError(char *);
 #endif
 
-#warning HEAPS of changes in net.c!!!
+#warning Interface configuration is now responsible for setting up outputbuffers!!
 
-static char out_buffer[MAXMESSAGESIZE+1];
-static char fwd_buffer[MAXMESSAGESIZE+1];
-
-static union olsr_packet *outmsg = (union olsr_packet *)out_buffer;
-static union olsr_packet *fwdmsg = (union olsr_packet *)fwd_buffer;
-
-static int outputsize = 0;      /* current size of the output buffer */
-static int fwdsize = 0;         /* current size of the forward buffer */
+struct olsr_netbuf
+{
+  char *buff;     /* Pointer to the allocated buffer */
+  int if_index;
+  int bufsize;    /* Size of the buffer */
+  int maxsize;    /* Max bytes of payload that can be added to the buffer */
+  int pending;    /* How much data is currently pending in the buffer */
+  int reserved;   /* Plugins can reserve space in buffers */
+};
 
-static int netbuffer_reserved = 0;  /* plugins can reserve bufferspace */
 
+static struct olsr_netbuf *netbufs[MAX_IFS];
 
-/* Default max OLSR packet size */
-static int maxmessagesize = MAXMESSAGESIZE - OLSR_HEADERSIZE - UDP_IP_HDRSIZE;
 
 
 void
@@ -61,152 +60,134 @@ init_net()
 }
 
 int
-net_set_maxmsgsize(olsr_u16_t new_size)
+net_add_buffer(struct interface *ifp)
 {
+  struct olsr_netbuf *new_buf;
 
-  if(new_size > (MAXMESSAGESIZE - OLSR_HEADERSIZE - UDP_IP_HDRSIZE - netbuffer_reserved))
+  /* If a buffer already exists for this interface back off */
+  if(netbufs[ifp->if_nr])
     return -1;
 
-  else
-    maxmessagesize = new_size - netbuffer_reserved;
+  new_buf = olsr_malloc(sizeof(struct olsr_netbuf), "add_netbuff1");
+  new_buf->buff = olsr_malloc(ifp->int_mtu, "add_netbuff2");
+
+  /* Fill struct */
+  new_buf->bufsize = ifp->int_mtu;
+  new_buf->if_index = ifp->if_nr;
+  new_buf->maxsize = ifp->int_mtu - OLSR_HEADERSIZE;
+  new_buf->pending = 0;
+  new_buf->reserved = 0;
 
-  olsr_printf(1, "Not outputbuffer maxsize set to %d(%d bytes reserved)\n", 
-             maxmessagesize, 
-             netbuffer_reserved);
-  return maxmessagesize;
+  netbufs[ifp->if_nr] = new_buf;
+
+  return 0;
 }
 
 
 int
-net_reserve_bufferspace(olsr_u16_t size)
+net_remove_buffer(struct interface *ifp)
 {
 
-  if((netbuffer_reserved + size) > maxmessagesize)
+  /* If a buffer already exists for this interface back off */
+  if(!netbufs[ifp->if_nr])
     return -1;
+  
+  /* Flush pending data */
+  if(netbufs[ifp->if_nr]->pending)
+    net_output(ifp);
 
-  else
-    {
-      netbuffer_reserved += size;
-      maxmessagesize -= netbuffer_reserved;
-    }
+  free(netbufs[ifp->if_nr]->buff);
+  free(netbufs[ifp->if_nr]);
+  netbufs[ifp->if_nr] = NULL;
 
-  olsr_printf(1, "Netbuffer reserved %d bytes - new maxsize %d\n", 
-             netbuffer_reserved, 
-             maxmessagesize);
-  return maxmessagesize;
+  return 0;
 }
 
 
-inline olsr_u16_t
-net_get_maxmsgsize()
+
+int
+net_reserve_bufspace(struct interface *ifp, int size)
 {
-  return maxmessagesize;
-}
 
 
-inline olsr_u16_t
-net_fwd_pending()
-{
-  return fwdsize;
+  if((!netbufs[ifp->if_nr]) || (size > netbufs[ifp->if_nr]->maxsize))
+    return -1;
+  
+  netbufs[ifp->if_nr]->reserved = size;
+  netbufs[ifp->if_nr]->maxsize -= size;
+  
+  return 0;
 }
 
 
 inline olsr_u16_t
-net_output_pending()
+net_output_pending(struct interface *ifp)
 {
-  return outputsize;
-}
-
-/**
- * Add data to the buffer that is to be transmitted
- *
- * @return 0 if there was not enough room in buffer
- */
-int
-net_outbuffer_push(olsr_u8_t *data, olsr_u16_t size)
-{
-
-  if((outputsize + size) > maxmessagesize)
-    return 0;
-
-  memcpy(&out_buffer[outputsize + OLSR_HEADERSIZE], data, size);
-  outputsize += size;
+  if(!netbufs[ifp->if_nr])
+    return -1;
 
-  return 1;
+  return netbufs[ifp->if_nr]->pending;
 }
 
 
+
 /**
  * Add data to the buffer that is to be transmitted
  *
  * @return 0 if there was not enough room in buffer
  */
 int
-net_outbuffer_push_reserved(olsr_u8_t *data, olsr_u16_t size)
+net_outbuffer_push(struct interface *ifp, olsr_u8_t *data, olsr_u16_t size)
 {
 
-  if((outputsize + size) > (maxmessagesize + netbuffer_reserved))
+  if(!netbufs[ifp->if_nr])
+    return -1;
+
+  if((netbufs[ifp->if_nr]->pending + size) > netbufs[ifp->if_nr]->maxsize)
     return 0;
 
-  memcpy(&out_buffer[outputsize + OLSR_HEADERSIZE], data, size);
-  outputsize += size;
+  memcpy(&netbufs[ifp->if_nr]->buff[netbufs[ifp->if_nr]->pending + OLSR_HEADERSIZE], data, size);
+  netbufs[ifp->if_nr]->pending += size;
 
   return 1;
 }
 
 
-
 /**
- * Add data to the buffer that is to be transmitted
- *
- * @return 0 if there was not enough room in buffer
- */
-inline int
-net_outbuffer_bytes_left()
-{
-  return (maxmessagesize - outputsize);
-}
-
-
-/**
- * Add data to the buffer that is to be forwarded
+ * Adddata to the reserved part of the buffer that is to be transmitted
  *
  * @return 0 if there was not enough room in buffer
  */
 int
-net_fwdbuffer_push(olsr_u8_t *data, olsr_u16_t size)
+net_outbuffer_push_reserved(struct interface *ifp, olsr_u8_t *data, olsr_u16_t size)
 {
 
-  if((fwdsize + size) > maxmessagesize)
+  if(!netbufs[ifp->if_nr])
+    return -1;
+
+  if((netbufs[ifp->if_nr]->pending + size) > (netbufs[ifp->if_nr]->maxsize + netbufs[ifp->if_nr]->reserved))
     return 0;
 
-  memcpy(&fwd_buffer[fwdsize + OLSR_HEADERSIZE], data, size);
-  fwdsize += size;
+  memcpy(&netbufs[ifp->if_nr]->buff[netbufs[ifp->if_nr]->pending + OLSR_HEADERSIZE], data, size);
+  netbufs[ifp->if_nr]->pending += size;
 
   return 1;
 }
 
 
-/**
- * Add data to the buffer that is to be forwarded
- *
- * @return 0 if there was not enough room in buffer
- */
-int
-net_fwdbuffer_push_reserved(olsr_u8_t *data, olsr_u16_t size)
+inline int
+net_outbuffer_bytes_left(struct interface *ifp)
 {
 
-  if((fwdsize + size) > (maxmessagesize + netbuffer_reserved))
-    return 0;
-
-  memcpy(&fwd_buffer[fwdsize + OLSR_HEADERSIZE], data, size);
-  fwdsize += size;
+  if(!netbufs[ifp->if_nr])
+    return -1;
 
-  return 1;
+  return (netbufs[ifp->if_nr]->maxsize - netbufs[ifp->if_nr]->pending);
 }
 
 
 
+
 /**
  *Sends a packet on a given interface.
  *
@@ -223,18 +204,24 @@ net_output(struct interface *ifp)
   struct sockaddr_in6 dst6;
   struct ptf *tmp_ptf_list;
   int i, x;
+  union olsr_packet *outmsg;
 
   sin = NULL;
   sin6 = NULL;
 
-  if(outputsize <= 0)
+  if(!netbufs[ifp->if_nr])
     return -1;
 
-  outputsize += OLSR_HEADERSIZE;
+  if(!netbufs[ifp->if_nr]->pending)
+    return 0;
+
+  netbufs[ifp->if_nr]->pending += OLSR_HEADERSIZE;
+
+  outmsg = (union olsr_packet *)netbufs[ifp->if_nr]->buff;
   /* Add the Packet seqno */
   outmsg->v4.olsr_seqno = htons(ifp->olsr_seqnum++);
   /* Set the packetlength */
-  outmsg->v4.olsr_packlen = htons(outputsize);
+  outmsg->v4.olsr_packlen = htons(netbufs[ifp->if_nr]->pending);
 
   if(ipversion == AF_INET)
     {
@@ -261,52 +248,13 @@ net_output(struct interface *ifp)
       sin6 = &dst6;
     }
 
-  /*
-   *if the '-disp- option was given
-   *we print her decimal contetnt of the packets
-   */
-  /*
-  if(disp_pack_out)
-    {
-      switch(out_buffer[4])
-       {
-       case(HELLO_MESSAGE):printf("\n\tHELLO ");break;
-       case(TC_MESSAGE):printf("\n\tTC ");break;
-       case(MID_MESSAGE):printf("\n\tMID ");break;
-       case(HNA_MESSAGE):printf("\n\tHNA ");break;
-       }
-      if(ipversion == AF_INET)
-       printf("to %s size: %d\n\t", ip_to_string(&sin->sin_addr.s_addr), outputsize);
-      else
-       printf("to %s size: %d\n\t", ip6_to_string(&sin6->sin6_addr), outputsize);
-
-      x = 0;
-
-      for(i = 0; i < outputsize;i++)
-       {
-         if(x == 4)
-           {
-             x = 0;
-             printf("\n\t");
-           }
-         x++;
-         if(ipversion == AF_INET)
-           printf(" %3i", (u_char) out_buffer[i]);
-         else
-           printf(" %2x", (u_char) out_buffer[i]);
-       }
-      
-      printf("\n");
-    }
-  */
-
   /*
    *Call possible packet transform functions registered by plugins  
    */
   tmp_ptf_list = ptf_list;
   while(tmp_ptf_list != NULL)
     {
-      tmp_ptf_list->function(out_buffer, &outputsize);
+      tmp_ptf_list->function(netbufs[ifp->if_nr]->buff, &netbufs[ifp->if_nr]->pending);
       tmp_ptf_list = tmp_ptf_list->next;
     }
 
@@ -316,22 +264,22 @@ net_output(struct interface *ifp)
    */
   if(disp_pack_out)
     {
-      switch(out_buffer[4])
+      switch(netbufs[ifp->if_nr]->buff[4])
        {
        case(HELLO_MESSAGE):printf("\n\tHELLO ");break;
        case(TC_MESSAGE):printf("\n\tTC ");break;
        case(MID_MESSAGE):printf("\n\tMID ");break;
        case(HNA_MESSAGE):printf("\n\tHNA ");break;
-       default:printf("\n\tTYPE: %d ", out_buffer[4]); break;
+       default:printf("\n\tTYPE: %d ", netbufs[ifp->if_nr]->buff[4]); break;
        }
       if(ipversion == AF_INET)
-       printf("to %s size: %d\n\t", ip_to_string((olsr_u32_t *)&sin->sin_addr.s_addr), outputsize);
+       printf("to %s size: %d\n\t", ip_to_string((olsr_u32_t *)&sin->sin_addr.s_addr), netbufs[ifp->if_nr]->pending);
       else
-       printf("to %s size: %d\n\t", ip6_to_string(&sin6->sin6_addr), outputsize);
+       printf("to %s size: %d\n\t", ip6_to_string(&sin6->sin6_addr), netbufs[ifp->if_nr]->pending);
 
       x = 0;
 
-      for(i = 0; i < outputsize;i++)
+      for(i = 0; i < netbufs[ifp->if_nr]->pending;i++)
        {
          if(x == 4)
            {
@@ -340,9 +288,9 @@ net_output(struct interface *ifp)
            }
          x++;
          if(ipversion == AF_INET)
-           printf(" %3i", (u_char) out_buffer[i]);
+           printf(" %3i", (u_char) netbufs[ifp->if_nr]->buff[i]);
          else
-           printf(" %2x", (u_char) out_buffer[i]);
+           printf(" %2x", (u_char) netbufs[ifp->if_nr]->buff[i]);
        }
       
       printf("\n");
@@ -356,30 +304,42 @@ net_output(struct interface *ifp)
   if(ipversion == AF_INET)
     {
       /* IP version 4 */
-      if(sendto(ifp->olsr_socket, out_buffer, outputsize, MSG_DONTROUTE, (struct sockaddr *)sin, sizeof (*sin)) < 0)
+      if(sendto(ifp->olsr_socket, 
+               netbufs[ifp->if_nr]->buff, 
+               netbufs[ifp->if_nr]->pending, 
+               MSG_DONTROUTE, 
+               (struct sockaddr *)sin, 
+               sizeof (*sin)) 
+        < 0)
        {
          perror("sendto(v4)");
          olsr_syslog(OLSR_LOG_ERR, "OLSR: sendto IPv4 %m");
-         outputsize = 0;
+         netbufs[ifp->if_nr]->pending = 0;
          return -1;
        }
     }
   else
     {
       /* IP version 6 */
-      if(sendto(ifp->olsr_socket, out_buffer, outputsize, MSG_DONTROUTE, (struct sockaddr *)sin6, sizeof (*sin6)) < 0)
+      if(sendto(ifp->olsr_socket, 
+               netbufs[ifp->if_nr]->buff,
+               netbufs[ifp->if_nr]->pending, 
+               MSG_DONTROUTE, 
+               (struct sockaddr *)sin6, 
+               sizeof (*sin6)) 
+        < 0)
        {
          perror("sendto(v6)");
          olsr_syslog(OLSR_LOG_ERR, "OLSR: sendto IPv6 %m");
          fprintf(stderr, "Socket: %d interface: %d\n", ifp->olsr_socket, ifp->if_nr);
          fprintf(stderr, "To: %s (size: %d)\n", ip6_to_string(&sin6->sin6_addr), sizeof(*sin6));
-         fprintf(stderr, "Outputsize: %d\n", outputsize);
-         outputsize = 0;
+         fprintf(stderr, "Outputsize: %d\n", netbufs[ifp->if_nr]->pending);
+         netbufs[ifp->if_nr]->pending = 0;
          return -1;
        }
     }
   
-  outputsize = 0;
+  netbufs[ifp->if_nr]->pending = 0;
 
   return 1;
 }
@@ -389,129 +349,6 @@ net_output(struct interface *ifp)
 
 
 
-/**
- *Forward a message on all interfaces
- *
- *@return negative on error
- */
-int
-net_forward()
-{
-  struct sockaddr_in *sin;  
-  struct sockaddr_in dst;
-  struct sockaddr_in6 *sin6;  
-  struct sockaddr_in6 dst6;
-  struct interface *ifn;
-  struct ptf *tmp_ptf_list;
-  int i, x;
-  
-  sin = NULL;
-  sin6 = NULL;
-  
-  for (ifn = ifnet; ifn; ifn = ifn->int_next) 
-    {
-      
-      fwdsize += OLSR_HEADERSIZE;      
-      /* Add the Packet seqno */
-      fwdmsg->v4.olsr_seqno = htons(ifn->olsr_seqnum++);
-      /* Set the packetlength */
-      fwdmsg->v4.olsr_packlen = htons(fwdsize);
-
-      if(ipversion == AF_INET)
-       {
-         /* IP version 4 */
-         sin = (struct sockaddr_in *)&ifn->int_broadaddr;
-         
-         /* Copy sin */
-         dst = *sin;
-         sin = &dst;
-
-         /* Set user defined broadcastaddr */
-         if(bcast_set)
-           memcpy(&dst.sin_addr.s_addr, &bcastaddr.sin_addr, sizeof(olsr_u32_t));
-         
-         if (sin->sin_port == 0)
-           sin->sin_port = olsr_udp_port;
-       }
-      else
-       {
-         /* IP version 6 */
-         sin6 = (struct sockaddr_in6 *)&ifn->int6_multaddr;
-         /* Copy sin */
-         dst6 = *sin6;
-         sin6 = &dst6;
-       }
-
-      /*
-       *if the '-disp- option was given
-       *we print her decimal contetnt of the packets
-       */
-      if(disp_pack_out)
-       {
-         if(ipversion == AF_INET)
-           printf("FORWARDING to %s size: %d\n\t", ip_to_string((olsr_u32_t *)&sin->sin_addr.s_addr), fwdsize);
-         else
-           printf("FORWARDING to %s size: %d\n\t", ip6_to_string(&sin6->sin6_addr), fwdsize);
-         
-         x = 0;
-         
-         for(i = 0; i < fwdsize;i++)
-           {
-             if(x == 4)
-               {
-                 x = 0;
-                 printf("\n\t");
-               }
-             x++;
-             if(ipversion == AF_INET)
-               printf(" %3i", (u_char) fwd_buffer[i]);
-             else
-               printf(" %2x", (u_char) fwd_buffer[i]);
-           }
-         
-         printf("\n");
-       }
-  
-      
-      /*
-       *Call possible packet transform functions registered by plugins  
-       */
-      tmp_ptf_list = ptf_list;
-      while(tmp_ptf_list != NULL)
-       {
-         tmp_ptf_list->function(fwd_buffer, &fwdsize);
-         tmp_ptf_list = tmp_ptf_list->next;
-       }
-
-
-      if(ipversion == AF_INET)
-       {
-         /* IP version 4 */
-         if(sendto(ifn->olsr_socket, fwd_buffer, fwdsize, MSG_DONTROUTE, (struct sockaddr *)sin, sizeof (*sin)) < 0)
-           {
-             perror("sendto(v4)");
-             olsr_syslog(OLSR_LOG_ERR, "OLSR: forward sendto IPv4 %m");
-             return -1;
-           }
-       }
-      else
-       {
-         /* IP version 6 */
-         if(sendto(ifn->olsr_socket, fwd_buffer, fwdsize, MSG_DONTROUTE, (struct sockaddr *)sin6, sizeof (*sin6)) < 0)
-           {
-             perror("sendto(v6)");
-             olsr_syslog(OLSR_LOG_ERR, "OLSR: forward sendto IPv6 %m");
-             fprintf(stderr, "Socket: %d interface: %d\n", ifn->olsr_socket, ifn->if_nr);
-             fprintf(stderr, "To: %s (size: %d)\n", ip6_to_string(&sin6->sin6_addr), sizeof(*sin6));
-             fprintf(stderr, "Outputsize: %d\n", fwdsize);
-             return -1;
-           }
-       }
-
-    }      
-  return 1;
-}
-
 /*
  * Add a packet transform function
  */
index d2f50c7..546ac37 100644 (file)
--- a/src/net.h
+++ b/src/net.h
@@ -20,7 +20,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: net.h,v 1.8 2004/09/25 11:13:28 kattemat Exp $
+ * $Id: net.h,v 1.9 2004/09/25 21:06:07 kattemat Exp $
  *
  */
 
@@ -34,6 +34,9 @@
 #include <arpa/inet.h>
 #include <net/if.h>
 
+
+#define MAX_IFS          32
+
 /* Packet transform functions */
 
 struct ptf
@@ -47,41 +50,29 @@ struct ptf *ptf_list;
 void
 init_net();
 
-inline int
-net_outbuffer_bytes_left();
-
-inline olsr_u16_t
-net_fwd_pending();
-
-inline olsr_u16_t
-net_output_pending();
-
 int
-net_set_maxmsgsize(olsr_u16_t);
-
-inline olsr_u16_t
-net_get_maxmsgsize();
+net_add_buffer(struct interface *);
 
 int
-net_reserve_bufferspace(olsr_u16_t);
+net_remove_buffer(struct interface *);
 
-int
-net_outbuffer_push(olsr_u8_t *, olsr_u16_t);
+inline int
+net_outbuffer_bytes_left(struct interface *);
 
-int
-net_outbuffer_push_reserved(olsr_u8_t *, olsr_u16_t);
+inline olsr_u16_t
+net_output_pending(struct interface *);
 
 int
-net_fwdbuffer_push(olsr_u8_t *, olsr_u16_t);
+net_reserve_bufspace(struct interface *, int);
 
 int
-net_fwdbuffer_push_reserved(olsr_u8_t *, olsr_u16_t);
+net_outbuffer_push(struct interface *, olsr_u8_t *, olsr_u16_t);
 
 int
-net_output(struct interface*);
+net_outbuffer_push_reserved(struct interface *, olsr_u8_t *, olsr_u16_t);
 
 int
-net_forward();
+net_output(struct interface*);
 
 int
 net_sendroute(struct rt_entry *, struct sockaddr *);
index f16d299..37aa89b 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: olsr.c,v 1.11 2004/09/22 17:00:28 kattemat Exp $
+ * $Id: olsr.c,v 1.12 2004/09/25 21:06:07 kattemat Exp $
  *
  */
 
@@ -44,6 +44,9 @@
 #include <signal.h>
 
 
+static int
+buffer_forward(struct interface *, union olsr_message *, olsr_u16_t);
+
 /**
  *Checks if a timer has timed out.
  */
@@ -283,6 +286,7 @@ olsr_forward_message(union olsr_message *m,
   union olsr_ip_addr *src;
   struct neighbor_entry *neighbor;
   int msgsize;
+  struct interface *ifn;
 
 
   if(!olsr_check_dup_table_fwd(originator, seqno, &in_if->ip_addr))
@@ -342,44 +346,38 @@ olsr_forward_message(union olsr_message *m,
 
   msgsize = ntohs(m->v4.olsr_msgsize);
 
-  if(net_fwd_pending())
-    {
-      /*
-       * Check if message is to big to be piggybacked
-       */
-      if(net_fwdbuffer_push((olsr_u8_t *)m, msgsize) != msgsize)
+  /* looping trough interfaces */
+  for (ifn = ifnet; ifn ; ifn = ifn->int_next) 
+    { 
+      if(net_output_pending(ifn))
        {
-         olsr_printf(1, "Forwardbuffer full(%d + %d) - flushing!\n", net_fwd_pending(), msgsize);
-         
-         /* Send */
-         net_forward();
-         
-         /* Buffer message */
-         buffer_forward(m, msgsize);
+         /*
+          * Check if message is to big to be piggybacked
+          */
+         if(net_outbuffer_push(ifn, (olsr_u8_t *)m, msgsize) != msgsize)
+           {
+             /* Send */
+             net_output(ifn);
+             /* Buffer message */
+             buffer_forward(ifn, m, msgsize);
+           }
        }
+      
       else
        {
-#ifdef DEBUG
-         olsr_printf(3, "Piggybacking message - buffer: %d msg: %d\n", net_fwd_pending(), msgsize);
-#endif
-         /* piggyback message to outputbuffer */
+         /* No forwarding pending */
+         buffer_forward(ifn, m, msgsize);
        }
     }
 
-  else
-    {
-      /* No forwarding pending */
-      buffer_forward(m, msgsize);
-    }
-
   return 1;
 
 }
 
 
 
-int
-buffer_forward(union olsr_message *m, olsr_u16_t msgsize)
+static int
+buffer_forward(struct interface *ifn, union olsr_message *m, olsr_u16_t msgsize)
 {
   float jitter;
   struct timeval jittertimer;
@@ -398,10 +396,10 @@ buffer_forward(union olsr_message *m, olsr_u16_t msgsize)
 #endif
 
   /* Copy message to outputbuffer */
-  if(net_fwdbuffer_push((olsr_u8_t *)m, msgsize) != msgsize)
+  if(net_outbuffer_push(ifn, (olsr_u8_t *)m, msgsize) != msgsize)
     {
-      olsr_printf(1, "Received message to big to be forwarded(%d bytes)!", msgsize);
-      olsr_syslog(OLSR_LOG_ERR, "Received message to big to be forwarded(%d bytes)!", msgsize);
+      olsr_printf(1, "Received message to big to be forwarded in %s(%d bytes)!", ifn->int_name, msgsize);
+      olsr_syslog(OLSR_LOG_ERR, "Received message to big to be forwarded on %s(%d bytes)!", ifn->int_name, msgsize);
       fwdtimer = now;
     }
 
index 72219c0..ee55939 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: olsr.h,v 1.6 2004/09/21 19:08:57 kattemat Exp $
+ * $Id: olsr.h,v 1.7 2004/09/25 21:06:07 kattemat Exp $
  *
  */
 
@@ -95,9 +95,6 @@ olsr_forward_message(union olsr_message *,
                     struct interface *, 
                     union olsr_ip_addr *);
 
-int
-buffer_forward(union olsr_message *, olsr_u16_t);
-
 void
 olsr_init_tables();
 
index 3b01999..95710e5 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: scheduler.c,v 1.8 2004/09/22 17:00:29 kattemat Exp $
+ * $Id: scheduler.c,v 1.9 2004/09/25 21:06:07 kattemat Exp $
  *
  */
 
@@ -102,6 +102,8 @@ scheduler()
 
   struct event_entry *entry;
   struct timeout_entry *time_out_entry;
+
+  struct interface *ifn;
  
   interval_usec = (olsr_u32_t)(sched_poll_interval * 1000000);
 
@@ -195,15 +197,16 @@ scheduler()
 
 
 
-
-      /* Forward message(s) OUTSIDE INTERFACE LOOP */
-      if(net_fwd_pending() && TIMED_OUT(&fwdtimer)) 
+      /* looping trough interfaces */
+      for (ifn = ifnet; ifn ; ifn = ifn->int_next) 
        { 
+         if(net_output_pending(ifn) && TIMED_OUT(&fwdtimer)) 
+           { 
 #ifdef DEBUG
-         olsr_printf(3, "Forwarding message - size %d\n", fwdsize);
+             olsr_printf(3, "Forwarding message - size %d\n", fwdsize);
 #endif   
-         net_forward();
-         
+             net_output(ifn);
+           }
        }
 
       /* C R I T I C A L - S E C T I O N - E N D */