1 // Copyright 2011 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // Routing sockets and messages for Darwin
11 func (any
*anyMessage
) toRoutingMessage(b
[]byte) RoutingMessage
{
13 case RTM_ADD
, RTM_DELETE
, RTM_CHANGE
, RTM_GET
, RTM_LOSING
, RTM_REDIRECT
, RTM_MISS
, RTM_LOCK
, RTM_RESOLVE
:
14 p
:= (*RouteMessage
)(unsafe
.Pointer(any
))
15 return &RouteMessage
{Header
: p
.Header
, Data
: b
[SizeofRtMsghdr
:any
.Msglen
]}
17 p
:= (*InterfaceMessage
)(unsafe
.Pointer(any
))
18 return &InterfaceMessage
{Header
: p
.Header
, Data
: b
[SizeofIfMsghdr
:any
.Msglen
]}
19 case RTM_NEWADDR
, RTM_DELADDR
:
20 p
:= (*InterfaceAddrMessage
)(unsafe
.Pointer(any
))
21 return &InterfaceAddrMessage
{Header
: p
.Header
, Data
: b
[SizeofIfaMsghdr
:any
.Msglen
]}
22 case RTM_NEWMADDR2
, RTM_DELMADDR
:
23 p
:= (*InterfaceMulticastAddrMessage
)(unsafe
.Pointer(any
))
24 return &InterfaceMulticastAddrMessage
{Header
: p
.Header
, Data
: b
[SizeofIfmaMsghdr2
:any
.Msglen
]}
29 // InterfaceMulticastAddrMessage represents a routing message
30 // containing network interface address entries.
31 type InterfaceMulticastAddrMessage
struct {
36 const rtaIfmaMask
= RTA_GATEWAY | RTA_IFP | RTA_IFA
38 func (m
*InterfaceMulticastAddrMessage
) sockaddr() (sas
[]Sockaddr
) {
39 if m
.Header
.Addrs
&rtaIfmaMask
== 0 {
43 for i
:= uint(0); i
< RTAX_MAX
; i
++ {
44 if m
.Header
.Addrs
&rtaIfmaMask
&(1<<i
) == 0 {
47 rsa
:= (*RawSockaddr
)(unsafe
.Pointer(&b
[0]))
50 sa
, e
:= anyToSockaddr((*RawSockaddrAny
)(unsafe
.Pointer(rsa
)))
55 case RTAX_GATEWAY
, RTAX_IFP
:
58 b
= b
[rsaAlignOf(int(rsa
.Len
)):]