mirror of
https://github.com/g4klx/MMDVMHost
synced 2026-02-05 06:05:42 +08:00
Merge branch 'ipv6' into SimpleDMR
This commit is contained in:
8
Conf.cpp
8
Conf.cpp
@@ -276,6 +276,7 @@ m_lcdprocDimOnIdle(false),
|
|||||||
m_lockFileEnabled(false),
|
m_lockFileEnabled(false),
|
||||||
m_lockFileName(),
|
m_lockFileName(),
|
||||||
m_remoteControlEnabled(false),
|
m_remoteControlEnabled(false),
|
||||||
|
m_remoteControlAddress("127.0.0.1"),
|
||||||
m_remoteControlPort(0U)
|
m_remoteControlPort(0U)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -938,6 +939,8 @@ bool CConf::read()
|
|||||||
} else if (section == SECTION_REMOTE_CONTROL) {
|
} else if (section == SECTION_REMOTE_CONTROL) {
|
||||||
if (::strcmp(key, "Enable") == 0)
|
if (::strcmp(key, "Enable") == 0)
|
||||||
m_remoteControlEnabled = ::atoi(value) == 1;
|
m_remoteControlEnabled = ::atoi(value) == 1;
|
||||||
|
else if (::strcmp(key, "Address") == 0)
|
||||||
|
m_remoteControlAddress = value;
|
||||||
else if (::strcmp(key, "Port") == 0)
|
else if (::strcmp(key, "Port") == 0)
|
||||||
m_remoteControlPort = (unsigned int)::atoi(value);
|
m_remoteControlPort = (unsigned int)::atoi(value);
|
||||||
}
|
}
|
||||||
@@ -2019,6 +2022,11 @@ bool CConf::getRemoteControlEnabled() const
|
|||||||
return m_remoteControlEnabled;
|
return m_remoteControlEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CConf::getRemoteControlAddress() const
|
||||||
|
{
|
||||||
|
return m_remoteControlAddress;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int CConf::getRemoteControlPort() const
|
unsigned int CConf::getRemoteControlPort() const
|
||||||
{
|
{
|
||||||
return m_remoteControlPort;
|
return m_remoteControlPort;
|
||||||
|
|||||||
2
Conf.h
2
Conf.h
@@ -301,6 +301,7 @@ public:
|
|||||||
|
|
||||||
// The Remote Control section
|
// The Remote Control section
|
||||||
bool getRemoteControlEnabled() const;
|
bool getRemoteControlEnabled() const;
|
||||||
|
std::string getRemoteControlAddress() const;
|
||||||
unsigned int getRemoteControlPort() const;
|
unsigned int getRemoteControlPort() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -547,6 +548,7 @@ private:
|
|||||||
std::string m_lockFileName;
|
std::string m_lockFileName;
|
||||||
|
|
||||||
bool m_remoteControlEnabled;
|
bool m_remoteControlEnabled;
|
||||||
|
std::string m_remoteControlAddress;
|
||||||
unsigned int m_remoteControlPort;
|
unsigned int m_remoteControlPort;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 55U;
|
|||||||
CDMRNetwork::CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, bool duplex, const char* version, bool debug, bool slot1, bool slot2, HW_TYPE hwType) :
|
CDMRNetwork::CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, bool duplex, const char* version, bool debug, bool slot1, bool slot2, HW_TYPE hwType) :
|
||||||
m_addressStr(address),
|
m_addressStr(address),
|
||||||
m_address(),
|
m_address(),
|
||||||
|
m_addrlen(),
|
||||||
m_port(port),
|
m_port(port),
|
||||||
m_id(NULL),
|
m_id(NULL),
|
||||||
m_duplex(duplex),
|
m_duplex(duplex),
|
||||||
@@ -61,7 +62,7 @@ m_pingTimer(1000U, 10U)
|
|||||||
assert(port > 0U);
|
assert(port > 0U);
|
||||||
assert(id > 1000U);
|
assert(id > 1000U);
|
||||||
|
|
||||||
m_address = CUDPSocket::lookup(address);
|
CUDPSocket::lookup(m_addressStr, m_port, m_address, m_addrlen);
|
||||||
|
|
||||||
m_buffer = new unsigned char[BUFFER_LENGTH];
|
m_buffer = new unsigned char[BUFFER_LENGTH];
|
||||||
m_id = new uint8_t[4U];
|
m_id = new uint8_t[4U];
|
||||||
@@ -101,8 +102,10 @@ bool CDMRNetwork::open()
|
|||||||
{
|
{
|
||||||
LogMessage("DMR, Opening DMR Network");
|
LogMessage("DMR, Opening DMR Network");
|
||||||
|
|
||||||
bool ret = m_socket.open();
|
if (CUDPSocket::isnone(m_address))
|
||||||
|
CUDPSocket::lookup(m_addressStr, m_port, m_address, m_addrlen);
|
||||||
|
|
||||||
|
bool ret = m_socket.open();
|
||||||
if (ret)
|
if (ret)
|
||||||
m_pingTimer.start();
|
m_pingTimer.start();
|
||||||
|
|
||||||
@@ -293,14 +296,14 @@ void CDMRNetwork::clock(unsigned int ms)
|
|||||||
m_pingTimer.start();
|
m_pingTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
in_addr address;
|
sockaddr_storage address;
|
||||||
unsigned int port;
|
unsigned int addrlen;
|
||||||
int length = m_socket.read(m_buffer, BUFFER_LENGTH, address, port);
|
int length = m_socket.read(m_buffer, BUFFER_LENGTH, address, addrlen);
|
||||||
if (length <= 0)
|
if (length <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_address.s_addr != address.s_addr || m_port != port) {
|
if (!CUDPSocket::match(m_address, address)) {
|
||||||
LogMessage("DMR, packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port);
|
LogMessage("DMR, packet received from an invalid source");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,7 +427,7 @@ bool CDMRNetwork::write(const unsigned char* data, unsigned int length)
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "Network Transmitted", data, length);
|
CUtils::dump(1U, "Network Transmitted", data, length);
|
||||||
|
|
||||||
bool ret = m_socket.write(data, length, m_address, m_port);
|
bool ret = m_socket.write(data, length, m_address, m_addrlen);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
LogError("DMR, socket error when writing to the DMR Gateway");
|
LogError("DMR, socket error when writing to the DMR Gateway");
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::string m_addressStr;
|
std::string m_addressStr;
|
||||||
in_addr m_address;
|
sockaddr_storage m_address;
|
||||||
|
unsigned int m_addrlen;
|
||||||
unsigned int m_port;
|
unsigned int m_port;
|
||||||
uint8_t* m_id;
|
uint8_t* m_id;
|
||||||
bool m_duplex;
|
bool m_duplex;
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ const unsigned int BUFFER_LENGTH = 100U;
|
|||||||
CDStarNetwork::CDStarNetwork(const std::string& gatewayAddress, unsigned int gatewayPort, unsigned int localPort, bool duplex, const char* version, bool debug) :
|
CDStarNetwork::CDStarNetwork(const std::string& gatewayAddress, unsigned int gatewayPort, unsigned int localPort, bool duplex, const char* version, bool debug) :
|
||||||
m_socket(localPort),
|
m_socket(localPort),
|
||||||
m_address(),
|
m_address(),
|
||||||
m_port(gatewayPort),
|
m_addrlen(),
|
||||||
m_duplex(duplex),
|
m_duplex(duplex),
|
||||||
m_version(version),
|
m_version(version),
|
||||||
m_debug(debug),
|
m_debug(debug),
|
||||||
@@ -47,7 +47,7 @@ m_linkStatus(LS_NONE),
|
|||||||
m_linkReflector(NULL),
|
m_linkReflector(NULL),
|
||||||
m_random()
|
m_random()
|
||||||
{
|
{
|
||||||
m_address = CUDPSocket::lookup(gatewayAddress);
|
CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen);
|
||||||
|
|
||||||
m_linkReflector = new unsigned char[DSTAR_LONG_CALLSIGN_LENGTH];
|
m_linkReflector = new unsigned char[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||||
|
|
||||||
@@ -65,12 +65,12 @@ bool CDStarNetwork::open()
|
|||||||
{
|
{
|
||||||
LogMessage("Opening D-Star network connection");
|
LogMessage("Opening D-Star network connection");
|
||||||
|
|
||||||
if (m_address.s_addr == INADDR_NONE)
|
if (CUDPSocket::isnone(m_address))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_pollTimer.start();
|
m_pollTimer.start();
|
||||||
|
|
||||||
return m_socket.open();
|
return m_socket.open(m_address.ss_family);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CDStarNetwork::writeHeader(const unsigned char* header, unsigned int length, bool busy)
|
bool CDStarNetwork::writeHeader(const unsigned char* header, unsigned int length, bool busy)
|
||||||
@@ -103,7 +103,7 @@ bool CDStarNetwork::writeHeader(const unsigned char* header, unsigned int length
|
|||||||
CUtils::dump(1U, "D-Star Network Header Sent", buffer, 49U);
|
CUtils::dump(1U, "D-Star Network Header Sent", buffer, 49U);
|
||||||
|
|
||||||
for (unsigned int i = 0U; i < 2U; i++) {
|
for (unsigned int i = 0U; i < 2U; i++) {
|
||||||
bool ret = m_socket.write(buffer, 49U, m_address, m_port);
|
bool ret = m_socket.write(buffer, 49U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -146,7 +146,7 @@ bool CDStarNetwork::writeData(const unsigned char* data, unsigned int length, un
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "D-Star Network Data Sent", buffer, length + 9U);
|
CUtils::dump(1U, "D-Star Network Data Sent", buffer, length + 9U);
|
||||||
|
|
||||||
return m_socket.write(buffer, length + 9U, m_address, m_port);
|
return m_socket.write(buffer, length + 9U, m_address, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CDStarNetwork::writePoll(const char* text)
|
bool CDStarNetwork::writePoll(const char* text)
|
||||||
@@ -170,7 +170,7 @@ bool CDStarNetwork::writePoll(const char* text)
|
|||||||
// if (m_debug)
|
// if (m_debug)
|
||||||
// CUtils::dump(1U, "D-Star Network Poll Sent", buffer, 6U + length);
|
// CUtils::dump(1U, "D-Star Network Poll Sent", buffer, 6U + length);
|
||||||
|
|
||||||
return m_socket.write(buffer, 6U + length, m_address, m_port);
|
return m_socket.write(buffer, 6U + length, m_address, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDStarNetwork::clock(unsigned int ms)
|
void CDStarNetwork::clock(unsigned int ms)
|
||||||
@@ -195,18 +195,12 @@ void CDStarNetwork::clock(unsigned int ms)
|
|||||||
|
|
||||||
unsigned char buffer[BUFFER_LENGTH];
|
unsigned char buffer[BUFFER_LENGTH];
|
||||||
|
|
||||||
in_addr address;
|
sockaddr_storage address;
|
||||||
unsigned int port;
|
unsigned int addrlen;
|
||||||
int length = m_socket.read(buffer, BUFFER_LENGTH, address, port);
|
int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen);
|
||||||
if (length <= 0)
|
if (length <= 0 || !CUDPSocket::match(m_address, address))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check if the data is for us
|
|
||||||
if (m_address.s_addr != address.s_addr || m_port != port) {
|
|
||||||
LogMessage("D-Star packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Invalid packet type?
|
// Invalid packet type?
|
||||||
if (::memcmp(buffer, "DSRP", 4U) != 0)
|
if (::memcmp(buffer, "DSRP", 4U) != 0)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
CUDPSocket m_socket;
|
CUDPSocket m_socket;
|
||||||
in_addr m_address;
|
sockaddr_storage m_address;
|
||||||
unsigned int m_port;
|
unsigned int m_addrlen;
|
||||||
bool m_duplex;
|
bool m_duplex;
|
||||||
const char* m_version;
|
const char* m_version;
|
||||||
bool m_debug;
|
bool m_debug;
|
||||||
|
|||||||
57
LCDproc.cpp
57
LCDproc.cpp
@@ -121,44 +121,53 @@ CLCDproc::~CLCDproc()
|
|||||||
|
|
||||||
bool CLCDproc::open()
|
bool CLCDproc::open()
|
||||||
{
|
{
|
||||||
const char *server;
|
int err;
|
||||||
unsigned int port, localPort;
|
unsigned int addrlen;
|
||||||
struct sockaddr_in serverAddress, clientAddress;
|
std::string port, localPort;
|
||||||
struct hostent *h;
|
struct sockaddr_storage serverAddress, clientAddress;
|
||||||
|
struct addrinfo hints, *res;
|
||||||
|
|
||||||
server = m_address.c_str();
|
port = std::to_string(m_port);
|
||||||
port = m_port;
|
localPort = std::to_string(m_localPort);
|
||||||
localPort = m_localPort;
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
|
||||||
|
/* Lookup the hostname address */
|
||||||
|
hints.ai_flags = AI_NUMERICSERV;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
err = getaddrinfo(m_address.c_str(), port.c_str(), &hints, &res);
|
||||||
|
if (err) {
|
||||||
|
LogError("LCDproc, cannot lookup server");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
memcpy(&serverAddress, res->ai_addr, addrlen = res->ai_addrlen);
|
||||||
|
freeaddrinfo(res);
|
||||||
|
|
||||||
|
/* Lookup the client address (random port - need to specify manual port from ini file) */
|
||||||
|
hints.ai_flags = AI_NUMERICSERV | AI_PASSIVE;
|
||||||
|
hints.ai_family = serverAddress.ss_family;
|
||||||
|
err = getaddrinfo(NULL, localPort.c_str(), &hints, &res);
|
||||||
|
if (err) {
|
||||||
|
LogError("LCDproc, cannot lookup client");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
memcpy(&clientAddress, res->ai_addr, res->ai_addrlen);
|
||||||
|
freeaddrinfo(res);
|
||||||
|
|
||||||
/* Create TCP socket */
|
/* Create TCP socket */
|
||||||
m_socketfd = socket(AF_INET, SOCK_STREAM, 0);
|
m_socketfd = socket(clientAddress.ss_family, SOCK_STREAM, 0);
|
||||||
if (m_socketfd == -1) {
|
if (m_socketfd == -1) {
|
||||||
LogError("LCDproc, failed to create socket");
|
LogError("LCDproc, failed to create socket");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets client address (random port - need to specify manual port from ini file?) */
|
|
||||||
clientAddress.sin_family = AF_INET;
|
|
||||||
clientAddress.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
||||||
//clientAddress.sin_port = htons(0);
|
|
||||||
clientAddress.sin_port = htons(localPort);
|
|
||||||
|
|
||||||
/* Bind the address to the socket */
|
/* Bind the address to the socket */
|
||||||
if (bind(m_socketfd, (struct sockaddr *)&clientAddress, sizeof(clientAddress)) == -1) {
|
if (bind(m_socketfd, (struct sockaddr *)&clientAddress, addrlen) == -1) {
|
||||||
LogError("LCDproc, error whilst binding address");
|
LogError("LCDproc, error whilst binding address");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lookup the hostname address */
|
/* Connect to server */
|
||||||
h = gethostbyname(server);
|
if (connect(m_socketfd, (struct sockaddr *)&serverAddress, addrlen) == -1) {
|
||||||
|
|
||||||
/* Sets server address */
|
|
||||||
serverAddress.sin_family = h->h_addrtype;
|
|
||||||
memcpy((char*)&serverAddress.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
|
|
||||||
serverAddress.sin_port = htons(port);
|
|
||||||
|
|
||||||
if (connect(m_socketfd, (struct sockaddr * )&serverAddress, sizeof(serverAddress))==-1) {
|
|
||||||
LogError("LCDproc, cannot connect to server");
|
LogError("LCDproc, cannot connect to server");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -282,4 +282,5 @@ File=/tmp/MMDVM_Active.lck
|
|||||||
|
|
||||||
[Remote Control]
|
[Remote Control]
|
||||||
Enable=0
|
Enable=0
|
||||||
|
Address=127.0.0.1
|
||||||
Port=7642
|
Port=7642
|
||||||
|
|||||||
@@ -321,8 +321,8 @@ int CMMDVMHost::run()
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
in_addr transparentAddress;
|
sockaddr_storage transparentAddress;
|
||||||
unsigned int transparentPort = 0U;
|
unsigned int transparentAddrLen;
|
||||||
CUDPSocket* transparentSocket = NULL;
|
CUDPSocket* transparentSocket = NULL;
|
||||||
|
|
||||||
unsigned int sendFrameType = 0U;
|
unsigned int sendFrameType = 0U;
|
||||||
@@ -338,11 +338,10 @@ int CMMDVMHost::run()
|
|||||||
LogInfo(" Local Port: %u", localPort);
|
LogInfo(" Local Port: %u", localPort);
|
||||||
LogInfo(" Send Frame Type: %u", sendFrameType);
|
LogInfo(" Send Frame Type: %u", sendFrameType);
|
||||||
|
|
||||||
transparentAddress = CUDPSocket::lookup(remoteAddress);
|
CUDPSocket::lookup(remoteAddress, remotePort, transparentAddress, transparentAddrLen);
|
||||||
transparentPort = remotePort;
|
|
||||||
|
|
||||||
transparentSocket = new CUDPSocket(localPort);
|
transparentSocket = new CUDPSocket(localPort);
|
||||||
ret = transparentSocket->open();
|
ret = transparentSocket->open(transparentAddress.ss_family);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
LogWarning("Could not open the Transparent data socket, disabling");
|
LogWarning("Could not open the Transparent data socket, disabling");
|
||||||
delete transparentSocket;
|
delete transparentSocket;
|
||||||
@@ -611,12 +610,14 @@ int CMMDVMHost::run()
|
|||||||
|
|
||||||
bool remoteControlEnabled = m_conf.getRemoteControlEnabled();
|
bool remoteControlEnabled = m_conf.getRemoteControlEnabled();
|
||||||
if (remoteControlEnabled) {
|
if (remoteControlEnabled) {
|
||||||
|
std::string address = m_conf.getRemoteControlAddress();
|
||||||
unsigned int port = m_conf.getRemoteControlPort();
|
unsigned int port = m_conf.getRemoteControlPort();
|
||||||
|
|
||||||
LogInfo("Remote Control Parameters");
|
LogInfo("Remote Control Parameters");
|
||||||
|
LogInfo(" Address: %s", address.c_str());
|
||||||
LogInfo(" Port: %u", port);
|
LogInfo(" Port: %u", port);
|
||||||
|
|
||||||
m_remoteControl = new CRemoteControl(port);
|
m_remoteControl = new CRemoteControl(address, port);
|
||||||
|
|
||||||
ret = m_remoteControl->open();
|
ret = m_remoteControl->open();
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
@@ -803,7 +804,7 @@ int CMMDVMHost::run()
|
|||||||
|
|
||||||
len = m_modem->readTransparentData(data);
|
len = m_modem->readTransparentData(data);
|
||||||
if (transparentSocket != NULL && len > 0U)
|
if (transparentSocket != NULL && len > 0U)
|
||||||
transparentSocket->write(data, len, transparentAddress, transparentPort);
|
transparentSocket->write(data, len, transparentAddress, transparentAddrLen);
|
||||||
|
|
||||||
if (!m_fixedMode) {
|
if (!m_fixedMode) {
|
||||||
if (m_modeTimer.isRunning() && m_modeTimer.hasExpired())
|
if (m_modeTimer.isRunning() && m_modeTimer.hasExpired())
|
||||||
@@ -952,9 +953,9 @@ int CMMDVMHost::run()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (transparentSocket != NULL) {
|
if (transparentSocket != NULL) {
|
||||||
in_addr address;
|
sockaddr_storage address;
|
||||||
unsigned int port = 0U;
|
unsigned int addrlen;
|
||||||
len = transparentSocket->read(data, 200U, address, port);
|
len = transparentSocket->read(data, 200U, address, addrlen);
|
||||||
if (len > 0U)
|
if (len > 0U)
|
||||||
m_modem->writeTransparentData(data, len);
|
m_modem->writeTransparentData(data, len);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ const unsigned int BUFFER_LENGTH = 200U;
|
|||||||
CNXDNIcomNetwork::CNXDNIcomNetwork(const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) :
|
CNXDNIcomNetwork::CNXDNIcomNetwork(const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) :
|
||||||
m_socket(localAddress, localPort),
|
m_socket(localAddress, localPort),
|
||||||
m_address(),
|
m_address(),
|
||||||
m_port(gatewayPort),
|
m_addrlen(),
|
||||||
m_debug(debug),
|
m_debug(debug),
|
||||||
m_enabled(false),
|
m_enabled(false),
|
||||||
m_buffer(1000U, "NXDN Network")
|
m_buffer(1000U, "NXDN Network")
|
||||||
@@ -39,7 +39,7 @@ m_buffer(1000U, "NXDN Network")
|
|||||||
assert(gatewayPort > 0U);
|
assert(gatewayPort > 0U);
|
||||||
assert(!gatewayAddress.empty());
|
assert(!gatewayAddress.empty());
|
||||||
|
|
||||||
m_address = CUDPSocket::lookup(gatewayAddress);
|
CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
CNXDNIcomNetwork::~CNXDNIcomNetwork()
|
CNXDNIcomNetwork::~CNXDNIcomNetwork()
|
||||||
@@ -50,7 +50,7 @@ bool CNXDNIcomNetwork::open()
|
|||||||
{
|
{
|
||||||
LogMessage("Opening NXDN network connection");
|
LogMessage("Opening NXDN network connection");
|
||||||
|
|
||||||
if (m_address.s_addr == INADDR_NONE)
|
if (CUDPSocket::isnone(m_address))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return m_socket.open();
|
return m_socket.open();
|
||||||
@@ -100,25 +100,19 @@ bool CNXDNIcomNetwork::write(const unsigned char* data, NXDN_NETWORK_MESSAGE_TYP
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "NXDN Network Data Sent", buffer, 102U);
|
CUtils::dump(1U, "NXDN Network Data Sent", buffer, 102U);
|
||||||
|
|
||||||
return m_socket.write(buffer, 102U, m_address, m_port);
|
return m_socket.write(buffer, 102U, m_address, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CNXDNIcomNetwork::clock(unsigned int ms)
|
void CNXDNIcomNetwork::clock(unsigned int ms)
|
||||||
{
|
{
|
||||||
unsigned char buffer[BUFFER_LENGTH];
|
unsigned char buffer[BUFFER_LENGTH];
|
||||||
|
|
||||||
in_addr address;
|
sockaddr_storage address;
|
||||||
unsigned int port;
|
unsigned int addrlen;
|
||||||
int length = m_socket.read(buffer, BUFFER_LENGTH, address, port);
|
int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen);
|
||||||
if (length <= 0)
|
if (length <= 0 || !CUDPSocket::match(m_address, address))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check if the data is for us
|
|
||||||
if (m_address.s_addr != address.s_addr || port != m_port) {
|
|
||||||
LogMessage("NXDN packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Invalid packet type?
|
// Invalid packet type?
|
||||||
if (::memcmp(buffer, "ICOM", 4U) != 0)
|
if (::memcmp(buffer, "ICOM", 4U) != 0)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
CUDPSocket m_socket;
|
CUDPSocket m_socket;
|
||||||
in_addr m_address;
|
sockaddr_storage m_address;
|
||||||
unsigned int m_port;
|
unsigned int m_addrlen;
|
||||||
bool m_debug;
|
bool m_debug;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
CRingBuffer<unsigned char> m_buffer;
|
CRingBuffer<unsigned char> m_buffer;
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ const unsigned int BUFFER_LENGTH = 200U;
|
|||||||
CNXDNKenwoodNetwork::CNXDNKenwoodNetwork(const std::string& localAddress, unsigned int localPort, const std::string& gwyAddress, unsigned int gwyPort, bool debug) :
|
CNXDNKenwoodNetwork::CNXDNKenwoodNetwork(const std::string& localAddress, unsigned int localPort, const std::string& gwyAddress, unsigned int gwyPort, bool debug) :
|
||||||
m_rtpSocket(localAddress, localPort + 0U),
|
m_rtpSocket(localAddress, localPort + 0U),
|
||||||
m_rtcpSocket(localAddress, localPort + 1U),
|
m_rtcpSocket(localAddress, localPort + 1U),
|
||||||
m_address(),
|
m_rtcpaddress(),
|
||||||
m_rtcpPort(gwyPort + 1U),
|
m_rtpaddress(),
|
||||||
m_rtpPort(gwyPort + 0U),
|
m_addrlen(),
|
||||||
m_enabled(false),
|
m_enabled(false),
|
||||||
m_headerSeen(false),
|
m_headerSeen(false),
|
||||||
m_seen1(false),
|
m_seen1(false),
|
||||||
@@ -65,7 +65,8 @@ m_random()
|
|||||||
|
|
||||||
m_sacch = new unsigned char[10U];
|
m_sacch = new unsigned char[10U];
|
||||||
|
|
||||||
m_address = CUDPSocket::lookup(gwyAddress);
|
CUDPSocket::lookup(gwyAddress, gwyPort + 1, m_rtcpaddress, m_addrlen);
|
||||||
|
CUDPSocket::lookup(gwyAddress, gwyPort, m_rtpaddress, m_addrlen);
|
||||||
|
|
||||||
std::random_device rd;
|
std::random_device rd;
|
||||||
std::mt19937 mt(rd());
|
std::mt19937 mt(rd());
|
||||||
@@ -81,7 +82,8 @@ bool CNXDNKenwoodNetwork::open()
|
|||||||
{
|
{
|
||||||
LogMessage("Opening Kenwood connection");
|
LogMessage("Opening Kenwood connection");
|
||||||
|
|
||||||
if (m_address.s_addr == INADDR_NONE)
|
if (CUDPSocket::isnone(m_rtpaddress) ||
|
||||||
|
CUDPSocket::isnone(m_rtcpaddress))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!m_rtcpSocket.open())
|
if (!m_rtcpSocket.open())
|
||||||
@@ -363,7 +365,7 @@ bool CNXDNKenwoodNetwork::writeRTPVoiceHeader(const unsigned char* data)
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 47U);
|
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 47U);
|
||||||
|
|
||||||
return m_rtpSocket.write(buffer, 47U, m_address, m_rtpPort);
|
return m_rtpSocket.write(buffer, 47U, m_rtpaddress, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CNXDNKenwoodNetwork::writeRTPVoiceTrailer(const unsigned char* data)
|
bool CNXDNKenwoodNetwork::writeRTPVoiceTrailer(const unsigned char* data)
|
||||||
@@ -409,7 +411,7 @@ bool CNXDNKenwoodNetwork::writeRTPVoiceTrailer(const unsigned char* data)
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 47U);
|
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 47U);
|
||||||
|
|
||||||
return m_rtpSocket.write(buffer, 47U, m_address, m_rtpPort);
|
return m_rtpSocket.write(buffer, 47U, m_rtpaddress, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CNXDNKenwoodNetwork::writeRTPVoiceData(const unsigned char* data)
|
bool CNXDNKenwoodNetwork::writeRTPVoiceData(const unsigned char* data)
|
||||||
@@ -455,7 +457,7 @@ bool CNXDNKenwoodNetwork::writeRTPVoiceData(const unsigned char* data)
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 59U);
|
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 59U);
|
||||||
|
|
||||||
return m_rtpSocket.write(buffer, 59U, m_address, m_rtpPort);
|
return m_rtpSocket.write(buffer, 59U, m_rtpaddress, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CNXDNKenwoodNetwork::writeRTPDataHeader(const unsigned char* data)
|
bool CNXDNKenwoodNetwork::writeRTPDataHeader(const unsigned char* data)
|
||||||
@@ -497,7 +499,7 @@ bool CNXDNKenwoodNetwork::writeRTPDataHeader(const unsigned char* data)
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 42U);
|
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 42U);
|
||||||
|
|
||||||
return m_rtpSocket.write(buffer, 42U, m_address, m_rtpPort);
|
return m_rtpSocket.write(buffer, 42U, m_rtpaddress, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CNXDNKenwoodNetwork::writeRTPDataTrailer(const unsigned char* data)
|
bool CNXDNKenwoodNetwork::writeRTPDataTrailer(const unsigned char* data)
|
||||||
@@ -539,7 +541,7 @@ bool CNXDNKenwoodNetwork::writeRTPDataTrailer(const unsigned char* data)
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 42U);
|
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 42U);
|
||||||
|
|
||||||
return m_rtpSocket.write(buffer, 42U, m_address, m_rtpPort);
|
return m_rtpSocket.write(buffer, 42U, m_rtpaddress, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CNXDNKenwoodNetwork::writeRTPDataData(const unsigned char* data)
|
bool CNXDNKenwoodNetwork::writeRTPDataData(const unsigned char* data)
|
||||||
@@ -581,7 +583,7 @@ bool CNXDNKenwoodNetwork::writeRTPDataData(const unsigned char* data)
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 42U);
|
CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 42U);
|
||||||
|
|
||||||
return m_rtpSocket.write(buffer, 42U, m_address, m_rtpPort);
|
return m_rtpSocket.write(buffer, 42U, m_rtpaddress, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CNXDNKenwoodNetwork::writeRTCPStart()
|
bool CNXDNKenwoodNetwork::writeRTCPStart()
|
||||||
@@ -641,7 +643,7 @@ bool CNXDNKenwoodNetwork::writeRTCPStart()
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "Kenwood Network RTCP Data Sent", buffer, 28U);
|
CUtils::dump(1U, "Kenwood Network RTCP Data Sent", buffer, 28U);
|
||||||
|
|
||||||
return m_rtcpSocket.write(buffer, 28U, m_address, m_rtcpPort);
|
return m_rtcpSocket.write(buffer, 28U, m_rtcpaddress, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CNXDNKenwoodNetwork::writeRTCPPing()
|
bool CNXDNKenwoodNetwork::writeRTCPPing()
|
||||||
@@ -683,7 +685,7 @@ bool CNXDNKenwoodNetwork::writeRTCPPing()
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "Kenwood Network RTCP Data Sent", buffer, 28U);
|
CUtils::dump(1U, "Kenwood Network RTCP Data Sent", buffer, 28U);
|
||||||
|
|
||||||
return m_rtcpSocket.write(buffer, 28U, m_address, m_rtcpPort);
|
return m_rtcpSocket.write(buffer, 28U, m_rtcpaddress, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CNXDNKenwoodNetwork::writeRTCPHang(unsigned char type, unsigned short src, unsigned short dst)
|
bool CNXDNKenwoodNetwork::writeRTCPHang(unsigned char type, unsigned short src, unsigned short dst)
|
||||||
@@ -726,7 +728,7 @@ bool CNXDNKenwoodNetwork::writeRTCPHang()
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "Kenwood Network RTCP Data Sent", buffer, 20U);
|
CUtils::dump(1U, "Kenwood Network RTCP Data Sent", buffer, 20U);
|
||||||
|
|
||||||
return m_rtcpSocket.write(buffer, 20U, m_address, m_rtcpPort);
|
return m_rtcpSocket.write(buffer, 20U, m_rtcpaddress, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CNXDNKenwoodNetwork::read(unsigned char* data)
|
bool CNXDNKenwoodNetwork::read(unsigned char* data)
|
||||||
@@ -761,18 +763,12 @@ unsigned int CNXDNKenwoodNetwork::readRTP(unsigned char* data)
|
|||||||
|
|
||||||
unsigned char buffer[BUFFER_LENGTH];
|
unsigned char buffer[BUFFER_LENGTH];
|
||||||
|
|
||||||
in_addr address;
|
sockaddr_storage address;
|
||||||
unsigned int port;
|
unsigned int addrlen;
|
||||||
int length = m_rtpSocket.read(buffer, BUFFER_LENGTH, address, port);
|
int length = m_rtpSocket.read(buffer, BUFFER_LENGTH, address, addrlen);
|
||||||
if (length <= 0)
|
if (length <= 0 || !CUDPSocket::match_addr(m_rtpaddress, address))
|
||||||
return 0U;
|
return 0U;
|
||||||
|
|
||||||
// Check if the data is for us
|
|
||||||
if (m_address.s_addr != address.s_addr) {
|
|
||||||
LogMessage("Kenwood RTP packet received from an invalid source, %08X != %08X", m_address.s_addr, address.s_addr);
|
|
||||||
return 0U;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_enabled)
|
if (!m_enabled)
|
||||||
return 0U;
|
return 0U;
|
||||||
|
|
||||||
@@ -790,18 +786,12 @@ unsigned int CNXDNKenwoodNetwork::readRTCP(unsigned char* data)
|
|||||||
|
|
||||||
unsigned char buffer[BUFFER_LENGTH];
|
unsigned char buffer[BUFFER_LENGTH];
|
||||||
|
|
||||||
in_addr address;
|
sockaddr_storage address;
|
||||||
unsigned int port;
|
unsigned int addrlen;
|
||||||
int length = m_rtcpSocket.read(buffer, BUFFER_LENGTH, address, port);
|
int length = m_rtcpSocket.read(buffer, BUFFER_LENGTH, address, addrlen);
|
||||||
if (length <= 0)
|
if (length <= 0 || !CUDPSocket::match_addr(m_rtcpaddress, address))
|
||||||
return 0U;
|
return 0U;
|
||||||
|
|
||||||
// Check if the data is for us
|
|
||||||
if (m_address.s_addr != address.s_addr) {
|
|
||||||
LogMessage("Kenwood RTCP packet received from an invalid source, %08X != %08X", m_address.s_addr, address.s_addr);
|
|
||||||
return 0U;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_enabled)
|
if (!m_enabled)
|
||||||
return 0U;
|
return 0U;
|
||||||
|
|
||||||
|
|||||||
@@ -49,9 +49,9 @@ public:
|
|||||||
private:
|
private:
|
||||||
CUDPSocket m_rtpSocket;
|
CUDPSocket m_rtpSocket;
|
||||||
CUDPSocket m_rtcpSocket;
|
CUDPSocket m_rtcpSocket;
|
||||||
in_addr m_address;
|
sockaddr_storage m_rtcpaddress;
|
||||||
unsigned int m_rtcpPort;
|
sockaddr_storage m_rtpaddress;
|
||||||
unsigned int m_rtpPort;
|
unsigned int m_addrlen;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
bool m_headerSeen;
|
bool m_headerSeen;
|
||||||
bool m_seen1;
|
bool m_seen1;
|
||||||
|
|||||||
@@ -90,13 +90,13 @@ const unsigned int BUFFER_LENGTH = 100U;
|
|||||||
CP25Network::CP25Network(const std::string& gatewayAddress, unsigned int gatewayPort, unsigned int localPort, bool debug) :
|
CP25Network::CP25Network(const std::string& gatewayAddress, unsigned int gatewayPort, unsigned int localPort, bool debug) :
|
||||||
m_socket(localPort),
|
m_socket(localPort),
|
||||||
m_address(),
|
m_address(),
|
||||||
m_port(gatewayPort),
|
m_addrlen(),
|
||||||
m_debug(debug),
|
m_debug(debug),
|
||||||
m_enabled(false),
|
m_enabled(false),
|
||||||
m_buffer(1000U, "P25 Network"),
|
m_buffer(1000U, "P25 Network"),
|
||||||
m_audio()
|
m_audio()
|
||||||
{
|
{
|
||||||
m_address = CUDPSocket::lookup(gatewayAddress);
|
CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
CP25Network::~CP25Network()
|
CP25Network::~CP25Network()
|
||||||
@@ -107,10 +107,10 @@ bool CP25Network::open()
|
|||||||
{
|
{
|
||||||
LogMessage("Opening P25 network connection");
|
LogMessage("Opening P25 network connection");
|
||||||
|
|
||||||
if (m_address.s_addr == INADDR_NONE)
|
if (CUDPSocket::isnone(m_address))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return m_socket.open();
|
return m_socket.open(m_address.ss_family);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, const CP25LowSpeedData& lsd, bool end)
|
bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, const CP25LowSpeedData& lsd, bool end)
|
||||||
@@ -126,7 +126,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 22U);
|
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 22U);
|
||||||
|
|
||||||
bool ret = m_socket.write(buffer, 22U, m_address, m_port);
|
bool ret = m_socket.write(buffer, 22U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -137,7 +137,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 14U);
|
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 14U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 14U, m_address, m_port);
|
ret = m_socket.write(buffer, 14U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -191,7 +191,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -202,7 +202,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -213,7 +213,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -226,7 +226,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 16U);
|
CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 16U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 16U, m_address, m_port);
|
ret = m_socket.write(buffer, 16U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -234,7 +234,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network END Sent", REC80, 17U);
|
CUtils::dump(1U, "P25 Network END Sent", REC80, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(REC80, 17U, m_address, m_port);
|
ret = m_socket.write(REC80, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -255,7 +255,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 22U);
|
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 22U);
|
||||||
|
|
||||||
bool ret = m_socket.write(buffer, 22U, m_address, m_port);
|
bool ret = m_socket.write(buffer, 22U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -266,7 +266,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 14U);
|
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 14U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 14U, m_address, m_port);
|
ret = m_socket.write(buffer, 14U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -283,7 +283,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -297,7 +297,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -311,7 +311,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -326,7 +326,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -337,7 +337,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -348,7 +348,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 17U, m_address, m_port);
|
ret = m_socket.write(buffer, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -361,7 +361,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 16U);
|
CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 16U);
|
||||||
|
|
||||||
ret = m_socket.write(buffer, 16U, m_address, m_port);
|
ret = m_socket.write(buffer, 16U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -369,7 +369,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control,
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "P25 Network END Sent", REC80, 17U);
|
CUtils::dump(1U, "P25 Network END Sent", REC80, 17U);
|
||||||
|
|
||||||
ret = m_socket.write(REC80, 17U, m_address, m_port);
|
ret = m_socket.write(REC80, 17U, m_address, m_addrlen);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -381,18 +381,12 @@ void CP25Network::clock(unsigned int ms)
|
|||||||
{
|
{
|
||||||
unsigned char buffer[BUFFER_LENGTH];
|
unsigned char buffer[BUFFER_LENGTH];
|
||||||
|
|
||||||
in_addr address;
|
sockaddr_storage address;
|
||||||
unsigned int port;
|
unsigned int addrlen;
|
||||||
int length = m_socket.read(buffer, BUFFER_LENGTH, address, port);
|
int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen);
|
||||||
if (length <= 0)
|
if (length <= 0 || !CUDPSocket::match(m_address, address))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check if the data is for us
|
|
||||||
if (m_address.s_addr != address.s_addr || m_port != port) {
|
|
||||||
LogMessage("P25 packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_enabled)
|
if (!m_enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
CUDPSocket m_socket;
|
CUDPSocket m_socket;
|
||||||
in_addr m_address;
|
sockaddr_storage m_address;
|
||||||
unsigned int m_port;
|
unsigned int m_addrlen;
|
||||||
bool m_debug;
|
bool m_debug;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
CRingBuffer<unsigned char> m_buffer;
|
CRingBuffer<unsigned char> m_buffer;
|
||||||
|
|||||||
@@ -31,12 +31,12 @@ const unsigned int BUFFER_LENGTH = 200U;
|
|||||||
CPOCSAGNetwork::CPOCSAGNetwork(const std::string& myAddress, unsigned int myPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) :
|
CPOCSAGNetwork::CPOCSAGNetwork(const std::string& myAddress, unsigned int myPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) :
|
||||||
m_socket(myAddress, myPort),
|
m_socket(myAddress, myPort),
|
||||||
m_address(),
|
m_address(),
|
||||||
m_port(gatewayPort),
|
m_addrlen(),
|
||||||
m_debug(debug),
|
m_debug(debug),
|
||||||
m_enabled(false),
|
m_enabled(false),
|
||||||
m_buffer(1000U, "POCSAG Network")
|
m_buffer(1000U, "POCSAG Network")
|
||||||
{
|
{
|
||||||
m_address = CUDPSocket::lookup(gatewayAddress);
|
CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
CPOCSAGNetwork::~CPOCSAGNetwork()
|
CPOCSAGNetwork::~CPOCSAGNetwork()
|
||||||
@@ -47,7 +47,7 @@ bool CPOCSAGNetwork::open()
|
|||||||
{
|
{
|
||||||
LogMessage("Opening POCSAG network connection");
|
LogMessage("Opening POCSAG network connection");
|
||||||
|
|
||||||
if (m_address.s_addr == INADDR_NONE)
|
if (CUDPSocket::isnone(m_address))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return m_socket.open();
|
return m_socket.open();
|
||||||
@@ -57,18 +57,12 @@ void CPOCSAGNetwork::clock(unsigned int ms)
|
|||||||
{
|
{
|
||||||
unsigned char buffer[BUFFER_LENGTH];
|
unsigned char buffer[BUFFER_LENGTH];
|
||||||
|
|
||||||
in_addr address;
|
sockaddr_storage address;
|
||||||
unsigned int port;
|
unsigned int addrlen;
|
||||||
int length = m_socket.read(buffer, BUFFER_LENGTH, address, port);
|
int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen);
|
||||||
if (length <= 0)
|
if (length <= 0 || !CUDPSocket::match(m_address, address))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check if the data is for us
|
|
||||||
if (m_address.s_addr != address.s_addr || m_port != port) {
|
|
||||||
LogMessage("POCSAG packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Invalid packet type?
|
// Invalid packet type?
|
||||||
if (::memcmp(buffer, "POCSAG", 6U) != 0)
|
if (::memcmp(buffer, "POCSAG", 6U) != 0)
|
||||||
return;
|
return;
|
||||||
@@ -118,7 +112,7 @@ void CPOCSAGNetwork::enable(bool enabled)
|
|||||||
|
|
||||||
unsigned char c = enabled ? 0x00U : 0xFFU;
|
unsigned char c = enabled ? 0x00U : 0xFFU;
|
||||||
|
|
||||||
m_socket.write(&c, 1U, m_address, m_port);
|
m_socket.write(&c, 1U, m_address, m_addrlen);
|
||||||
|
|
||||||
m_enabled = enabled;
|
m_enabled = enabled;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
CUDPSocket m_socket;
|
CUDPSocket m_socket;
|
||||||
in_addr m_address;
|
sockaddr_storage m_address;
|
||||||
unsigned int m_port;
|
unsigned int m_addrlen;
|
||||||
bool m_debug;
|
bool m_debug;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
CRingBuffer<unsigned char> m_buffer;
|
CRingBuffer<unsigned char> m_buffer;
|
||||||
|
|||||||
@@ -61,15 +61,17 @@ CRemoteCommand::~CRemoteCommand()
|
|||||||
|
|
||||||
int CRemoteCommand::send(const std::string& command)
|
int CRemoteCommand::send(const std::string& command)
|
||||||
{
|
{
|
||||||
|
sockaddr_storage address;
|
||||||
|
unsigned int addrlen;
|
||||||
|
CUDPSocket::lookup("127.0.0.1", m_port, address, addrlen);
|
||||||
|
|
||||||
CUDPSocket socket(0U);
|
CUDPSocket socket(0U);
|
||||||
|
|
||||||
bool ret = socket.open();
|
bool ret = socket.open(address.ss_family);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
in_addr address = CUDPSocket::lookup("localhost");
|
ret = socket.write((unsigned char*)command.c_str(), command.length(), address, addrlen);
|
||||||
|
|
||||||
ret = socket.write((unsigned char*)command.c_str(), command.length(), address, m_port);
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
socket.close();
|
socket.close();
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ const unsigned int CW_ARGS = 2U;
|
|||||||
|
|
||||||
const unsigned int BUFFER_LENGTH = 100U;
|
const unsigned int BUFFER_LENGTH = 100U;
|
||||||
|
|
||||||
CRemoteControl::CRemoteControl(unsigned int port) :
|
CRemoteControl::CRemoteControl(const std::string address, unsigned int port) :
|
||||||
m_socket(port),
|
m_socket(address, port),
|
||||||
m_command(RCD_NONE),
|
m_command(RCD_NONE),
|
||||||
m_args()
|
m_args()
|
||||||
{
|
{
|
||||||
@@ -56,9 +56,9 @@ REMOTE_COMMAND CRemoteControl::getCommand()
|
|||||||
|
|
||||||
char command[BUFFER_LENGTH];
|
char command[BUFFER_LENGTH];
|
||||||
char buffer[BUFFER_LENGTH];
|
char buffer[BUFFER_LENGTH];
|
||||||
in_addr address;
|
sockaddr_storage address;
|
||||||
unsigned int port;
|
unsigned int addrlen;
|
||||||
int ret = m_socket.read((unsigned char*)buffer, BUFFER_LENGTH, address, port);
|
int ret = m_socket.read((unsigned char*)buffer, BUFFER_LENGTH, address, addrlen);
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
buffer[ret] = '\0';
|
buffer[ret] = '\0';
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ enum REMOTE_COMMAND {
|
|||||||
|
|
||||||
class CRemoteControl {
|
class CRemoteControl {
|
||||||
public:
|
public:
|
||||||
CRemoteControl(unsigned int port);
|
CRemoteControl(const std::string address, unsigned int port);
|
||||||
~CRemoteControl();
|
~CRemoteControl();
|
||||||
|
|
||||||
bool open();
|
bool open();
|
||||||
|
|||||||
176
UDPSocket.cpp
176
UDPSocket.cpp
@@ -60,49 +60,117 @@ CUDPSocket::~CUDPSocket()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
in_addr CUDPSocket::lookup(const std::string& hostname)
|
int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_storage &addr, unsigned int &address_length)
|
||||||
{
|
{
|
||||||
in_addr addr;
|
struct addrinfo hints;
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
unsigned long address = ::inet_addr(hostname.c_str());
|
|
||||||
if (address != INADDR_NONE && address != INADDR_ANY) {
|
|
||||||
addr.s_addr = address;
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct hostent* hp = ::gethostbyname(hostname.c_str());
|
::memset(&hints, 0, sizeof(hints));
|
||||||
if (hp != NULL) {
|
|
||||||
::memcpy(&addr, hp->h_addr_list[0], sizeof(struct in_addr));
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
return lookup(hostname, port, addr, address_length, hints);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_storage &addr, unsigned int &address_length, struct addrinfo &hints)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
std::string portstr = std::to_string(port);
|
||||||
|
struct addrinfo *res;
|
||||||
|
|
||||||
|
/* port is always digits, no needs to lookup service */
|
||||||
|
hints.ai_flags |= AI_NUMERICSERV;
|
||||||
|
|
||||||
|
err = getaddrinfo(hostname.empty() ? NULL : hostname.c_str(), portstr.c_str(), &hints, &res);
|
||||||
|
if (err) {
|
||||||
|
sockaddr_in *paddr = (sockaddr_in *)&addr;
|
||||||
|
::memset(paddr, 0, address_length = sizeof(sockaddr_in));
|
||||||
|
paddr->sin_family = AF_INET;
|
||||||
|
paddr->sin_port = htons(port);
|
||||||
|
paddr->sin_addr.s_addr = htonl(INADDR_NONE);
|
||||||
LogError("Cannot find address for host %s", hostname.c_str());
|
LogError("Cannot find address for host %s", hostname.c_str());
|
||||||
|
return err;
|
||||||
addr.s_addr = INADDR_NONE;
|
|
||||||
return addr;
|
|
||||||
#else
|
|
||||||
in_addr_t address = ::inet_addr(hostname.c_str());
|
|
||||||
if (address != in_addr_t(-1)) {
|
|
||||||
addr.s_addr = address;
|
|
||||||
return addr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct hostent* hp = ::gethostbyname(hostname.c_str());
|
::memcpy(&addr, res->ai_addr, address_length = res->ai_addrlen);
|
||||||
if (hp != NULL) {
|
|
||||||
::memcpy(&addr, hp->h_addr_list[0], sizeof(struct in_addr));
|
freeaddrinfo(res);
|
||||||
return addr;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CUDPSocket::match(const sockaddr_storage &addr1, const sockaddr_storage &addr2)
|
||||||
|
{
|
||||||
|
if (addr1.ss_family != addr2.ss_family)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
switch (addr1.ss_family) {
|
||||||
|
case AF_INET:
|
||||||
|
struct sockaddr_in *in_1, *in_2;
|
||||||
|
in_1 = (struct sockaddr_in *)&addr1;
|
||||||
|
in_2 = (struct sockaddr_in *)&addr2;
|
||||||
|
return ( (in_1->sin_addr.s_addr == in_2->sin_addr.s_addr) &&
|
||||||
|
(in_1->sin_port == in_2->sin_port) );
|
||||||
|
case AF_INET6:
|
||||||
|
struct sockaddr_in6 *in6_1, *in6_2;
|
||||||
|
in6_1 = (struct sockaddr_in6 *)&addr1;
|
||||||
|
in6_2 = (struct sockaddr_in6 *)&addr2;
|
||||||
|
return ( IN6_ARE_ADDR_EQUAL(&in6_1->sin6_addr, &in6_2->sin6_addr) &&
|
||||||
|
(in6_1->sin6_port == in6_2->sin6_port) );
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LogError("Cannot find address for host %s", hostname.c_str());
|
bool CUDPSocket::match_addr(const sockaddr_storage &addr1, const sockaddr_storage &addr2)
|
||||||
|
{
|
||||||
|
if (addr1.ss_family != addr2.ss_family)
|
||||||
|
return false;
|
||||||
|
|
||||||
addr.s_addr = INADDR_NONE;
|
switch (addr1.ss_family) {
|
||||||
return addr;
|
case AF_INET:
|
||||||
#endif
|
struct sockaddr_in *in_1, *in_2;
|
||||||
|
in_1 = (struct sockaddr_in *)&addr1;
|
||||||
|
in_2 = (struct sockaddr_in *)&addr2;
|
||||||
|
return (in_1->sin_addr.s_addr == in_2->sin_addr.s_addr);
|
||||||
|
case AF_INET6:
|
||||||
|
struct sockaddr_in6 *in6_1, *in6_2;
|
||||||
|
in6_1 = (struct sockaddr_in6 *)&addr1;
|
||||||
|
in6_2 = (struct sockaddr_in6 *)&addr2;
|
||||||
|
return IN6_ARE_ADDR_EQUAL(&in6_1->sin6_addr, &in6_2->sin6_addr);
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CUDPSocket::isnone(const sockaddr_storage &addr)
|
||||||
|
{
|
||||||
|
struct sockaddr_in *in = (struct sockaddr_in *)&addr;
|
||||||
|
|
||||||
|
return ( (addr.ss_family == AF_INET) &&
|
||||||
|
(in->sin_addr.s_addr == htonl(INADDR_NONE)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CUDPSocket::open()
|
bool CUDPSocket::open()
|
||||||
{
|
{
|
||||||
m_fd = ::socket(PF_INET, SOCK_DGRAM, 0);
|
return open(AF_UNSPEC);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CUDPSocket::open(const unsigned int af)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
sockaddr_storage addr;
|
||||||
|
unsigned int addrlen;
|
||||||
|
struct addrinfo hints;
|
||||||
|
|
||||||
|
::memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_flags = AI_PASSIVE;
|
||||||
|
hints.ai_family = af;
|
||||||
|
|
||||||
|
/* to determine protocol family, call lookup() first. */
|
||||||
|
err = lookup(m_address, m_port, addr, addrlen, hints);
|
||||||
|
if (err) {
|
||||||
|
LogError("The local address is invalid - %s", m_address.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_fd = ::socket(addr.ss_family, SOCK_DGRAM, 0);
|
||||||
if (m_fd < 0) {
|
if (m_fd < 0) {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
LogError("Cannot create the UDP socket, err: %lu", ::GetLastError());
|
LogError("Cannot create the UDP socket, err: %lu", ::GetLastError());
|
||||||
@@ -113,24 +181,6 @@ bool CUDPSocket::open()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_port > 0U) {
|
if (m_port > 0U) {
|
||||||
sockaddr_in addr;
|
|
||||||
::memset(&addr, 0x00, sizeof(sockaddr_in));
|
|
||||||
addr.sin_family = AF_INET;
|
|
||||||
addr.sin_port = htons(m_port);
|
|
||||||
addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
||||||
|
|
||||||
if (!m_address.empty()) {
|
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
|
||||||
addr.sin_addr.s_addr = ::inet_addr(m_address.c_str());
|
|
||||||
#else
|
|
||||||
addr.sin_addr.s_addr = ::inet_addr(m_address.c_str());
|
|
||||||
#endif
|
|
||||||
if (addr.sin_addr.s_addr == INADDR_NONE) {
|
|
||||||
LogError("The local address is invalid - %s", m_address.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int reuse = 1;
|
int reuse = 1;
|
||||||
if (::setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) == -1) {
|
if (::setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) == -1) {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
@@ -141,7 +191,7 @@ bool CUDPSocket::open()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (::bind(m_fd, (sockaddr*)&addr, sizeof(sockaddr_in)) == -1) {
|
if (::bind(m_fd, (sockaddr*)&addr, addrlen) == -1) {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
LogError("Cannot bind the UDP address, err: %lu", ::GetLastError());
|
LogError("Cannot bind the UDP address, err: %lu", ::GetLastError());
|
||||||
#else
|
#else
|
||||||
@@ -154,7 +204,7 @@ bool CUDPSocket::open()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CUDPSocket::read(unsigned char* buffer, unsigned int length, in_addr& address, unsigned int& port)
|
int CUDPSocket::read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length)
|
||||||
{
|
{
|
||||||
assert(buffer != NULL);
|
assert(buffer != NULL);
|
||||||
assert(length > 0U);
|
assert(length > 0U);
|
||||||
@@ -186,17 +236,16 @@ int CUDPSocket::read(unsigned char* buffer, unsigned int length, in_addr& addres
|
|||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
sockaddr_in addr;
|
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
int size = sizeof(sockaddr_in);
|
int size = sizeof(sockaddr_storage);
|
||||||
#else
|
#else
|
||||||
socklen_t size = sizeof(sockaddr_in);
|
socklen_t size = sizeof(sockaddr_storage);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
int len = ::recvfrom(m_fd, (char*)buffer, length, 0, (sockaddr *)&addr, &size);
|
int len = ::recvfrom(m_fd, (char*)buffer, length, 0, (sockaddr *)&address, &size);
|
||||||
#else
|
#else
|
||||||
ssize_t len = ::recvfrom(m_fd, (char*)buffer, length, 0, (sockaddr *)&addr, &size);
|
ssize_t len = ::recvfrom(m_fd, (char*)buffer, length, 0, (sockaddr *)&address, &size);
|
||||||
#endif
|
#endif
|
||||||
if (len <= 0) {
|
if (len <= 0) {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
@@ -207,28 +256,19 @@ int CUDPSocket::read(unsigned char* buffer, unsigned int length, in_addr& addres
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
address = addr.sin_addr;
|
address_length = size;
|
||||||
port = ntohs(addr.sin_port);
|
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CUDPSocket::write(const unsigned char* buffer, unsigned int length, const in_addr& address, unsigned int port)
|
bool CUDPSocket::write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length)
|
||||||
{
|
{
|
||||||
assert(buffer != NULL);
|
assert(buffer != NULL);
|
||||||
assert(length > 0U);
|
assert(length > 0U);
|
||||||
|
|
||||||
sockaddr_in addr;
|
|
||||||
::memset(&addr, 0x00, sizeof(sockaddr_in));
|
|
||||||
|
|
||||||
addr.sin_family = AF_INET;
|
|
||||||
addr.sin_addr = address;
|
|
||||||
addr.sin_port = htons(port);
|
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
int ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&addr, sizeof(sockaddr_in));
|
int ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&address, address_length);
|
||||||
#else
|
#else
|
||||||
ssize_t ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&addr, sizeof(sockaddr_in));
|
ssize_t ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&address, address_length);
|
||||||
#endif
|
#endif
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
|||||||
14
UDPSocket.h
14
UDPSocket.h
@@ -31,7 +31,8 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#else
|
#else
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class CUDPSocket {
|
class CUDPSocket {
|
||||||
@@ -41,13 +42,18 @@ public:
|
|||||||
~CUDPSocket();
|
~CUDPSocket();
|
||||||
|
|
||||||
bool open();
|
bool open();
|
||||||
|
bool open(const unsigned int af);
|
||||||
|
|
||||||
int read(unsigned char* buffer, unsigned int length, in_addr& address, unsigned int& port);
|
int read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length);
|
||||||
bool write(const unsigned char* buffer, unsigned int length, const in_addr& address, unsigned int port);
|
bool write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length);
|
||||||
|
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
static in_addr lookup(const std::string& hostName);
|
static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage &address, unsigned int &address_length);
|
||||||
|
static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage &address, unsigned int &address_length, struct addrinfo &hints);
|
||||||
|
static bool match(const sockaddr_storage &addr1, const sockaddr_storage &addr2);
|
||||||
|
static bool match_addr(const sockaddr_storage &addr1, const sockaddr_storage &addr2);
|
||||||
|
static bool isnone(const sockaddr_storage &addr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string m_address;
|
std::string m_address;
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ const unsigned int BUFFER_LENGTH = 200U;
|
|||||||
CYSFNetwork::CYSFNetwork(const std::string& myAddress, unsigned int myPort, const std::string& gatewayAddress, unsigned int gatewayPort, const std::string& callsign, bool debug) :
|
CYSFNetwork::CYSFNetwork(const std::string& myAddress, unsigned int myPort, const std::string& gatewayAddress, unsigned int gatewayPort, const std::string& callsign, bool debug) :
|
||||||
m_socket(myAddress, myPort),
|
m_socket(myAddress, myPort),
|
||||||
m_address(),
|
m_address(),
|
||||||
m_port(gatewayPort),
|
m_addrlen(),
|
||||||
m_callsign(),
|
m_callsign(),
|
||||||
m_debug(debug),
|
m_debug(debug),
|
||||||
m_enabled(false),
|
m_enabled(false),
|
||||||
@@ -42,7 +42,7 @@ m_tag(NULL)
|
|||||||
m_callsign = callsign;
|
m_callsign = callsign;
|
||||||
m_callsign.resize(YSF_CALLSIGN_LENGTH, ' ');
|
m_callsign.resize(YSF_CALLSIGN_LENGTH, ' ');
|
||||||
|
|
||||||
m_address = CUDPSocket::lookup(gatewayAddress);
|
CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen);
|
||||||
|
|
||||||
m_tag = new unsigned char[YSF_CALLSIGN_LENGTH];
|
m_tag = new unsigned char[YSF_CALLSIGN_LENGTH];
|
||||||
::memset(m_tag, ' ', YSF_CALLSIGN_LENGTH);
|
::memset(m_tag, ' ', YSF_CALLSIGN_LENGTH);
|
||||||
@@ -57,7 +57,7 @@ bool CYSFNetwork::open()
|
|||||||
{
|
{
|
||||||
LogMessage("Opening YSF network connection");
|
LogMessage("Opening YSF network connection");
|
||||||
|
|
||||||
if (m_address.s_addr == INADDR_NONE)
|
if (CUDPSocket::isnone(m_address))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_pollTimer.start();
|
m_pollTimer.start();
|
||||||
@@ -97,7 +97,7 @@ bool CYSFNetwork::write(const unsigned char* src, const unsigned char* dest, con
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "YSF Network Data Sent", buffer, 155U);
|
CUtils::dump(1U, "YSF Network Data Sent", buffer, 155U);
|
||||||
|
|
||||||
return m_socket.write(buffer, 155U, m_address, m_port);
|
return m_socket.write(buffer, 155U, m_address, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CYSFNetwork::writePoll()
|
bool CYSFNetwork::writePoll()
|
||||||
@@ -115,7 +115,7 @@ bool CYSFNetwork::writePoll()
|
|||||||
if (m_debug)
|
if (m_debug)
|
||||||
CUtils::dump(1U, "YSF Network Poll Sent", buffer, 14U);
|
CUtils::dump(1U, "YSF Network Poll Sent", buffer, 14U);
|
||||||
|
|
||||||
return m_socket.write(buffer, 14U, m_address, m_port);
|
return m_socket.write(buffer, 14U, m_address, m_addrlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CYSFNetwork::clock(unsigned int ms)
|
void CYSFNetwork::clock(unsigned int ms)
|
||||||
@@ -128,18 +128,12 @@ void CYSFNetwork::clock(unsigned int ms)
|
|||||||
|
|
||||||
unsigned char buffer[BUFFER_LENGTH];
|
unsigned char buffer[BUFFER_LENGTH];
|
||||||
|
|
||||||
in_addr address;
|
sockaddr_storage address;
|
||||||
unsigned int port;
|
unsigned int addrlen;
|
||||||
int length = m_socket.read(buffer, BUFFER_LENGTH, address, port);
|
int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen);
|
||||||
if (length <= 0)
|
if (length <= 0 || !CUDPSocket::match(m_address, address))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check if the data is for us
|
|
||||||
if (m_address.s_addr != address.s_addr || m_port != port) {
|
|
||||||
LogMessage("YSF packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore incoming polls
|
// Ignore incoming polls
|
||||||
if (::memcmp(buffer, "YSFP", 4U) == 0)
|
if (::memcmp(buffer, "YSFP", 4U) == 0)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
CUDPSocket m_socket;
|
CUDPSocket m_socket;
|
||||||
in_addr m_address;
|
sockaddr_storage m_address;
|
||||||
unsigned int m_port;
|
unsigned int m_addrlen;
|
||||||
std::string m_callsign;
|
std::string m_callsign;
|
||||||
bool m_debug;
|
bool m_debug;
|
||||||
bool m_enabled;
|
bool m_enabled;
|
||||||
|
|||||||
Reference in New Issue
Block a user