From e54707cfe9ce5ca6216367f3f6454fd86900c7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Tue, 24 Mar 2026 14:01:28 +0800 Subject: [PATCH] Return v3 registration protocol errors --- protocol/cloudflare/datagram_v3.go | 4 ++-- protocol/cloudflare/datagram_v3_test.go | 26 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/protocol/cloudflare/datagram_v3.go b/protocol/cloudflare/datagram_v3.go index c40459117..ea23ed21c 100644 --- a/protocol/cloudflare/datagram_v3.go +++ b/protocol/cloudflare/datagram_v3.go @@ -120,7 +120,7 @@ func (m *DatagramV3Muxer) handleRegistration(ctx context.Context, data []byte) { if flags&v3FlagIPv6 != 0 { if len(data) < offset+v3IPv6AddrLen { - m.logger.Debug("V3 registration too short for IPv6") + m.sendRegistrationResponse(requestID, v3ResponseErrorWithMsg, "registration too short for IPv6") return } var addr [16]byte @@ -129,7 +129,7 @@ func (m *DatagramV3Muxer) handleRegistration(ctx context.Context, data []byte) { offset += v3IPv6AddrLen } else { if len(data) < offset+v3IPv4AddrLen { - m.logger.Debug("V3 registration too short for IPv4") + m.sendRegistrationResponse(requestID, v3ResponseErrorWithMsg, "registration too short for IPv4") return } var addr [4]byte diff --git a/protocol/cloudflare/datagram_v3_test.go b/protocol/cloudflare/datagram_v3_test.go index ae41d8ca9..5703310c0 100644 --- a/protocol/cloudflare/datagram_v3_test.go +++ b/protocol/cloudflare/datagram_v3_test.go @@ -36,3 +36,29 @@ func TestDatagramV3RegistrationDestinationUnreachable(t *testing.T) { t.Fatalf("unexpected datagram response: %v", sender.sent[0]) } } + +func TestDatagramV3RegistrationErrorWithMessage(t *testing.T) { + sender := &captureDatagramSender{} + inboundInstance := &Inbound{ + Adapter: inbound.NewAdapter(C.TypeCloudflareTunnel, "test"), + flowLimiter: &FlowLimiter{}, + } + muxer := NewDatagramV3Muxer(inboundInstance, sender, nil) + + requestID := RequestID{} + requestID[15] = 2 + payload := make([]byte, 1+2+2+16+1) + payload[0] = 1 + binary.BigEndian.PutUint16(payload[1:3], 53) + binary.BigEndian.PutUint16(payload[3:5], 30) + copy(payload[5:21], requestID[:]) + payload[21] = 0xaa + + muxer.handleRegistration(context.Background(), payload) + if len(sender.sent) != 1 { + t.Fatalf("expected one registration response, got %d", len(sender.sent)) + } + if sender.sent[0][0] != byte(DatagramV3TypeRegistrationResponse) || sender.sent[0][1] != v3ResponseErrorWithMsg { + t.Fatalf("unexpected datagram response: %v", sender.sent[0]) + } +}