...

Source file src/vendor/golang.org/x/net/route/interface_openbsd.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 route
     6	
     7	func (*wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) {
     8		if len(b) < 32 {
     9			return nil, errMessageTooShort
    10		}
    11		l := int(nativeEndian.Uint16(b[:2]))
    12		if len(b) < l {
    13			return nil, errInvalidMessage
    14		}
    15		attrs := uint(nativeEndian.Uint32(b[12:16]))
    16		if attrs&sysRTA_IFP == 0 {
    17			return nil, nil
    18		}
    19		m := &InterfaceMessage{
    20			Version: int(b[2]),
    21			Type:    int(b[3]),
    22			Flags:   int(nativeEndian.Uint32(b[16:20])),
    23			Index:   int(nativeEndian.Uint16(b[6:8])),
    24			Addrs:   make([]Addr, sysRTAX_MAX),
    25			raw:     b[:l],
    26		}
    27		ll := int(nativeEndian.Uint16(b[4:6]))
    28		if len(b) < ll {
    29			return nil, errInvalidMessage
    30		}
    31		a, err := parseLinkAddr(b[ll:])
    32		if err != nil {
    33			return nil, err
    34		}
    35		m.Addrs[sysRTAX_IFP] = a
    36		m.Name = a.(*LinkAddr).Name
    37		return m, nil
    38	}
    39	
    40	func (*wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) {
    41		if len(b) < 24 {
    42			return nil, errMessageTooShort
    43		}
    44		l := int(nativeEndian.Uint16(b[:2]))
    45		if len(b) < l {
    46			return nil, errInvalidMessage
    47		}
    48		bodyOff := int(nativeEndian.Uint16(b[4:6]))
    49		if len(b) < bodyOff {
    50			return nil, errInvalidMessage
    51		}
    52		m := &InterfaceAddrMessage{
    53			Version: int(b[2]),
    54			Type:    int(b[3]),
    55			Flags:   int(nativeEndian.Uint32(b[12:16])),
    56			Index:   int(nativeEndian.Uint16(b[6:8])),
    57			raw:     b[:l],
    58		}
    59		var err error
    60		m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[bodyOff:])
    61		if err != nil {
    62			return nil, err
    63		}
    64		return m, nil
    65	}
    66	
    67	func (*wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) {
    68		if len(b) < 26 {
    69			return nil, errMessageTooShort
    70		}
    71		l := int(nativeEndian.Uint16(b[:2]))
    72		if len(b) < l {
    73			return nil, errInvalidMessage
    74		}
    75		m := &InterfaceAnnounceMessage{
    76			Version: int(b[2]),
    77			Type:    int(b[3]),
    78			Index:   int(nativeEndian.Uint16(b[6:8])),
    79			What:    int(nativeEndian.Uint16(b[8:10])),
    80			raw:     b[:l],
    81		}
    82		for i := 0; i < 16; i++ {
    83			if b[10+i] != 0 {
    84				continue
    85			}
    86			m.Name = string(b[10 : 10+i])
    87			break
    88		}
    89		return m, nil
    90	}
    91	

View as plain text