From 2f030757509a5c72c2197312847f35d4afd6c6ac Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 23 Jul 2015 15:57:31 -0700 Subject: [PATCH] repairs to type/version header write --- libraries/networking/src/LimitedNodeList.cpp | 8 ++++++-- libraries/networking/src/NLPacket.cpp | 18 ++++++++++++------ libraries/networking/src/NLPacket.h | 2 +- libraries/networking/src/udt/PacketHeaders.cpp | 3 ++- libraries/networking/src/udt/Socket.cpp | 2 +- 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 66165a95cc..edfdd682e9 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -624,6 +624,7 @@ void LimitedNodeList::processSTUNResponse(std::unique_ptr packe // enumerate the attributes to find XOR_MAPPED_ADDRESS_TYPE while (attributeStartIndex < packet->getDataSize()) { + if (memcmp(packet->getData() + attributeStartIndex, &XOR_MAPPED_ADDRESS_TYPE, sizeof(XOR_MAPPED_ADDRESS_TYPE)) == 0) { const int NUM_BYTES_STUN_ATTR_TYPE_AND_LENGTH = 4; const int NUM_BYTES_FAMILY_ALIGN = 1; @@ -651,8 +652,8 @@ void LimitedNodeList::processSTUNResponse(std::unique_ptr packe uint32_t stunAddress = ntohl(xorMappedAddress) ^ ntohl(RFC_5389_MAGIC_COOKIE_NETWORK_ORDER); - QHostAddress newPublicAddress = QHostAddress(stunAddress); - + QHostAddress newPublicAddress(stunAddress); + if (newPublicAddress != _publicSockAddr.getAddress() || newPublicPort != _publicSockAddr.getPort()) { _publicSockAddr = HifiSockAddr(newPublicAddress, newPublicPort); @@ -669,6 +670,9 @@ void LimitedNodeList::processSTUNResponse(std::unique_ptr packe flagTimeForConnectionStep(ConnectionStep::SetPublicSocketFromSTUN); } + + // we're done reading the packet so we can return now + return; } } else { // push forward attributeStartIndex by the length of this attribute diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 3660ac9ba2..47f36792ad 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -95,6 +95,8 @@ NLPacket::NLPacket(PacketType type, qint64 size, bool isReliable, bool isPartOfM Q_ASSERT(size >= 0); adjustPayloadStartAndCapacity(); + + writeTypeAndVersion(); } NLPacket::NLPacket(std::unique_ptr packet) : @@ -146,11 +148,13 @@ NLPacket& NLPacket::operator=(NLPacket&& other) { } PacketType NLPacket::typeInHeader(const udt::Packet& packet) { - return *reinterpret_cast(packet.getData()); + auto headerOffset = packet.Packet::localHeaderSize(); + return *reinterpret_cast(packet.getData() + headerOffset); } PacketVersion NLPacket::versionInHeader(const udt::Packet& packet) { - return *reinterpret_cast(packet.getData() + sizeof(PacketType)); + auto headerOffset = packet.Packet::localHeaderSize(); + return *reinterpret_cast(packet.getData() + headerOffset + sizeof(PacketType)); } QUuid NLPacket::sourceIDInHeader(const udt::Packet& packet) { @@ -177,13 +181,15 @@ QByteArray NLPacket::hashForPacketAndSecret(const udt::Packet& packet, const QUu return hash.result(); } -void NLPacket::writePacketTypeAndVersion() { +void NLPacket::writeTypeAndVersion() { + auto headerOffset = Packet::localHeaderSize(); + // Pack the packet type - memcpy(_packet.get(), &_type, sizeof(PacketType)); + memcpy(_packet.get() + headerOffset, &_type, sizeof(PacketType)); // Pack the packet version auto version = versionForPacketType(_type); - memcpy(_packet.get() + sizeof(PacketType), &version, sizeof(version)); + memcpy(_packet.get() + headerOffset + sizeof(PacketType), &version, sizeof(version)); } void NLPacket::setType(PacketType type) { @@ -192,7 +198,7 @@ void NLPacket::setType(PacketType type) { _type = type; _version = versionForPacketType(_type); - writePacketTypeAndVersion(); + writeTypeAndVersion(); // Setting new packet type with a different header size not currently supported Q_ASSERT(currentHeaderSize == totalHeadersSize()); diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index 11ec40a294..3309032e68 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -66,7 +66,7 @@ protected: NLPacket& operator=(NLPacket&& other); // Header writers - void writePacketTypeAndVersion(); + void writeTypeAndVersion(); // Header readers, used to set member variables after getting a packet from the network void readType(); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index f3d3042b34..50586e1057 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -134,5 +134,6 @@ uint qHash(const PacketType& key, uint seed) { } QDebug operator<<(QDebug debug, const PacketType& type) { - return debug.nospace() << (uint8_t) type << " (" << qPrintable(nameForPacketType(type)) << ")"; + debug.nospace() << (uint8_t) type << " (" << qPrintable(nameForPacketType(type)) << ")"; + return debug.space(); } diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index 25afb5424d..aa5085de04 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -83,7 +83,7 @@ void Socket::readPendingDatagrams() { // setup a buffer to read the packet into int packetSizeWithHeader = _udpSocket.pendingDatagramSize(); std::unique_ptr buffer = std::unique_ptr(new char[packetSizeWithHeader]); - + // pull the datagram _udpSocket.readDatagram(buffer.get(), packetSizeWithHeader, senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer());