diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index f474b1766b..fe4efb3de1 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -62,7 +62,9 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short NodeType::init(); // register the SharedNodePointer meta-type for signals/slots + qRegisterMetaType>(); qRegisterMetaType(); + firstCall = false; } @@ -175,24 +177,30 @@ void LimitedNodeList::changeSocketBufferSizes(int numBytes) { bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNodePointer& matchingNode) { - if (!NON_VERIFIED_PACKETS.contains(packet.getType()) && !NON_SOURCED_PACKETS.contains(packet.getType())) { + if (NON_SOURCED_PACKETS.contains(packet.getType())) { + return true; + } else { // figure out which node this is from matchingNode = nodeWithUUID(packet.getSourceID()); if (matchingNode) { - // check if the md5 hash in the header matches the hash we would expect - if (packet.getVerificationHash() == packet.payloadHashWithConnectionUUID(matchingNode->getConnectionSecret())) { - return true; - } else { - static QMultiMap hashDebugSuppressMap; - - const QUuid& senderID = packet.getSourceID(); + if (!NON_VERIFIED_PACKETS.contains(packet.getType())) { + // check if the md5 hash in the header matches the hash we would expect + if (packet.getVerificationHash() != packet.payloadHashWithConnectionUUID(matchingNode->getConnectionSecret())) { + static QMultiMap hashDebugSuppressMap; + + const QUuid& senderID = packet.getSourceID(); - if (!hashDebugSuppressMap.contains(senderID, packet.getType())) { - qCDebug(networking) << "Packet hash mismatch on" << packet.getType() << "- Sender" << senderID; + if (!hashDebugSuppressMap.contains(senderID, packet.getType())) { + qCDebug(networking) << "Packet hash mismatch on" << packet.getType() << "- Sender" << senderID; - hashDebugSuppressMap.insert(senderID, packet.getType()); + hashDebugSuppressMap.insert(senderID, packet.getType()); + } + + return false; } + + return true; } } else { static QString repeatedMessage @@ -201,8 +209,6 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod qCDebug(networking) << "Packet of type" << packet.getType() << "received from unknown node with UUID" << qPrintable(uuidStringWithoutCurlyBraces(packet.getSourceID())); } - } else { - return true; } return false; diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index db4322bccd..d1fabb1c15 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -30,8 +30,17 @@ qint64 NLPacket::localHeaderSize() const { } std::unique_ptr NLPacket::create(PacketType::Value type, qint64 size) { - auto packet = std::unique_ptr(new NLPacket(type, size)); + std::unique_ptr packet; + if (size == -1) { + packet = std::unique_ptr(new NLPacket(type)); + } else { + // Fail with invalid size + Q_ASSERT(size >= 0); + + packet = std::unique_ptr(new NLPacket(type, size)); + } + packet->open(QIODevice::WriteOnly); return packet; @@ -44,7 +53,7 @@ std::unique_ptr NLPacket::fromReceivedPacket(std::unique_ptr dat // Fail with invalid size Q_ASSERT(size >= 0); - + // allocate memory auto packet = std::unique_ptr(new NLPacket(std::move(data), size, senderSockAddr)); @@ -64,7 +73,22 @@ std::unique_ptr NLPacket::createCopy(const NLPacket& other) { return packet; } -NLPacket::NLPacket(PacketType::Value type, qint64 size) : Packet(type, localHeaderSize(type) + size) { +NLPacket::NLPacket(PacketType::Value type, qint64 size) : + Packet(type, localHeaderSize(type) + size) +{ + Q_ASSERT(size >= 0); + + qint64 headerSize = localHeaderSize(type); + _payloadStart += headerSize; + _capacity -= headerSize; +} + +NLPacket::NLPacket(PacketType::Value type) : + Packet(type, -1) +{ + qint64 headerSize = localHeaderSize(type); + _payloadStart += headerSize; + _capacity -= headerSize; } NLPacket::NLPacket(const NLPacket& other) : Packet(other) { diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index c11ca0790b..0c9d31c66e 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -12,6 +12,8 @@ #ifndef hifi_NLPacket_h #define hifi_NLPacket_h +#include + #include "udt/Packet.h" class NLPacket : public Packet { @@ -35,6 +37,7 @@ public: QByteArray payloadHashWithConnectionUUID(const QUuid& connectionUUID) const; protected: + NLPacket(PacketType::Value type); NLPacket(PacketType::Value type, qint64 size); NLPacket(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr); NLPacket(const NLPacket& other); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 69dc1052ac..2e6763dc3a 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -38,14 +38,6 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned _numNoReplyDomainCheckIns(0), _assignmentServerSocket() { - static bool firstCall = true; - if (firstCall) { - NodeType::init(); - // register the SharedNodePointer meta-type for signals/slots - qRegisterMetaType(); - firstCall = false; - } - setCustomDeleter([](Dependency* dependency){ static_cast(dependency)->deleteLater(); }); diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 06b61a3391..7af4905834 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -21,7 +21,7 @@ PacketReceiver::PacketReceiver(QObject* parent) : QObject(parent), _packetListenerMap() { - + qRegisterMetaType>(); } void PacketReceiver::registerListenerForTypes(const QSet& types, PacketListener* listener, const char* slot) { @@ -206,7 +206,7 @@ void PacketReceiver::processDatagrams() { _inByteCount += packetSizeWithHeader; if (packetVersionMatch(*packet)) { - + SharedNodePointer matchingNode; if (nodeList->packetSourceAndHashMatch(*packet, matchingNode)) { @@ -227,6 +227,7 @@ void PacketReceiver::processDatagrams() { if (listener.first) { bool success = false; + PacketType::Value packetType = packet->getType(); if (matchingNode) { // if this was a sequence numbered packet we should store the last seq number for @@ -238,12 +239,20 @@ void PacketReceiver::processDatagrams() { emit dataReceived(matchingNode->getType(), packet->getSizeWithHeader()); QMetaMethod metaMethod = listener.second; - static const QByteArray SHARED_NODE_NORMALIZED = QMetaObject::normalizedType("QSharedPointer"); + static const QByteArray QSHAREDPOINTER_NODE_NORMALIZED = QMetaObject::normalizedType("QSharedPointer"); + static const QByteArray SHARED_NODE_NORMALIZED = QMetaObject::normalizedType("SharedNodePointer"); if (metaMethod.parameterTypes().contains(SHARED_NODE_NORMALIZED)) { + qDebug() << "invoking with matchingNode" << matchingNode; success = metaMethod.invoke(listener.first, - Q_ARG(QSharedPointer, QSharedPointer(packet.release())), - Q_ARG(SharedNodePointer, matchingNode)); + Q_ARG(QSharedPointer, QSharedPointer(packet.release())), + Q_ARG(SharedNodePointer, matchingNode)); + + } else if (metaMethod.parameterTypes().contains(QSHAREDPOINTER_NODE_NORMALIZED)) { + qDebug() << "invoking with matchingNode" << matchingNode; + success = metaMethod.invoke(listener.first, + Q_ARG(QSharedPointer, QSharedPointer(packet.release())), + Q_ARG(QSharedPointer, matchingNode)); } else { success = metaMethod.invoke(listener.first, @@ -257,13 +266,15 @@ void PacketReceiver::processDatagrams() { } if (!success) { - qDebug() << "Error delivering packet " << nameForPacketType(packet->getType()) << " to listener: " - << listener.first->objectName() << "::" << listener.second.name(); + qDebug().nospace() << "Error delivering packet " << packetType + << " (" << qPrintable(nameForPacketType(packetType)) << ") to listener " + << listener.first << "::" << qPrintable(listener.second.methodSignature()); } } else { // we have a dead listener - remove this mapping from the _packetListenerMap - qDebug() << "Listener for packet type" << nameForPacketType(packet->getType()) + qDebug() << "Listener for packet type" << packet->getType() << "(" + << qPrintable(nameForPacketType(packet->getType())) << ")" << "has been destroyed - removing mapping."; _packetListenerMap.erase(it); } diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 55c51d7665..f96de7a20b 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -192,7 +192,7 @@ void Packet::writeSequenceNumber(SequenceNumber seqNum) { static const qint64 PACKET_WRITE_ERROR = -1; qint64 Packet::writeData(const char* data, qint64 maxSize) { // make sure we have the space required to write this block - if (maxSize <= bytesAvailable()) { + if (maxSize <= bytesAvailableForWrite()) { qint64 currentPos = pos(); // good to go - write the data @@ -202,7 +202,7 @@ qint64 Packet::writeData(const char* data, qint64 maxSize) { seek(currentPos + maxSize); // keep track of _sizeUsed so we can just write the actual data when packet is about to be sent - _sizeUsed = std::max(pos() + 1, _sizeUsed); + _sizeUsed = std::max(pos(), _sizeUsed); // return the number of bytes written return maxSize; diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 3d64c814aa..1e18dde117 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -49,10 +49,12 @@ public: PacketVersion getVersion() const { return _version; } - qint64 getSizeWithHeader() const { return localHeaderSize() + getSizeUsed(); } + qint64 getSizeWithHeader() const { return totalHeadersSize() + getSizeUsed(); } qint64 getSizeUsed() const { return _sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } + qint64 bytesAvailableForWrite() const { return _capacity - _sizeUsed; } + HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } const HifiSockAddr& getSenderSockAddr() const { return _senderSockAddr; } diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 0085a0e64d..211677f6a6 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -18,7 +18,6 @@ using namespace PacketType; const QSet NON_VERIFIED_PACKETS = QSet() - << CreateAssignment << RequestAssignment << StunResponse << NodeJsonStats << EntityQuery << OctreeDataNack << EntityEditNack << DomainListRequest @@ -28,6 +27,7 @@ const QSet NON_VERIFIED_PACKETS = QSet() const QSet SEQUENCE_NUMBERED_PACKETS = QSet() << AvatarData; const QSet NON_SOURCED_PACKETS = QSet() + << StunResponse << CreateAssignment << RequestAssignment << DomainServerRequireDTLS << DomainConnectRequest << DomainList << DomainConnectionDenied << DomainServerPathQuery << DomainServerPathResponse diff --git a/libraries/networking/src/udt/PacketList.cpp b/libraries/networking/src/udt/PacketList.cpp index 43e0b2a4ea..e48ffa0f69 100644 --- a/libraries/networking/src/udt/PacketList.cpp +++ b/libraries/networking/src/udt/PacketList.cpp @@ -15,7 +15,10 @@ #include "Packet.h" -PacketList::PacketList(PacketType::Value packetType) : _packetType(packetType) { +PacketList::PacketList(PacketType::Value packetType) : + _packetType(packetType) +{ + QIODevice::open(WriteOnly); } void PacketList::startSegment() {