#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) {
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()