OSDN Git Service

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