From 047d5b5cab94dc5a1fd2f30349f9e78c67ca9768 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 11:17:29 -0700 Subject: [PATCH] add packet version handling for DS packets --- domain-server/src/main.cpp | 11 +++++++---- interface/src/Application.cpp | 2 +- libraries/shared/src/NodeList.cpp | 7 ++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 6fd5fae887..471f66b462 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -71,6 +71,7 @@ int main(int argc, const char * argv[]) unsigned char broadcastPacket[MAX_PACKET_SIZE]; broadcastPacket[0] = PACKET_HEADER_DOMAIN; + broadcastPacket[1] = packetVersion(broadcastPacket[0]); unsigned char* currentBufferPos; unsigned char* startPointer; @@ -86,11 +87,13 @@ int main(int argc, const char * argv[]) while (true) { if (nodeList->getNodeSocket()->receive((sockaddr *)&nodePublicAddress, packetData, &receivedBytes) && - (packetData[0] == PACKET_HEADER_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_HEADER_DOMAIN_LIST_REQUEST)) { + (packetData[0] == PACKET_HEADER_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_HEADER_DOMAIN_LIST_REQUEST) && + packetVersion(packetData[0]) == packetData[1]) { + // this is an RFD or domain list request packet, and there is a version match std::map newestSoloNodes; nodeType = packetData[1]; - int numBytesSocket = unpackSocket(packetData + sizeof(PACKET_HEADER) + sizeof(NODE_TYPE), + int numBytesSocket = unpackSocket(packetData + sizeof(PACKET_HEADER) + sizeof(PACKET_VERSION) + sizeof(NODE_TYPE), (sockaddr*) &nodeLocalAddress); sockaddr* destinationSocket = (sockaddr*) &nodePublicAddress; @@ -116,10 +119,10 @@ int main(int argc, const char * argv[]) nodeList->increaseNodeID(); } - currentBufferPos = broadcastPacket + sizeof(PACKET_HEADER); + currentBufferPos = broadcastPacket + sizeof(PACKET_HEADER) + sizeof(PACKET_VERSION); startPointer = currentBufferPos; - unsigned char* nodeTypesOfInterest = packetData + sizeof(PACKET_HEADER) + sizeof(NODE_TYPE) + unsigned char* nodeTypesOfInterest = packetData + sizeof(PACKET_HEADER) + sizeof(PACKET_VERSION) + sizeof(NODE_TYPE) + numBytesSocket + sizeof(unsigned char); int numInterestTypes = *(nodeTypesOfInterest - 1); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 87655b84b1..ba65117509 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2914,7 +2914,7 @@ void* Application::networkReceive(void* args) { NodeList::getInstance()->processNodeData(&senderAddress, app->_incomingPacket, bytesReceived); break; } - } + } } else if (!app->_enableNetworkThread) { break; } diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 832c81cd24..fad925541c 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -237,8 +237,8 @@ void NodeList::sendDomainServerCheckIn() { int numBytesNodesOfInterest = _nodeTypesOfInterest ? strlen((char*) _nodeTypesOfInterest) : 0; // check in packet has header, node type, port, IP, node types of interest, null termination - int numPacketBytes = sizeof(PACKET_HEADER) + sizeof(NODE_TYPE) + sizeof(uint16_t) + (sizeof(char) * 4) + - numBytesNodesOfInterest + sizeof(unsigned char); + int numPacketBytes = sizeof(PACKET_HEADER) + sizeof(PACKET_VERSION) + sizeof(NODE_TYPE) + sizeof(uint16_t) + + (sizeof(char) * 4) + numBytesNodesOfInterest + sizeof(unsigned char); checkInPacket = new unsigned char[numPacketBytes]; unsigned char* packetPosition = checkInPacket; @@ -246,9 +246,10 @@ void NodeList::sendDomainServerCheckIn() { *(packetPosition++) = (memchr(SOLO_NODE_TYPES, _ownerType, sizeof(SOLO_NODE_TYPES))) ? PACKET_HEADER_DOMAIN_REPORT_FOR_DUTY : PACKET_HEADER_DOMAIN_LIST_REQUEST; + *(packetPosition++) = packetVersion(*(packetPosition - 1)); *(packetPosition++) = _ownerType; - packetPosition += packSocket(checkInPacket + sizeof(PACKET_HEADER) + sizeof(NODE_TYPE), + packetPosition += packSocket(checkInPacket + sizeof(PACKET_HEADER) + sizeof(PACKET_VERSION) + sizeof(NODE_TYPE), getLocalAddress(), htons(_nodeSocket.getListeningPort()));