Fix olsr_sendto() for IPv4 on BSD. 32/head
authorStefan Sperling <stsp@stsp.name>
Thu, 22 Jun 2017 16:28:55 +0000 (18:28 +0200)
committerStefan Sperling <stsp@stsp.name>
Mon, 3 Jul 2017 20:53:46 +0000 (22:53 +0200)
Sending multicast packets requires the IP_MULTICAST_IF socket option.
Without this socket option, packets sent to 255.255.255.255 are dropped.

With this change, olsr_sendto() can become a direct call to sendto() and
the -DSPOOF workaround which relies on libnet to send packets is no
longer required.

Tested on OpenBSD.

Signed-off-by: Stefan Sperling <stsp@stsp.name>
src/bsd/net.c

index 1c6b31e..18265fd 100644 (file)
@@ -341,6 +341,12 @@ getsocket(int bufspace, struct interface_olsr *ifp __attribute__ ((unused)))
     return -1;
   }
 
+  if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &ifp->int_addr.sin_addr.s_addr, sizeof(struct in_addr)) < 0) {
+    perror("IP_MULTICAST_IF failed");
+    close(sock);
+    return -1;
+  }
+
   if(bufspace > 0) {
     for (on = bufspace;; on -= 1024) {
       if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&on, sizeof(on)) == 0)