udp_linux_32.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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, bufSize int) ([]rawMessage, [][]byte, [][]byte) {
  28. if bufSize <= 0 {
  29. bufSize = MTU
  30. }
  31. msgs := make([]rawMessage, n)
  32. buffers := make([][]byte, n)
  33. names := make([][]byte, n)
  34. for i := range msgs {
  35. buffers[i] = make([]byte, bufSize)
  36. names[i] = make([]byte, unix.SizeofSockaddrInet6)
  37. vs := []iovec{
  38. {Base: &buffers[i][0], Len: uint32(len(buffers[i]))},
  39. }
  40. msgs[i].Hdr.Iov = &vs[0]
  41. msgs[i].Hdr.Iovlen = uint32(len(vs))
  42. msgs[i].Hdr.Name = &names[i][0]
  43. msgs[i].Hdr.Namelen = uint32(len(names[i]))
  44. }
  45. return msgs, buffers, names
  46. }
  47. func setRawMessageControl(msg *rawMessage, buf []byte) {
  48. if len(buf) == 0 {
  49. msg.Hdr.Control = nil
  50. msg.Hdr.Controllen = 0
  51. return
  52. }
  53. msg.Hdr.Control = &buf[0]
  54. msg.Hdr.Controllen = uint32(len(buf))
  55. }
  56. func getRawMessageControlLen(msg *rawMessage) int {
  57. return int(msg.Hdr.Controllen)
  58. }
  59. func getRawMessageFlags(msg *rawMessage) int {
  60. return int(msg.Hdr.Flags)
  61. }
  62. func setCmsgLen(h *unix.Cmsghdr, l int) {
  63. h.Len = uint32(l)
  64. }