udp_linux_64.go 1.0 KB

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