rawconn_mmsg.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. package socket
  6. import (
  7. "net"
  8. )
  9. func (c *Conn) recvMsgs(ms []Message, flags int) (int, error) {
  10. for i := range ms {
  11. ms[i].raceWrite()
  12. }
  13. tmps := defaultMmsgTmpsPool.Get()
  14. defer defaultMmsgTmpsPool.Put(tmps)
  15. var parseFn func([]byte, string) (net.Addr, error)
  16. if c.network != "tcp" {
  17. parseFn = parseInetAddr
  18. }
  19. hs := tmps.packer.pack(ms, parseFn, nil)
  20. n, err := tmps.syscaller.recvmmsg(c.c, hs, flags)
  21. if err != nil {
  22. return n, err
  23. }
  24. if err := hs[:n].unpack(ms[:n], parseFn, c.network); err != nil {
  25. return n, err
  26. }
  27. return n, nil
  28. }
  29. func (c *Conn) sendMsgs(ms []Message, flags int) (int, error) {
  30. for i := range ms {
  31. ms[i].raceRead()
  32. }
  33. tmps := defaultMmsgTmpsPool.Get()
  34. defer defaultMmsgTmpsPool.Put(tmps)
  35. var marshalFn func(net.Addr, []byte) int
  36. if c.network != "tcp" {
  37. marshalFn = marshalInetAddr
  38. }
  39. hs := tmps.packer.pack(ms, nil, marshalFn)
  40. n, err := tmps.syscaller.sendmmsg(c.c, hs, flags)
  41. if err != nil {
  42. return n, err
  43. }
  44. if err := hs[:n].unpack(ms[:n], nil, ""); err != nil {
  45. return n, err
  46. }
  47. return n, nil
  48. }