ソースを参照

Go back to first fix (revet d21e9b0abd3a3472c07fafd7f407f3a08d99e07a)

Xtls is magic, don't play with it ;)

A knowledged guess is the timing to switch to splice is very sensitive. Now both Xtls and Freedom outound do the switching when pipe just finished one buffer
yuhan6665 1 年間 前
コミット
a15334b395
1 ファイル変更9 行追加9 行削除
  1. 9 9
      proxy/vless/encoding/encoding.go

+ 9 - 9
proxy/vless/encoding/encoding.go

@@ -224,6 +224,15 @@ func XtlsWrite(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdate
 		var ct stats.Counter
 		for {
 			buffer, err := reader.ReadMultiBuffer()
+			if trafficState.WriterSwitchToDirectCopy {
+				if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.CanSpliceCopy == 2 {
+					inbound.CanSpliceCopy = 1 // force the value to 1, don't use setter
+				}
+				rawConn, _, writerCounter := proxy.UnwrapRawConn(conn)
+				writer = buf.NewWriter(rawConn)
+				ct = writerCounter
+				trafficState.WriterSwitchToDirectCopy = false
+			}
 			if !buffer.IsEmpty() {
 				if ct != nil {
 					ct.Add(int64(buffer.Len()))
@@ -232,15 +241,6 @@ func XtlsWrite(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdate
 				if werr := writer.WriteMultiBuffer(buffer); werr != nil {
 					return werr
 				}
-				if trafficState.WriterSwitchToDirectCopy {
-					rawConn, _, writerCounter := proxy.UnwrapRawConn(conn)
-					writer = buf.NewWriter(rawConn)
-					ct = writerCounter
-					trafficState.WriterSwitchToDirectCopy = false
-					if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.CanSpliceCopy == 2 {
-						inbound.CanSpliceCopy = 1 // force the value to 1, don't use setter
-					}
-				}
 			}
 			if err != nil {
 				return err