move net_output() and olsr_input() to OS dependent dirs, linux and bsd
authorDave Cornejo <dcornejo@gmail.com>
Sat, 12 Feb 2005 23:07:02 +0000 (23:07 +0000)
committerDave Cornejo <dcornejo@gmail.com>
Sat, 12 Feb 2005 23:07:02 +0000 (23:07 +0000)
compiled and tested

src/bsd/net.c
src/linux/net.c
src/net.c
src/net.h
src/net_os.h
src/parser.c
src/win32/net.c

index f76383f..9e04a2e 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.8 2004/12/12 17:54:00 kattemat Exp $
+ * $Id: net.c,v 1.9 2005/02/12 23:07:02 spoggle Exp $
  */
 
 #include "../defs.h"
 #include "../net_os.h"
+#include "../parser.h" /* dnc: needed for call to packet_parser() */
 #include "net.h"
 
 #ifdef __NetBSD__
@@ -280,3 +281,250 @@ int get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, int scope_in)
 {
   return 0;
 }
+
+/* ======== moved from above ======== */
+
+extern struct olsr_netbuf *netbufs[];
+
+/**
+ *Sends a packet on a given interface.
+ *
+ *@param ifp the interface to send on.
+ *
+ *@return negative on error
+ */
+int
+net_output(struct interface *ifp)
+{
+  struct sockaddr_in *sin;  
+  struct sockaddr_in dst;
+  struct sockaddr_in6 *sin6;  
+  struct sockaddr_in6 dst6;
+  struct ptf *tmp_ptf_list;
+  int i, x;
+  union olsr_packet *outmsg;
+
+  sin = NULL;
+  sin6 = NULL;
+
+  if(!netbufs[ifp->if_nr])
+    return -1;
+
+  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(netbufs[ifp->if_nr]->pending);
+
+  if(olsr_cnf->ip_version == AF_INET)
+    {
+      /* IP version 4 */
+      sin = (struct sockaddr_in *)&ifp->int_broadaddr;
+
+      /* Copy sin */
+      dst = *sin;
+      sin = &dst;
+
+      if (sin->sin_port == 0)
+       sin->sin_port = olsr_udp_port;
+    }
+  else
+    {
+      /* IP version 6 */
+      sin6 = (struct sockaddr_in6 *)&ifp->int6_multaddr;
+      /* Copy sin */
+      dst6 = *sin6;
+      sin6 = &dst6;
+    }
+
+  /*
+   *Call possible packet transform functions registered by plugins  
+   */
+  tmp_ptf_list = ptf_list;
+  while(tmp_ptf_list != NULL)
+    {
+      tmp_ptf_list->function(netbufs[ifp->if_nr]->buff, &netbufs[ifp->if_nr]->pending);
+      tmp_ptf_list = tmp_ptf_list->next;
+    }
+
+  /*
+   *if the '-disp- option was given
+   *we print her decimal contetnt of the packets
+   */
+  if(disp_pack_out)
+    {
+      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 ", netbufs[ifp->if_nr]->buff[4]); break;
+       }
+      if(olsr_cnf->ip_version == AF_INET)
+       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), netbufs[ifp->if_nr]->pending);
+
+      x = 0;
+
+      for(i = 0; i < netbufs[ifp->if_nr]->pending;i++)
+       {
+         if(x == 4)
+           {
+             x = 0;
+             printf("\n\t");
+           }
+         x++;
+         if(olsr_cnf->ip_version == AF_INET)
+           printf(" %3i", (u_char) netbufs[ifp->if_nr]->buff[i]);
+         else
+           printf(" %2x", (u_char) netbufs[ifp->if_nr]->buff[i]);
+       }
+      
+      printf("\n");
+    }
+  
+  if(olsr_cnf->ip_version == AF_INET)
+    {
+      /* IP version 4 */
+      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");
+         netbufs[ifp->if_nr]->pending = 0;
+         return -1;
+       }
+    }
+  else
+    {
+      /* IP version 6 */
+      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), (int)sizeof(*sin6));
+         fprintf(stderr, "Outputsize: %d\n", netbufs[ifp->if_nr]->pending);
+         netbufs[ifp->if_nr]->pending = 0;
+         return -1;
+       }
+    }
+  
+  netbufs[ifp->if_nr]->pending = 0;
+
+  return 1;
+}
+
+/* The outputbuffer on neighbornodes
+ * will never exceed MAXMESSAGESIZE
+ */
+static char inbuf[MAXMESSAGESIZE+1];
+
+/**
+ *Processing OLSR data from socket. Reading data, setting 
+ *wich interface recieved the message, Sends IPC(if used) 
+ *and passes the packet on to parse_packet().
+ *
+ *@param fd the filedescriptor that data should be read from.
+ *@return nada
+ */
+void
+olsr_input(int fd)
+{
+  /* sockaddr_in6 is bigger than sockaddr !!!! */
+  struct sockaddr_storage from;
+  size_t fromlen;
+  int cc;
+  struct interface *olsr_in_if;
+  union olsr_ip_addr from_addr;
+
+
+  for (;;) 
+    {
+      fromlen = sizeof(struct sockaddr_storage);
+
+      cc = recvfrom(fd, 
+                   inbuf, 
+                   sizeof (inbuf), 
+                   0, 
+                   (struct sockaddr *)&from, 
+                   &fromlen);
+
+      if (cc <= 0) 
+       {
+         if (cc < 0 && errno != EWOULDBLOCK)
+           {
+             olsr_printf(1, "error recvfrom: %s", strerror(errno));
+             olsr_syslog(OLSR_LOG_ERR, "error recvfrom: %m");
+           }
+         break;
+       }
+
+      if(olsr_cnf->ip_version == AF_INET)
+       {
+         /* IPv4 sender address */
+         COPY_IP(&from_addr, &((struct sockaddr_in *)&from)->sin_addr.s_addr);
+       }
+      else
+       {
+         /* IPv6 sender address */
+         COPY_IP(&from_addr, &((struct sockaddr_in6 *)&from)->sin6_addr);
+       }
+
+      /* are we talking to ourselves? */
+      if(if_ifwithaddr(&from_addr) != NULL)
+       return;
+
+#ifdef DEBUG
+      olsr_printf(5, "Recieved a packet from %s\n", olsr_ip_to_string((union olsr_ip_addr *)&((struct sockaddr_in *)&from)->sin_addr.s_addr));
+#endif
+      //printf("\nCC: %d FROMLEN: %d\n\n", cc, fromlen);
+      if ((olsr_cnf->ip_version == AF_INET) && (fromlen != sizeof (struct sockaddr_in)))
+       break;
+      else if ((olsr_cnf->ip_version == AF_INET6) && (fromlen != sizeof (struct sockaddr_in6)))
+       break;
+
+      //printf("Recieved data on socket %d\n", socknr);
+
+
+      if((olsr_in_if = if_ifwithsock(fd)) == NULL)
+       {
+         olsr_printf(1, "Could not find input interface for message from %s size %d\n",
+                     olsr_ip_to_string(&from_addr),
+                     cc);
+         olsr_syslog(OLSR_LOG_ERR, "Could not find input interface for message from %s size %d\n",
+                olsr_ip_to_string(&from_addr),
+                cc);
+         return ;
+       }
+
+      /*
+       * &from - sender
+       * &inbuf.olsr 
+       * cc - bytes read
+       */
+      /* dnc: is it some kind of violation to call a routine in the dir above us? */
+      parse_packet((struct olsr *)inbuf, cc, olsr_in_if, &from_addr);
+    
+    }
+}
+
+
index 8589cd2..1787fb6 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.12 2005/01/14 05:21:10 kattemat Exp $
+ * $Id: net.c,v 1.13 2005/02/12 23:07:02 spoggle Exp $
  */
 
 
@@ -560,3 +560,250 @@ get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, int scope_in)
   
   return 0;
 }
+
+
+/* ======== moved from above ======== */
+
+extern struct olsr_netbuf *netbufs[];
+
+/**
+ *Sends a packet on a given interface.
+ *
+ *@param ifp the interface to send on.
+ *
+ *@return negative on error
+ */
+int
+net_output(struct interface *ifp)
+{
+  struct sockaddr_in *sin;  
+  struct sockaddr_in dst;
+  struct sockaddr_in6 *sin6;  
+  struct sockaddr_in6 dst6;
+  struct ptf *tmp_ptf_list;
+  int i, x;
+  union olsr_packet *outmsg;
+
+  sin = NULL;
+  sin6 = NULL;
+
+  if(!netbufs[ifp->if_nr])
+    return -1;
+
+  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(netbufs[ifp->if_nr]->pending);
+
+  if(olsr_cnf->ip_version == AF_INET)
+    {
+      /* IP version 4 */
+      sin = (struct sockaddr_in *)&ifp->int_broadaddr;
+
+      /* Copy sin */
+      dst = *sin;
+      sin = &dst;
+
+      if (sin->sin_port == 0)
+       sin->sin_port = olsr_udp_port;
+    }
+  else
+    {
+      /* IP version 6 */
+      sin6 = (struct sockaddr_in6 *)&ifp->int6_multaddr;
+      /* Copy sin */
+      dst6 = *sin6;
+      sin6 = &dst6;
+    }
+
+  /*
+   *Call possible packet transform functions registered by plugins  
+   */
+  tmp_ptf_list = ptf_list;
+  while(tmp_ptf_list != NULL)
+    {
+      tmp_ptf_list->function(netbufs[ifp->if_nr]->buff, &netbufs[ifp->if_nr]->pending);
+      tmp_ptf_list = tmp_ptf_list->next;
+    }
+
+  /*
+   *if the '-disp- option was given
+   *we print her decimal contetnt of the packets
+   */
+  if(disp_pack_out)
+    {
+      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 ", netbufs[ifp->if_nr]->buff[4]); break;
+       }
+      if(olsr_cnf->ip_version == AF_INET)
+       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), netbufs[ifp->if_nr]->pending);
+
+      x = 0;
+
+      for(i = 0; i < netbufs[ifp->if_nr]->pending;i++)
+       {
+         if(x == 4)
+           {
+             x = 0;
+             printf("\n\t");
+           }
+         x++;
+         if(olsr_cnf->ip_version == AF_INET)
+           printf(" %3i", (u_char) netbufs[ifp->if_nr]->buff[i]);
+         else
+           printf(" %2x", (u_char) netbufs[ifp->if_nr]->buff[i]);
+       }
+      
+      printf("\n");
+    }
+  
+  if(olsr_cnf->ip_version == AF_INET)
+    {
+      /* IP version 4 */
+      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");
+         netbufs[ifp->if_nr]->pending = 0;
+         return -1;
+       }
+    }
+  else
+    {
+      /* IP version 6 */
+      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), (int)sizeof(*sin6));
+         fprintf(stderr, "Outputsize: %d\n", netbufs[ifp->if_nr]->pending);
+         netbufs[ifp->if_nr]->pending = 0;
+         return -1;
+       }
+    }
+  
+  netbufs[ifp->if_nr]->pending = 0;
+
+  return 1;
+}
+
+/* The outputbuffer on neighbornodes
+ * will never exceed MAXMESSAGESIZE
+ */
+static char inbuf[MAXMESSAGESIZE+1];
+
+/**
+ *Processing OLSR data from socket. Reading data, setting 
+ *wich interface recieved the message, Sends IPC(if used) 
+ *and passes the packet on to parse_packet().
+ *
+ *@param fd the filedescriptor that data should be read from.
+ *@return nada
+ */
+void
+olsr_input(int fd)
+{
+  /* sockaddr_in6 is bigger than sockaddr !!!! */
+  struct sockaddr_storage from;
+  size_t fromlen;
+  int cc;
+  struct interface *olsr_in_if;
+  union olsr_ip_addr from_addr;
+
+
+  for (;;) 
+    {
+      fromlen = sizeof(struct sockaddr_storage);
+
+      cc = recvfrom(fd, 
+                   inbuf, 
+                   sizeof (inbuf), 
+                   0, 
+                   (struct sockaddr *)&from, 
+                   &fromlen);
+
+      if (cc <= 0) 
+       {
+         if (cc < 0 && errno != EWOULDBLOCK)
+           {
+             olsr_printf(1, "error recvfrom: %s", strerror(errno));
+             olsr_syslog(OLSR_LOG_ERR, "error recvfrom: %m");
+           }
+         break;
+       }
+
+      if(olsr_cnf->ip_version == AF_INET)
+       {
+         /* IPv4 sender address */
+         COPY_IP(&from_addr, &((struct sockaddr_in *)&from)->sin_addr.s_addr);
+       }
+      else
+       {
+         /* IPv6 sender address */
+         COPY_IP(&from_addr, &((struct sockaddr_in6 *)&from)->sin6_addr);
+       }
+
+      /* are we talking to ourselves? */
+      if(if_ifwithaddr(&from_addr) != NULL)
+       return;
+
+#ifdef DEBUG
+      olsr_printf(5, "Recieved a packet from %s\n", olsr_ip_to_string((union olsr_ip_addr *)&((struct sockaddr_in *)&from)->sin_addr.s_addr));
+#endif
+      //printf("\nCC: %d FROMLEN: %d\n\n", cc, fromlen);
+      if ((olsr_cnf->ip_version == AF_INET) && (fromlen != sizeof (struct sockaddr_in)))
+       break;
+      else if ((olsr_cnf->ip_version == AF_INET6) && (fromlen != sizeof (struct sockaddr_in6)))
+       break;
+
+      //printf("Recieved data on socket %d\n", socknr);
+
+
+      if((olsr_in_if = if_ifwithsock(fd)) == NULL)
+       {
+         olsr_printf(1, "Could not find input interface for message from %s size %d\n",
+                     olsr_ip_to_string(&from_addr),
+                     cc);
+         olsr_syslog(OLSR_LOG_ERR, "Could not find input interface for message from %s size %d\n",
+                olsr_ip_to_string(&from_addr),
+                cc);
+         return ;
+       }
+
+      /*
+       * &from - sender
+       * &inbuf.olsr 
+       * cc - bytes read
+       */
+      parse_packet((struct olsr *)inbuf, cc, olsr_in_if, &from_addr);
+    
+    }
+}
+
+
index bd526d5..f628297 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.30 2005/02/12 22:14:27 kattemat Exp $
+ * $Id: net.c,v 1.31 2005/02/12 23:07:02 spoggle Exp $
  */
 
 #include "net.h"
@@ -49,18 +49,7 @@ void
 WinSockPError(char *);
 #endif
 
-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 struct olsr_netbuf *netbufs[MAX_IFS];
+struct olsr_netbuf *netbufs[MAX_IFS];
 
 static char ipv6_buf[100]; /* for address coversion */
 
@@ -248,160 +237,6 @@ net_outbuffer_bytes_left(struct interface *ifp)
 }
 
 
-
-
-/**
- *Sends a packet on a given interface.
- *
- *@param ifp the interface to send on.
- *
- *@return negative on error
- */
-int
-net_output(struct interface *ifp)
-{
-  struct sockaddr_in *sin;  
-  struct sockaddr_in dst;
-  struct sockaddr_in6 *sin6;  
-  struct sockaddr_in6 dst6;
-  struct ptf *tmp_ptf_list;
-  int i, x;
-  union olsr_packet *outmsg;
-
-  sin = NULL;
-  sin6 = NULL;
-
-  if(!netbufs[ifp->if_nr])
-    return -1;
-
-  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(netbufs[ifp->if_nr]->pending);
-
-  if(olsr_cnf->ip_version == AF_INET)
-    {
-      /* IP version 4 */
-      sin = (struct sockaddr_in *)&ifp->int_broadaddr;
-
-      /* Copy sin */
-      dst = *sin;
-      sin = &dst;
-
-      if (sin->sin_port == 0)
-       sin->sin_port = olsr_udp_port;
-    }
-  else
-    {
-      /* IP version 6 */
-      sin6 = (struct sockaddr_in6 *)&ifp->int6_multaddr;
-      /* Copy sin */
-      dst6 = *sin6;
-      sin6 = &dst6;
-    }
-
-  /*
-   *Call possible packet transform functions registered by plugins  
-   */
-  tmp_ptf_list = ptf_list;
-  while(tmp_ptf_list != NULL)
-    {
-      tmp_ptf_list->function(netbufs[ifp->if_nr]->buff, &netbufs[ifp->if_nr]->pending);
-      tmp_ptf_list = tmp_ptf_list->next;
-    }
-
-  /*
-   *if the '-disp- option was given
-   *we print her decimal contetnt of the packets
-   */
-  if(disp_pack_out)
-    {
-      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 ", netbufs[ifp->if_nr]->buff[4]); break;
-       }
-      if(olsr_cnf->ip_version == AF_INET)
-       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), netbufs[ifp->if_nr]->pending);
-
-      x = 0;
-
-      for(i = 0; i < netbufs[ifp->if_nr]->pending;i++)
-       {
-         if(x == 4)
-           {
-             x = 0;
-             printf("\n\t");
-           }
-         x++;
-         if(olsr_cnf->ip_version == AF_INET)
-           printf(" %3i", (u_char) netbufs[ifp->if_nr]->buff[i]);
-         else
-           printf(" %2x", (u_char) netbufs[ifp->if_nr]->buff[i]);
-       }
-      
-      printf("\n");
-    }
-  
-  if(olsr_cnf->ip_version == AF_INET)
-    {
-      /* IP version 4 */
-      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");
-         netbufs[ifp->if_nr]->pending = 0;
-         return -1;
-       }
-    }
-  else
-    {
-      /* IP version 6 */
-      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), (int)sizeof(*sin6));
-         fprintf(stderr, "Outputsize: %d\n", netbufs[ifp->if_nr]->pending);
-         netbufs[ifp->if_nr]->pending = 0;
-         return -1;
-       }
-    }
-  
-  netbufs[ifp->if_nr]->pending = 0;
-
-  return 1;
-}
-
-
-
-
-
-
 /**
  * Add a packet transform function. Theese are functions
  * called just prior to sending data in a buffer.
index 774e663..2c32194 100644 (file)
--- a/src/net.h
+++ b/src/net.h
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.h,v 1.14 2004/12/03 20:57:15 kattemat Exp $
+ * $Id: net.h,v 1.15 2005/02/12 23:07:02 spoggle Exp $
  */
 
 
 #include <arpa/inet.h>
 #include <net/if.h>
 
+/* Output buffer structure */
+
+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 */
+};
 
 /* Packet transform functions */
 
index e06b1f1..6575c3a 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net_os.h,v 1.3 2004/11/21 11:28:56 kattemat Exp $
+ * $Id: net_os.h,v 1.4 2005/02/12 23:07:02 spoggle Exp $
  */
 
 
@@ -80,4 +80,10 @@ getsocket6(struct sockaddr_in6 *, int, char *);
 int
 get_ipv6_address(char *, struct sockaddr_in6 *, int);
 
+void
+olsr_input(int fd);
+
+int
+net_output(struct interface *ifp);
+
 #endif
index c95269b..28405e8 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: parser.c,v 1.16 2004/12/04 17:06:57 tlopatic Exp $
+ * $Id: parser.c,v 1.17 2005/02/12 23:07:02 spoggle Exp $
  */
 
 #include "parser.h"
 #endif
 
 
-/* The outputbuffer on neighbornodes
- * will never exceed MAXMESSAGESIZE
- */
-static char inbuf[MAXMESSAGESIZE+1];
-
-
 /**
  *Initialize the parser. 
  *
@@ -139,98 +133,6 @@ olsr_parser_remove_function(void (*function)(union olsr_message *, struct interf
 }
 
 
-
-/**
- *Processing OLSR data from socket. Reading data, setting 
- *wich interface recieved the message, Sends IPC(if used) 
- *and passes the packet on to parse_packet().
- *
- *@param fd the filedescriptor that data should be read from.
- *@return nada
- */
-void
-olsr_input(int fd)
-{
-  /* sockaddr_in6 is bigger than sockaddr !!!! */
-  struct sockaddr_storage from;
-  size_t fromlen;
-  int cc;
-  struct interface *olsr_in_if;
-  union olsr_ip_addr from_addr;
-
-
-  for (;;) 
-    {
-      fromlen = sizeof(struct sockaddr_storage);
-
-      cc = recvfrom(fd, 
-                   inbuf, 
-                   sizeof (inbuf), 
-                   0, 
-                   (struct sockaddr *)&from, 
-                   &fromlen);
-
-      if (cc <= 0) 
-       {
-         if (cc < 0 && errno != EWOULDBLOCK)
-           {
-             olsr_printf(1, "error recvfrom: %s", strerror(errno));
-             olsr_syslog(OLSR_LOG_ERR, "error recvfrom: %m");
-           }
-         break;
-       }
-
-      if(olsr_cnf->ip_version == AF_INET)
-       {
-         /* IPv4 sender address */
-         COPY_IP(&from_addr, &((struct sockaddr_in *)&from)->sin_addr.s_addr);
-       }
-      else
-       {
-         /* IPv6 sender address */
-         COPY_IP(&from_addr, &((struct sockaddr_in6 *)&from)->sin6_addr);
-       }
-
-      /* are we talking to ourselves? */
-      if(if_ifwithaddr(&from_addr) != NULL)
-       return;
-
-#ifdef DEBUG
-      olsr_printf(5, "Recieved a packet from %s\n", olsr_ip_to_string((union olsr_ip_addr *)&((struct sockaddr_in *)&from)->sin_addr.s_addr));
-#endif
-      //printf("\nCC: %d FROMLEN: %d\n\n", cc, fromlen);
-      if ((olsr_cnf->ip_version == AF_INET) && (fromlen != sizeof (struct sockaddr_in)))
-       break;
-      else if ((olsr_cnf->ip_version == AF_INET6) && (fromlen != sizeof (struct sockaddr_in6)))
-       break;
-
-      //printf("Recieved data on socket %d\n", socknr);
-
-
-      if((olsr_in_if = if_ifwithsock(fd)) == NULL)
-       {
-         olsr_printf(1, "Could not find input interface for message from %s size %d\n",
-                     olsr_ip_to_string(&from_addr),
-                     cc);
-         olsr_syslog(OLSR_LOG_ERR, "Could not find input interface for message from %s size %d\n",
-                olsr_ip_to_string(&from_addr),
-                cc);
-         return ;
-       }
-
-      /*
-       * &from - sender
-       * &inbuf.olsr 
-       * cc - bytes read
-       */
-      parse_packet((struct olsr *)inbuf, cc, olsr_in_if, &from_addr);
-    
-    }
-}
-
-
-
-
 /**
  *Process a newly received OLSR packet. Checks the type
  *and to the neccessary convertions and call the
index 1ab28f1..4c1ddfa 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.11 2004/11/21 01:21:10 tlopatic Exp $
+ * $Id: net.c,v 1.12 2005/02/12 23:07:02 spoggle Exp $
  */
 
 #define WIN32_LEAN_AND_MEAN
@@ -290,3 +290,249 @@ void DisableIcmpRedirects(void)
 
   exit(0);
 }
+
+/* ======== moved from above ======== */
+
+extern struct olsr_netbuf *netbufs[];
+
+/**
+ *Sends a packet on a given interface.
+ *
+ *@param ifp the interface to send on.
+ *
+ *@return negative on error
+ */
+int
+net_output(struct interface *ifp)
+{
+  struct sockaddr_in *sin;  
+  struct sockaddr_in dst;
+  struct sockaddr_in6 *sin6;  
+  struct sockaddr_in6 dst6;
+  struct ptf *tmp_ptf_list;
+  int i, x;
+  union olsr_packet *outmsg;
+
+  sin = NULL;
+  sin6 = NULL;
+
+  if(!netbufs[ifp->if_nr])
+    return -1;
+
+  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(netbufs[ifp->if_nr]->pending);
+
+  if(olsr_cnf->ip_version == AF_INET)
+    {
+      /* IP version 4 */
+      sin = (struct sockaddr_in *)&ifp->int_broadaddr;
+
+      /* Copy sin */
+      dst = *sin;
+      sin = &dst;
+
+      if (sin->sin_port == 0)
+       sin->sin_port = olsr_udp_port;
+    }
+  else
+    {
+      /* IP version 6 */
+      sin6 = (struct sockaddr_in6 *)&ifp->int6_multaddr;
+      /* Copy sin */
+      dst6 = *sin6;
+      sin6 = &dst6;
+    }
+
+  /*
+   *Call possible packet transform functions registered by plugins  
+   */
+  tmp_ptf_list = ptf_list;
+  while(tmp_ptf_list != NULL)
+    {
+      tmp_ptf_list->function(netbufs[ifp->if_nr]->buff, &netbufs[ifp->if_nr]->pending);
+      tmp_ptf_list = tmp_ptf_list->next;
+    }
+
+  /*
+   *if the '-disp- option was given
+   *we print her decimal contetnt of the packets
+   */
+  if(disp_pack_out)
+    {
+      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 ", netbufs[ifp->if_nr]->buff[4]); break;
+       }
+      if(olsr_cnf->ip_version == AF_INET)
+       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), netbufs[ifp->if_nr]->pending);
+
+      x = 0;
+
+      for(i = 0; i < netbufs[ifp->if_nr]->pending;i++)
+       {
+         if(x == 4)
+           {
+             x = 0;
+             printf("\n\t");
+           }
+         x++;
+         if(olsr_cnf->ip_version == AF_INET)
+           printf(" %3i", (u_char) netbufs[ifp->if_nr]->buff[i]);
+         else
+           printf(" %2x", (u_char) netbufs[ifp->if_nr]->buff[i]);
+       }
+      
+      printf("\n");
+    }
+  
+  if(olsr_cnf->ip_version == AF_INET)
+    {
+      /* IP version 4 */
+      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");
+         netbufs[ifp->if_nr]->pending = 0;
+         return -1;
+       }
+    }
+  else
+    {
+      /* IP version 6 */
+      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), (int)sizeof(*sin6));
+         fprintf(stderr, "Outputsize: %d\n", netbufs[ifp->if_nr]->pending);
+         netbufs[ifp->if_nr]->pending = 0;
+         return -1;
+       }
+    }
+  
+  netbufs[ifp->if_nr]->pending = 0;
+
+  return 1;
+}
+
+/* The outputbuffer on neighbornodes
+ * will never exceed MAXMESSAGESIZE
+ */
+static char inbuf[MAXMESSAGESIZE+1];
+
+/**
+ *Processing OLSR data from socket. Reading data, setting 
+ *wich interface recieved the message, Sends IPC(if used) 
+ *and passes the packet on to parse_packet().
+ *
+ *@param fd the filedescriptor that data should be read from.
+ *@return nada
+ */
+void
+olsr_input(int fd)
+{
+  /* sockaddr_in6 is bigger than sockaddr !!!! */
+  struct sockaddr_storage from;
+  size_t fromlen;
+  int cc;
+  struct interface *olsr_in_if;
+  union olsr_ip_addr from_addr;
+
+
+  for (;;) 
+    {
+      fromlen = sizeof(struct sockaddr_storage);
+
+      cc = recvfrom(fd, 
+                   inbuf, 
+                   sizeof (inbuf), 
+                   0, 
+                   (struct sockaddr *)&from, 
+                   &fromlen);
+
+      if (cc <= 0) 
+       {
+         if (cc < 0 && errno != EWOULDBLOCK)
+           {
+             olsr_printf(1, "error recvfrom: %s", strerror(errno));
+             olsr_syslog(OLSR_LOG_ERR, "error recvfrom: %m");
+           }
+         break;
+       }
+
+      if(olsr_cnf->ip_version == AF_INET)
+       {
+         /* IPv4 sender address */
+         COPY_IP(&from_addr, &((struct sockaddr_in *)&from)->sin_addr.s_addr);
+       }
+      else
+       {
+         /* IPv6 sender address */
+         COPY_IP(&from_addr, &((struct sockaddr_in6 *)&from)->sin6_addr);
+       }
+
+      /* are we talking to ourselves? */
+      if(if_ifwithaddr(&from_addr) != NULL)
+       return;
+
+#ifdef DEBUG
+      olsr_printf(5, "Recieved a packet from %s\n", olsr_ip_to_string((union olsr_ip_addr *)&((struct sockaddr_in *)&from)->sin_addr.s_addr));
+#endif
+      //printf("\nCC: %d FROMLEN: %d\n\n", cc, fromlen);
+      if ((olsr_cnf->ip_version == AF_INET) && (fromlen != sizeof (struct sockaddr_in)))
+       break;
+      else if ((olsr_cnf->ip_version == AF_INET6) && (fromlen != sizeof (struct sockaddr_in6)))
+       break;
+
+      //printf("Recieved data on socket %d\n", socknr);
+
+
+      if((olsr_in_if = if_ifwithsock(fd)) == NULL)
+       {
+         olsr_printf(1, "Could not find input interface for message from %s size %d\n",
+                     olsr_ip_to_string(&from_addr),
+                     cc);
+         olsr_syslog(OLSR_LOG_ERR, "Could not find input interface for message from %s size %d\n",
+                olsr_ip_to_string(&from_addr),
+                cc);
+         return ;
+       }
+
+      /*
+       * &from - sender
+       * &inbuf.olsr 
+       * cc - bytes read
+       */
+      parse_packet((struct olsr *)inbuf, cc, olsr_in_if, &from_addr);
+    
+    }
+}
+
+