blob: 9ed9773416f8b545269c619a4ef0bdd66c7e6983 [file] [log] [blame]
Mikio Hara38dcae42014-05-19 12:20:11 +09001// 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 Harac8c327c2016-10-03 18:44:56 +09005// +build darwin linux solaris
Mikio Hara38dcae42014-05-19 12:20:11 +09006
7package ipv4
8
9import (
10 "syscall"
11 "unsafe"
Mikio Harae5dac172014-10-07 06:35:16 +090012
Andrew Gerrandfbe893d2014-11-10 09:04:43 +110013 "golang.org/x/net/internal/iana"
Mikio Hara38dcae42014-05-19 12:20:11 +090014)
15
Mikio Haraedb50c02014-10-04 09:51:11 +090016func marshalPacketInfo(b []byte, cm *ControlMessage) []byte {
17 m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
Mikio Harae5dac172014-10-07 06:35:16 +090018 m.Level = iana.ProtocolIP
Mikio Haraedb50c02014-10-04 09:51:11 +090019 m.Type = sysIP_PKTINFO
Mikio Haraa14f4292016-10-07 12:20:41 +090020 m.SetLen(syscall.CmsgLen(sizeofInetPktinfo))
Mikio Haraedb50c02014-10-04 09:51:11 +090021 if cm != nil {
Mikio Haraa14f4292016-10-07 12:20:41 +090022 pi := (*inetPktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)]))
Mikio Hara38dcae42014-05-19 12:20:11 +090023 if ip := cm.Src.To4(); ip != nil {
Mikio Haraedb50c02014-10-04 09:51:11 +090024 copy(pi.Spec_dst[:], ip)
Mikio Hara38dcae42014-05-19 12:20:11 +090025 }
Mikio Hara75d3d532014-11-06 11:45:53 +090026 if cm.IfIndex > 0 {
Mikio Hara353547e2014-10-04 08:12:41 +090027 pi.setIfindex(cm.IfIndex)
Mikio Hara38dcae42014-05-19 12:20:11 +090028 }
29 }
Mikio Haraa14f4292016-10-07 12:20:41 +090030 return b[syscall.CmsgSpace(sizeofInetPktinfo):]
Mikio Haraedb50c02014-10-04 09:51:11 +090031}
32
33func parsePacketInfo(cm *ControlMessage, b []byte) {
Mikio Haraa14f4292016-10-07 12:20:41 +090034 pi := (*inetPktinfo)(unsafe.Pointer(&b[0]))
Mikio Haraedb50c02014-10-04 09:51:11 +090035 cm.IfIndex = int(pi.Ifindex)
36 cm.Dst = pi.Addr[:]
Mikio Hara38dcae42014-05-19 12:20:11 +090037}