@@ -147,29 +147,11 @@ func TestSendToEncryptedBeforeKeyExchangeQueuesAndInitiates(t *testing.T) {
147147 defer peerConn .Close ()
148148 peerAddr := peerConn .LocalAddr ().(* net.UDPAddr )
149149
150- // sendKeyExchangeToNode looks up addr from tm.peers, so register 77.
150+ // AddPeer registers the address and fires one KE frame (the dedup guard
151+ // prevents SendTo from firing a second one while the first is pending).
151152 tm .AddPeer (77 , peerAddr )
152- // Drain the AddPeer-triggered key-exchange frame so the real SendTo check is clean.
153- drainBuf := make ([]byte , 1500 )
154- peerConn .SetReadDeadline (deadlineMS (200 ))
155- peerConn .ReadFromUDP (drainBuf )
156153
157- // No crypto for node 77 yet → SendTo should queue and initiate key exchange.
158- if err := tm .SendTo (peerAddr , 77 , newPacket ("q1" )); err != nil {
159- t .Fatalf ("SendTo: %v" , err )
160- }
161- if err := tm .SendTo (peerAddr , 77 , newPacket ("q2" )); err != nil {
162- t .Fatalf ("SendTo: %v" , err )
163- }
164-
165- tm .pendMu .Lock ()
166- queued := len (tm .pending [77 ])
167- tm .pendMu .Unlock ()
168- if queued != 2 {
169- t .Fatalf ("pending[77] = %d, want 2" , queued )
170- }
171-
172- // Peer should have received at least one key-exchange frame (PILK magic).
154+ // Peer should have received the AddPeer-triggered KE frame (PILK magic).
173155 buf := make ([]byte , 1500 )
174156 if err := peerConn .SetReadDeadline (deadlineMS (500 )); err != nil {
175157 t .Fatalf ("setdeadline: %v" , err )
@@ -185,6 +167,29 @@ func TestSendToEncryptedBeforeKeyExchangeQueuesAndInitiates(t *testing.T) {
185167 if string (buf [0 :4 ]) != string (protocol .TunnelMagicKeyEx [:]) {
186168 t .Fatalf ("expected PILK magic for key-exchange init, got %x" , buf [0 :4 ])
187169 }
170+
171+ // Multiple SendTo calls before crypto is ready must queue all packets
172+ // and must NOT fire additional KE frames (dedup guard keeps one in-flight).
173+ if err := tm .SendTo (peerAddr , 77 , newPacket ("q1" )); err != nil {
174+ t .Fatalf ("SendTo: %v" , err )
175+ }
176+ if err := tm .SendTo (peerAddr , 77 , newPacket ("q2" )); err != nil {
177+ t .Fatalf ("SendTo: %v" , err )
178+ }
179+
180+ tm .pendMu .Lock ()
181+ queued := len (tm .pending [77 ])
182+ tm .pendMu .Unlock ()
183+ if queued != 2 {
184+ t .Fatalf ("pending[77] = %d, want 2" , queued )
185+ }
186+
187+ // No second KE frame should have been sent (dedup guard).
188+ peerConn .SetReadDeadline (deadlineMS (100 ))
189+ var extra [1500 ]byte
190+ if _ , _ , err2 := peerConn .ReadFromUDP (extra [:]); err2 == nil {
191+ t .Fatal ("unexpected second KE frame — dedup guard should suppress it" )
192+ }
188193}
189194
190195func TestSendToEncryptedWithReadyCryptoSendsEncryptedFrame (t * testing.T ) {
0 commit comments