udp_linux_64.go 1.1 KB

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