linkWriterToWriter.go 819 B

1234567891011121314151617181920212223242526272829303132333435
  1. package device
  2. import (
  3. "io"
  4. "github.com/v2fly/v2ray-core/v5/common/errors"
  5. "gvisor.dev/gvisor/pkg/buffer"
  6. "gvisor.dev/gvisor/pkg/tcpip/stack"
  7. )
  8. func NewLinkWriterToWriter(writer stack.LinkWriter) io.Writer {
  9. return &linkWriterToWriter{writer: writer}
  10. }
  11. type linkWriterToWriter struct {
  12. writer stack.LinkWriter
  13. }
  14. func (l linkWriterToWriter) Write(p []byte) (n int, err error) {
  15. buffer := buffer.MakeWithData(p)
  16. packetBufferPtr := stack.NewPacketBuffer(stack.PacketBufferOptions{
  17. Payload: buffer,
  18. OnRelease: func() {
  19. buffer.Release()
  20. },
  21. })
  22. packetList := stack.PacketBufferList{}
  23. packetList.PushBack(packetBufferPtr)
  24. _, terr := l.writer.WritePackets(packetList)
  25. if terr != nil {
  26. return 0, newError("failed to write packet").Base(errors.New(terr.String())).AtError()
  27. }
  28. return len(p), nil
  29. }