1 // Copyright 2016 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.
7 func (w *wireFormat) parseInterfaceMessage(typ RIBType, b []byte) (Message, error) {
8 var extOff, bodyOff int
9 if typ == sysNET_RT_IFLISTL {
11 return nil, errMessageTooShort
13 extOff = int(nativeEndian.Uint16(b[18:20]))
14 bodyOff = int(nativeEndian.Uint16(b[16:18]))
19 if len(b) < extOff || len(b) < bodyOff {
20 return nil, errInvalidMessage
22 l := int(nativeEndian.Uint16(b[:2]))
24 return nil, errInvalidMessage
26 attrs := uint(nativeEndian.Uint32(b[4:8]))
27 if attrs&sysRTA_IFP == 0 {
30 m := &InterfaceMessage{
33 Flags: int(nativeEndian.Uint32(b[8:12])),
34 Index: int(nativeEndian.Uint16(b[12:14])),
35 Addrs: make([]Addr, sysRTAX_MAX),
39 a, err := parseLinkAddr(b[bodyOff:])
43 m.Addrs[sysRTAX_IFP] = a
44 m.Name = a.(*LinkAddr).Name
48 func (w *wireFormat) parseInterfaceAddrMessage(typ RIBType, b []byte) (Message, error) {
50 if typ == sysNET_RT_IFLISTL {
52 return nil, errMessageTooShort
54 bodyOff = int(nativeEndian.Uint16(b[16:18]))
59 return nil, errInvalidMessage
61 l := int(nativeEndian.Uint16(b[:2]))
63 return nil, errInvalidMessage
65 m := &InterfaceAddrMessage{
68 Flags: int(nativeEndian.Uint32(b[8:12])),
69 Index: int(nativeEndian.Uint16(b[12:14])),
73 m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[bodyOff:])