evaluate sequence numbers using standard method
This commit is contained in:
parent
324ac934e8
commit
3bad5e0d3e
|
@ -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());
|
||||
|
|
|
@ -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()))
|
||||
{
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue