Apply backpressure to masque inbound packets

This commit is contained in:
世界 committed 2026-11-09 15:17:20 +00:00
1 parent 2988bb02b9
commit 234ff15102
7 files changed
+41 -6

No files matched your search

+10
View File
@@ -205,6 +205,16 @@ func (c *ClientEndpoint) WriteInboundBuffers(packetBuffers []*buf.Buffer) error
return err return err
} }
func (c *ClientEndpoint) WaitWriteInboundBuffers(packetBuffers []*buf.Buffer) error {
if !c.state.Load().configured {
buf.ReleaseMulti(packetBuffers)
return nil
}
err := c.device.WaitWriteInboundBuffers(packetBuffers)
buf.ReleaseMulti(packetBuffers)
return err
}
func (c *ClientEndpoint) FrontHeadroom() int { func (c *ClientEndpoint) FrontHeadroom() int {
return c.device.FrontHeadroom() return c.device.FrontHeadroom()
} }
+6
View File
@@ -210,6 +210,12 @@ func (s *ServerEndpoint) WriteInboundBuffers(packetBuffers []*buf.Buffer) error
return err return err
} }
func (s *ServerEndpoint) WaitWriteInboundBuffers(packetBuffers []*buf.Buffer) error {
err := s.device.WaitWriteInboundBuffers(packetBuffers)
buf.ReleaseMulti(packetBuffers)
return err
}
func (s *ServerEndpoint) FrontHeadroom() int { func (s *ServerEndpoint) FrontHeadroom() int {
return s.device.FrontHeadroom() return s.device.FrontHeadroom()
} }
+1
View File
@@ -22,6 +22,7 @@ type Device interface {
Start() error Start() error
UpdateConfiguration(configuration Configuration) error UpdateConfiguration(configuration Configuration) error
WriteInboundBuffers(packetBuffers []*buf.Buffer) error WriteInboundBuffers(packetBuffers []*buf.Buffer) error
WaitWriteInboundBuffers(packetBuffers []*buf.Buffer) error
SetPacketWriter(writer PacketWriter) SetPacketWriter(writer PacketWriter)
PortAddresses() (netip.Addr, netip.Addr) PortAddresses() (netip.Addr, netip.Addr)
PortMTU() uint32 PortMTU() uint32
+8
View File
@@ -73,11 +73,19 @@ func (d *stackDevice) WriteInboundBuffers(packetBuffers []*buf.Buffer) error {
return d.processInboundBuffers(packetBuffers, d.writeBuffers) return d.processInboundBuffers(packetBuffers, d.writeBuffers)
} }
func (d *stackDevice) WaitWriteInboundBuffers(packetBuffers []*buf.Buffer) error {
return d.processInboundBuffers(packetBuffers, d.waitWriteBuffers)
}
func (d *stackDevice) writeBuffers(packetBuffers []*buf.Buffer) error { func (d *stackDevice) writeBuffers(packetBuffers []*buf.Buffer) error {
_, err := d.memoryTun.WritePackets(common.Map(packetBuffers, (*buf.Buffer).Bytes)) _, err := d.memoryTun.WritePackets(common.Map(packetBuffers, (*buf.Buffer).Bytes))
return err return err
} }
func (d *stackDevice) waitWriteBuffers(packetBuffers []*buf.Buffer) error {
return d.memoryTun.WaitWritePackets(common.Map(packetBuffers, (*buf.Buffer).Bytes))
}
func (d *stackDevice) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) { func (d *stackDevice) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
bind, err := d.bindAddress(destination) bind, err := d.bindAddress(destination)
if err != nil { if err != nil {
+12 -4
View File
@@ -55,10 +55,18 @@ func (d *systemStackDevice) UpdateConfiguration(configuration Configuration) err
} }
func (d *systemStackDevice) WriteInboundBuffers(packetBuffers []*buf.Buffer) error { func (d *systemStackDevice) WriteInboundBuffers(packetBuffers []*buf.Buffer) error {
return d.systemDevice.processInboundBuffers(packetBuffers, d.writeBuffers) return d.systemDevice.processInboundBuffers(packetBuffers, func(unconsumedBuffers []*buf.Buffer) error {
return d.writeBuffers(unconsumedBuffers, d.stackDevice.writeBuffers)
})
} }
func (d *systemStackDevice) writeBuffers(packetBuffers []*buf.Buffer) error { func (d *systemStackDevice) WaitWriteInboundBuffers(packetBuffers []*buf.Buffer) error {
return d.systemDevice.processInboundBuffers(packetBuffers, func(unconsumedBuffers []*buf.Buffer) error {
return d.writeBuffers(unconsumedBuffers, d.stackDevice.waitWriteBuffers)
})
}
func (d *systemStackDevice) writeBuffers(packetBuffers []*buf.Buffer, writeStackBuffers func(packetBuffers []*buf.Buffer) error) error {
addresses := d.systemDevice.configurationAddresses() addresses := d.systemDevice.configurationAddresses()
runStart := 0 runStart := 0
runUsesSystemDevice := false runUsesSystemDevice := false
@@ -77,7 +85,7 @@ func (d *systemStackDevice) writeBuffers(packetBuffers []*buf.Buffer) error {
if runUsesSystemDevice { if runUsesSystemDevice {
err = d.systemDevice.writeBuffers(packetBuffers[runStart:i]) err = d.systemDevice.writeBuffers(packetBuffers[runStart:i])
} else { } else {
err = d.stackDevice.writeBuffers(packetBuffers[runStart:i]) err = writeStackBuffers(packetBuffers[runStart:i])
} }
writeErr = E.Errors(writeErr, err) writeErr = E.Errors(writeErr, err)
runStart = i runStart = i
@@ -92,7 +100,7 @@ func (d *systemStackDevice) writeBuffers(packetBuffers []*buf.Buffer) error {
if runUsesSystemDevice { if runUsesSystemDevice {
return E.Errors(writeErr, d.systemDevice.writeBuffers(packetBuffers[runStart:])) return E.Errors(writeErr, d.systemDevice.writeBuffers(packetBuffers[runStart:]))
} }
return E.Errors(writeErr, d.stackDevice.writeBuffers(packetBuffers[runStart:])) return E.Errors(writeErr, writeStackBuffers(packetBuffers[runStart:]))
} }
func packetDestination(packet []byte) netip.Addr { func packetDestination(packet []byte) netip.Addr {
+2 -1
View File
@@ -29,6 +29,7 @@ type Configuration struct {
type ClientHandler interface { type ClientHandler interface {
UpdateConfiguration(configuration Configuration) error UpdateConfiguration(configuration Configuration) error
WriteInboundBuffers(packetBuffers []*buf.Buffer) error WriteInboundBuffers(packetBuffers []*buf.Buffer) error
WaitWriteInboundBuffers(packetBuffers []*buf.Buffer) error
FrontHeadroom() int FrontHeadroom() int
} }
@@ -426,7 +427,7 @@ func (s *clientSession) handlePacket(buffer *buf.Buffer) {
} }
return return
} }
err := s.client.handler.WriteInboundBuffers([]*buf.Buffer{buffer}) err := s.client.handler.WaitWriteInboundBuffers([]*buf.Buffer{buffer})
if err != nil { if err != nil {
s.client.logger.Debug(E.Cause(err, "write packet to device")) s.client.logger.Debug(E.Cause(err, "write packet to device"))
} }
+2 -1
View File
@@ -22,6 +22,7 @@ import (
type ServerHandler interface { type ServerHandler interface {
WriteInboundBuffers(packetBuffers []*buf.Buffer) error WriteInboundBuffers(packetBuffers []*buf.Buffer) error
WaitWriteInboundBuffers(packetBuffers []*buf.Buffer) error
FrontHeadroom() int FrontHeadroom() int
NewOutboundQueue(handler func(packetBuffers []*buf.Buffer)) *tun.OutboundQueue NewOutboundQueue(handler func(packetBuffers []*buf.Buffer)) *tun.OutboundQueue
} }
@@ -434,7 +435,7 @@ func (s *serverSession) handlePacket(buffer *buf.Buffer) {
break break
} }
if target == nil { if target == nil {
err := s.server.handler.WriteInboundBuffers([]*buf.Buffer{buffer}) err := s.server.handler.WaitWriteInboundBuffers([]*buf.Buffer{buffer})
if err != nil { if err != nil {
s.server.logger.DebugContext(s.ctx, E.Cause(err, "write packet to device")) s.server.logger.DebugContext(s.ctx, E.Cause(err, "write packet to device"))
} }