From 0d4ef4aaca44c61e2b6b76ad00c809b90fbc139b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 Oct 2014 17:18:05 -0700 Subject: [PATCH] ping connecting ICE peers from domain-server --- domain-server/src/DomainServer.cpp | 46 ++++++++++++++++++++++++++- domain-server/src/DomainServer.h | 6 ++++ libraries/networking/src/NodeList.cpp | 6 ++++ 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 1bbe61dfcb..c0daa94c77 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -354,7 +354,7 @@ void DomainServer::setupAutomaticNetworking() { // setup a timer to heartbeat with the ice-server every so often QTimer* iceHeartbeatTimer = new QTimer(this); - connect(iceHeartbeatTimer, &QTimer::timeout, this, &DomainServer::sendHearbeatToIceServer); + connect(iceHeartbeatTimer, &QTimer::timeout, this, &DomainServer::performICEUpdates); iceHeartbeatTimer->start(ICE_HEARBEAT_INTERVAL_MSECS); // call our sendHeartbeaToIceServer immediately anytime a public address changes @@ -985,10 +985,51 @@ void DomainServer::updateNetworkingInfoWithDataServer(const QString& newSetting, const HifiSockAddr ICE_SERVER_SOCK_ADDR = HifiSockAddr(QHostAddress::LocalHost, ICE_SERVER_DEFAULT_PORT); +void DomainServer::performICEUpdates() { + sendHearbeatToIceServer(); + sendICEPingPackets(); +} + void DomainServer::sendHearbeatToIceServer() { LimitedNodeList::getInstance()->sendHeartbeatToIceServer(ICE_SERVER_SOCK_ADDR); } +void DomainServer::sendICEPingPackets() { + LimitedNodeList* nodeList = LimitedNodeList::getInstance(); + + foreach(const NetworkPeer& peer, _connectingICEPeers) { + // send ping packets to this peer's interfaces + qDebug() << "Sending ping packets to establish connectivity with ICE peer with ID" + << peer.getUUID(); + + // send the ping packet to the local and public sockets for this node + QByteArray localPingPacket = nodeList->constructPingPacket(PingType::Local, false); + nodeList->writeUnverifiedDatagram(localPingPacket, peer.getLocalSocket()); + + QByteArray publicPingPacket = nodeList->constructPingPacket(PingType::Public, false); + nodeList->writeUnverifiedDatagram(publicPingPacket, peer.getPublicSocket()); + } +} + +void DomainServer::processICEHeartbeatResponse(const QByteArray& packet) { + // loop through the packet and pull out network peers + // any peer we don't have we add to the hash, otherwise we update + QDataStream iceResponseStream(packet); + iceResponseStream.skipRawData(numBytesForPacketHeader(packet)); + + NetworkPeer receivedPeer; + + while (!iceResponseStream.atEnd()) { + iceResponseStream >> receivedPeer; + + if (!_connectingICEPeers.contains(receivedPeer.getUUID())) { + qDebug() << "New peer requesting connection being added to hash -" << receivedPeer; + } + + _connectingICEPeers[receivedPeer.getUUID()] = receivedPeer; + } +} + void DomainServer::processDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) { LimitedNodeList* nodeList = LimitedNodeList::getInstance(); @@ -1036,6 +1077,9 @@ void DomainServer::processDatagram(const QByteArray& receivedPacket, const HifiS break; } + case PacketTypeIceServerHeartbeatResponse: + processICEHeartbeatResponse(receivedPacket); + break; default: break; } diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index d5e38acf89..88da561f63 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -64,7 +64,9 @@ private slots: void requestCurrentPublicSocketViaSTUN(); void performIPAddressUpdate(const HifiSockAddr& newPublicSockAddr); + void performICEUpdates(); void sendHearbeatToIceServer(); + void sendICEPingPackets(); private: void setupNodeListAndAssignments(const QUuid& sessionUUID = QUuid::createUuid()); bool optionallySetupOAuth(); @@ -74,6 +76,7 @@ private: void setupAutomaticNetworking(); void updateNetworkingInfoWithDataServer(const QString& newSetting, const QString& networkAddress = QString()); + void processICEHeartbeatResponse(const QByteArray& packet); void processDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); @@ -135,6 +138,9 @@ private: HifiSockAddr _localSockAddr; + QHash _connectingICEPeers; + QHash _connectedICEPeers; + DomainServerSettingsManager _settingsManager; }; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 846b5395a8..395a3d01c9 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -165,6 +165,12 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr break; } + case PacketTypeUnverifiedPing: { + // send back a reply + QByteArray replyPacket = constructPingReplyPacket(packet); + writeUnverifiedDatagram(replyPacket, senderSockAddr); + break; + } case PacketTypeUnverifiedPingReply: { qDebug() << "Received reply from domain-server on" << senderSockAddr;