diff --git a/DMRAccessControl.cpp b/DMRAccessControl.cpp index 4bc4f4b..ee3c000 100644 --- a/DMRAccessControl.cpp +++ b/DMRAccessControl.cpp @@ -39,10 +39,13 @@ bool DMRAccessControl::m_selfOnly = false; unsigned int DMRAccessControl::m_id = 0U; unsigned int DMRAccessControl::m_dstRewriteID = 0U; +unsigned int DMRAccessControl::m_SrcID = 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) +unsigned int DMRAccessControl::m_callHang; + +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,unsigned int callHang) { m_dstBlackListSlot1RF = DstIdBlacklistSlot1RF; m_dstWhiteListSlot1RF = DstIdWhitelistSlot1RF; @@ -52,6 +55,7 @@ void DMRAccessControl::init(const std::vector& DstIdBlacklistSlot1 m_dstWhiteListSlot1NET = DstIdWhitelistSlot1NET; m_dstBlackListSlot2NET = DstIdBlacklistSlot2NET; m_dstWhiteListSlot2NET = DstIdWhitelistSlot2NET; + m_callHang = callHang; } bool DMRAccessControl::DstIdBlacklist(unsigned int did, unsigned int slot, bool network) @@ -186,33 +190,31 @@ bool DMRAccessControl::validateAccess (unsigned int src_id, unsigned int dst_id, } } -unsigned int DMRAccessControl::DstIdRewrite (unsigned int id, bool network) +unsigned int DMRAccessControl::DstIdRewrite (unsigned int did, unsigned int sid, unsigned int slot, 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); + m_dstRewriteID = did; + m_SrcID = sid; + if (did < 4000 && did > 0 && did != 9) { + LogMessage("DMR Slot %u, Rewrite DST ID (TG) of of inbound network traffic from %u to 9",slot,did); return 9; } else { return 0; } } else { - // if less than 30 seconds has passed since we last saw traffic from network - if (m_dstRewriteID == id && (m_time + 30) > currenttime) { - 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); - m_time = std::time(nullptr); - return(id); + if (m_SrcID == sid && (m_time + m_callHang) > currenttime) { + LogMessage("DMR Slot %u, Rewrite DST ID (TG) of outbound network traffic from 9 to %u (return traffic during CallHang)",slot,m_dstRewriteID); + return(m_dstRewriteID); } else { return(0); } } -} +} + +void DMRAccessControl::setOverEndTime() +{ + m_time = std::time(nullptr); +} diff --git a/DMRAccessControl.h b/DMRAccessControl.h index 5e4f989..cc788d1 100644 --- a/DMRAccessControl.h +++ b/DMRAccessControl.h @@ -22,9 +22,10 @@ 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 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,unsigned int callHang); - static unsigned int DstIdRewrite(unsigned int id, bool network); + static unsigned int DstIdRewrite(unsigned int id, unsigned int sid,unsigned int slot, bool network); + static void setOverEndTime(); private: static std::vector m_dstBlackListSlot1RF; @@ -40,6 +41,8 @@ private: static std::vector m_SrcIdBlacklist; static std::vector m_prefixes; + + static unsigned int m_callHang; static bool m_selfOnly; static unsigned int m_id; @@ -52,6 +55,7 @@ private: static std::time_t m_time; static unsigned int m_dstRewriteID; + static unsigned int m_SrcID; }; diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 2f29850..735a55d 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -152,17 +152,16 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) if (lc == NULL) return; - unsigned int id = lc->getSrcId(); + unsigned int sid = lc->getSrcId(); unsigned int did = lc->getDstId(); - if (!DMRAccessControl::validateAccess(id, did, m_slotNo, false)) { + if (!DMRAccessControl::validateAccess(sid, did, m_slotNo, false)) { delete lc; return; } - // Test dst rewrite - unsigned int rw_id = DMRAccessControl::DstIdRewrite(did, false); + unsigned int rw_id = DMRAccessControl::DstIdRewrite(did,sid,m_slotNo,false); if (rw_id) { - LogMessage("Rewrite ID: %u", rw_id); + lc->setDstId(rw_id); } @@ -203,7 +202,7 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) m_rfState = RS_RF_AUDIO; - std::string src = m_lookup->find(id); + std::string src = m_lookup->find(sid); std::string dst = m_lookup->find(m_rfLC->getDstId()); if (m_netState == RS_NET_IDLE) { @@ -486,16 +485,16 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) CDMRLC* lc = m_rfEmbeddedLC.addData(data + 2U, emb.getLCSS()); if (lc != NULL) { - unsigned int id = lc->getSrcId(); + unsigned int sid = lc->getSrcId(); unsigned int did = lc->getDstId(); - if (!DMRAccessControl::validateAccess(id,did,m_slotNo,false)) { + if (!DMRAccessControl::validateAccess(sid,did,m_slotNo,false)) { delete lc; return; } // Test dst rewrite - unsigned int rw_id = DMRAccessControl::DstIdRewrite(did, false); + unsigned int rw_id = DMRAccessControl::DstIdRewrite(did,sid,m_slotNo,false); if (rw_id) { - LogMessage("Rewrite ID: %u", rw_id); + lc->setDstId(rw_id); } @@ -773,14 +772,14 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) } unsigned int did = m_netLC->getDstId(); - unsigned int id = m_netLC->getSrcId(); - if (!DMRAccessControl::validateAccess(did, did, m_slotNo, true)) + unsigned int sid = m_netLC->getSrcId(); + if (!DMRAccessControl::validateAccess(sid, did, m_slotNo, true)) return; // Test dst rewrite - unsigned int rw_id = DMRAccessControl::DstIdRewrite(did, true); + unsigned int rw_id = DMRAccessControl::DstIdRewrite(did, sid,m_slotNo, true); if (rw_id) { - LogMessage("Rewrite ID: %u", rw_id); + m_netLC->setDstId(rw_id); } @@ -843,14 +842,14 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) return; unsigned int did = m_netLC->getDstId(); - unsigned int id = m_netLC->getSrcId(); - if (!DMRAccessControl::validateAccess(id, did, m_slotNo, true)) + unsigned int sid = m_netLC->getSrcId(); + if (!DMRAccessControl::validateAccess(sid, did, m_slotNo, true)) return; // Test dst rewrite - unsigned int rw_id = DMRAccessControl::DstIdRewrite(id,true); + unsigned int rw_id = DMRAccessControl::DstIdRewrite(did,sid,m_slotNo,true); if (rw_id) { - LogMessage("Rewrite ID: %u", rw_id); + m_netLC->setDstId(rw_id); } @@ -919,6 +918,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) LogMessage("DMR Slot %u, received network end of voice transmission, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slotNo, float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits)); writeEndNet(); + DMRAccessControl::setOverEndTime(); } else if (dataType == DT_DATA_HEADER) { if (m_netState == RS_NET_DATA) return; @@ -1396,7 +1396,7 @@ void CDMRSlot::init(unsigned int id, unsigned int colorCode, unsigned int callHa slotType.getData(m_idle + 2U); //Load black and white lists to DMRAccessControl - DMRAccessControl::init(DstIdBlacklistSlot1RF, DstIdWhitelistSlot1RF, DstIdBlacklistSlot2RF, DstIdWhitelistSlot2RF, DstIdBlacklistSlot1NET, DstIdWhitelistSlot1NET, DstIdBlacklistSlot2NET, DstIdWhitelistSlot2NET, SrcIdBlacklist, m_selfOnly, m_prefixes, m_id); + DMRAccessControl::init(DstIdBlacklistSlot1RF, DstIdWhitelistSlot1RF, DstIdBlacklistSlot2RF, DstIdWhitelistSlot2RF, DstIdBlacklistSlot1NET, DstIdWhitelistSlot1NET, DstIdBlacklistSlot2NET, DstIdWhitelistSlot2NET, SrcIdBlacklist, m_selfOnly, m_prefixes, m_id,callHang); }