@@ -108,6 +108,7 @@ defmodule ExWebRTC.DTLSTransport do
108
108
ice_connected: false ,
109
109
buffered_local_packets: nil ,
110
110
buffered_remote_packets: nil ,
111
+ buffered_remote_rtp_packets: [ ] ,
111
112
cert: cert ,
112
113
base64_cert: Base . encode64 ( cert ) ,
113
114
pkey: pkey ,
@@ -341,6 +342,7 @@ defmodule ExWebRTC.DTLSTransport do
341
342
if peer_fingerprint == state . peer_fingerprint do
342
343
:ok = setup_srtp ( state , lkm , rkm , profile )
343
344
state = update_dtls_state ( state , :connected )
345
+ state = flush_buffered_remote_rtp_packets ( state )
344
346
{ :ok , state }
345
347
else
346
348
Logger . debug ( "Non-matching peer cert fingerprint." )
@@ -352,13 +354,15 @@ defmodule ExWebRTC.DTLSTransport do
352
354
Logger . debug ( "DTLS handshake finished" )
353
355
:ok = setup_srtp ( state , lkm , rkm , profile )
354
356
state = update_dtls_state ( state , :connected )
357
+ state = flush_buffered_remote_rtp_packets ( state )
355
358
state = update_remote_cert_info ( state )
356
359
{ :ok , state }
357
360
358
361
:handshake_want_read ->
359
362
{ :ok , state }
360
363
361
364
{ :error , reason } = error ->
365
+ # TODO: consider buffering DTLS packets that came out of order during the handshake
362
366
Logger . debug ( "DTLS error: #{ reason } " )
363
367
error
364
368
end
@@ -384,11 +388,13 @@ defmodule ExWebRTC.DTLSTransport do
384
388
{ :ok , state }
385
389
end
386
390
387
- defp handle_ice_data ( { :data , _data } , state ) do
388
- Logger . warning (
389
- "Received RTP/RTCP packets, but DTLS handshake hasn't been finished yet. Ignoring."
390
- )
391
+ defp handle_ice_data ( { :data , data } , state ) do
392
+ Logger . debug ( """
393
+ Received RTP/RTCP packets, but DTLS handshake hasn't been finished yet. \
394
+ They will be processed after the completion of the handshake.\
395
+ """ )
391
396
397
+ state = % { state | buffered_remote_rtp_packets: [ data | state . buffered_remote_rtp_packets ] }
392
398
{ :ok , state }
393
399
end
394
400
@@ -433,5 +439,13 @@ defmodule ExWebRTC.DTLSTransport do
433
439
% { state | remote_cert: cert , remote_base64_cert: base64_cert , remote_fingerprint: fingerprint }
434
440
end
435
441
442
+ defp flush_buffered_remote_rtp_packets ( state ) do
443
+ for data <- Enum . reverse ( state . buffered_remote_rtp_packets ) do
444
+ send ( self ( ) , { :ex_ice , state . ice_pid , { :data , data } } )
445
+ end
446
+
447
+ % { state | buffered_remote_rtp_packets: [ ] }
448
+ end
449
+
436
450
defp notify ( dst , msg ) , do: send ( dst , { :dtls_transport , self ( ) , msg } )
437
451
end
0 commit comments