mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 04:37:48 +02:00
only send add packet for nodes in interest set
This commit is contained in:
parent
5749fefcd5
commit
e91ee7e7e3
6 changed files with 65 additions and 53 deletions
|
@ -918,26 +918,8 @@ int DomainServer::parseNodeDataFromByteArray(QDataStream& packetStream, NodeType
|
||||||
return packetStream.device()->pos();
|
return packetStream.device()->pos();
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeSet DomainServer::nodeInterestListFromPacket(const QByteArray& packet, int numPreceedingBytes) {
|
|
||||||
QDataStream packetStream(packet);
|
|
||||||
packetStream.skipRawData(numPreceedingBytes);
|
|
||||||
|
|
||||||
quint8 numInterestTypes = 0;
|
|
||||||
packetStream >> numInterestTypes;
|
|
||||||
|
|
||||||
quint8 nodeType;
|
|
||||||
NodeSet nodeInterestSet;
|
|
||||||
|
|
||||||
for (int i = 0; i < numInterestTypes; i++) {
|
|
||||||
packetStream >> nodeType;
|
|
||||||
nodeInterestSet.insert((NodeType_t) nodeType);
|
|
||||||
}
|
|
||||||
|
|
||||||
return nodeInterestSet;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const HifiSockAddr &senderSockAddr,
|
void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const HifiSockAddr &senderSockAddr,
|
||||||
const NodeSet& nodeInterestList) {
|
const NodeSet& nodeInterestSet) {
|
||||||
auto limitedNodeList = DependencyManager::get<LimitedNodeList>();
|
auto limitedNodeList = DependencyManager::get<LimitedNodeList>();
|
||||||
QByteArray broadcastPacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketTypeDomainList);
|
QByteArray broadcastPacket = limitedNodeList->byteArrayWithPopulatedHeader(PacketTypeDomainList);
|
||||||
|
|
||||||
|
@ -951,7 +933,10 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif
|
||||||
|
|
||||||
DomainServerNodeData* nodeData = reinterpret_cast<DomainServerNodeData*>(node->getLinkedData());
|
DomainServerNodeData* nodeData = reinterpret_cast<DomainServerNodeData*>(node->getLinkedData());
|
||||||
|
|
||||||
if (nodeInterestList.size() > 0) {
|
// store the nodeInterestSet on this DomainServerNodeData, in case it has changed
|
||||||
|
nodeData->setNodeInterestSet(nodeInterestSet);
|
||||||
|
|
||||||
|
if (nodeInterestSet.size() > 0) {
|
||||||
|
|
||||||
// DTLSServerSession* dtlsSession = _isUsingDTLS ? _dtlsSessions[senderSockAddr] : NULL;
|
// DTLSServerSession* dtlsSession = _isUsingDTLS ? _dtlsSessions[senderSockAddr] : NULL;
|
||||||
int dataMTU = MAX_PACKET_SIZE;
|
int dataMTU = MAX_PACKET_SIZE;
|
||||||
|
@ -963,7 +948,7 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif
|
||||||
QByteArray nodeByteArray;
|
QByteArray nodeByteArray;
|
||||||
QDataStream nodeDataStream(&nodeByteArray, QIODevice::Append);
|
QDataStream nodeDataStream(&nodeByteArray, QIODevice::Append);
|
||||||
|
|
||||||
if (otherNode->getUUID() != node->getUUID() && nodeInterestList.contains(otherNode->getType())) {
|
if (otherNode->getUUID() != node->getUUID() && nodeInterestSet.contains(otherNode->getType())) {
|
||||||
|
|
||||||
// don't send avatar nodes to other avatars, that will come from avatar mixer
|
// don't send avatar nodes to other avatars, that will come from avatar mixer
|
||||||
nodeDataStream << *otherNode.data();
|
nodeDataStream << *otherNode.data();
|
||||||
|
@ -1028,7 +1013,13 @@ void DomainServer::broadcastNewNode(const SharedNodePointer& addedNode) {
|
||||||
|
|
||||||
limitedNodeList->eachMatchingNode(
|
limitedNodeList->eachMatchingNode(
|
||||||
[&](const SharedNodePointer& node)->bool {
|
[&](const SharedNodePointer& node)->bool {
|
||||||
return (node->getLinkedData() && node->getActiveSocket() && node != addedNode);
|
if (node->getLinkedData() && node->getActiveSocket() && node != addedNode) {
|
||||||
|
// is the added Node in this node's interest list?
|
||||||
|
DomainServerNodeData* nodeData = dynamic_cast<DomainServerNodeData*>(node->getLinkedData());
|
||||||
|
return nodeData->getNodeInterestSet().contains(addedNode->getType());
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
[&](const SharedNodePointer& node) {
|
[&](const SharedNodePointer& node) {
|
||||||
QByteArray rfcConnectionSecret = connectionSecretForNodes(node, addedNode).toRfc4122();
|
QByteArray rfcConnectionSecret = connectionSecretForNodes(node, addedNode).toRfc4122();
|
||||||
|
|
|
@ -58,7 +58,7 @@ public slots:
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void aboutToQuit();
|
void aboutToQuit();
|
||||||
|
|
||||||
void loginFailed();
|
void loginFailed();
|
||||||
void readAvailableDatagrams();
|
void readAvailableDatagrams();
|
||||||
void setupPendingAssignmentCredits();
|
void setupPendingAssignmentCredits();
|
||||||
|
@ -100,9 +100,8 @@ private:
|
||||||
HifiSockAddr& publicSockAddr,
|
HifiSockAddr& publicSockAddr,
|
||||||
HifiSockAddr& localSockAddr,
|
HifiSockAddr& localSockAddr,
|
||||||
const HifiSockAddr& senderSockAddr);
|
const HifiSockAddr& senderSockAddr);
|
||||||
NodeSet nodeInterestListFromPacket(const QByteArray& packet, int numPreceedingBytes);
|
|
||||||
void sendDomainListToNode(const SharedNodePointer& node, const HifiSockAddr& senderSockAddr,
|
void sendDomainListToNode(const SharedNodePointer& node, const HifiSockAddr& senderSockAddr,
|
||||||
const NodeSet& nodeInterestList);
|
const NodeSet& nodeInterestSet);
|
||||||
|
|
||||||
QUuid connectionSecretForNodes(const SharedNodePointer& nodeA, const SharedNodePointer& nodeB);
|
QUuid connectionSecretForNodes(const SharedNodePointer& nodeA, const SharedNodePointer& nodeB);
|
||||||
void broadcastNewNode(const SharedNodePointer& node);
|
void broadcastNewNode(const SharedNodePointer& node);
|
||||||
|
|
|
@ -12,44 +12,47 @@
|
||||||
#ifndef hifi_DomainServerNodeData_h
|
#ifndef hifi_DomainServerNodeData_h
|
||||||
#define hifi_DomainServerNodeData_h
|
#define hifi_DomainServerNodeData_h
|
||||||
|
|
||||||
|
|
||||||
#include <QtCore/QElapsedTimer>
|
#include <QtCore/QElapsedTimer>
|
||||||
#include <QtCore/QHash>
|
#include <QtCore/QHash>
|
||||||
#include <QtCore/QUuid>
|
#include <QtCore/QUuid>
|
||||||
|
|
||||||
#include <HifiSockAddr.h>
|
#include <HifiSockAddr.h>
|
||||||
#include <NodeData.h>
|
#include <NodeData.h>
|
||||||
|
#include <NodeType.h>
|
||||||
|
|
||||||
class DomainServerNodeData : public NodeData {
|
class DomainServerNodeData : public NodeData {
|
||||||
public:
|
public:
|
||||||
DomainServerNodeData();
|
DomainServerNodeData();
|
||||||
int parseData(const QByteArray& packet) { return 0; }
|
int parseData(const QByteArray& packet) { return 0; }
|
||||||
|
|
||||||
const QJsonObject& getStatsJSONObject() const { return _statsJSONObject; }
|
const QJsonObject& getStatsJSONObject() const { return _statsJSONObject; }
|
||||||
|
|
||||||
void parseJSONStatsPacket(const QByteArray& statsPacket);
|
void parseJSONStatsPacket(const QByteArray& statsPacket);
|
||||||
|
|
||||||
void setAssignmentUUID(const QUuid& assignmentUUID) { _assignmentUUID = assignmentUUID; }
|
void setAssignmentUUID(const QUuid& assignmentUUID) { _assignmentUUID = assignmentUUID; }
|
||||||
const QUuid& getAssignmentUUID() const { return _assignmentUUID; }
|
const QUuid& getAssignmentUUID() const { return _assignmentUUID; }
|
||||||
|
|
||||||
void setWalletUUID(const QUuid& walletUUID) { _walletUUID = walletUUID; }
|
void setWalletUUID(const QUuid& walletUUID) { _walletUUID = walletUUID; }
|
||||||
const QUuid& getWalletUUID() const { return _walletUUID; }
|
const QUuid& getWalletUUID() const { return _walletUUID; }
|
||||||
|
|
||||||
void setUsername(const QString& username) { _username = username; }
|
void setUsername(const QString& username) { _username = username; }
|
||||||
const QString& getUsername() const { return _username; }
|
const QString& getUsername() const { return _username; }
|
||||||
|
|
||||||
QElapsedTimer& getPaymentIntervalTimer() { return _paymentIntervalTimer; }
|
QElapsedTimer& getPaymentIntervalTimer() { return _paymentIntervalTimer; }
|
||||||
|
|
||||||
void setSendingSockAddr(const HifiSockAddr& sendingSockAddr) { _sendingSockAddr = sendingSockAddr; }
|
void setSendingSockAddr(const HifiSockAddr& sendingSockAddr) { _sendingSockAddr = sendingSockAddr; }
|
||||||
const HifiSockAddr& getSendingSockAddr() { return _sendingSockAddr; }
|
const HifiSockAddr& getSendingSockAddr() { return _sendingSockAddr; }
|
||||||
|
|
||||||
void setIsAuthenticated(bool isAuthenticated) { _isAuthenticated = isAuthenticated; }
|
void setIsAuthenticated(bool isAuthenticated) { _isAuthenticated = isAuthenticated; }
|
||||||
bool isAuthenticated() const { return _isAuthenticated; }
|
bool isAuthenticated() const { return _isAuthenticated; }
|
||||||
|
|
||||||
QHash<QUuid, QUuid>& getSessionSecretHash() { return _sessionSecretHash; }
|
QHash<QUuid, QUuid>& getSessionSecretHash() { return _sessionSecretHash; }
|
||||||
|
|
||||||
|
const NodeSet& getNodeInterestSet() const { return _nodeInterestSet; }
|
||||||
|
void setNodeInterestSet(const NodeSet& nodeInterestSet) { _nodeInterestSet = nodeInterestSet; }
|
||||||
private:
|
private:
|
||||||
QJsonObject mergeJSONStatsFromNewObject(const QJsonObject& newObject, QJsonObject destinationObject);
|
QJsonObject mergeJSONStatsFromNewObject(const QJsonObject& newObject, QJsonObject destinationObject);
|
||||||
|
|
||||||
QHash<QUuid, QUuid> _sessionSecretHash;
|
QHash<QUuid, QUuid> _sessionSecretHash;
|
||||||
QUuid _assignmentUUID;
|
QUuid _assignmentUUID;
|
||||||
QUuid _walletUUID;
|
QUuid _walletUUID;
|
||||||
|
@ -58,6 +61,7 @@ private:
|
||||||
QJsonObject _statsJSONObject;
|
QJsonObject _statsJSONObject;
|
||||||
HifiSockAddr _sendingSockAddr;
|
HifiSockAddr _sendingSockAddr;
|
||||||
bool _isAuthenticated;
|
bool _isAuthenticated;
|
||||||
|
NodeSet _nodeInterestSet;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_DomainServerNodeData_h
|
#endif // hifi_DomainServerNodeData_h
|
||||||
|
|
|
@ -60,8 +60,6 @@ const QString USERNAME_UUID_REPLACEMENT_STATS_KEY = "$username";
|
||||||
|
|
||||||
class HifiSockAddr;
|
class HifiSockAddr;
|
||||||
|
|
||||||
typedef QSet<NodeType_t> NodeSet;
|
|
||||||
|
|
||||||
typedef QSharedPointer<Node> SharedNodePointer;
|
typedef QSharedPointer<Node> SharedNodePointer;
|
||||||
Q_DECLARE_METATYPE(SharedNodePointer)
|
Q_DECLARE_METATYPE(SharedNodePointer)
|
||||||
|
|
||||||
|
|
|
@ -23,25 +23,11 @@
|
||||||
#include "HifiSockAddr.h"
|
#include "HifiSockAddr.h"
|
||||||
#include "NetworkPeer.h"
|
#include "NetworkPeer.h"
|
||||||
#include "NodeData.h"
|
#include "NodeData.h"
|
||||||
|
#include "NodeType.h"
|
||||||
#include "PacketHeaders.h"
|
#include "PacketHeaders.h"
|
||||||
#include "SimpleMovingAverage.h"
|
#include "SimpleMovingAverage.h"
|
||||||
#include "MovingPercentile.h"
|
#include "MovingPercentile.h"
|
||||||
|
|
||||||
typedef quint8 NodeType_t;
|
|
||||||
|
|
||||||
namespace NodeType {
|
|
||||||
const NodeType_t DomainServer = 'D';
|
|
||||||
const NodeType_t EntityServer = 'o'; // was ModelServer
|
|
||||||
const NodeType_t EnvironmentServer = 'E';
|
|
||||||
const NodeType_t Agent = 'I';
|
|
||||||
const NodeType_t AudioMixer = 'M';
|
|
||||||
const NodeType_t AvatarMixer = 'W';
|
|
||||||
const NodeType_t Unassigned = 1;
|
|
||||||
|
|
||||||
void init();
|
|
||||||
const QString& getNodeTypeName(NodeType_t nodeType);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Node : public NetworkPeer {
|
class Node : public NetworkPeer {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
34
libraries/networking/src/NodeType.h
Normal file
34
libraries/networking/src/NodeType.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
//
|
||||||
|
// NodeType.h
|
||||||
|
// libraries/networking/src
|
||||||
|
//
|
||||||
|
// Created by Stephen Birarda on 05/29/15.
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef hifi_NodeType_h
|
||||||
|
#define hifi_NodeType_h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
typedef quint8 NodeType_t;
|
||||||
|
|
||||||
|
namespace NodeType {
|
||||||
|
const NodeType_t DomainServer = 'D';
|
||||||
|
const NodeType_t EntityServer = 'o'; // was ModelServer
|
||||||
|
const NodeType_t EnvironmentServer = 'E';
|
||||||
|
const NodeType_t Agent = 'I';
|
||||||
|
const NodeType_t AudioMixer = 'M';
|
||||||
|
const NodeType_t AvatarMixer = 'W';
|
||||||
|
const NodeType_t Unassigned = 1;
|
||||||
|
|
||||||
|
void init();
|
||||||
|
const QString& getNodeTypeName(NodeType_t nodeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef QSet<NodeType_t> NodeSet;
|
||||||
|
|
||||||
|
#endif // hifi_NodeType_h
|
Loading…
Reference in a new issue