aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2020-09-23 15:07:20 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2020-09-23 15:07:20 +0200
commitb79a56d3361f209d1d27a67325e1e5b33998cf8f (patch)
treeae19ca811f2d7d7fd974bd72aa0f4974f6814c06
parent55fee4c94a72601c7c65a8f83bcc9feaad011b47 (diff)
downloadODR-EDI2EDI-b79a56d3361f209d1d27a67325e1e5b33998cf8f.tar.gz
ODR-EDI2EDI-b79a56d3361f209d1d27a67325e1e5b33998cf8f.tar.bz2
ODR-EDI2EDI-b79a56d3361f209d1d27a67325e1e5b33998cf8f.zip
Pull in common 0c5bf36: spread UDP packets over time to avoid bursts
-rw-r--r--lib/edioutput/Transport.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/edioutput/Transport.cpp b/lib/edioutput/Transport.cpp
index d8627fd..fa7588a 100644
--- a/lib/edioutput/Transport.cpp
+++ b/lib/edioutput/Transport.cpp
@@ -26,6 +26,7 @@
*/
#include "Transport.h"
#include <iterator>
+#include <cmath>
using namespace std;
@@ -131,6 +132,12 @@ void Sender::write(const TagPacket& tagpacket)
edi_fragments.size());
}
+ /* Spread out the transmission of all fragments over 75% of the 24ms AF packet duration
+ * to reduce the risk of losing fragments because of congestion.
+ *
+ * 75% was chosen so that other outputs still have time to do their thing. */
+ const auto inter_fragment_wait_time = std::chrono::microseconds(llrint(0.75 * 24000.0 / edi_fragments.size()));
+
// Send over ethernet
for (auto& edi_frag : edi_fragments) {
if (m_conf.dump) {
@@ -155,6 +162,8 @@ void Sender::write(const TagPacket& tagpacket)
throw logic_error("EDI destination not implemented");
}
}
+
+ std::this_thread::sleep_for(inter_fragment_wait_time);
}
}
else {