From a823722d27e65cfc6c102e6a0ce2edb61802fb63 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 6 Feb 2014 14:28:58 -0800 Subject: [PATCH] add writeDatagram helper to NodeList to insert md5 hash --- animation-server/src/AnimationServer.cpp | 8 ++++- assignment-client/src/Agent.cpp | 27 ++++++++++------ assignment-client/src/audio/AudioMixer.cpp | 4 +-- assignment-client/src/avatars/AvatarMixer.cpp | 8 ++--- .../src/octree/OctreeSendThread.cpp | 18 ++++------- assignment-client/src/octree/OctreeServer.cpp | 22 +++++++------ .../src/particles/ParticleServer.cpp | 8 ++--- assignment-client/src/voxels/VoxelServer.cpp | 4 +-- interface/src/Application.cpp | 5 +-- interface/src/Audio.cpp | 7 ++--- interface/src/DatagramProcessor.cpp | 12 +++++-- interface/src/MetavoxelSystem.cpp | 5 +-- libraries/audio/src/AudioInjector.cpp | 4 +-- libraries/avatars/src/AvatarData.h | 2 +- libraries/octree/src/JurisdictionListener.cpp | 3 +- libraries/octree/src/JurisdictionSender.cpp | 3 +- .../octree/src/OctreeEditPacketSender.cpp | 3 +- libraries/shared/src/NetworkPacket.cpp | 16 +++++----- libraries/shared/src/NetworkPacket.h | 8 ++--- libraries/shared/src/NodeList.cpp | 31 +++++++++++++++++++ libraries/shared/src/NodeList.h | 5 +++ libraries/shared/src/PacketHeaders.cpp | 17 +++++++--- libraries/shared/src/PacketHeaders.h | 5 ++- libraries/shared/src/PacketSender.cpp | 8 ++--- libraries/shared/src/PacketSender.h | 2 +- .../shared/src/ReceivedPacketProcessor.cpp | 12 +++---- .../shared/src/ReceivedPacketProcessor.h | 2 +- 27 files changed, 142 insertions(+), 107 deletions(-) diff --git a/animation-server/src/AnimationServer.cpp b/animation-server/src/AnimationServer.cpp index 24ea7ede9c..466ed7cf93 100644 --- a/animation-server/src/AnimationServer.cpp +++ b/animation-server/src/AnimationServer.cpp @@ -835,7 +835,13 @@ void AnimationServer::readPendingDatagrams() { int headerBytes = numBytesForPacketHeader(receivedPacket); // PacketType_JURISDICTION, first byte is the node type... if (receivedPacket.data()[headerBytes] == NodeType::VoxelServer && ::jurisdictionListener) { - ::jurisdictionListener->queueReceivedPacket(nodeSockAddr, receivedPacket); + QUuid nodeUUID; + deconstructPacketHeader(receivedPacket, nodeUUID); + + SharedNodePointer matchedNode = NodeList::getInstance()->nodeWithUUID(nodeUUID); + if (matchedNode) { + ::jurisdictionListener->queueReceivedPacket(matchedNode, receivedPacket); + } } } NodeList::getInstance()->processNodeData(nodeSockAddr, receivedPacket); diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 93ec4bf991..eff573216a 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -35,17 +35,24 @@ void Agent::processDatagram(const QByteArray& dataByteArray, const HifiSockAddr& PacketType datagramPacketType = packetTypeForPacket(dataByteArray); if (datagramPacketType == PacketTypeJurisdiction) { int headerBytes = numBytesForPacketHeader(dataByteArray); - // PacketType_JURISDICTION, first byte is the node type... - switch (dataByteArray[headerBytes]) { - case NodeType::VoxelServer: - _scriptEngine.getVoxelsScriptingInterface()->getJurisdictionListener()->queueReceivedPacket(senderSockAddr, - dataByteArray); - break; - case NodeType::ParticleServer: - _scriptEngine.getParticlesScriptingInterface()->getJurisdictionListener()->queueReceivedPacket(senderSockAddr, - dataByteArray); - break; + + QUuid nodeUUID; + SharedNodePointer matchedNode = NodeList::getInstance()->nodeWithUUID(nodeUUID); + + if (matchedNode) { + // PacketType_JURISDICTION, first byte is the node type... + switch (dataByteArray[headerBytes]) { + case NodeType::VoxelServer: + _scriptEngine.getVoxelsScriptingInterface()->getJurisdictionListener()->queueReceivedPacket(matchedNode, + dataByteArray); + break; + case NodeType::ParticleServer: + _scriptEngine.getParticlesScriptingInterface()->getJurisdictionListener()->queueReceivedPacket(matchedNode, + dataByteArray); + break; + } } + } else if (datagramPacketType == PacketTypeParticleAddResponse) { // this will keep creatorTokenIDs to IDs mapped correctly Particle::handleAddParticleResponse(dataByteArray); diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 90e2810f27..e9c0aafabb 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -279,9 +279,7 @@ void AudioMixer::run() { prepareMixForListeningNode(node.data()); memcpy(clientPacket + numBytesPacketHeader, _clientSamples, sizeof(_clientSamples)); - nodeList->getNodeSocket().writeDatagram((char*) clientPacket, sizeof(clientPacket), - node->getActiveSocket()->getAddress(), - node->getActiveSocket()->getPort()); + nodeList->writeDatagram((char*) clientPacket, sizeof(clientPacket), node); } } diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index ecf9bfe4b2..5b085fbcd2 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -73,9 +73,7 @@ void broadcastAvatarData() { avatarByteArray.append(nodeData->toByteArray()); if (avatarByteArray.size() + mixedAvatarByteArray.size() > MAX_PACKET_SIZE) { - nodeList->getNodeSocket().writeDatagram(mixedAvatarByteArray, - node->getActiveSocket()->getAddress(), - node->getActiveSocket()->getPort()); + nodeList->writeDatagram(mixedAvatarByteArray, node); // reset the packet mixedAvatarByteArray.resize(numPacketHeaderBytes); @@ -86,9 +84,7 @@ void broadcastAvatarData() { } } - nodeList->getNodeSocket().writeDatagram(mixedAvatarByteArray, - node->getActiveSocket()->getAddress(), - node->getActiveSocket()->getPort()); + nodeList->writeDatagram(mixedAvatarByteArray, node); } } } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index a016553e5f..5672cd7cac 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -142,15 +142,11 @@ int OctreeSendThread::handlePacketSend(Node* node, OctreeQueryNode* nodeData, in } // actually send it - NodeList::getInstance()->getNodeSocket().writeDatagram((char*) statsMessage, statsMessageLength, - nodeAddress->getAddress(), - nodeAddress->getPort()); + NodeList::getInstance()->writeDatagram((char*) statsMessage, statsMessageLength, SharedNodePointer(node)); packetSent = true; } else { // not enough room in the packet, send two packets - NodeList::getInstance()->getNodeSocket().writeDatagram((char*) statsMessage, statsMessageLength, - nodeAddress->getAddress(), - nodeAddress->getPort()); + NodeList::getInstance()->writeDatagram((char*) statsMessage, statsMessageLength, SharedNodePointer(node)); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since // there was nothing else to send. @@ -168,9 +164,8 @@ int OctreeSendThread::handlePacketSend(Node* node, OctreeQueryNode* nodeData, in truePacketsSent++; packetsSent++; - NodeList::getInstance()->getNodeSocket().writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), - nodeAddress->getAddress(), - nodeAddress->getPort()); + NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), + SharedNodePointer(node)); packetSent = true; @@ -189,9 +184,8 @@ int OctreeSendThread::handlePacketSend(Node* node, OctreeQueryNode* nodeData, in // If there's actually a packet waiting, then send it. if (nodeData->isPacketWaiting()) { // just send the voxel packet - NodeList::getInstance()->getNodeSocket().writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), - nodeAddress->getAddress(), - nodeAddress->getPort()); + NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), + SharedNodePointer(node)); packetSent = true; int thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength(); diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 6e58a0a987..10dc22fa96 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -462,6 +462,11 @@ void OctreeServer::processDatagram(const QByteArray& dataByteArray, const HifiSo NodeList* nodeList = NodeList::getInstance(); PacketType packetType = packetTypeForPacket(dataByteArray); + + QUuid nodeUUID; + deconstructPacketHeader(dataByteArray, nodeUUID); + + SharedNodePointer matchingNode = nodeList->nodeWithUUID(nodeUUID); if (packetType == getMyQueryMessageType()) { bool debug = false; @@ -471,27 +476,24 @@ void OctreeServer::processDatagram(const QByteArray& dataByteArray, const HifiSo // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. - QUuid nodeUUID; - deconstructPacketHeader(dataByteArray, nodeUUID); - SharedNodePointer node = nodeList->nodeWithUUID(nodeUUID); - if (node) { - nodeList->updateNodeWithData(node.data(), senderSockAddr, dataByteArray); - if (!node->getActiveSocket()) { + if (matchingNode) { + nodeList->updateNodeWithData(matchingNode.data(), senderSockAddr, dataByteArray); + if (!matchingNode->getActiveSocket()) { // we don't have an active socket for this node, but they're talking to us // this means they've heard from us and can reply, let's assume public is active - node->activatePublicSocket(); + matchingNode->activatePublicSocket(); } - OctreeQueryNode* nodeData = (OctreeQueryNode*) node->getLinkedData(); + OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { nodeData->initializeOctreeSendThread(this, nodeUUID); } } } else if (packetType == PacketTypeJurisdictionRequest) { - _jurisdictionSender->queueReceivedPacket(senderSockAddr, dataByteArray); + _jurisdictionSender->queueReceivedPacket(matchingNode, dataByteArray); } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { - _octreeInboundPacketProcessor->queueReceivedPacket(senderSockAddr, dataByteArray); + _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, dataByteArray); } else { // let processNodeData handle it. NodeList::getInstance()->processNodeData(senderSockAddr, dataByteArray); diff --git a/assignment-client/src/particles/ParticleServer.cpp b/assignment-client/src/particles/ParticleServer.cpp index 9344d8c4ae..db546f5960 100644 --- a/assignment-client/src/particles/ParticleServer.cpp +++ b/assignment-client/src/particles/ParticleServer.cpp @@ -63,9 +63,7 @@ void ParticleServer::particleCreated(const Particle& newParticle, Node* node) { copyAt += sizeof(particleID); packetLength += sizeof(particleID); - NodeList::getInstance()->getNodeSocket().writeDatagram((char*) outputBuffer, packetLength, - node->getActiveSocket()->getAddress(), - node->getActiveSocket()->getPort()); + NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, SharedNodePointer(node)); } @@ -104,9 +102,7 @@ int ParticleServer::sendSpecialPacket(Node* node) { //qDebug() << "sending PacketType_PARTICLE_ERASE packetLength:" << packetLength; - NodeList::getInstance()->getNodeSocket().writeDatagram((char*) outputBuffer, packetLength, - node->getActiveSocket()->getAddress(), - node->getActiveSocket()->getPort()); + NodeList::getInstance()->writeDatagram((char*) outputBuffer, packetLength, SharedNodePointer(node)); } nodeData->setLastDeletedParticlesSentAt(deletePacketSentAt); diff --git a/assignment-client/src/voxels/VoxelServer.cpp b/assignment-client/src/voxels/VoxelServer.cpp index b71bcd3dc2..1edec370bc 100644 --- a/assignment-client/src/voxels/VoxelServer.cpp +++ b/assignment-client/src/voxels/VoxelServer.cpp @@ -46,9 +46,7 @@ int VoxelServer::sendSpecialPacket(Node* node) { envPacketLength += getEnvironmentData(i)->getBroadcastData(_tempOutputBuffer + envPacketLength); } - NodeList::getInstance()->getNodeSocket().writeDatagram((char*) _tempOutputBuffer, envPacketLength, - node->getActiveSocket()->getAddress(), - node->getActiveSocket()->getPort()); + NodeList::getInstance()->writeDatagram((char*) _tempOutputBuffer, envPacketLength, SharedNodePointer(node)); return envPacketLength; } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c492fc8fc9..bd7f57d595 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2543,10 +2543,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node int packetLength = endOfVoxelQueryPacket - voxelQueryPacket; // make sure we still have an active socket - if (node->getActiveSocket()) { - nodeList->getNodeSocket().writeDatagram((char*) voxelQueryPacket, packetLength, - node->getActiveSocket()->getAddress(), node->getActiveSocket()->getPort()); - } + nodeList->writeDatagram(reinterpret_cast(voxelQueryPacket), packetLength, node); // Feed number of bytes to corresponding channel of the bandwidth meter _bandwidthMeter.outputStream(BandwidthMeter::VOXELS).updateValue(packetLength); diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 3689c4462e..4acda2fe9b 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -409,10 +409,9 @@ void Audio::handleAudioInput() { memcpy(currentPacketPtr, &headOrientation, sizeof(headOrientation)); currentPacketPtr += sizeof(headOrientation); - nodeList->getNodeSocket().writeDatagram(monoAudioDataPacket, - NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL + leadingBytes, - audioMixer->getActiveSocket()->getAddress(), - audioMixer->getActiveSocket()->getPort()); + nodeList->writeDatagram(monoAudioDataPacket, + NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL + leadingBytes, + audioMixer); Application::getInstance()->getBandwidthMeter()->outputStream(BandwidthMeter::AUDIO) .updateValue(NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL + leadingBytes); diff --git a/interface/src/DatagramProcessor.cpp b/interface/src/DatagramProcessor.cpp index 64cd2f618e..f0cd2eb168 100644 --- a/interface/src/DatagramProcessor.cpp +++ b/interface/src/DatagramProcessor.cpp @@ -84,8 +84,16 @@ void DatagramProcessor::processDatagrams() { printf("got PacketType_VOXEL_DATA, sequence:%d flightTime:%d\n", sequence, flightTime); } - // add this packet to our list of voxel packets and process them on the voxel processing - application->_voxelProcessor.queueReceivedPacket(senderSockAddr, incomingPacket); + QUuid nodeUUID; + deconstructPacketHeader(incomingPacket, nodeUUID); + + SharedNodePointer matchedNode = NodeList::getInstance()->nodeWithUUID(nodeUUID); + + if (matchedNode) { + // add this packet to our list of voxel packets and process them on the voxel processing + application->_voxelProcessor.queueReceivedPacket(matchedNode, incomingPacket); + } + break; } case PacketTypeMetavoxelData: diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 311c8f2556..60d56b8ba8 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -226,10 +226,7 @@ void MetavoxelClient::receivedData(const QByteArray& data) { void MetavoxelClient::sendData(const QByteArray& data) { QMutexLocker locker(&_node->getMutex()); - const HifiSockAddr* address = _node->getActiveSocket(); - if (address) { - NodeList::getInstance()->getNodeSocket().writeDatagram(data, address->getAddress(), address->getPort()); - } + NodeList::getInstance()->writeDatagram(data, _node); } void MetavoxelClient::readPacket(Bitstream& in) { diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 325cd06639..6dd7342eba 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -95,9 +95,7 @@ void AudioInjector::injectAudio() { if (audioMixer && nodeList->getNodeActiveSocketOrPing(audioMixer.data())) { // send off this audio packet - nodeList->getNodeSocket().writeDatagram(injectAudioPacket, - audioMixer->getActiveSocket()->getAddress(), - audioMixer->getActiveSocket()->getPort()); + nodeList->writeDatagram(injectAudioPacket, audioMixer); } currentSendPosition += bytesToCopy; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 21e2042487..5c3c9ad9af 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -74,7 +74,7 @@ class AvatarData : public NodeData { Q_PROPERTY(float headPitch READ getHeadPitch WRITE setHeadPitch) Q_PROPERTY(QUrl faceModelURL READ getFaceModelURL WRITE setFaceModelURL) - Q_PROPERTY(QURl skeletonModelURL READ getSkeletonModelURL WRITE setSkeletonModelURL) + Q_PROPERTY(QUrl skeletonModelURL READ getSkeletonModelURL WRITE setSkeletonModelURL) public: AvatarData(); ~AvatarData(); diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp index d2c24021ac..4d17536313 100644 --- a/libraries/octree/src/JurisdictionListener.cpp +++ b/libraries/octree/src/JurisdictionListener.cpp @@ -46,8 +46,7 @@ bool JurisdictionListener::queueJurisdictionRequest() { foreach (const SharedNodePointer& node, nodeList->getNodeHash()) { if (nodeList->getNodeActiveSocketOrPing(node.data()) && node->getType() == getNodeType()) { - const HifiSockAddr* nodeAddress = node->getActiveSocket(); - _packetSender.queuePacketForSending(*nodeAddress, QByteArray(reinterpret_cast(bufferOut), sizeOut)); + _packetSender.queuePacketForSending(node, QByteArray(reinterpret_cast(bufferOut), sizeOut)); nodeCount++; } } diff --git a/libraries/octree/src/JurisdictionSender.cpp b/libraries/octree/src/JurisdictionSender.cpp index 854496e40f..c540123a8c 100644 --- a/libraries/octree/src/JurisdictionSender.cpp +++ b/libraries/octree/src/JurisdictionSender.cpp @@ -65,8 +65,7 @@ bool JurisdictionSender::process() { SharedNodePointer node = NodeList::getInstance()->nodeWithUUID(nodeUUID); if (node && node->getActiveSocket() != NULL) { - const HifiSockAddr* nodeAddress = node->getActiveSocket(); - _packetSender.queuePacketForSending(*nodeAddress, QByteArray(reinterpret_cast(bufferOut), sizeOut)); + _packetSender.queuePacketForSending(node, QByteArray(reinterpret_cast(bufferOut), sizeOut)); nodeCount++; } } diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 5b84b819cc..f7b60b3d3f 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -92,8 +92,7 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned c if (node->getType() == getMyNodeType() && ((node->getUUID() == nodeUUID) || (nodeUUID.isNull()))) { if (nodeList->getNodeActiveSocketOrPing(node.data())) { - const HifiSockAddr* nodeAddress = node->getActiveSocket(); - queuePacketForSending(*nodeAddress, QByteArray(reinterpret_cast(buffer), length)); + queuePacketForSending(node, QByteArray(reinterpret_cast(buffer), length)); // debugging output... bool wantDebugging = false; diff --git a/libraries/shared/src/NetworkPacket.cpp b/libraries/shared/src/NetworkPacket.cpp index aacd95dbbf..e63226bd3a 100644 --- a/libraries/shared/src/NetworkPacket.cpp +++ b/libraries/shared/src/NetworkPacket.cpp @@ -14,9 +14,9 @@ #include "NetworkPacket.h" -void NetworkPacket::copyContents(const HifiSockAddr& sockAddr, const QByteArray& packet) { +void NetworkPacket::copyContents(const SharedNodePointer& destinationNode, const QByteArray& packet) { if (packet.size() && packet.size() <= MAX_PACKET_SIZE) { - _sockAddr = sockAddr; + _destinationNode = destinationNode; _byteArray = packet; } else { qDebug(">>> NetworkPacket::copyContents() unexpected length = %d", packet.size()); @@ -24,28 +24,28 @@ void NetworkPacket::copyContents(const HifiSockAddr& sockAddr, const QByteArray& } NetworkPacket::NetworkPacket(const NetworkPacket& packet) { - copyContents(packet.getSockAddr(), packet.getByteArray()); + copyContents(packet.getDestinationNode(), packet.getByteArray()); } -NetworkPacket::NetworkPacket(const HifiSockAddr& sockAddr, const QByteArray& packet) { - copyContents(sockAddr, packet); +NetworkPacket::NetworkPacket(const SharedNodePointer& destinationNode, const QByteArray& packet) { + copyContents(destinationNode, packet); }; // copy assignment NetworkPacket& NetworkPacket::operator=(NetworkPacket const& other) { - copyContents(other.getSockAddr(), other.getByteArray()); + copyContents(other.getDestinationNode(), other.getByteArray()); return *this; } #ifdef HAS_MOVE_SEMANTICS // move, same as copy, but other packet won't be used further NetworkPacket::NetworkPacket(NetworkPacket && packet) { - copyContents(packet.getAddress(), packet.getByteArray()); + copyContents(packet.getDestinationNode(), packet.getByteArray()); } // move assignment NetworkPacket& NetworkPacket::operator=(NetworkPacket&& other) { - copyContents(other.getAddress(), other.getByteArray()); + copyContents(other.getDestinationNode(), other.getByteArray()); return *this; } #endif \ No newline at end of file diff --git a/libraries/shared/src/NetworkPacket.h b/libraries/shared/src/NetworkPacket.h index 480a793a49..ea3846da0a 100644 --- a/libraries/shared/src/NetworkPacket.h +++ b/libraries/shared/src/NetworkPacket.h @@ -33,15 +33,15 @@ public: NetworkPacket& operator= (NetworkPacket&& other); // move assignment #endif - NetworkPacket(const HifiSockAddr& sockAddr, const QByteArray& byteArray); + NetworkPacket(const SharedNodePointer& destinationNode, const QByteArray& byteArray); - const HifiSockAddr& getSockAddr() const { return _sockAddr; } + const SharedNodePointer& getDestinationNode() const { return _destinationNode; } const QByteArray& getByteArray() const { return _byteArray; } private: - void copyContents(const HifiSockAddr& sockAddr, const QByteArray& byteArray); + void copyContents(const SharedNodePointer& destinationNode, const QByteArray& byteArray); - HifiSockAddr _sockAddr; + SharedNodePointer _destinationNode; QByteArray _byteArray; }; diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index e357dd130e..474114697f 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -80,6 +80,37 @@ NodeList::~NodeList() { clear(); } +qint64 NodeList::writeDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr) { + + // setup the MD5 hash for source verification in the header + int numBytesPacketHeader = numBytesForPacketHeader(datagram); + QByteArray dataSecretHash = QCryptographicHash::hash(datagram.mid(numBytesPacketHeader) + + destinationNode->getConnectionSecret().toRfc4122(), + QCryptographicHash::Md5); + QByteArray datagramWithHash = datagram; + datagramWithHash.replace(numBytesPacketHeader - NUM_BYTES_MD5_HASH, NUM_BYTES_MD5_HASH, dataSecretHash); + + // if we don't have an ovveriden address, assume they want to send to the node's active socket + const HifiSockAddr* destinationSockAddr = &overridenSockAddr; + if (overridenSockAddr.isNull()) { + if (destinationNode->getActiveSocket()) { + // use the node's active socket as the destination socket + destinationSockAddr = destinationNode->getActiveSocket(); + } else { + // we don't have a socket to send to, return 0 + return 0; + } + } + + return _nodeSocket.writeDatagram(datagramWithHash, destinationSockAddr->getAddress(), destinationSockAddr->getPort()); +} + +qint64 NodeList::writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr) { + return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); +} + void NodeList::setDomainHostname(const QString& domainHostname) { if (domainHostname != _domainHostname) { diff --git a/libraries/shared/src/NodeList.h b/libraries/shared/src/NodeList.h index daac87da28..3710684dd8 100644 --- a/libraries/shared/src/NodeList.h +++ b/libraries/shared/src/NodeList.h @@ -76,6 +76,11 @@ public: void setSessionUUID(const QUuid& sessionUUID); QUdpSocket& getNodeSocket() { return _nodeSocket; } + + qint64 writeDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr = HifiSockAddr()); + qint64 writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr = HifiSockAddr()); void(*linkedDataCreateCallback)(Node *); diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp index d350a8335c..99066cb66b 100644 --- a/libraries/shared/src/PacketHeaders.cpp +++ b/libraries/shared/src/PacketHeaders.cpp @@ -69,13 +69,20 @@ int populatePacketHeader(char* packet, PacketType type, const QUuid& connectionU int numTypeBytes = packArithmeticallyCodedValue(type, packet); packet[numTypeBytes] = versionForPacketType(type); + char* position = packet + numTypeBytes + sizeof(PacketVersion); + QUuid packUUID = connectionUUID.isNull() ? NodeList::getInstance()->getSessionUUID() : connectionUUID; QByteArray rfcUUID = packUUID.toRfc4122(); - memcpy(packet + numTypeBytes + sizeof(PacketVersion), rfcUUID.constData(), NUM_BYTES_RFC4122_UUID); + memcpy(position, rfcUUID.constData(), NUM_BYTES_RFC4122_UUID); + position += NUM_BYTES_RFC4122_UUID; + + // pack 16 bytes of zeros where the md5 hash will be placed one data is packed + memset(position, 0, NUM_BYTES_MD5_HASH); + position += NUM_BYTES_MD5_HASH; // return the number of bytes written for pointer pushing - return numTypeBytes + sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID; + return position - packet; } bool packetVersionMatch(const QByteArray& packet) { @@ -101,16 +108,16 @@ bool packetVersionMatch(const QByteArray& packet) { int numBytesForPacketHeader(const QByteArray& packet) { // returns the number of bytes used for the type, version, and UUID - return numBytesArithmeticCodingFromBuffer(packet.data()) + sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID; + return numBytesArithmeticCodingFromBuffer(packet.data()) + NUM_STATIC_HEADER_BYTES; } int numBytesForPacketHeader(const char* packet) { // returns the number of bytes used for the type, version, and UUID - return numBytesArithmeticCodingFromBuffer(packet) + sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID; + return numBytesArithmeticCodingFromBuffer(packet) + NUM_STATIC_HEADER_BYTES; } int numBytesForPacketHeaderGivenPacketType(PacketType type) { - return (int) ceilf((float)type / 255) + sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID; + return (int) ceilf((float)type / 255) + NUM_STATIC_HEADER_BYTES; } void deconstructPacketHeader(const QByteArray& packet, QUuid& senderUUID) { diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index 48d5175bd6..691dee861b 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -12,6 +12,7 @@ #ifndef hifi_PacketHeaders_h #define hifi_PacketHeaders_h +#include #include #include "UUID.h" @@ -57,7 +58,9 @@ enum PacketType { typedef char PacketVersion; -const int MAX_PACKET_HEADER_BYTES = sizeof(PacketType) + sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID;; +const int NUM_BYTES_MD5_HASH = 16; +const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID + NUM_BYTES_MD5_HASH; +const int MAX_PACKET_HEADER_BYTES = sizeof(PacketType) + NUM_STATIC_HEADER_BYTES; PacketVersion versionForPacketType(PacketType type); diff --git a/libraries/shared/src/PacketSender.cpp b/libraries/shared/src/PacketSender.cpp index 8a031cbc39..9d819b96d7 100644 --- a/libraries/shared/src/PacketSender.cpp +++ b/libraries/shared/src/PacketSender.cpp @@ -47,8 +47,8 @@ PacketSender::~PacketSender() { } -void PacketSender::queuePacketForSending(const HifiSockAddr& address, const QByteArray& packet) { - NetworkPacket networkPacket(address, packet); +void PacketSender::queuePacketForSending(const SharedNodePointer& destinationNode, const QByteArray& packet) { + NetworkPacket networkPacket(destinationNode, packet); lock(); _packets.push_back(networkPacket); unlock(); @@ -263,9 +263,7 @@ bool PacketSender::nonThreadedProcess() { unlock(); // send the packet through the NodeList... - NodeList::getInstance()->getNodeSocket().writeDatagram(temporary.getByteArray(), - temporary.getSockAddr().getAddress(), - temporary.getSockAddr().getPort()); + NodeList::getInstance()->writeDatagram(temporary.getByteArray(), temporary.getDestinationNode()); packetsSentThisCall++; _packetsOverCheckInterval++; _totalPacketsSent++; diff --git a/libraries/shared/src/PacketSender.h b/libraries/shared/src/PacketSender.h index 4a1e62bd0c..9a14db5bda 100644 --- a/libraries/shared/src/PacketSender.h +++ b/libraries/shared/src/PacketSender.h @@ -37,7 +37,7 @@ public: /// \param packetData pointer to data /// \param ssize_t packetLength size of data /// \thread any thread, typically the application thread - void queuePacketForSending(const HifiSockAddr& address, const QByteArray& packet); + void queuePacketForSending(const SharedNodePointer& destinationNode, const QByteArray& packet); void setPacketsPerSecond(int packetsPerSecond); int getPacketsPerSecond() const { return _packetsPerSecond; } diff --git a/libraries/shared/src/ReceivedPacketProcessor.cpp b/libraries/shared/src/ReceivedPacketProcessor.cpp index 5faec02ea1..25c97faf4b 100644 --- a/libraries/shared/src/ReceivedPacketProcessor.cpp +++ b/libraries/shared/src/ReceivedPacketProcessor.cpp @@ -16,14 +16,11 @@ ReceivedPacketProcessor::ReceivedPacketProcessor() { _dontSleep = false; } -void ReceivedPacketProcessor::queueReceivedPacket(const HifiSockAddr& address, const QByteArray& packet) { +void ReceivedPacketProcessor::queueReceivedPacket(const SharedNodePointer& destinationNode, const QByteArray& packet) { // Make sure our Node and NodeList knows we've heard from this node. - SharedNodePointer node = NodeList::getInstance()->nodeWithAddress(address); - if (node) { - node->setLastHeardMicrostamp(usecTimestampNow()); - } + destinationNode->setLastHeardMicrostamp(usecTimestampNow()); - NetworkPacket networkPacket(address, packet); + NetworkPacket networkPacket(destinationNode, packet); lock(); _packets.push_back(networkPacket); unlock(); @@ -44,7 +41,8 @@ bool ReceivedPacketProcessor::process() { NetworkPacket temporary = packet; // make a copy of the packet in case the vector is resized on us _packets.erase(_packets.begin()); // remove the oldest packet unlock(); // let others add to the packets - processPacket(temporary.getSockAddr(), temporary.getByteArray()); // process our temporary copy + processPacket(*temporary.getDestinationNode()->getActiveSocket(), + temporary.getByteArray()); // process our temporary copy } return isStillRunning(); // keep running till they terminate us } diff --git a/libraries/shared/src/ReceivedPacketProcessor.h b/libraries/shared/src/ReceivedPacketProcessor.h index dfb4ed55a9..bd3e6a405a 100644 --- a/libraries/shared/src/ReceivedPacketProcessor.h +++ b/libraries/shared/src/ReceivedPacketProcessor.h @@ -24,7 +24,7 @@ public: /// \param packetData pointer to received data /// \param ssize_t packetLength size of received data /// \thread network receive thread - void queueReceivedPacket(const HifiSockAddr& senderSockAddr, const QByteArray& packet); + void queueReceivedPacket(const SharedNodePointer& destinationNode, const QByteArray& packet); /// Are there received packets waiting to be processed bool hasPacketsToProcess() const { return _packets.size() > 0; }