rawconn_mmsg.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright 2017 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. //go:build linux
  5. // +build linux
  6. package socket
  7. import (
  8. "net"
  9. "os"
  10. )
  11. func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) {
  12. for i := range ms {
  13. ms[i].raceWrite()
  14. }
  15. packer := defaultMmsghdrsPool.Get()
  16. defer defaultMmsghdrsPool.Put(packer)
  17. var parseFn func([]byte, string) (net.Addr, error)
  18. if c.network != "tcp" {
  19. parseFn = parseInetAddr
  20. }
  21. hs := packer.pack(ms, parseFn, nil)
  22. var operr error
  23. var n int
  24. fn := func(s uintptr) bool {
  25. n, operr = recvmmsg(s, hs, flags)
  26. return ioComplete(flags, operr)
  27. }
  28. if err := c.c.Read(fn); err != nil {
  29. return n, err
  30. }
  31. if operr != nil {
  32. return n, os.NewSyscallError("recvmmsg", operr)
  33. }
  34. if err := hs[:n].unpack(ms[:n], parseFn, c.network); err != nil {
  35. return n, err
  36. }
  37. return n, nil
  38. }
  39. func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) {
  40. for i := range ms {
  41. ms[i].raceRead()
  42. }
  43. packer := defaultMmsghdrsPool.Get()
  44. defer defaultMmsghdrsPool.Put(packer)
  45. var marshalFn func(net.Addr, []byte) int
  46. if c.network != "tcp" {
  47. marshalFn = marshalInetAddr
  48. }
  49. hs := packer.pack(ms, nil, marshalFn)
  50. var operr error
  51. var n int
  52. fn := func(s uintptr) bool {
  53. n, operr = sendmmsg(s, hs, flags)
  54. return ioComplete(flags, operr)
  55. }
  56. if err := c.c.Write(fn); err != nil {
  57. return n, err
  58. }
  59. if operr != nil {
  60. return n, os.NewSyscallError("sendmmsg", operr)
  61. }
  62. if err := hs[:n].unpack(ms[:n], nil, ""); err != nil {
  63. return n, err
  64. }
  65. return n, nil
  66. }