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.
4
5package syscall
6
7import "unsafe"
8
9func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage {
10	switch any.Type {
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		return &RouteMessage{Header: p.Header, Data: b[SizeofRtMsghdr:any.Msglen]}
14	case RTM_IFINFO:
15		p := (*InterfaceMessage)(unsafe.Pointer(any))
16		return &InterfaceMessage{Header: p.Header, Data: b[SizeofIfMsghdr:any.Msglen]}
17	case RTM_NEWADDR, RTM_DELADDR:
18		p := (*InterfaceAddrMessage)(unsafe.Pointer(any))
19		return &InterfaceAddrMessage{Header: p.Header, Data: b[SizeofIfaMsghdr:any.Msglen]}
20	case RTM_NEWMADDR2, RTM_DELMADDR:
21		p := (*InterfaceMulticastAddrMessage)(unsafe.Pointer(any))
22		return &InterfaceMulticastAddrMessage{Header: p.Header, Data: b[SizeofIfmaMsghdr2:any.Msglen]}
23	}
24	return nil
25}
26
27// InterfaceMulticastAddrMessage represents a routing message
28// containing network interface address entries.
29//
30// Deprecated: Use golang.org/x/net/route instead.
31type InterfaceMulticastAddrMessage struct {
32	Header IfmaMsghdr2
33	Data   []byte
34}
35
36func (m *InterfaceMulticastAddrMessage) sockaddr() ([]Sockaddr, error) {
37	var sas [RTAX_MAX]Sockaddr
38	b := m.Data[:]
39	for i := uint(0); i < RTAX_MAX && len(b) >= minRoutingSockaddrLen; i++ {
40		if m.Header.Addrs&(1<<i) == 0 {
41			continue
42		}
43		rsa := (*RawSockaddr)(unsafe.Pointer(&b[0]))
44		switch rsa.Family {
45		case AF_LINK:
46			sa, err := parseSockaddrLink(b)
47			if err != nil {
48				return nil, err
49			}
50			sas[i] = sa
51			b = b[rsaAlignOf(int(rsa.Len)):]
52		case AF_INET, AF_INET6:
53			sa, err := parseSockaddrInet(b, rsa.Family)
54			if err != nil {
55				return nil, err
56			}
57			sas[i] = sa
58			b = b[rsaAlignOf(int(rsa.Len)):]
59		default:
60			sa, l, err := parseLinkLayerAddr(b)
61			if err != nil {
62				return nil, err
63			}
64			sas[i] = sa
65			b = b[l:]
66		}
67	}
68	return sas[:], nil
69}
70