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.
9 func (any
*anyMessage
) toRoutingMessage(b
[]byte) RoutingMessage
{
11 case RTM_ADD
, RTM_DELETE
, RTM_CHANGE
, RTM_GET
, RTM_LOSING
, RTM_REDIRECT
, RTM_MISS
, RTM_LOCK
, RTM_RESOLVE
:
12 p
:= (*RouteMessage
)(unsafe
.Pointer(any
))
13 // We don't support sockaddr_mpls for now.
14 p
.Header
.Addrs
&= RTA_DST | RTA_GATEWAY | RTA_NETMASK | RTA_GENMASK | RTA_IFA | RTA_IFP | RTA_BRD | RTA_AUTHOR
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
]}
20 p
:= (*InterfaceAnnounceMessage
)(unsafe
.Pointer(any
))
21 return &InterfaceAnnounceMessage
{Header
: p
.Header
}
22 case RTM_NEWADDR
, RTM_DELADDR
:
23 p
:= (*InterfaceAddrMessage
)(unsafe
.Pointer(any
))
24 return &InterfaceAddrMessage
{Header
: p
.Header
, Data
: b
[SizeofIfaMsghdr
:any
.Msglen
]}
25 case RTM_NEWMADDR
, RTM_DELMADDR
:
26 p
:= (*InterfaceMulticastAddrMessage
)(unsafe
.Pointer(any
))
27 return &InterfaceMulticastAddrMessage
{Header
: p
.Header
, Data
: b
[SizeofIfmaMsghdr
:any
.Msglen
]}
32 // InterfaceAnnounceMessage represents a routing message containing
33 // network interface arrival and departure information.
35 // Deprecated: Use golang.org/x/net/route instead.
36 type InterfaceAnnounceMessage
struct {
37 Header IfAnnounceMsghdr
40 func (m
*InterfaceAnnounceMessage
) sockaddr() ([]Sockaddr
, error
) { return nil, nil }
42 // InterfaceMulticastAddrMessage represents a routing message
43 // containing network interface address entries.
45 // Deprecated: Use golang.org/x/net/route instead.
46 type InterfaceMulticastAddrMessage
struct {
51 func (m
*InterfaceMulticastAddrMessage
) sockaddr() ([]Sockaddr
, error
) {
52 var sas
[RTAX_MAX
]Sockaddr
54 for i
:= uint(0); i
< RTAX_MAX
&& len(b
) >= minRoutingSockaddrLen
; i
++ {
55 if m
.Header
.Addrs
&(1<<i
) == 0 {
58 rsa
:= (*RawSockaddr
)(unsafe
.Pointer(&b
[0]))
61 sa
, err
:= parseSockaddrLink(b
)
66 b
= b
[rsaAlignOf(int(rsa
.Len
)):]
67 case AF_INET
, AF_INET6
:
68 sa
, err
:= parseSockaddrInet(b
, rsa
.Family
)
73 b
= b
[rsaAlignOf(int(rsa
.Len
)):]
75 sa
, l
, err
:= parseLinkLayerAddr(b
)