}
func TestInterfaces(t *testing.T) {
- if runtime.GOOS == "dragonfly" {
- t.Skip("fail on dragonfly - issue 10041")
- }
ift, err := Interfaces()
if err != nil {
t.Fatal(err)
}
func TestInterfaceAddrs(t *testing.T) {
- if runtime.GOOS == "dragonfly" {
- t.Skip("fail on dragonfly - issue 10041")
- }
ift, err := Interfaces()
if err != nil {
t.Fatal(err)
if len(b) < l {
return nil, EINVAL
}
- switch family {
- case AF_INET6:
+ // Don't reorder case expressions.
+ // The case expressions for IPv6 must come first.
+ switch {
+ case b[0] == SizeofSockaddrInet6:
+ sa := &SockaddrInet6{}
+ copy(sa.Addr[:], b[offsetofInet6:])
+ return sa, nil
+ case family == AF_INET6:
sa := &SockaddrInet6{}
if l-1 < offsetofInet6 {
copy(sa.Addr[:], b[1:l])
copy(sa.Addr[:], b[l-offsetofInet6:l])
}
return sa, nil
+ case b[0] == SizeofSockaddrInet4:
+ sa := &SockaddrInet4{}
+ copy(sa.Addr[:], b[offsetofInet4:])
+ return sa, nil
default: // an old fashion, AF_UNSPEC or unknown means AF_INET
sa := &SockaddrInet4{}
if l-1 < offsetofInet4 {
func TestRouteRIB(t *testing.T) {
for _, facility := range []int{syscall.NET_RT_DUMP, syscall.NET_RT_IFLIST} {
for _, param := range []int{syscall.AF_UNSPEC, syscall.AF_INET, syscall.AF_INET6} {
- b, err := syscall.RouteRIB(facility, param)
+ var err error
+ var b []byte
+ // The VM allocator wrapper functions can
+ // return ENOMEM easily.
+ for i := 0; i < 3; i++ {
+ b, err = syscall.RouteRIB(facility, param)
+ if err != nil {
+ time.Sleep(5 * time.Millisecond)
+ continue
+ }
+ break
+ }
if err != nil {
t.Error(facility, param, err)
continue
func (sas sockaddrs) match(flags addrFlags) error {
var f addrFlags
+ family := syscall.AF_UNSPEC
for i := range sas {
if sas[i] != nil {
f |= 1 << uint(i)
}
+ switch sas[i].(type) {
+ case *syscall.SockaddrInet4:
+ if family == syscall.AF_UNSPEC {
+ family = syscall.AF_INET
+ }
+ if family != syscall.AF_INET {
+ return fmt.Errorf("got %v; want %v", sockaddrs(sas), family)
+ }
+ case *syscall.SockaddrInet6:
+ if family == syscall.AF_UNSPEC {
+ family = syscall.AF_INET6
+ }
+ if family != syscall.AF_INET6 {
+ return fmt.Errorf("got %v; want %v", sockaddrs(sas), family)
+ }
+ }
}
if f != flags {
return fmt.Errorf("got %v; want %v", f, flags)