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