Dmitri Shuralyov | 5d99779 | 2016-11-07 15:05:57 -0800 | [diff] [blame] | 1 | // Copyright 2013 The Go Authors. All rights reserved. |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Mikio Hara | b27e68b | 2013-11-06 21:33:49 +0900 | [diff] [blame] | 5 | // +build darwin |
| 6 | |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 7 | package ipv6 |
| 8 | |
| 9 | import ( |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 10 | "unsafe" |
Mikio Hara | 66b3e5e | 2014-11-09 20:14:52 +0900 | [diff] [blame] | 11 | |
Andrew Gerrand | fbe893d | 2014-11-10 09:04:43 +1100 | [diff] [blame] | 12 | "golang.org/x/net/internal/iana" |
Mikio Hara | 48359f4 | 2017-03-18 18:30:21 +0900 | [diff] [blame] | 13 | "golang.org/x/net/internal/socket" |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 14 | ) |
| 15 | |
Mikio Hara | 4d78cbe | 2014-11-06 10:47:59 +0900 | [diff] [blame] | 16 | func marshal2292HopLimit(b []byte, cm *ControlMessage) []byte { |
Mikio Hara | 48359f4 | 2017-03-18 18:30:21 +0900 | [diff] [blame] | 17 | m := socket.ControlMessage(b) |
| 18 | m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292HOPLIMIT, 4) |
Mikio Hara | 4d78cbe | 2014-11-06 10:47:59 +0900 | [diff] [blame] | 19 | if cm != nil { |
Mikio Hara | 454122b | 2017-06-21 05:31:43 +0900 | [diff] [blame] | 20 | socket.NativeEndian.PutUint32(m.Data(4), uint32(cm.HopLimit)) |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 21 | } |
Mikio Hara | 48359f4 | 2017-03-18 18:30:21 +0900 | [diff] [blame] | 22 | return m.Next(4) |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 23 | } |
| 24 | |
Mikio Hara | 4d78cbe | 2014-11-06 10:47:59 +0900 | [diff] [blame] | 25 | func marshal2292PacketInfo(b []byte, cm *ControlMessage) []byte { |
Mikio Hara | 48359f4 | 2017-03-18 18:30:21 +0900 | [diff] [blame] | 26 | m := socket.ControlMessage(b) |
| 27 | m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292PKTINFO, sizeofInet6Pktinfo) |
Mikio Hara | 4d78cbe | 2014-11-06 10:47:59 +0900 | [diff] [blame] | 28 | if cm != nil { |
Mikio Hara | 48359f4 | 2017-03-18 18:30:21 +0900 | [diff] [blame] | 29 | pi := (*inet6Pktinfo)(unsafe.Pointer(&m.Data(sizeofInet6Pktinfo)[0])) |
Mikio Hara | 4d78cbe | 2014-11-06 10:47:59 +0900 | [diff] [blame] | 30 | if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { |
| 31 | copy(pi.Addr[:], ip) |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 32 | } |
Mikio Hara | 4d78cbe | 2014-11-06 10:47:59 +0900 | [diff] [blame] | 33 | if cm.IfIndex > 0 { |
| 34 | pi.setIfindex(cm.IfIndex) |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 35 | } |
| 36 | } |
Mikio Hara | 48359f4 | 2017-03-18 18:30:21 +0900 | [diff] [blame] | 37 | return m.Next(sizeofInet6Pktinfo) |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 38 | } |
| 39 | |
Mikio Hara | 4d78cbe | 2014-11-06 10:47:59 +0900 | [diff] [blame] | 40 | func marshal2292NextHop(b []byte, cm *ControlMessage) []byte { |
Mikio Hara | 48359f4 | 2017-03-18 18:30:21 +0900 | [diff] [blame] | 41 | m := socket.ControlMessage(b) |
| 42 | m.MarshalHeader(iana.ProtocolIPv6, sysIPV6_2292NEXTHOP, sizeofSockaddrInet6) |
Mikio Hara | 4d78cbe | 2014-11-06 10:47:59 +0900 | [diff] [blame] | 43 | if cm != nil { |
Mikio Hara | 48359f4 | 2017-03-18 18:30:21 +0900 | [diff] [blame] | 44 | sa := (*sockaddrInet6)(unsafe.Pointer(&m.Data(sizeofSockaddrInet6)[0])) |
Mikio Hara | 4d78cbe | 2014-11-06 10:47:59 +0900 | [diff] [blame] | 45 | sa.setSockaddr(cm.NextHop, cm.IfIndex) |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 46 | } |
Mikio Hara | 48359f4 | 2017-03-18 18:30:21 +0900 | [diff] [blame] | 47 | return m.Next(sizeofSockaddrInet6) |
Mikio Hara | cdfc4ce | 2013-06-04 17:42:58 +0900 | [diff] [blame] | 48 | } |