| 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..1228cd419a4cc33068ec6b19d6aee43b807cba6c 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 RRTR)
|
| +static const int32 kOutOfOrderMaxAgeMs = 500;
|
|
|
| namespace {
|
|
|
| @@ -112,6 +116,24 @@ 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.
|
| + VLOG(1) << "Rejecting RTCP packet as it is too old ("
|
| + << (largest_seen_timestamp_ - t).InMilliseconds()
|
| + << " ms)";
|
| + return true;
|
| + }
|
| +
|
| + 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 +141,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());
|
|
|