modified for IPv6 supported CUDPSocket

This commit is contained in:
SASANO Takayoshi 2020-03-28 05:40:35 +09:00
parent 5dccd5c5ce
commit c92039d83b
17 changed files with 105 additions and 132 deletions

View file

@ -36,6 +36,7 @@ const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 55U;
CDMRNetwork::CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, const std::string& password, 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, const std::string& password, 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_password(password), m_password(password),
@ -73,7 +74,7 @@ m_beacon(false)
assert(id > 1000U); assert(id > 1000U);
assert(!password.empty()); assert(!password.empty());
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_salt = new unsigned char[sizeof(uint32_t)]; m_salt = new unsigned char[sizeof(uint32_t)];
@ -124,8 +125,8 @@ bool CDMRNetwork::open()
{ {
LogMessage("DMR, Opening DMR Network"); LogMessage("DMR, Opening DMR Network");
if (m_address.s_addr == INADDR_NONE) if (CUDPSocket::isnone(m_address))
m_address = CUDPSocket::lookup(m_addressStr); CUDPSocket::lookup(m_addressStr, m_port, m_address, m_addrlen);
m_status = WAITING_CONNECT; m_status = WAITING_CONNECT;
m_timeoutTimer.stop(); m_timeoutTimer.stop();
@ -377,9 +378,9 @@ void CDMRNetwork::clock(unsigned int ms)
return; return;
} }
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) {
LogError("DMR, Socket has failed, retrying connection to the master"); LogError("DMR, Socket has failed, retrying connection to the master");
close(); close();
@ -390,7 +391,7 @@ void CDMRNetwork::clock(unsigned int ms)
// if (m_debug && length > 0) // if (m_debug && length > 0)
// CUtils::dump(1U, "Network Received", m_buffer, length); // CUtils::dump(1U, "Network Received", m_buffer, length);
if (length > 0 && m_address.s_addr == address.s_addr && m_port == port) { if (length > 0 && CUDPSocket::match(m_address, address)) {
if (::memcmp(m_buffer, "DMRD", 4U) == 0) { if (::memcmp(m_buffer, "DMRD", 4U) == 0) {
if (m_enabled) { if (m_enabled) {
if (m_debug) if (m_debug)
@ -663,7 +664,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 has failed when writing data to the master, retrying connection"); LogError("DMR, Socket has failed when writing data to the master, retrying connection");
m_socket.close(); m_socket.close();

View file

@ -60,7 +60,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;
std::string m_password; std::string m_password;

View file

@ -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),
@ -46,7 +46,7 @@ m_pollTimer(1000U, 60U),
m_linkStatus(LS_NONE), m_linkStatus(LS_NONE),
m_linkReflector(NULL) m_linkReflector(NULL)
{ {
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];
@ -63,7 +63,7 @@ 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();
@ -100,7 +100,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;
} }
@ -143,7 +143,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)
@ -167,7 +167,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)
@ -192,18 +192,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;

View file

@ -51,8 +51,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;

View file

@ -316,8 +316,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;
@ -333,8 +333,7 @@ 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();
@ -793,7 +792,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())
@ -942,9 +941,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);
} }

View file

@ -26,7 +26,7 @@
CMobileGPS::CMobileGPS(const std::string& address, unsigned int port, CDMRNetwork* network) : CMobileGPS::CMobileGPS(const std::string& address, unsigned int port, CDMRNetwork* network) :
m_idTimer(1000U, 60U), m_idTimer(1000U, 60U),
m_address(), m_address(),
m_port(port), m_addrlen(),
m_socket(), m_socket(),
m_network(network) m_network(network)
{ {
@ -34,7 +34,7 @@ m_network(network)
assert(port > 0U); assert(port > 0U);
assert(network != NULL); assert(network != NULL);
m_address = CUDPSocket::lookup(address); CUDPSocket::lookup(address, port, m_address, m_addrlen);
} }
CMobileGPS::~CMobileGPS() CMobileGPS::~CMobileGPS()
@ -71,16 +71,16 @@ void CMobileGPS::close()
bool CMobileGPS::pollGPS() bool CMobileGPS::pollGPS()
{ {
return m_socket.write((unsigned char*)"MMDVMHost", 9U, m_address, m_port); return m_socket.write((unsigned char*)"MMDVMHost", 9U, m_address, m_addrlen);
} }
void CMobileGPS::sendReport() void CMobileGPS::sendReport()
{ {
// Grab GPS data if it's available // Grab GPS data if it's available
unsigned char buffer[200U]; unsigned char buffer[200U];
in_addr address; sockaddr_storage address;
unsigned int port; unsigned int addrlen;
int ret = m_socket.read(buffer, 200U, address, port); int ret = m_socket.read(buffer, 200U, address, addrlen);
if (ret <= 0) if (ret <= 0)
return; return;

View file

@ -51,8 +51,8 @@ public:
private: private:
CTimer m_idTimer; CTimer m_idTimer;
in_addr m_address; sockaddr_storage m_address;
unsigned int m_port; unsigned int m_addrlen;
CUDPSocket m_socket; CUDPSocket m_socket;
CDMRNetwork* m_network; CDMRNetwork* m_network;

View file

@ -31,7 +31,7 @@ const unsigned int BUFFER_LENGTH = 200U;
CNXDNNetwork::CNXDNNetwork(const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) : CNXDNNetwork::CNXDNNetwork(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);
} }
CNXDNNetwork::~CNXDNNetwork() CNXDNNetwork::~CNXDNNetwork()
@ -50,7 +50,7 @@ bool CNXDNNetwork::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 CNXDNNetwork::write(const unsigned char* data, NXDN_NETWORK_MESSAGE_TYPE ty
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 CNXDNNetwork::clock(unsigned int ms) void CNXDNNetwork::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;

View file

@ -57,8 +57,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;

View file

@ -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,7 +107,7 @@ 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();
@ -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;

View file

@ -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;

View file

@ -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;
} }

View file

@ -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;

View file

@ -67,9 +67,11 @@ int CRemoteCommand::send(const std::string& command)
if (!ret) if (!ret)
return 1; return 1;
in_addr address = CUDPSocket::lookup("localhost"); sockaddr_storage address;
unsigned int addrlen;
CUDPSocket::lookup("localhost", m_port, address, addrlen);
ret = socket.write((unsigned char*)command.c_str(), command.length(), address, m_port); ret = socket.write((unsigned char*)command.c_str(), command.length(), address, addrlen);
if (!ret) { if (!ret) {
socket.close(); socket.close();
return 1; return 1;

View file

@ -53,9 +53,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';

View file

@ -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;

View file

@ -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;