diff --git a/p25/Control.cpp b/p25/Control.cpp index 524bddd0..080ac2b1 100644 --- a/p25/Control.cpp +++ b/p25/Control.cpp @@ -269,9 +269,8 @@ void Control::setOptions(yaml::Node& conf, const std::string cwCallsign, const s m_voice->resetRF(); m_voice->resetNet(); m_data->resetRF(); - - m_trunk->m_rfTSBK = lc::TSBK(m_siteData, m_idenEntry); - m_trunk->m_netTSBK = lc::TSBK(m_siteData, m_idenEntry); + m_trunk->resetRF(); + m_trunk->resetNet(); } /// diff --git a/p25/TrunkPacket.cpp b/p25/TrunkPacket.cpp index 83c10528..afecfd16 100644 --- a/p25/TrunkPacket.cpp +++ b/p25/TrunkPacket.cpp @@ -138,6 +138,24 @@ const uint32_t GRANT_TIMER_TIMEOUT = 15U; // --------------------------------------------------------------------------- // Public Class Members // --------------------------------------------------------------------------- +/// +/// Resets the data states for the RF interface. +/// +void TrunkPacket::resetRF() +{ + lc::TSBK tsbk = lc::TSBK(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK); + m_rfTSBK = tsbk; +} + +/// +/// Resets the data states for the network. +/// +void TrunkPacket::resetNet() +{ + lc::TSBK tsbk = lc::TSBK(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK); + m_netTSBK = tsbk; +} + /// /// Process a data frame from the RF interface. /// @@ -168,9 +186,9 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) m_p25->m_queue.clear(); - m_rfTSBK = lc::TSBK(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK); - m_netTSBK = lc::TSBK(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK); - + resetRF(); + resetNet(); + bool ret = m_rfTSBK.decode(data + 2U); if (!ret) { LogWarning(LOG_RF, P25_TSDU_STR ", undecodable LC"); @@ -480,8 +498,8 @@ bool TrunkPacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, d switch (duid) { case P25_DUID_TSDU: if (m_p25->m_netState == RS_NET_IDLE) { - m_rfTSBK = lc::TSBK(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK); - m_netTSBK = lc::TSBK(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK); + resetRF(); + resetNet(); bool ret = m_netTSBK.decode(data); if (!ret) { @@ -667,8 +685,8 @@ void TrunkPacket::writeAdjSSNetwork() return; } - m_rfTSBK = lc::TSBK(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK); - m_netTSBK = lc::TSBK(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK); + resetRF(); + resetNet(); if (m_network != NULL) { if (m_verbose) { @@ -1195,7 +1213,7 @@ void TrunkPacket::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adjSS) do { - m_rfTSBK = lc::TSBK(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK); + resetRF(); if (m_debug) { LogDebug(LOG_P25, "writeRF_ControlData, mbfCnt = %u, frameCnt = %u, seq = %u, adjSS = %u", m_mbfCnt, frameCnt, n, adjSS); @@ -1528,7 +1546,7 @@ void TrunkPacket::queueRF_TSBK_Ctrl_MBF(uint8_t lco) if (!m_p25->m_control) return; - m_rfTSBK = lc::TSBK(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK); + resetRF(); switch (lco) { case TSBK_OSP_IDEN_UP: diff --git a/p25/TrunkPacket.h b/p25/TrunkPacket.h index 3062aef4..9583d4b0 100644 --- a/p25/TrunkPacket.h +++ b/p25/TrunkPacket.h @@ -59,6 +59,11 @@ namespace p25 class HOST_SW_API TrunkPacket { public: + /// Resets the data states for the RF interface. + void resetRF(); + /// Resets the data states for the network. + void resetNet(); + /// Process a data frame from the RF interface. bool process(uint8_t* data, uint32_t len); /// Process a data frame from the network. diff --git a/p25/VoicePacket.cpp b/p25/VoicePacket.cpp index d6d96942..16899357 100644 --- a/p25/VoicePacket.cpp +++ b/p25/VoicePacket.cpp @@ -60,10 +60,12 @@ const uint32_t VOC_LDU1_COUNT = 3U; /// void VoicePacket::resetRF() { - m_rfLC = lc::LC(m_p25->m_siteData); - //m_rfLastHDU = lc::LC(m_p25->m_siteData); - m_rfLastLDU1 = lc::LC(m_p25->m_siteData); - m_rfLastLDU2 = lc::LC(m_p25->m_siteData);; + lc::LC lc = lc::LC(m_p25->m_siteData); + + m_rfLC = lc; + //m_rfLastHDU = lc; + m_rfLastLDU1 = lc; + m_rfLastLDU2 = lc; m_rfFrames = 0U; m_rfErrs = 0U; @@ -77,8 +79,10 @@ void VoicePacket::resetRF() /// void VoicePacket::resetNet() { - m_netLC = lc::LC(m_p25->m_siteData); - m_netLastLDU1 = lc::LC(m_p25->m_siteData); + lc::LC lc = lc::LC(m_p25->m_siteData); + + m_netLC = lc; + m_netLastLDU1 = lc; m_netFrames = 0U; m_netLost = 0U; diff --git a/p25/lc/LC.cpp b/p25/lc/LC.cpp index d5795cd6..624b4bfe 100644 --- a/p25/lc/LC.cpp +++ b/p25/lc/LC.cpp @@ -120,8 +120,12 @@ LC& LC::operator=(const LC& data) m_algId = data.m_algId; if (m_algId != P25_ALGO_UNENCRYPT) { - ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); - ::memcpy(m_mi, data.m_mi, P25_MI_LENGTH_BYTES); + delete[] m_mi; + + uint8_t* mi = new uint8_t[P25_MI_LENGTH_BYTES]; + ::memcpy(mi, data.m_mi, P25_MI_LENGTH_BYTES); + + m_mi = mi; m_kId = data.m_kId; if (!m_encrypted) { @@ -130,8 +134,13 @@ LC& LC::operator=(const LC& data) } } else { + delete[] m_mi; + + uint8_t* mi = new uint8_t[P25_MI_LENGTH_BYTES]; ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); + m_mi = mi; + m_kId = 0x0000U; if (m_encrypted) { m_encryptOverride = true; diff --git a/p25/lc/TSBK.cpp b/p25/lc/TSBK.cpp index 3c8b92ab..021b9031 100644 --- a/p25/lc/TSBK.cpp +++ b/p25/lc/TSBK.cpp @@ -157,8 +157,12 @@ TSBK& TSBK::operator=(const TSBK& data) m_siteData = data.m_siteData; m_siteIdenEntry = data.m_siteIdenEntry; - m_siteCallsign = new uint8_t[P25_MOT_CALLSIGN_LENGTH_BYTES]; - ::memcpy(m_siteCallsign, data.m_siteCallsign, P25_MOT_CALLSIGN_LENGTH_BYTES); + delete[] m_siteCallsign; + + uint8_t* callsign = new uint8_t[P25_MOT_CALLSIGN_LENGTH_BYTES]; + ::memcpy(callsign, data.m_siteCallsign, P25_MOT_CALLSIGN_LENGTH_BYTES); + + m_siteCallsign = callsign; } return *this;