mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-05-08 14:13:22 +00:00
58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
package sudoku
|
|
|
|
import (
|
|
"net"
|
|
|
|
"github.com/xtls/xray-core/common/errors"
|
|
)
|
|
|
|
func (c *Config) TCP() {
|
|
}
|
|
|
|
func (c *Config) UDP() {
|
|
}
|
|
|
|
// Sudoku in finalmask mode is a pure appearance transform with no standalone handshake.
|
|
// TCP always keeps classic sudoku on uplink and uses packed downlink optimization on server writes.
|
|
func (c *Config) WrapConnClient(raw net.Conn) (net.Conn, error) {
|
|
return newPackedDirectionalConn(raw, c, true)
|
|
}
|
|
|
|
func (c *Config) WrapConnServer(raw net.Conn) (net.Conn, error) {
|
|
return newPackedDirectionalConn(raw, c, false)
|
|
}
|
|
|
|
func newPackedDirectionalConn(raw net.Conn, config *Config, readPacked bool) (net.Conn, error) {
|
|
pureReader, pureWriter, err := newPureReaderWriter(raw, config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
packedReader, packedWriter, err := newPackedReaderWriter(raw, config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
reader, writer := pureReader, pureWriter
|
|
if readPacked {
|
|
reader = packedReader
|
|
} else {
|
|
writer = packedWriter
|
|
}
|
|
|
|
return newWrappedConn(raw, reader, writer), nil
|
|
}
|
|
|
|
func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) {
|
|
if level != levelCount {
|
|
return nil, errors.New("sudoku udp mask must be the innermost mask in chain")
|
|
}
|
|
return NewUDPConn(raw, c)
|
|
}
|
|
|
|
func (c *Config) WrapPacketConnServer(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) {
|
|
if level != levelCount {
|
|
return nil, errors.New("sudoku udp mask must be the innermost mask in chain")
|
|
}
|
|
return NewUDPConn(raw, c)
|
|
}
|