]> git.sesse.net Git - cubemap/blobdiff - udpstream.cpp
Support setting TTL on outgoing UDP streams. Especially useful for multicast.
[cubemap] / udpstream.cpp
index fc003561ef0bb7c5a75e3a126fc93c559100eca3..74d6ef03ce7853658e8836bbb4a07256e32c9e5c 100644 (file)
@@ -9,9 +9,8 @@
 #define SO_MAX_PACING_RATE 47
 #endif
 
-UDPStream::UDPStream(const sockaddr_in6 &dst, uint32_t pacing_rate)
-       : dst(dst),
-         pacing_rate(pacing_rate)
+UDPStream::UDPStream(const sockaddr_in6 &dst, uint32_t pacing_rate, int ttl)
+       : dst(dst)
 {
        sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
        if (sock == -1) {
@@ -25,6 +24,23 @@ UDPStream::UDPStream(const sockaddr_in6 &dst, uint32_t pacing_rate)
                        log_perror("setsockopt(SO_MAX_PACING_RATE)");
                }
        }
+
+       if (ttl != -1) {
+               // Seemingly the IPv4 parameters are used for sending to IPv4,
+               // even on an AF_INET6 socket, so we need to set both.
+               if (setsockopt(sock, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) == -1) {
+                       log_perror("setsockopt(IP_TTL)");
+               }
+               if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) == -1) {
+                       log_perror("setsockopt(IP_MULTICAST_TTL)");
+               }
+               if (setsockopt(sock, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl)) == -1) {
+                       log_perror("setsockopt(IPV6_UNICAST_HOPS)");
+               }
+               if (setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl)) == -1) {
+                       log_perror("setsockopt(IPV6_MULTICAST_HOPS)");
+               }
+       }
 }
 
 UDPStream::~UDPStream()