github.com/Andyfoo/golang/x/net@v0.0.0-20190901054642-57c1bf301704/route/message.go (about) 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. 4 5 // +build darwin dragonfly freebsd netbsd openbsd 6 7 package route 8 9 // A Message represents a routing message. 10 type Message interface { 11 // Sys returns operating system-specific information. 12 Sys() []Sys 13 } 14 15 // A Sys reprensents operating system-specific information. 16 type Sys interface { 17 // SysType returns a type of operating system-specific 18 // information. 19 SysType() SysType 20 } 21 22 // A SysType represents a type of operating system-specific 23 // information. 24 type SysType int 25 26 const ( 27 SysMetrics SysType = iota 28 SysStats 29 ) 30 31 // ParseRIB parses b as a routing information base and returns a list 32 // of routing messages. 33 func ParseRIB(typ RIBType, b []byte) ([]Message, error) { 34 if !typ.parseable() { 35 return nil, errUnsupportedMessage 36 } 37 var msgs []Message 38 nmsgs, nskips := 0, 0 39 for len(b) > 4 { 40 nmsgs++ 41 l := int(nativeEndian.Uint16(b[:2])) 42 if l == 0 { 43 return nil, errInvalidMessage 44 } 45 if len(b) < l { 46 return nil, errMessageTooShort 47 } 48 if b[2] != sysRTM_VERSION { 49 b = b[l:] 50 continue 51 } 52 if w, ok := wireFormats[int(b[3])]; !ok { 53 nskips++ 54 } else { 55 m, err := w.parse(typ, b) 56 if err != nil { 57 return nil, err 58 } 59 if m == nil { 60 nskips++ 61 } else { 62 msgs = append(msgs, m) 63 } 64 } 65 b = b[l:] 66 } 67 // We failed to parse any of the messages - version mismatch? 68 if nmsgs != len(msgs)+nskips { 69 return nil, errMessageMismatch 70 } 71 return msgs, nil 72 }