mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-06-11 04:44:14 +08:00
49 lines
1.1 KiB
Go
49 lines
1.1 KiB
Go
//go:build with_gvisor
|
|
|
|
package wireguard
|
|
|
|
import (
|
|
"github.com/sagernet/gvisor/pkg/tcpip/stack"
|
|
)
|
|
|
|
type gVisorOutbound struct {
|
|
outbound chan *stack.PacketBuffer
|
|
}
|
|
|
|
func newGVisorOutbound() gVisorOutbound {
|
|
return gVisorOutbound{
|
|
outbound: make(chan *stack.PacketBuffer, 256),
|
|
}
|
|
}
|
|
|
|
func (d *natDeviceWrapper) Read(bufs [][]byte, sizes []int, offset int) (n int, err error) {
|
|
select {
|
|
case packet := <-d.outbound:
|
|
defer packet.DecRef()
|
|
var copyN int
|
|
/*rangeIterate(packet.Data().AsRange(), func(view *buffer.View) {
|
|
copyN += copy(bufs[0][offset+copyN:], view.AsSlice())
|
|
})*/
|
|
for _, view := range packet.AsSlices() {
|
|
copyN += copy(bufs[0][offset+copyN:], view)
|
|
}
|
|
sizes[0] = copyN
|
|
return 1, nil
|
|
case packet := <-d.packetOutbound:
|
|
defer packet.Release()
|
|
sizes[0] = copy(bufs[0][offset:], packet.Bytes())
|
|
return 1, nil
|
|
default:
|
|
}
|
|
return d.Device.Read(bufs, sizes, offset)
|
|
}
|
|
|
|
func (d *natDestinationWrapper) WritePacketBuffer(packetBuffer *stack.PacketBuffer) error {
|
|
println("read from wg")
|
|
if d.device.writer != nil {
|
|
d.device.writer.RewritePacketBuffer(packetBuffer)
|
|
}
|
|
d.device.outbound <- packetBuffer
|
|
return nil
|
|
}
|