github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/golang.org/x/net/route/route_openbsd.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 (m *RouteMessage) marshal() ([]byte, error) {
    10  	l := sizeofRtMsghdr + addrsSpace(m.Addrs)
    11  	b := make([]byte, l)
    12  	nativeEndian.PutUint16(b[:2], uint16(l))
    13  	if m.Version == 0 {
    14  		b[2] = sysRTM_VERSION
    15  	} else {
    16  		b[2] = byte(m.Version)
    17  	}
    18  	b[3] = byte(m.Type)
    19  	nativeEndian.PutUint16(b[4:6], uint16(sizeofRtMsghdr))
    20  	nativeEndian.PutUint32(b[16:20], uint32(m.Flags))
    21  	nativeEndian.PutUint16(b[6:8], uint16(m.Index))
    22  	nativeEndian.PutUint32(b[24:28], uint32(m.ID))
    23  	nativeEndian.PutUint32(b[28:32], uint32(m.Seq))
    24  	attrs, err := marshalAddrs(b[sizeofRtMsghdr:], m.Addrs)
    25  	if err != nil {
    26  		return nil, err
    27  	}
    28  	if attrs > 0 {
    29  		nativeEndian.PutUint32(b[12:16], uint32(attrs))
    30  	}
    31  	return b, nil
    32  }
    33  
    34  func (*wireFormat) parseRouteMessage(_ RIBType, b []byte) (Message, error) {
    35  	if len(b) < sizeofRtMsghdr {
    36  		return nil, errMessageTooShort
    37  	}
    38  	l := int(nativeEndian.Uint16(b[:2]))
    39  	if len(b) < l {
    40  		return nil, errInvalidMessage
    41  	}
    42  	m := &RouteMessage{
    43  		Version: int(b[2]),
    44  		Type:    int(b[3]),
    45  		Flags:   int(nativeEndian.Uint32(b[16:20])),
    46  		Index:   int(nativeEndian.Uint16(b[6:8])),
    47  		ID:      uintptr(nativeEndian.Uint32(b[24:28])),
    48  		Seq:     int(nativeEndian.Uint32(b[28:32])),
    49  		raw:     b[:l],
    50  	}
    51  	ll := int(nativeEndian.Uint16(b[4:6]))
    52  	if len(b) < ll {
    53  		return nil, errInvalidMessage
    54  	}
    55  	errno := syscall.Errno(nativeEndian.Uint32(b[32:36]))
    56  	if errno != 0 {
    57  		m.Err = errno
    58  	}
    59  	as, err := parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[ll:])
    60  	if err != nil {
    61  		return nil, err
    62  	}
    63  	m.Addrs = as
    64  	return m, nil
    65  }