udp_linux_64.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //go:build linux && (amd64 || arm64 || ppc64 || ppc64le || mips64 || mips64le || s390x || riscv64 || loong64) && !android && !e2e_testing
  2. // +build linux
  3. // +build amd64 arm64 ppc64 ppc64le mips64 mips64le s390x riscv64 loong64
  4. // +build !android
  5. // +build !e2e_testing
  6. package udp
  7. import (
  8. "github.com/slackhq/nebula/packet"
  9. "golang.org/x/sys/unix"
  10. )
  11. type iovec struct {
  12. Base *byte
  13. Len uint64
  14. }
  15. type msghdr struct {
  16. Name *byte
  17. Namelen uint32
  18. Pad0 [4]byte
  19. Iov *iovec
  20. Iovlen uint64
  21. Control *byte
  22. Controllen uint64
  23. Flags int32
  24. Pad1 [4]byte
  25. }
  26. type rawMessage struct {
  27. Hdr msghdr
  28. Len uint32
  29. Pad0 [4]byte
  30. }
  31. func (u *StdConn) PrepareRawMessages(n int, pg PacketBufferGetter) ([]rawMessage, []*packet.Packet, [][]byte) {
  32. msgs := make([]rawMessage, n)
  33. names := make([][]byte, n)
  34. packets := make([]*packet.Packet, n)
  35. for i := range packets {
  36. packets[i] = pg()
  37. }
  38. for i := range msgs {
  39. names[i] = make([]byte, unix.SizeofSockaddrInet6)
  40. vs := []iovec{
  41. {Base: &packets[i].Payload[0], Len: uint64(packet.Size)},
  42. }
  43. msgs[i].Hdr.Iov = &vs[0]
  44. msgs[i].Hdr.Iovlen = uint64(len(vs))
  45. msgs[i].Hdr.Name = &names[i][0]
  46. msgs[i].Hdr.Namelen = uint32(len(names[i]))
  47. }
  48. return msgs, packets, names
  49. }