Skip to content

Commit c0f5eec

Browse files
authored
Buffer RT(C)P packets that arrive pre-DTLS handshake completion (#160)
1 parent 6d67f23 commit c0f5eec

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

lib/ex_webrtc/dtls_transport.ex

+18-4
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ defmodule ExWebRTC.DTLSTransport do
108108
ice_connected: false,
109109
buffered_local_packets: nil,
110110
buffered_remote_packets: nil,
111+
buffered_remote_rtp_packets: [],
111112
cert: cert,
112113
base64_cert: Base.encode64(cert),
113114
pkey: pkey,
@@ -341,6 +342,7 @@ defmodule ExWebRTC.DTLSTransport do
341342
if peer_fingerprint == state.peer_fingerprint do
342343
:ok = setup_srtp(state, lkm, rkm, profile)
343344
state = update_dtls_state(state, :connected)
345+
state = flush_buffered_remote_rtp_packets(state)
344346
{:ok, state}
345347
else
346348
Logger.debug("Non-matching peer cert fingerprint.")
@@ -352,13 +354,15 @@ defmodule ExWebRTC.DTLSTransport do
352354
Logger.debug("DTLS handshake finished")
353355
:ok = setup_srtp(state, lkm, rkm, profile)
354356
state = update_dtls_state(state, :connected)
357+
state = flush_buffered_remote_rtp_packets(state)
355358
state = update_remote_cert_info(state)
356359
{:ok, state}
357360

358361
:handshake_want_read ->
359362
{:ok, state}
360363

361364
{:error, reason} = error ->
365+
# TODO: consider buffering DTLS packets that came out of order during the handshake
362366
Logger.debug("DTLS error: #{reason}")
363367
error
364368
end
@@ -384,11 +388,13 @@ defmodule ExWebRTC.DTLSTransport do
384388
{:ok, state}
385389
end
386390

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+
""")
391396

397+
state = %{state | buffered_remote_rtp_packets: [data | state.buffered_remote_rtp_packets]}
392398
{:ok, state}
393399
end
394400

@@ -433,5 +439,13 @@ defmodule ExWebRTC.DTLSTransport do
433439
%{state | remote_cert: cert, remote_base64_cert: base64_cert, remote_fingerprint: fingerprint}
434440
end
435441

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+
436450
defp notify(dst, msg), do: send(dst, {:dtls_transport, self(), msg})
437451
end

0 commit comments

Comments
 (0)