Proxy: Add MASQUE outbound & transport (IETF CONNECT-IP, RFC 9484) (#6807)

Closes https://github.com/XTLS/Xray-core/issues/5495#issuecomment-3710683679
This commit is contained in:
Esko Mobius
2026-09-24 02:13:37 +00:00
committed by GitHub
parent 9927942aaa
commit 7d3e44fee2
37 changed files with 5186 additions and 10 deletions
+17 -10
View File
@@ -199,9 +199,9 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
return errors.New("failed to create UDP connection").Base(err)
}
defer conn.Close()
c := &udpConnClient{
c := &UDPConnClient{
PacketConn: conn.(*internet.PacketConnWrapper).PacketConn,
dest: conn.RemoteAddr().(*net.UDPAddr),
Dest: conn.RemoteAddr().(*net.UDPAddr),
}
reader = c
writer = c
@@ -378,12 +378,12 @@ func (h *Handler) resolveLocal(host string) (net.IP, error) {
return got[dice.Roll(len(got))], nil
}
type udpConnClient struct {
type UDPConnClient struct {
net.PacketConn
dest *net.UDPAddr
Dest *net.UDPAddr
}
func (c *udpConnClient) ReadMultiBuffer() (buf.MultiBuffer, error) {
func (c *UDPConnClient) ReadMultiBuffer() (buf.MultiBuffer, error) {
b := buf.New()
b.Resize(0, buf.Size)
n, addr, err := c.PacketConn.ReadFrom(b.Bytes())
@@ -402,9 +402,9 @@ func (c *udpConnClient) ReadMultiBuffer() (buf.MultiBuffer, error) {
return buf.MultiBuffer{b}, nil
}
func (c *udpConnClient) WriteMultiBuffer(mb buf.MultiBuffer) error {
func (c *UDPConnClient) WriteMultiBuffer(mb buf.MultiBuffer) error {
for i, b := range mb {
dst := c.dest
dst := c.Dest
if b.UDP != nil {
if b.UDP.Address.Family().IsDomain() {
if b.UDP.Port != net.Port(dst.Port) {
@@ -462,20 +462,27 @@ func (c *cache) run() {
return
}
c.running = true
c.m = make(map[string]entry)
if c.m == nil {
c.m = make(map[string]entry)
}
go c.gc()
}
func (c *cache) gc() {
ticker := time.NewTicker(time.Minute)
for {
now := <-ticker.C
defer ticker.Stop()
for now := range ticker.C {
c.mu.Lock()
for key, entry := range c.m {
if now.After(entry.deadline) {
delete(c.m, key)
}
}
if len(c.m) == 0 {
c.running = false
c.mu.Unlock()
return
}
c.mu.Unlock()
}
}