golang.org/x/net@v0.25.1-0.20240516223405-c87a5b62e243/route/interface_freebsd.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  package route
     6  
     7  import "syscall"
     8  
     9  func (w *wireFormat) parseInterfaceMessage(typ RIBType, b []byte) (Message, error) {
    10  	var extOff, bodyOff int
    11  	if typ == syscall.NET_RT_IFLISTL {
    12  		if len(b) < 20 {
    13  			return nil, errMessageTooShort
    14  		}
    15  		extOff = int(nativeEndian.Uint16(b[18:20]))
    16  		bodyOff = int(nativeEndian.Uint16(b[16:18]))
    17  	} else {
    18  		extOff = w.extOff
    19  		bodyOff = w.bodyOff
    20  	}
    21  	if len(b) < extOff || len(b) < bodyOff {
    22  		return nil, errInvalidMessage
    23  	}
    24  	l := int(nativeEndian.Uint16(b[:2]))
    25  	if len(b) < l {
    26  		return nil, errInvalidMessage
    27  	}
    28  	attrs := uint(nativeEndian.Uint32(b[4:8]))
    29  	if attrs&syscall.RTA_IFP == 0 {
    30  		return nil, nil
    31  	}
    32  	m := &InterfaceMessage{
    33  		Version: int(b[2]),
    34  		Type:    int(b[3]),
    35  		Flags:   int(nativeEndian.Uint32(b[8:12])),
    36  		Index:   int(nativeEndian.Uint16(b[12:14])),
    37  		Addrs:   make([]Addr, syscall.RTAX_MAX),
    38  		extOff:  extOff,
    39  		raw:     b[:l],
    40  	}
    41  	a, err := parseLinkAddr(b[bodyOff:])
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  	m.Addrs[syscall.RTAX_IFP] = a
    46  	m.Name = a.(*LinkAddr).Name
    47  	return m, nil
    48  }
    49  
    50  func (w *wireFormat) parseInterfaceAddrMessage(typ RIBType, b []byte) (Message, error) {
    51  	var bodyOff int
    52  	if typ == syscall.NET_RT_IFLISTL {
    53  		if len(b) < 24 {
    54  			return nil, errMessageTooShort
    55  		}
    56  		bodyOff = int(nativeEndian.Uint16(b[16:18]))
    57  	} else {
    58  		bodyOff = w.bodyOff
    59  	}
    60  	if len(b) < bodyOff {
    61  		return nil, errInvalidMessage
    62  	}
    63  	l := int(nativeEndian.Uint16(b[:2]))
    64  	if len(b) < l {
    65  		return nil, errInvalidMessage
    66  	}
    67  	m := &InterfaceAddrMessage{
    68  		Version: int(b[2]),
    69  		Type:    int(b[3]),
    70  		Flags:   int(nativeEndian.Uint32(b[8:12])),
    71  		Index:   int(nativeEndian.Uint16(b[12:14])),
    72  		raw:     b[:l],
    73  	}
    74  	var err error
    75  	m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[bodyOff:])
    76  	if err != nil {
    77  		return nil, err
    78  	}
    79  	return m, nil
    80  }