Make the software safe from multiplexed TGs.

This commit is contained in:
Jonathan Naylor 2018-03-26 20:21:32 +01:00
parent b4fe9b02ab
commit 7a36995e81
5 changed files with 56 additions and 29 deletions

View File

@ -247,8 +247,16 @@ void CNXDNGateway::run()
// If we're linked and it's from the right place, send it on
if (currentId != 9999U && currentAddr.s_addr == address.s_addr && currentPort == port) {
// Don't pass reflector control data through to the MMDVM
if (::memcmp(buffer, "NXDND", 5U) == 0)
localNetwork.write(buffer + 10U, len - 10U, rptAddr, rptPort);
if (::memcmp(buffer, "NXDND", 5U) == 0) {
unsigned short dstId = 0U;
dstId |= (buffer[7U] << 8) & 0xFF00U;
dstId |= (buffer[8U] << 0) & 0x00FFU;
bool grp = (buffer[9U] & 0x01U) == 0x01U;
if (grp && currentId == dstId)
localNetwork.write(buffer + 10U, len - 10U, rptAddr, rptPort);
}
// Any network activity is proof that the reflector is alive
lostTimer.start();

View File

@ -37,6 +37,7 @@ enum SECTION {
CConf::CConf(const std::string& file) :
m_file(file),
m_tg(9999U),
m_daemon(false),
m_lookupName(),
m_lookupTime(0U),
@ -98,6 +99,8 @@ bool CConf::read()
if (section == SECTION_GENERAL) {
if (::strcmp(key, "Daemon") == 0)
m_daemon = ::atoi(value) == 1;
else if (::strcmp(key, "TG") == 0)
m_tg = (unsigned short)::atoi(value);
} else if (section == SECTION_ID_LOOKUP) {
if (::strcmp(key, "Name") == 0)
m_lookupName = value;
@ -141,6 +144,11 @@ bool CConf::getDaemon() const
return m_daemon;
}
unsigned short CConf::getTG() const
{
return m_tg;
}
std::string CConf::getLookupName() const
{
return m_lookupName;

View File

@ -31,21 +31,22 @@ public:
bool read();
// The General section
bool getDaemon() const;
unsigned short getTG() const;
bool getDaemon() const;
// The Id Lookup section
std::string getLookupName() const;
unsigned int getLookupTime() const;
std::string getLookupName() const;
unsigned int getLookupTime() const;
// The Log section
unsigned int getLogDisplayLevel() const;
unsigned int getLogFileLevel() const;
std::string getLogFilePath() const;
std::string getLogFileRoot() const;
unsigned int getLogDisplayLevel() const;
unsigned int getLogFileLevel() const;
std::string getLogFilePath() const;
std::string getLogFileRoot() const;
// The Network section
unsigned int getNetworkPort() const;
bool getNetworkDebug() const;
unsigned int getNetworkPort() const;
bool getNetworkDebug() const;
// The NXCore section
bool getNXCoreEnabled() const;
@ -55,19 +56,20 @@ public:
bool getNXCoreDebug() const;
private:
std::string m_file;
bool m_daemon;
std::string m_file;
unsigned short m_tg;
bool m_daemon;
std::string m_lookupName;
unsigned int m_lookupTime;
std::string m_lookupName;
unsigned int m_lookupTime;
unsigned int m_logDisplayLevel;
unsigned int m_logFileLevel;
std::string m_logFilePath;
std::string m_logFileRoot;
unsigned int m_logDisplayLevel;
unsigned int m_logFileLevel;
std::string m_logFilePath;
std::string m_logFileRoot;
unsigned int m_networkPort;
bool m_networkDebug;
unsigned int m_networkPort;
bool m_networkDebug;
bool m_nxCoreEnabled;
std::string m_nxCoreAddress;

View File

@ -161,6 +161,8 @@ void CNXDNReflector::run()
}
#endif
unsigned short tg = m_conf.getTG();
CNXDNNetwork nxdnNetwork(m_conf.getNetworkPort(), m_conf.getNetworkDebug());
ret = nxdnNetwork.open();
if (!ret) {
@ -262,7 +264,7 @@ void CNXDNReflector::run()
LogMessage("NXCore link disabled by %s at %s", callsign.c_str(), current->m_callsign.c_str());
closeNXCore();
}
} else {
} else if (grp && dstId == tg) {
rpt->m_timer.start();
if (current == NULL && !nxCoreActive) {
@ -305,15 +307,21 @@ void CNXDNReflector::run()
if (current == NULL) {
if (!nxCoreActive) {
if ((buffer[0U] == 0x81U || buffer[0U] == 0x83U) && buffer[5U] == 0x01U) {
// Save the grp, src and dest for use in the NXDN Protocol messages
grp = (buffer[7U] & 0x20U) == 0x20U;
srcId = (buffer[8U] << 8) | buffer[9U];
dstId = (buffer[10U] << 8) | buffer[11U];
bool tempGrp = (buffer[7U] & 0x20U) == 0x20U;
unsigned short tempSrcId = (buffer[8U] << 8) | buffer[9U];
unsigned short tempDstId = (buffer[10U] << 8) | buffer[11U];
std::string callsign = lookup->find(srcId);
LogMessage("Transmission from %s at NXCore to %s%u", callsign.c_str(), grp ? "TG " : "", dstId);
if (tempGrp && tempDstId == tg) {
// Save the grp, src and dest for use in the NXDN Protocol messages
grp = tempGrp;
srcId = tempSrcId;
dstId = tempDstId;
nxCoreActive = true;
std::string callsign = lookup->find(srcId);
LogMessage("Transmission from %s at NXCore to %s%u", callsign.c_str(), grp ? "TG " : "", dstId);
nxCoreActive = true;
}
}
}

View File

@ -1,4 +1,5 @@
[General]
TG=9999
Daemon=1
[Id Lookup]