diff --git a/avatar-mixer/src/main.cpp b/avatar-mixer/src/main.cpp index c623c07d6b..f2fd031526 100644 --- a/avatar-mixer/src/main.cpp +++ b/avatar-mixer/src/main.cpp @@ -93,7 +93,7 @@ int main(int argc, const char* argv[]) { } if (nodeList->getNodeSocket()->receive(nodeAddress, packetData, &receivedBytes) && - versionForPacketType(packetData[0]) == packetData[1]) { + packetVersionMatch(packetData)) { switch (packetData[0]) { case PACKET_TYPE_HEAD_DATA: // grab the node ID from the packet @@ -119,7 +119,7 @@ int main(int argc, const char* argv[]) { break; case PACKET_TYPE_AVATAR_VOXEL_URL: // grab the node ID from the packet - unpackNodeId(packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION), &nodeID); + unpackNodeId(packetData + numBytesForPacketHeader(packetData), &nodeID); // let everyone else know about the update for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) { diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 1911fb7dd4..065aa5e621 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -87,12 +87,14 @@ int main(int argc, const char * argv[]) while (true) { if (nodeList->getNodeSocket()->receive((sockaddr *)&nodePublicAddress, packetData, &receivedBytes) && (packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_TYPE_DOMAIN_LIST_REQUEST) && - versionForPacketType(packetData[0]) == packetData[1]) { + packetVersionMatch(packetData)) { // this is an RFD or domain list request packet, and there is a version match std::map<char, Node *> newestSoloNodes; + int numBytesSenderHeader = numBytesForPacketHeader(packetData); + nodeType = packetData[1]; - int numBytesSocket = unpackSocket(packetData + numHeaderBytes + sizeof(NODE_TYPE), + int numBytesSocket = unpackSocket(packetData + numBytesSenderHeader + sizeof(NODE_TYPE), (sockaddr*) &nodeLocalAddress); sockaddr* destinationSocket = (sockaddr*) &nodePublicAddress; @@ -110,18 +112,18 @@ int main(int argc, const char * argv[]) } Node* newNode = nodeList->addOrUpdateNode((sockaddr*) &nodePublicAddress, - (sockaddr*) &nodeLocalAddress, - nodeType, - nodeList->getLastNodeID()); + (sockaddr*) &nodeLocalAddress, + nodeType, + nodeList->getLastNodeID()); if (newNode->getNodeID() == nodeList->getLastNodeID()) { nodeList->increaseNodeID(); } - currentBufferPos = broadcastPacket + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); + currentBufferPos = broadcastPacket + numHeaderBytes; startPointer = currentBufferPos; - unsigned char* nodeTypesOfInterest = packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION) + sizeof(NODE_TYPE) + unsigned char* nodeTypesOfInterest = packetData + numBytesSenderHeader + sizeof(NODE_TYPE) + numBytesSocket + sizeof(unsigned char); int numInterestTypes = *(nodeTypesOfInterest - 1); @@ -174,8 +176,8 @@ int main(int argc, const char * argv[]) // send the constructed list back to this node nodeList->getNodeSocket()->send(destinationSocket, - broadcastPacket, - (currentBufferPos - startPointer) + 1); + broadcastPacket, + (currentBufferPos - startPointer) + 1); } if (Logstash::shouldSendStats()) { diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index bce010e265..43314b290c 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -287,7 +287,7 @@ int NodeList::processDomainServerList(unsigned char* packetData, size_t dataByte sockaddr_in nodeLocalSocket; nodeLocalSocket.sin_family = AF_INET; - unsigned char* readPtr = packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); + unsigned char* readPtr = packetData + numBytesForPacketHeader(packetData); unsigned char* startPtr = packetData; while((readPtr - startPtr) < dataBytes - sizeof(uint16_t)) { diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp index f892afc124..7188ea8179 100644 --- a/libraries/shared/src/PacketHeaders.cpp +++ b/libraries/shared/src/PacketHeaders.cpp @@ -16,10 +16,40 @@ PACKET_VERSION versionForPacketType(PACKET_TYPE type) { } } -int populateTypeAndVersion(unsigned char* destination, PACKET_TYPE type) { - destination[0] = type; - destination[1] = versionForPacketType(type); +bool packetVersionMatch(unsigned char* packetHeader) { + // currently this just checks if the version in the packet matches our return from versionForPacketType + // may need to be expanded in the future for types and versions that take > than 1 byte + return packetHeader[1] == versionForPacketType(packetHeader[0]); +} + +int populateTypeAndVersion(unsigned char* destinationHeader, PACKET_TYPE type) { + destinationHeader[0] = type; + destinationHeader[1] = versionForPacketType(type); // return the number of bytes written for pointer pushing return 2; +} + +int numBytesForPacketType(const unsigned char* packetType) { + if (packetType[0] == 255) { + return 1 + numBytesForPacketType(packetType + 1); + } else { + return 1; + } +} + +int numBytesForPacketVersion(const unsigned char* packetVersion) { + if (packetVersion[0] == 255) { + return 1 + numBytesForPacketVersion(packetVersion + 1); + } else { + return 1; + } +} + +int numBytesForPacketHeader(unsigned char* packetHeader) { + // int numBytesType = numBytesForPacketType(packetHeader); + // return numBytesType + numBytesForPacketVersion(packetHeader + numBytesType); + + // currently this need not be dynamic - there are 2 bytes for each packet header + return 2; } \ No newline at end of file diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index d521dda605..041303f2b5 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -38,7 +38,10 @@ typedef char PACKET_VERSION; PACKET_VERSION versionForPacketType(PACKET_TYPE type); -int populateTypeAndVersion(unsigned char* destination, PACKET_TYPE type); +bool packetVersionMatch(unsigned char* packetHeader); + +int populateTypeAndVersion(unsigned char* destinationHeader, PACKET_TYPE type); +int numBytesForPacketHeader(unsigned char* packetHeader); const int MAX_PACKET_HEADER_BYTES = sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION);