1
2
3
4
5 package routebsd
6
7 import "syscall"
8
9 func (*wireFormat) parseInterfaceMessage(b []byte) (Message, error) {
10 if len(b) < 32 {
11 return nil, errMessageTooShort
12 }
13 l := int(nativeEndian.Uint16(b[:2]))
14 if len(b) < l {
15 return nil, errInvalidMessage
16 }
17 attrs := uint(nativeEndian.Uint32(b[12:16]))
18 if attrs&syscall.RTA_IFP == 0 {
19 return nil, nil
20 }
21 m := &InterfaceMessage{
22 Version: int(b[2]),
23 Type: int(b[3]),
24 Flags: int(nativeEndian.Uint32(b[16:20])),
25 Index: int(nativeEndian.Uint16(b[6:8])),
26 Addrs: make([]Addr, syscall.RTAX_MAX),
27 raw: b[:l],
28 }
29 ll := int(nativeEndian.Uint16(b[4:6]))
30 if len(b) < ll {
31 return nil, errInvalidMessage
32 }
33 a, err := parseLinkAddr(b[ll:])
34 if err != nil {
35 return nil, err
36 }
37 m.Addrs[syscall.RTAX_IFP] = a
38 m.Name = a.(*LinkAddr).Name
39 return m, nil
40 }
41
42 func (*wireFormat) parseInterfaceAddrMessage(b []byte) (Message, error) {
43 if len(b) < 24 {
44 return nil, errMessageTooShort
45 }
46 l := int(nativeEndian.Uint16(b[:2]))
47 if len(b) < l {
48 return nil, errInvalidMessage
49 }
50 bodyOff := int(nativeEndian.Uint16(b[4:6]))
51 if len(b) < bodyOff {
52 return nil, errInvalidMessage
53 }
54 m := &InterfaceAddrMessage{
55 Version: int(b[2]),
56 Type: int(b[3]),
57 Flags: int(nativeEndian.Uint32(b[12:16])),
58 Index: int(nativeEndian.Uint16(b[6:8])),
59 raw: b[:l],
60 }
61 var err error
62 m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), b[bodyOff:])
63 if err != nil {
64 return nil, err
65 }
66 return m, nil
67 }
68
View as plain text