github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/net/ipv4/control_pktinfo.go (about)

     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  
     5  // +build darwin linux
     6  
     7  package ipv4
     8  
     9  import (
    10  	"syscall"
    11  	"unsafe"
    12  
    13  	"golang.org/x/net/internal/iana"
    14  )
    15  
    16  func marshalPacketInfo(b []byte, cm *ControlMessage) []byte {
    17  	m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
    18  	m.Level = iana.ProtocolIP
    19  	m.Type = sysIP_PKTINFO
    20  	m.SetLen(syscall.CmsgLen(sysSizeofInetPktinfo))
    21  	if cm != nil {
    22  		pi := (*sysInetPktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)]))
    23  		if ip := cm.Src.To4(); ip != nil {
    24  			copy(pi.Spec_dst[:], ip)
    25  		}
    26  		if cm.IfIndex > 0 {
    27  			pi.setIfindex(cm.IfIndex)
    28  		}
    29  	}
    30  	return b[syscall.CmsgSpace(sysSizeofInetPktinfo):]
    31  }
    32  
    33  func parsePacketInfo(cm *ControlMessage, b []byte) {
    34  	pi := (*sysInetPktinfo)(unsafe.Pointer(&b[0]))
    35  	cm.IfIndex = int(pi.Ifindex)
    36  	cm.Dst = pi.Addr[:]
    37  }