local multicast reimplemented

This commit is contained in:
Matej Sekoranja
2016-03-01 12:11:25 +01:00
parent 19031af095
commit 1ca3918afa
8 changed files with 260 additions and 146 deletions

View File

@@ -361,14 +361,60 @@ void ServerContextImpl::initializeBroadcastTransport()
osiSockAddr loAddr;
getLoopbackNIF(loAddr, "", 0);
//
// Setup local multicasting
//
osiSockAddr group;
// TODO configurable local multicast address
aToIPAddr("224.0.0.128", _broadcastPort, &group.ia);
BlockingUDPTransport::shared_pointer localMulticastTransport;
if (true)
{
try
{
// NOTE: multicast receiver socket must be "bound" to INADDR_ANY or multicast address
localMulticastTransport = static_pointer_cast<BlockingUDPTransport>(broadcastConnector->connect(
nullTransportClient, _responseHandler,
group, PVA_PROTOCOL_REVISION,
PVA_DEFAULT_PRIORITY));
localMulticastTransport->join(group, loAddr);
if (localMulticastTransport)
{
localMulticastTransport->start();
_udpTransports.push_back(localMulticastTransport);
}
LOG(logLevelDebug, "Local multicast enabled on %s/%s.",
inetAddressToString(loAddr, false).c_str(),
inetAddressToString(group).c_str());
}
catch (std::exception& ex)
{
LOG(logLevelDebug, "Failed to initialize local multicast, funcionality disabled. Reason: %s.", ex.what());
}
}
else
{
LOG(logLevelDebug, "Failed to detect a loopback network interface, local multicast disabled.");
}
InetAddrVector tappedNIF;
for (IfaceNodeVector::const_iterator iter = _ifaceList.begin(); iter != _ifaceList.end(); iter++)
{
ifaceNode node = *iter;
LOG(logLevelDebug, "Setting up UDP for interface %s, broadcast %s, index %d.",
LOG(logLevelDebug, "Setting up UDP for interface %s, broadcast %s.",
inetAddressToString(node.ifaceAddr, false).c_str(),
inetAddressToString(node.ifaceBCast, false).c_str(),
node.ifaceIndex);
inetAddressToString(node.ifaceBCast, false).c_str());
try
{
// where to bind (listen) address
@@ -387,6 +433,8 @@ void ServerContextImpl::initializeBroadcastTransport()
if (ignoreAddressList.get() && ignoreAddressList->size())
transport->setIgnoredAddresses(ignoreAddressList.get());
tappedNIF.push_back(listenLocalAddress);
BlockingUDPTransport::shared_pointer transport2;
@@ -421,65 +469,22 @@ void ServerContextImpl::initializeBroadcastTransport()
if (ignoreAddressList.get() && ignoreAddressList->size())
transport2->setIgnoredAddresses(ignoreAddressList.get());
tappedNIF.push_back(bcastAddress);
}
#endif
//
// Setup local broadcasting
//
// Each network interface gets its own multicast group on a local interface.
// Multicast address is determined by prefix 224.0.0.128 + NIF index
//
osiSockAddr group;
int lastAddr = 128 + node.ifaceIndex;
std::ostringstream o;
// TODO configurable prefix and base
o << "224.0.0." << lastAddr;
aToIPAddr(o.str().c_str(), _broadcastPort, &group.ia);
transport->setMutlicastNIF(loAddr, true);
transport->setLocalMulticastAddress(group);
BlockingUDPTransport::shared_pointer localMulticastTransport;
if (true)
{
try
{
// NOTE: multicast receiver socket must be "bound" to INADDR_ANY or multicast address
localMulticastTransport = static_pointer_cast<BlockingUDPTransport>(broadcastConnector->connect(
nullTransportClient, _responseHandler,
group, PVA_PROTOCOL_REVISION,
PVA_DEFAULT_PRIORITY));
localMulticastTransport->join(group, loAddr);
LOG(logLevelDebug, "Local multicast for %s enabled on %s/%s.",
inetAddressToString(listenLocalAddress, false).c_str(),
inetAddressToString(loAddr, false).c_str(),
inetAddressToString(group).c_str());
}
catch (std::exception& ex)
{
LOG(logLevelDebug, "Failed to initialize local multicast, funcionality disabled. Reason: %s.", ex.what());
}
}
else
{
LOG(logLevelDebug, "Failed to detect a loopback network interface, local multicast disabled.");
}
transport->start();
if(transport2)
transport2->start();
if (localMulticastTransport)
localMulticastTransport->start();
_udpTransports.push_back(transport);
if(transport2)
_udpTransports.push_back(transport2);
_udpTransports.push_back(localMulticastTransport);
if (transport2)
{
transport2->start();
_udpTransports.push_back(transport2);
}
}
catch (std::exception& e)
{
@@ -490,6 +495,9 @@ void ServerContextImpl::initializeBroadcastTransport()
THROW_BASE_EXCEPTION("Failed to initialize broadcast UDP transport");
}
}
if (localMulticastTransport)
localMulticastTransport->setTappedNIF(&tappedNIF);
}
void ServerContextImpl::run(int32 seconds)