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:
parent
c92039d83b
commit
dad47317e6
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue