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