Support setting outgoing interface for multicast.
[cubemap] / udpstream.cpp
index 74d6ef0..7747649 100644 (file)
@@ -1,3 +1,4 @@
+#include <string.h>
 #include <sys/socket.h>
 #include <sys/types.h>
 
@@ -9,7 +10,7 @@
 #define SO_MAX_PACING_RATE 47
 #endif
 
-UDPStream::UDPStream(const sockaddr_in6 &dst, uint32_t pacing_rate, int ttl)
+UDPStream::UDPStream(const sockaddr_in6 &dst, uint32_t pacing_rate, int ttl, int multicast_iface_index)
        : dst(dst)
 {
        sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
@@ -41,6 +42,18 @@ UDPStream::UDPStream(const sockaddr_in6 &dst, uint32_t pacing_rate, int ttl)
                        log_perror("setsockopt(IPV6_MULTICAST_HOPS)");
                }
        }
+
+       if (multicast_iface_index != -1) {
+               ip_mreqn mr;
+               memset(&mr, 0, sizeof(mr));
+               mr.imr_ifindex = multicast_iface_index;
+               if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &mr, sizeof(mr)) == -1) {
+                       log_perror("setsockopt(IP_MULTICAST_IF)");
+               }
+               if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, &multicast_iface_index, sizeof(multicast_iface_index)) == -1) {
+                       log_perror("setsockopt(IPV6_MULTICAST_IF)");
+               }
+       }
 }
 
 UDPStream::~UDPStream()