mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-21 15:09:23 +08:00
Add separate blacklist/whitelist for RF and NET
This commit is contained in:
91
Conf.cpp
91
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<unsigned int> CConf::getDMRBlackList() const
|
||||
{
|
||||
return m_dmrBlackList;
|
||||
}
|
||||
std::vector<unsigned int> CConf::getDMRDstIdBlacklistSlot1() const
|
||||
std::vector<unsigned int> CConf::getDMRDstIdBlacklistSlot1RF() const
|
||||
{
|
||||
return m_dmrDstIdBlacklistSlot1;
|
||||
return m_dmrDstIdBlacklistSlot1RF;
|
||||
}
|
||||
std::vector<unsigned int> CConf::getDMRDstIdBlacklistSlot2() const
|
||||
std::vector<unsigned int> CConf::getDMRDstIdBlacklistSlot2RF() const
|
||||
{
|
||||
return m_dmrDstIdBlacklistSlot2;
|
||||
return m_dmrDstIdBlacklistSlot2RF;
|
||||
}
|
||||
std::vector<unsigned int> CConf::getDMRDstIdWhitelistSlot1() const
|
||||
std::vector<unsigned int> CConf::getDMRDstIdWhitelistSlot1RF() const
|
||||
{
|
||||
return m_dmrDstIdWhitelistSlot1;
|
||||
}std::vector<unsigned int> CConf::getDMRDstIdWhitelistSlot2() const
|
||||
return m_dmrDstIdWhitelistSlot1RF;
|
||||
}std::vector<unsigned int> CConf::getDMRDstIdWhitelistSlot2RF() const
|
||||
{
|
||||
return m_dmrDstIdWhitelistSlot2;
|
||||
return m_dmrDstIdWhitelistSlot2RF;
|
||||
}
|
||||
std::vector<unsigned int> CConf::getDMRDstIdBlacklistSlot1NET() const
|
||||
{
|
||||
return m_dmrDstIdBlacklistSlot1NET;
|
||||
}
|
||||
std::vector<unsigned int> CConf::getDMRDstIdBlacklistSlot2NET() const
|
||||
{
|
||||
return m_dmrDstIdBlacklistSlot2NET;
|
||||
}
|
||||
std::vector<unsigned int> CConf::getDMRDstIdWhitelistSlot1NET() const
|
||||
{
|
||||
return m_dmrDstIdWhitelistSlot1NET;
|
||||
}std::vector<unsigned int> CConf::getDMRDstIdWhitelistSlot2NET() const
|
||||
{
|
||||
return m_dmrDstIdWhitelistSlot2NET;
|
||||
}
|
||||
std::string CConf::getDMRLookupFile() const
|
||||
{
|
||||
|
||||
24
Conf.h
24
Conf.h
@@ -86,10 +86,14 @@ public:
|
||||
bool getDMRSelfOnly() const;
|
||||
std::vector<unsigned int> getDMRPrefixes() const;
|
||||
std::vector<unsigned int> getDMRBlackList() const;
|
||||
std::vector<unsigned int> getDMRDstIdBlacklistSlot1() const;
|
||||
std::vector<unsigned int> getDMRDstIdBlacklistSlot2() const;
|
||||
std::vector<unsigned int> getDMRDstIdWhitelistSlot1() const;
|
||||
std::vector<unsigned int> getDMRDstIdWhitelistSlot2() const;
|
||||
std::vector<unsigned int> getDMRDstIdBlacklistSlot1RF() const;
|
||||
std::vector<unsigned int> getDMRDstIdBlacklistSlot2RF() const;
|
||||
std::vector<unsigned int> getDMRDstIdWhitelistSlot1RF() const;
|
||||
std::vector<unsigned int> getDMRDstIdWhitelistSlot2RF() const;
|
||||
std::vector<unsigned int> getDMRDstIdBlacklistSlot1NET() const;
|
||||
std::vector<unsigned int> getDMRDstIdBlacklistSlot2NET() const;
|
||||
std::vector<unsigned int> getDMRDstIdWhitelistSlot1NET() const;
|
||||
std::vector<unsigned int> getDMRDstIdWhitelistSlot2NET() const;
|
||||
std::string getDMRLookupFile() const;
|
||||
unsigned int getDMRCallHang() const;
|
||||
unsigned int getDMRTXHang() const;
|
||||
@@ -201,10 +205,14 @@ private:
|
||||
bool m_dmrSelfOnly;
|
||||
std::vector<unsigned int> m_dmrPrefixes;
|
||||
std::vector<unsigned int> m_dmrBlackList;
|
||||
std::vector<unsigned int> m_dmrDstIdBlacklistSlot1;
|
||||
std::vector<unsigned int> m_dmrDstIdBlacklistSlot2;
|
||||
std::vector<unsigned int> m_dmrDstIdWhitelistSlot1;
|
||||
std::vector<unsigned int> m_dmrDstIdWhitelistSlot2;
|
||||
std::vector<unsigned int> m_dmrDstIdBlacklistSlot1RF;
|
||||
std::vector<unsigned int> m_dmrDstIdBlacklistSlot2RF;
|
||||
std::vector<unsigned int> m_dmrDstIdWhitelistSlot1RF;
|
||||
std::vector<unsigned int> m_dmrDstIdWhitelistSlot2RF;
|
||||
std::vector<unsigned int> m_dmrDstIdBlacklistSlot1NET;
|
||||
std::vector<unsigned int> m_dmrDstIdBlacklistSlot2NET;
|
||||
std::vector<unsigned int> m_dmrDstIdWhitelistSlot1NET;
|
||||
std::vector<unsigned int> m_dmrDstIdWhitelistSlot2NET;
|
||||
std::string m_dmrLookupFile;
|
||||
unsigned int m_dmrCallHang;
|
||||
unsigned int m_dmrTXHang;
|
||||
|
||||
@@ -19,10 +19,15 @@
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstBlackListSlot1;
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstBlackListSlot2;
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstWhiteListSlot1;
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstWhiteListSlot2;
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstBlackListSlot1RF;
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstBlackListSlot2RF;
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstWhiteListSlot1RF;
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstWhiteListSlot2RF;
|
||||
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstBlackListSlot1NET;
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstBlackListSlot2NET;
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstWhiteListSlot1NET;
|
||||
std::vector<unsigned int> DMRAccessControl::m_dstWhiteListSlot2NET;
|
||||
|
||||
std::vector<unsigned int> DMRAccessControl::m_SrcIdBlacklist;
|
||||
|
||||
@@ -30,66 +35,126 @@ std::vector<unsigned int> DMRAccessControl::m_prefixes;
|
||||
bool DMRAccessControl::m_selfOnly;
|
||||
unsigned int DMRAccessControl::m_id;
|
||||
|
||||
void DMRAccessControl::init(const std::vector<unsigned int>& DstIdBlacklistSlot1, const std::vector<unsigned int>& DstIdWhitelistSlot1, const std::vector<unsigned int>& DstIdBlacklistSlot2, const std::vector<unsigned int>& DstIdWhitelistSlot2, const std::vector<unsigned int>& SrcIdBlacklist, bool selfOnly, const std::vector<unsigned int>& prefixes,unsigned int id)
|
||||
void DMRAccessControl::init(const std::vector<unsigned int>& DstIdBlacklistSlot1RF, const std::vector<unsigned int>& DstIdWhitelistSlot1RF, const std::vector<unsigned int>& DstIdBlacklistSlot2RF, const std::vector<unsigned int>& DstIdWhitelistSlot2RF, const std::vector<unsigned int>& DstIdBlacklistSlot1NET, const std::vector<unsigned int>& DstIdWhitelistSlot1NET, const std::vector<unsigned int>& DstIdBlacklistSlot2NET, const std::vector<unsigned int>& DstIdWhitelistSlot2NET, const std::vector<unsigned int>& SrcIdBlacklist, bool selfOnly, const std::vector<unsigned int>& 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<unsigned int> 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;
|
||||
if (network) {
|
||||
|
||||
// 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 (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;
|
||||
}
|
||||
}
|
||||
// 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;
|
||||
|
||||
return false;
|
||||
//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;
|
||||
}
|
||||
|
||||
@@ -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<unsigned int>& DstIdBlacklistSlot1, const std::vector<unsigned int>& DstIdWhitelistSlot1, const std::vector<unsigned int>& DstIdBlacklistSlot2, const std::vector<unsigned int>& DstIdWhitelistSlot2, const std::vector<unsigned int>& SrcIdBlacklist, bool selfOnly, const std::vector<unsigned int>& prefixes,unsigned int id);
|
||||
static void init(const std::vector<unsigned int>& DstIdBlacklistSlot1RF, const std::vector<unsigned int>& DstIdWhitelistSlot1RF, const std::vector<unsigned int>& DstIdBlacklistSlot2RF, const std::vector<unsigned int>& DstIdWhitelistSlot2RF, const std::vector<unsigned int>& DstIdBlacklistSlot1NET, const std::vector<unsigned int>& DstIdWhitelistSlot1NET, const std::vector<unsigned int>& DstIdBlacklistSlot2NET, const std::vector<unsigned int>& DstIdWhitelistSlot2NET, const std::vector<unsigned int>& SrcIdBlacklist, bool selfOnly, const std::vector<unsigned int>& prefixes,unsigned int id);
|
||||
|
||||
|
||||
|
||||
private:
|
||||
static std::vector<unsigned int> m_dstBlackListSlot1;
|
||||
static std::vector<unsigned int> m_dstBlackListSlot2;
|
||||
static std::vector<unsigned int> m_dstWhiteListSlot1;
|
||||
static std::vector<unsigned int> m_dstWhiteListSlot2;
|
||||
static std::vector<unsigned int> m_dstBlackListSlot1RF;
|
||||
static std::vector<unsigned int> m_dstBlackListSlot2RF;
|
||||
static std::vector<unsigned int> m_dstWhiteListSlot1RF;
|
||||
static std::vector<unsigned int> m_dstWhiteListSlot2RF;
|
||||
|
||||
static std::vector<unsigned int> m_dstBlackListSlot1NET;
|
||||
static std::vector<unsigned int> m_dstBlackListSlot2NET;
|
||||
static std::vector<unsigned int> m_dstWhiteListSlot1NET;
|
||||
static std::vector<unsigned int> m_dstWhiteListSlot2NET;
|
||||
|
||||
static std::vector<unsigned int> m_SrcIdBlacklist;
|
||||
|
||||
@@ -43,6 +44,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);
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include <cassert>
|
||||
#include <algorithm>
|
||||
|
||||
CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blackList, const std::vector<unsigned int>& DstIdBlacklistSlot1, const std::vector<unsigned int>& DstIdWhitelistSlot1, const std::vector<unsigned int>& DstIdBlacklistSlot2, const std::vector<unsigned int>& 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<unsigned int>& prefixes, const std::vector<unsigned int>& blackList, const std::vector<unsigned int>& DstIdBlacklistSlot1RF, const std::vector<unsigned int>& DstIdWhitelistSlot1RF, const std::vector<unsigned int>& DstIdBlacklistSlot2RF, const std::vector<unsigned int>& DstIdWhitelistSlot2RF, const std::vector<unsigned int>& DstIdBlacklistSlot1NET, const std::vector<unsigned int>& DstIdWhitelistSlot1NET, const std::vector<unsigned int>& DstIdBlacklistSlot2NET, const std::vector<unsigned int>& 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()
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
class CDMRControl {
|
||||
public:
|
||||
CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blackList, const std::vector<unsigned int>& DstIdBlacklistSlot1, const std::vector<unsigned int>& DstIdWhitelistSlot1, const std::vector<unsigned int>& DstIdBlacklistSlot2, const std::vector<unsigned int>& 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<unsigned int>& prefixes, const std::vector<unsigned int>& blackList, const std::vector<unsigned int>& DstIdBlacklistSlot1RF, const std::vector<unsigned int>& DstIdWhitelistSlot1RF, const std::vector<unsigned int>& DstIdBlacklistSlot2RF, const std::vector<unsigned int>& DstIdWhitelistSlot2RF,const std::vector<unsigned int>& DstIdBlacklistSlot1NET, const std::vector<unsigned int>& DstIdWhitelistSlot1NET, const std::vector<unsigned int>& DstIdBlacklistSlot2NET, const std::vector<unsigned int>& DstIdWhitelistSlot2NET, unsigned int timeout, CModem* modem, CDMRIPSC* network, CDisplay* display, bool duplex, const std::string& lookupFile);
|
||||
~CDMRControl();
|
||||
|
||||
bool processWakeup(const unsigned char* data);
|
||||
|
||||
10
DMRSlot.cpp
10
DMRSlot.cpp
@@ -33,11 +33,7 @@ unsigned int CDMRSlot::m_colorCode = 0U;
|
||||
bool CDMRSlot::m_selfOnly = false;
|
||||
std::vector<unsigned int> CDMRSlot::m_prefixes;
|
||||
std::vector<unsigned int> CDMRSlot::m_blackList;
|
||||
/*std::vector<unsigned int> CDMRSlot::m_dstBlackListSlot1;
|
||||
std::vector<unsigned int> CDMRSlot::m_dstWhiteListSlot1;
|
||||
std::vector<unsigned int> CDMRSlot::m_dstBlackListSlot2;
|
||||
std::vector<unsigned int> 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<unsigned int>& prefixes, const std::vector<unsigned int>& SrcIdBlacklist, const std::vector<unsigned int>& DstIdBlacklistSlot1, const std::vector<unsigned int>& DstIdWhitelistSlot1, const std::vector<unsigned int>& DstIdBlacklistSlot2, const std::vector<unsigned int>& 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<unsigned int>& prefixes, const std::vector<unsigned int>& SrcIdBlacklist, const std::vector<unsigned int>& DstIdBlacklistSlot1RF, const std::vector<unsigned int>& DstIdWhitelistSlot1RF, const std::vector<unsigned int>& DstIdBlacklistSlot2RF, const std::vector<unsigned int>& DstIdWhitelistSlot2RF, const std::vector<unsigned int>& DstIdBlacklistSlot1NET, const std::vector<unsigned int>& DstIdWhitelistSlot1NET, const std::vector<unsigned int>& DstIdBlacklistSlot2NET, const std::vector<unsigned int>& 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ public:
|
||||
|
||||
void clock();
|
||||
|
||||
static void init(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blackList, const std::vector<unsigned int>& DstIdBlacklistSlot1, const std::vector<unsigned int>& DstIdWhitelistSlot1, const std::vector<unsigned int>& DstIdBlacklistSlot2, const std::vector<unsigned int>& 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<unsigned int>& prefixes, const std::vector<unsigned int>& SrcIdBlackList, const std::vector<unsigned int>& DstIdBlacklistSlot1RF, const std::vector<unsigned int>& DstIdWhitelistSlot1RF, const std::vector<unsigned int>& DstIdBlacklistSlot2RF, const std::vector<unsigned int>& DstIdWhitelistSlot2RF, const std::vector<unsigned int>& DstIdBlacklistSlot1NET, const std::vector<unsigned int>& DstIdWhitelistSlot1NET, const std::vector<unsigned int>& DstIdBlacklistSlot2NET, const std::vector<unsigned int>& 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
|
||||
|
||||
@@ -290,10 +290,14 @@ int CMMDVMHost::run()
|
||||
bool selfOnly = m_conf.getDMRSelfOnly();
|
||||
std::vector<unsigned int> prefixes = m_conf.getDMRPrefixes();
|
||||
std::vector<unsigned int> blackList = m_conf.getDMRBlackList();
|
||||
std::vector<unsigned int> dstIDBlackListSlot1 = m_conf.getDMRDstIdBlacklistSlot1();
|
||||
std::vector<unsigned int> dstIDBlackListSlot2 = m_conf.getDMRDstIdBlacklistSlot2();
|
||||
std::vector<unsigned int> dstIDWhiteListSlot1 = m_conf.getDMRDstIdWhitelistSlot1();
|
||||
std::vector<unsigned int> dstIDWhiteListSlot2 = m_conf.getDMRDstIdWhitelistSlot2();
|
||||
std::vector<unsigned int> dstIDBlackListSlot1RF = m_conf.getDMRDstIdBlacklistSlot1RF();
|
||||
std::vector<unsigned int> dstIDBlackListSlot2RF = m_conf.getDMRDstIdBlacklistSlot2RF();
|
||||
std::vector<unsigned int> dstIDWhiteListSlot1RF = m_conf.getDMRDstIdWhitelistSlot1RF();
|
||||
std::vector<unsigned int> dstIDWhiteListSlot2RF = m_conf.getDMRDstIdWhitelistSlot2RF();
|
||||
std::vector<unsigned int> dstIDBlackListSlot1NET = m_conf.getDMRDstIdBlacklistSlot1NET();
|
||||
std::vector<unsigned int> dstIDBlackListSlot2NET = m_conf.getDMRDstIdBlacklistSlot2NET();
|
||||
std::vector<unsigned int> dstIDWhiteListSlot1NET = m_conf.getDMRDstIdWhitelistSlot1NET();
|
||||
std::vector<unsigned int> 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user