control_bsd.go 1010 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. // Copyright 2012 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. // +build darwin dragonfly freebsd netbsd openbsd
  5. package ipv4
  6. import (
  7. "net"
  8. "syscall"
  9. "unsafe"
  10. )
  11. func marshalDst(b []byte, cm *ControlMessage) []byte {
  12. m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
  13. m.Level = ianaProtocolIP
  14. m.Type = sysIP_RECVDSTADDR
  15. m.SetLen(syscall.CmsgLen(net.IPv4len))
  16. return b[syscall.CmsgSpace(net.IPv4len):]
  17. }
  18. func parseDst(cm *ControlMessage, b []byte) {
  19. cm.Dst = b[:net.IPv4len]
  20. }
  21. func marshalInterface(b []byte, cm *ControlMessage) []byte {
  22. m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
  23. m.Level = ianaProtocolIP
  24. m.Type = sysIP_RECVIF
  25. m.SetLen(syscall.CmsgLen(syscall.SizeofSockaddrDatalink))
  26. return b[syscall.CmsgSpace(syscall.SizeofSockaddrDatalink):]
  27. }
  28. func parseInterface(cm *ControlMessage, b []byte) {
  29. sadl := (*syscall.SockaddrDatalink)(unsafe.Pointer(&b[0]))
  30. cm.IfIndex = int(sadl.Index)
  31. }