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