packet.go 608 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package packet
  2. import (
  3. "net/netip"
  4. "sync"
  5. "golang.org/x/sys/unix"
  6. )
  7. const Size = 0xffff
  8. type Packet struct {
  9. Payload []byte
  10. Control []byte
  11. SegSize int
  12. Addr netip.AddrPort
  13. }
  14. func New() *Packet {
  15. return &Packet{
  16. Payload: make([]byte, Size),
  17. Control: make([]byte, unix.CmsgSpace(2)),
  18. }
  19. }
  20. type Pool struct {
  21. pool sync.Pool
  22. }
  23. var bigPool = &Pool{
  24. pool: sync.Pool{New: func() any { return New() }},
  25. }
  26. func GetPool() *Pool {
  27. return bigPool
  28. }
  29. func (p *Pool) Get() *Packet {
  30. return p.pool.Get().(*Packet)
  31. }
  32. func (p *Pool) Put(x *Packet) {
  33. x.Payload = x.Payload[:Size]
  34. p.pool.Put(x)
  35. }