From: Mike Brady Date: Mon, 28 Dec 2015 15:18:09 +0000 (+0000) Subject: Prefer to use a public ipv6 number where privacy extensions are enabled X-Git-Tag: 2.7.6~11^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4d73fa23b36fc2a0328f1213dcb3b4874ae9b0a7;p=thirdparty%2Fshairport-sync.git Prefer to use a public ipv6 number where privacy extensions are enabled --- diff --git a/rtp.c b/rtp.c index 78a19a36..0e4f1aaf 100644 --- a/rtp.c +++ b/rtp.c @@ -41,6 +41,10 @@ #include "player.h" #include "rtp.h" +#ifdef COMPILE_FOR_LINUX_AND_FREEBSD_AND_CYGWIN +#include +#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);