udp_linux_64.go 1.0 KB

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