@@ -9,13 +9,17 @@ import (
99 "encoding/pem"
1010 "fmt"
1111 "math/big"
12+ "net/netip"
1213 "testing"
1314 "time"
1415
16+ "github.com/google/gopacket/layers"
1517 "github.com/google/uuid"
1618 "github.com/lucas-clemente/quic-go"
1719 "github.com/rs/zerolog"
1820 "github.com/stretchr/testify/require"
21+ "golang.org/x/net/icmp"
22+ "golang.org/x/net/ipv4"
1923 "golang.org/x/sync/errgroup"
2024
2125 "github.com/cloudflare/cloudflared/packet"
@@ -68,15 +72,45 @@ func TestDatagram(t *testing.T) {
6872 Payload : maxPayload ,
6973 },
7074 }
71- flowPayloads := [][]byte {
72- maxPayload ,
75+
76+ packets := []packet.ICMP {
77+ {
78+ IP : & packet.IP {
79+ Src : netip .MustParseAddr ("172.16.0.1" ),
80+ Dst : netip .MustParseAddr ("192.168.0.1" ),
81+ Protocol : layers .IPProtocolICMPv4 ,
82+ },
83+ Message : & icmp.Message {
84+ Type : ipv4 .ICMPTypeTimeExceeded ,
85+ Code : 0 ,
86+ Body : & icmp.TimeExceeded {
87+ Data : []byte ("original packet" ),
88+ },
89+ },
90+ },
91+ {
92+ IP : & packet.IP {
93+ Src : netip .MustParseAddr ("172.16.0.2" ),
94+ Dst : netip .MustParseAddr ("192.168.0.2" ),
95+ Protocol : layers .IPProtocolICMPv4 ,
96+ },
97+ Message : & icmp.Message {
98+ Type : ipv4 .ICMPTypeEcho ,
99+ Code : 0 ,
100+ Body : & icmp.Echo {
101+ ID : 6182 ,
102+ Seq : 9151 ,
103+ Data : []byte ("Test ICMP echo" ),
104+ },
105+ },
106+ },
73107 }
74108
75109 testDatagram (t , 1 , sessionToPayload , nil )
76- testDatagram (t , 2 , sessionToPayload , flowPayloads )
110+ testDatagram (t , 2 , sessionToPayload , packets )
77111}
78112
79- func testDatagram (t * testing.T , version uint8 , sessionToPayloads []* packet.Session , packetPayloads [][] byte ) {
113+ func testDatagram (t * testing.T , version uint8 , sessionToPayloads []* packet.Session , packets []packet. ICMP ) {
80114 quicConfig := & quic.Config {
81115 KeepAlivePeriod : 5 * time .Millisecond ,
82116 EnableDatagrams : true ,
@@ -103,12 +137,20 @@ func testDatagram(t *testing.T, version uint8, sessionToPayloads []*packet.Sessi
103137 muxer := NewDatagramMuxer (quicSession , & logger , sessionDemuxChan )
104138 muxer .ServeReceive (ctx )
105139 case 2 :
106- packetDemuxChan := make (chan []byte , len (packetPayloads ))
107- muxer := NewDatagramMuxerV2 (quicSession , & logger , sessionDemuxChan , packetDemuxChan )
140+ muxer := NewDatagramMuxerV2 (quicSession , & logger , sessionDemuxChan )
108141 muxer .ServeReceive (ctx )
109142
110- for _ , expectedPayload := range packetPayloads {
111- require .Equal (t , expectedPayload , <- packetDemuxChan )
143+ icmpDecoder := packet .NewICMPDecoder ()
144+ for _ , pk := range packets {
145+ received , err := muxer .ReceivePacket (ctx )
146+ require .NoError (t , err )
147+
148+ receivedICMP , err := icmpDecoder .Decode (received .Data )
149+ require .NoError (t , err )
150+ require .Equal (t , pk .IP , receivedICMP .IP )
151+ require .Equal (t , pk .Type , receivedICMP .Type )
152+ require .Equal (t , pk .Code , receivedICMP .Code )
153+ require .Equal (t , pk .Body , receivedICMP .Body )
112154 }
113155 default :
114156 return fmt .Errorf ("unknown datagram version %d" , version )
@@ -141,12 +183,17 @@ func testDatagram(t *testing.T, version uint8, sessionToPayloads []*packet.Sessi
141183 case 1 :
142184 muxer = NewDatagramMuxer (quicSession , & logger , nil )
143185 case 2 :
144- muxerV2 := NewDatagramMuxerV2 (quicSession , & logger , nil , nil )
145- for _ , payload := range packetPayloads {
146- require .NoError (t , muxerV2 .MuxPacket (payload ))
186+ muxerV2 := NewDatagramMuxerV2 (quicSession , & logger , nil )
187+ encoder := packet .NewEncoder ()
188+ for _ , pk := range packets {
189+ encodedPacket , err := encoder .Encode (& pk )
190+ require .NoError (t , err )
191+ require .NoError (t , muxerV2 .SendPacket (encodedPacket ))
147192 }
148193 // Payload larger than transport MTU, should not be sent
149- require .Error (t , muxerV2 .MuxPacket (largePayload ))
194+ require .Error (t , muxerV2 .SendPacket (packet.RawPacket {
195+ Data : largePayload ,
196+ }))
150197 muxer = muxerV2
151198 default :
152199 return fmt .Errorf ("unknown datagram version %d" , version )
0 commit comments