1
0
Fork 0

evaluate sequence numbers using standard method

This commit is contained in:
Kevin Matz 2021-08-29 01:00:50 -04:00
parent 324ac934e8
commit 3bad5e0d3e
2 changed files with 16 additions and 24 deletions

View File

@ -26,8 +26,6 @@
#include "receiver.h"
#include "config.h"
#include <limits>
namespace sACN {
/**
@ -226,29 +224,22 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
if (source->sync_address != 0)
subscribe(source->sync_address);
/// > \cite sACN 6.2.5 E1.31 Data Packet: Sequence Number
/// > \cite sACN 6.7.2 Sequence Numbering
/// >
/// > In a routed network environment it is possible for packets to be
/// > received in a different order to the one in which they were sent. The
/// > sequence number allows receivers or diagnostic equipment to detect out
/// > of sequence or lost packets.
/// Assume that sources transmitting a sequence number of 0 do not support
/// sequencing.
if (source->sequence_number != 0 && universe->provenance())
{
auto seq = source->sequence_number;
auto old = universe->provenance()->sequence_number;
auto hasWrapped = [seq, old] () {
auto threshold = std::numeric_limits<typeof(old)>::max() * 0.9;
if (seq < old && old > threshold)
return true;
return false;
};
if (seq != old + 1)
; // missed packet!
if (seq <= old && !hasWrapped())
return; // out of sequence packet!
}
/// > Having first received a packet with sequence number A,
auto a = universe->provenance()->sequence_number;
/// > a second packet with sequence number B arrives.
auto b = source->sequence_number;
/// > If, using signed 8-bit binary arithmetic, B - A
int8_t dif = b - a;
/// > is less than or equal to 0, but greater than -20,
if (dif <= 0 && dif > -20)
/// > then the packet containing sequence number B shall be deemed out of
/// > sequence and discarded.
/// Tolerate out-of-spec sources transmitting 0s instead of a sequence number.
if (!(a == 0 && b == 0))
return;
// PDU data will be a block of DMP
auto block = static_cast<ACN::PDU::Block<ACN::DMP::Pdu>*>(frame->data());

View File

@ -31,6 +31,7 @@ namespace sACN {
*/
Universe::Universe()
: DMX::Universe(E131_NETWORK_DATA_LOSS_TIMEOUT)
, provenance_(std::shared_ptr<DATA::data_header>(new DATA::data_header()))
{
}