upstream: fix old bug using m_port instead of m_port[x]; fix issue with P25 VoicePacket not checking m_control or m_duplex flags in certain situations;

pull/1/head
Bryan Biedenkapp 5 years ago
parent de2860ca6a
commit 5fd9f1d8ea

@ -485,6 +485,11 @@ int Host::run()
g_killed = true; g_killed = true;
} }
if (!m_duplex && m_dmrBeacons) {
::LogError(LOG_HOST, "Cannot have DMR roaming beacons and simplex mode at the same time.");
g_killed = true;
}
if (!m_duplex && m_controlData) { if (!m_duplex && m_controlData) {
::LogError(LOG_HOST, "Cannot have P25 control and simplex mode at the same time."); ::LogError(LOG_HOST, "Cannot have P25 control and simplex mode at the same time.");
g_killed = true; g_killed = true;

@ -246,7 +246,7 @@ int UDPSocket::read(uint8_t* buffer, uint32_t length, sockaddr_storage& address,
LogError(LOG_NET, "Error returned from recvfrom, err: %d", errno); LogError(LOG_NET, "Error returned from recvfrom, err: %d", errno);
if (len == -1 && errno == ENOTSOCK) { if (len == -1 && errno == ENOTSOCK) {
LogMessage(LOG_NET, "Re-opening UDP port on %u", m_port); LogMessage(LOG_NET, "Re-opening UDP port on %u", m_port[index]);
close(); close();
open(); open();
} }

@ -315,6 +315,9 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len)
{ {
assert(data != NULL); assert(data != NULL);
if (!m_p25->m_control)
return false;
// Decode the NID // Decode the NID
bool valid = m_p25->m_nid.decode(data + 2U); bool valid = m_p25->m_nid.decode(data + 2U);
@ -666,6 +669,8 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len)
/// <returns></returns> /// <returns></returns>
bool TrunkPacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid) bool TrunkPacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid)
{ {
if (!m_p25->m_control)
return false;
if (m_p25->m_rfState != RS_RF_LISTENING && m_p25->m_netState == RS_NET_IDLE) if (m_p25->m_rfState != RS_RF_LISTENING && m_p25->m_netState == RS_NET_IDLE)
return false; return false;
@ -1428,9 +1433,8 @@ void TrunkPacket::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adjSS)
{ {
uint8_t i = 0U, seqCnt = 0U; uint8_t i = 0U, seqCnt = 0U;
if (!m_p25->m_control) { if (!m_p25->m_control)
return; return;
}
// loop to generate 6 control sequences // loop to generate 6 control sequences
if (frameCnt == 255U) { if (frameCnt == 255U) {
@ -1565,26 +1569,28 @@ void TrunkPacket::writeRF_TDULC_ChanRelease(bool grp, uint32_t srcId, uint32_t d
{ {
uint32_t count = m_p25->m_hangCount / 2; uint32_t count = m_p25->m_hangCount / 2;
for (uint32_t i = 0; i < count; i++) { if (m_p25->m_control) {
if ((srcId != 0U) && (dstId != 0U)) { for (uint32_t i = 0; i < count; i++) {
m_rfTDULC.setSrcId(srcId); if ((srcId != 0U) && (dstId != 0U)) {
m_rfTDULC.setDstId(dstId); m_rfTDULC.setSrcId(srcId);
m_rfTDULC.setEmergency(false); m_rfTDULC.setDstId(dstId);
m_rfTDULC.setEmergency(false);
if (grp) { if (grp) {
m_rfTDULC.setLCO(LC_GROUP); m_rfTDULC.setLCO(LC_GROUP);
writeRF_TDULC(P25_DUID_TDULC, true); writeRF_TDULC(P25_DUID_TDULC, true);
} }
else { else {
m_rfTDULC.setLCO(LC_PRIVATE); m_rfTDULC.setLCO(LC_PRIVATE);
writeRF_TDULC(P25_DUID_TDULC, true); writeRF_TDULC(P25_DUID_TDULC, true);
}
} }
}
m_rfTDULC.setLCO(LC_NET_STS_BCAST); m_rfTDULC.setLCO(LC_NET_STS_BCAST);
writeRF_TDULC(P25_DUID_TDULC, true); writeRF_TDULC(P25_DUID_TDULC, true);
m_rfTDULC.setLCO(LC_RFSS_STS_BCAST); m_rfTDULC.setLCO(LC_RFSS_STS_BCAST);
writeRF_TDULC(P25_DUID_TDULC, true); writeRF_TDULC(P25_DUID_TDULC, true);
}
} }
if (m_verbose) { if (m_verbose) {
@ -1604,6 +1610,9 @@ void TrunkPacket::writeRF_TDULC_ChanRelease(bool grp, uint32_t srcId, uint32_t d
/// <param name="clearBeforeWrite"></param> /// <param name="clearBeforeWrite"></param>
void TrunkPacket::writeRF_TSDU_SBF(bool noNetwork, bool clearBeforeWrite) void TrunkPacket::writeRF_TSDU_SBF(bool noNetwork, bool clearBeforeWrite)
{ {
if (!m_p25->m_control)
return;
uint8_t data[P25_TSDU_FRAME_LENGTH_BYTES + 2U]; uint8_t data[P25_TSDU_FRAME_LENGTH_BYTES + 2U];
::memset(data + 2U, 0x00U, P25_TSDU_FRAME_LENGTH_BYTES); ::memset(data + 2U, 0x00U, P25_TSDU_FRAME_LENGTH_BYTES);
@ -1663,12 +1672,18 @@ void TrunkPacket::writeRF_TSDU_SBF(bool noNetwork, bool clearBeforeWrite)
/// <param name="clearBeforeWrite"></param> /// <param name="clearBeforeWrite"></param>
void TrunkPacket::writeRF_TSDU_MBF(bool clearBeforeWrite) void TrunkPacket::writeRF_TSDU_MBF(bool clearBeforeWrite)
{ {
if (!m_p25->m_control) {
::memset(m_rfMBF, 0x00U, P25_MAX_PDU_COUNT * P25_LDU_FRAME_LENGTH_BYTES + 2U);
m_mbfCnt = 0U;
return;
}
uint8_t tsbk[P25_TSBK_FEC_LENGTH_BYTES]; uint8_t tsbk[P25_TSBK_FEC_LENGTH_BYTES];
::memset(tsbk, 0x00U, P25_TSBK_FEC_LENGTH_BYTES); ::memset(tsbk, 0x00U, P25_TSBK_FEC_LENGTH_BYTES);
// LogDebug(LOG_P25, "writeRF_TSDU_MBF, mbfCnt = %u", m_mbfCnt); // LogDebug(LOG_P25, "writeRF_TSDU_MBF, mbfCnt = %u", m_mbfCnt);
// can't transmit MBF with duplex disabled // trunking data is unsupported in simplex operation
if (!m_p25->m_duplex) { if (!m_p25->m_duplex) {
::memset(m_rfMBF, 0x00U, P25_MAX_PDU_COUNT * P25_LDU_FRAME_LENGTH_BYTES + 2U); ::memset(m_rfMBF, 0x00U, P25_MAX_PDU_COUNT * P25_LDU_FRAME_LENGTH_BYTES + 2U);
m_mbfCnt = 0U; m_mbfCnt = 0U;
@ -1767,6 +1782,9 @@ void TrunkPacket::writeRF_TSDU_MBF(bool clearBeforeWrite)
/// <param name="lco"></param> /// <param name="lco"></param>
void TrunkPacket::queueRF_TSBK_Ctrl_MBF(uint8_t lco) void TrunkPacket::queueRF_TSBK_Ctrl_MBF(uint8_t lco)
{ {
if (!m_p25->m_control)
return;
m_rfTSBK.reset(); m_rfTSBK.reset();
switch (lco) { switch (lco) {
@ -2274,6 +2292,7 @@ void TrunkPacket::writeRF_TSDU_U_Reg_Rsp(uint32_t srcId)
void TrunkPacket::writeRF_TSDU_U_Dereg_Ack(uint32_t srcId) void TrunkPacket::writeRF_TSDU_U_Dereg_Ack(uint32_t srcId)
{ {
bool dereged = false; bool dereged = false;
m_rfTSBK.setLCO(TSBK_OSP_U_DEREG_ACK); m_rfTSBK.setLCO(TSBK_OSP_U_DEREG_ACK);
if (m_verbose) { if (m_verbose) {

@ -167,10 +167,15 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
LogWarning(LOG_RF, "Traffic collision detect, preempting existing network traffic to new RF traffic, rfDstId = %u, netDstId = %u", m_rfLC.getDstId(), LogWarning(LOG_RF, "Traffic collision detect, preempting existing network traffic to new RF traffic, rfDstId = %u, netDstId = %u", m_rfLC.getDstId(),
m_p25->m_netLastDstId); m_p25->m_netLastDstId);
resetNet(); resetNet();
m_p25->writeRF_TDU(true);
if (m_p25->m_duplex) {
m_p25->writeRF_TDU(true);
}
} }
m_p25->writeRF_Preamble(); if (m_p25->m_duplex) {
m_p25->writeRF_Preamble();
}
m_p25->m_rfTGHang.start(); m_p25->m_rfTGHang.start();
m_p25->m_rfLastDstId = m_rfLC.getDstId(); m_p25->m_rfLastDstId = m_rfLC.getDstId();
@ -188,8 +193,10 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
m_lastDUID = P25_DUID_LDU1; m_lastDUID = P25_DUID_LDU1;
if (m_p25->m_rfState == RS_RF_LISTENING) { if (m_p25->m_rfState == RS_RF_LISTENING) {
if (!m_p25->m_ccRunning && m_p25->m_voiceOnControl) { if (m_p25->m_control) {
m_p25->m_trunk->writeRF_ControlData(255U, 0U, false); if (!m_p25->m_ccRunning && m_p25->m_voiceOnControl) {
m_p25->m_trunk->writeRF_ControlData(255U, 0U, false);
}
} }
bool ret = m_rfLC.decodeLDU1(data + 2U); bool ret = m_rfLC.decodeLDU1(data + 2U);
@ -234,8 +241,10 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
if (!acl::AccessControl::validateSrcId(srcId)) { if (!acl::AccessControl::validateSrcId(srcId)) {
if (m_lastRejectId == 0U || m_lastRejectId != srcId) { if (m_lastRejectId == 0U || m_lastRejectId != srcId) {
LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, srcId = %u", srcId); LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, srcId = %u", srcId);
m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_VALID, (m_rfLC.getGroup() ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH)); if (m_p25->m_control) {
m_p25->m_trunk->denialInhibit(srcId); m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_VALID, (m_rfLC.getGroup() ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH));
m_p25->m_trunk->denialInhibit(srcId);
}
::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, m_rfLC.getGroup() ? "TG " : "", dstId); ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, m_rfLC.getGroup() ? "TG " : "", dstId);
m_lastRejectId = srcId; m_lastRejectId = srcId;
@ -253,7 +262,9 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
if (!acl::AccessControl::validateSrcId(dstId)) { if (!acl::AccessControl::validateSrcId(dstId)) {
if (m_lastRejectId == 0 || m_lastRejectId != dstId) { if (m_lastRejectId == 0 || m_lastRejectId != dstId) {
LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, dstId = %u", dstId); LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, dstId = %u", dstId);
m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_TGT_UNIT_NOT_VALID, TSBK_IOSP_UU_VCH); if (m_p25->m_control) {
m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_TGT_UNIT_NOT_VALID, TSBK_IOSP_UU_VCH);
}
::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, m_rfLC.getGroup() ? "TG " : "", dstId); ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, m_rfLC.getGroup() ? "TG " : "", dstId);
m_lastRejectId = dstId; m_lastRejectId = dstId;
@ -270,7 +281,9 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
if (!acl::AccessControl::validateTGId(dstId)) { if (!acl::AccessControl::validateTGId(dstId)) {
if (m_lastRejectId == 0 || m_lastRejectId != dstId) { if (m_lastRejectId == 0 || m_lastRejectId != dstId) {
LogWarning(LOG_RF, P25_HDU_STR " denial, TGID rejection, dstId = %u", dstId); LogWarning(LOG_RF, P25_HDU_STR " denial, TGID rejection, dstId = %u", dstId);
m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_TGT_GROUP_NOT_VALID, TSBK_IOSP_GRP_VCH); if (m_p25->m_control) {
m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_TGT_GROUP_NOT_VALID, TSBK_IOSP_GRP_VCH);
}
::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, m_rfLC.getGroup() ? "TG " : "", dstId); ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, m_rfLC.getGroup() ? "TG " : "", dstId);
m_lastRejectId = dstId; m_lastRejectId = dstId;
@ -832,7 +845,7 @@ bool VoicePacket::writeEndRF()
m_hadVoice = false; m_hadVoice = false;
} }
if (!m_p25->m_ccRunning) { if (m_p25->m_control && !m_p25->m_ccRunning) {
m_p25->m_trunk->writeRF_ControlData(255U, 0U, false); m_p25->m_trunk->writeRF_ControlData(255U, 0U, false);
m_p25->writeControlEndRF(); m_p25->writeControlEndRF();
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.