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.
5 // +build darwin dragonfly freebsd netbsd
11 func (m *RouteMessage) marshal() ([]byte, error) {
12 w, ok := wireFormats[m.Type]
14 return nil, errUnsupportedMessage
16 l := w.bodyOff + addrsSpace(m.Addrs)
18 nativeEndian.PutUint16(b[:2], uint16(l))
22 b[2] = byte(m.Version)
25 nativeEndian.PutUint32(b[8:12], uint32(m.Flags))
26 nativeEndian.PutUint16(b[4:6], uint16(m.Index))
27 nativeEndian.PutUint32(b[16:20], uint32(m.ID))
28 nativeEndian.PutUint32(b[20:24], uint32(m.Seq))
29 attrs, err := marshalAddrs(b[w.bodyOff:], m.Addrs)
34 nativeEndian.PutUint32(b[12:16], uint32(attrs))
39 func (w *wireFormat) parseRouteMessage(typ RIBType, b []byte) (Message, error) {
40 if len(b) < w.bodyOff {
41 return nil, errMessageTooShort
43 l := int(nativeEndian.Uint16(b[:2]))
45 return nil, errInvalidMessage
50 Flags: int(nativeEndian.Uint32(b[8:12])),
51 Index: int(nativeEndian.Uint16(b[4:6])),
52 ID: uintptr(nativeEndian.Uint32(b[16:20])),
53 Seq: int(nativeEndian.Uint32(b[20:24])),
57 errno := syscall.Errno(nativeEndian.Uint32(b[28:32]))
62 m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[w.bodyOff:])