Mikio Hara | 38dcae4 | 2014-05-19 12:20:11 +0900 | [diff] [blame] | 1 | // Copyright 2014 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 | |
Mikio Hara | c8c327c | 2016-10-03 18:44:56 +0900 | [diff] [blame] | 5 | // +build darwin linux solaris |
Mikio Hara | 38dcae4 | 2014-05-19 12:20:11 +0900 | [diff] [blame] | 6 | |
| 7 | package ipv4 |
| 8 | |
| 9 | import ( |
| 10 | "syscall" |
| 11 | "unsafe" |
Mikio Hara | e5dac17 | 2014-10-07 06:35:16 +0900 | [diff] [blame] | 12 | |
Andrew Gerrand | fbe893d | 2014-11-10 09:04:43 +1100 | [diff] [blame] | 13 | "golang.org/x/net/internal/iana" |
Mikio Hara | 38dcae4 | 2014-05-19 12:20:11 +0900 | [diff] [blame] | 14 | ) |
| 15 | |
Mikio Hara | edb50c0 | 2014-10-04 09:51:11 +0900 | [diff] [blame] | 16 | func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { |
| 17 | m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) |
Mikio Hara | e5dac17 | 2014-10-07 06:35:16 +0900 | [diff] [blame] | 18 | m.Level = iana.ProtocolIP |
Mikio Hara | edb50c0 | 2014-10-04 09:51:11 +0900 | [diff] [blame] | 19 | m.Type = sysIP_PKTINFO |
Mikio Hara | a14f429 | 2016-10-07 12:20:41 +0900 | [diff] [blame] | 20 | m.SetLen(syscall.CmsgLen(sizeofInetPktinfo)) |
Mikio Hara | edb50c0 | 2014-10-04 09:51:11 +0900 | [diff] [blame] | 21 | if cm != nil { |
Mikio Hara | a14f429 | 2016-10-07 12:20:41 +0900 | [diff] [blame] | 22 | pi := (*inetPktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) |
Mikio Hara | 38dcae4 | 2014-05-19 12:20:11 +0900 | [diff] [blame] | 23 | if ip := cm.Src.To4(); ip != nil { |
Mikio Hara | edb50c0 | 2014-10-04 09:51:11 +0900 | [diff] [blame] | 24 | copy(pi.Spec_dst[:], ip) |
Mikio Hara | 38dcae4 | 2014-05-19 12:20:11 +0900 | [diff] [blame] | 25 | } |
Mikio Hara | 75d3d53 | 2014-11-06 11:45:53 +0900 | [diff] [blame] | 26 | if cm.IfIndex > 0 { |
Mikio Hara | 353547e | 2014-10-04 08:12:41 +0900 | [diff] [blame] | 27 | pi.setIfindex(cm.IfIndex) |
Mikio Hara | 38dcae4 | 2014-05-19 12:20:11 +0900 | [diff] [blame] | 28 | } |
| 29 | } |
Mikio Hara | a14f429 | 2016-10-07 12:20:41 +0900 | [diff] [blame] | 30 | return b[syscall.CmsgSpace(sizeofInetPktinfo):] |
Mikio Hara | edb50c0 | 2014-10-04 09:51:11 +0900 | [diff] [blame] | 31 | } |
| 32 | |
| 33 | func parsePacketInfo(cm *ControlMessage, b []byte) { |
Mikio Hara | a14f429 | 2016-10-07 12:20:41 +0900 | [diff] [blame] | 34 | pi := (*inetPktinfo)(unsafe.Pointer(&b[0])) |
Mikio Hara | edb50c0 | 2014-10-04 09:51:11 +0900 | [diff] [blame] | 35 | cm.IfIndex = int(pi.Ifindex) |
| 36 | cm.Dst = pi.Addr[:] |
Mikio Hara | 38dcae4 | 2014-05-19 12:20:11 +0900 | [diff] [blame] | 37 | } |