mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-07-10 13:48:47 +00:00
Finalmask: Refactor header conns to avoid multiple-copy; Add randRange to "header-custom" (TCP & UDP) (#5812)
https://github.com/XTLS/Xray-core/pull/5657#issuecomment-4016760602 https://github.com/XTLS/Xray-core/pull/5657#issuecomment-4052921628
This commit is contained in:
@@ -14,3 +14,6 @@ func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount
|
||||
func (c *Config) WrapPacketConnServer(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) {
|
||||
return NewConnServer(c, raw)
|
||||
}
|
||||
|
||||
func (c *Config) HeaderConn() {
|
||||
}
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
package salamander
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/xtls/xray-core/common/errors"
|
||||
"github.com/xtls/xray-core/transport/internet/finalmask"
|
||||
)
|
||||
|
||||
type salamanderConn struct {
|
||||
@@ -31,53 +29,18 @@ func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) {
|
||||
return NewConnClient(c, raw)
|
||||
}
|
||||
|
||||
func (c *salamanderConn) Size() int {
|
||||
return smSaltLen
|
||||
}
|
||||
|
||||
func (c *salamanderConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
|
||||
buf := p
|
||||
if len(p) < finalmask.UDPSize {
|
||||
buf = make([]byte, finalmask.UDPSize)
|
||||
}
|
||||
c.obfs.Deobfuscate(p, p[smSaltLen:])
|
||||
|
||||
n, addr, err = c.PacketConn.ReadFrom(buf)
|
||||
if err != nil || n == 0 {
|
||||
return n, addr, err
|
||||
}
|
||||
|
||||
if n < smSaltLen {
|
||||
errors.LogDebug(context.Background(), addr, " mask read err short lenth ", n)
|
||||
return 0, addr, nil
|
||||
}
|
||||
|
||||
if len(p) < n-smSaltLen {
|
||||
errors.LogDebug(context.Background(), addr, " mask read err short buffer ", len(p), " ", n-smSaltLen)
|
||||
return 0, addr, nil
|
||||
}
|
||||
|
||||
c.obfs.Deobfuscate(buf[:n], p)
|
||||
|
||||
return n - smSaltLen, addr, nil
|
||||
return len(p) - smSaltLen, addr, nil
|
||||
}
|
||||
|
||||
func (c *salamanderConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
|
||||
if smSaltLen+len(p) > finalmask.UDPSize {
|
||||
errors.LogDebug(context.Background(), addr, " mask write err short write ", smSaltLen+len(p), " ", finalmask.UDPSize)
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
var buf []byte
|
||||
if cap(p) != finalmask.UDPSize {
|
||||
buf = make([]byte, finalmask.UDPSize)
|
||||
} else {
|
||||
buf = p[:smSaltLen+len(p)]
|
||||
copy(buf[smSaltLen:], p)
|
||||
p = buf[smSaltLen:]
|
||||
}
|
||||
|
||||
c.obfs.Obfuscate(p, buf)
|
||||
|
||||
_, err = c.PacketConn.WriteTo(buf[:smSaltLen+len(p)], addr)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
c.obfs.Obfuscate(p[smSaltLen:], p)
|
||||
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user