From 53fe88bf9e74d517ecf0e230b0d4b2dd8d29cdf8 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 10 Jul 2016 21:37:11 +0100 Subject: [PATCH] Add separate blacklist/whitelist for RF and NET --- Conf.cpp | 91 +++++++++++++++++------ Conf.h | 24 ++++--- DMRAccessControl.cpp | 167 ++++++++++++++++++++++++++++++------------- DMRAccessControl.h | 24 ++++--- DMRControl.cpp | 4 +- DMRControl.h | 2 +- DMRSlot.cpp | 10 +-- DMRSlot.h | 5 +- MMDVMHost.cpp | 40 +++++++---- 9 files changed, 251 insertions(+), 116 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index 8a67ea2..56e4378 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -91,10 +91,14 @@ m_dmrColorCode(2U), m_dmrSelfOnly(false), m_dmrPrefixes(), m_dmrBlackList(), -m_dmrDstIdBlacklistSlot1(), -m_dmrDstIdBlacklistSlot2(), -m_dmrDstIdWhitelistSlot1(), -m_dmrDstIdWhitelistSlot2(), +m_dmrDstIdBlacklistSlot1RF(), +m_dmrDstIdBlacklistSlot2RF(), +m_dmrDstIdWhitelistSlot1RF(), +m_dmrDstIdWhitelistSlot2RF(), +m_dmrDstIdBlacklistSlot1NET(), +m_dmrDstIdBlacklistSlot2NET(), +m_dmrDstIdWhitelistSlot1NET(), +m_dmrDstIdWhitelistSlot2NET(), m_dmrLookupFile(), m_dmrCallHang(3U), m_dmrTXHang(4U), @@ -326,36 +330,68 @@ bool CConf::read() m_dmrBlackList.push_back(id); p = ::strtok(NULL, ",\r\n"); } - } else if (::strcmp(key, "DstIdBlackListSlot1") == 0) { + } else if (::strcmp(key, "DstIdBlackListSlot1RF") == 0) { char* p = ::strtok(value, ",\r\n"); while (p != NULL) { unsigned int id = (unsigned int)::atoi(p); if (id > 0U) - m_dmrDstIdBlacklistSlot1.push_back(id); + m_dmrDstIdBlacklistSlot1RF.push_back(id); p = ::strtok(NULL, ",\r\n"); } - } else if (::strcmp(key, "DstIdBlackListSlot2") == 0) { + } 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_dmrDstIdBlacklistSlot2.push_back(id); + m_dmrDstIdBlacklistSlot2RF.push_back(id); p = ::strtok(NULL, ",\r\n"); } - } else if (::strcmp(key, "DstIdWhiteListSlot1") == 0) { + } 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_dmrDstIdWhitelistSlot1.push_back(id); + m_dmrDstIdWhitelistSlot1RF.push_back(id); p = ::strtok(NULL, ",\r\n"); } - } else if (::strcmp(key, "DstIdWhiteListSlot2") == 0) { + } 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_dmrDstIdWhitelistSlot2.push_back(id); + 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); p = ::strtok(NULL, ",\r\n"); } } else if (::strcmp(key, "LookupFile") == 0) @@ -681,20 +717,35 @@ std::vector CConf::getDMRBlackList() const { return m_dmrBlackList; } -std::vector CConf::getDMRDstIdBlacklistSlot1() const +std::vector CConf::getDMRDstIdBlacklistSlot1RF() const { - return m_dmrDstIdBlacklistSlot1; + return m_dmrDstIdBlacklistSlot1RF; } -std::vector CConf::getDMRDstIdBlacklistSlot2() const +std::vector CConf::getDMRDstIdBlacklistSlot2RF() const { - return m_dmrDstIdBlacklistSlot2; + return m_dmrDstIdBlacklistSlot2RF; } -std::vector CConf::getDMRDstIdWhitelistSlot1() const +std::vector CConf::getDMRDstIdWhitelistSlot1RF() const { - return m_dmrDstIdWhitelistSlot1; -}std::vector CConf::getDMRDstIdWhitelistSlot2() const + return m_dmrDstIdWhitelistSlot1RF; +}std::vector CConf::getDMRDstIdWhitelistSlot2RF() const { - return m_dmrDstIdWhitelistSlot2; + 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; } std::string CConf::getDMRLookupFile() const { diff --git a/Conf.h b/Conf.h index 08b6621..8fc694f 100644 --- a/Conf.h +++ b/Conf.h @@ -86,10 +86,14 @@ public: bool getDMRSelfOnly() const; std::vector getDMRPrefixes() const; std::vector getDMRBlackList() const; - std::vector getDMRDstIdBlacklistSlot1() const; - std::vector getDMRDstIdBlacklistSlot2() const; - std::vector getDMRDstIdWhitelistSlot1() const; - std::vector getDMRDstIdWhitelistSlot2() 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::string getDMRLookupFile() const; unsigned int getDMRCallHang() const; unsigned int getDMRTXHang() const; @@ -201,10 +205,14 @@ private: bool m_dmrSelfOnly; std::vector m_dmrPrefixes; std::vector m_dmrBlackList; - std::vector m_dmrDstIdBlacklistSlot1; - std::vector m_dmrDstIdBlacklistSlot2; - std::vector m_dmrDstIdWhitelistSlot1; - std::vector m_dmrDstIdWhitelistSlot2; + 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::string m_dmrLookupFile; unsigned int m_dmrCallHang; unsigned int m_dmrTXHang; diff --git a/DMRAccessControl.cpp b/DMRAccessControl.cpp index 5cd8457..4222007 100644 --- a/DMRAccessControl.cpp +++ b/DMRAccessControl.cpp @@ -19,10 +19,15 @@ #include #include -std::vector DMRAccessControl::m_dstBlackListSlot1; -std::vector DMRAccessControl::m_dstBlackListSlot2; -std::vector DMRAccessControl::m_dstWhiteListSlot1; -std::vector DMRAccessControl::m_dstWhiteListSlot2; +std::vector DMRAccessControl::m_dstBlackListSlot1RF; +std::vector DMRAccessControl::m_dstBlackListSlot2RF; +std::vector DMRAccessControl::m_dstWhiteListSlot1RF; +std::vector DMRAccessControl::m_dstWhiteListSlot2RF; + +std::vector DMRAccessControl::m_dstBlackListSlot1NET; +std::vector DMRAccessControl::m_dstBlackListSlot2NET; +std::vector DMRAccessControl::m_dstWhiteListSlot1NET; +std::vector DMRAccessControl::m_dstWhiteListSlot2NET; std::vector DMRAccessControl::m_SrcIdBlacklist; @@ -30,66 +35,126 @@ std::vector DMRAccessControl::m_prefixes; bool DMRAccessControl::m_selfOnly; unsigned int DMRAccessControl::m_id; -void DMRAccessControl::init(const std::vector& DstIdBlacklistSlot1, const std::vector& DstIdWhitelistSlot1, const std::vector& DstIdBlacklistSlot2, const std::vector& DstIdWhitelistSlot2, const std::vector& SrcIdBlacklist, bool selfOnly, const std::vector& prefixes,unsigned int id) +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_dstBlackListSlot1 = DstIdBlacklistSlot1; - m_dstWhiteListSlot1 = DstIdWhitelistSlot1; - m_dstBlackListSlot2 = DstIdBlacklistSlot2; - m_dstWhiteListSlot2 = DstIdWhitelistSlot2; + m_dstBlackListSlot1RF = DstIdBlacklistSlot1RF; + m_dstWhiteListSlot1RF = DstIdWhitelistSlot1RF; + m_dstBlackListSlot2RF = DstIdBlacklistSlot2RF; + m_dstWhiteListSlot2RF = DstIdWhitelistSlot2RF; + m_dstBlackListSlot1NET = DstIdBlacklistSlot1NET; + m_dstWhiteListSlot1NET = DstIdWhitelistSlot1NET; + m_dstBlackListSlot2NET = DstIdBlacklistSlot2NET; + m_dstWhiteListSlot2NET = DstIdWhitelistSlot2NET; } -bool DMRAccessControl::DstIdBlacklist(unsigned int did, unsigned int slot) +bool DMRAccessControl::DstIdBlacklist(unsigned int did, unsigned int slot, bool network) { + static std::vector Blacklist; + if (slot == 1U) { - if (std::find(m_dstBlackListSlot1.begin(), m_dstBlackListSlot1.end(), did) != m_dstBlackListSlot1.end()) - return true; + + if (network) { + Blacklist = m_dstBlackListSlot1NET; + } + else { + Blacklist = m_dstBlackListSlot1RF; + } } else { - if (std::find(m_dstBlackListSlot2.begin(), m_dstBlackListSlot2.end(), did) != m_dstBlackListSlot2.end()) - return true; + if (network) { + Blacklist = m_dstBlackListSlot2NET; + } + else { + Blacklist = m_dstBlackListSlot2RF; + } } + if (std::find(Blacklist.begin(), Blacklist.end(), did) != Blacklist.end()) + return true; return false; } -bool DMRAccessControl::DstIdWhitelist(unsigned int did, unsigned int slot, bool gt4k) +bool DMRAccessControl::DstIdWhitelist(unsigned int did, unsigned int slot, bool gt4k, bool network) { - if (slot == 1U) { - if (m_dstWhiteListSlot1.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_dstWhiteListSlot1.begin(), m_dstWhiteListSlot1.end(), did) != m_dstWhiteListSlot1.end() || did >= 99999U || did == 0) - return true; - } else { - if (std::find(m_dstWhiteListSlot1.begin(), m_dstWhiteListSlot1.end(), did) != m_dstWhiteListSlot1.end() || did == 0) - return true; - } - } else { - if (m_dstWhiteListSlot2.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_dstWhiteListSlot2.begin(), m_dstWhiteListSlot2.end(), did) != m_dstWhiteListSlot2.end() || did == 0) + if (network) { + + if (slot == 1U) { + if (m_dstWhiteListSlot1NET.size() == 0U) 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_dstWhiteListSlot2.begin(), m_dstWhiteListSlot2.end(), did) != m_dstWhiteListSlot2.end()) - return true; - } - } - return false; + // 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 >= 4000) { + 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 DMRAccessControl::validateSrcId(unsigned int id) @@ -119,11 +184,11 @@ bool DMRAccessControl::validateAccess (unsigned int src_id, unsigned int dst_id, return false; } - else if (DMRAccessControl::DstIdBlacklist(dst_id, slot)) { + else if (DMRAccessControl::DstIdBlacklist(dst_id, slot, network)) { LogMessage("DMR Slot %u, invalid access attempt to TG%u (TG blacklisted)", slot, dst_id); return false; } - else if (!DMRAccessControl::DstIdWhitelist(dst_id, slot, true)) { + else if (!DMRAccessControl::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; } diff --git a/DMRAccessControl.h b/DMRAccessControl.h index 9aa8eef..01ca408 100644 --- a/DMRAccessControl.h +++ b/DMRAccessControl.h @@ -19,22 +19,23 @@ class DMRAccessControl { public: - static bool DstIdBlacklist(unsigned int did,unsigned int slot); - static bool DstIdWhitelist(unsigned int did,unsigned int slot,bool gt4k); - - static bool validateSrcId(unsigned int id); static bool validateAccess (unsigned int src_id, unsigned int dst_id, unsigned int slot, bool network); - static void init(const std::vector& DstIdBlacklistSlot1, const std::vector& DstIdWhitelistSlot1, const std::vector& DstIdBlacklistSlot2, const std::vector& DstIdWhitelistSlot2, 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); private: - static std::vector m_dstBlackListSlot1; - static std::vector m_dstBlackListSlot2; - static std::vector m_dstWhiteListSlot1; - static std::vector m_dstWhiteListSlot2; + 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; @@ -42,6 +43,11 @@ private: 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); + + static bool validateSrcId(unsigned int id); diff --git a/DMRControl.cpp b/DMRControl.cpp index f4e2674..1e39d2f 100644 --- a/DMRControl.cpp +++ b/DMRControl.cpp @@ -20,7 +20,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& DstIdBlacklistSlot1, const std::vector& DstIdWhitelistSlot1, const std::vector& DstIdBlacklistSlot2, const std::vector& DstIdWhitelistSlot2, unsigned int timeout, CModem* modem, CDMRIPSC* network, CDisplay* display, bool duplex, const std::string& lookupFile) : +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, CDMRIPSC* network, CDisplay* display, bool duplex, const std::string& lookupFile) : m_id(id), m_colorCode(colorCode), m_selfOnly(selfOnly), @@ -38,7 +38,7 @@ m_lookup(NULL) m_lookup = new CDMRLookup(lookupFile); m_lookup->read(); - CDMRSlot::init(id, colorCode, callHang, selfOnly, prefixes, blackList, DstIdBlacklistSlot1, DstIdWhitelistSlot1, DstIdBlacklistSlot2, DstIdWhitelistSlot2, modem, network, display, duplex, m_lookup); + CDMRSlot::init(id, colorCode, callHang, selfOnly, prefixes, blackList, DstIdBlacklistSlot1RF, DstIdWhitelistSlot1RF, DstIdBlacklistSlot2RF, DstIdWhitelistSlot2RF, DstIdBlacklistSlot1NET, DstIdWhitelistSlot1NET, DstIdBlacklistSlot2NET, DstIdWhitelistSlot2NET, modem, network, display, duplex, m_lookup); } CDMRControl::~CDMRControl() diff --git a/DMRControl.h b/DMRControl.h index 3d3f8fe..f0da13c 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& DstIdBlacklistSlot1, const std::vector& DstIdWhitelistSlot1, const std::vector& DstIdBlacklistSlot2, const std::vector& DstIdWhitelistSlot2, unsigned int timeout, CModem* modem, CDMRIPSC* network, CDisplay* display, bool duplex, const std::string& lookupFile); + 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, CDMRIPSC* network, CDisplay* display, bool duplex, const std::string& lookupFile); ~CDMRControl(); bool processWakeup(const unsigned char* data); diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 25b34ca..356c490 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -33,11 +33,7 @@ unsigned int CDMRSlot::m_colorCode = 0U; bool CDMRSlot::m_selfOnly = false; std::vector CDMRSlot::m_prefixes; std::vector CDMRSlot::m_blackList; -/*std::vector CDMRSlot::m_dstBlackListSlot1; -std::vector CDMRSlot::m_dstWhiteListSlot1; -std::vector CDMRSlot::m_dstBlackListSlot2; -std::vector CDMRSlot::m_dstWhiteListSlot2; -*/ + CModem* CDMRSlot::m_modem = NULL; CDMRIPSC* CDMRSlot::m_network = NULL; CDisplay* CDMRSlot::m_display = NULL; @@ -1343,7 +1339,7 @@ void CDMRSlot::writeQueueNet(const unsigned char *data) m_queue.addData(data, len); } -void CDMRSlot::init(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector& prefixes, const std::vector& SrcIdBlacklist, const std::vector& DstIdBlacklistSlot1, const std::vector& DstIdWhitelistSlot1, const std::vector& DstIdBlacklistSlot2, const std::vector& DstIdWhitelistSlot2, CModem* modem, CDMRIPSC* network, CDisplay* display, bool duplex, CDMRLookup* lookup) +void CDMRSlot::init(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector& prefixes, const std::vector& SrcIdBlacklist, 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, CModem* modem, CDMRIPSC* network, CDisplay* display, bool duplex, CDMRLookup* lookup) { assert(id != 0U); assert(modem != NULL); @@ -1373,7 +1369,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(DstIdBlacklistSlot1, DstIdWhitelistSlot1, DstIdBlacklistSlot2, DstIdWhitelistSlot2, SrcIdBlacklist, m_selfOnly, m_prefixes, m_id); + DMRAccessControl::init(DstIdBlacklistSlot1RF, DstIdWhitelistSlot1RF, DstIdBlacklistSlot2RF, DstIdWhitelistSlot2RF, DstIdBlacklistSlot1NET, DstIdWhitelistSlot1NET, DstIdBlacklistSlot2NET, DstIdWhitelistSlot2NET, SrcIdBlacklist, m_selfOnly, m_prefixes, m_id); } diff --git a/DMRSlot.h b/DMRSlot.h index e6ab014..c011c98 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -50,7 +50,7 @@ public: void clock(); - static void init(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector& prefixes, const std::vector& blackList, const std::vector& DstIdBlacklistSlot1, const std::vector& DstIdWhitelistSlot1, const std::vector& DstIdBlacklistSlot2, const std::vector& DstIdWhitelistSlot2, CModem* modem, CDMRIPSC* network, CDisplay* display, bool duplex, CDMRLookup* lookup); + static void init(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector& prefixes, const std::vector& SrcIdBlackList, 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, CModem* modem, CDMRIPSC* network, CDisplay* display, bool duplex, CDMRLookup* lookup); private: unsigned int m_slotNo; @@ -132,9 +132,6 @@ private: static void setShortLC(unsigned int slotNo, unsigned int id, FLCO flco = FLCO_GROUP, bool voice = true); static bool validateId(unsigned int id); - static bool DstIdBlacklist(unsigned int did,unsigned int slot); - static bool DstIdWhitelist(unsigned int did,unsigned int slot,bool gt4k); - static char DMRAC; }; #endif diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 1988e99..5d09240 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -290,10 +290,14 @@ int CMMDVMHost::run() bool selfOnly = m_conf.getDMRSelfOnly(); std::vector prefixes = m_conf.getDMRPrefixes(); std::vector blackList = m_conf.getDMRBlackList(); - std::vector dstIDBlackListSlot1 = m_conf.getDMRDstIdBlacklistSlot1(); - std::vector dstIDBlackListSlot2 = m_conf.getDMRDstIdBlacklistSlot2(); - std::vector dstIDWhiteListSlot1 = m_conf.getDMRDstIdWhitelistSlot1(); - std::vector dstIDWhiteListSlot2 = m_conf.getDMRDstIdWhitelistSlot2(); + 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::string lookupFile = m_conf.getDMRLookupFile(); unsigned int callHang = m_conf.getDMRCallHang(); unsigned int txHang = m_conf.getDMRTXHang(); @@ -313,21 +317,29 @@ int CMMDVMHost::run() LogInfo(" Prefixes: %u", prefixes.size()); if (blackList.size() > 0U) - LogInfo(" Black List: %u", blackList.size()); - if (dstIDBlackListSlot1.size() > 0U) - LogInfo(" Slot 1 Destination ID Black List: %u entries", dstIDBlackListSlot1.size()); - if (dstIDBlackListSlot2.size() > 0U) - LogInfo(" Slot 2 Destination ID Black List: %u entries", dstIDBlackListSlot2.size()); - if (dstIDWhiteListSlot1.size() > 0U) - LogInfo(" Slot 1 Destination ID White List: %u entries", dstIDWhiteListSlot1.size()); - if (dstIDWhiteListSlot2.size() > 0U) - LogInfo(" Slot 2 Destination ID White List: %u entries", dstIDWhiteListSlot2.size()); + 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()); LogInfo(" Lookup File: %s", lookupFile.length() > 0U ? lookupFile.c_str() : "None"); LogInfo(" Call Hang: %us", callHang); LogInfo(" TX Hang: %us", txHang); - dmr = new CDMRControl(id, colorCode, callHang, selfOnly, prefixes, blackList,dstIDBlackListSlot1,dstIDWhiteListSlot1, dstIDBlackListSlot2, dstIDWhiteListSlot2, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, lookupFile); + 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, lookupFile); m_dmrTXTimer.setTimeout(txHang); }