udp_linux_arm.go 939 B

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