Fix *BSD multicast on non link-local.
authorJohn Hay <jhay@meraka.org.za>
Thu, 14 Oct 2010 12:14:59 +0000 (14:14 +0200)
committerJohn Hay <jhay@meraka.org.za>
Thu, 14 Oct 2010 12:52:31 +0000 (14:52 +0200)
For non link-local IPv6 multicast transmit to work, the IPV6_MULTICAST_IF
setsockopt() have to be set, otherwise *BSD does not know where to send
the multicast packets.

Other OSes probably need to tweak their join_mcast() or otherwise the
second join_mcast() in unix/ifnet.c needs to be wrapped in #if *BSD.

src/bsd/net.c
src/unix/ifnet.c

index 1f82d72..3a435ee 100644 (file)
@@ -466,20 +466,23 @@ join_mcast(struct interface *ifs, int sock)
   mcastreq.ipv6mr_multiaddr = ifs->int6_multaddr.sin6_addr;
   mcastreq.ipv6mr_interface = ifs->if_index;
 
-  OLSR_PRINTF(3, "Interface %s joining multicast %s...", ifs->int_name,
-              olsr_ip_to_string(&addrstr, (union olsr_ip_addr *)&ifs->int6_multaddr.sin6_addr));
+  if (ifs->olsr_socket == sock) {
 
-  /* rfc 3493 */
+    OLSR_PRINTF(3, "Interface %s joining multicast %s...", ifs->int_name,
+                olsr_ip_to_string(&addrstr, (union olsr_ip_addr *)&ifs->int6_multaddr.sin6_addr));
+
+    /* rfc 3493 */
 #ifdef IPV6_JOIN_GROUP
-  /* Join reciever group */
-  if (setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mcastreq, sizeof(struct ipv6_mreq)) < 0)
+    /* Join reciever group */
+    if (setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mcastreq, sizeof(struct ipv6_mreq)) < 0)
 #else /* rfc 2133, obsoleted */
-  /* Join receiver group */
-  if (setsockopt(sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&mcastreq, sizeof(struct ipv6_mreq)) < 0)
+    /* Join receiver group */
+    if (setsockopt(sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&mcastreq, sizeof(struct ipv6_mreq)) < 0)
 #endif
-  {
-    perror("Join multicast send");
-    return -1;
+    {
+      perror("Join multicast send");
+      return -1;
+    }
   }
 
   if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *)&mcastreq.ipv6mr_interface, sizeof(mcastreq.ipv6mr_interface)) < 0) {
index b3f4b82..ede40b9 100644 (file)
@@ -762,6 +762,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
     }
 
     join_mcast(&ifs, ifs.olsr_socket);
+    join_mcast(&ifs, ifs.send_socket);
   }
 
   ifp = olsr_malloc(sizeof(struct interface), "Interface update 2");