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