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;
}
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) {
::LogError(LOG_HOST, "Cannot have P25 control and simplex mode at the same time.");
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);
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();
open();
}

@ -315,6 +315,9 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len)
{
assert(data != NULL);
if (!m_p25->m_control)
return false;
// Decode the NID
bool valid = m_p25->m_nid.decode(data + 2U);
@ -666,6 +669,8 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len)
/// <returns></returns>
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)
return false;
@ -1428,9 +1433,8 @@ void TrunkPacket::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adjSS)
{
uint8_t i = 0U, seqCnt = 0U;
if (!m_p25->m_control) {
if (!m_p25->m_control)
return;
}
// loop to generate 6 control sequences
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;
for (uint32_t i = 0; i < count; i++) {
if ((srcId != 0U) && (dstId != 0U)) {
m_rfTDULC.setSrcId(srcId);
m_rfTDULC.setDstId(dstId);
m_rfTDULC.setEmergency(false);
if (m_p25->m_control) {
for (uint32_t i = 0; i < count; i++) {
if ((srcId != 0U) && (dstId != 0U)) {
m_rfTDULC.setSrcId(srcId);
m_rfTDULC.setDstId(dstId);
m_rfTDULC.setEmergency(false);
if (grp) {
m_rfTDULC.setLCO(LC_GROUP);
writeRF_TDULC(P25_DUID_TDULC, true);
}
else {
m_rfTDULC.setLCO(LC_PRIVATE);
writeRF_TDULC(P25_DUID_TDULC, true);
if (grp) {
m_rfTDULC.setLCO(LC_GROUP);
writeRF_TDULC(P25_DUID_TDULC, true);
}
else {
m_rfTDULC.setLCO(LC_PRIVATE);
writeRF_TDULC(P25_DUID_TDULC, true);
}
}
}
m_rfTDULC.setLCO(LC_NET_STS_BCAST);
writeRF_TDULC(P25_DUID_TDULC, true);
m_rfTDULC.setLCO(LC_RFSS_STS_BCAST);
writeRF_TDULC(P25_DUID_TDULC, true);
m_rfTDULC.setLCO(LC_NET_STS_BCAST);
writeRF_TDULC(P25_DUID_TDULC, true);
m_rfTDULC.setLCO(LC_RFSS_STS_BCAST);
writeRF_TDULC(P25_DUID_TDULC, true);
}
}
if (m_verbose) {
@ -1604,6 +1610,9 @@ void TrunkPacket::writeRF_TDULC_ChanRelease(bool grp, uint32_t srcId, uint32_t d
/// <param name="clearBeforeWrite"></param>
void TrunkPacket::writeRF_TSDU_SBF(bool noNetwork, bool clearBeforeWrite)
{
if (!m_p25->m_control)
return;
uint8_t data[P25_TSDU_FRAME_LENGTH_BYTES + 2U];
::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>
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];
::memset(tsbk, 0x00U, P25_TSBK_FEC_LENGTH_BYTES);
// 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) {
::memset(m_rfMBF, 0x00U, P25_MAX_PDU_COUNT * P25_LDU_FRAME_LENGTH_BYTES + 2U);
m_mbfCnt = 0U;
@ -1767,6 +1782,9 @@ void TrunkPacket::writeRF_TSDU_MBF(bool clearBeforeWrite)
/// <param name="lco"></param>
void TrunkPacket::queueRF_TSBK_Ctrl_MBF(uint8_t lco)
{
if (!m_p25->m_control)
return;
m_rfTSBK.reset();
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)
{
bool dereged = false;
m_rfTSBK.setLCO(TSBK_OSP_U_DEREG_ACK);
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(),
m_p25->m_netLastDstId);
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_rfLastDstId = m_rfLC.getDstId();
@ -188,8 +193,10 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
m_lastDUID = P25_DUID_LDU1;
if (m_p25->m_rfState == RS_RF_LISTENING) {
if (!m_p25->m_ccRunning && m_p25->m_voiceOnControl) {
m_p25->m_trunk->writeRF_ControlData(255U, 0U, false);
if (m_p25->m_control) {
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);
@ -234,8 +241,10 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
if (!acl::AccessControl::validateSrcId(srcId)) {
if (m_lastRejectId == 0U || m_lastRejectId != 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));
m_p25->m_trunk->denialInhibit(srcId);
if (m_p25->m_control) {
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);
m_lastRejectId = srcId;
@ -253,7 +262,9 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
if (!acl::AccessControl::validateSrcId(dstId)) {
if (m_lastRejectId == 0 || m_lastRejectId != 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);
m_lastRejectId = dstId;
@ -270,7 +281,9 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
if (!acl::AccessControl::validateTGId(dstId)) {
if (m_lastRejectId == 0 || m_lastRejectId != 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);
m_lastRejectId = dstId;
@ -832,7 +845,7 @@ bool VoicePacket::writeEndRF()
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->writeControlEndRF();
}

Loading…
Cancel
Save

Powered by TurnKey Linux.