Allow more address and port flexibility for split input networks.

This commit is contained in:
Jonathan Naylor 2021-02-02 18:34:26 +00:00
parent 7da7384bb2
commit 74208ed8d5
9 changed files with 126 additions and 35 deletions

View File

@ -50,9 +50,15 @@ m_rfTimeout(10U),
m_netTimeout(10U),
m_rptAddress("127.0.0.1"),
m_rptPort(62032U),
m_rpt1Address("127.0.0.1"),
m_rpt1Port(62032U),
m_rpt2Address("127.0.0.1"),
m_rpt2Port(62033U),
m_localAddress("127.0.0.1"),
m_localPort(62031U),
m_rptProtocol("New"),
m_localPort(62030U),
m_localPort1(62030U),
m_localPort2(62031U),
m_rptProtocol("new"),
m_split(0U),
m_ruleTrace(false),
m_debug(false),
@ -275,13 +281,25 @@ bool CConf::read()
else if (::strcmp(key, "NetTimeout") == 0)
m_netTimeout = (unsigned int)::atoi(value);
else if (::strcmp(key, "RptAddress") == 0)
m_rptAddress = value;
m_rpt1Address = m_rpt2Address = m_rptAddress = value;
else if (::strcmp(key, "RptPort") == 0)
m_rptPort = (unsigned int)::atoi(value);
m_rpt1Port = m_rpt2Port = m_rptPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "Rpt1Address") == 0)
m_rpt1Address = value;
else if (::strcmp(key, "Rpt1Port") == 0)
m_rpt1Port = (unsigned int)::atoi(value);
else if (::strcmp(key, "Rpt2Address") == 0)
m_rpt2Address = value;
else if (::strcmp(key, "Rpt2Port") == 0)
m_rpt2Port = (unsigned int)::atoi(value);
else if (::strcmp(key, "LocalAddress") == 0)
m_localAddress = value;
else if (::strcmp(key, "LocalPort") == 0)
m_localPort = (unsigned int)::atoi(value);
m_localPort1 = m_localPort2 = m_localPort = (unsigned int)::atoi(value);
else if (::strcmp(key, "LocalPort1") == 0)
m_localPort1 = (unsigned int)::atoi(value);
else if (::strcmp(key, "LocalPort2") == 0)
m_localPort2 = (unsigned int)::atoi(value);
else if (::strcmp(key, "RptProtocol") == 0)
m_rptProtocol = value;
else if (::strcmp(key, "Split") == 0)
@ -1016,6 +1034,26 @@ unsigned int CConf::getRptPort() const
return m_rptPort;
}
std::string CConf::getRpt1Address() const
{
return m_rpt1Address;
}
unsigned int CConf::getRpt1Port() const
{
return m_rpt1Port;
}
std::string CConf::getRpt2Address() const
{
return m_rpt2Address;
}
unsigned int CConf::getRpt2Port() const
{
return m_rpt2Port;
}
std::string CConf::getLocalAddress() const
{
return m_localAddress;
@ -1026,6 +1064,16 @@ unsigned int CConf::getLocalPort() const
return m_localPort;
}
unsigned int CConf::getLocalPort1() const
{
return m_localPort1;
}
unsigned int CConf::getLocalPort2() const
{
return m_localPort2;
}
std::string CConf::getRptProtocol() const
{
return m_rptProtocol;

12
Conf.h
View File

@ -83,8 +83,14 @@ public:
unsigned int getNetTimeout() const;
std::string getRptAddress() const;
unsigned int getRptPort() const;
std::string getRpt1Address() const;
unsigned int getRpt1Port() const;
std::string getRpt2Address() const;
unsigned int getRpt2Port() const;
std::string getLocalAddress() const;
unsigned int getLocalPort() const;
unsigned int getLocalPort1() const;
unsigned int getLocalPort2() const;
std::string getRptProtocol() const;
unsigned int getSplit() const;
bool getRuleTrace() const;
@ -250,8 +256,14 @@ private:
unsigned int m_netTimeout;
std::string m_rptAddress;
unsigned int m_rptPort;
std::string m_rpt1Address;
unsigned int m_rpt1Port;
std::string m_rpt2Address;
unsigned int m_rpt2Port;
std::string m_localAddress;
unsigned int m_localPort;
unsigned int m_localPort1;
unsigned int m_localPort2;
std::string m_rptProtocol;
unsigned int m_split;
bool m_ruleTrace;

View File

@ -1306,40 +1306,58 @@ int CDMRGateway::run()
bool CDMRGateway::createMMDVM()
{
std::string rptAddress = m_conf.getRptAddress();
unsigned int rptPort = m_conf.getRptPort();
std::string localAddress = m_conf.getLocalAddress();
unsigned int localPort = m_conf.getLocalPort();
std::string protocol = m_conf.getRptProtocol();
unsigned int split = m_conf.getSplit();
bool debug = m_conf.getDebug();
LogInfo("MMDVM Network Parameters");
LogInfo(" Rpt Address: %s", rptAddress.c_str());
LogInfo(" Rpt Port: %u", rptPort);
LogInfo(" Local Address: %s", localAddress.c_str());
LogInfo(" Local Port: %u", localPort);
LogInfo(" Protocol: %s", protocol.c_str());
LogInfo(" Split: %u", split);
if (split > 0U) {
std::string rpt1Address = m_conf.getRpt1Address();
unsigned int rpt1Port = m_conf.getRpt1Port();
std::string rpt2Address = m_conf.getRpt2Address();
unsigned int rpt2Port = m_conf.getRpt2Port();
std::string localAddress = m_conf.getLocalAddress();
unsigned int localPort1 = m_conf.getLocalPort1();
unsigned int localPort2 = m_conf.getLocalPort2();
LogInfo(" Rpt1 Address: %s", rpt1Address.c_str());
LogInfo(" Rpt1 Port: %u", rpt1Port);
LogInfo(" Rpt2 Address: %s", rpt2Address.c_str());
LogInfo(" Rpt2 Port: %u", rpt2Port);
LogInfo(" Local Address: %s", localAddress.c_str());
LogInfo(" Local Port1: %u", localPort1);
LogInfo(" Local Port2: %u", localPort2);
IMMDVMNetwork* network1 = NULL;
IMMDVMNetwork* network2 = NULL;
if (protocol == "old") {
network1 = new CMMDVMNetworkOld(rptAddress, rptPort + 0U, localAddress, localPort + 0U, debug);
network2 = new CMMDVMNetworkOld(rptAddress, rptPort + 1U, localAddress, localPort + 1U, debug);
network1 = new CMMDVMNetworkOld("MMDVM-1", rpt1Address, rpt1Port, localAddress, localPort1, debug);
network2 = new CMMDVMNetworkOld("MMDVM-2", rpt2Address, rpt2Port, localAddress, localPort2, debug);
} else {
network1 = new CMMDVMNetworkNew(rptAddress, rptPort + 0U, localAddress, localPort + 0U, debug);
network2 = new CMMDVMNetworkNew(rptAddress, rptPort + 1U, localAddress, localPort + 1U, debug);
network1 = new CMMDVMNetworkNew("MMDVM-1", rpt1Address, rpt1Port, localAddress, localPort1, debug);
network2 = new CMMDVMNetworkNew("MMDVM-2", rpt2Address, rpt2Port, localAddress, localPort2, debug);
}
m_repeater = new CSplitNetwork(network1, network2, split, debug);
} else {
std::string rptAddress = m_conf.getRptAddress();
unsigned int rptPort = m_conf.getRptPort();
std::string localAddress = m_conf.getLocalAddress();
unsigned int localPort = m_conf.getLocalPort();
LogInfo(" Rpt Address: %s", rptAddress.c_str());
LogInfo(" Rpt Port: %u", rptPort);
LogInfo(" Local Address: %s", localAddress.c_str());
LogInfo(" Local Port: %u", localPort);
if (protocol == "old")
m_repeater = new CMMDVMNetworkOld(rptAddress, rptPort, localAddress, localPort, debug);
m_repeater = new CMMDVMNetworkOld("MMDVM", rptAddress, rptPort, localAddress, localPort, debug);
else
m_repeater = new CMMDVMNetworkNew(rptAddress, rptPort, localAddress, localPort, debug);
m_repeater = new CMMDVMNetworkNew("MMDVM", rptAddress, rptPort, localAddress, localPort, debug);
}
bool ret = m_repeater->open();

View File

@ -2,10 +2,17 @@
Timeout=10
# RFTimeout=10
# NetTimeout=7
RptProtocol=new
RptAddress=127.0.0.1
RptPort=62032
# Rpt1Address=127.0.0.1
# Rpt1Port=62032
# Rpt2Address=127.0.0.1
# Rpt2Port=62033
LocalAddress=127.0.0.1
LocalPort=62031
LocalPort=62030
# LocalPort1=62030
# LocalPort2=62031
Split=0
RuleTrace=0
Daemon=0

View File

@ -30,7 +30,8 @@ const unsigned int BUFFER_LENGTH = 500U;
const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 55U;
CMMDVMNetworkNew::CMMDVMNetworkNew(const std::string& rptAddress, unsigned int rptPort, const std::string& localAddress, unsigned int localPort, bool debug) :
CMMDVMNetworkNew::CMMDVMNetworkNew(const char* name, const std::string& rptAddress, unsigned int rptPort, const std::string& localAddress, unsigned int localPort, bool debug) :
m_name(name),
m_rptAddr(),
m_rptAddrLen(0U),
m_id(0U),
@ -46,6 +47,7 @@ m_radioPositionLen(0U),
m_talkerAliasData(NULL),
m_talkerAliasLen(0U)
{
assert(name != NULL);
assert(!rptAddress.empty());
assert(rptPort > 0U);
@ -89,11 +91,11 @@ unsigned int CMMDVMNetworkNew::getId() const
bool CMMDVMNetworkNew::open()
{
if (m_rptAddrLen == 0U) {
LogError("Could not lookup the address of the MMDVM Host");
LogError("%s Network, could not lookup the address of the MMDVM Host", m_name);
return false;
}
LogMessage("MMDVM Network, Opening");
LogMessage("%s Network, opening new network", m_name);
return m_socket.open(m_rptAddr);
}
@ -250,7 +252,7 @@ bool CMMDVMNetworkNew::writeBeacon()
void CMMDVMNetworkNew::close()
{
LogMessage("MMDVM Network, Closing");
LogMessage("%s Network, closing new network", m_name);
m_socket.close();
}
@ -264,7 +266,7 @@ void CMMDVMNetworkNew::clock(unsigned int ms)
return;
if (!CUDPSocket::match(m_rptAddr, address)) {
LogMessage("MMDVM packet received from an invalid source");
LogMessage("%s Network, packet received from an invalid source", m_name);
return;
}

View File

@ -30,7 +30,7 @@
class CMMDVMNetworkNew : public IMMDVMNetwork
{
public:
CMMDVMNetworkNew(const std::string& rptAddress, unsigned int rptPort, const std::string& localAddress, unsigned int localPort, bool debug);
CMMDVMNetworkNew(const char* name, const std::string& rptAddress, unsigned int rptPort, const std::string& localAddress, unsigned int localPort, bool debug);
virtual ~CMMDVMNetworkNew();
virtual unsigned int getShortConfig(unsigned char* config) const;
@ -54,6 +54,7 @@ public:
virtual void close();
private:
const char* m_name;
sockaddr_storage m_rptAddr;
unsigned int m_rptAddrLen;
unsigned int m_id;

View File

@ -31,7 +31,8 @@ const unsigned int BUFFER_LENGTH = 500U;
const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 55U;
CMMDVMNetworkOld::CMMDVMNetworkOld(const std::string& rptAddress, unsigned int rptPort, const std::string& localAddress, unsigned int localPort, bool debug) :
CMMDVMNetworkOld::CMMDVMNetworkOld(const char* name, const std::string& rptAddress, unsigned int rptPort, const std::string& localAddress, unsigned int localPort, bool debug) :
m_name(name),
m_rptAddr(),
m_rptAddrLen(0U),
m_id(0U),
@ -47,6 +48,7 @@ m_radioPositionLen(0U),
m_talkerAliasData(NULL),
m_talkerAliasLen(0U)
{
assert(name != NULL);
assert(!rptAddress.empty());
assert(rptPort > 0U);
@ -90,11 +92,11 @@ unsigned int CMMDVMNetworkOld::getId() const
bool CMMDVMNetworkOld::open()
{
if (m_rptAddrLen == 0U) {
LogError("Could not lookup the address of the MMDVM Host");
LogError("%s Network, could not lookup the address of the MMDVM Host", m_name);
return false;
}
LogMessage("MMDVM Network, Opening");
LogMessage("%s Network, opening old network", m_name);
return m_socket.open();
}
@ -258,7 +260,7 @@ void CMMDVMNetworkOld::close()
unsigned char buffer[HOMEBREW_DATA_PACKET_LENGTH];
::memset(buffer, 0x00U, HOMEBREW_DATA_PACKET_LENGTH);
LogMessage("MMDVM Network, Closing");
LogMessage("%s Network, closing old network", m_name);
::memcpy(buffer + 0U, "MSTCL", 5U);
::memcpy(buffer + 5U, m_netId, 4U);
@ -273,14 +275,14 @@ void CMMDVMNetworkOld::clock(unsigned int ms)
unsigned int addrlen;
int length = m_socket.read(m_buffer, BUFFER_LENGTH, address, addrlen);
if (length < 0) {
LogError("MMDVM Network, Socket has failed, reopening");
LogError("%s Network, socket has failed, reopening", m_name);
close();
open();
return;
}
if (!CUDPSocket::match(m_rptAddr, address)) {
LogMessage("MMDVM packet received from an invalid source");
LogMessage("%s Network, packet received from an invalid source", m_name);
return;
}
@ -319,7 +321,7 @@ void CMMDVMNetworkOld::clock(unsigned int ms)
::memcpy(ack + 6U, m_netId, 4U);
m_socket.write(ack, 10U, m_rptAddr, m_rptAddrLen);
} else if (::memcmp(m_buffer, "RPTCL", 5U) == 0) {
::LogMessage("MMDVM Network, The connected MMDVM is closing down");
::LogMessage("%s Network, the connected MMDVM is closing down", m_name);
} else if (::memcmp(m_buffer, "RPTC", 4U) == 0) {
m_configLen = 111U;
m_configData = new unsigned char[m_configLen];

View File

@ -30,7 +30,7 @@
class CMMDVMNetworkOld : public IMMDVMNetwork
{
public:
CMMDVMNetworkOld(const std::string& rptAddress, unsigned int rptPort, const std::string& localAddress, unsigned int localPort, bool debug);
CMMDVMNetworkOld(const char* name, const std::string& rptAddress, unsigned int rptPort, const std::string& localAddress, unsigned int localPort, bool debug);
virtual ~CMMDVMNetworkOld();
virtual unsigned int getShortConfig(unsigned char* config) const;
@ -54,6 +54,7 @@ public:
virtual void close();
private:
const char* m_name;
sockaddr_storage m_rptAddr;
unsigned int m_rptAddrLen;
unsigned int m_id;

View File

@ -19,6 +19,6 @@
#if !defined(VERSION_H)
#define VERSION_H
const char* VERSION = "20210131";
const char* VERSION = "20210202";
#endif