message.mx raw

   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  
   7  package routebsd
   8  
   9  // A Message represents a routing message.
  10  type Message interface {
  11  	message()
  12  }
  13  
  14  // parseRIB parses b as a routing information base and returns a list
  15  // of routing messages.
  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  	// We failed to parse any of the messages - version mismatch?
  49  	if nmsgs != len(msgs)+nskips {
  50  		return nil, errMessageMismatch
  51  	}
  52  	return msgs, nil
  53  }
  54