]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Ensure scope_id is set correctly for ipv6 timing and control sockets 336/head
authorEdward Barnard <eabarnard@gmail.com>
Sat, 9 Jul 2016 16:38:36 +0000 (18:38 +0200)
committerEdward Barnard <eabarnard@gmail.com>
Sat, 9 Jul 2016 16:38:36 +0000 (18:38 +0200)
rtp.c

diff --git a/rtp.c b/rtp.c
index 0f8dae931e1cad51d322f9d0f300130bdb33d21b..a8d330b987c5714cf4cadb70500660dd7b9d7cc1 100644 (file)
--- 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);