diff options
Diffstat (limited to 'src/pkg/syscall/route_bsd.go')
| -rw-r--r-- | src/pkg/syscall/route_bsd.go | 61 |
1 files changed, 32 insertions, 29 deletions
diff --git a/src/pkg/syscall/route_bsd.go b/src/pkg/syscall/route_bsd.go index 7821a6d29..e41667c14 100644 --- a/src/pkg/syscall/route_bsd.go +++ b/src/pkg/syscall/route_bsd.go @@ -65,32 +65,6 @@ type anyMessage struct { 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 @@ type InterfaceAddrMessage struct { 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 @@ 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) { |
