mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-10-02 22:06:39 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7f23673023 | ||
|
|
3a9412c128 | ||
|
|
6140ff6844 |
@@ -0,0 +1,20 @@
|
|||||||
|
package net
|
||||||
|
|
||||||
|
// PacketConnWrapper wraps a PacketConn into a Conn with a fixed destination address.
|
||||||
|
type PacketConnWrapper struct {
|
||||||
|
PacketConn
|
||||||
|
Dest Addr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PacketConnWrapper) Read(p []byte) (int, error) {
|
||||||
|
n, _, err := c.PacketConn.ReadFrom(p)
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PacketConnWrapper) Write(p []byte) (int, error) {
|
||||||
|
return c.PacketConn.WriteTo(p, c.Dest)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PacketConnWrapper) RemoteAddr() Addr {
|
||||||
|
return c.Dest
|
||||||
|
}
|
||||||
@@ -467,7 +467,7 @@ func NewPacketReader(conn net.Conn, h *Handler, defaultRule *FinalRule, UDPOverr
|
|||||||
if statConn != nil {
|
if statConn != nil {
|
||||||
counter = statConn.ReadCounter
|
counter = statConn.ReadCounter
|
||||||
}
|
}
|
||||||
if c, ok := iConn.(*internet.PacketConnWrapper); ok {
|
if c, ok := iConn.(*net.PacketConnWrapper); ok {
|
||||||
isOverridden := false
|
isOverridden := false
|
||||||
if UDPOverride.Address != nil || UDPOverride.Port != 0 {
|
if UDPOverride.Address != nil || UDPOverride.Port != 0 {
|
||||||
isOverridden = true
|
isOverridden = true
|
||||||
@@ -487,7 +487,7 @@ func NewPacketReader(conn net.Conn, h *Handler, defaultRule *FinalRule, UDPOverr
|
|||||||
}
|
}
|
||||||
|
|
||||||
type PacketReader struct {
|
type PacketReader struct {
|
||||||
*internet.PacketConnWrapper
|
*net.PacketConnWrapper
|
||||||
stats.Counter
|
stats.Counter
|
||||||
Handler *Handler
|
Handler *Handler
|
||||||
DefaultRule *FinalRule
|
DefaultRule *FinalRule
|
||||||
@@ -542,7 +542,7 @@ func NewPacketWriter(conn net.Conn, h *Handler, defaultRule *FinalRule, UDPOverr
|
|||||||
if statConn != nil {
|
if statConn != nil {
|
||||||
counter = statConn.WriteCounter
|
counter = statConn.WriteCounter
|
||||||
}
|
}
|
||||||
if c, ok := iConn.(*internet.PacketConnWrapper); ok {
|
if c, ok := iConn.(*net.PacketConnWrapper); ok {
|
||||||
// If DialDest is a domain, it will be resolved in dialer
|
// If DialDest is a domain, it will be resolved in dialer
|
||||||
// check this behavior and add it to map
|
// check this behavior and add it to map
|
||||||
resolvedUDPAddr := utils.NewTypedSyncMap[string, net.Address]()
|
resolvedUDPAddr := utils.NewTypedSyncMap[string, net.Address]()
|
||||||
@@ -563,7 +563,7 @@ func NewPacketWriter(conn net.Conn, h *Handler, defaultRule *FinalRule, UDPOverr
|
|||||||
}
|
}
|
||||||
|
|
||||||
type PacketWriter struct {
|
type PacketWriter struct {
|
||||||
*internet.PacketConnWrapper
|
*net.PacketConnWrapper
|
||||||
stats.Counter
|
stats.Counter
|
||||||
*Handler
|
*Handler
|
||||||
DefaultRule *FinalRule
|
DefaultRule *FinalRule
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ func (c *Client) Process(ctx context.Context, link *transport.Link, dialer inter
|
|||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
uc := &wireguard.UDPConnClient{
|
uc := &wireguard.UDPConnClient{
|
||||||
PacketConn: conn.(*internet.PacketConnWrapper).PacketConn,
|
PacketConn: conn.(*net.PacketConnWrapper).PacketConn,
|
||||||
Dest: conn.RemoteAddr().(*net.UDPAddr),
|
Dest: conn.RemoteAddr().(*net.UDPAddr),
|
||||||
}
|
}
|
||||||
reader = uc
|
reader = uc
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import (
|
|||||||
"github.com/xtls/xray-core/features/stats"
|
"github.com/xtls/xray-core/features/stats"
|
||||||
"github.com/xtls/xray-core/transport"
|
"github.com/xtls/xray-core/transport"
|
||||||
"github.com/xtls/xray-core/transport/internet"
|
"github.com/xtls/xray-core/transport/internet"
|
||||||
"github.com/xtls/xray-core/transport/internet/finalmask"
|
|
||||||
"golang.zx2c4.com/wireguard/device"
|
"golang.zx2c4.com/wireguard/device"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -200,7 +199,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
|
|||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
c := &UDPConnClient{
|
c := &UDPConnClient{
|
||||||
PacketConn: conn.(*internet.PacketConnWrapper).PacketConn,
|
PacketConn: conn.(*net.PacketConnWrapper).PacketConn,
|
||||||
Dest: conn.RemoteAddr().(*net.UDPAddr),
|
Dest: conn.RemoteAddr().(*net.UDPAddr),
|
||||||
}
|
}
|
||||||
reader = c
|
reader = c
|
||||||
@@ -264,14 +263,14 @@ func (h *Handler) init(ctx context.Context) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("failed to dial to dest").Base(err)
|
return nil, errors.New("failed to dial to dest").Base(err)
|
||||||
}
|
}
|
||||||
pktConn = conn.(*finalmask.PacketConnWrapper).PacketConn
|
pktConn = conn.(*net.PacketConnWrapper).PacketConn
|
||||||
} else {
|
} else {
|
||||||
conn, err := internet.DialSystem(ctx, dest, h.streamSettings.SocketSettings)
|
conn, err := internet.DialSystem(ctx, dest, h.streamSettings.SocketSettings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("failed to dial to dest").Base(err)
|
return nil, errors.New("failed to dial to dest").Base(err)
|
||||||
}
|
}
|
||||||
switch c := conn.(type) {
|
switch c := conn.(type) {
|
||||||
case *internet.PacketConnWrapper:
|
case *net.PacketConnWrapper:
|
||||||
pktConn = c.PacketConn
|
pktConn = c.PacketConn
|
||||||
case *cnc.Connection:
|
case *cnc.Connection:
|
||||||
pktConn = &internet.FakePacketConn{Conn: c}
|
pktConn = &internet.FakePacketConn{Conn: c}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/xtls/xray-core/transport/internet"
|
xnet "github.com/xtls/xray-core/common/net"
|
||||||
"golang.zx2c4.com/wireguard/tun"
|
"golang.zx2c4.com/wireguard/tun"
|
||||||
|
|
||||||
"golang.org/x/net/dns/dnsmessage"
|
"golang.org/x/net/dns/dnsmessage"
|
||||||
@@ -220,7 +220,7 @@ func (tun *netTun) DialUDPAddrPort(laddr, raddr netip.AddrPort) (net.Conn, error
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &internet.PacketConnWrapper{
|
return &xnet.PacketConnWrapper{
|
||||||
PacketConn: conn,
|
PacketConn: conn,
|
||||||
Dest: net.UDPAddrFromAddrPort(raddr),
|
Dest: net.UDPAddrFromAddrPort(raddr),
|
||||||
}, nil
|
}, nil
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import (
|
|||||||
|
|
||||||
"github.com/vishvananda/netlink"
|
"github.com/vishvananda/netlink"
|
||||||
"github.com/xtls/xray-core/common/errors"
|
"github.com/xtls/xray-core/common/errors"
|
||||||
"github.com/xtls/xray-core/transport/internet"
|
xnet "github.com/xtls/xray-core/common/net"
|
||||||
"golang.zx2c4.com/wireguard/tun"
|
"golang.zx2c4.com/wireguard/tun"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -263,7 +263,7 @@ func (tun *kernelTun) DialUDPAddrPort(laddr, raddr netip.AddrPort) (net.Conn, er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &internet.PacketConnWrapper{
|
return &xnet.PacketConnWrapper{
|
||||||
PacketConn: conn,
|
PacketConn: conn,
|
||||||
Dest: net.UDPAddrFromAddrPort(raddr),
|
Dest: net.UDPAddrFromAddrPort(raddr),
|
||||||
}, nil
|
}, nil
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ func (fm *FinalMask) DialTCP(ctx context.Context, dest net.Destination) (net.Con
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &PacketConnWrapper{PacketConn: conn, udpAddr: addr}, err
|
return &net.PacketConnWrapper{PacketConn: conn, Dest: addr}, err
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for i := range fm.tcpMasks {
|
for i := range fm.tcpMasks {
|
||||||
@@ -144,7 +144,7 @@ func (fm *FinalMask) DialUDP(ctx context.Context, dest net.Destination) (net.Con
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &PacketConnWrapper{PacketConn: conn, udpAddr: addr}, nil
|
return &net.PacketConnWrapper{PacketConn: conn, Dest: addr}, nil
|
||||||
}
|
}
|
||||||
for i := range fm.udpMasks {
|
for i := range fm.udpMasks {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
@@ -171,7 +171,7 @@ func (fm *FinalMask) DialUDP(ctx context.Context, dest net.Destination) (net.Con
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &PacketConnWrapper{PacketConn: conn, udpAddr: addr}, err
|
return &net.PacketConnWrapper{PacketConn: conn, Dest: addr}, err
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
var sizes []int
|
var sizes []int
|
||||||
@@ -208,7 +208,7 @@ func (fm *FinalMask) DialUDP(ctx context.Context, dest net.Destination) (net.Con
|
|||||||
if addr == nil {
|
if addr == nil {
|
||||||
addr = &net.UDPAddr{IP: []byte{0, 0, 0, 0}}
|
addr = &net.UDPAddr{IP: []byte{0, 0, 0, 0}}
|
||||||
}
|
}
|
||||||
return &PacketConnWrapper{PacketConn: conn, udpAddr: addr}, nil
|
return &net.PacketConnWrapper{PacketConn: conn, Dest: addr}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fm *FinalMask) ListenPacket(ctx context.Context, addr net.Addr) (net.PacketConn, error) {
|
func (fm *FinalMask) ListenPacket(ctx context.Context, addr net.Addr) (net.PacketConn, error) {
|
||||||
@@ -272,24 +272,6 @@ const (
|
|||||||
UDPSize = 4096
|
UDPSize = 4096
|
||||||
)
|
)
|
||||||
|
|
||||||
type PacketConnWrapper struct {
|
|
||||||
net.PacketConn
|
|
||||||
udpAddr net.Addr
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PacketConnWrapper) RemoteAddr() net.Addr {
|
|
||||||
return c.udpAddr
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PacketConnWrapper) Read(b []byte) (n int, err error) {
|
|
||||||
n, _, err = c.PacketConn.ReadFrom(b)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PacketConnWrapper) Write(b []byte) (n int, err error) {
|
|
||||||
return c.PacketConn.WriteTo(b, c.udpAddr)
|
|
||||||
}
|
|
||||||
|
|
||||||
type headerManagerConn struct {
|
type headerManagerConn struct {
|
||||||
net.PacketConn
|
net.PacketConn
|
||||||
|
|
||||||
|
|||||||
@@ -380,7 +380,7 @@ func TestPacketConnReadWrite(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Cleanup(func() { clientConn.Close() })
|
t.Cleanup(func() { clientConn.Close() })
|
||||||
client := clientConn.(*finalmask.PacketConnWrapper).PacketConn
|
client := clientConn.(*net.PacketConnWrapper).PacketConn
|
||||||
|
|
||||||
_ = client.SetDeadline(time.Now().Add(time.Second))
|
_ = client.SetDeadline(time.Now().Add(time.Second))
|
||||||
_ = server.SetDeadline(time.Now().Add(time.Second))
|
_ = server.SetDeadline(time.Now().Add(time.Second))
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ func NewUDPHopConn(c *Config, dest *net.Destination, dialer *finalmask.Dialer) (
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
cur := conn.(*finalmask.PacketConnWrapper).PacketConn
|
cur := conn.(*net.PacketConnWrapper).PacketConn
|
||||||
addr := conn.RemoteAddr().(*net.UDPAddr)
|
addr := conn.RemoteAddr().(*net.UDPAddr)
|
||||||
client := &udpHopConn{
|
client := &udpHopConn{
|
||||||
dialer: dialer,
|
dialer: dialer,
|
||||||
@@ -150,7 +150,7 @@ func (c *udpHopConn) hop() {
|
|||||||
_ = c.pre.Close()
|
_ = c.pre.Close()
|
||||||
}
|
}
|
||||||
c.pre = c.cur
|
c.pre = c.cur
|
||||||
c.cur = conn.(*finalmask.PacketConnWrapper).PacketConn
|
c.cur = conn.(*net.PacketConnWrapper).PacketConn
|
||||||
c.wg.Add(1)
|
c.wg.Add(1)
|
||||||
go c.recv(c.cur)
|
go c.recv(c.cur)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ func (c *client) dial(ctx context.Context) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New("failed to dial to dest").Base(err)
|
return errors.New("failed to dial to dest").Base(err)
|
||||||
}
|
}
|
||||||
pktConn = conn.(*finalmask.PacketConnWrapper).PacketConn
|
pktConn = conn.(*net.PacketConnWrapper).PacketConn
|
||||||
udpAddr = conn.RemoteAddr()
|
udpAddr = conn.RemoteAddr()
|
||||||
} else {
|
} else {
|
||||||
conn, err := internet.DialSystem(ctx, c.dest, c.socketConfig)
|
conn, err := internet.DialSystem(ctx, c.dest, c.socketConfig)
|
||||||
@@ -127,7 +127,7 @@ func (c *client) dial(ctx context.Context) error {
|
|||||||
return errors.New("failed to dial to dest").Base(err)
|
return errors.New("failed to dial to dest").Base(err)
|
||||||
}
|
}
|
||||||
switch c := conn.(type) {
|
switch c := conn.(type) {
|
||||||
case *internet.PacketConnWrapper:
|
case *net.PacketConnWrapper:
|
||||||
pktConn = c.PacketConn
|
pktConn = c.PacketConn
|
||||||
udpAddr = c.RemoteAddr()
|
udpAddr = c.RemoteAddr()
|
||||||
case *cnc.Connection:
|
case *cnc.Connection:
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import (
|
|||||||
"github.com/xtls/xray-core/common/net/cnc"
|
"github.com/xtls/xray-core/common/net/cnc"
|
||||||
"github.com/xtls/xray-core/common/utils"
|
"github.com/xtls/xray-core/common/utils"
|
||||||
"github.com/xtls/xray-core/transport/internet"
|
"github.com/xtls/xray-core/transport/internet"
|
||||||
"github.com/xtls/xray-core/transport/internet/finalmask"
|
|
||||||
"github.com/xtls/xray-core/transport/internet/hysteria/congestion"
|
"github.com/xtls/xray-core/transport/internet/hysteria/congestion"
|
||||||
"github.com/xtls/xray-core/transport/internet/hysteria/congestion/bbr"
|
"github.com/xtls/xray-core/transport/internet/hysteria/congestion/bbr"
|
||||||
"github.com/xtls/xray-core/transport/internet/masque/connectip"
|
"github.com/xtls/xray-core/transport/internet/masque/connectip"
|
||||||
@@ -80,7 +79,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("failed to dial to dest").Base(err)
|
return nil, errors.New("failed to dial to dest").Base(err)
|
||||||
}
|
}
|
||||||
pktConn = conn.(*finalmask.PacketConnWrapper).PacketConn
|
pktConn = conn.(*net.PacketConnWrapper).PacketConn
|
||||||
udpAddr = conn.RemoteAddr()
|
udpAddr = conn.RemoteAddr()
|
||||||
} else {
|
} else {
|
||||||
conn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings)
|
conn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings)
|
||||||
@@ -88,7 +87,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
|
|||||||
return nil, errors.New("failed to dial to dest").Base(err)
|
return nil, errors.New("failed to dial to dest").Base(err)
|
||||||
}
|
}
|
||||||
switch c := conn.(type) {
|
switch c := conn.(type) {
|
||||||
case *internet.PacketConnWrapper:
|
case *net.PacketConnWrapper:
|
||||||
pktConn = c.PacketConn
|
pktConn = c.PacketConn
|
||||||
udpAddr = c.RemoteAddr()
|
udpAddr = c.RemoteAddr()
|
||||||
case *cnc.Connection:
|
case *cnc.Connection:
|
||||||
|
|||||||
@@ -54,11 +54,10 @@ func ToMemoryStreamConfig(s *StreamConfig) (*MemoryStreamConfig, error) {
|
|||||||
mss.SecurityType = s.SecurityType
|
mss.SecurityType = s.SecurityType
|
||||||
mss.SecuritySettings = ess
|
mss.SecuritySettings = ess
|
||||||
}
|
}
|
||||||
|
if s != nil && (len(s.Tcpmasks) != 0 || len(s.Udpmasks) != 0) {
|
||||||
|
var tcpMasks []finalmask.TCPMask
|
||||||
|
var udpMasks []finalmask.UDPMask
|
||||||
|
|
||||||
var tcpMasks []finalmask.TCPMask
|
|
||||||
var udpMasks []finalmask.UDPMask
|
|
||||||
|
|
||||||
if s != nil {
|
|
||||||
for i := range s.Tcpmasks {
|
for i := range s.Tcpmasks {
|
||||||
instance := common.Must2(s.Tcpmasks[i].GetInstance())
|
instance := common.Must2(s.Tcpmasks[i].GetInstance())
|
||||||
tcpMasks = append(tcpMasks, instance.(finalmask.TCPMask))
|
tcpMasks = append(tcpMasks, instance.(finalmask.TCPMask))
|
||||||
@@ -67,37 +66,37 @@ func ToMemoryStreamConfig(s *StreamConfig) (*MemoryStreamConfig, error) {
|
|||||||
instance := common.Must2(s.Udpmasks[i].GetInstance())
|
instance := common.Must2(s.Udpmasks[i].GetInstance())
|
||||||
udpMasks = append(udpMasks, instance.(finalmask.UDPMask))
|
udpMasks = append(udpMasks, instance.(finalmask.UDPMask))
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
dialTCP := func(ctx context.Context, dest net.Destination) (net.Conn, error) {
|
dialTCP := func(ctx context.Context, dest net.Destination) (net.Conn, error) {
|
||||||
return DialSystem(ctx, dest, mss.SocketSettings)
|
return DialSystem(ctx, dest, mss.SocketSettings)
|
||||||
}
|
|
||||||
listen := func(ctx context.Context, addr net.Addr) (net.Listener, error) {
|
|
||||||
return ListenSystem(ctx, addr, mss.SocketSettings)
|
|
||||||
}
|
|
||||||
dialUDP := func(ctx context.Context, dest net.Destination) (net.PacketConn, net.Addr, error) {
|
|
||||||
conn, err := DialSystem(ctx, dest, mss.SocketSettings)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
}
|
||||||
var newConn net.PacketConn
|
listen := func(ctx context.Context, addr net.Addr) (net.Listener, error) {
|
||||||
var udpAddr net.Addr
|
return ListenSystem(ctx, addr, mss.SocketSettings)
|
||||||
switch c := conn.(type) {
|
|
||||||
case *PacketConnWrapper:
|
|
||||||
newConn = c.PacketConn
|
|
||||||
udpAddr = conn.RemoteAddr()
|
|
||||||
case *cnc.Connection:
|
|
||||||
newConn = &FakePacketConn{Conn: c}
|
|
||||||
udpAddr = &net.UDPAddr{IP: []byte{0, 0, 0, 0}, Port: 0}
|
|
||||||
default:
|
|
||||||
panic(reflect.TypeOf(c))
|
|
||||||
}
|
}
|
||||||
return newConn, udpAddr, nil
|
dialUDP := func(ctx context.Context, dest net.Destination) (net.PacketConn, net.Addr, error) {
|
||||||
|
conn, err := DialSystem(ctx, dest, mss.SocketSettings)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
var newConn net.PacketConn
|
||||||
|
var udpAddr net.Addr
|
||||||
|
switch c := conn.(type) {
|
||||||
|
case *net.PacketConnWrapper:
|
||||||
|
newConn = c.PacketConn
|
||||||
|
udpAddr = conn.RemoteAddr()
|
||||||
|
case *cnc.Connection:
|
||||||
|
newConn = &FakePacketConn{Conn: c}
|
||||||
|
udpAddr = &net.UDPAddr{IP: []byte{0, 0, 0, 0}, Port: 0}
|
||||||
|
default:
|
||||||
|
panic(reflect.TypeOf(c))
|
||||||
|
}
|
||||||
|
return newConn, udpAddr, nil
|
||||||
|
}
|
||||||
|
listenPacket := func(ctx context.Context, addr net.Addr) (net.PacketConn, error) {
|
||||||
|
return ListenSystemPacket(ctx, addr, mss.SocketSettings)
|
||||||
|
}
|
||||||
|
mss.FinalMask = finalmask.NewFinalMask(tcpMasks, udpMasks, dialTCP, listen, dialUDP, listenPacket)
|
||||||
}
|
}
|
||||||
listenPacket := func(ctx context.Context, addr net.Addr) (net.PacketConn, error) {
|
|
||||||
return ListenSystemPacket(ctx, addr, mss.SocketSettings)
|
|
||||||
}
|
|
||||||
mss.FinalMask = finalmask.NewFinalMask(tcpMasks, udpMasks, dialTCP, listen, dialUDP, listenPacket)
|
|
||||||
|
|
||||||
if s != nil && s.QuicParams != nil {
|
if s != nil && s.QuicParams != nil {
|
||||||
mss.QuicParams = s.QuicParams
|
mss.QuicParams = s.QuicParams
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import (
|
|||||||
"github.com/xtls/xray-core/common/signal/done"
|
"github.com/xtls/xray-core/common/signal/done"
|
||||||
"github.com/xtls/xray-core/transport/internet"
|
"github.com/xtls/xray-core/transport/internet"
|
||||||
"github.com/xtls/xray-core/transport/internet/browser_dialer"
|
"github.com/xtls/xray-core/transport/internet/browser_dialer"
|
||||||
"github.com/xtls/xray-core/transport/internet/finalmask"
|
|
||||||
"github.com/xtls/xray-core/transport/internet/hysteria/congestion"
|
"github.com/xtls/xray-core/transport/internet/hysteria/congestion"
|
||||||
"github.com/xtls/xray-core/transport/internet/hysteria/congestion/bbr"
|
"github.com/xtls/xray-core/transport/internet/hysteria/congestion/bbr"
|
||||||
"github.com/xtls/xray-core/transport/internet/reality"
|
"github.com/xtls/xray-core/transport/internet/reality"
|
||||||
@@ -200,7 +199,7 @@ func createHTTPClient(dest net.Destination, streamSettings *internet.MemoryStrea
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("failed to dial to dest").Base(err)
|
return nil, errors.New("failed to dial to dest").Base(err)
|
||||||
}
|
}
|
||||||
pktConn = conn.(*finalmask.PacketConnWrapper).PacketConn
|
pktConn = conn.(*net.PacketConnWrapper).PacketConn
|
||||||
udpAddr = conn.RemoteAddr()
|
udpAddr = conn.RemoteAddr()
|
||||||
} else {
|
} else {
|
||||||
conn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings)
|
conn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings)
|
||||||
@@ -208,7 +207,7 @@ func createHTTPClient(dest net.Destination, streamSettings *internet.MemoryStrea
|
|||||||
return nil, errors.New("failed to dial to dest").Base(err)
|
return nil, errors.New("failed to dial to dest").Base(err)
|
||||||
}
|
}
|
||||||
switch c := conn.(type) {
|
switch c := conn.(type) {
|
||||||
case *internet.PacketConnWrapper:
|
case *net.PacketConnWrapper:
|
||||||
pktConn = c.PacketConn
|
pktConn = c.PacketConn
|
||||||
udpAddr = c.RemoteAddr()
|
udpAddr = c.RemoteAddr()
|
||||||
case *cnc.Connection:
|
case *cnc.Connection:
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest ne
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &PacketConnWrapper{
|
return &net.PacketConnWrapper{
|
||||||
PacketConn: packetConn,
|
PacketConn: packetConn,
|
||||||
Dest: destAddr,
|
Dest: destAddr,
|
||||||
}, nil
|
}, nil
|
||||||
@@ -148,24 +148,6 @@ func (d *DefaultSystemDialer) DestIpAddress() net.IP {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type PacketConnWrapper struct {
|
|
||||||
net.PacketConn
|
|
||||||
Dest net.Addr
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PacketConnWrapper) Read(p []byte) (int, error) {
|
|
||||||
n, _, err := c.PacketConn.ReadFrom(p)
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PacketConnWrapper) Write(p []byte) (int, error) {
|
|
||||||
return c.PacketConn.WriteTo(p, c.Dest)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PacketConnWrapper) RemoteAddr() net.Addr {
|
|
||||||
return c.Dest
|
|
||||||
}
|
|
||||||
|
|
||||||
type SystemDialerAdapter interface {
|
type SystemDialerAdapter interface {
|
||||||
Dial(network string, address string) (net.Conn, error)
|
Dial(network string, address string) (net.Conn, error)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user