From: Edward Barnard Date: Sat, 9 Jul 2016 16:38:36 +0000 (+0200) Subject: Ensure scope_id is set correctly for ipv6 timing and control sockets X-Git-Tag: 2.8.5~8^2 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F336%2Fhead;p=thirdparty%2Fshairport-sync.git Ensure scope_id is set correctly for ipv6 timing and control sockets --- 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);