From f2c784c74d2f16329a27ca1263afd3f8c459793d Mon Sep 17 00:00:00 2001 From: Edward Barnard Date: Sat, 9 Jul 2016 18:38:36 +0200 Subject: [PATCH] Ensure scope_id is set correctly for ipv6 timing and control sockets --- rtp.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/rtp.c b/rtp.c index 0f8dae93..a8d330b9 100644 --- a/rtp.c +++ b/rtp.c @@ -666,9 +666,12 @@ void rtp_setup(SOCKADDR *local, SOCKADDR *remote, int cport, int tport, uint32_t die("Can't get address of client's control port"); #ifdef AF_INET6 - if (servinfo->ai_family == AF_INET6) + if (servinfo->ai_family == AF_INET6) { memcpy(&rtp_client_control_socket, servinfo->ai_addr, sizeof(struct sockaddr_in6)); - else + // ensure the scope id matches that of remote. this is needed for link-local addresses. + struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&rtp_client_control_socket; + sa6->sin6_scope_id = self_scope_id; + } else #endif memcpy(&rtp_client_control_socket, servinfo->ai_addr, sizeof(struct sockaddr_in)); freeaddrinfo(servinfo); @@ -682,9 +685,12 @@ void rtp_setup(SOCKADDR *local, SOCKADDR *remote, int cport, int tport, uint32_t if (getaddrinfo(client_ip_string, portstr, &hints, &servinfo) != 0) die("Can't get address of client's timing port"); #ifdef AF_INET6 - if (servinfo->ai_family == AF_INET6) + if (servinfo->ai_family == AF_INET6) { memcpy(&rtp_client_timing_socket, servinfo->ai_addr, sizeof(struct sockaddr_in6)); - else + // ensure the scope id matches that of remote. this is needed for link-local addresses. + struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&rtp_client_timing_socket; + sa6->sin6_scope_id = self_scope_id; + } else #endif memcpy(&rtp_client_timing_socket, servinfo->ai_addr, sizeof(struct sockaddr_in)); freeaddrinfo(servinfo); -- 2.47.2