1
2
3
4
5
6
7 package routebsd
8
9
10 type Message interface {
11 message()
12 }
13
14
15
16 func parseRIB(b []byte) ([]Message, error) {
17 var msgs []Message
18 nmsgs, nskips := 0, 0
19 for len(b) > 4 {
20 nmsgs++
21 l := int(nativeEndian.Uint16(b[:2]))
22 if l == 0 {
23 return nil, errInvalidMessage
24 }
25 if len(b) < l {
26 return nil, errMessageTooShort
27 }
28 if b[2] != rtmVersion {
29 b = b[l:]
30 continue
31 }
32 if w, ok := wireFormats[int(b[3])]; !ok {
33 nskips++
34 } else {
35 m, err := w.parse(b[:l])
36 if err != nil {
37 return nil, err
38 }
39 if m == nil {
40 nskips++
41 } else {
42 msgs = append(msgs, m)
43 }
44 }
45 b = b[l:]
46 }
47
48
49 if nmsgs != len(msgs)+nskips {
50 return nil, errMessageMismatch
51 }
52 return msgs, nil
53 }
54
View as plain text