]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Prefer to use a public ipv6 number where privacy extensions are enabled
authorMike Brady <mikebrady@eircom.net>
Mon, 28 Dec 2015 15:18:09 +0000 (15:18 +0000)
committerMike Brady <mikebrady@eircom.net>
Mon, 28 Dec 2015 15:18:09 +0000 (15:18 +0000)
rtp.c

diff --git a/rtp.c b/rtp.c
index 78a19a361448e925bb793de6245e1d8558d9b04f..0e4f1aaf27416d43e9dbc0fea33ac98f41613734 100644 (file)
--- a/rtp.c
+++ b/rtp.c
 #include "player.h"
 #include "rtp.h"
 
+#ifdef COMPILE_FOR_LINUX_AND_FREEBSD_AND_CYGWIN
+#include <linux/in6.h>
+#endif
+
 typedef struct {
   uint32_t seconds;
   uint32_t fraction;
@@ -524,6 +528,19 @@ static int bind_port(SOCKADDR *remote, int *sock) {
       die("failed to get usable addrinfo?! %s.", gai_strerror(ret));
 
     *sock = socket(remote->SAFAMILY, SOCK_DGRAM, IPPROTO_UDP);
+    
+    #ifdef COMPILE_FOR_LINUX_AND_FREEBSD_AND_CYGWIN
+    #ifdef AF_INET6
+    // now, if we are on IPv6, prefer a public ipv6 address
+    if (remote->SAFAMILY==AF_INET6) {
+      int value = IPV6_PREFER_SRC_PUBLIC;
+      ret = setsockopt(*sock, IPPROTO_IPV6, IPV6_ADDR_PREFERENCES, &value, sizeof(value));
+      if (ret<0)
+        die("error: could not select a preference for public IPv6 address");
+    }
+    #endif
+    #endif
+
     ret = bind(*sock, info->ai_addr, info->ai_addrlen);
 
     freeaddrinfo(info);