Add DMR prefix checking.

This commit is contained in:
Jonathan Naylor
2016-04-04 19:03:38 +01:00
parent ea51eee15c
commit a2130421a9
8 changed files with 96 additions and 25 deletions

View File

@@ -19,10 +19,11 @@
#include <cstdio>
#include <cassert>
CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, bool selfOnly, unsigned int timeout, CModem* modem, CDMRIPSC* network, IDisplay* display, bool duplex) :
CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, bool selfOnly, const std::vector<unsigned int>& prefixes, unsigned int timeout, CModem* modem, CDMRIPSC* network, IDisplay* display, bool duplex) :
m_id(id),
m_colorCode(colorCode),
m_selfOnly(selfOnly),
m_prefixes(prefixes),
m_modem(modem),
m_network(network),
m_slot1(1U, timeout),
@@ -31,7 +32,7 @@ m_slot2(2U, timeout)
assert(modem != NULL);
assert(display != NULL);
CDMRSlot::init(id, colorCode, selfOnly, modem, network, display, duplex);
CDMRSlot::init(id, colorCode, selfOnly, prefixes, modem, network, display, duplex);
}
CDMRControl::~CDMRControl()
@@ -58,22 +59,42 @@ bool CDMRControl::processWakeup(const unsigned char* data)
unsigned int srcId = csbk.getSrcId();
unsigned int bsId = csbk.getBSId();
if (m_selfOnly) {
if (srcId != m_id) {
LogMessage("Invalid CSBK BS_Dwn_Act received from %u", srcId);
return false;
}
} else {
unsigned int prefix = srcId / 10000U;
if (prefix == 0U || prefix > 999U) {
LogMessage("Invalid CSBK BS_Dwn_Act received from %u", srcId);
return false;
}
bool found = false;
if (m_prefixes.size() == 0U)
found = true;
for (std::vector<unsigned int>::const_iterator it = m_prefixes.begin(); it != m_prefixes.end(); ++it) {
if (prefix == *it) {
found = true;
break;
}
}
if (!found) {
LogMessage("Invalid CSBK BS_Dwn_Act received from %u", srcId);
return false;
}
}
if (bsId == 0xFFFFFFU) {
if (m_selfOnly && srcId != m_id) {
LogMessage("Invalid CSBK BS_Dwn_Act for ANY received from %u", srcId);
return false;
} else {
LogMessage("CSBK BS_Dwn_Act for ANY received from %u", srcId);
return true;
}
LogMessage("CSBK BS_Dwn_Act for ANY received from %u", srcId);
return true;
} else if (bsId == m_id) {
if (m_selfOnly && srcId != m_id) {
LogMessage("Invalid CSBK BS_Dwn_Act for %u received from %u", bsId, srcId);
return false;
} else {
LogMessage("CSBK BS_Dwn_Act for %u received from %u", bsId, srcId);
return true;
}
LogMessage("CSBK BS_Dwn_Act for %u received from %u", bsId, srcId);
return true;
}
return false;