diff --git a/DMRAccessControl.cpp b/DMRAccessControl.cpp index a881ab2..48927aa 100644 --- a/DMRAccessControl.cpp +++ b/DMRAccessControl.cpp @@ -18,6 +18,7 @@ #include #include +#include std::vector DMRAccessControl::m_dstBlackListSlot1RF; std::vector DMRAccessControl::m_dstBlackListSlot2RF; @@ -37,6 +38,10 @@ bool DMRAccessControl::m_selfOnly = false; unsigned int DMRAccessControl::m_id = 0U; +unsigned int DMRAccessControl::m_dstRewriteID = 0U; + +std::time_t DMRAccessControl::m_time; + void DMRAccessControl::init(const std::vector& DstIdBlacklistSlot1RF, const std::vector& DstIdWhitelistSlot1RF, const std::vector& DstIdBlacklistSlot2RF, const std::vector& DstIdWhitelistSlot2RF, const std::vector& DstIdBlacklistSlot1NET, const std::vector& DstIdWhitelistSlot1NET, const std::vector& DstIdBlacklistSlot2NET, const std::vector& DstIdWhitelistSlot2NET, const std::vector& SrcIdBlacklist, bool selfOnly, const std::vector& prefixes,unsigned int id) { m_dstBlackListSlot1RF = DstIdBlacklistSlot1RF; @@ -180,3 +185,33 @@ bool DMRAccessControl::validateAccess (unsigned int src_id, unsigned int dst_id, return true; } } + +unsigned int DMRAccessControl::DstIdRewrite (unsigned int id, bool network) +{ + // record current time + std::time_t currenttime = std::time(nullptr); + + // if the traffic is from the network + if (network) { + m_dstRewriteID = id; + // record current time + m_time = std::time(nullptr); + // if the ID is a talkgroup, log and rewrite to TG9 + if (id < 4000 && id != 0) { + LogMessage("Rewrite DST ID (TG) of of inbound network traffic from %u to 9", id); + return 9; + } else { + return 0; + } + } else { + // if less than 30 seconds has passed since we last saw traffic + if (m_dstRewriteID == id && (m_time + 30) > currenttime && m_time) { + LogMessage("Inbound DST ID (TG) rewrite seen in last 30 seconds"); + LogMessage("Rewrite DST ID (TG) of outbound network traffic from 9 to %u", id); + return(id); + } else { + return(0); + } + } + +} diff --git a/DMRAccessControl.h b/DMRAccessControl.h index 78be7ba..5e4f989 100644 --- a/DMRAccessControl.h +++ b/DMRAccessControl.h @@ -16,12 +16,15 @@ #define DMRAccessControl_H #include +#include class DMRAccessControl { public: static bool validateAccess (unsigned int src_id, unsigned int dst_id, unsigned int slot, bool network); static void init(const std::vector& DstIdBlacklistSlot1RF, const std::vector& DstIdWhitelistSlot1RF, const std::vector& DstIdBlacklistSlot2RF, const std::vector& DstIdWhitelistSlot2RF, const std::vector& DstIdBlacklistSlot1NET, const std::vector& DstIdWhitelistSlot1NET, const std::vector& DstIdBlacklistSlot2NET, const std::vector& DstIdWhitelistSlot2NET, const std::vector& SrcIdBlacklist, bool selfOnly, const std::vector& prefixes,unsigned int id); + + static unsigned int DstIdRewrite(unsigned int id, bool network); private: static std::vector m_dstBlackListSlot1RF; @@ -45,6 +48,12 @@ private: static bool DstIdWhitelist(unsigned int did,unsigned int slot,bool gt4k, bool network); static bool validateSrcId(unsigned int id); + + static std::time_t m_time; + + static unsigned int m_dstRewriteID; + + }; #endif diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 9cea73a..620a423 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -157,7 +157,7 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) if (!DMRAccessControl::validateAccess(id, did, m_slotNo, false)) { delete lc; return; - } + } m_rfLC = lc; @@ -762,6 +762,13 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int id = m_netLC->getSrcId(); if (!DMRAccessControl::validateAccess(id, did, m_slotNo, true)) return; + + // Test dst rewrite + unsigned int rw_id = DMRAccessControl::DstIdRewrite(id, true); + if (rw_id) { + LogMessage("Rewrite ID: %u", rw_id); + m_netLC->setDstId(rw_id); + } // Store the LC for the embedded LC m_netEmbeddedLC.setData(*m_netLC); @@ -825,6 +832,13 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int id = m_netLC->getSrcId(); if (!DMRAccessControl::validateAccess(id, did, m_slotNo, true)) return; + + // Test dst rewrite + unsigned int rw_id = DMRAccessControl::DstIdRewrite(id,true); + if (rw_id) { + LogMessage("Rewrite ID: %u", rw_id); + m_netLC->setDstId(rw_id); + } // Regenerate the Slot Type CDMRSlotType slotType;