udp_linux_32.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //go:build linux && (386 || amd64p32 || arm || mips || mipsle) && !android && !e2e_testing
  2. // +build linux
  3. // +build 386 amd64p32 arm mips mipsle
  4. // +build !android
  5. // +build !e2e_testing
  6. package udp
  7. import (
  8. "golang.org/x/sys/unix"
  9. )
  10. type iovec struct {
  11. Base *byte
  12. Len uint32
  13. }
  14. type msghdr struct {
  15. Name *byte
  16. Namelen uint32
  17. Iov *iovec
  18. Iovlen uint32
  19. Control *byte
  20. Controllen uint32
  21. Flags int32
  22. }
  23. type rawMessage struct {
  24. Hdr msghdr
  25. Len uint32
  26. }
  27. func (u *StdConn) PrepareRawMessages(n int) ([]rawMessage, [][]byte, [][]byte) {
  28. msgs := make([]rawMessage, n)
  29. buffers := make([][]byte, n)
  30. names := make([][]byte, n)
  31. for i := range msgs {
  32. buffers[i] = make([]byte, MTU)
  33. names[i] = make([]byte, unix.SizeofSockaddrInet6)
  34. vs := []iovec{
  35. {Base: &buffers[i][0], Len: uint32(len(buffers[i]))},
  36. }
  37. msgs[i].Hdr.Iov = &vs[0]
  38. msgs[i].Hdr.Iovlen = uint32(len(vs))
  39. msgs[i].Hdr.Name = &names[i][0]
  40. msgs[i].Hdr.Namelen = uint32(len(names[i]))
  41. }
  42. return msgs, buffers, names
  43. }
  44. // prepareWriteMessages allocates one Mmsghdr/iovec/sockaddr scratch per slot,
  45. // wired up so each writeMsgs[i] already points at writeIovs[i] and
  46. // writeNames[i]. Callers fill in the iovec Base/Len, the sockaddr bytes, and
  47. // Namelen before each sendmmsg.
  48. func (u *StdConn) prepareWriteMessages(n int) {
  49. u.writeMsgs = make([]rawMessage, n)
  50. u.writeIovs = make([]iovec, n)
  51. u.writeNames = make([][]byte, n)
  52. for i := range u.writeMsgs {
  53. u.writeNames[i] = make([]byte, unix.SizeofSockaddrInet6)
  54. u.writeMsgs[i].Hdr.Iov = &u.writeIovs[i]
  55. u.writeMsgs[i].Hdr.Iovlen = 1
  56. u.writeMsgs[i].Hdr.Name = &u.writeNames[i][0]
  57. }
  58. }
  59. func setIovLen(v *iovec, n int) {
  60. v.Len = uint32(n)
  61. }