]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: fix IPv6 wrong network mask on latest FreeBSD
authorMikio Hara <mikioh.mikioh@gmail.com>
Tue, 6 Aug 2013 15:25:23 +0000 (00:25 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Tue, 6 Aug 2013 15:25:23 +0000 (00:25 +0900)
Looks like latest FreeBSD doesn't set address family identifer
for RTAX_NETMASK stuff; probably RTAX_GENMASK too, not confirmed.
This CL tries to identify address families by using the length of
each socket address if possible.

The issue is confirmed on FreeBSD 9.1.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/12332043

src/pkg/net/interface_test.go
src/pkg/syscall/route_bsd.go

index e31894abf73e9b3cdffff51ac61b510149548d06..17b28b6456b0025404a058296fb6c2fd87dcedb1 100644 (file)
@@ -108,12 +108,23 @@ func testInterfaceMulticastAddrs(t *testing.T, ifi *Interface) {
 func testAddrs(t *testing.T, ifat []Addr) {
        for _, ifa := range ifat {
                switch ifa := ifa.(type) {
-               case *IPAddr, *IPNet:
+               case *IPAddr:
                        if ifa == nil {
                                t.Errorf("\tunexpected value: %v", ifa)
                        } else {
                                t.Logf("\tinterface address %q", ifa.String())
                        }
+               case *IPNet:
+                       if ifa == nil {
+                               t.Errorf("\tunexpected value: %v", ifa)
+                       } else {
+                               _, prefixLen := ifa.Mask.Size()
+                               if ifa.IP.To4() != nil && prefixLen != 8*IPv4len || ifa.IP.To16() != nil && ifa.IP.To4() == nil && prefixLen != 8*IPv6len {
+                                       t.Errorf("\tunexpected value: %v, %v, %v, %v", ifa, ifa.IP, ifa.Mask, prefixLen)
+                               } else {
+                                       t.Logf("\tinterface address %q", ifa.String())
+                               }
+                       }
                default:
                        t.Errorf("\tunexpected type: %T", ifa)
                }
index 62c5ce1a31b5abffa1895d98ec7f8205b94409f9..2a81f85c3483a613664accb56ca941a25a53c581 100644 (file)
@@ -156,7 +156,14 @@ func (m *InterfaceAddrMessage) sockaddr() (sas []Sockaddr) {
                        sas = append(sas, sa)
                case RTAX_NETMASK:
                        if rsa.Family == AF_UNSPEC {
-                               rsa.Family = AF_INET // an old fasion, AF_UNSPEC means AF_INET
+                               switch rsa.Len {
+                               case SizeofSockaddrInet4:
+                                       rsa.Family = AF_INET
+                               case SizeofSockaddrInet6:
+                                       rsa.Family = AF_INET6
+                               default:
+                                       rsa.Family = AF_INET // an old fasion, AF_UNSPEC means AF_INET
+                               }
                        }
                        sa, err := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
                        if err != nil {