golang.org/x/net@v0.25.1-0.20240516223405-c87a5b62e243/ipv6/control_rfc2292_unix.go (about) 1 // Copyright 2013 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 6 7 package ipv6 8 9 import ( 10 "unsafe" 11 12 "golang.org/x/net/internal/iana" 13 "golang.org/x/net/internal/socket" 14 15 "golang.org/x/sys/unix" 16 ) 17 18 func marshal2292HopLimit(b []byte, cm *ControlMessage) []byte { 19 m := socket.ControlMessage(b) 20 m.MarshalHeader(iana.ProtocolIPv6, unix.IPV6_2292HOPLIMIT, 4) 21 if cm != nil { 22 socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) 23 } 24 return m.Next(4) 25 } 26 27 func marshal2292PacketInfo(b []byte, cm *ControlMessage) []byte { 28 m := socket.ControlMessage(b) 29 m.MarshalHeader(iana.ProtocolIPv6, unix.IPV6_2292PKTINFO, sizeofInet6Pktinfo) 30 if cm != nil { 31 pi := (*inet6Pktinfo)(unsafe.Pointer(&m.Data(sizeofInet6Pktinfo)[0])) 32 if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { 33 copy(pi.Addr[:], ip) 34 } 35 if cm.IfIndex > 0 { 36 pi.setIfindex(cm.IfIndex) 37 } 38 } 39 return m.Next(sizeofInet6Pktinfo) 40 } 41 42 func marshal2292NextHop(b []byte, cm *ControlMessage) []byte { 43 m := socket.ControlMessage(b) 44 m.MarshalHeader(iana.ProtocolIPv6, unix.IPV6_2292NEXTHOP, sizeofSockaddrInet6) 45 if cm != nil { 46 sa := (*sockaddrInet6)(unsafe.Pointer(&m.Data(sizeofSockaddrInet6)[0])) 47 sa.setSockaddr(cm.NextHop, cm.IfIndex) 48 } 49 return m.Next(sizeofSockaddrInet6) 50 }