From 7132f632ab3d239f5850acf8592c3bf2f264a10a Mon Sep 17 00:00:00 2001 From: Doug McLain Date: Sun, 17 Nov 2024 18:11:37 -0500 Subject: [PATCH] Handle late entries for DMR. A late entry can be a new stream with a missing header or a stream that drops long enough to be closed, but then continues to send voice frames. --- reflector/DMRMMDVMProtocol.cpp | 47 ++++++++++++++++++++++++++++++---- reflector/DMRMMDVMProtocol.h | 2 +- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/reflector/DMRMMDVMProtocol.cpp b/reflector/DMRMMDVMProtocol.cpp index 12bbe38..c4d6143 100644 --- a/reflector/DMRMMDVMProtocol.cpp +++ b/reflector/DMRMMDVMProtocol.cpp @@ -95,7 +95,7 @@ void CDmrmmdvmProtocol::Task(void) { //Buffer.DebugDump(g_Reflector.m_DebugFile); // crack the packet - if ( IsValidDvFramePacket(Buffer, Frames) ) + if ( IsValidDvFramePacket(Ip, Buffer, Header, Frames) ) { for ( int i = 0; i < 3; i++ ) { @@ -652,7 +652,7 @@ bool CDmrmmdvmProtocol::IsValidDvHeaderPacket(const CBuffer &Buffer, std::unique return false; } -bool CDmrmmdvmProtocol::IsValidDvFramePacket(const CBuffer &Buffer, std::array, 3> &frames) +bool CDmrmmdvmProtocol::IsValidDvFramePacket(const CIp &Ip, const CBuffer &Buffer, std::unique_ptr &header, std::array, 3> &frames) { uint8_t tag[] = { 'D','M','R','D' }; @@ -667,12 +667,49 @@ bool CDmrmmdvmProtocol::IsValidDvFramePacket(const CBuffer &Buffer, std::array(new CDvHeaderPacket(uiSrcId, CCallsign("CQCQCQ"), rpt1, rpt2, uiStreamId, 0, 0)); + + if ( g_GateKeeper.MayTransmit(header->GetMyCallsign(), Ip, EProtocol::dmrmmdvm) ) + { + // handle it + OnDvHeaderPacketIn(header, Ip, cmd, uiCallType); + } + } + // crack payload uint8_t dmrframe[33]; uint8_t dmr3ambe[27]; diff --git a/reflector/DMRMMDVMProtocol.h b/reflector/DMRMMDVMProtocol.h index 17864c7..0d1bafa 100644 --- a/reflector/DMRMMDVMProtocol.h +++ b/reflector/DMRMMDVMProtocol.h @@ -81,7 +81,7 @@ protected: bool IsValidKeepAlivePacket(const CBuffer &, CCallsign *); bool IsValidRssiPacket(const CBuffer &, CCallsign *, int *); bool IsValidDvHeaderPacket(const CBuffer &, std::unique_ptr &, uint8_t *, uint8_t *); - bool IsValidDvFramePacket(const CBuffer &, std::array, 3> &); + bool IsValidDvFramePacket(const CIp &, const CBuffer &, std::unique_ptr &, std::array, 3> &); bool IsValidDvLastFramePacket(const CBuffer &, std::unique_ptr &); // packet encoding helpers