More work on interface/socket cleanup
authorHenning Rogge <hrogge@googlemail.com>
Sat, 7 Aug 2010 12:02:37 +0000 (14:02 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 7 Aug 2010 12:02:37 +0000 (14:02 +0200)
src/bsd/net.c
src/interfaces.c
src/linux/net.c
src/net_os.h
src/unix/ifnet.c
src/win32/ifnet.c
src/win32/net.c

index 83c6222..c7e6dc4 100644 (file)
@@ -294,7 +294,7 @@ restore_settings(int version)
 
 
 int
-getsocket(int bufspace, struct interface *ifp __attribute__ ((unused)))
+getsocket(int bufspace, struct interface *ifp, bool bind_to_unicast, uint16_t port)
 {
   struct sockaddr_in sin4;
   int on;
@@ -343,9 +343,9 @@ getsocket(int bufspace, struct interface *ifp __attribute__ ((unused)))
   }
   memset(&sin4, 0, sizeof(sin4));
   sin4.sin_family = AF_INET;
-  sin4.sin_port = htons(OLSRPORT);
+  sin4.sin_port = htons(port);
 
-  if(bufspace <= 0) {
+  if(bind_to_unicast) {
     sin4.sin_addr.s_addr = ifp->int_src.v4.sin_addr.s_addr;
   }
   else {
@@ -363,7 +363,7 @@ getsocket(int bufspace, struct interface *ifp __attribute__ ((unused)))
 }
 
 int
-getsocket6(int bufspace, struct interface *ifp __attribute__ ((unused)))
+getsocket6(int bufspace, struct interface *ifp, bool bind_to_unicast, uint16_t port)
 {
   struct sockaddr_in6 sin6;
   int on;
@@ -414,9 +414,9 @@ getsocket6(int bufspace, struct interface *ifp __attribute__ ((unused)))
 
   memset(&sin6, 0, sizeof(sin6));
   sin6.sin6_family = AF_INET6;
-  sin6.sin6_port = htons(OLSRPORT);
+  sin6.sin6_port = htons(port);
 
-  if(bufspace <= 0) {
+  if(bind_to_unicast) {
     memcpy(&sin6.sin6_addr, &ifp->int_src.v6.sin6_addr, sizeof(struct in6_addr));
   }
 
index b3f76f7..e4885d1 100644 (file)
@@ -58,6 +58,8 @@
 #include <unistd.h>
 #include <assert.h>
 
+#define BUFSPACE  (127*1024)    /* max. input buffer size to request */
+
 /* The interface list head */
 struct list_entity interface_head;
 
@@ -195,6 +197,39 @@ add_interface(struct olsr_if_config *iface) {
     return NULL;
   }
 
+  if (olsr_cnf->ip_version == AF_INET) {
+    /* IP version 4 */
+    /*
+     * We create one socket for each interface and bind
+     * the socket to it. This to ensure that we can control
+     * on what interface the message is transmitted
+     */
+    ifp->olsr_socket = getsocket(BUFSPACE, ifp, false, olsr_cnf->olsr_port);
+    ifp->send_socket = getsocket(0, ifp, true, olsr_cnf->olsr_port);
+
+    if (ifp->olsr_socket < 0 || ifp->send_socket < 0) {
+      OLSR_ERROR(LOG_INTERFACE, "Could not initialize socket... exiting!\n\n");
+      olsr_exit(EXIT_FAILURE);
+    }
+  } else {
+    /* IP version 6 */
+
+    /*
+     * We create one socket for each interface and bind
+     * the socket to it. This to ensure that we can control
+     * on what interface the message is transmitted
+     */
+    ifp->olsr_socket = getsocket6(BUFSPACE, ifp, false, olsr_cnf->olsr_port);
+    ifp->send_socket = getsocket6(0, ifp, true, olsr_cnf->olsr_port);
+
+    if (ifp->olsr_socket < 0 || ifp->send_socket < 0) {
+      OLSR_ERROR(LOG_INTERFACE, "Could not initialize socket... exiting!\n\n");
+      olsr_exit(EXIT_FAILURE);
+    }
+
+    join_mcast(ifp, ifp->olsr_socket);
+  }
+
   set_buffer_timer(ifp);
 
   /* Register sockets */
index a7990fe..bcf0d24 100644 (file)
@@ -349,7 +349,7 @@ restore_settings(int version)
  *@return the FD of the socket or -1 on error.
  */
 int
-getsocket(int bufspace, struct interface *ifp)
+getsocket(int bufspace, struct interface *ifp, bool bind_to_unicast, uint16_t port)
 {
   struct sockaddr_in sin4;
   int on;
@@ -401,9 +401,9 @@ getsocket(int bufspace, struct interface *ifp)
 
   memset(&sin4, 0, sizeof(sin4));
   sin4.sin_family = AF_INET;
-  sin4.sin_port = htons(olsr_cnf->olsr_port);
+  sin4.sin_port = htons(port);
 
-  if(bufspace <= 0) {
+  if(bind_to_unicast) {
     sin4.sin_addr = ifp->int_src.v4.sin_addr;
   }
   else {
@@ -426,7 +426,7 @@ getsocket(int bufspace, struct interface *ifp)
  *@return the FD of the socket or -1 on error.
  */
 int
-getsocket6(int bufspace, struct interface *ifp)
+getsocket6(int bufspace, struct interface *ifp, bool bind_to_unicast, uint16_t port)
 {
   struct sockaddr_in6 sin6;
   int on;
@@ -501,9 +501,9 @@ getsocket6(int bufspace, struct interface *ifp)
 
   memset(&sin6, 0, sizeof(sin6));
   sin6.sin6_family = AF_INET6;
-  sin6.sin6_port = htons(olsr_cnf->olsr_port);
+  sin6.sin6_port = htons(port);
 
-  if(bufspace <= 0) {
+  if(bind_to_unicast) {
     memcpy(&sin6.sin6_addr, &ifp->int_src.v6.sin6_addr, sizeof(struct in6_addr));
   }
   else {
index f065e2b..24ab4e7 100644 (file)
@@ -74,9 +74,9 @@ int restore_settings(int);
 
 int enable_ip_forwarding(int);
 
-int getsocket(int, struct interface *);
+int getsocket(int, struct interface *, bool, uint16_t);
 
-int getsocket6(int, struct interface *);
+int getsocket6(int, struct interface *, bool, uint16_t);
 
 void os_set_olsr_socketoptions(int socket);
 
index 62e6ba3..73f5e07 100644 (file)
@@ -492,40 +492,6 @@ os_init_interface(struct olsr_if_config *iface)
 #if 0
   ifp->gen_properties = NULL;
 #endif
-
-  if (olsr_cnf->ip_version == AF_INET) {
-    /* IP version 4 */
-    /*
-     * We create one socket for each interface and bind
-     * the socket to it. This to ensure that we can control
-     * on what interface the message is transmitted
-     */
-    ifp->olsr_socket = getsocket(BUFSPACE, ifp);
-    ifp->send_socket = getsocket(0, ifp);
-
-    if (ifp->olsr_socket < 0 || ifp->send_socket < 0) {
-      OLSR_ERROR(LOG_INTERFACE, "Could not initialize socket... exiting!\n\n");
-      olsr_exit(EXIT_FAILURE);
-    }
-  } else {
-    /* IP version 6 */
-
-    /*
-     * We create one socket for each interface and bind
-     * the socket to it. This to ensure that we can control
-     * on what interface the message is transmitted
-     */
-    ifp->olsr_socket = getsocket6(BUFSPACE, ifp);
-    ifp->send_socket = getsocket6(0, ifp);
-
-    if (ifp->olsr_socket < 0 || ifp->send_socket < 0) {
-      OLSR_ERROR(LOG_INTERFACE, "Could not initialize socket... exiting!\n\n");
-      olsr_exit(EXIT_FAILURE);
-    }
-
-    join_mcast(ifp, ifp->olsr_socket);
-  }
-
   return ifp;
 
 cleanup:
index 51f00e0..d154041 100644 (file)
@@ -64,9 +64,6 @@
 
 #include <arpa/inet.h>
 
-#define BUFSPACE  (127*1024)    /* max. input buffer size to request */
-
-
 struct MibIpInterfaceRow {
   USHORT Family;
   ULONG64 InterfaceLuid;
index 5499c60..e75c323 100644 (file)
@@ -74,7 +74,7 @@ int disable_ip_forwarding(int Ver);
 
 
 int
-getsocket(int BuffSize, struct interface *ifp __attribute__ ((unused)))
+getsocket(int bufspace, struct interface *ifp, bool bind_to_unicast, uint16_t port)
 {
   struct sockaddr_in Addr;
   int On = 1;
@@ -97,21 +97,21 @@ getsocket(int BuffSize, struct interface *ifp __attribute__ ((unused)))
     olsr_exit(EXIT_FAILURE);
   }
 
-  while (BuffSize > 8192) {
-    if (setsockopt(Sock, SOL_SOCKET, SO_RCVBUF, (char *)&BuffSize, sizeof(BuffSize)) == 0)
+  while (bufspace > 8192) {
+    if (setsockopt(Sock, SOL_SOCKET, SO_RCVBUF, (char *)&bufspace, sizeof(bufspace)) == 0)
       break;
 
-    BuffSize -= 1024;
+    bufspace -= 1024;
   }
 
-  if (BuffSize <= 8192)
+  if (bufspace <= 8192)
     OLSR_WARN(LOG_NETWORKING, "Cannot set IPv4 socket receive buffer.\n");
 
   memset(&Addr, 0, sizeof(Addr));
   Addr.sin_family = AF_INET;
-  Addr.sin_port = htons(olsr_cnf->olsr_port);
+  Addr.sin_port = htons(port);
 
-  if(BuffSize <= 0) {
+  if(bind_to_unicast) {
     Addr.sin_addr.s_addr = ifp->int_src.v4.sin_addr.s_addr;
   }
   else {
@@ -134,7 +134,7 @@ getsocket(int BuffSize, struct interface *ifp __attribute__ ((unused)))
 }
 
 int
-getsocket6(int BuffSize, struct interface *ifp __attribute__ ((unused)))
+getsocket6(int bufspace, struct interface *ifp, bool bind_to_unicast, uint16_t port)
 {
   struct sockaddr_in6 Addr6;
   int On = 1;
@@ -156,21 +156,21 @@ getsocket6(int BuffSize, struct interface *ifp __attribute__ ((unused)))
     olsr_exit(EXIT_FAILURE);
   }
 
-  while (BuffSize > 8192) {
-    if (setsockopt(Sock, SOL_SOCKET, SO_RCVBUF, (char *)&BuffSize, sizeof(BuffSize)) == 0)
+  while (bufspace > 8192) {
+    if (setsockopt(Sock, SOL_SOCKET, SO_RCVBUF, (char *)&bufspace, sizeof(bufspace)) == 0)
       break;
 
-    BuffSize -= 1024;
+    bufspace -= 1024;
   }
 
-  if (BuffSize <= 8192)
+  if (bufspace <= 8192)
     OLSR_WARN(LOG_NETWORKING, "Cannot set IPv6 socket receive buffer.\n");
 
   memset(&Addr6, 0, sizeof(Addr6));
   Addr6.sin6_family = AF_INET6;
-  Addr6.sin6_port = htons(olsr_cnf->olsr_port);
+  Addr6.sin6_port = htons(port);
 
-  if(BuffSize <= 0) {
+  if(bind_to_unicast) {
     memcpy(&Addr6.sin6_addr, &ifp->int_src.v6.sin6_addr, sizeof(struct in6_addr));
   }