TUN-8646: Allow experimental feature support for datagram v3
Closes TUN-8646
This commit is contained in:
parent
5891c0d955
commit
589c198d2d
|
@ -0,0 +1,48 @@
|
||||||
|
package connection
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/quic-go/quic-go"
|
||||||
|
"github.com/rs/zerolog"
|
||||||
|
|
||||||
|
cfdquic "github.com/cloudflare/cloudflared/quic/v3"
|
||||||
|
"github.com/cloudflare/cloudflared/tunnelrpc/pogs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type datagramV3Connection struct {
|
||||||
|
conn quic.Connection
|
||||||
|
// datagramMuxer mux/demux datagrams from quic connection
|
||||||
|
datagramMuxer cfdquic.DatagramConn
|
||||||
|
logger *zerolog.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDatagramV3Connection(ctx context.Context,
|
||||||
|
conn quic.Connection,
|
||||||
|
sessionManager cfdquic.SessionManager,
|
||||||
|
logger *zerolog.Logger,
|
||||||
|
) DatagramSessionHandler {
|
||||||
|
datagramMuxer := cfdquic.NewDatagramConn(conn, sessionManager, logger)
|
||||||
|
|
||||||
|
return &datagramV3Connection{
|
||||||
|
conn,
|
||||||
|
datagramMuxer,
|
||||||
|
logger,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *datagramV3Connection) Serve(ctx context.Context) error {
|
||||||
|
return d.datagramMuxer.Serve(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *datagramV3Connection) RegisterUdpSession(ctx context.Context, sessionID uuid.UUID, dstIP net.IP, dstPort uint16, closeAfterIdleHint time.Duration, traceContext string) (*pogs.RegisterUdpSessionResponse, error) {
|
||||||
|
return nil, fmt.Errorf("datagram v3 does not support RegisterUdpSession RPC")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *datagramV3Connection) UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID, message string) error {
|
||||||
|
return fmt.Errorf("datagram v3 does not support UnregisterUdpSession RPC")
|
||||||
|
}
|
|
@ -12,7 +12,9 @@ import (
|
||||||
|
|
||||||
"github.com/cloudflare/cloudflared/connection"
|
"github.com/cloudflare/cloudflared/connection"
|
||||||
"github.com/cloudflare/cloudflared/edgediscovery"
|
"github.com/cloudflare/cloudflared/edgediscovery"
|
||||||
|
"github.com/cloudflare/cloudflared/ingress"
|
||||||
"github.com/cloudflare/cloudflared/orchestration"
|
"github.com/cloudflare/cloudflared/orchestration"
|
||||||
|
v3 "github.com/cloudflare/cloudflared/quic/v3"
|
||||||
"github.com/cloudflare/cloudflared/retry"
|
"github.com/cloudflare/cloudflared/retry"
|
||||||
"github.com/cloudflare/cloudflared/signal"
|
"github.com/cloudflare/cloudflared/signal"
|
||||||
"github.com/cloudflare/cloudflared/tunnelstate"
|
"github.com/cloudflare/cloudflared/tunnelstate"
|
||||||
|
@ -80,9 +82,12 @@ func NewSupervisor(config *TunnelConfig, orchestrator *orchestration.Orchestrato
|
||||||
edgeAddrHandler := NewIPAddrFallback(config.MaxEdgeAddrRetries)
|
edgeAddrHandler := NewIPAddrFallback(config.MaxEdgeAddrRetries)
|
||||||
edgeBindAddr := config.EdgeBindAddr
|
edgeBindAddr := config.EdgeBindAddr
|
||||||
|
|
||||||
|
sessionManager := v3.NewSessionManager(config.Log, ingress.DialUDPAddrPort)
|
||||||
|
|
||||||
edgeTunnelServer := EdgeTunnelServer{
|
edgeTunnelServer := EdgeTunnelServer{
|
||||||
config: config,
|
config: config,
|
||||||
orchestrator: orchestrator,
|
orchestrator: orchestrator,
|
||||||
|
sessionManager: sessionManager,
|
||||||
edgeAddrs: edgeIPs,
|
edgeAddrs: edgeIPs,
|
||||||
edgeAddrHandler: edgeAddrHandler,
|
edgeAddrHandler: edgeAddrHandler,
|
||||||
edgeBindAddr: edgeBindAddr,
|
edgeBindAddr: edgeBindAddr,
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
@ -24,6 +25,7 @@ import (
|
||||||
"github.com/cloudflare/cloudflared/management"
|
"github.com/cloudflare/cloudflared/management"
|
||||||
"github.com/cloudflare/cloudflared/orchestration"
|
"github.com/cloudflare/cloudflared/orchestration"
|
||||||
quicpogs "github.com/cloudflare/cloudflared/quic"
|
quicpogs "github.com/cloudflare/cloudflared/quic"
|
||||||
|
v3 "github.com/cloudflare/cloudflared/quic/v3"
|
||||||
"github.com/cloudflare/cloudflared/retry"
|
"github.com/cloudflare/cloudflared/retry"
|
||||||
"github.com/cloudflare/cloudflared/signal"
|
"github.com/cloudflare/cloudflared/signal"
|
||||||
"github.com/cloudflare/cloudflared/tunnelrpc/pogs"
|
"github.com/cloudflare/cloudflared/tunnelrpc/pogs"
|
||||||
|
@ -87,14 +89,6 @@ func (c *TunnelConfig) connectionOptions(originLocalAddr string, numPreviousAtte
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *TunnelConfig) SupportedFeatures() []string {
|
|
||||||
supported := []string{features.FeatureSerializedHeaders}
|
|
||||||
if c.NamedTunnel == nil {
|
|
||||||
supported = append(supported, features.FeatureQuickReconnects)
|
|
||||||
}
|
|
||||||
return supported
|
|
||||||
}
|
|
||||||
|
|
||||||
func StartTunnelDaemon(
|
func StartTunnelDaemon(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
config *TunnelConfig,
|
config *TunnelConfig,
|
||||||
|
@ -181,6 +175,7 @@ func (f *ipAddrFallback) ShouldGetNewAddress(connIndex uint8, err error) (needsN
|
||||||
type EdgeTunnelServer struct {
|
type EdgeTunnelServer struct {
|
||||||
config *TunnelConfig
|
config *TunnelConfig
|
||||||
orchestrator *orchestration.Orchestrator
|
orchestrator *orchestration.Orchestrator
|
||||||
|
sessionManager v3.SessionManager
|
||||||
edgeAddrHandler EdgeAddrHandler
|
edgeAddrHandler EdgeAddrHandler
|
||||||
edgeAddrs *edgediscovery.Edge
|
edgeAddrs *edgediscovery.Edge
|
||||||
edgeBindAddr net.IP
|
edgeBindAddr net.IP
|
||||||
|
@ -605,14 +600,24 @@ func (e *EdgeTunnelServer) serveQUIC(
|
||||||
return err, true
|
return err, true
|
||||||
}
|
}
|
||||||
|
|
||||||
datagramSessionManager := connection.NewDatagramV2Connection(
|
var datagramSessionManager connection.DatagramSessionHandler
|
||||||
ctx,
|
if slices.Contains(connOptions.Client.Features, features.FeatureDatagramV3) {
|
||||||
conn,
|
datagramSessionManager = connection.NewDatagramV3Connection(
|
||||||
e.config.PacketConfig,
|
ctx,
|
||||||
e.config.RPCTimeout,
|
conn,
|
||||||
e.config.WriteStreamTimeout,
|
e.sessionManager,
|
||||||
connLogger.Logger(),
|
connLogger.Logger(),
|
||||||
)
|
)
|
||||||
|
} else {
|
||||||
|
datagramSessionManager = connection.NewDatagramV2Connection(
|
||||||
|
ctx,
|
||||||
|
conn,
|
||||||
|
e.config.PacketConfig,
|
||||||
|
e.config.RPCTimeout,
|
||||||
|
e.config.WriteStreamTimeout,
|
||||||
|
connLogger.Logger(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// Wrap the [quic.Connection] as a TunnelConnection
|
// Wrap the [quic.Connection] as a TunnelConnection
|
||||||
tunnelConn, err := connection.NewTunnelConnection(
|
tunnelConn, err := connection.NewTunnelConnection(
|
||||||
|
|
Loading…
Reference in New Issue