Try to fix "duplicate packet incoming" problem.
authorHenning Rogge <hrogge@googlemail.com>
Tue, 3 May 2011 19:42:57 +0000 (21:42 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Tue, 3 May 2011 19:42:57 +0000 (21:42 +0200)
src/interfaces.c
src/interfaces.h
src/linux/net.c
src/net_olsr.c

index 2f636e1..700c072 100644 (file)
@@ -204,10 +204,11 @@ add_interface(struct olsr_if_config *iface) {
 
   /* Register sockets */
   ifp->olsr_socket = olsr_socket_add(sock_rcv, &olsr_input, NULL, OLSR_SOCKET_READ);
-  ifp->send_socket = olsr_socket_add(sock_send, &olsr_input, NULL, OLSR_SOCKET_READ);
+  // ifp->send_socket = olsr_socket_add(sock_send, &olsr_input, NULL, OLSR_SOCKET_READ);
+  ifp->send_socket_fd = sock_send;
 
   os_socket_set_olsr_options(ifp, ifp->olsr_socket->fd, &ifp->int_multicast);
-  os_socket_set_olsr_options(ifp, ifp->send_socket->fd, &ifp->int_multicast);
+  os_socket_set_olsr_options(ifp, sock_send, NULL);
 
   /*
    *Initialize packet sequencenumber as a random 16bit value
@@ -357,10 +358,10 @@ remove_interface(struct interface *ifp)
 
   /* Close olsr socket */
   os_close(ifp->olsr_socket->fd);
-  os_close(ifp->send_socket->fd);
+  os_close(ifp->send_socket_fd);
 
   olsr_socket_remove(ifp->olsr_socket);
-  olsr_socket_remove(ifp->send_socket);
+  //olsr_socket_remove(ifp->send_socket);
 
   ifp->int_name = NULL;
   unlock_interface(ifp);
@@ -419,7 +420,7 @@ if_ifwithsock(int fd)
     if (ifp->olsr_socket->fd == fd) {
       return ifp;
     }
-    if (ifp->send_socket->fd == fd) {
+    if (ifp->send_socket_fd == fd) {
       return ifp;
     }
   }
index ab04cbd..1fbcd57 100644 (file)
@@ -161,7 +161,8 @@ struct interface {
   struct olsr_socket_entry *olsr_socket;
 
   /* The send socket for this interface */
-  struct olsr_socket_entry *send_socket;
+  struct olsr_socket_entry *send_socket_;
+  int send_socket_fd;
 
   /* interface data */
   int int_mtu;                         /* MTU of interface */
index eb103bc..0914768 100644 (file)
@@ -343,10 +343,12 @@ os_getsocket4(const char *if_name, uint16_t port, int bufspace, union olsr_socka
 
   on = 1;
 #ifdef SO_BROADCAST
-  if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) {
-    OLSR_ERROR(LOG_NETWORKING, "Cannot set socket for OLSR PDUs to broadcast mode (%s)\n", strerror(errno));
-    close(sock);
-    olsr_exit(EXIT_FAILURE);
+  if (bindto) {
+    if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) {
+      OLSR_ERROR(LOG_NETWORKING, "Cannot set socket for OLSR PDUs to broadcast mode (%s)\n", strerror(errno));
+      close(sock);
+      olsr_exit(EXIT_FAILURE);
+    }
   }
 #endif
 
index ab61df2..e4e44a4 100644 (file)
@@ -400,7 +400,7 @@ net_output(struct interface *ifp)
     tmp_ptf->function(ifp->netbuf.buff, &ifp->netbuf.pending);
   }
 
-  if (os_sendto(ifp->send_socket->fd, ifp->netbuf.buff, ifp->netbuf.pending,
+  if (os_sendto(ifp->send_socket_fd, ifp->netbuf.buff, ifp->netbuf.pending,
       MSG_DONTROUTE, &ifp->int_multicast) < 0) {
 #if !defined REMOVE_LOG_WARN
     const int save_errno = errno;