udp_linux_64.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // +build linux
  2. // +build amd64 arm64 ppc64 ppc64le mips64 mips64le s390x
  3. // +build !android
  4. package nebula
  5. import (
  6. "golang.org/x/sys/unix"
  7. )
  8. type iovec struct {
  9. Base *byte
  10. Len uint64
  11. }
  12. type msghdr struct {
  13. Name *byte
  14. Namelen uint32
  15. Pad0 [4]byte
  16. Iov *iovec
  17. Iovlen uint64
  18. Control *byte
  19. Controllen uint64
  20. Flags int32
  21. Pad1 [4]byte
  22. }
  23. type rawMessage struct {
  24. Hdr msghdr
  25. Len uint32
  26. Pad0 [4]byte
  27. }
  28. func (u *udpConn) PrepareRawMessages(n int) ([]rawMessage, [][]byte, [][]byte) {
  29. msgs := make([]rawMessage, n)
  30. buffers := make([][]byte, n)
  31. names := make([][]byte, n)
  32. for i := range msgs {
  33. buffers[i] = make([]byte, mtu)
  34. names[i] = make([]byte, unix.SizeofSockaddrInet6)
  35. //TODO: this is still silly, no need for an array
  36. vs := []iovec{
  37. {Base: &buffers[i][0], Len: uint64(len(buffers[i]))},
  38. }
  39. msgs[i].Hdr.Iov = &vs[0]
  40. msgs[i].Hdr.Iovlen = uint64(len(vs))
  41. msgs[i].Hdr.Name = &names[i][0]
  42. msgs[i].Hdr.Namelen = uint32(len(names[i]))
  43. }
  44. return msgs, buffers, names
  45. }