Added support for dynamic change of outputbuffersize based on the interfaces with...
authorAndreas Tonnesen <andreto@olsr.org>
Wed, 22 Sep 2004 20:57:50 +0000 (20:57 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Wed, 22 Sep 2004 20:57:50 +0000 (20:57 +0000)
CHANGELOG
bin/olsrd
src/defs.h
src/interfaces.h
src/linux/ifnet.c
src/net.c
src/parser.c

index c2fe89f..d1b7c58 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,22 @@
 This file states changes as of version 0.2.4:
 
+0.4.8 ---------------------------------------------------------------------
+
+CODE REWRITES
+
+Much of the message generation and net output code is rewritten.
+PUGIN DEVELOPERS must note that the buffers and size variables
+used in net output is no longer directly accessible!
+
+DYNAMIC NET OUTPUT BUFFER SIZE
+
+The outputbuffer is now dynamically set to the smallest MTU
+(minus UDP/IP headers) of any interface in use. This causes
+the buffer to be larger than before in most situation, which
+again means that one can stack even more messages in the same
+OLSR package.
+
+
 0.4.7 ---------------------------------------------------------------------
 
 NATIVE WINDOWS GUI AND INSTALLER
index eebe8dc..27a7f67 100755 (executable)
Binary files a/bin/olsrd and b/bin/olsrd differ
index 6e24a8b..fee94d5 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: defs.h,v 1.11 2004/09/22 17:00:28 kattemat Exp $
+ * $Id: defs.h,v 1.12 2004/09/22 20:57:50 kattemat Exp $
  *
  */
 
@@ -50,7 +50,8 @@
 #define SOFTWARE_VERSION "olsr.org - " VERSION
 
 #define        HOPCNT_MAX              16      /* maximum hops number */
-#define        MAXMESSAGESIZE          512     /* max broadcast size */
+#define        MAXMESSAGESIZE          1500    /* max broadcast size */
+#define UDP_IP_HDRSIZE          28
 
 #define OLSR_SELECT_TIMEOUT     2       /* The timeout for the main select loop */
 /* Debug helper macro */
index 5b1bb15..ba08cb4 100644 (file)
@@ -20,7 +20,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: interfaces.h,v 1.5 2004/09/21 19:08:57 kattemat Exp $
+ * $Id: interfaces.h,v 1.6 2004/09/22 20:57:50 kattemat Exp $
  *
  */
 
@@ -69,6 +69,7 @@ struct interface
   union         olsr_ip_addr ip_addr;
   int           olsr_socket;                    /* The broadcast socket for this interface */
   int          int_metric;                     /* metric of interface */
+  int           int_mtu;                        /* MTU of interface */
   int          int_flags;                      /* see below */
   char         *int_name;                      /* from kernel if structure */
   int           if_index;                       /* Kernels index of this interface */
index 3d1e736..0fc7c8d 100644 (file)
@@ -20,7 +20,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: ifnet.c,v 1.6 2004/09/21 19:08:58 kattemat Exp $
+ * $Id: ifnet.c,v 1.7 2004/09/22 20:57:50 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;
+  int if_changes, smallest_mtu;
   struct ifchgf *tmp_ifchgf_list;
   if_changes = 0;
 
@@ -190,6 +190,21 @@ chk_if_changed(struct if_name *iface)
   /* Set interface metric */
   ifp->int_metric = ifp->is_wireless;
 
+  /* Get MTU */
+  if (ioctl(ioctl_s, SIOCGIFMTU, &ifr) < 0)
+    ifp->int_mtu = 0;
+  else
+    {
+      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);
+       }
+    }
+
+
   /* Get interface index */
   ifp->if_index = if_nametoindex(ifr.ifr_name);
 
@@ -386,12 +401,30 @@ chk_if_changed(struct if_name *iface)
        }
       tmp_ifp->int_next = ifp->int_next;
     }
+
+
+  /* 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);
+    }
+
   /* Check main addr */
   if(COMP_IP(&main_addr, &ifp->ip_addr))
     {
       if(ifnet == NULL)
        {
-         /* No more interface */
+         /* No more interfaces */
          memset(&main_addr, 0, ipsize);
          olsr_printf(1, "No more interfaces...\n");
        }
@@ -577,8 +610,21 @@ chk_if_up(struct if_name *iface, int debuglvl)
   /* setting the interfaces number*/
   ifs.if_nr = iface->index;
 
+
+  /* Get MTU */
+  if (ioctl(ioctl_s, SIOCGIFMTU, &ifr) < 0)
+    ifs.int_mtu = 0;
+  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);
+    }
+  olsr_printf(1, "\tMTU: %d\n", ifs.int_mtu);
+
   olsr_syslog(OLSR_LOG_INFO, "Adding interface %s\n", iface->name);
-  olsr_printf(1, "Interface %s set up for use with index %d\n", iface->name, ifs.if_nr);
+  olsr_printf(1, "\tInterface %s set up for use with index %d\n", iface->name, ifs.if_nr);
 
   if(ipversion == AF_INET)
     {
index b5396d7..1df652f 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.11 2004/09/22 17:00:28 kattemat Exp $
+ * $Id: net.c,v 1.12 2004/09/22 20:57:50 kattemat Exp $
  *
  */
 
@@ -34,7 +34,7 @@ void
 WinSockPError(char *);
 #endif
 
-
+#warning HEAPS of changes in net.c!!!
 
 static char out_buffer[MAXMESSAGESIZE+1];
 static char fwd_buffer[MAXMESSAGESIZE+1];
@@ -46,16 +46,14 @@ int outputsize = 0;         /* current size of the output buffer */
 int fwdsize = 0;         /* current size of the forward buffer */
 
 
-/* Max OLSR packet size */
-
-static int maxmessagesize = MAXMESSAGESIZE - OLSR_HEADERSIZE;
+/* Default max OLSR packet size */
+static int maxmessagesize = MAXMESSAGESIZE - OLSR_HEADERSIZE - UDP_IP_HDRSIZE;
 
 
 void
 init_net()
 {
   ptf_list = NULL;
-  maxmessagesize = MAXMESSAGESIZE - OLSR_HEADERSIZE;
 
   return;
 }
@@ -64,12 +62,13 @@ int
 net_set_maxmsgsize(olsr_u16_t new_size)
 {
 
-  if(new_size > (MAXMESSAGESIZE - OLSR_HEADERSIZE))
+  if(new_size > (MAXMESSAGESIZE - OLSR_HEADERSIZE - UDP_IP_HDRSIZE))
     return -1;
 
   else
     maxmessagesize = new_size;
 
+  olsr_printf(1, "Not outputbuffer maxsize set to %d\n", maxmessagesize);
   return maxmessagesize;
 }
 
@@ -172,7 +171,6 @@ net_output(struct interface *ifp)
   /* Add the Packet seqno */
   outmsg->v4.olsr_seqno = htons(ifp->olsr_seqnum++);
   /* Set the packetlength */
-#warning 0.4.8 net_output now sets packetsize itself
   outmsg->v4.olsr_packlen = htons(outputsize);
 
   if(ipversion == AF_INET)
@@ -354,7 +352,6 @@ net_forward()
       /* Add the Packet seqno */
       fwdmsg->v4.olsr_seqno = htons(ifn->olsr_seqnum++);
       /* Set the packetlength */
-#warning 0.4.8 net_forward now sets packetsize itself
       fwdmsg->v4.olsr_packlen = htons(fwdsize);
 
       if(ipversion == AF_INET)
index e89428e..9d2e11d 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: parser.c,v 1.7 2004/09/21 19:08:57 kattemat Exp $
+ * $Id: parser.c,v 1.8 2004/09/22 20:57:50 kattemat Exp $
  *
  */
 
 #endif
 
 
+/* The outputbuffer on neighbornodes
+ * will never exceed MAXMESSAGESIZE
+ */
+static char inbuf[MAXMESSAGESIZE+1];
+
+
 /**
  *Initialize the parser. 
  *
@@ -137,11 +143,6 @@ olsr_input(int fd)
   int cc;
   struct interface *olsr_in_if;
   union olsr_ip_addr from_addr;
-  union
-  {
-    char       buf[MAXMESSAGESIZE+1];
-    struct     olsr olsr;
-  } inbuf;
 
 
   for (;;) 
@@ -149,7 +150,7 @@ olsr_input(int fd)
       fromlen = sizeof(struct sockaddr_storage);
 
       cc = recvfrom(fd, 
-                   (char *)&inbuf, 
+                   inbuf, 
                    sizeof (inbuf), 
                    0, 
                    (struct sockaddr *)&from, 
@@ -208,7 +209,7 @@ olsr_input(int fd)
        * &inbuf.olsr 
        * cc - bytes read
        */
-      parse_packet(&inbuf.olsr, cc, olsr_in_if, &from_addr);
+      parse_packet((struct olsr *)inbuf, cc, olsr_in_if, &from_addr);
     
     }
 }