Index: media/cast/net/rtcp/rtcp.cc |
diff --git a/media/cast/net/rtcp/rtcp.cc b/media/cast/net/rtcp/rtcp.cc |
index c78e63b6c956b86a43265a720a23be936e5459a7..dc94ed82c8ca3575ab320bc49430bff88a468d89 100644 |
--- a/media/cast/net/rtcp/rtcp.cc |
+++ b/media/cast/net/rtcp/rtcp.cc |
@@ -18,6 +18,10 @@ namespace media { |
namespace cast { |
static const int32 kMaxRttMs = 10000; // 10 seconds. |
+// Reject packets that are older than 0.5 seconds older than |
+// the newest packet we've seen so far. This protect internal |
+// states from crazy routers. (Based on RTRR) |
Alpha Left Google
2014/08/19 18:01:35
nit: RRTR.
hubbe
2014/08/19 18:27:16
Done.
|
+static const int32 kOutOfOrderMaxAgeMs = 500; |
namespace { |
@@ -112,6 +116,21 @@ bool Rtcp::IncomingRtcpPacket(const uint8* data, size_t length) { |
RtcpParser parser(local_ssrc_, remote_ssrc_); |
base::BigEndianReader reader(reinterpret_cast<const char*>(data), length); |
if (parser.Parse(&reader)) { |
+ if (parser.has_receiver_reference_time_report()) { |
+ base::TimeTicks t = ConvertNtpToTimeTicks( |
+ parser.receiver_reference_time_report().ntp_seconds, |
+ parser.receiver_reference_time_report().ntp_fraction); |
+ if (t > largest_seen_timestamp_) { |
+ largest_seen_timestamp_ = t; |
+ } else if ((largest_seen_timestamp_ - t).InMilliseconds() > |
+ kOutOfOrderMaxAgeMs) { |
+ // Reject packet, it is too old. |
+ return true; |
Alpha Left Google
2014/08/19 18:01:35
Please add a VLOG here.
hubbe
2014/08/19 18:27:16
Done.
|
+ } |
+ |
+ OnReceivedNtp(parser.receiver_reference_time_report().ntp_seconds, |
+ parser.receiver_reference_time_report().ntp_fraction); |
+ } |
if (parser.has_sender_report()) { |
OnReceivedNtp(parser.sender_report().ntp_seconds, |
parser.sender_report().ntp_fraction); |
@@ -119,10 +138,6 @@ bool Rtcp::IncomingRtcpPacket(const uint8* data, size_t length) { |
parser.sender_report().ntp_seconds, |
parser.sender_report().ntp_fraction); |
} |
- if (parser.has_receiver_reference_time_report()) { |
- OnReceivedNtp(parser.receiver_reference_time_report().ntp_seconds, |
- parser.receiver_reference_time_report().ntp_fraction); |
- } |
if (parser.has_receiver_log()) { |
if (DedupeReceiverLog(parser.mutable_receiver_log())) { |
OnReceivedReceiverLog(parser.receiver_log()); |