From: Mikio Hara Date: Fri, 17 Jul 2015 08:31:49 +0000 (+0900) Subject: net: classify site-local unicast in address selection X-Git-Tag: go1.5beta3~157 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=aadd84e0c4ac2476644d0f60b4873867c9549306;p=gostls13.git net: classify site-local unicast in address selection This change adds site-local unicast classification for users still using the deprecated addresses internally. Change-Id: If50870c6d4a85fe471c002b161eec59efcebe2f4 Reviewed-on: https://go-review.googlesource.com/12344 Run-TryBot: Brad Fitzpatrick Reviewed-by: Brad Fitzpatrick --- diff --git a/src/net/addrselect.go b/src/net/addrselect.go index e7b2b48b46..e22fbac5ce 100644 --- a/src/net/addrselect.go +++ b/src/net/addrselect.go @@ -328,11 +328,15 @@ func classifyScope(ip IP) scope { if ip.IsLoopback() || ip.IsLinkLocalUnicast() { return scopeLinkLocal } - if len(ip) == IPv6len && ip.To4() == nil && ip.IsMulticast() { + ipv6 := len(ip) == IPv6len && ip.To4() == nil + if ipv6 && ip.IsMulticast() { return scope(ip[1] & 0xf) } - // TODO: are there unicast scopeAdminLocal, scopeSiteLocal, - // scopeOrgLocal? Better question: are those even used? + // Site-local addresses are defined in RFC 3513 section 2.5.6 + // (and deprecated in RFC 3879). + if ipv6 && ip[0] == 0xfe && ip[1]&0xc0 == 0xc0 { + return scopeSiteLocal + } return scopeGlobal } diff --git a/src/net/addrselect_test.go b/src/net/addrselect_test.go index 7f7cb1b827..562022772f 100644 --- a/src/net/addrselect_test.go +++ b/src/net/addrselect_test.go @@ -169,6 +169,7 @@ func TestRFC6724ClassifyScope(t *testing.T) { {ParseIP("127.0.0.1"), scopeLinkLocal}, // rfc6724#section-3.2 {ParseIP("::1"), scopeLinkLocal}, // rfc4007#section-4 {ParseIP("169.254.1.2"), scopeLinkLocal}, // rfc6724#section-3.2 + {ParseIP("fec0::1"), scopeSiteLocal}, {ParseIP("8.8.8.8"), scopeGlobal}, {ParseIP("ff02::"), scopeLinkLocal}, // IPv6 multicast