From 262054d0ebbe30667bf6655d20322e7b2500b9bc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 Oct 2014 14:18:17 -0700 Subject: [PATCH] handle ICE requirement in address manager response --- ice-server/src/IceServer.cpp | 4 + interface/src/Application.cpp | 7 +- libraries/networking/src/AddressManager.cpp | 20 +++- libraries/networking/src/AddressManager.h | 3 +- libraries/networking/src/DomainHandler.cpp | 17 +++- libraries/networking/src/DomainHandler.h | 5 +- libraries/networking/src/NodeList.cpp | 106 ++++++++++---------- 7 files changed, 97 insertions(+), 65 deletions(-) diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp index 0877c8591f..a24abd3a49 100644 --- a/ice-server/src/IceServer.cpp +++ b/ice-server/src/IceServer.cpp @@ -67,6 +67,10 @@ void IceServer::processDatagrams() { // check if this node also included a UUID that they would like to connect to QUuid connectRequestUUID; hearbeatStream >> connectRequestUUID; + + if (!connectRequestUUID.isNull()) { + qDebug() << "Peer wants to connect to peer with ID" << uuidStringWithoutCurlyBraces(connectRequestUUID); + } } } } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ec40056299..51b78b6901 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -299,9 +299,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : AddressManager& addressManager = AddressManager::getInstance(); - // connect to the domainChangeRequired signal on AddressManager - connect(&addressManager, &AddressManager::possibleDomainChangeRequired, + // handle domain change signals from AddressManager + connect(&addressManager, &AddressManager::possibleDomainChangeRequiredToHostname, this, &Application::changeDomainHostname); + + connect(&addressManager, &AddressManager::possibleDomainChangeRequiredViaICEForID, + &domainHandler, &DomainHandler::setIceServerHostnameAndID); _settings = new QSettings(this); _numChangedSettings = 0; diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 4509a1790c..a78e1e76a4 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -118,9 +118,21 @@ void AddressManager::handleAPIResponse(const QJsonObject &jsonObject) { QJsonObject domainObject = dataObject[ADDRESS_API_DOMAIN_KEY].toObject(); const QString DOMAIN_NETWORK_ADDRESS_KEY = "network_address"; - QString domainHostname = domainObject[DOMAIN_NETWORK_ADDRESS_KEY].toString(); + const QString DOMAIN_ICE_SERVER_ADDRESS_KEY = "ice_server_address"; - emit possibleDomainChangeRequired(domainHostname); + if (domainObject.contains(DOMAIN_NETWORK_ADDRESS_KEY)) { + QString domainHostname = domainObject[DOMAIN_NETWORK_ADDRESS_KEY].toString(); + + emit possibleDomainChangeRequiredToHostname(domainHostname); + } else { + QString iceServerAddress = domainObject[DOMAIN_ICE_SERVER_ADDRESS_KEY].toString(); + + const QString DOMAIN_ID_KEY = "id"; + QString domainIDString = domainObject[DOMAIN_ID_KEY].toString(); + QUuid domainID(domainIDString); + + emit possibleDomainChangeRequiredViaICEForID(iceServerAddress, domainID); + } // take the path that came back const QString LOCATION_KEY = "location"; @@ -182,7 +194,7 @@ bool AddressManager::handleNetworkAddress(const QString& lookupString) { QRegExp hostnameRegex(HOSTNAME_REGEX_STRING, Qt::CaseInsensitive); if (hostnameRegex.indexIn(lookupString) != -1) { - emit possibleDomainChangeRequired(hostnameRegex.cap(0)); + emit possibleDomainChangeRequiredToHostname(hostnameRegex.cap(0)); emit lookupResultsFinished(); return true; } @@ -190,7 +202,7 @@ bool AddressManager::handleNetworkAddress(const QString& lookupString) { QRegExp ipAddressRegex(IP_ADDRESS_REGEX_STRING); if (ipAddressRegex.indexIn(lookupString) != -1) { - emit possibleDomainChangeRequired(ipAddressRegex.cap(0)); + emit possibleDomainChangeRequiredToHostname(ipAddressRegex.cap(0)); emit lookupResultsFinished(); return true; } diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index f7cc7c52ee..128c395cb4 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -40,7 +40,8 @@ signals: void lookupResultsFinished(); void lookupResultIsOffline(); void lookupResultIsNotFound(); - void possibleDomainChangeRequired(const QString& newHostname); + void possibleDomainChangeRequiredToHostname(const QString& newHostname); + void possibleDomainChangeRequiredViaICEForID(const QString& iceServerHostname, const QUuid& domainID); void locationChangeRequired(const glm::vec3& newPosition, bool hasOrientationChange, const glm::quat& newOrientation, bool shouldFaceLocation); diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index b13f598a08..e5c8abb171 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -25,7 +25,7 @@ DomainHandler::DomainHandler(QObject* parent) : _uuid(), _sockAddr(HifiSockAddr(QHostAddress::Null, DEFAULT_DOMAIN_SERVER_PORT)), _assignmentUUID(), - _requiresICE(true), + _iceServerSockAddr(), _isConnected(false), _handshakeTimer(NULL), _settingsObject(), @@ -36,7 +36,7 @@ DomainHandler::DomainHandler(QObject* parent) : void DomainHandler::clearConnectionInfo() { _uuid = QUuid(); - _requiresICE = true; + _iceServerSockAddr = HifiSockAddr(); _isConnected = false; emit disconnectedFromDomain(); @@ -125,6 +125,19 @@ void DomainHandler::setHostname(const QString& hostname) { } } +void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id) { + if (id != _uuid) { + // re-set the domain info to connect to new domain + hardReset(); + + _uuid = id; + _iceServerSockAddr = HifiSockAddr(iceServerHostname, ICE_SERVER_DEFAULT_PORT); + + qDebug() << "Domain ID changed to" << uuidStringWithoutCurlyBraces(_uuid) + << "- ICE required via ice server at" << iceServerHostname; + } +} + void DomainHandler::completedHostnameLookup(const QHostInfo& hostInfo) { for (int i = 0; i < hostInfo.addresses().size(); i++) { if (hostInfo.addresses()[i].protocol() == QAbstractSocket::IPv4Protocol) { diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 9733a8bff3..ffd288d93d 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -54,7 +54,7 @@ public: const QUuid& getAssignmentUUID() const { return _assignmentUUID; } void setAssignmentUUID(const QUuid& assignmentUUID) { _assignmentUUID = assignmentUUID; } - bool requiresICE() const { return _requiresICE; } + bool requiresICE() const { return !_iceServerSockAddr.isNull(); } bool isConnected() const { return _isConnected; } void setIsConnected(bool isConnected); @@ -68,6 +68,7 @@ public: void softReset(); public slots: void setHostname(const QString& hostname); + void setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id); private slots: void completedHostnameLookup(const QHostInfo& hostInfo); @@ -87,7 +88,7 @@ private: QString _hostname; HifiSockAddr _sockAddr; QUuid _assignmentUUID; - bool _requiresICE; + HifiSockAddr _iceServerSockAddr; bool _isConnected; QTimer* _handshakeTimer; QJsonObject _settingsObject; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index afefd2a5c1..3af71546ce 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -242,63 +242,61 @@ void NodeList::sendDomainServerCheckIn() { // we don't know our public socket and we need to send it to the domain server // send a STUN request to figure it out sendSTUNRequest(); + } else if (!_domainHandler.isConnected() && _domainHandler.requiresICE()) { + sendICERequestForDomainConnection(); } else if (!_domainHandler.getIP().isNull()) { - if (!_domainHandler.isConnected() && _domainHandler.requiresICE()) { - sendICERequestForDomainConnection(); - } else { - bool isUsingDTLS = false; - - PacketType domainPacketType = !_domainHandler.isConnected() - ? PacketTypeDomainConnectRequest : PacketTypeDomainListRequest; - - if (!_domainHandler.isConnected()) { - qDebug() << "Sending connect request to domain-server at" << _domainHandler.getHostname(); - } - - // construct the DS check in packet - QUuid packetUUID = _sessionUUID; - - if (!_domainHandler.getAssignmentUUID().isNull() && domainPacketType == PacketTypeDomainConnectRequest) { - // this is a connect request and we're an assigned node - // so set our packetUUID as the assignment UUID - packetUUID = _domainHandler.getAssignmentUUID(); - } - - QByteArray domainServerPacket = byteArrayWithPopulatedHeader(domainPacketType, packetUUID); - QDataStream packetStream(&domainServerPacket, QIODevice::Append); - - // pack our data to send to the domain-server - packetStream << _ownerType << _publicSockAddr - << HifiSockAddr(QHostAddress(getHostOrderLocalAddress()), _nodeSocket.localPort()) - << (quint8) _nodeTypesOfInterest.size(); - - // copy over the bytes for node types of interest, if required - foreach (NodeType_t nodeTypeOfInterest, _nodeTypesOfInterest) { - packetStream << nodeTypeOfInterest; - } - - if (!isUsingDTLS) { - writeDatagram(domainServerPacket, _domainHandler.getSockAddr(), QUuid()); - } - - const int NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST = 5; - static unsigned int numDomainCheckins = 0; - - // send a STUN request every Nth domain server check in so we update our public socket, if required - if (numDomainCheckins++ % NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST == 0) { - sendSTUNRequest(); - } - - if (_numNoReplyDomainCheckIns >= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { - // we haven't heard back from DS in MAX_SILENT_DOMAIN_SERVER_CHECK_INS - // so emit our signal that indicates that - emit limitOfSilentDomainCheckInsReached(); - } - - // increment the count of un-replied check-ins - _numNoReplyDomainCheckIns++; + bool isUsingDTLS = false; + + PacketType domainPacketType = !_domainHandler.isConnected() + ? PacketTypeDomainConnectRequest : PacketTypeDomainListRequest; + + if (!_domainHandler.isConnected()) { + qDebug() << "Sending connect request to domain-server at" << _domainHandler.getHostname(); } + + // construct the DS check in packet + QUuid packetUUID = _sessionUUID; + + if (!_domainHandler.getAssignmentUUID().isNull() && domainPacketType == PacketTypeDomainConnectRequest) { + // this is a connect request and we're an assigned node + // so set our packetUUID as the assignment UUID + packetUUID = _domainHandler.getAssignmentUUID(); + } + + QByteArray domainServerPacket = byteArrayWithPopulatedHeader(domainPacketType, packetUUID); + QDataStream packetStream(&domainServerPacket, QIODevice::Append); + + // pack our data to send to the domain-server + packetStream << _ownerType << _publicSockAddr + << HifiSockAddr(QHostAddress(getHostOrderLocalAddress()), _nodeSocket.localPort()) + << (quint8) _nodeTypesOfInterest.size(); + + // copy over the bytes for node types of interest, if required + foreach (NodeType_t nodeTypeOfInterest, _nodeTypesOfInterest) { + packetStream << nodeTypeOfInterest; + } + + if (!isUsingDTLS) { + writeDatagram(domainServerPacket, _domainHandler.getSockAddr(), QUuid()); + } + + const int NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST = 5; + static unsigned int numDomainCheckins = 0; + + // send a STUN request every Nth domain server check in so we update our public socket, if required + if (numDomainCheckins++ % NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST == 0) { + sendSTUNRequest(); + } + + if (_numNoReplyDomainCheckIns >= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { + // we haven't heard back from DS in MAX_SILENT_DOMAIN_SERVER_CHECK_INS + // so emit our signal that indicates that + emit limitOfSilentDomainCheckInsReached(); + } + + // increment the count of un-replied check-ins + _numNoReplyDomainCheckIns++; } }