Source file src/internal/routebsd/interface_freebsd.go

     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  package routebsd
     6  
     7  import "syscall"
     8  
     9  func (w *wireFormat) parseInterfaceMessage(b []byte) (Message, error) {
    10  	extOff := w.extOff
    11  	bodyOff := w.bodyOff
    12  	if len(b) < extOff || len(b) < bodyOff {
    13  		return nil, errInvalidMessage
    14  	}
    15  	l := int(nativeEndian.Uint16(b[:2]))
    16  	if len(b) < l {
    17  		return nil, errInvalidMessage
    18  	}
    19  	attrs := uint(nativeEndian.Uint32(b[4:8]))
    20  	if attrs&syscall.RTA_IFP == 0 {
    21  		return nil, nil
    22  	}
    23  	m := &InterfaceMessage{
    24  		Version: int(b[2]),
    25  		Type:    int(b[3]),
    26  		Flags:   int(nativeEndian.Uint32(b[8:12])),
    27  		Index:   int(nativeEndian.Uint16(b[12:14])),
    28  		Addrs:   make([]Addr, syscall.RTAX_MAX),
    29  		extOff:  extOff,
    30  		raw:     b[:l],
    31  	}
    32  	a, err := parseLinkAddr(b[bodyOff:])
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  	m.Addrs[syscall.RTAX_IFP] = a
    37  	m.Name = a.(*LinkAddr).Name
    38  	return m, nil
    39  }
    40  
    41  func (w *wireFormat) parseInterfaceAddrMessage(b []byte) (Message, error) {
    42  	bodyOff := w.bodyOff
    43  	if len(b) < bodyOff {
    44  		return nil, errInvalidMessage
    45  	}
    46  	l := int(nativeEndian.Uint16(b[:2]))
    47  	if len(b) < l {
    48  		return nil, errInvalidMessage
    49  	}
    50  	m := &InterfaceAddrMessage{
    51  		Version: int(b[2]),
    52  		Type:    int(b[3]),
    53  		Flags:   int(nativeEndian.Uint32(b[8:12])),
    54  		Index:   int(nativeEndian.Uint16(b[12:14])),
    55  		raw:     b[:l],
    56  	}
    57  	var err error
    58  	m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), b[bodyOff:])
    59  	if err != nil {
    60  		return nil, err
    61  	}
    62  	return m, nil
    63  }
    64  

View as plain text