net, syscall: interface address and mask

This CL makes both InterfaceAddrs and Addrs method on Interface
return IPNet struct for representing interface address and mask
like below:

interface "lo0": flags "up|loopback|multicast", ifindex 1, mtu 16384
        interface address "fe80::1/64"
        interface address "127.0.0.1/8"
        interface address "::1/128"
        joined group address "ff02::fb"
        joined group address "224.0.0.251"
        joined group address "ff02::2:65d0:d71e"
        joined group address "224.0.0.1"
 	joined group address "ff01::1"
        joined group address "ff02::1"
        joined group address "ff02::1:ff00:1"

Fixes #2571.

R=rsc
CC=golang-dev
https://golang.org/cl/5489062
diff --git a/src/pkg/syscall/route_bsd.go b/src/pkg/syscall/route_bsd.go
index 85c26c5..e17d976 100644
--- a/src/pkg/syscall/route_bsd.go
+++ b/src/pkg/syscall/route_bsd.go
@@ -85,8 +85,8 @@
 		rsa := (*RawSockaddr)(unsafe.Pointer(&buf[0]))
 		switch i {
 		case RTAX_DST, RTAX_GATEWAY:
-			sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
-			if e != nil {
+			sa, err := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
+			if err != nil {
 				return nil
 			}
 			if i == RTAX_DST {
@@ -128,8 +128,8 @@
 	if m.Header.Addrs&RTA_IFP == 0 {
 		return nil
 	}
-	sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(&m.Data[0])))
-	if e != nil {
+	sa, err := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(&m.Data[0])))
+	if err != nil {
 		return nil
 	}
 	return append(sas, sa)
@@ -157,12 +157,21 @@
 		rsa := (*RawSockaddr)(unsafe.Pointer(&buf[0]))
 		switch i {
 		case RTAX_IFA:
-			sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
-			if e != nil {
+			sa, err := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
+			if err != nil {
 				return nil
 			}
 			sas = append(sas, sa)
-		case RTAX_NETMASK, RTAX_BRD:
+		case RTAX_NETMASK:
+			if rsa.Family == AF_UNSPEC {
+				rsa.Family = AF_INET // an old fasion, AF_UNSPEC means AF_INET
+			}
+			sa, err := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
+			if err != nil {
+				return nil
+			}
+			sas = append(sas, sa)
+		case RTAX_BRD:
 			// nothing to do
 		}
 		buf = buf[rsaAlignOf(int(rsa.Len)):]