blob: 9fd9eb15e3bc4f2d946b6059f5cff3e162fc03ea [file] [log] [blame]
Dmitri Shuralyov5d997792016-11-07 15:05:57 -08001// Copyright 2013 The Go Authors. All rights reserved.
Mikio Haracdfc4ce2013-06-04 17:42:58 +09002// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Mikio Harab27e68b2013-11-06 21:33:49 +09005// +build darwin
6
Mikio Haracdfc4ce2013-06-04 17:42:58 +09007package ipv6
8
9import (
Mikio Haracdfc4ce2013-06-04 17:42:58 +090010 "unsafe"
Mikio Hara66b3e5e2014-11-09 20:14:52 +090011
Andrew Gerrandfbe893d2014-11-10 09:04:43 +110012 "golang.org/x/net/internal/iana"
Mikio Hara48359f42017-03-18 18:30:21 +090013 "golang.org/x/net/internal/socket"
Mikio Haracdfc4ce2013-06-04 17:42:58 +090014)
15
Mikio Hara4d78cbe2014-11-06 10:47:59 +090016func marshal2292HopLimit(b []byte, cm *ControlMessage) []byte {
Mikio Hara48359f42017-03-18 18:30:21 +090017 m := socket.ControlMessage(b)
18 m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292HOPLIMIT, 4)
Mikio Hara4d78cbe2014-11-06 10:47:59 +090019 if cm != nil {
Mikio Hara454122b2017-06-21 05:31:43 +090020 socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit))
Mikio Haracdfc4ce2013-06-04 17:42:58 +090021 }
Mikio Hara48359f42017-03-18 18:30:21 +090022 return m.Next(4)
Mikio Haracdfc4ce2013-06-04 17:42:58 +090023}
24
Mikio Hara4d78cbe2014-11-06 10:47:59 +090025func marshal2292PacketInfo(b []byte, cm *ControlMessage) []byte {
Mikio Hara48359f42017-03-18 18:30:21 +090026 m := socket.ControlMessage(b)
27 m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292PKTINFO, sizeofInet6Pktinfo)
Mikio Hara4d78cbe2014-11-06 10:47:59 +090028 if cm != nil {
Mikio Hara48359f42017-03-18 18:30:21 +090029 pi := (*inet6Pktinfo)(unsafe.Pointer(&m.Data(sizeofInet6Pktinfo)[0]))
Mikio Hara4d78cbe2014-11-06 10:47:59 +090030 if ip := cm.Src.To16(); ip != nil && ip.To4() == nil {
31 copy(pi.Addr[:], ip)
Mikio Haracdfc4ce2013-06-04 17:42:58 +090032 }
Mikio Hara4d78cbe2014-11-06 10:47:59 +090033 if cm.IfIndex > 0 {
34 pi.setIfindex(cm.IfIndex)
Mikio Haracdfc4ce2013-06-04 17:42:58 +090035 }
36 }
Mikio Hara48359f42017-03-18 18:30:21 +090037 return m.Next(sizeofInet6Pktinfo)
Mikio Haracdfc4ce2013-06-04 17:42:58 +090038}
39
Mikio Hara4d78cbe2014-11-06 10:47:59 +090040func marshal2292NextHop(b []byte, cm *ControlMessage) []byte {
Mikio Hara48359f42017-03-18 18:30:21 +090041 m := socket.ControlMessage(b)
42 m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292NEXTHOP, sizeofSockaddrInet6)
Mikio Hara4d78cbe2014-11-06 10:47:59 +090043 if cm != nil {
Mikio Hara48359f42017-03-18 18:30:21 +090044 sa := (*sockaddrInet6)(unsafe.Pointer(&m.Data(sizeofSockaddrInet6)[0]))
Mikio Hara4d78cbe2014-11-06 10:47:59 +090045 sa.setSockaddr(cm.NextHop, cm.IfIndex)
Mikio Haracdfc4ce2013-06-04 17:42:58 +090046 }
Mikio Hara48359f42017-03-18 18:30:21 +090047 return m.Next(sizeofSockaddrInet6)
Mikio Haracdfc4ce2013-06-04 17:42:58 +090048}