From 28c9bde5a5cbc822189057bd678f1d236188468e Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 17 Dec 2017 22:44:13 +0000 Subject: [PATCH] Avoid fragmentation of pskreporter destined datagrams Keep datagram size below a reasonable IPv4 MTU size of protocol headers + 1400. Thanks to Philip, N1DQ, for the suggestion as with FT8 mode datagram payload sizes to Pskrepotrer are sometimes as big a 8kBytes. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8339 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- psk_reporter.cpp | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/psk_reporter.cpp b/psk_reporter.cpp index 6a4a73a22..fdf54afd2 100644 --- a/psk_reporter.cpp +++ b/psk_reporter.cpp @@ -12,6 +12,11 @@ #include "moc_psk_reporter.cpp" +namespace +{ + int constexpr MAX_PAYLOAD_LENGTH {1400}; +} + PSK_Reporter::PSK_Reporter(MessageClient * message_client, QObject *parent) : QObject {parent}, m_messageClient {message_client}, @@ -68,10 +73,7 @@ void PSK_Reporter::addRemoteStation(QString call, QString grid, QString freq, QS void PSK_Reporter::sendReport() { - if (m_spotQueue.isEmpty()) { - return; - } - + while (!m_spotQueue.isEmpty()) { QString report_h; // Header @@ -91,15 +93,16 @@ void PSK_Reporter::sendReport() // Sender information QString txInfoData_h = "50E3llll"; - while (!m_spotQueue.isEmpty()) { - QHash spot = m_spotQueue.dequeue(); - txInfoData_h += QString("%1").arg(spot["call"].length(),2,16,QChar('0')) + spot["call"].toUtf8().toHex(); - txInfoData_h += QString("%1").arg(spot["freq"].toLongLong(),8,16,QChar('0')); - txInfoData_h += QString("%1").arg(spot["snr"].toInt(),8,16,QChar('0')).right(2); - txInfoData_h += QString("%1").arg(spot["mode"].length(),2,16,QChar('0')) + spot["mode"].toUtf8().toHex(); - txInfoData_h += QString("%1").arg(spot["grid"].length(),2,16,QChar('0')) + spot["grid"].toUtf8().toHex(); - txInfoData_h += QString("%1").arg(1,2,16,QChar('0')); // REPORTER_SOURCE_AUTOMATIC - txInfoData_h += QString("%1").arg(spot["time"].toInt(),8,16,QChar('0')); + while (!m_spotQueue.isEmpty() + && header_h.size () + m_rxInfoDescriptor_h.size () + m_txInfoDescriptor_h.size () + rxInfoData_h.size () + txInfoData_h.size () < MAX_PAYLOAD_LENGTH) { + QHash spot = m_spotQueue.dequeue(); + txInfoData_h += QString("%1").arg(spot["call"].length(),2,16,QChar('0')) + spot["call"].toUtf8().toHex(); + txInfoData_h += QString("%1").arg(spot["freq"].toLongLong(),8,16,QChar('0')); + txInfoData_h += QString("%1").arg(spot["snr"].toInt(),8,16,QChar('0')).right(2); + txInfoData_h += QString("%1").arg(spot["mode"].length(),2,16,QChar('0')) + spot["mode"].toUtf8().toHex(); + txInfoData_h += QString("%1").arg(spot["grid"].length(),2,16,QChar('0')) + spot["grid"].toUtf8().toHex(); + txInfoData_h += QString("%1").arg(1,2,16,QChar('0')); // REPORTER_SOURCE_AUTOMATIC + txInfoData_h += QString("%1").arg(spot["time"].toInt(),8,16,QChar('0')); } txInfoData_h += "0000"; txInfoData_h.replace("50E3llll", "50E3" + QString("%1").arg(txInfoData_h.length()/2,4,16,QChar('0'))); @@ -113,6 +116,7 @@ void PSK_Reporter::sendReport() if (!m_pskReporterAddress.isNull()) { m_messageClient->send_raw_datagram (report, m_pskReporterAddress, 4739); } + } } void PSK_Reporter::dnsLookupResult(QHostInfo info)