]> Cypherpunks repositories - gostls13.git/commitdiff
net, syscall: move multicast address handling
authorJoel Sing <jsing@google.com>
Tue, 16 Aug 2011 21:26:51 +0000 (17:26 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 16 Aug 2011 21:26:51 +0000 (17:26 -0400)
Multicast address handling is not consistent across all BSDs. Move
the multicast address handling code into OS dependent files. This
will be needed for OpenBSD support.

R=mikioh.mikioh, golang-dev
CC=golang-dev
https://golang.org/cl/4809074

src/pkg/net/interface_bsd.go
src/pkg/net/interface_darwin.go
src/pkg/net/interface_freebsd.go
src/pkg/syscall/route_bsd.go
src/pkg/syscall/route_darwin.go
src/pkg/syscall/route_freebsd.go

index 130820d4a49d994fb38ddd8b8614f964eeda4980..2675f94b973481623120d66a0319647503a0bdc3 100644 (file)
@@ -169,34 +169,3 @@ func newAddr(m *syscall.InterfaceAddrMessage) ([]Addr, os.Error) {
 
        return ifat, nil
 }
-
-func newMulticastAddr(m *syscall.InterfaceMulticastAddrMessage) ([]Addr, os.Error) {
-       var ifmat []Addr
-
-       sas, e := syscall.ParseRoutingSockaddr(m)
-       if e != 0 {
-               return nil, os.NewSyscallError("route sockaddr", e)
-       }
-
-       for _, s := range sas {
-               switch v := s.(type) {
-               case *syscall.SockaddrInet4:
-                       ifma := &IPAddr{IP: IPv4(v.Addr[0], v.Addr[1], v.Addr[2], v.Addr[3])}
-                       ifmat = append(ifmat, ifma.toAddr())
-               case *syscall.SockaddrInet6:
-                       ifma := &IPAddr{IP: make(IP, IPv6len)}
-                       copy(ifma.IP, v.Addr[:])
-                       // NOTE: KAME based IPv6 protcol stack usually embeds
-                       // the interface index in the interface-local or link-
-                       // local address as the kernel-internal form.
-                       if ifma.IP.IsInterfaceLocalMulticast() ||
-                               ifma.IP.IsLinkLocalMulticast() {
-                               // remove embedded scope zone ID
-                               ifma.IP[2], ifma.IP[3] = 0, 0
-                       }
-                       ifmat = append(ifmat, ifma.toAddr())
-               }
-       }
-
-       return ifmat, nil
-}
index 6fbcd372309886ac0602c748099c0fda7d44e51c..a7b68ad7f77c194213d545e58a2de63e6d72f498 100644 (file)
@@ -47,3 +47,34 @@ func interfaceMulticastAddrTable(ifindex int) ([]Addr, os.Error) {
 
        return ifmat, nil
 }
+
+func newMulticastAddr(m *syscall.InterfaceMulticastAddrMessage) ([]Addr, os.Error) {
+       var ifmat []Addr
+
+       sas, e := syscall.ParseRoutingSockaddr(m)
+       if e != 0 {
+               return nil, os.NewSyscallError("route sockaddr", e)
+       }
+
+       for _, s := range sas {
+               switch v := s.(type) {
+               case *syscall.SockaddrInet4:
+                       ifma := &IPAddr{IP: IPv4(v.Addr[0], v.Addr[1], v.Addr[2], v.Addr[3])}
+                       ifmat = append(ifmat, ifma.toAddr())
+               case *syscall.SockaddrInet6:
+                       ifma := &IPAddr{IP: make(IP, IPv6len)}
+                       copy(ifma.IP, v.Addr[:])
+                       // NOTE: KAME based IPv6 protcol stack usually embeds
+                       // the interface index in the interface-local or link-
+                       // local address as the kernel-internal form.
+                       if ifma.IP.IsInterfaceLocalMulticast() ||
+                               ifma.IP.IsLinkLocalMulticast() {
+                               // remove embedded scope zone ID
+                               ifma.IP[2], ifma.IP[3] = 0, 0
+                       }
+                       ifmat = append(ifmat, ifma.toAddr())
+               }
+       }
+
+       return ifmat, nil
+}
index e0ff6caf00c8e6fc56f75b1e0b3dab66b9f6f543..20f506b08bcd4baa011e0b44ac610d5b65cffb92 100644 (file)
@@ -47,3 +47,34 @@ func interfaceMulticastAddrTable(ifindex int) ([]Addr, os.Error) {
 
        return ifmat, nil
 }
+
+func newMulticastAddr(m *syscall.InterfaceMulticastAddrMessage) ([]Addr, os.Error) {
+       var ifmat []Addr
+
+       sas, e := syscall.ParseRoutingSockaddr(m)
+       if e != 0 {
+               return nil, os.NewSyscallError("route sockaddr", e)
+       }
+
+       for _, s := range sas {
+               switch v := s.(type) {
+               case *syscall.SockaddrInet4:
+                       ifma := &IPAddr{IP: IPv4(v.Addr[0], v.Addr[1], v.Addr[2], v.Addr[3])}
+                       ifmat = append(ifmat, ifma.toAddr())
+               case *syscall.SockaddrInet6:
+                       ifma := &IPAddr{IP: make(IP, IPv6len)}
+                       copy(ifma.IP, v.Addr[:])
+                       // NOTE: KAME based IPv6 protcol stack usually embeds
+                       // the interface index in the interface-local or link-
+                       // local address as the kernel-internal form.
+                       if ifma.IP.IsInterfaceLocalMulticast() ||
+                               ifma.IP.IsLinkLocalMulticast() {
+                               // remove embedded scope zone ID
+                               ifma.IP[2], ifma.IP[3] = 0, 0
+                       }
+                       ifmat = append(ifmat, ifma.toAddr())
+               }
+       }
+
+       return ifmat, nil
+}
index e41667c1400487e74c1599887d7d9980b4f0ea53..93e345d71736e2a7e7dae55a374863a3d4d63cf4 100644 (file)
@@ -131,35 +131,6 @@ func (m *InterfaceAddrMessage) sockaddr() (sas []Sockaddr) {
        return sas
 }
 
-const rtaIfmaMask = RTA_GATEWAY | RTA_IFP | RTA_IFA
-
-func (m *InterfaceMulticastAddrMessage) sockaddr() (sas []Sockaddr) {
-       if m.Header.Addrs&rtaIfmaMask == 0 {
-               return nil
-       }
-
-       buf := m.Data[:]
-       for i := uint(0); i < RTAX_MAX; i++ {
-               if m.Header.Addrs&rtaIfmaMask&(1<<i) == 0 {
-                       continue
-               }
-               rsa := (*RawSockaddr)(unsafe.Pointer(&buf[0]))
-               switch i {
-               case RTAX_IFA:
-                       sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
-                       if e != 0 {
-                               return nil
-                       }
-                       sas = append(sas, sa)
-               case RTAX_GATEWAY, RTAX_IFP:
-                       // nothing to do
-               }
-               buf = buf[rsaAlignOf(int(rsa.Len)):]
-       }
-
-       return sas
-}
-
 // ParseRoutingMessage parses buf as routing messages and returns
 // the slice containing the RoutingMessage interfaces.
 func ParseRoutingMessage(buf []byte) (msgs []RoutingMessage, errno int) {
index 8f79b708d615e9da0e580632d88b11b12895994c..9d3a701daba859e7fbcdb821b4848bc32091cacc 100644 (file)
@@ -46,3 +46,32 @@ type InterfaceMulticastAddrMessage struct {
        Header IfmaMsghdr2
        Data   []byte
 }
+
+const rtaIfmaMask = RTA_GATEWAY | RTA_IFP | RTA_IFA
+
+func (m *InterfaceMulticastAddrMessage) sockaddr() (sas []Sockaddr) {
+       if m.Header.Addrs&rtaIfmaMask == 0 {
+               return nil
+       }
+
+       buf := m.Data[:]
+       for i := uint(0); i < RTAX_MAX; i++ {
+               if m.Header.Addrs&rtaIfmaMask&(1<<i) == 0 {
+                       continue
+               }
+               rsa := (*RawSockaddr)(unsafe.Pointer(&buf[0]))
+               switch i {
+               case RTAX_IFA:
+                       sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
+                       if e != 0 {
+                               return nil
+                       }
+                       sas = append(sas, sa)
+               case RTAX_GATEWAY, RTAX_IFP:
+                       // nothing to do
+               }
+               buf = buf[rsaAlignOf(int(rsa.Len)):]
+       }
+
+       return sas
+}
index 128e93cf9029a3ce1a0f5bc7bbf646ae426e8c4f..0d61d08b08cfbaf186ed69d4a41a60760c4fc4db 100644 (file)
@@ -46,3 +46,32 @@ type InterfaceMulticastAddrMessage struct {
        Header IfmaMsghdr
        Data   []byte
 }
+
+const rtaIfmaMask = RTA_GATEWAY | RTA_IFP | RTA_IFA
+
+func (m *InterfaceMulticastAddrMessage) sockaddr() (sas []Sockaddr) {
+       if m.Header.Addrs&rtaIfmaMask == 0 {
+               return nil
+       }
+
+       buf := m.Data[:]
+       for i := uint(0); i < RTAX_MAX; i++ {
+               if m.Header.Addrs&rtaIfmaMask&(1<<i) == 0 {
+                       continue
+               }
+               rsa := (*RawSockaddr)(unsafe.Pointer(&buf[0]))
+               switch i {
+               case RTAX_IFA:
+                       sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
+                       if e != 0 {
+                               return nil
+                       }
+                       sas = append(sas, sa)
+               case RTAX_GATEWAY, RTAX_IFP:
+                       // nothing to do
+               }
+               buf = buf[rsaAlignOf(int(rsa.Len)):]
+       }
+
+       return sas
+}