mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-23 00:35:53 +08:00
set INADDR_ANY/IN6ADDR_ANY_INIT address string to m_socket
when CUDPSocket::open() is called with m_address (in CUDPSocket) is nothing, IPv4 socket is created by "0.0.0.0" (INADDR_ANY) address. This causes a problem that DMRGateway cannot connect to reflector on IPv6. To choose default INADDR_ANY/IN6ADDR_ANY_INIT address, added open(address_family) in UDPSocket.cpp. Following code sets address string at construction, not modified. NXDNNetwork.cpp POCSAGNetwork.cpp YSFNetwork.cpp Other codes does not set, modified open() -> open(address_family) DMRNetwork.cpp DStarNetwork.cpp MMDVMHost.cpp MobileGPS.cpp P25Network.cpp RemoteCommand.cpp RemoteControl.cpp I think there is more clever method, but I have no other idea. Maybe IPv6 support for digital radio works, but RemoteControl can work IPv4 only.
This commit is contained in:
@@ -362,7 +362,7 @@ void CDMRNetwork::clock(unsigned int ms)
|
|||||||
if (m_status == WAITING_CONNECT) {
|
if (m_status == WAITING_CONNECT) {
|
||||||
m_retryTimer.clock(ms);
|
m_retryTimer.clock(ms);
|
||||||
if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) {
|
if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) {
|
||||||
bool ret = m_socket.open();
|
bool ret = m_socket.open(m_address.ss_family);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ret = writeLogin();
|
ret = writeLogin();
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ bool CDStarNetwork::open()
|
|||||||
|
|
||||||
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)
|
||||||
|
|||||||
@@ -336,7 +336,7 @@ int CMMDVMHost::run()
|
|||||||
CUDPSocket::lookup(remoteAddress, remotePort, transparentAddress, transparentAddrLen);
|
CUDPSocket::lookup(remoteAddress, remotePort, transparentAddress, transparentAddrLen);
|
||||||
|
|
||||||
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;
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ CMobileGPS::~CMobileGPS()
|
|||||||
|
|
||||||
bool CMobileGPS::open()
|
bool CMobileGPS::open()
|
||||||
{
|
{
|
||||||
bool ret = m_socket.open();
|
bool ret = m_socket.open(m_address.ss_family);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ bool CP25Network::open()
|
|||||||
if (CUDPSocket::isnone(m_address))
|
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)
|
||||||
|
|||||||
@@ -61,15 +61,15 @@ CRemoteCommand::~CRemoteCommand()
|
|||||||
|
|
||||||
int CRemoteCommand::send(const std::string& command)
|
int CRemoteCommand::send(const std::string& command)
|
||||||
{
|
{
|
||||||
CUDPSocket socket(0U);
|
|
||||||
|
|
||||||
bool ret = socket.open();
|
|
||||||
if (!ret)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
sockaddr_storage address;
|
sockaddr_storage address;
|
||||||
unsigned int addrlen;
|
unsigned int addrlen;
|
||||||
CUDPSocket::lookup("localhost", m_port, address, addrlen);
|
CUDPSocket::lookup("127.0.0.1", m_port, address, addrlen);
|
||||||
|
|
||||||
|
CUDPSocket socket(0U);
|
||||||
|
|
||||||
|
bool ret = socket.open(address.ss_family);
|
||||||
|
if (!ret)
|
||||||
|
return 1;
|
||||||
|
|
||||||
ret = socket.write((unsigned char*)command.c_str(), command.length(), address, addrlen);
|
ret = socket.write((unsigned char*)command.c_str(), command.length(), address, addrlen);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ CRemoteControl::~CRemoteControl()
|
|||||||
|
|
||||||
bool CRemoteControl::open()
|
bool CRemoteControl::open()
|
||||||
{
|
{
|
||||||
return m_socket.open();
|
return m_socket.open(AF_INET); /* XXX IPv4 only */
|
||||||
}
|
}
|
||||||
|
|
||||||
REMOTE_COMMAND CRemoteControl::getCommand()
|
REMOTE_COMMAND CRemoteControl::getCommand()
|
||||||
|
|||||||
@@ -117,14 +117,37 @@ bool CUDPSocket::isnone(const sockaddr_storage &addr)
|
|||||||
(in->sin_addr.s_addr == htonl(INADDR_NONE)) );
|
(in->sin_addr.s_addr == htonl(INADDR_NONE)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CUDPSocket::open(const unsigned int af)
|
||||||
|
{
|
||||||
|
switch (af) {
|
||||||
|
case AF_INET6:
|
||||||
|
m_address = "::";
|
||||||
|
break;
|
||||||
|
case AF_INET:
|
||||||
|
m_address = "0.0.0.0";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LogWarning("unknown address family - %d", af);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return open();
|
||||||
|
}
|
||||||
|
|
||||||
bool CUDPSocket::open()
|
bool CUDPSocket::open()
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
sockaddr_storage addr;
|
sockaddr_storage addr;
|
||||||
unsigned int addrlen;
|
unsigned int addrlen;
|
||||||
|
|
||||||
|
/* m_address should be defined */
|
||||||
|
if (m_address.empty()) {
|
||||||
|
LogError("The local address is undefined");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* to determine protocol family, call lookup() first. */
|
/* to determine protocol family, call lookup() first. */
|
||||||
err = lookup(m_address.empty() ? "0.0.0.0" : m_address.c_str(), m_port, addr, addrlen);
|
err = lookup(m_address.c_str(), m_port, addr, addrlen);
|
||||||
if (err) {
|
if (err) {
|
||||||
LogError("The local address is invalid - %s", m_address.c_str());
|
LogError("The local address is invalid - %s", m_address.c_str());
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ public:
|
|||||||
~CUDPSocket();
|
~CUDPSocket();
|
||||||
|
|
||||||
bool open();
|
bool open();
|
||||||
|
bool open(const unsigned int af);
|
||||||
|
|
||||||
int read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length);
|
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 sockaddr_storage& address, unsigned int address_length);
|
bool write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length);
|
||||||
|
|||||||
Reference in New Issue
Block a user