fix issue that caused an assertion crash when resetting the modem; store the DataHeader data during DMR traffic for future use;

pull/1/head
Bryan Biedenkapp 5 years ago
parent b55d26a08f
commit 595f6f4dd9

@ -177,7 +177,7 @@ void Utils::symbols(const std::string& title, const uint8_t* data, uint32_t leng
microslotHeader += temp; microslotHeader += temp;
} }
::Log(2U, "SYMBOLS", "MCR: % s", microslotHeader.c_str()); ::Log(2U, "SYMBOLS", "MCR: %s", microslotHeader.c_str());
uint32_t bufLen = length; uint32_t bufLen = length;
while (bufLen > 0U) { while (bufLen > 0U) {

@ -26,7 +26,6 @@
#include "Defines.h" #include "Defines.h"
#include "dmr/DataPacket.h" #include "dmr/DataPacket.h"
#include "dmr/acl/AccessControl.h" #include "dmr/acl/AccessControl.h"
#include "dmr/data/DataHeader.h"
#include "dmr/data/EMB.h" #include "dmr/data/EMB.h"
#include "dmr/edac/Trellis.h" #include "dmr/edac/Trellis.h"
#include "dmr/lc/ShortLC.h" #include "dmr/lc/ShortLC.h"
@ -56,13 +55,6 @@ using namespace dmr;
return false; \ return false; \
} }
#define CHECK_TRAFFIC_COLLISION_DELLC(_DST_ID) \
if (m_slot->m_netState != RS_NET_IDLE && _DST_ID == m_slot->m_netLastDstId) { \
LogWarning(LOG_RF, "DMR Slot %u, Traffic collision detect, preempting new RF traffic to existing network traffic!", m_slot->m_slotNo); \
delete lc; \
return false; \
}
#define CHECK_TG_HANG(_DST_ID) \ #define CHECK_TG_HANG(_DST_ID) \
if (m_slot->m_rfLastDstId != 0U) { \ if (m_slot->m_rfLastDstId != 0U) { \
if (m_slot->m_rfLastDstId != _DST_ID && (m_slot->m_rfTGHang.isRunning() && !m_slot->m_rfTGHang.hasExpired())) { \ if (m_slot->m_rfLastDstId != _DST_ID && (m_slot->m_rfTGHang.isRunning() && !m_slot->m_rfTGHang.hasExpired())) { \
@ -70,14 +62,6 @@ using namespace dmr;
} \ } \
} }
#define CHECK_TG_HANG_DELLC(_DST_ID) \
if (m_slot->m_rfLastDstId != 0U) { \
if (m_slot->m_rfLastDstId != _DST_ID && (m_slot->m_rfTGHang.isRunning() && !m_slot->m_rfTGHang.hasExpired())) { \
delete lc; \
return; \
} \
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Public Class Members // Public Class Members
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@ -154,14 +138,16 @@ bool DataPacket::process(uint8_t* data, uint32_t len)
if (m_slot->m_rfState == RS_RF_DATA) if (m_slot->m_rfState == RS_RF_DATA)
return true; return true;
data::DataHeader dataHeader; data::DataHeader* dataHeader = new data::DataHeader();
bool valid = dataHeader.decode(data + 2U); bool valid = dataHeader->decode(data + 2U);
if (!valid) if (!valid)
return false; return false;
bool gi = dataHeader.getGI(); m_slot->m_rfDataHeader = dataHeader;
uint32_t srcId = dataHeader.getSrcId();
uint32_t dstId = dataHeader.getDstId(); bool gi = dataHeader->getGI();
uint32_t srcId = dataHeader->getSrcId();
uint32_t dstId = dataHeader->getDstId();
CHECK_TRAFFIC_COLLISION(dstId); CHECK_TRAFFIC_COLLISION(dstId);
@ -179,12 +165,12 @@ bool DataPacket::process(uint8_t* data, uint32_t len)
} }
} }
m_slot->m_rfFrames = dataHeader.getBlocks(); m_slot->m_rfFrames = dataHeader->getBlocks();
m_slot->m_rfSeqNo = 0U; m_slot->m_rfSeqNo = 0U;
m_slot->m_rfLC = new lc::LC(gi ? FLCO_GROUP : FLCO_PRIVATE, srcId, dstId); m_slot->m_rfLC = new lc::LC(gi ? FLCO_GROUP : FLCO_PRIVATE, srcId, dstId);
// Regenerate the data header // Regenerate the data header
dataHeader.encode(data + 2U); dataHeader->encode(data + 2U);
// Regenerate the Slot Type // Regenerate the Slot Type
slotType.encode(data + 2U); slotType.encode(data + 2U);
@ -209,7 +195,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len)
if (m_verbose) { if (m_verbose) {
LogMessage(LOG_RF, DMR_DT_DATA_HEADER ", slot = %u, dpf = $%02X, sap = $%02X, fullMessage = %u, blocksToFollow = %u, padCount = %u, seqNo = %u, dstId = %u, srcId = %u, group = %u", LogMessage(LOG_RF, DMR_DT_DATA_HEADER ", slot = %u, dpf = $%02X, sap = $%02X, fullMessage = %u, blocksToFollow = %u, padCount = %u, seqNo = %u, dstId = %u, srcId = %u, group = %u",
m_slot->m_slotNo, dataHeader.getDPF(), dataHeader.getSAP(), dataHeader.getFullMesage(), dataHeader.getBlocks(), dataHeader.getPadCount(), dataHeader.getFSN(), m_slot->m_slotNo, dataHeader->getDPF(), dataHeader->getSAP(), dataHeader->getFullMesage(), dataHeader->getBlocks(), dataHeader->getPadCount(), dataHeader->getFSN(),
dstId, srcId, gi); dstId, srcId, gi);
} }
@ -365,23 +351,26 @@ void DataPacket::processNetwork(const data::Data& dmrData)
if (m_slot->m_netState == RS_NET_DATA) if (m_slot->m_netState == RS_NET_DATA)
return; return;
data::DataHeader dataHeader; data::DataHeader* dataHeader = new data::DataHeader();
bool valid = dataHeader.decode(data + 2U); bool valid = dataHeader->decode(data + 2U);
if (!valid) { if (!valid) {
LogError(LOG_NET, "DMR Slot %u, DT_DATA_HEADER, unable to decode the network data header", m_slot->m_slotNo); LogError(LOG_NET, "DMR Slot %u, DT_DATA_HEADER, unable to decode the network data header", m_slot->m_slotNo);
return; return;
} }
bool gi = dataHeader.getGI(); m_slot->m_netDataHeader = dataHeader;
uint32_t srcId = dataHeader.getSrcId();
uint32_t dstId = dataHeader.getDstId(); bool gi = dataHeader->getGI();
uint32_t srcId = dataHeader->getSrcId();
uint32_t dstId = dataHeader->getDstId();
CHECK_TG_HANG(dstId); CHECK_TG_HANG(dstId);
m_slot->m_netFrames = dataHeader.getBlocks(); m_slot->m_netFrames = dataHeader->getBlocks();
m_slot->m_netLC = new lc::LC(gi ? FLCO_GROUP : FLCO_PRIVATE, srcId, dstId);
// Regenerate the data header // Regenerate the data header
dataHeader.encode(data + 2U); dataHeader->encode(data + 2U);
// Regenerate the Slot Type // Regenerate the Slot Type
SlotType slotType; SlotType slotType;
@ -407,8 +396,9 @@ void DataPacket::processNetwork(const data::Data& dmrData)
m_slot->setShortLC(m_slot->m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_PRIVATE, false); m_slot->setShortLC(m_slot->m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_PRIVATE, false);
if (m_verbose) { if (m_verbose) {
LogMessage(LOG_RF, DMR_DT_DATA_HEADER ", slot = %u, dstId = %u, srcId = %u, group = %u, blocks = %u", m_slot->m_slotNo, m_slot->m_rfLC->getDstId(), m_slot->m_rfLC->getSrcId(), LogMessage(LOG_NET, DMR_DT_DATA_HEADER ", slot = %u, dpf = $%02X, sap = $%02X, fullMessage = %u, blocksToFollow = %u, padCount = %u, seqNo = %u, dstId = %u, srcId = %u, group = %u",
m_slot->m_rfLC->getFLCO() == FLCO_GROUP, dataHeader.getBlocks()); m_slot->m_slotNo, dataHeader->getDPF(), dataHeader->getSAP(), dataHeader->getFullMesage(), dataHeader->getBlocks(), dataHeader->getPadCount(), dataHeader->getFSN(),
dstId, srcId, gi);
} }
::ActivityLog("DMR", false, "Slot %u network data header from %u to %s%u, %u blocks", ::ActivityLog("DMR", false, "Slot %u network data header from %u to %s%u, %u blocks",

@ -33,6 +33,7 @@
#include "Defines.h" #include "Defines.h"
#include "dmr/data/Data.h" #include "dmr/data/Data.h"
#include "dmr/data/DataHeader.h"
#include "dmr/data/EmbeddedData.h" #include "dmr/data/EmbeddedData.h"
#include "dmr/lc/LC.h" #include "dmr/lc/LC.h"
#include "dmr/Slot.h" #include "dmr/Slot.h"

@ -114,9 +114,11 @@ Slot::Slot(uint32_t slotNo, uint32_t timeout, uint32_t tgHang, uint32_t queueSiz
m_netLastDstId(0U), m_netLastDstId(0U),
m_rfLC(NULL), m_rfLC(NULL),
m_rfPrivacyLC(NULL), m_rfPrivacyLC(NULL),
m_rfDataHeader(NULL),
m_rfSeqNo(0U), m_rfSeqNo(0U),
m_netLC(NULL), m_netLC(NULL),
m_netPrivacyLC(NULL), m_netPrivacyLC(NULL),
m_netDataHeader(NULL),
m_networkWatchdog(1000U, 0U, 1500U), m_networkWatchdog(1000U, 0U, 1500U),
m_rfTimeoutTimer(1000U, timeout), m_rfTimeoutTimer(1000U, timeout),
m_rfTGHang(1000U, tgHang), m_rfTGHang(1000U, tgHang),
@ -678,7 +680,14 @@ void Slot::writeEndRF(bool writeEnd)
m_rfBits = 1U; m_rfBits = 1U;
delete m_rfLC; delete m_rfLC;
if (m_rfPrivacyLC != NULL)
delete m_rfPrivacyLC;
if (m_rfDataHeader != NULL)
delete m_rfDataHeader;
m_rfLC = NULL; m_rfLC = NULL;
m_rfPrivacyLC = NULL;
m_rfDataHeader = NULL;
} }
/// <summary> /// <summary>
@ -737,7 +746,14 @@ void Slot::writeEndNet(bool writeEnd)
m_netBits = 1U; m_netBits = 1U;
delete m_netLC; delete m_netLC;
if (m_netPrivacyLC != NULL)
delete m_netPrivacyLC;
if (m_netDataHeader != NULL)
delete m_netDataHeader;
m_netLC = NULL; m_netLC = NULL;
m_netPrivacyLC = NULL;
m_netDataHeader = NULL;
} }
/// <summary> /// <summary>

@ -114,11 +114,13 @@ namespace dmr
lc::LC* m_rfLC; lc::LC* m_rfLC;
lc::PrivacyLC* m_rfPrivacyLC; lc::PrivacyLC* m_rfPrivacyLC;
data::DataHeader* m_rfDataHeader;
uint8_t m_rfSeqNo; uint8_t m_rfSeqNo;
lc::LC* m_netLC; lc::LC* m_netLC;
lc::PrivacyLC* m_netPrivacyLC; lc::PrivacyLC* m_netPrivacyLC;
data::DataHeader* m_netDataHeader;
Timer m_networkWatchdog; Timer m_networkWatchdog;
Timer m_rfTimeoutTimer; Timer m_rfTimeoutTimer;

@ -92,7 +92,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
return true; return true;
lc::FullLC fullLC; lc::FullLC fullLC;
lc::LC * lc = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER); lc::LC* lc = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER);
if (lc == NULL) if (lc == NULL)
return false; return false;

@ -209,9 +209,13 @@ int UARTPort::read(uint8_t* buffer, uint32_t length)
/// <returns>Actual length of data written to the serial port.</returns> /// <returns>Actual length of data written to the serial port.</returns>
int UARTPort::write(const uint8_t* buffer, uint32_t length) int UARTPort::write(const uint8_t* buffer, uint32_t length)
{ {
assert(m_handle != INVALID_HANDLE_VALUE);
assert(buffer != NULL); assert(buffer != NULL);
if (m_isOpen && m_handle == INVALID_HANDLE_VALUE)
return 0;
assert(m_handle != INVALID_HANDLE_VALUE);
if (length == 0U) if (length == 0U)
return 0; return 0;
@ -236,13 +240,14 @@ int UARTPort::write(const uint8_t* buffer, uint32_t length)
/// </summary> /// </summary>
void UARTPort::close() void UARTPort::close()
{ {
if (!m_isOpen) if (!m_isOpen && m_handle == INVALID_HANDLE_VALUE)
return; return;
assert(m_handle != INVALID_HANDLE_VALUE); assert(m_handle != INVALID_HANDLE_VALUE);
::CloseHandle(m_handle); ::CloseHandle(m_handle);
m_handle = INVALID_HANDLE_VALUE; m_handle = INVALID_HANDLE_VALUE;
m_isOpen = false;
} }
#else #else
@ -460,6 +465,10 @@ int UARTPort::read(uint8_t* buffer, uint32_t length)
int UARTPort::write(const uint8_t* buffer, uint32_t length) int UARTPort::write(const uint8_t* buffer, uint32_t length)
{ {
assert(buffer != NULL); assert(buffer != NULL);
if (m_isOpen && m_fd == -1)
return 0;
assert(m_fd != -1); assert(m_fd != -1);
if (length == 0U) if (length == 0U)
@ -496,6 +505,7 @@ void UARTPort::close()
::close(m_fd); ::close(m_fd);
m_fd = -1; m_fd = -1;
m_isOpen = false;
} }
#if defined(__APPLE__) #if defined(__APPLE__)

@ -84,18 +84,24 @@ namespace p25
uint32_t m_netLost; uint32_t m_netLost;
Audio m_audio; Audio m_audio;
lc::LC m_rfLC; lc::LC m_rfLC;
lc::LC m_rfLastHDU; lc::LC m_rfLastHDU;
lc::LC m_rfLastLDU1; lc::LC m_rfLastLDU1;
lc::LC m_rfLastLDU2; lc::LC m_rfLastLDU2;
lc::LC m_netLC; lc::LC m_netLC;
lc::LC m_netLastLDU1; lc::LC m_netLastLDU1;
data::LowSpeedData m_rfLSD; data::LowSpeedData m_rfLSD;
data::LowSpeedData m_netLSD; data::LowSpeedData m_netLSD;
uint8_t* m_netLDU1; uint8_t* m_netLDU1;
uint8_t* m_netLDU2; uint8_t* m_netLDU2;
uint8_t m_lastDUID; uint8_t m_lastDUID;
uint8_t* m_lastIMBE; uint8_t* m_lastIMBE;
bool m_hadVoice; bool m_hadVoice;
uint32_t m_lastRejectId; uint32_t m_lastRejectId;

Loading…
Cancel
Save

Powered by TurnKey Linux.