1
2
3
4
5 package route
6
7 func (*wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) {
8 if len(b) < 32 {
9 return nil, errMessageTooShort
10 }
11 l := int(nativeEndian.Uint16(b[:2]))
12 if len(b) < l {
13 return nil, errInvalidMessage
14 }
15 attrs := uint(nativeEndian.Uint32(b[12:16]))
16 if attrs&sysRTA_IFP == 0 {
17 return nil, nil
18 }
19 m := &InterfaceMessage{
20 Version: int(b[2]),
21 Type: int(b[3]),
22 Flags: int(nativeEndian.Uint32(b[16:20])),
23 Index: int(nativeEndian.Uint16(b[6:8])),
24 Addrs: make([]Addr, sysRTAX_MAX),
25 raw: b[:l],
26 }
27 ll := int(nativeEndian.Uint16(b[4:6]))
28 if len(b) < ll {
29 return nil, errInvalidMessage
30 }
31 a, err := parseLinkAddr(b[ll:])
32 if err != nil {
33 return nil, err
34 }
35 m.Addrs[sysRTAX_IFP] = a
36 m.Name = a.(*LinkAddr).Name
37 return m, nil
38 }
39
40 func (*wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) {
41 if len(b) < 24 {
42 return nil, errMessageTooShort
43 }
44 l := int(nativeEndian.Uint16(b[:2]))
45 if len(b) < l {
46 return nil, errInvalidMessage
47 }
48 bodyOff := int(nativeEndian.Uint16(b[4:6]))
49 if len(b) < bodyOff {
50 return nil, errInvalidMessage
51 }
52 m := &InterfaceAddrMessage{
53 Version: int(b[2]),
54 Type: int(b[3]),
55 Flags: int(nativeEndian.Uint32(b[12:16])),
56 Index: int(nativeEndian.Uint16(b[6:8])),
57 raw: b[:l],
58 }
59 var err error
60 m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[bodyOff:])
61 if err != nil {
62 return nil, err
63 }
64 return m, nil
65 }
66
67 func (*wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) {
68 if len(b) < 26 {
69 return nil, errMessageTooShort
70 }
71 l := int(nativeEndian.Uint16(b[:2]))
72 if len(b) < l {
73 return nil, errInvalidMessage
74 }
75 m := &InterfaceAnnounceMessage{
76 Version: int(b[2]),
77 Type: int(b[3]),
78 Index: int(nativeEndian.Uint16(b[6:8])),
79 What: int(nativeEndian.Uint16(b[8:10])),
80 raw: b[:l],
81 }
82 for i := 0; i < 16; i++ {
83 if b[10+i] != 0 {
84 continue
85 }
86 m.Name = string(b[10 : 10+i])
87 break
88 }
89 return m, nil
90 }
91
View as plain text