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) {
m_retryTimer.clock(ms);
if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) {
bool ret = m_socket.open();
bool ret = m_socket.open(m_address.ss_family);
if (ret) {
ret = writeLogin();
if (!ret)

View file

@ -68,7 +68,7 @@ bool CDStarNetwork::open()
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)

View file

@ -336,7 +336,7 @@ int CMMDVMHost::run()
CUDPSocket::lookup(remoteAddress, remotePort, transparentAddress, transparentAddrLen);
transparentSocket = new CUDPSocket(localPort);
ret = transparentSocket->open();
ret = transparentSocket->open(transparentAddress.ss_family);
if (!ret) {
LogWarning("Could not open the Transparent data socket, disabling");
delete transparentSocket;

View file

@ -43,7 +43,7 @@ CMobileGPS::~CMobileGPS()
bool CMobileGPS::open()
{
bool ret = m_socket.open();
bool ret = m_socket.open(m_address.ss_family);
if (!ret)
return false;

View file

@ -110,7 +110,7 @@ bool CP25Network::open()
if (CUDPSocket::isnone(m_address))
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)

View file

@ -61,15 +61,15 @@ CRemoteCommand::~CRemoteCommand()
int CRemoteCommand::send(const std::string& command)
{
CUDPSocket socket(0U);
bool ret = socket.open();
if (!ret)
return 1;
sockaddr_storage address;
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);
if (!ret) {

View file

@ -43,7 +43,7 @@ CRemoteControl::~CRemoteControl()
bool CRemoteControl::open()
{
return m_socket.open();
return m_socket.open(AF_INET); /* XXX IPv4 only */
}
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)) );
}
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()
{
int err;
sockaddr_storage addr;
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. */
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) {
LogError("The local address is invalid - %s", m_address.c_str());
return false;

View file

@ -42,6 +42,7 @@ public:
~CUDPSocket();
bool open();
bool open(const unsigned int af);
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);