udp_linux_64.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 setRawMessageControl(msg *rawMessage, buf []byte) {
  32. if len(buf) == 0 {
  33. msg.Hdr.Control = nil
  34. msg.Hdr.Controllen = 0
  35. return
  36. }
  37. msg.Hdr.Control = &buf[0]
  38. msg.Hdr.Controllen = uint64(len(buf))
  39. }
  40. func getRawMessageControlLen(msg *rawMessage) int {
  41. return int(msg.Hdr.Controllen)
  42. }
  43. func setCmsgLen(h *unix.Cmsghdr, l int) {
  44. h.Len = uint64(l)
  45. }
  46. func (u *StdConn) PrepareRawMessages(n int, isV4 bool) ([]rawMessage, []*packet.Packet) {
  47. msgs := make([]rawMessage, n)
  48. packets := make([]*packet.Packet, n)
  49. for i := range msgs {
  50. packets[i] = packet.New(isV4)
  51. vs := []iovec{
  52. {Base: &packets[i].Payload[0], Len: uint64(packet.Size)},
  53. }
  54. msgs[i].Hdr.Iov = &vs[0]
  55. msgs[i].Hdr.Iovlen = uint64(len(vs))
  56. msgs[i].Hdr.Name = &packets[i].Name[0]
  57. msgs[i].Hdr.Namelen = uint32(len(packets[i].Name))
  58. if u.enableGRO {
  59. msgs[i].Hdr.Control = &packets[i].Control[0]
  60. msgs[i].Hdr.Controllen = uint64(len(packets[i].Control))
  61. } else {
  62. msgs[i].Hdr.Control = nil
  63. msgs[i].Hdr.Controllen = 0
  64. }
  65. }
  66. return msgs, packets
  67. }
  68. func setIovecSlice(iov *iovec, b []byte) {
  69. if len(b) == 0 {
  70. iov.Base = nil
  71. iov.Len = 0
  72. return
  73. }
  74. iov.Base = &b[0]
  75. iov.Len = uint64(len(b))
  76. }