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