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:
SASANO Takayoshi
2020-03-29 15:06:20 +09:00
parent c92039d83b
commit dad47317e6
9 changed files with 38 additions and 14 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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) {

View File

@@ -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()

View File

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

View File

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