...

Source file src/vendor/golang.org/x/net/route/interface_classic.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	// +build darwin dragonfly netbsd
     6	
     7	package route
     8	
     9	import "runtime"
    10	
    11	func (w *wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) {
    12		if len(b) < w.bodyOff {
    13			return nil, errMessageTooShort
    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&sysRTA_IFP == 0 {
    21			return nil, nil
    22		}
    23		m := &InterfaceMessage{
    24			Version: int(b[2]),
    25			Type:    int(b[3]),
    26			Addrs:   make([]Addr, sysRTAX_MAX),
    27			Flags:   int(nativeEndian.Uint32(b[8:12])),
    28			Index:   int(nativeEndian.Uint16(b[12:14])),
    29			extOff:  w.extOff,
    30			raw:     b[:l],
    31		}
    32		a, err := parseLinkAddr(b[w.bodyOff:])
    33		if err != nil {
    34			return nil, err
    35		}
    36		m.Addrs[sysRTAX_IFP] = a
    37		m.Name = a.(*LinkAddr).Name
    38		return m, nil
    39	}
    40	
    41	func (w *wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) {
    42		if len(b) < w.bodyOff {
    43			return nil, errMessageTooShort
    44		}
    45		l := int(nativeEndian.Uint16(b[:2]))
    46		if len(b) < l {
    47			return nil, errInvalidMessage
    48		}
    49		m := &InterfaceAddrMessage{
    50			Version: int(b[2]),
    51			Type:    int(b[3]),
    52			Flags:   int(nativeEndian.Uint32(b[8:12])),
    53			raw:     b[:l],
    54		}
    55		if runtime.GOOS == "netbsd" {
    56			m.Index = int(nativeEndian.Uint16(b[16:18]))
    57		} else {
    58			m.Index = int(nativeEndian.Uint16(b[12:14]))
    59		}
    60		var err error
    61		m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[w.bodyOff:])
    62		if err != nil {
    63			return nil, err
    64		}
    65		return m, nil
    66	}
    67	

View as plain text