From 7d582138aaf3148762c8562b92259a3396c92b49 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Sat, 3 Aug 2024 20:11:07 -0400 Subject: [PATCH] properly respect N(S)/N(R); --- .../callhandler/packetdata/P25PacketData.cpp | 34 ++++++++----------- .../callhandler/packetdata/P25PacketData.h | 3 +- src/host/p25/packet/Data.cpp | 10 +++--- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/fne/network/callhandler/packetdata/P25PacketData.cpp b/src/fne/network/callhandler/packetdata/P25PacketData.cpp index d15a1f8f..4f7e75b6 100644 --- a/src/fne/network/callhandler/packetdata/P25PacketData.cpp +++ b/src/fne/network/callhandler/packetdata/P25PacketData.cpp @@ -34,12 +34,6 @@ using namespace p25::sndcp; #include #endif // !defined(_WIN32) -// --------------------------------------------------------------------------- -// Static Class Members -// --------------------------------------------------------------------------- - -uint8_t P25PacketData::m_sendSeqNo = 0U; - // --------------------------------------------------------------------------- // Constants // --------------------------------------------------------------------------- @@ -148,6 +142,7 @@ bool P25PacketData::processFrame(const uint8_t* data, uint32_t len, uint32_t pee if (status->header.getSAP() != PDUSAP::EXT_ADDR && status->header.getFormat() != PDUFormatType::UNCONFIRMED) { m_readyForPkt[status->llId] = true; + m_suSendSeq[status->llId] = 0U; } LogMessage(LOG_NET, "P25, Data Call Start, peer = %u, llId = %u, streamId = %u, external = %u", peerId, status->llId, streamId, external); @@ -224,6 +219,7 @@ bool P25PacketData::processFrame(const uint8_t* data, uint32_t len, uint32_t pee status->extendedAddress = true; status->llId = status->header.getSrcLLId(); m_readyForPkt[status->llId] = true; + m_suSendSeq[status->llId] = 0U; offset += P25_PDU_FEC_LENGTH_BYTES; blocksToFollow--; @@ -449,6 +445,7 @@ void P25PacketData::dispatch(uint32_t peerId) crcValid = edac::CRC::checkCRC32(status->pduUserData, status->pduUserDataLength); if (!crcValid) { LogError(LOG_NET, P25_PDU_STR ", failed CRC-32 check, blocks %u, len %u", status->header.getBlocksToFollow(), status->pduUserDataLength); + return; } } @@ -526,11 +523,6 @@ void P25PacketData::dispatch(uint32_t peerId) if (!m_network->m_host->m_vtunEnabled) break; - if (!crcValid) { - write_PDU_Ack_Response(PDUAckClass::NACK, PDUAckType::NACK_PACKET_CRC, 0U, (status->extendedAddress) ? status->header.getSrcLLId() : status->header.getLLId()); - break; - } - int dataPktOffset = 0U; if (status->header.getFormat() == PDUFormatType::CONFIRMED && status->extendedAddress) dataPktOffset = 4U; @@ -561,7 +553,7 @@ void P25PacketData::dispatch(uint32_t peerId) LogError(LOG_NET, P25_PDU_STR ", failed to write IP frame to virtual tunnel, len %u", pktLen); } - write_PDU_Ack_Response(PDUAckClass::ACK, PDUAckType::ACK, 0U, (status->extendedAddress) ? status->header.getSrcLLId() : status->header.getLLId()); + write_PDU_Ack_Response(PDUAckClass::ACK, PDUAckType::ACK, status->header.getNs(), (status->extendedAddress) ? status->header.getSrcLLId() : status->header.getLLId()); m_readyForPkt[status->header.getSrcLLId()] = true; #endif // !defined(_WIN32) } @@ -645,13 +637,17 @@ void P25PacketData::dispatchUserFrameToFNE(p25::data::DataHeader& dataHeader, bo uint32_t srcId = (extendedAddress) ? dataHeader.getSrcLLId() : dataHeader.getLLId(); uint32_t dstId = dataHeader.getLLId(); - dataHeader.setSynchronize(true); -/* - dataHeader.setNs(m_sendSeqNo); - ++m_sendSeqNo; - if (m_sendSeqNo > 7U) - m_sendSeqNo = 0U; -*/ + uint8_t sendSeqNo = m_suSendSeq[srcId]; + if (sendSeqNo == 0U) { + dataHeader.setSynchronize(true); + } + + dataHeader.setNs(sendSeqNo); + ++sendSeqNo; + if (sendSeqNo > 7U) + sendSeqNo = 0U; + m_suSendSeq[srcId] = sendSeqNo; + // repeat traffic to the connected peers if (m_network->m_peers.size() > 0U) { uint32_t i = 0U; diff --git a/src/fne/network/callhandler/packetdata/P25PacketData.h b/src/fne/network/callhandler/packetdata/P25PacketData.h index 018a1ea5..6a388e35 100644 --- a/src/fne/network/callhandler/packetdata/P25PacketData.h +++ b/src/fne/network/callhandler/packetdata/P25PacketData.h @@ -85,8 +85,6 @@ namespace network FNENetwork* m_network; TagP25Data *m_tag; - static uint8_t m_sendSeqNo; - /** * @brief Represents a queued data frame from the VTUN. */ @@ -166,6 +164,7 @@ namespace network std::unordered_map m_arpTable; std::unordered_map m_readyForPkt; std::unordered_map m_suNotReadyTimeout; + std::unordered_map m_suSendSeq; bool m_debug; diff --git a/src/host/p25/packet/Data.cpp b/src/host/p25/packet/Data.cpp index 64ce0dcf..bea3c1f1 100644 --- a/src/host/p25/packet/Data.cpp +++ b/src/host/p25/packet/Data.cpp @@ -306,7 +306,7 @@ bool Data::process(uint8_t* data, uint32_t len) bool crcRet = edac::CRC::checkCRC32(m_rfPduUserData, m_rfPduUserDataLength); if (!crcRet) { LogWarning(LOG_RF, P25_PDU_STR ", failed CRC-32 check, blocks %u, len %u", m_rfDataHeader.getBlocksToFollow(), m_rfPduUserDataLength); - writeRF_PDU_Ack_Response(PDUAckClass::NACK, PDUAckType::NACK_PACKET_CRC, 0U, (m_rfExtendedAddress) ? m_rfDataHeader.getSrcLLId() : m_rfDataHeader.getLLId()); + writeRF_PDU_Ack_Response(PDUAckClass::NACK, PDUAckType::NACK_PACKET_CRC, m_rfDataHeader.getNs(), (m_rfExtendedAddress) ? m_rfDataHeader.getSrcLLId() : m_rfDataHeader.getLLId()); } } @@ -381,7 +381,7 @@ bool Data::process(uint8_t* data, uint32_t len) LogMessage(LOG_RF, P25_PDU_STR ", ISP, response, OSP ACK RETRY, llId = %u, exceeded retries, undeliverable", m_rfDataHeader.getLLId()); - writeRF_PDU_Ack_Response(PDUAckClass::NACK, PDUAckType::NACK_UNDELIVERABLE, 0U, m_rfDataHeader.getLLId()); + writeRF_PDU_Ack_Response(PDUAckClass::NACK, PDUAckType::NACK_UNDELIVERABLE, m_rfDataHeader.getNs(), m_rfDataHeader.getLLId()); } } } @@ -1199,7 +1199,7 @@ bool Data::processConvDataReg(const uint8_t* pduUserData) m_convRegTimerTable[llId].start(); // acknowledge - writeRF_PDU_Ack_Response(PDUAckClass::ACK, PDUAckType::ACK, 0U, llId); + writeRF_PDU_Ack_Response(PDUAckClass::ACK, PDUAckType::ACK, m_rfDataHeader.getNs(), llId); } break; case PDURegType::DISCONNECT: @@ -1211,7 +1211,7 @@ bool Data::processConvDataReg(const uint8_t* pduUserData) } // acknowledge - writeRF_PDU_Ack_Response(PDUAckClass::ACK, PDUAckType::ACK, 0U, llId); + writeRF_PDU_Ack_Response(PDUAckClass::ACK, PDUAckType::ACK, m_rfDataHeader.getNs(), llId); if (hasLLIdFNEReg(llId)) { // remove dynamic FNE registration table entry @@ -1364,7 +1364,7 @@ bool Data::processSNDCPControl(const uint8_t* pduUserData) isp->getDeactType()); } - writeRF_PDU_Ack_Response(PDUAckClass::ACK, PDUAckType::ACK, 0U, llId); + writeRF_PDU_Ack_Response(PDUAckClass::ACK, PDUAckType::ACK, m_rfDataHeader.getNs(), llId); sndcpReset(llId, true); } break;