mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2025-11-01 12:32:45 +08:00
Improve(stack): add TCP recovery option
This commit is contained in:
@@ -42,6 +42,9 @@ const (
|
|||||||
// tcp selective ACK.
|
// tcp selective ACK.
|
||||||
tcpSACKEnabled = true
|
tcpSACKEnabled = true
|
||||||
|
|
||||||
|
// tcpRecovery is the loss detection algorithm used by TCP.
|
||||||
|
tcpRecovery = tcpip.TCPRACKLossDetection
|
||||||
|
|
||||||
// tcpMinBufferSize is the smallest size of a send/recv buffer.
|
// tcpMinBufferSize is the smallest size of a send/recv buffer.
|
||||||
tcpMinBufferSize = tcp.MinBufferSize // 4 KiB
|
tcpMinBufferSize = tcp.MinBufferSize // 4 KiB
|
||||||
|
|
||||||
@@ -82,6 +85,17 @@ func WithDefault() Option {
|
|||||||
// TCP selective ACK Option, see:
|
// TCP selective ACK Option, see:
|
||||||
// https://tools.ietf.org/html/rfc2018
|
// https://tools.ietf.org/html/rfc2018
|
||||||
WithTCPSACKEnabled(tcpSACKEnabled),
|
WithTCPSACKEnabled(tcpSACKEnabled),
|
||||||
|
|
||||||
|
// TCPRACKLossDetection: indicates RACK is used for loss detection and
|
||||||
|
// recovery.
|
||||||
|
//
|
||||||
|
// TCPRACKStaticReoWnd: indicates the reordering window should not be
|
||||||
|
// adjusted when DSACK is received.
|
||||||
|
//
|
||||||
|
// TCPRACKNoDupTh: indicates RACK should not consider the classic three
|
||||||
|
// duplicate acknowledgements rule to mark the segments as lost. This
|
||||||
|
// is used when reordering is not detected.
|
||||||
|
WithTCPRecovery(tcpRecovery),
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
@@ -197,3 +211,13 @@ func WithTCPSACKEnabled(v bool) Option {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithTCPRecovery sets the recovery option for TCP.
|
||||||
|
func WithTCPRecovery(v tcpip.TCPRecovery) Option {
|
||||||
|
return func(s *Stack) error {
|
||||||
|
if err := s.SetTransportProtocolOption(tcp.ProtocolNumber, &v); err != nil {
|
||||||
|
return fmt.Errorf("set TCP Recovery: %s", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user