diff --git a/Conf.cpp b/Conf.cpp index 15f346a..baadfc7 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -107,14 +107,7 @@ m_dmrColorCode(2U), m_dmrSelfOnly(false), m_dmrPrefixes(), m_dmrBlackList(), -m_dmrDstIdBlacklistSlot1RF(), -m_dmrDstIdBlacklistSlot2RF(), -m_dmrDstIdWhitelistSlot1RF(), -m_dmrDstIdWhitelistSlot2RF(), -m_dmrDstIdBlacklistSlot1NET(), -m_dmrDstIdBlacklistSlot2NET(), -m_dmrDstIdWhitelistSlot1NET(), -m_dmrDstIdWhitelistSlot2NET(), +m_dmrWhiteList(), m_dmrCallHang(3U), m_dmrTXHang(4U), m_fusionEnabled(false), @@ -395,68 +388,12 @@ bool CConf::read() m_dmrBlackList.push_back(id); p = ::strtok(NULL, ",\r\n"); } - } else if (::strcmp(key, "DstIdBlackListSlot1RF") == 0) { + } else if (::strcmp(key, "WhiteList") == 0) { char* p = ::strtok(value, ",\r\n"); while (p != NULL) { unsigned int id = (unsigned int)::atoi(p); if (id > 0U) - m_dmrDstIdBlacklistSlot1RF.push_back(id); - p = ::strtok(NULL, ",\r\n"); - } - } else if (::strcmp(key, "DstIdBlackListSlot2RF") == 0) { - char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { - unsigned int id = (unsigned int)::atoi(p); - if (id > 0U) - m_dmrDstIdBlacklistSlot2RF.push_back(id); - p = ::strtok(NULL, ",\r\n"); - } - } else if (::strcmp(key, "DstIdWhiteListSlot1RF") == 0) { - char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { - unsigned int id = (unsigned int)::atoi(p); - if (id > 0U) - m_dmrDstIdWhitelistSlot1RF.push_back(id); - p = ::strtok(NULL, ",\r\n"); - } - } else if (::strcmp(key, "DstIdWhiteListSlot2RF") == 0) { - char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { - unsigned int id = (unsigned int)::atoi(p); - if (id > 0U) - m_dmrDstIdWhitelistSlot2RF.push_back(id); - p = ::strtok(NULL, ",\r\n"); - } - } else if (::strcmp(key, "DstIdBlackListSlot1NET") == 0) { - char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { - unsigned int id = (unsigned int)::atoi(p); - if (id > 0U) - m_dmrDstIdBlacklistSlot1NET.push_back(id); - p = ::strtok(NULL, ",\r\n"); - } - } else if (::strcmp(key, "DstIdBlackListSlot2NET") == 0) { - char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { - unsigned int id = (unsigned int)::atoi(p); - if (id > 0U) - m_dmrDstIdBlacklistSlot2NET.push_back(id); - p = ::strtok(NULL, ",\r\n"); - } - } else if (::strcmp(key, "DstIdWhiteListSlot1NET") == 0) { - char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { - unsigned int id = (unsigned int)::atoi(p); - if (id > 0U) - m_dmrDstIdWhitelistSlot1NET.push_back(id); - p = ::strtok(NULL, ",\r\n"); - } - } else if (::strcmp(key, "DstIdWhiteListSlot2NET") == 0) { - char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { - unsigned int id = (unsigned int)::atoi(p); - if (id > 0U) - m_dmrDstIdWhitelistSlot2NET.push_back(id); + m_dmrWhiteList.push_back(id); p = ::strtok(NULL, ",\r\n"); } } else if (::strcmp(key, "TXHang") == 0) @@ -867,44 +804,9 @@ std::vector CConf::getDMRBlackList() const return m_dmrBlackList; } -std::vector CConf::getDMRDstIdBlacklistSlot1RF() const +std::vector CConf::getDMRWhiteList() const { - return m_dmrDstIdBlacklistSlot1RF; -} - -std::vector CConf::getDMRDstIdBlacklistSlot2RF() const -{ - return m_dmrDstIdBlacklistSlot2RF; -} - -std::vector CConf::getDMRDstIdWhitelistSlot1RF() const -{ - return m_dmrDstIdWhitelistSlot1RF; -} - -std::vector CConf::getDMRDstIdWhitelistSlot2RF() const -{ - return m_dmrDstIdWhitelistSlot2RF; -} - -std::vector CConf::getDMRDstIdBlacklistSlot1NET() const -{ - return m_dmrDstIdBlacklistSlot1NET; -} - -std::vector CConf::getDMRDstIdBlacklistSlot2NET() const -{ - return m_dmrDstIdBlacklistSlot2NET; -} - -std::vector CConf::getDMRDstIdWhitelistSlot1NET() const -{ - return m_dmrDstIdWhitelistSlot1NET; -} - -std::vector CConf::getDMRDstIdWhitelistSlot2NET() const -{ - return m_dmrDstIdWhitelistSlot2NET; + return m_dmrWhiteList; } unsigned int CConf::getDMRCallHang() const diff --git a/Conf.h b/Conf.h index d94b550..c3c3ce5 100644 --- a/Conf.h +++ b/Conf.h @@ -100,14 +100,7 @@ public: bool getDMRSelfOnly() const; std::vector getDMRPrefixes() const; std::vector getDMRBlackList() const; - std::vector getDMRDstIdBlacklistSlot1RF() const; - std::vector getDMRDstIdBlacklistSlot2RF() const; - std::vector getDMRDstIdWhitelistSlot1RF() const; - std::vector getDMRDstIdWhitelistSlot2RF() const; - std::vector getDMRDstIdBlacklistSlot1NET() const; - std::vector getDMRDstIdBlacklistSlot2NET() const; - std::vector getDMRDstIdWhitelistSlot1NET() const; - std::vector getDMRDstIdWhitelistSlot2NET() const; + std::vector getDMRWhiteList() const; unsigned int getDMRCallHang() const; unsigned int getDMRTXHang() const; @@ -253,14 +246,7 @@ private: bool m_dmrSelfOnly; std::vector m_dmrPrefixes; std::vector m_dmrBlackList; - std::vector m_dmrDstIdBlacklistSlot1RF; - std::vector m_dmrDstIdBlacklistSlot2RF; - std::vector m_dmrDstIdWhitelistSlot1RF; - std::vector m_dmrDstIdWhitelistSlot2RF; - std::vector m_dmrDstIdBlacklistSlot1NET; - std::vector m_dmrDstIdBlacklistSlot2NET; - std::vector m_dmrDstIdWhitelistSlot1NET; - std::vector m_dmrDstIdWhitelistSlot2NET; + std::vector m_dmrWhiteList; unsigned int m_dmrCallHang; unsigned int m_dmrTXHang; diff --git a/DMRAccessControl.cpp b/DMRAccessControl.cpp index 17656d1..9b942b3 100644 --- a/DMRAccessControl.cpp +++ b/DMRAccessControl.cpp @@ -20,18 +20,8 @@ #include #include - -std::vector CDMRAccessControl::m_dstBlackListSlot1RF; -std::vector CDMRAccessControl::m_dstBlackListSlot2RF; -std::vector CDMRAccessControl::m_dstWhiteListSlot1RF; -std::vector CDMRAccessControl::m_dstWhiteListSlot2RF; - -std::vector CDMRAccessControl::m_dstBlackListSlot1NET; -std::vector CDMRAccessControl::m_dstBlackListSlot2NET; -std::vector CDMRAccessControl::m_dstWhiteListSlot1NET; -std::vector CDMRAccessControl::m_dstWhiteListSlot2NET; - -std::vector CDMRAccessControl::m_srcIdBlacklist; +std::vector CDMRAccessControl::m_blackList; +std::vector CDMRAccessControl::m_whiteList; std::vector CDMRAccessControl::m_prefixes; @@ -39,146 +29,33 @@ bool CDMRAccessControl::m_selfOnly = false; unsigned int CDMRAccessControl::m_id = 0U; -void CDMRAccessControl::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) +void CDMRAccessControl::init(const std::vector& blacklist, const std::vector& whitelist, bool selfOnly, const std::vector& prefixes, unsigned int id) { - m_dstBlackListSlot1RF = dstIdBlacklistSlot1RF; - m_dstWhiteListSlot1RF = dstIdWhitelistSlot1RF; - m_dstBlackListSlot2RF = dstIdBlacklistSlot2RF; - m_dstWhiteListSlot2RF = dstIdWhitelistSlot2RF; - m_dstBlackListSlot1NET = dstIdBlacklistSlot1NET; - m_dstWhiteListSlot1NET = dstIdWhitelistSlot1NET; - m_dstBlackListSlot2NET = dstIdBlacklistSlot2NET; - m_dstWhiteListSlot2NET = dstIdWhitelistSlot2NET; + m_blackList = blacklist; + m_whiteList = whitelist; } -bool CDMRAccessControl::dstIdBlacklist(unsigned int did, unsigned int slot, bool network) -{ - static std::vector blacklist; - - if (slot == 1U) { - if (network) - blacklist = m_dstBlackListSlot1NET; - else - blacklist = m_dstBlackListSlot1RF; - } else { - if (network) - blacklist = m_dstBlackListSlot2NET; - else - blacklist = m_dstBlackListSlot2RF; - } - - return std::find(blacklist.begin(), blacklist.end(), did) != blacklist.end(); -} - -bool CDMRAccessControl::dstIdWhitelist(unsigned int did, unsigned int slot, bool gt4k, bool network) -{ - if (network) { - if (slot == 1U) { - if (m_dstWhiteListSlot1NET.size() == 0U) - return true; - - // No reflectors on slot1, so we only allow all IDs over 99999 unless specifically whitelisted. - // Allow traffic to TG0 as I think this is a special case - need to confirm - if (gt4k) { - if (std::find(m_dstWhiteListSlot1NET.begin(), m_dstWhiteListSlot1NET.end(), did) != m_dstWhiteListSlot1NET.end() || did >= 99999U || did == 0) - return true; - } else { - if (std::find(m_dstWhiteListSlot1NET.begin(), m_dstWhiteListSlot1NET.end(), did) != m_dstWhiteListSlot1NET.end() || did == 0) - return true; - } - } else { - if (m_dstWhiteListSlot2NET.size() == 0U) - return true; - - // On slot2 we allow reflector control IDs, but not secondary TG IDs unless specifically listed. Also allow echo. - if (gt4k) { - if (std::find(m_dstWhiteListSlot2NET.begin(), m_dstWhiteListSlot2NET.end(), did) != m_dstWhiteListSlot2NET.end() || did == 0) - return true; - // If dstId in secondary TG range or whitelist - else if (did >= 4000) { - if (did > 5000U && did < 10000U) - return false; - else - return true; - } - } else { - if (std::find(m_dstWhiteListSlot2NET.begin(), m_dstWhiteListSlot2NET.end(), did) != m_dstWhiteListSlot2NET.end()) - return true; - } - } - - return false; - } else { - if (slot == 1U) { - if (m_dstWhiteListSlot1RF.size() == 0U) - return true; - - // No reflectors on slot1, so we only allow all IDs over 99999 unless specifically whitelisted. - // Allow traffic to TG0 as I think this is a special case - need to confirm - if (gt4k) { - if (std::find(m_dstWhiteListSlot1RF.begin(), m_dstWhiteListSlot1RF.end(), did) != m_dstWhiteListSlot1RF.end() || did >= 99999U || did == 0) - return true; - } else { - if (std::find(m_dstWhiteListSlot1RF.begin(), m_dstWhiteListSlot1RF.end(), did) != m_dstWhiteListSlot1RF.end() || did == 0) - return true; - } - } else { - if (m_dstWhiteListSlot2RF.size() == 0U) - return true; - - // On slot2 we allow reflector control IDs, but not secondary TG IDs unless specifically listed. Also allow echo. - if (gt4k) { - if (std::find(m_dstWhiteListSlot2RF.begin(), m_dstWhiteListSlot2RF.end(), did) != m_dstWhiteListSlot2RF.end() || did == 0) - return true; - // If dstId in secondary TG range or whitelist - else if (did >= 4000U) { - if (did > 5000U && did < 10000U) - return false; - else - return true; - } - } else { - if (std::find(m_dstWhiteListSlot2RF.begin(), m_dstWhiteListSlot2RF.end(), did) != m_dstWhiteListSlot2RF.end()) - return true; - } - } - - return false; - } -} - -bool CDMRAccessControl::validateSrcId(unsigned int id) +bool CDMRAccessControl::validateId(unsigned int id) { if (m_selfOnly) { return id == m_id; } else { - if (std::find(m_srcIdBlacklist.begin(), m_srcIdBlacklist.end(), id) != m_srcIdBlacklist.end()) + if (std::find(m_blackList.begin(), m_blackList.end(), id) != m_blackList.end()) return false; unsigned int prefix = id / 10000U; if (prefix == 0U || prefix > 999U) return false; - if (m_prefixes.size() == 0U) - return true; + if (!m_prefixes.empty()) { + bool ret = std::find(m_prefixes.begin(), m_prefixes.end(), prefix) == m_prefixes.end(); + if (!ret) + return false; + } - return std::find(m_prefixes.begin(), m_prefixes.end(), prefix) != m_prefixes.end(); - } -} + if (!m_whiteList.empty()) + return std::find(m_whiteList.begin(), m_whiteList.end(), id) != m_whiteList.end(); -bool CDMRAccessControl::validateAccess(unsigned int src_id, unsigned int dst_id, unsigned int slot, bool network) -{ - // source ID validation is only applied to RF traffic - if (!network && !CDMRAccessControl::validateSrcId(src_id)) { - LogMessage("DMR Slot %u, invalid access attempt from %u (blacklisted)", slot, src_id); - return false; - } else if (CDMRAccessControl::dstIdBlacklist(dst_id, slot, network)) { - LogMessage("DMR Slot %u, invalid access attempt to TG%u (TG blacklisted)", slot, dst_id); - return false; - } else if (!CDMRAccessControl::dstIdWhitelist(dst_id, slot, true, network)) { - LogMessage("DMR Slot %u, invalid access attempt to TG%u (TG not in whitelist)", slot, dst_id); - return false; - } else { return true; } } diff --git a/DMRAccessControl.h b/DMRAccessControl.h index a90c86f..118365c 100644 --- a/DMRAccessControl.h +++ b/DMRAccessControl.h @@ -21,32 +21,18 @@ class CDMRAccessControl { public: - static bool validateAccess(unsigned int srcId, unsigned int dstId, unsigned int slot, bool network); + static bool validateId(unsigned int id); - static bool validateSrcId(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); + static void init(const std::vector& blacklist, const std::vector& whitelist, bool selfOnly, const std::vector& prefixes, unsigned int id); private: - static std::vector m_dstBlackListSlot1RF; - static std::vector m_dstBlackListSlot2RF; - static std::vector m_dstWhiteListSlot1RF; - static std::vector m_dstWhiteListSlot2RF; - - static std::vector m_dstBlackListSlot1NET; - static std::vector m_dstBlackListSlot2NET; - static std::vector m_dstWhiteListSlot1NET; - static std::vector m_dstWhiteListSlot2NET; - - static std::vector m_srcIdBlacklist; + static std::vector m_blackList; + static std::vector m_whiteList; static std::vector m_prefixes; static bool m_selfOnly; static unsigned int m_id; - - static bool dstIdBlacklist(unsigned int did, unsigned int slot, bool network); - static bool dstIdWhitelist(unsigned int did, unsigned int slot, bool gt4k, bool network); }; #endif diff --git a/DMRControl.cpp b/DMRControl.cpp index c8b5ae1..dfb6fc5 100644 --- a/DMRControl.cpp +++ b/DMRControl.cpp @@ -21,7 +21,7 @@ #include #include -CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector& prefixes, const std::vector& blacklist, 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, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, int rssiMultiplier, int rssiOffset, unsigned int jitter) : +CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector& prefixes, const std::vector& blacklist, const std::vector& whitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, int rssiMultiplier, int rssiOffset, unsigned int jitter) : m_id(id), m_colorCode(colorCode), m_modem(modem), @@ -36,7 +36,7 @@ m_lookup(lookup) assert(lookup != NULL); // Load black and white lists to DMRAccessControl - CDMRAccessControl::init(dstIdBlacklistSlot1RF, dstIdWhitelistSlot1RF, dstIdBlacklistSlot2RF, dstIdWhitelistSlot2RF, dstIdBlacklistSlot1NET, dstIdWhitelistSlot1NET, dstIdBlacklistSlot2NET, dstIdWhitelistSlot2NET, blacklist, selfOnly, prefixes, id); + CDMRAccessControl::init(blacklist, whitelist, selfOnly, prefixes, id); CDMRSlot::init(colorCode, callHang, modem, network, display, duplex, m_lookup, rssiMultiplier, rssiOffset, jitter); } @@ -67,7 +67,7 @@ bool CDMRControl::processWakeup(const unsigned char* data) std::string src = m_lookup->find(srcId); - bool ret = CDMRAccessControl::validateSrcId(srcId); + bool ret = CDMRAccessControl::validateId(srcId); if (!ret) { LogMessage("Invalid CSBK BS_Dwn_Act received from %s", src.c_str()); return false; diff --git a/DMRControl.h b/DMRControl.h index bca7820..788aafe 100644 --- a/DMRControl.h +++ b/DMRControl.h @@ -30,7 +30,7 @@ class CDMRControl { public: - CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector& prefixes, const std::vector& blacklist, 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, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, int rssiMultiplier, int rssiOffset, unsigned int jitter); + CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector& prefixes, const std::vector& blacklist, const std::vector& whitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, int rssiMultiplier, int rssiOffset, unsigned int jitter); ~CDMRControl(); bool processWakeup(const unsigned char* data); diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 0c1c5ee..4199697 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -152,7 +152,8 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) unsigned int srcId = lc->getSrcId(); unsigned int dstId = lc->getDstId(); - if (!CDMRAccessControl::validateAccess(srcId, dstId, m_slotNo, false)) { + if (!CDMRAccessControl::validateId(srcId)) { + LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId); delete lc; return; } @@ -264,8 +265,10 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) unsigned int srcId = dataHeader.getSrcId(); unsigned int dstId = dataHeader.getDstId(); - if (!CDMRAccessControl::validateAccess(srcId, dstId, m_slotNo, false)) - return; + if (!CDMRAccessControl::validateId(srcId)) { + LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId); + return; + } m_rfFrames = dataHeader.getBlocks(); @@ -321,8 +324,10 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) unsigned int dstId = csbk.getDstId(); if (srcId != 0U || dstId != 0U) { - if (!CDMRAccessControl::validateAccess(srcId, dstId, m_slotNo, false)) + if (!CDMRAccessControl::validateId(srcId)) { + LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId); return; + } } // Regenerate the CSBK data @@ -475,8 +480,9 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) unsigned int srcId = lc->getSrcId(); unsigned int dstId = lc->getDstId(); - if (!CDMRAccessControl::validateAccess(srcId, dstId, m_slotNo, false)) { - delete lc; + if (!CDMRAccessControl::validateId(srcId)) { + LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId); + delete lc; return; } @@ -749,7 +755,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int dstId = lc->getDstId(); unsigned int srcId = lc->getSrcId(); - if (!CDMRAccessControl::validateAccess(srcId, dstId, m_slotNo, true)) { + if (!CDMRAccessControl::validateId(srcId)) { + LogMessage("DMR Slot %u, network user %u rejected", m_slotNo, srcId); delete lc; return; } @@ -814,7 +821,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int dstId = lc->getDstId(); unsigned int srcId = lc->getSrcId(); - if (!CDMRAccessControl::validateAccess(srcId, dstId, m_slotNo, true)) { + if (!CDMRAccessControl::validateId(srcId)) { + LogMessage("DMR Slot %u, network user %u rejected", m_slotNo, srcId); delete lc; return; } @@ -950,8 +958,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int srcId = dataHeader.getSrcId(); unsigned int dstId = dataHeader.getDstId(); - if (!CDMRAccessControl::validateAccess(srcId, dstId, m_slotNo, true)) - return; + if (!CDMRAccessControl::validateId(srcId)) { + LogMessage("DMR Slot %u, network user %u rejected", m_slotNo, srcId); + return; + } m_netFrames = dataHeader.getBlocks(); @@ -996,7 +1006,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int dstId = lc->getDstId(); unsigned int srcId = lc->getSrcId(); - if (!CDMRAccessControl::validateAccess(srcId, dstId, m_slotNo, true)) { + if (!CDMRAccessControl::validateId(srcId)) { + LogMessage("DMR Slot %u, network user %u rejected", m_slotNo, srcId); delete lc; return; } @@ -1152,8 +1163,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int dstId = csbk.getDstId(); if (srcId != 0U || dstId != 0U) { - if (!CDMRAccessControl::validateAccess(srcId, dstId, m_slotNo, true)) + if (!CDMRAccessControl::validateId(srcId)) { + LogMessage("DMR Slot %u, network user %u rejected", m_slotNo, srcId); return; + } } // Regenerate the CSBK data diff --git a/MMDVM.ini b/MMDVM.ini index c500784..68afb5c 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -73,15 +73,6 @@ SelfOnly=0 # Prefixes=234,235 CallHang=3 TXHang=4 -#Blacklist= -#DstIdBlackListSlot1RF= -#DstIdBlackListSlot2RF= -#DstIdWhiteListSlot1RF= -#DstIdWhiteListSlot2RF= -#DstIdBlackListSlot1NET= -#DstIdBlackListSlot2NET= -#DstIdWhiteListSlot1NET= -#DstIdWhiteListSlot2NET= [System Fusion] Enable=1 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index a5a9022..5870c16 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -336,14 +336,7 @@ int CMMDVMHost::run() bool selfOnly = m_conf.getDMRSelfOnly(); std::vector prefixes = m_conf.getDMRPrefixes(); std::vector blackList = m_conf.getDMRBlackList(); - std::vector dstIDBlackListSlot1RF = m_conf.getDMRDstIdBlacklistSlot1RF(); - std::vector dstIDBlackListSlot2RF = m_conf.getDMRDstIdBlacklistSlot2RF(); - std::vector dstIDWhiteListSlot1RF = m_conf.getDMRDstIdWhitelistSlot1RF(); - std::vector dstIDWhiteListSlot2RF = m_conf.getDMRDstIdWhitelistSlot2RF(); - std::vector dstIDBlackListSlot1NET = m_conf.getDMRDstIdBlacklistSlot1NET(); - std::vector dstIDBlackListSlot2NET = m_conf.getDMRDstIdBlacklistSlot2NET(); - std::vector dstIDWhiteListSlot1NET = m_conf.getDMRDstIdWhitelistSlot1NET(); - std::vector dstIDWhiteListSlot2NET = m_conf.getDMRDstIdWhitelistSlot2NET(); + std::vector whiteList = m_conf.getDMRWhiteList(); unsigned int callHang = m_conf.getDMRCallHang(); unsigned int txHang = m_conf.getDMRTXHang(); int rssiMultiplier = m_conf.getModemRSSIMultiplier(); @@ -366,23 +359,9 @@ int CMMDVMHost::run() if (blackList.size() > 0U) LogInfo(" Source ID Black List: %u", blackList.size()); - if (dstIDBlackListSlot1RF.size() > 0U) - LogInfo(" Slot 1 RF Destination ID Black List: %u entries", dstIDBlackListSlot1RF.size()); - if (dstIDBlackListSlot2RF.size() > 0U) - LogInfo(" Slot 2 RF Destination ID Black List: %u entries", dstIDBlackListSlot2RF.size()); - if (dstIDWhiteListSlot1RF.size() > 0U) - LogInfo(" Slot 1 RF Destination ID White List: %u entries", dstIDWhiteListSlot1RF.size()); - if (dstIDWhiteListSlot2RF.size() > 0U) - LogInfo(" Slot 2 RF Destination ID White List: %u entries", dstIDWhiteListSlot2RF.size()); - if (dstIDBlackListSlot1NET.size() > 0U) - LogInfo(" Slot 1 NET Destination ID Black List: %u entries", dstIDBlackListSlot1NET.size()); - if (dstIDBlackListSlot2NET.size() > 0U) - LogInfo(" Slot 2 NET Destination ID Black List: %u entries", dstIDBlackListSlot2NET.size()); - if (dstIDWhiteListSlot1NET.size() > 0U) - LogInfo(" Slot 1 NET Destination ID White List: %u entries", dstIDWhiteListSlot1NET.size()); - if (dstIDWhiteListSlot2NET.size() > 0U) - LogInfo(" Slot 2 NET Destination ID White List: %u entries", dstIDWhiteListSlot2NET.size()); - + if (whiteList.size() > 0U) + LogInfo(" Source ID White List: %u", whiteList.size()); + LogInfo(" Call Hang: %us", callHang); LogInfo(" TX Hang: %us", txHang); @@ -391,7 +370,7 @@ int CMMDVMHost::run() LogInfo(" RSSI Offset: %d", rssiOffset); } - dmr = new CDMRControl(id, colorCode, callHang, selfOnly, prefixes, blackList, dstIDBlackListSlot1RF, dstIDWhiteListSlot1RF, dstIDBlackListSlot2RF, dstIDWhiteListSlot2RF, dstIDBlackListSlot1NET,dstIDWhiteListSlot1NET, dstIDBlackListSlot2NET, dstIDWhiteListSlot2NET, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_lookup, rssiMultiplier, rssiOffset, jitter); + dmr = new CDMRControl(id, colorCode, callHang, selfOnly, prefixes, blackList, whiteList, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_lookup, rssiMultiplier, rssiOffset, jitter); m_dmrTXTimer.setTimeout(txHang); }