Repository: syncthing/syncthing (language: go)

Issue:
Announce IPv6 ULA
We announce IPv4 LAN addresses since v1.10.0(#6896). We could do the same for IPv6 unique local addresses(`fc00::/7`). They work without a device identifier and are comparable to IPv4 LAN addresses. 


Discussion / hints:
This also includes `fd00::/8` which is typically used to address VPN peers with IPv6.
https://app.bountysource.com/issues/97036651-announce-ipv6-ula

Fix patch:
diff --git a/lib/connections/util.go b/lib/connections/util.go
index 3dd5dc92ce9..7f6c3fd60a8 100644
--- a/lib/connections/util.go
+++ b/lib/connections/util.go
@@ -71,12 +71,9 @@ func getHostPortsForAllAdapters(port int) []string {
 	portStr := strconv.Itoa(port)
 
 	for _, network := range nets {
-		// Only IPv4 addresses, as v6 link local require an interface identifiers to work correctly
-		// And non link local in theory are globally routable anyway.
-		if network.IP.To4() == nil {
-			continue
-		}
-		if network.IP.IsLinkLocalUnicast() || (isV4Local(network.IP) && network.IP.IsGlobalUnicast()) {
+		// Only accept IPv4 link-local unicast and the private ranges defined in RFC 1918 and RFC 4193
+		// IPv6 link-local addresses require an interface identifier to work correctly
+		if (network.IP.To4() != nil && network.IP.IsLinkLocalUnicast()) || network.IP.IsPrivate() {
 			hostPorts = append(hostPorts, net.JoinHostPort(network.IP.String(), portStr))
 		}
 	}
@@ -107,17 +104,6 @@ func resolve(network, hostPort string) (net.IP, int, error) {
 	return net.IPv4zero, 0, net.UnknownNetworkError(network)
 }
 
-func isV4Local(ip net.IP) bool {
-	// See https://go-review.googlesource.com/c/go/+/162998/
-	// We only take the V4 part of that.
-	if ip4 := ip.To4(); ip4 != nil {
-		return ip4[0] == 10 ||
-			(ip4[0] == 172 && ip4[1]&0xf0 == 16) ||
-			(ip4[0] == 192 && ip4[1] == 168)
-	}
-	return false
-}
-
 func maybeReplacePort(uri *url.URL, laddr net.Addr) *url.URL {
 	if laddr == nil {
 		return uri


Test patch: