Skip to content

Commit 589c198

Browse files
committed
TUN-8646: Allow experimental feature support for datagram v3
Closes TUN-8646
1 parent 5891c0d commit 589c198

File tree

3 files changed

+74
-16
lines changed

3 files changed

+74
-16
lines changed

connection/quic_datagram_v3.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package connection
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net"
7+
"time"
8+
9+
"github.com/google/uuid"
10+
"github.com/quic-go/quic-go"
11+
"github.com/rs/zerolog"
12+
13+
cfdquic "github.com/cloudflare/cloudflared/quic/v3"
14+
"github.com/cloudflare/cloudflared/tunnelrpc/pogs"
15+
)
16+
17+
type datagramV3Connection struct {
18+
conn quic.Connection
19+
// datagramMuxer mux/demux datagrams from quic connection
20+
datagramMuxer cfdquic.DatagramConn
21+
logger *zerolog.Logger
22+
}
23+
24+
func NewDatagramV3Connection(ctx context.Context,
25+
conn quic.Connection,
26+
sessionManager cfdquic.SessionManager,
27+
logger *zerolog.Logger,
28+
) DatagramSessionHandler {
29+
datagramMuxer := cfdquic.NewDatagramConn(conn, sessionManager, logger)
30+
31+
return &datagramV3Connection{
32+
conn,
33+
datagramMuxer,
34+
logger,
35+
}
36+
}
37+
38+
func (d *datagramV3Connection) Serve(ctx context.Context) error {
39+
return d.datagramMuxer.Serve(ctx)
40+
}
41+
42+
func (d *datagramV3Connection) RegisterUdpSession(ctx context.Context, sessionID uuid.UUID, dstIP net.IP, dstPort uint16, closeAfterIdleHint time.Duration, traceContext string) (*pogs.RegisterUdpSessionResponse, error) {
43+
return nil, fmt.Errorf("datagram v3 does not support RegisterUdpSession RPC")
44+
}
45+
46+
func (d *datagramV3Connection) UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID, message string) error {
47+
return fmt.Errorf("datagram v3 does not support UnregisterUdpSession RPC")
48+
}

supervisor/supervisor.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import (
1212

1313
"github.com/cloudflare/cloudflared/connection"
1414
"github.com/cloudflare/cloudflared/edgediscovery"
15+
"github.com/cloudflare/cloudflared/ingress"
1516
"github.com/cloudflare/cloudflared/orchestration"
17+
v3 "github.com/cloudflare/cloudflared/quic/v3"
1618
"github.com/cloudflare/cloudflared/retry"
1719
"github.com/cloudflare/cloudflared/signal"
1820
"github.com/cloudflare/cloudflared/tunnelstate"
@@ -80,9 +82,12 @@ func NewSupervisor(config *TunnelConfig, orchestrator *orchestration.Orchestrato
8082
edgeAddrHandler := NewIPAddrFallback(config.MaxEdgeAddrRetries)
8183
edgeBindAddr := config.EdgeBindAddr
8284

85+
sessionManager := v3.NewSessionManager(config.Log, ingress.DialUDPAddrPort)
86+
8387
edgeTunnelServer := EdgeTunnelServer{
8488
config: config,
8589
orchestrator: orchestrator,
90+
sessionManager: sessionManager,
8691
edgeAddrs: edgeIPs,
8792
edgeAddrHandler: edgeAddrHandler,
8893
edgeBindAddr: edgeBindAddr,

supervisor/tunnel.go

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"net"
88
"net/netip"
99
"runtime/debug"
10+
"slices"
1011
"strings"
1112
"sync"
1213
"time"
@@ -24,6 +25,7 @@ import (
2425
"github.com/cloudflare/cloudflared/management"
2526
"github.com/cloudflare/cloudflared/orchestration"
2627
quicpogs "github.com/cloudflare/cloudflared/quic"
28+
v3 "github.com/cloudflare/cloudflared/quic/v3"
2729
"github.com/cloudflare/cloudflared/retry"
2830
"github.com/cloudflare/cloudflared/signal"
2931
"github.com/cloudflare/cloudflared/tunnelrpc/pogs"
@@ -87,14 +89,6 @@ func (c *TunnelConfig) connectionOptions(originLocalAddr string, numPreviousAtte
8789
}
8890
}
8991

90-
func (c *TunnelConfig) SupportedFeatures() []string {
91-
supported := []string{features.FeatureSerializedHeaders}
92-
if c.NamedTunnel == nil {
93-
supported = append(supported, features.FeatureQuickReconnects)
94-
}
95-
return supported
96-
}
97-
9892
func StartTunnelDaemon(
9993
ctx context.Context,
10094
config *TunnelConfig,
@@ -181,6 +175,7 @@ func (f *ipAddrFallback) ShouldGetNewAddress(connIndex uint8, err error) (needsN
181175
type EdgeTunnelServer struct {
182176
config *TunnelConfig
183177
orchestrator *orchestration.Orchestrator
178+
sessionManager v3.SessionManager
184179
edgeAddrHandler EdgeAddrHandler
185180
edgeAddrs *edgediscovery.Edge
186181
edgeBindAddr net.IP
@@ -605,14 +600,24 @@ func (e *EdgeTunnelServer) serveQUIC(
605600
return err, true
606601
}
607602

608-
datagramSessionManager := connection.NewDatagramV2Connection(
609-
ctx,
610-
conn,
611-
e.config.PacketConfig,
612-
e.config.RPCTimeout,
613-
e.config.WriteStreamTimeout,
614-
connLogger.Logger(),
615-
)
603+
var datagramSessionManager connection.DatagramSessionHandler
604+
if slices.Contains(connOptions.Client.Features, features.FeatureDatagramV3) {
605+
datagramSessionManager = connection.NewDatagramV3Connection(
606+
ctx,
607+
conn,
608+
e.sessionManager,
609+
connLogger.Logger(),
610+
)
611+
} else {
612+
datagramSessionManager = connection.NewDatagramV2Connection(
613+
ctx,
614+
conn,
615+
e.config.PacketConfig,
616+
e.config.RPCTimeout,
617+
e.config.WriteStreamTimeout,
618+
connLogger.Logger(),
619+
)
620+
}
616621

617622
// Wrap the [quic.Connection] as a TunnelConnection
618623
tunnelConn, err := connection.NewTunnelConnection(

0 commit comments

Comments
 (0)