mirror of https://github.com/golang/go.git
net: make InterfaceByIndex return a consistent name on solaris
Also retightens test cases for Resolve{TCP,UDP,IP}Addr which are using
interface names for specifying IPv6 zone.
Updates #14037.
Fixes #18362.
Change-Id: I7444b6302e2847dfbdab8a0ad5b2e702bed1a3d6
Reviewed-on: https://go-review.googlesource.com/34670
Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
985a574991
commit
86f2c5fe93
|
|
@ -172,6 +172,9 @@ func InterfaceByName(name string) (*Interface, error) {
|
||||||
// An ipv6ZoneCache represents a cache holding partial network
|
// An ipv6ZoneCache represents a cache holding partial network
|
||||||
// interface information. It is used for reducing the cost of IPv6
|
// interface information. It is used for reducing the cost of IPv6
|
||||||
// addressing scope zone resolution.
|
// addressing scope zone resolution.
|
||||||
|
//
|
||||||
|
// Multiple names sharing the index are managed by first-come
|
||||||
|
// first-served basis for consistency.
|
||||||
type ipv6ZoneCache struct {
|
type ipv6ZoneCache struct {
|
||||||
sync.RWMutex // guard the following
|
sync.RWMutex // guard the following
|
||||||
lastFetched time.Time // last time routing information was fetched
|
lastFetched time.Time // last time routing information was fetched
|
||||||
|
|
@ -202,7 +205,9 @@ func (zc *ipv6ZoneCache) update(ift []Interface) {
|
||||||
zc.toName = make(map[int]string, len(ift))
|
zc.toName = make(map[int]string, len(ift))
|
||||||
for _, ifi := range ift {
|
for _, ifi := range ift {
|
||||||
zc.toIndex[ifi.Name] = ifi.Index
|
zc.toIndex[ifi.Name] = ifi.Index
|
||||||
zc.toName[ifi.Index] = ifi.Name
|
if _, ok := zc.toName[ifi.Index]; !ok {
|
||||||
|
zc.toName[ifi.Index] = ifi.Name
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,13 @@ var resolveIPAddrTests = []resolveIPAddrTest{
|
||||||
{"l2tp", "127.0.0.1", nil, UnknownNetworkError("l2tp")},
|
{"l2tp", "127.0.0.1", nil, UnknownNetworkError("l2tp")},
|
||||||
{"l2tp:gre", "127.0.0.1", nil, UnknownNetworkError("l2tp:gre")},
|
{"l2tp:gre", "127.0.0.1", nil, UnknownNetworkError("l2tp:gre")},
|
||||||
{"tcp", "1.2.3.4:123", nil, UnknownNetworkError("tcp")},
|
{"tcp", "1.2.3.4:123", nil, UnknownNetworkError("tcp")},
|
||||||
|
|
||||||
|
{"ip4", "2001:db8::1", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "2001:db8::1"}},
|
||||||
|
{"ip4:icmp", "2001:db8::1", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "2001:db8::1"}},
|
||||||
|
{"ip6", "127.0.0.1", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "127.0.0.1"}},
|
||||||
|
{"ip6", "::ffff:127.0.0.1", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "::ffff:127.0.0.1"}},
|
||||||
|
{"ip6:ipv6-icmp", "127.0.0.1", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "127.0.0.1"}},
|
||||||
|
{"ip6:ipv6-icmp", "::ffff:127.0.0.1", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "::ffff:127.0.0.1"}},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestResolveIPAddr(t *testing.T) {
|
func TestResolveIPAddr(t *testing.T) {
|
||||||
|
|
@ -54,21 +61,17 @@ func TestResolveIPAddr(t *testing.T) {
|
||||||
defer func() { testHookLookupIP = origTestHookLookupIP }()
|
defer func() { testHookLookupIP = origTestHookLookupIP }()
|
||||||
testHookLookupIP = lookupLocalhost
|
testHookLookupIP = lookupLocalhost
|
||||||
|
|
||||||
for i, tt := range resolveIPAddrTests {
|
for _, tt := range resolveIPAddrTests {
|
||||||
addr, err := ResolveIPAddr(tt.network, tt.litAddrOrName)
|
addr, err := ResolveIPAddr(tt.network, tt.litAddrOrName)
|
||||||
if err != tt.err {
|
if !reflect.DeepEqual(addr, tt.addr) || !reflect.DeepEqual(err, tt.err) {
|
||||||
t.Errorf("#%d: %v", i, err)
|
t.Errorf("ResolveIPAddr(%q, %q) = %#v, %v, want %#v, %v", tt.network, tt.litAddrOrName, addr, err, tt.addr, tt.err)
|
||||||
} else if !reflect.DeepEqual(addr, tt.addr) {
|
|
||||||
t.Errorf("#%d: got %#v; want %#v", i, addr, tt.addr)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
rtaddr, err := ResolveIPAddr(addr.Network(), addr.String())
|
if err == nil {
|
||||||
if err != nil {
|
addr2, err := ResolveIPAddr(addr.Network(), addr.String())
|
||||||
t.Errorf("#%d: %v", i, err)
|
if !reflect.DeepEqual(addr2, tt.addr) || err != tt.err {
|
||||||
} else if !reflect.DeepEqual(rtaddr, addr) {
|
t.Errorf("(%q, %q): ResolveIPAddr(%q, %q) = %#v, %v, want %#v, %v", tt.network, tt.litAddrOrName, addr.Network(), addr.String(), addr2, err, tt.addr, tt.err)
|
||||||
t.Errorf("#%d: got %#v; want %#v", i, rtaddr, addr)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -317,10 +317,11 @@ var resolveTCPAddrTests = []resolveTCPAddrTest{
|
||||||
{"tcp", "[2001:db8::1]:http", &TCPAddr{IP: ParseIP("2001:db8::1"), Port: 80}, nil},
|
{"tcp", "[2001:db8::1]:http", &TCPAddr{IP: ParseIP("2001:db8::1"), Port: 80}, nil},
|
||||||
{"tcp4", "127.0.0.1:http", &TCPAddr{IP: ParseIP("127.0.0.1"), Port: 80}, nil},
|
{"tcp4", "127.0.0.1:http", &TCPAddr{IP: ParseIP("127.0.0.1"), Port: 80}, nil},
|
||||||
{"tcp4", "[::ffff:127.0.0.1]:http", &TCPAddr{IP: ParseIP("127.0.0.1"), Port: 80}, nil},
|
{"tcp4", "[::ffff:127.0.0.1]:http", &TCPAddr{IP: ParseIP("127.0.0.1"), Port: 80}, nil},
|
||||||
|
{"tcp6", "[2001:db8::1]:http", &TCPAddr{IP: ParseIP("2001:db8::1"), Port: 80}, nil},
|
||||||
|
|
||||||
{"tcp4", "[2001:db8::1]:http", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "2001:db8::1"}},
|
{"tcp4", "[2001:db8::1]:http", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "2001:db8::1"}},
|
||||||
{"tcp6", "127.0.0.1:http", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "127.0.0.1"}},
|
{"tcp6", "127.0.0.1:http", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "127.0.0.1"}},
|
||||||
{"tcp6", "[::ffff:127.0.0.1]:http", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "::ffff:127.0.0.1"}},
|
{"tcp6", "[::ffff:127.0.0.1]:http", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "::ffff:127.0.0.1"}},
|
||||||
{"tcp6", "[2001:db8::1]:http", &TCPAddr{IP: ParseIP("2001:db8::1"), Port: 80}, nil},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestResolveTCPAddr(t *testing.T) {
|
func TestResolveTCPAddr(t *testing.T) {
|
||||||
|
|
@ -331,13 +332,13 @@ func TestResolveTCPAddr(t *testing.T) {
|
||||||
for _, tt := range resolveTCPAddrTests {
|
for _, tt := range resolveTCPAddrTests {
|
||||||
addr, err := ResolveTCPAddr(tt.network, tt.litAddrOrName)
|
addr, err := ResolveTCPAddr(tt.network, tt.litAddrOrName)
|
||||||
if !reflect.DeepEqual(addr, tt.addr) || !reflect.DeepEqual(err, tt.err) {
|
if !reflect.DeepEqual(addr, tt.addr) || !reflect.DeepEqual(err, tt.err) {
|
||||||
t.Errorf("ResolveTCPAddr(%q, %q) = %v, %v, want %v, %v", tt.network, tt.litAddrOrName, addr, err, tt.addr, tt.err)
|
t.Errorf("ResolveTCPAddr(%q, %q) = %#v, %v, want %#v, %v", tt.network, tt.litAddrOrName, addr, err, tt.addr, tt.err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
addr2, err := ResolveTCPAddr(addr.Network(), addr.String())
|
addr2, err := ResolveTCPAddr(addr.Network(), addr.String())
|
||||||
if !reflect.DeepEqual(addr2, tt.addr) || err != tt.err {
|
if !reflect.DeepEqual(addr2, tt.addr) || err != tt.err {
|
||||||
t.Errorf("(%q, %q): ResolveTCPAddr(%q, %q) = %v, %v, want %v, %v", tt.network, tt.litAddrOrName, addr.Network(), addr.String(), addr2, err, tt.addr, tt.err)
|
t.Errorf("(%q, %q): ResolveTCPAddr(%q, %q) = %#v, %v, want %#v, %v", tt.network, tt.litAddrOrName, addr.Network(), addr.String(), addr2, err, tt.addr, tt.err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,17 @@ var resolveUDPAddrTests = []resolveUDPAddrTest{
|
||||||
{"udp", ":12345", &UDPAddr{Port: 12345}, nil},
|
{"udp", ":12345", &UDPAddr{Port: 12345}, nil},
|
||||||
|
|
||||||
{"http", "127.0.0.1:0", nil, UnknownNetworkError("http")},
|
{"http", "127.0.0.1:0", nil, UnknownNetworkError("http")},
|
||||||
|
|
||||||
|
{"udp", "127.0.0.1:domain", &UDPAddr{IP: ParseIP("127.0.0.1"), Port: 53}, nil},
|
||||||
|
{"udp", "[::ffff:127.0.0.1]:domain", &UDPAddr{IP: ParseIP("::ffff:127.0.0.1"), Port: 53}, nil},
|
||||||
|
{"udp", "[2001:db8::1]:domain", &UDPAddr{IP: ParseIP("2001:db8::1"), Port: 53}, nil},
|
||||||
|
{"udp4", "127.0.0.1:domain", &UDPAddr{IP: ParseIP("127.0.0.1"), Port: 53}, nil},
|
||||||
|
{"udp4", "[::ffff:127.0.0.1]:domain", &UDPAddr{IP: ParseIP("127.0.0.1"), Port: 53}, nil},
|
||||||
|
{"udp6", "[2001:db8::1]:domain", &UDPAddr{IP: ParseIP("2001:db8::1"), Port: 53}, nil},
|
||||||
|
|
||||||
|
{"udp4", "[2001:db8::1]:domain", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "2001:db8::1"}},
|
||||||
|
{"udp6", "127.0.0.1:domain", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "127.0.0.1"}},
|
||||||
|
{"udp6", "[::ffff:127.0.0.1]:domain", nil, &AddrError{Err: errNoSuitableAddress.Error(), Addr: "::ffff:127.0.0.1"}},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestResolveUDPAddr(t *testing.T) {
|
func TestResolveUDPAddr(t *testing.T) {
|
||||||
|
|
@ -79,21 +90,17 @@ func TestResolveUDPAddr(t *testing.T) {
|
||||||
defer func() { testHookLookupIP = origTestHookLookupIP }()
|
defer func() { testHookLookupIP = origTestHookLookupIP }()
|
||||||
testHookLookupIP = lookupLocalhost
|
testHookLookupIP = lookupLocalhost
|
||||||
|
|
||||||
for i, tt := range resolveUDPAddrTests {
|
for _, tt := range resolveUDPAddrTests {
|
||||||
addr, err := ResolveUDPAddr(tt.network, tt.litAddrOrName)
|
addr, err := ResolveUDPAddr(tt.network, tt.litAddrOrName)
|
||||||
if err != tt.err {
|
if !reflect.DeepEqual(addr, tt.addr) || !reflect.DeepEqual(err, tt.err) {
|
||||||
t.Errorf("#%d: %v", i, err)
|
t.Errorf("ResolveUDPAddr(%q, %q) = %#v, %v, want %#v, %v", tt.network, tt.litAddrOrName, addr, err, tt.addr, tt.err)
|
||||||
} else if !reflect.DeepEqual(addr, tt.addr) {
|
|
||||||
t.Errorf("#%d: got %#v; want %#v", i, addr, tt.addr)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
rtaddr, err := ResolveUDPAddr(addr.Network(), addr.String())
|
if err == nil {
|
||||||
if err != nil {
|
addr2, err := ResolveUDPAddr(addr.Network(), addr.String())
|
||||||
t.Errorf("#%d: %v", i, err)
|
if !reflect.DeepEqual(addr2, tt.addr) || err != tt.err {
|
||||||
} else if !reflect.DeepEqual(rtaddr, addr) {
|
t.Errorf("(%q, %q): ResolveUDPAddr(%q, %q) = %#v, %v, want %#v, %v", tt.network, tt.litAddrOrName, addr.Network(), addr.String(), addr2, err, tt.addr, tt.err)
|
||||||
t.Errorf("#%d: got %#v; want %#v", i, rtaddr, addr)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue