Index: src/pkg/syscall/route_bsd.go |
=================================================================== |
--- a/src/pkg/syscall/route_bsd.go |
+++ b/src/pkg/syscall/route_bsd.go |
@@ -65,32 +65,6 @@ |
Type uint8 |
} |
-func (any *anyMessage) toRoutingMessage(buf []byte) RoutingMessage { |
- switch any.Type { |
- case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE: |
- p := (*RouteMessage)(unsafe.Pointer(any)) |
- rtm := &RouteMessage{} |
- rtm.Header = p.Header |
- rtm.Data = buf[SizeofRtMsghdr:any.Msglen] |
- return rtm |
- case RTM_IFINFO: |
- p := (*InterfaceMessage)(unsafe.Pointer(any)) |
- ifm := &InterfaceMessage{} |
- ifm.Header = p.Header |
- ifm.Data = buf[SizeofIfMsghdr:any.Msglen] |
- return ifm |
- case RTM_NEWADDR, RTM_DELADDR: |
- p := (*InterfaceAddrMessage)(unsafe.Pointer(any)) |
- ifam := &InterfaceAddrMessage{} |
- ifam.Header = p.Header |
- ifam.Data = buf[SizeofIfaMsghdr:any.Msglen] |
- return ifam |
- case RTM_NEWMADDR, RTM_DELMADDR: |
- // TODO: implement this in the near future |
- } |
- return nil |
-} |
- |
// RouteMessage represents a routing message containing routing |
// entries. |
type RouteMessage struct { |
@@ -128,16 +102,16 @@ |
Data []byte |
} |
-const rtaMask = RTA_IFA | RTA_NETMASK | RTA_BRD |
+const rtaIfaMask = RTA_IFA | RTA_NETMASK | RTA_BRD |
func (m *InterfaceAddrMessage) sockaddr() (sas []Sockaddr) { |
- if m.Header.Addrs&rtaMask == 0 { |
+ if m.Header.Addrs&rtaIfaMask == 0 { |
return nil |
} |
buf := m.Data[:] |
for i := uint(0); i < RTAX_MAX; i++ { |
- if m.Header.Addrs&rtaMask&(1<<i) == 0 { |
+ if m.Header.Addrs&rtaIfaMask&(1<<i) == 0 { |
continue |
} |
rsa := (*RawSockaddr)(unsafe.Pointer(&buf[0])) |
@@ -157,6 +131,35 @@ |
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) { |