github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/golang.org/x/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  // +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  }