Added wrappers for sendto and recvfrom and moved olsr_input and net_output back to...
authorAndreas Tonnesen <andreto@olsr.org>
Mon, 14 Feb 2005 16:55:37 +0000 (16:55 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Mon, 14 Feb 2005 16:55:37 +0000 (16:55 +0000)
src/bsd/net.c
src/linux/net.c
src/net.c
src/net_os.h
src/parser.c
src/win32/net.c

index 9e04a2e..07a7db9 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.9 2005/02/12 23:07:02 spoggle Exp $
+ * $Id: net.c,v 1.10 2005/02/14 16:55:37 kattemat Exp $
  */
 
 #include "../defs.h"
@@ -282,249 +282,41 @@ 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
+ * Wrapper for sendto(2)
  */
-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;
+ssize_t
+olsr_sendto(int s, 
+           const void *buf, 
+           size_t len, 
+           int flags, 
+           const struct sockaddr *to, 
+           socklen_t tolen)
+{
+  return sendto(s, buf, len, flags, to, tolen);
 }
 
-/* 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
+ * Wrapper for recvfrom(2)
  */
-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);
-    
-    }
+ssize_t  
+olsr_recvfrom(int  s, 
+             void *buf, 
+             size_t len, 
+             int flags, 
+             struct sockaddr *from,
+             socklen_t *fromlen)
+{
+  return recvfrom(s, 
+                 buf, 
+                 len, 
+                 0, 
+                 from, 
+                 fromlen);
 }
-
-
index 4b204d3..28cac59 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.14 2005/02/13 11:00:51 kattemat Exp $
+ * $Id: net.c,v 1.15 2005/02/14 16:55:37 kattemat Exp $
  */
 
 
 #include "../net_os.h"
 #include "../parser.h"
 
-
-extern struct olsr_netbuf *netbufs[];
-static char inbuf[MAXMESSAGESIZE+1];
-
-
 /**
  *Bind a socket to a device
  *
@@ -567,239 +562,38 @@ get_ipv6_address(char *ifname, struct sockaddr_in6 *saddr6, int scope_in)
   return 0;
 }
 
+
 /**
- *Sends a packet on a given interface.
- *
- *@param ifp the interface to send on.
- *
- *@return negative on error
+ * Wrapper for sendto(2)
  */
-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 -dispout option was given
-   *we print the 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;
+ssize_t
+olsr_sendto(int s, 
+           const void *buf, 
+           size_t len, 
+           int flags, 
+           const struct sockaddr *to, 
+           socklen_t tolen)
+{
+  return sendto(s, buf, len, flags, to, tolen);
 }
 
 /**
- *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
+ * Wrapper for recvfrom(2)
  */
-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);
-    
-    }
+ssize_t  
+olsr_recvfrom(int  s, 
+             void *buf, 
+             size_t len, 
+             int flags, 
+             struct sockaddr *from,
+             socklen_t *fromlen)
+{
+  return recvfrom(s, 
+                 buf, 
+                 len, 
+                 0, 
+                 from, 
+                 fromlen);
 }
-
-
index f628297..cbbb165 100644 (file)
--- a/src/net.c
+++ b/src/net.c
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: net.c,v 1.31 2005/02/12 23:07:02 spoggle Exp $
+ * $Id: net.c,v 1.32 2005/02/14 16:55:37 kattemat Exp $
  */
 
 #include "net.h"
 #include "olsr.h"
+#include "net_os.h"
 #include <stdlib.h>
 
 #ifdef WIN32
@@ -302,6 +303,156 @@ del_ptf(int (*f)(char *, int *))
 }
 
 
+
+/**
+ *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 -dispout option was given
+   *we print the 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(olsr_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(olsr_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;
+}
+
+
+
 int
 join_mcast(struct interface *ifs, int sock)
 {
index 6575c3a..28c4906 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.4 2005/02/12 23:07:02 spoggle Exp $
+ * $Id: net_os.h,v 1.5 2005/02/14 16:55:37 kattemat Exp $
  */
 
 
 
 /* OS dependent functions */
 
+ssize_t
+olsr_sendto(int, 
+           const void *, 
+           size_t, 
+           int, 
+           const struct sockaddr *, 
+           socklen_t);
+
+ssize_t  
+olsr_recvfrom(int, 
+             void *, 
+             size_t, 
+             int, 
+             struct sockaddr *,
+             socklen_t *);
+
 int
 bind_socket_to_device(int, char *);
 
@@ -80,10 +96,4 @@ 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 567833d..005a18e 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.18 2005/02/14 15:54:30 tlopatic Exp $
+ * $Id: parser.c,v 1.19 2005/02/14 16:55:37 kattemat Exp $
  */
 
 #include "parser.h"
 #include "mid_set.h"
 #include "olsr.h"
 #include "rebuild_packet.h"
+#include "net_os.h"
+
+#ifdef WIN32
+#undef EWOULDBLOCK
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#undef errno
+#define errno WSAGetLastError()
+#undef strerror
+#define strerror(x) StrError(x)
+#endif
 
-//union olsr_ip_addr tmp_addr;
+static char inbuf[MAXMESSAGESIZE+1];
 
 /**
  *Initialize the parser. 
@@ -337,3 +347,92 @@ parse_packet(struct olsr *olsr, int size, struct interface *in_if, union olsr_ip
 
 
 
+/**
+ *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 = olsr_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 ee9a414..2e2b393 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.13 2005/02/14 15:54:30 tlopatic Exp $
+ * $Id: net.c,v 1.14 2005/02/14 16:55:37 kattemat Exp $
  */
 
 #define WIN32_LEAN_AND_MEAN
 #include "../defs.h"
 #include "../net_os.h"
 
-// XXX - really port I/O functions to Windows
-
-#undef EWOULDBLOCK
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#undef errno
-#define errno WSAGetLastError()
-#undef strerror
-#define strerror(x) StrError(x)
 
 void WinSockPError(char *Str);
 void PError(char *);
@@ -300,248 +292,40 @@ 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
+ * Wrapper for sendto(2)
  */
-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;
+ssize_t
+olsr_sendto(int s, 
+           const void *buf, 
+           size_t len, 
+           int flags, 
+           const struct sockaddr *to, 
+           socklen_t tolen)
+{
+  return sendto(s, buf, len, flags, to, tolen);
 }
 
-/* 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
+ * Wrapper for recvfrom(2)
  */
-void
-olsr_input(int fd)
+
+ssize_t  
+olsr_recvfrom(int  s, 
+             void *buf, 
+             size_t len, 
+             int flags, 
+             struct sockaddr *from,
+             socklen_t *fromlen)
 {
-  /* 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);
-    
-    }
+  return recvfrom(s, 
+                 buf, 
+                 len, 
+                 0, 
+                 from, 
+                 fromlen);
 }
 
-