|
|
@@ -5,6 +5,8 @@ import (
|
|
|
"crypto/rand"
|
|
|
"io"
|
|
|
|
|
|
+ "v2ray.com/core/common"
|
|
|
+ "v2ray.com/core/common/buf"
|
|
|
"v2ray.com/core/transport/internet"
|
|
|
)
|
|
|
|
|
|
@@ -50,8 +52,6 @@ type KCPPacketWriter struct {
|
|
|
Header internet.PacketHeader
|
|
|
Security cipher.AEAD
|
|
|
Writer io.Writer
|
|
|
-
|
|
|
- buffer [2048]byte
|
|
|
}
|
|
|
|
|
|
func (w *KCPPacketWriter) Overhead() int {
|
|
|
@@ -66,27 +66,28 @@ func (w *KCPPacketWriter) Overhead() int {
|
|
|
}
|
|
|
|
|
|
func (w *KCPPacketWriter) Write(b []byte) (int, error) {
|
|
|
- x := w.buffer[:]
|
|
|
- size := 0
|
|
|
+ bb := buf.NewSize(int32(len(b) + w.Overhead()))
|
|
|
+ defer bb.Release()
|
|
|
+
|
|
|
if w.Header != nil {
|
|
|
- nBytes, _ := w.Header.Write(x)
|
|
|
- size += nBytes
|
|
|
- x = x[nBytes:]
|
|
|
+ common.Must(bb.AppendSupplier(func(x []byte) (int, error) {
|
|
|
+ return w.Header.Write(x)
|
|
|
+ }))
|
|
|
}
|
|
|
if w.Security != nil {
|
|
|
nonceSize := w.Security.NonceSize()
|
|
|
- var nonce []byte
|
|
|
- if nonceSize > 0 {
|
|
|
- nonce = x[:nonceSize]
|
|
|
- rand.Read(nonce)
|
|
|
- x = x[nonceSize:]
|
|
|
- }
|
|
|
- x = w.Security.Seal(x[:0], nonce, b, nil)
|
|
|
- size += nonceSize + len(x)
|
|
|
+ common.Must(bb.AppendSupplier(func(x []byte) (int, error) {
|
|
|
+ return rand.Read(x[:nonceSize])
|
|
|
+ }))
|
|
|
+ nonce := bb.BytesFrom(int32(-nonceSize))
|
|
|
+ common.Must(bb.AppendSupplier(func(x []byte) (int, error) {
|
|
|
+ eb := w.Security.Seal(x[:0], nonce, b, nil)
|
|
|
+ return len(eb), nil
|
|
|
+ }))
|
|
|
} else {
|
|
|
- size += copy(x, b)
|
|
|
+ bb.Append(b)
|
|
|
}
|
|
|
|
|
|
- _, err := w.Writer.Write(w.buffer[:size])
|
|
|
+ _, err := w.Writer.Write(bb.Bytes())
|
|
|
return len(b), err
|
|
|
}
|