From 2e4f82a98e694156038606ac906143e6667e69d2 Mon Sep 17 00:00:00 2001 From: Myles Putnam Date: Tue, 28 May 2019 15:01:59 -0600 Subject: [PATCH] Handle sequence numbers rolling over to zero in AbstractRtpSession --- .../efflux/session/AbstractRtpSession.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/biasedbit/efflux/session/AbstractRtpSession.java b/src/main/java/com/biasedbit/efflux/session/AbstractRtpSession.java index e32e364..46ec2f2 100644 --- a/src/main/java/com/biasedbit/efflux/session/AbstractRtpSession.java +++ b/src/main/java/com/biasedbit/efflux/session/AbstractRtpSession.java @@ -86,6 +86,8 @@ public abstract class AbstractRtpSession implements RtpSession, TimerTask { protected static final boolean AUTOMATED_RTCP_HANDLING = true; protected static final boolean TRY_TO_UPDATE_ON_EVERY_SDES = true; protected static final int PARTICIPANT_DATABASE_CLEANUP = 10; + protected static final int SEQUENCE_NUMBER_WRAP_BOUND = 32767; + protected static final int MAX_SEQUENCE_NUMBER_FOR_WRAP = 1000; // configuration -------------------------------------------------------------------------------------------------- @@ -103,6 +105,8 @@ public abstract class AbstractRtpSession implements RtpSession, TimerTask { protected boolean automatedRtcpHandling; protected boolean tryToUpdateOnEverySdes; protected int participantDatabaseCleanup; + protected int sequenceNumberWrapBound; + protected int maxSequenceNumberForWrap; // internal vars -------------------------------------------------------------------------------------------------- @@ -182,6 +186,8 @@ public AbstractRtpSession(String id, int payloadType, RtpParticipant local, Hash this.automatedRtcpHandling = AUTOMATED_RTCP_HANDLING; this.tryToUpdateOnEverySdes = TRY_TO_UPDATE_ON_EVERY_SDES; this.participantDatabaseCleanup = PARTICIPANT_DATABASE_CLEANUP; + this.sequenceNumberWrapBound = SEQUENCE_NUMBER_WRAP_BOUND; + this.maxSequenceNumberForWrap = MAX_SEQUENCE_NUMBER_FOR_WRAP; } // RtpSession ----------------------------------------------------------------------------------------------------- @@ -464,7 +470,7 @@ public void dataPacketReceived(SocketAddress origin, DataPacket packet) { } // Should the packet be discarded due to out of order SN? - if ((participant.getLastSequenceNumber() >= packet.getSequenceNumber()) && this.discardOutOfOrder) { + if (isSequenceNumberOutOfOrder(participant.getLastSequenceNumber(), packet.getSequenceNumber()) && this.discardOutOfOrder) { LOG.trace("Discarded out of order packet from {} in session with id {} (last SN was {}, packet SN was {}).", participant, this.id, participant.getLastSequenceNumber(), packet.getSequenceNumber()); return; @@ -480,6 +486,14 @@ public void dataPacketReceived(SocketAddress origin, DataPacket packet) { } } + private boolean isSequenceNumberOutOfOrder(int previousSequenceNumber, int sequenceNumber) { + if (previousSequenceNumber >= sequenceNumberWrapBound && sequenceNumber <= maxSequenceNumberForWrap) { + return false; + } else { + return previousSequenceNumber >= sequenceNumber; + } + } + // ControlPacketReceiver ------------------------------------------------------------------------------------------ @Override