mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 10:37:35 +02:00
repairs to NodeList and LimitedNodeList
This commit is contained in:
parent
45c6ae44a6
commit
0be2eb57bf
7 changed files with 42 additions and 43 deletions
|
@ -52,7 +52,7 @@ DomainServer::DomainServer(int argc, char* argv[]) :
|
||||||
if (optionallySetupDTLS()) {
|
if (optionallySetupDTLS()) {
|
||||||
// we either read a certificate and private key or were not passed one, good to load assignments
|
// we either read a certificate and private key or were not passed one, good to load assignments
|
||||||
// and set up the node list
|
// and set up the node list
|
||||||
qDebug() << "Setting up NodeList and assignments.";
|
qDebug() << "Setting up LimitedNodeList and assignments.";
|
||||||
setupNodeListAndAssignments();
|
setupNodeListAndAssignments();
|
||||||
|
|
||||||
if (_isUsingDTLS) {
|
if (_isUsingDTLS) {
|
||||||
|
@ -542,7 +542,8 @@ void DomainServer::readAvailableDatagrams() {
|
||||||
receivedPacket.resize(nodeList->getNodeSocket().pendingDatagramSize());
|
receivedPacket.resize(nodeList->getNodeSocket().pendingDatagramSize());
|
||||||
nodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(),
|
nodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(),
|
||||||
senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer());
|
senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer());
|
||||||
if (packetTypeForPacket(receivedPacket) && nodeList->packetVersionAndHashMatch(receivedPacket)) {
|
if (packetTypeForPacket(receivedPacket) == PacketTypeRequestAssignment
|
||||||
|
&& nodeList->packetVersionAndHashMatch(receivedPacket)) {
|
||||||
|
|
||||||
// construct the requested assignment from the packet data
|
// construct the requested assignment from the packet data
|
||||||
Assignment requestAssignment(receivedPacket);
|
Assignment requestAssignment(receivedPacket);
|
||||||
|
|
|
@ -43,7 +43,7 @@ LimitedNodeList* LimitedNodeList::createInstance(unsigned short socketListenPort
|
||||||
// register the SharedNodePointer meta-type for signals/slots
|
// register the SharedNodePointer meta-type for signals/slots
|
||||||
qRegisterMetaType<SharedNodePointer>();
|
qRegisterMetaType<SharedNodePointer>();
|
||||||
} else {
|
} else {
|
||||||
qDebug("NodeList createInstance called with existing instance.");
|
qDebug("LimitedNodeList createInstance called with existing instance.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return _sharedInstance;
|
return _sharedInstance;
|
||||||
|
@ -51,7 +51,7 @@ LimitedNodeList* LimitedNodeList::createInstance(unsigned short socketListenPort
|
||||||
|
|
||||||
LimitedNodeList* LimitedNodeList::getInstance() {
|
LimitedNodeList* LimitedNodeList::getInstance() {
|
||||||
if (!_sharedInstance) {
|
if (!_sharedInstance) {
|
||||||
qDebug("NodeList getInstance called before call to createInstance. Returning NULL pointer.");
|
qDebug("LimitedNodeList getInstance called before call to createInstance. Returning NULL pointer.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return _sharedInstance;
|
return _sharedInstance;
|
||||||
|
@ -59,6 +59,7 @@ LimitedNodeList* LimitedNodeList::getInstance() {
|
||||||
|
|
||||||
|
|
||||||
LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short dtlsListenPort) :
|
LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short dtlsListenPort) :
|
||||||
|
_sessionUUID(),
|
||||||
_nodeHash(),
|
_nodeHash(),
|
||||||
_nodeHashMutex(QMutex::Recursive),
|
_nodeHashMutex(QMutex::Recursive),
|
||||||
_nodeSocket(this),
|
_nodeSocket(this),
|
||||||
|
@ -84,6 +85,17 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short
|
||||||
_packetStatTimer.start();
|
_packetStatTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LimitedNodeList::setSessionUUID(const QUuid& sessionUUID) {
|
||||||
|
QUuid oldUUID = _sessionUUID;
|
||||||
|
_sessionUUID = sessionUUID;
|
||||||
|
|
||||||
|
if (sessionUUID != oldUUID) {
|
||||||
|
qDebug() << "NodeList UUID changed from" << uuidStringWithoutCurlyBraces(oldUUID)
|
||||||
|
<< "to" << uuidStringWithoutCurlyBraces(_sessionUUID);
|
||||||
|
emit uuidChanged(sessionUUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QUdpSocket& LimitedNodeList::getDTLSSocket() {
|
QUdpSocket& LimitedNodeList::getDTLSSocket() {
|
||||||
if (!_dtlsSocket) {
|
if (!_dtlsSocket) {
|
||||||
// DTLS socket getter called but no DTLS socket exists, create it now
|
// DTLS socket getter called but no DTLS socket exists, create it now
|
||||||
|
|
|
@ -56,6 +56,9 @@ public:
|
||||||
static LimitedNodeList* createInstance(unsigned short socketListenPort = 0, unsigned short dtlsPort = 0);
|
static LimitedNodeList* createInstance(unsigned short socketListenPort = 0, unsigned short dtlsPort = 0);
|
||||||
static LimitedNodeList* getInstance();
|
static LimitedNodeList* getInstance();
|
||||||
|
|
||||||
|
const QUuid& getSessionUUID() const { return _sessionUUID; }
|
||||||
|
void setSessionUUID(const QUuid& sessionUUID);
|
||||||
|
|
||||||
QUdpSocket& getNodeSocket() { return _nodeSocket; }
|
QUdpSocket& getNodeSocket() { return _nodeSocket; }
|
||||||
QUdpSocket& getDTLSSocket();
|
QUdpSocket& getDTLSSocket();
|
||||||
|
|
||||||
|
@ -99,6 +102,7 @@ public slots:
|
||||||
|
|
||||||
void killNodeWithUUID(const QUuid& nodeUUID);
|
void killNodeWithUUID(const QUuid& nodeUUID);
|
||||||
signals:
|
signals:
|
||||||
|
void uuidChanged(const QUuid& ownerUUID);
|
||||||
void nodeAdded(SharedNodePointer);
|
void nodeAdded(SharedNodePointer);
|
||||||
void nodeKilled(SharedNodePointer);
|
void nodeKilled(SharedNodePointer);
|
||||||
protected:
|
protected:
|
||||||
|
@ -116,6 +120,7 @@ protected:
|
||||||
|
|
||||||
void changeSendSocketBufferSize(int numSendBytes);
|
void changeSendSocketBufferSize(int numSendBytes);
|
||||||
|
|
||||||
|
QUuid _sessionUUID;
|
||||||
NodeHash _nodeHash;
|
NodeHash _nodeHash;
|
||||||
QMutex _nodeHashMutex;
|
QMutex _nodeHashMutex;
|
||||||
QUdpSocket _nodeSocket;
|
QUdpSocket _nodeSocket;
|
||||||
|
|
|
@ -28,6 +28,7 @@ NodeList* NodeList::createInstance(char ownerType, unsigned short socketListenPo
|
||||||
NodeType::init();
|
NodeType::init();
|
||||||
|
|
||||||
_sharedInstance = new NodeList(ownerType, socketListenPort, dtlsPort);
|
_sharedInstance = new NodeList(ownerType, socketListenPort, dtlsPort);
|
||||||
|
LimitedNodeList::_sharedInstance = _sharedInstance;
|
||||||
|
|
||||||
// register the SharedNodePointer meta-type for signals/slots
|
// register the SharedNodePointer meta-type for signals/slots
|
||||||
qRegisterMetaType<SharedNodePointer>();
|
qRegisterMetaType<SharedNodePointer>();
|
||||||
|
@ -50,7 +51,6 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned
|
||||||
LimitedNodeList(socketListenPort, dtlsListenPort),
|
LimitedNodeList(socketListenPort, dtlsListenPort),
|
||||||
_ownerType(newOwnerType),
|
_ownerType(newOwnerType),
|
||||||
_nodeTypesOfInterest(),
|
_nodeTypesOfInterest(),
|
||||||
_sessionUUID(),
|
|
||||||
_numNoReplyDomainCheckIns(0),
|
_numNoReplyDomainCheckIns(0),
|
||||||
_assignmentServerSocket(),
|
_assignmentServerSocket(),
|
||||||
_publicSockAddr(),
|
_publicSockAddr(),
|
||||||
|
@ -58,7 +58,7 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned
|
||||||
_stunRequestsSinceSuccess(0)
|
_stunRequestsSinceSuccess(0)
|
||||||
{
|
{
|
||||||
// clear our NodeList when the domain changes
|
// clear our NodeList when the domain changes
|
||||||
connect(&_DomainHandler, &DomainHandler::hostnameChanged, this, &NodeList::reset);
|
connect(&_domainHandler, &DomainHandler::hostnameChanged, this, &NodeList::reset);
|
||||||
|
|
||||||
// clear our NodeList when logout is requested
|
// clear our NodeList when logout is requested
|
||||||
connect(&AccountManager::getInstance(), &AccountManager::logoutComplete , this, &NodeList::reset);
|
connect(&AccountManager::getInstance(), &AccountManager::logoutComplete , this, &NodeList::reset);
|
||||||
|
@ -70,7 +70,7 @@ qint64 NodeList::sendStatsToDomainServer(const QJsonObject& statsObject) {
|
||||||
|
|
||||||
statsPacketStream << statsObject.toVariantMap();
|
statsPacketStream << statsObject.toVariantMap();
|
||||||
|
|
||||||
return writeDatagram(statsPacket, _DomainHandler.getSockAddr(), QUuid());
|
return writeDatagram(statsPacket, _domainHandler.getSockAddr(), QUuid());
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer& sendingNode) {
|
void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer& sendingNode) {
|
||||||
|
@ -115,7 +115,7 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PacketTypeDomainServerRequireDTLS: {
|
case PacketTypeDomainServerRequireDTLS: {
|
||||||
_DomainHandler.parseDTLSRequirementPacket(packet);
|
_domainHandler.parseDTLSRequirementPacket(packet);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PacketTypePing: {
|
case PacketTypePing: {
|
||||||
|
@ -165,7 +165,7 @@ void NodeList::reset() {
|
||||||
setSessionUUID(QUuid());
|
setSessionUUID(QUuid());
|
||||||
|
|
||||||
// clear the domain connection information
|
// clear the domain connection information
|
||||||
_DomainHandler.clearConnectionInfo();
|
_domainHandler.clearConnectionInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeList::addNodeTypeToInterestSet(NodeType_t nodeTypeToAdd) {
|
void NodeList::addNodeTypeToInterestSet(NodeType_t nodeTypeToAdd) {
|
||||||
|
@ -317,15 +317,11 @@ void NodeList::sendDomainServerCheckIn() {
|
||||||
// we don't know our public socket and we need to send it to the domain server
|
// 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
|
// send a STUN request to figure it out
|
||||||
sendSTUNRequest();
|
sendSTUNRequest();
|
||||||
} else if (!_DomainHandler.getIP().isNull()) {
|
} else if (!_domainHandler.getIP().isNull()) {
|
||||||
// construct the DS check in packet
|
// construct the DS check in packet
|
||||||
|
QUuid packetUUID = (!_sessionUUID.isNull() ? _sessionUUID : _domainHandler.getAssignmentUUID());
|
||||||
|
|
||||||
PacketType domainPacketType = _sessionUUID.isNull() ? PacketTypeDomainConnectRequest : PacketTypeDomainListRequest;
|
QByteArray domainServerPacket = byteArrayWithPopulatedHeader(PacketTypeDomainListRequest, packetUUID);
|
||||||
|
|
||||||
QUuid packetUUID = (domainPacketType == PacketTypeDomainListRequest)
|
|
||||||
? _sessionUUID : _DomainHandler.getAssignmentUUID();
|
|
||||||
|
|
||||||
QByteArray domainServerPacket = byteArrayWithPopulatedHeader(domainPacketType, packetUUID);
|
|
||||||
QDataStream packetStream(&domainServerPacket, QIODevice::Append);
|
QDataStream packetStream(&domainServerPacket, QIODevice::Append);
|
||||||
|
|
||||||
// pack our data to send to the domain-server
|
// pack our data to send to the domain-server
|
||||||
|
@ -338,7 +334,7 @@ void NodeList::sendDomainServerCheckIn() {
|
||||||
packetStream << nodeTypeOfInterest;
|
packetStream << nodeTypeOfInterest;
|
||||||
}
|
}
|
||||||
|
|
||||||
writeDatagram(domainServerPacket, _DomainHandler.getSockAddr(), QUuid());
|
writeDatagram(domainServerPacket, _domainHandler.getSockAddr(), QUuid());
|
||||||
const int NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST = 5;
|
const int NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST = 5;
|
||||||
static unsigned int numDomainCheckins = 0;
|
static unsigned int numDomainCheckins = 0;
|
||||||
|
|
||||||
|
@ -358,23 +354,12 @@ void NodeList::sendDomainServerCheckIn() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeList::setSessionUUID(const QUuid& sessionUUID) {
|
|
||||||
QUuid oldUUID = _sessionUUID;
|
|
||||||
_sessionUUID = sessionUUID;
|
|
||||||
|
|
||||||
if (sessionUUID != oldUUID) {
|
|
||||||
qDebug() << "NodeList UUID changed from" << uuidStringWithoutCurlyBraces(oldUUID)
|
|
||||||
<< "to" << uuidStringWithoutCurlyBraces(_sessionUUID);
|
|
||||||
emit uuidChanged(sessionUUID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int NodeList::processDomainServerList(const QByteArray& packet) {
|
int NodeList::processDomainServerList(const QByteArray& packet) {
|
||||||
// this is a packet from the domain server, reset the count of un-replied check-ins
|
// this is a packet from the domain server, reset the count of un-replied check-ins
|
||||||
_numNoReplyDomainCheckIns = 0;
|
_numNoReplyDomainCheckIns = 0;
|
||||||
|
|
||||||
// if this was the first domain-server list from this domain, we've now connected
|
// if this was the first domain-server list from this domain, we've now connected
|
||||||
_DomainHandler.setIsConnected(true);
|
_domainHandler.setIsConnected(true);
|
||||||
|
|
||||||
int readNodes = 0;
|
int readNodes = 0;
|
||||||
|
|
||||||
|
@ -401,7 +386,7 @@ int NodeList::processDomainServerList(const QByteArray& packet) {
|
||||||
// if the public socket address is 0 then it's reachable at the same IP
|
// if the public socket address is 0 then it's reachable at the same IP
|
||||||
// as the domain server
|
// as the domain server
|
||||||
if (nodePublicSocket.getAddress().isNull()) {
|
if (nodePublicSocket.getAddress().isNull()) {
|
||||||
nodePublicSocket.setAddress(_DomainHandler.getIP());
|
nodePublicSocket.setAddress(_domainHandler.getIP());
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedNodePointer node = addOrUpdateNode(nodeUUID, nodeType, nodePublicSocket, nodeLocalSocket);
|
SharedNodePointer node = addOrUpdateNode(nodeUUID, nodeType, nodePublicSocket, nodeLocalSocket);
|
||||||
|
@ -511,9 +496,9 @@ void NodeList::loadData(QSettings *settings) {
|
||||||
QString domainServerHostname = settings->value(DOMAIN_SERVER_SETTING_KEY).toString();
|
QString domainServerHostname = settings->value(DOMAIN_SERVER_SETTING_KEY).toString();
|
||||||
|
|
||||||
if (domainServerHostname.size() > 0) {
|
if (domainServerHostname.size() > 0) {
|
||||||
_DomainHandler.setHostname(domainServerHostname);
|
_domainHandler.setHostname(domainServerHostname);
|
||||||
} else {
|
} else {
|
||||||
_DomainHandler.setHostname(DEFAULT_DOMAIN_HOSTNAME);
|
_domainHandler.setHostname(DEFAULT_DOMAIN_HOSTNAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
settings->endGroup();
|
settings->endGroup();
|
||||||
|
@ -522,9 +507,9 @@ void NodeList::loadData(QSettings *settings) {
|
||||||
void NodeList::saveData(QSettings* settings) {
|
void NodeList::saveData(QSettings* settings) {
|
||||||
settings->beginGroup(DOMAIN_SERVER_SETTING_KEY);
|
settings->beginGroup(DOMAIN_SERVER_SETTING_KEY);
|
||||||
|
|
||||||
if (_DomainHandler.getHostname() != DEFAULT_DOMAIN_HOSTNAME) {
|
if (_domainHandler.getHostname() != DEFAULT_DOMAIN_HOSTNAME) {
|
||||||
// the user is using a different hostname, store it
|
// the user is using a different hostname, store it
|
||||||
settings->setValue(DOMAIN_SERVER_SETTING_KEY, QVariant(_DomainHandler.getHostname()));
|
settings->setValue(DOMAIN_SERVER_SETTING_KEY, QVariant(_domainHandler.getHostname()));
|
||||||
} else {
|
} else {
|
||||||
// the user has switched back to default, remove the current setting
|
// the user has switched back to default, remove the current setting
|
||||||
settings->remove(DOMAIN_SERVER_SETTING_KEY);
|
settings->remove(DOMAIN_SERVER_SETTING_KEY);
|
||||||
|
|
|
@ -56,13 +56,10 @@ public:
|
||||||
NodeType_t getOwnerType() const { return _ownerType; }
|
NodeType_t getOwnerType() const { return _ownerType; }
|
||||||
void setOwnerType(NodeType_t ownerType) { _ownerType = ownerType; }
|
void setOwnerType(NodeType_t ownerType) { _ownerType = ownerType; }
|
||||||
|
|
||||||
const QUuid& getSessionUUID() const { return _sessionUUID; }
|
|
||||||
void setSessionUUID(const QUuid& sessionUUID);
|
|
||||||
|
|
||||||
qint64 sendStatsToDomainServer(const QJsonObject& statsObject);
|
qint64 sendStatsToDomainServer(const QJsonObject& statsObject);
|
||||||
|
|
||||||
int getNumNoReplyDomainCheckIns() const { return _numNoReplyDomainCheckIns; }
|
int getNumNoReplyDomainCheckIns() const { return _numNoReplyDomainCheckIns; }
|
||||||
DomainHandler& getDomainHandler() { return _DomainHandler; }
|
DomainHandler& getDomainHandler() { return _domainHandler; }
|
||||||
|
|
||||||
const NodeSet& getNodeInterestSet() const { return _nodeTypesOfInterest; }
|
const NodeSet& getNodeInterestSet() const { return _nodeTypesOfInterest; }
|
||||||
void addNodeTypeToInterestSet(NodeType_t nodeTypeToAdd);
|
void addNodeTypeToInterestSet(NodeType_t nodeTypeToAdd);
|
||||||
|
@ -86,7 +83,6 @@ public slots:
|
||||||
void sendDomainServerCheckIn();
|
void sendDomainServerCheckIn();
|
||||||
void pingInactiveNodes();
|
void pingInactiveNodes();
|
||||||
signals:
|
signals:
|
||||||
void uuidChanged(const QUuid& ownerUUID);
|
|
||||||
void limitOfSilentDomainCheckInsReached();
|
void limitOfSilentDomainCheckInsReached();
|
||||||
private:
|
private:
|
||||||
static NodeList* _sharedInstance;
|
static NodeList* _sharedInstance;
|
||||||
|
@ -104,8 +100,7 @@ private:
|
||||||
|
|
||||||
NodeType_t _ownerType;
|
NodeType_t _ownerType;
|
||||||
NodeSet _nodeTypesOfInterest;
|
NodeSet _nodeTypesOfInterest;
|
||||||
DomainHandler _DomainHandler;
|
DomainHandler _domainHandler;
|
||||||
QUuid _sessionUUID;
|
|
||||||
int _numNoReplyDomainCheckIns;
|
int _numNoReplyDomainCheckIns;
|
||||||
HifiSockAddr _assignmentServerSocket;
|
HifiSockAddr _assignmentServerSocket;
|
||||||
HifiSockAddr _publicSockAddr;
|
HifiSockAddr _publicSockAddr;
|
||||||
|
|
|
@ -84,7 +84,7 @@ int populatePacketHeader(char* packet, PacketType type, const QUuid& connectionU
|
||||||
|
|
||||||
char* position = packet + numTypeBytes + sizeof(PacketVersion);
|
char* position = packet + numTypeBytes + sizeof(PacketVersion);
|
||||||
|
|
||||||
QUuid packUUID = connectionUUID.isNull() ? NodeList::getInstance()->getSessionUUID() : connectionUUID;
|
QUuid packUUID = connectionUUID.isNull() ? LimitedNodeList::getInstance()->getSessionUUID() : connectionUUID;
|
||||||
|
|
||||||
QByteArray rfcUUID = packUUID.toRfc4122();
|
QByteArray rfcUUID = packUUID.toRfc4122();
|
||||||
memcpy(position, rfcUUID.constData(), NUM_BYTES_RFC4122_UUID);
|
memcpy(position, rfcUUID.constData(), NUM_BYTES_RFC4122_UUID);
|
||||||
|
|
|
@ -67,7 +67,8 @@ typedef char PacketVersion;
|
||||||
|
|
||||||
const QSet<PacketType> NON_VERIFIED_PACKETS = QSet<PacketType>()
|
const QSet<PacketType> NON_VERIFIED_PACKETS = QSet<PacketType>()
|
||||||
<< PacketTypeDomainServerRequireDTLS << PacketTypeDomainList << PacketTypeDomainListRequest
|
<< PacketTypeDomainServerRequireDTLS << PacketTypeDomainList << PacketTypeDomainListRequest
|
||||||
<< PacketTypeCreateAssignment << PacketTypeRequestAssignment << PacketTypeStunResponse;
|
<< PacketTypeCreateAssignment << PacketTypeRequestAssignment << PacketTypeStunResponse
|
||||||
|
<< PacketTypeNodeJsonStats;
|
||||||
|
|
||||||
const int NUM_BYTES_MD5_HASH = 16;
|
const int NUM_BYTES_MD5_HASH = 16;
|
||||||
const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID;
|
const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID;
|
||||||
|
|
Loading…
Reference in a new issue