From 3349419c688662c110c4da45dffe13adc0dd7f42 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 28 Jun 2013 16:23:35 -0700 Subject: [PATCH 01/27] inital changes to add a version byte to packets --- avatar-mixer/src/main.cpp | 3 +- interface/src/Application.cpp | 64 ++++++++++++++------------ libraries/shared/src/PacketHeaders.cpp | 17 +++++++ libraries/shared/src/PacketHeaders.h | 2 + 4 files changed, 55 insertions(+), 31 deletions(-) create mode 100644 libraries/shared/src/PacketHeaders.cpp diff --git a/avatar-mixer/src/main.cpp b/avatar-mixer/src/main.cpp index aace967564..d97cbd799d 100644 --- a/avatar-mixer/src/main.cpp +++ b/avatar-mixer/src/main.cpp @@ -74,6 +74,7 @@ int main(int argc, const char* argv[]) { unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE]; *broadcastPacket = PACKET_HEADER_BULK_AVATAR_DATA; + *(broadcastPacket + 1) = version(*broadcastPacket); unsigned char* currentBufferPosition = NULL; @@ -104,7 +105,7 @@ int main(int argc, const char* argv[]) { // parse positional data from an agent agentList->updateAgentWithData(avatarAgent, packetData, receivedBytes); case PACKET_HEADER_INJECT_AUDIO: - currentBufferPosition = broadcastPacket + 1; + currentBufferPosition = broadcastPacket + sizeof(PACKET_HEADER) + sizeof(PACKET_VERSION); // send back a packet with other active agent data to this agent for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 776fbfc9bb..561c81e149 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2702,36 +2702,40 @@ void* Application::networkReceive(void* args) { app->_packetCount++; app->_bytesCount += bytesReceived; - switch (app->_incomingPacket[0]) { - case PACKET_HEADER_TRANSMITTER_DATA_V2: - // V2 = IOS transmitter app - app->_myTransmitter.processIncomingData(app->_incomingPacket, bytesReceived); - - break; - case PACKET_HEADER_MIXED_AUDIO: - app->_audio.addReceivedAudioToBuffer(app->_incomingPacket, bytesReceived); - break; - case PACKET_HEADER_VOXEL_DATA: - case PACKET_HEADER_VOXEL_DATA_MONOCHROME: - case PACKET_HEADER_Z_COMMAND: - case PACKET_HEADER_ERASE_VOXEL: - app->_voxels.parseData(app->_incomingPacket, bytesReceived); - break; - case PACKET_HEADER_ENVIRONMENT_DATA: - app->_environment.parseData(&senderAddress, app->_incomingPacket, bytesReceived); - break; - case PACKET_HEADER_BULK_AVATAR_DATA: - AgentList::getInstance()->processBulkAgentData(&senderAddress, - app->_incomingPacket, - bytesReceived); - break; - case PACKET_HEADER_AVATAR_VOXEL_URL: - processAvatarVoxelURLMessage(app->_incomingPacket, bytesReceived); - break; - default: - AgentList::getInstance()->processAgentData(&senderAddress, app->_incomingPacket, bytesReceived); - break; - } + if (app->_incomingPacket[1] == packetVersion(app->_incomingPacket[0])) { + // only process this packet if we have a match on the packet version + + switch (app->_incomingPacket[0]) { + case PACKET_HEADER_TRANSMITTER_DATA_V2: + // V2 = IOS transmitter app + app->_myTransmitter.processIncomingData(app->_incomingPacket, bytesReceived); + + break; + case PACKET_HEADER_MIXED_AUDIO: + app->_audio.addReceivedAudioToBuffer(app->_incomingPacket, bytesReceived); + break; + case PACKET_HEADER_VOXEL_DATA: + case PACKET_HEADER_VOXEL_DATA_MONOCHROME: + case PACKET_HEADER_Z_COMMAND: + case PACKET_HEADER_ERASE_VOXEL: + app->_voxels.parseData(app->_incomingPacket, bytesReceived); + break; + case PACKET_HEADER_ENVIRONMENT_DATA: + app->_environment.parseData(&senderAddress, app->_incomingPacket, bytesReceived); + break; + case PACKET_HEADER_BULK_AVATAR_DATA: + AgentList::getInstance()->processBulkAgentData(&senderAddress, + app->_incomingPacket, + bytesReceived); + break; + case PACKET_HEADER_AVATAR_VOXEL_URL: + processAvatarVoxelURLMessage(app->_incomingPacket, bytesReceived); + break; + default: + AgentList::getInstance()->processAgentData(&senderAddress, app->_incomingPacket, bytesReceived); + break; + } + } } else if (!app->_enableNetworkThread) { break; } diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp new file mode 100644 index 0000000000..fff453abdc --- /dev/null +++ b/libraries/shared/src/PacketHeaders.cpp @@ -0,0 +1,17 @@ +// +// PacketHeaders.cpp +// hifi +// +// Created by Stephen Birarda on 6/28/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#include "PacketHeaders.h" + +PACKET_VERSION packetVersion(PACKET_HEADER header) { + switch (header) { + default: + return 0; + break; + } +} \ No newline at end of file diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index 89f6fbaf54..7f69e09668 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -34,6 +34,8 @@ const PACKET_HEADER PACKET_HEADER_ENVIRONMENT_DATA = 'e'; const PACKET_HEADER PACKET_HEADER_DOMAIN_LIST_REQUEST = 'L'; const PACKET_HEADER PACKET_HEADER_DOMAIN_REPORT_FOR_DUTY = 'C'; +typedef char PACKET_VERSION; +PACKET_VERSION packetVersion(PACKET_HEADER header); // These are supported Z-Command #define ERASE_ALL_COMMAND "erase all" From 047d5b5cab94dc5a1fd2f30349f9e78c67ca9768 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 11:17:29 -0700 Subject: [PATCH 02/27] 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())); From 5062ae89652e853849b64f9688cc8ed68e7494c3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 11:37:39 -0700 Subject: [PATCH 03/27] rename PACKET_HEADER to PACKET_TYPE, fix DS packet versioning --- animation-server/src/main.cpp | 16 ++--- audio-mixer/src/AvatarAudioRingBuffer.cpp | 2 +- audio-mixer/src/InjectedAudioRingBuffer.cpp | 2 +- audio-mixer/src/PositionalAudioRingBuffer.cpp | 2 +- audio-mixer/src/main.cpp | 14 ++--- avatar-mixer/src/main.cpp | 13 ++-- domain-server/src/main.cpp | 15 +++-- eve/src/main.cpp | 6 +- injector/src/main.cpp | 5 +- interface/src/Application.cpp | 62 +++++++++---------- interface/src/Application.h | 2 +- interface/src/Audio.cpp | 10 +-- interface/src/VoxelSystem.cpp | 6 +- libraries/audio/src/AudioInjector.cpp | 6 +- libraries/audio/src/AudioRingBuffer.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 2 +- libraries/shared/src/NodeList.cpp | 29 +++++---- libraries/shared/src/PacketHeaders.cpp | 12 +++- libraries/shared/src/PacketHeaders.h | 47 +++++++------- libraries/voxels/src/VoxelTree.cpp | 2 +- voxel-server/src/VoxelNodeData.cpp | 2 +- voxel-server/src/main.cpp | 28 ++++----- 22 files changed, 148 insertions(+), 137 deletions(-) diff --git a/animation-server/src/main.cpp b/animation-server/src/main.cpp index 8a3d70d83d..876512e13a 100644 --- a/animation-server/src/main.cpp +++ b/animation-server/src/main.cpp @@ -46,11 +46,11 @@ bool wantLocalDomain = false; unsigned long packetsSent = 0; unsigned long bytesSent = 0; -static void sendVoxelEditMessage(PACKET_HEADER header, VoxelDetail& detail) { +static void sendVoxelEditMessage(PACKET_TYPE type, VoxelDetail& detail) { unsigned char* bufferOut; int sizeOut; - if (createVoxelEditMessage(header, 0, 1, &detail, bufferOut, sizeOut)){ + if (createVoxelEditMessage(type, 0, 1, &detail, bufferOut, sizeOut)){ ::packetsSent++; ::bytesSent += sizeOut; @@ -159,7 +159,7 @@ static void renderMovingBug() { } // send the "erase message" first... - PACKET_HEADER message = PACKET_HEADER_ERASE_VOXEL; + PACKET_TYPE message = PACKET_TYPE_ERASE_VOXEL; if (createVoxelEditMessage(message, 0, VOXELS_PER_BUG, (VoxelDetail*)&details, bufferOut, sizeOut)){ ::packetsSent++; @@ -229,7 +229,7 @@ static void renderMovingBug() { } // send the "create message" ... - message = PACKET_HEADER_SET_VOXEL_DESTRUCTIVE; + message = PACKET_TYPE_SET_VOXEL_DESTRUCTIVE; if (createVoxelEditMessage(message, 0, VOXELS_PER_BUG, (VoxelDetail*)&details, bufferOut, sizeOut)){ ::packetsSent++; @@ -274,7 +274,7 @@ static void sendVoxelBlinkMessage() { detail.green = 0 * ::intensity; detail.blue = 0 * ::intensity; - PACKET_HEADER message = PACKET_HEADER_SET_VOXEL_DESTRUCTIVE; + PACKET_TYPE message = PACKET_TYPE_SET_VOXEL_DESTRUCTIVE; sendVoxelEditMessage(message, detail); } @@ -291,7 +291,7 @@ unsigned char onColor[3] = { 0, 255, 255 }; const float STRING_OF_LIGHTS_SIZE = 0.125f / TREE_SCALE; // approximately 1/8th meter static void sendBlinkingStringOfLights() { - PACKET_HEADER message = PACKET_HEADER_SET_VOXEL_DESTRUCTIVE; // we're a bully! + PACKET_TYPE message = PACKET_TYPE_SET_VOXEL_DESTRUCTIVE; // we're a bully! float lightScale = STRING_OF_LIGHTS_SIZE; static VoxelDetail details[LIGHTS_PER_SEGMENT]; unsigned char* bufferOut; @@ -421,7 +421,7 @@ const int PACKETS_PER_DANCE_FLOOR = DANCE_FLOOR_VOXELS_PER_PACKET / (DANCE_FLOOR int danceFloorColors[DANCE_FLOOR_WIDTH][DANCE_FLOOR_LENGTH]; void sendDanceFloor() { - PACKET_HEADER message = PACKET_HEADER_SET_VOXEL_DESTRUCTIVE; // we're a bully! + PACKET_TYPE message = PACKET_TYPE_SET_VOXEL_DESTRUCTIVE; // we're a bully! float lightScale = DANCE_FLOOR_LIGHT_SIZE; static VoxelDetail details[DANCE_FLOOR_VOXELS_PER_PACKET]; unsigned char* bufferOut; @@ -548,7 +548,7 @@ bool billboardMessage[BILLBOARD_HEIGHT][BILLBOARD_WIDTH] = { }; static void sendBillboard() { - PACKET_HEADER message = PACKET_HEADER_SET_VOXEL_DESTRUCTIVE; // we're a bully! + PACKET_TYPE message = PACKET_TYPE_SET_VOXEL_DESTRUCTIVE; // we're a bully! float lightScale = BILLBOARD_LIGHT_SIZE; static VoxelDetail details[VOXELS_PER_PACKET]; unsigned char* bufferOut; diff --git a/audio-mixer/src/AvatarAudioRingBuffer.cpp b/audio-mixer/src/AvatarAudioRingBuffer.cpp index c3e0e2cbe9..42092cff3a 100644 --- a/audio-mixer/src/AvatarAudioRingBuffer.cpp +++ b/audio-mixer/src/AvatarAudioRingBuffer.cpp @@ -24,6 +24,6 @@ AvatarAudioRingBuffer::~AvatarAudioRingBuffer() { } int AvatarAudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { - _shouldLoopbackForNode = (sourceBuffer[0] == PACKET_HEADER_MICROPHONE_AUDIO_WITH_ECHO); + _shouldLoopbackForNode = (sourceBuffer[0] == PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO); return PositionalAudioRingBuffer::parseData(sourceBuffer, numBytes); } \ No newline at end of file diff --git a/audio-mixer/src/InjectedAudioRingBuffer.cpp b/audio-mixer/src/InjectedAudioRingBuffer.cpp index 426bbf361d..3309e79efc 100644 --- a/audio-mixer/src/InjectedAudioRingBuffer.cpp +++ b/audio-mixer/src/InjectedAudioRingBuffer.cpp @@ -21,7 +21,7 @@ InjectedAudioRingBuffer::InjectedAudioRingBuffer() : } int InjectedAudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { - unsigned char* currentBuffer = sourceBuffer + sizeof(PACKET_HEADER_INJECT_AUDIO); + unsigned char* currentBuffer = sourceBuffer + sizeof(PACKET_TYPE_INJECT_AUDIO); // pull stream identifier from the packet memcpy(&_streamIdentifier, currentBuffer, sizeof(_streamIdentifier)); diff --git a/audio-mixer/src/PositionalAudioRingBuffer.cpp b/audio-mixer/src/PositionalAudioRingBuffer.cpp index 87c51e2cf8..b8cd32bbf6 100644 --- a/audio-mixer/src/PositionalAudioRingBuffer.cpp +++ b/audio-mixer/src/PositionalAudioRingBuffer.cpp @@ -22,7 +22,7 @@ PositionalAudioRingBuffer::PositionalAudioRingBuffer() : } int PositionalAudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { - unsigned char* currentBuffer = sourceBuffer + sizeof(PACKET_HEADER); + unsigned char* currentBuffer = sourceBuffer + sizeof(PACKET_TYPE); currentBuffer += parsePositionalData(currentBuffer, numBytes - (currentBuffer - sourceBuffer)); currentBuffer += parseAudioSamples(currentBuffer, numBytes - (currentBuffer - sourceBuffer)); diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 26f4bb23f8..62ac66a3f4 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -103,8 +103,8 @@ int main(int argc, const char* argv[]) { int nextFrame = 0; timeval startTime; - unsigned char clientPacket[BUFFER_LENGTH_BYTES_STEREO + sizeof(PACKET_HEADER_MIXED_AUDIO)]; - clientPacket[0] = PACKET_HEADER_MIXED_AUDIO; + unsigned char clientPacket[BUFFER_LENGTH_BYTES_STEREO + sizeof(PACKET_TYPE_MIXED_AUDIO)]; + clientPacket[0] = PACKET_TYPE_MIXED_AUDIO; int16_t clientSamples[BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 2] = {}; @@ -325,7 +325,7 @@ int main(int argc, const char* argv[]) { } } - memcpy(clientPacket + sizeof(PACKET_HEADER_MIXED_AUDIO), clientSamples, sizeof(clientSamples)); + memcpy(clientPacket + sizeof(PACKET_TYPE_MIXED_AUDIO), clientSamples, sizeof(clientSamples)); nodeList->getNodeSocket()->send(node->getPublicSocket(), clientPacket, sizeof(clientPacket)); } } @@ -346,8 +346,8 @@ int main(int argc, const char* argv[]) { // pull any new audio data from nodes off of the network stack while (nodeList->getNodeSocket()->receive(nodeAddress, packetData, &receivedBytes)) { - if (packetData[0] == PACKET_HEADER_MICROPHONE_AUDIO_NO_ECHO || - packetData[0] == PACKET_HEADER_MICROPHONE_AUDIO_WITH_ECHO) { + if (packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO || + packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO) { Node* avatarNode = nodeList->addOrUpdateNode(nodeAddress, nodeAddress, NODE_TYPE_AGENT, @@ -363,7 +363,7 @@ int main(int argc, const char* argv[]) { // kill off this node - temporary solution to mixer crash on mac sleep avatarNode->setAlive(false); } - } else if (packetData[0] == PACKET_HEADER_INJECT_AUDIO) { + } else if (packetData[0] == PACKET_TYPE_INJECT_AUDIO) { Node* matchingInjector = NULL; for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) { @@ -391,7 +391,7 @@ int main(int argc, const char* argv[]) { // give the new audio data to the matching injector node nodeList->updateNodeWithData(matchingInjector, packetData, receivedBytes); - } else if (packetData[0] == PACKET_HEADER_PING) { + } else if (packetData[0] == PACKET_TYPE_PING) { // If the packet is a ping, let processNodeData handle it. nodeList->processNodeData(nodeAddress, packetData, receivedBytes); diff --git a/avatar-mixer/src/main.cpp b/avatar-mixer/src/main.cpp index ce7b428795..f55218e7c6 100644 --- a/avatar-mixer/src/main.cpp +++ b/avatar-mixer/src/main.cpp @@ -73,8 +73,7 @@ int main(int argc, const char* argv[]) { ssize_t receivedBytes = 0; unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE]; - *broadcastPacket = PACKET_HEADER_BULK_AVATAR_DATA; - *(broadcastPacket + 1) = version(*broadcastPacket); + int numHeaderBytes = populateTypeAndVersion(broadcastPacket, PACKET_TYPE_BULK_AVATAR_DATA); unsigned char* currentBufferPosition = NULL; @@ -95,7 +94,7 @@ int main(int argc, const char* argv[]) { if (nodeList->getNodeSocket()->receive(nodeAddress, packetData, &receivedBytes)) { switch (packetData[0]) { - case PACKET_HEADER_HEAD_DATA: + case PACKET_TYPE_HEAD_DATA: // grab the node ID from the packet unpackNodeId(packetData + 1, &nodeID); @@ -104,8 +103,8 @@ int main(int argc, const char* argv[]) { // parse positional data from an node nodeList->updateNodeWithData(avatarNode, packetData, receivedBytes); - case PACKET_HEADER_INJECT_AUDIO: - currentBufferPosition = broadcastPacket + sizeof(PACKET_HEADER) + sizeof(PACKET_VERSION); + case PACKET_TYPE_INJECT_AUDIO: + currentBufferPosition = broadcastPacket + numHeaderBytes; // send back a packet with other active node data to this node for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) { @@ -117,7 +116,7 @@ int main(int argc, const char* argv[]) { nodeList->getNodeSocket()->send(nodeAddress, broadcastPacket, currentBufferPosition - broadcastPacket); break; - case PACKET_HEADER_AVATAR_VOXEL_URL: + case PACKET_TYPE_AVATAR_VOXEL_URL: // grab the node ID from the packet unpackNodeId(packetData + 1, &nodeID); @@ -128,7 +127,7 @@ int main(int argc, const char* argv[]) { } } break; - case PACKET_HEADER_DOMAIN: + case PACKET_TYPE_DOMAIN: // ignore the DS packet, for now nodes are added only when they communicate directly with us break; default: diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 471f66b462..1911fb7dd4 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -70,8 +70,7 @@ int main(int argc, const char * argv[]) char nodeType = '\0'; unsigned char broadcastPacket[MAX_PACKET_SIZE]; - broadcastPacket[0] = PACKET_HEADER_DOMAIN; - broadcastPacket[1] = packetVersion(broadcastPacket[0]); + int numHeaderBytes = populateTypeAndVersion(broadcastPacket, PACKET_TYPE_DOMAIN); unsigned char* currentBufferPos; unsigned char* startPointer; @@ -87,13 +86,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) && - packetVersion(packetData[0]) == packetData[1]) { + (packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_TYPE_DOMAIN_LIST_REQUEST) && + versionForPacketType(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(PACKET_VERSION) + sizeof(NODE_TYPE), + int numBytesSocket = unpackSocket(packetData + numHeaderBytes + sizeof(NODE_TYPE), (sockaddr*) &nodeLocalAddress); sockaddr* destinationSocket = (sockaddr*) &nodePublicAddress; @@ -119,10 +118,10 @@ int main(int argc, const char * argv[]) nodeList->increaseNodeID(); } - currentBufferPos = broadcastPacket + sizeof(PACKET_HEADER) + sizeof(PACKET_VERSION); + currentBufferPos = broadcastPacket + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); startPointer = currentBufferPos; - unsigned char* nodeTypesOfInterest = packetData + sizeof(PACKET_HEADER) + sizeof(PACKET_VERSION) + sizeof(NODE_TYPE) + unsigned char* nodeTypesOfInterest = packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION) + sizeof(NODE_TYPE) + numBytesSocket + sizeof(unsigned char); int numInterestTypes = *(nodeTypesOfInterest - 1); @@ -165,7 +164,7 @@ int main(int argc, const char * argv[]) long long timeNow = usecTimestampNow(); newNode->setLastHeardMicrostamp(timeNow); - if (packetData[0] == PACKET_HEADER_DOMAIN_REPORT_FOR_DUTY + if (packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY && memchr(SOLO_NODE_TYPES, nodeType, sizeof(SOLO_NODE_TYPES))) { newNode->setWakeMicrostamp(timeNow); } diff --git a/eve/src/main.cpp b/eve/src/main.cpp index 8a03dc453b..827bd67bc6 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -51,7 +51,7 @@ void *receiveNodeData(void *args) { while (!::stopReceiveNodeDataThread) { if (nodeList->getNodeSocket()->receive(&senderAddress, incomingPacket, &bytesReceived)) { switch (incomingPacket[0]) { - case PACKET_HEADER_BULK_AVATAR_DATA: + case PACKET_TYPE_BULK_AVATAR_DATA: // this is the positional data for other nodes // pass that off to the nodeList processBulkNodeData method nodeList->processBulkNodeData(&senderAddress, incomingPacket, bytesReceived); @@ -125,7 +125,7 @@ int main(int argc, const char* argv[]) { nodeList->linkedDataCreateCallback = createAvatarDataForNode; unsigned char broadcastPacket[MAX_PACKET_SIZE]; - broadcastPacket[0] = PACKET_HEADER_HEAD_DATA; + broadcastPacket[0] = PACKET_TYPE_HEAD_DATA; timeval thisSend; long long numMicrosecondsSleep = 0; @@ -153,7 +153,7 @@ int main(int argc, const char* argv[]) { // make sure we actually have an avatar mixer with an active socket if (nodeList->getOwnerID() != UNKNOWN_NODE_ID && avatarMixer && avatarMixer->getActiveSocket() != NULL) { - unsigned char* packetPosition = broadcastPacket + sizeof(PACKET_HEADER); + unsigned char* packetPosition = broadcastPacket + sizeof(PACKET_TYPE); packetPosition += packNodeId(packetPosition, nodeList->getOwnerID()); // use the getBroadcastData method in the AvatarData class to populate the broadcastPacket buffer diff --git a/injector/src/main.cpp b/injector/src/main.cpp index e8cb345471..68c0938ab0 100644 --- a/injector/src/main.cpp +++ b/injector/src/main.cpp @@ -144,7 +144,7 @@ int main(int argc, char* argv[]) { nodeList->linkedDataCreateCallback = createAvatarDataForNode; timeval lastSend = {}; - unsigned char broadcastPacket = PACKET_HEADER_INJECT_AUDIO; + unsigned char broadcastPacket = PACKET_TYPE_INJECT_AUDIO; timeval lastDomainServerCheckIn = {}; @@ -170,8 +170,7 @@ int main(int argc, char* argv[]) { while (nodeList->getNodeSocket()->receive(&senderAddress, incomingPacket, &bytesReceived)) { switch (incomingPacket[0]) { - case PACKET_HEADER_BULK_AVATAR_DATA: - // this is the positional data for other nodes + case PACKET_TYPE_BULK_AVATAR_DATA: // this is the positional data for other nodes // pass that off to the nodeList processBulkNodeData method nodeList->processBulkNodeData(&senderAddress, incomingPacket, bytesReceived); break; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ba65117509..fb76e0adea 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -892,11 +892,11 @@ void Application::sendPingPackets() { char nodeTypesOfInterest[] = {NODE_TYPE_VOXEL_SERVER, NODE_TYPE_AUDIO_MIXER, NODE_TYPE_AVATAR_MIXER}; long long currentTime = usecTimestampNow(); - unsigned char pingPacket[1 + sizeof(currentTime)]; - pingPacket[0] = PACKET_HEADER_PING; + unsigned char pingPacket[MAX_PACKET_HEADER_BYTES + sizeof(currentTime)]; + int numHeaderBytes = populateTypeAndVersion(pingPacket, PACKET_TYPE_PING); memcpy(&pingPacket[1], ¤tTime, sizeof(currentTime)); - getInstance()->controlledBroadcastToNodes(pingPacket, 1 + sizeof(currentTime), + getInstance()->controlledBroadcastToNodes(pingPacket, numHeaderBytes + sizeof(currentTime), nodeTypesOfInterest, sizeof(nodeTypesOfInterest)); } @@ -994,7 +994,7 @@ void Application::sendAvatarVoxelURLMessage(const QUrl& url) { return; // we don't yet know who we are } QByteArray message; - message.append(PACKET_HEADER_AVATAR_VOXEL_URL); + message.append(PACKET_TYPE_AVATAR_VOXEL_URL); message.append((const char*)&ownerID, sizeof(ownerID)); message.append(url.toEncoded()); @@ -1226,11 +1226,11 @@ void Application::updateVoxelModeActions() { } } -void Application::sendVoxelEditMessage(PACKET_HEADER header, VoxelDetail& detail) { +void Application::sendVoxelEditMessage(PACKET_TYPE type, VoxelDetail& detail) { unsigned char* bufferOut; int sizeOut; - if (createVoxelEditMessage(header, 0, 1, &detail, bufferOut, sizeOut)){ + if (createVoxelEditMessage(type, 0, 1, &detail, bufferOut, sizeOut)){ Application::controlledBroadcastToNodes(bufferOut, sizeOut, & NODE_TYPE_VOXEL_SERVER, 1); delete[] bufferOut; } @@ -1313,7 +1313,7 @@ bool Application::sendVoxelsOperation(VoxelNode* node, void* extraData) { // if we have room don't have room in the buffer, then send the previously generated message first if (args->bufferInUse + codeAndColorLength > MAXIMUM_EDIT_VOXEL_MESSAGE_SIZE) { controlledBroadcastToNodes(args->messageBuffer, args->bufferInUse, & NODE_TYPE_VOXEL_SERVER, 1); - args->bufferInUse = sizeof(PACKET_HEADER_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int); // reset + args->bufferInUse = sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int); // reset } // copy this node's code color details into our buffer. @@ -1376,10 +1376,10 @@ void Application::importVoxels() { // the server as an set voxel message, this will also rebase the voxels to the new location unsigned char* calculatedOctCode = NULL; SendVoxelsOperationArgs args; - args.messageBuffer[0] = PACKET_HEADER_SET_VOXEL_DESTRUCTIVE; - unsigned short int* sequenceAt = (unsigned short int*)&args.messageBuffer[sizeof(PACKET_HEADER_SET_VOXEL_DESTRUCTIVE)]; + args.messageBuffer[0] = PACKET_TYPE_SET_VOXEL_DESTRUCTIVE; + unsigned short int* sequenceAt = (unsigned short int*)&args.messageBuffer[sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE)]; *sequenceAt = 0; - args.bufferInUse = sizeof(PACKET_HEADER_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int); // set to command + sequence + args.bufferInUse = sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int); // set to command + sequence // we only need the selected voxel to get the newBaseOctCode, which we can actually calculate from the // voxel size/position details. @@ -1392,7 +1392,7 @@ void Application::importVoxels() { importVoxels.recurseTreeWithOperation(sendVoxelsOperation, &args); // If we have voxels left in the packet, then send the packet - if (args.bufferInUse > (sizeof(PACKET_HEADER_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int))) { + if (args.bufferInUse > (sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int))) { controlledBroadcastToNodes(args.messageBuffer, args.bufferInUse, & NODE_TYPE_VOXEL_SERVER, 1); } @@ -1427,10 +1427,10 @@ void Application::pasteVoxels() { // Recurse the clipboard tree, where everything is root relative, and send all the colored voxels to // the server as an set voxel message, this will also rebase the voxels to the new location SendVoxelsOperationArgs args; - args.messageBuffer[0] = PACKET_HEADER_SET_VOXEL_DESTRUCTIVE; - unsigned short int* sequenceAt = (unsigned short int*)&args.messageBuffer[sizeof(PACKET_HEADER_SET_VOXEL_DESTRUCTIVE)]; + args.messageBuffer[0] = PACKET_TYPE_SET_VOXEL_DESTRUCTIVE; + unsigned short int* sequenceAt = (unsigned short int*)&args.messageBuffer[sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE)]; *sequenceAt = 0; - args.bufferInUse = sizeof(PACKET_HEADER_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int); // set to command + sequence + args.bufferInUse = sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int); // set to command + sequence // we only need the selected voxel to get the newBaseOctCode, which we can actually calculate from the // voxel size/position details. If we don't have an actual selectedNode then use the mouseVoxel to create a @@ -1444,7 +1444,7 @@ void Application::pasteVoxels() { _clipboardTree.recurseTreeWithOperation(sendVoxelsOperation, &args); // If we have voxels left in the packet, then send the packet - if (args.bufferInUse > (sizeof(PACKET_HEADER_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int))) { + if (args.bufferInUse > (sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int))) { controlledBroadcastToNodes(args.messageBuffer, args.bufferInUse, & NODE_TYPE_VOXEL_SERVER, 1); } @@ -1989,7 +1989,7 @@ void Application::updateAvatar(float deltaTime) { unsigned char broadcastString[200]; unsigned char* endOfBroadcastStringWrite = broadcastString; - *(endOfBroadcastStringWrite++) = PACKET_HEADER_HEAD_DATA; + *(endOfBroadcastStringWrite++) = PACKET_TYPE_HEAD_DATA; endOfBroadcastStringWrite += packNodeId(endOfBroadcastStringWrite, nodeList->getOwnerID()); endOfBroadcastStringWrite += _myAvatar.getBroadcastData(endOfBroadcastStringWrite); @@ -2019,8 +2019,8 @@ void Application::updateAvatar(float deltaTime) { _paintingVoxel.y >= 0.0 && _paintingVoxel.y <= 1.0 && _paintingVoxel.z >= 0.0 && _paintingVoxel.z <= 1.0) { - PACKET_HEADER message = (_destructiveAddVoxel->isChecked() ? - PACKET_HEADER_SET_VOXEL_DESTRUCTIVE : PACKET_HEADER_SET_VOXEL); + PACKET_TYPE message = (_destructiveAddVoxel->isChecked() ? + PACKET_TYPE_SET_VOXEL_DESTRUCTIVE : PACKET_TYPE_SET_VOXEL); sendVoxelEditMessage(message, _paintingVoxel); } } @@ -2698,8 +2698,8 @@ void Application::shiftPaintingColor() { void Application::maybeEditVoxelUnderCursor() { if (_addVoxelMode->isChecked() || _colorVoxelMode->isChecked()) { if (_mouseVoxel.s != 0) { - PACKET_HEADER message = (_destructiveAddVoxel->isChecked() ? - PACKET_HEADER_SET_VOXEL_DESTRUCTIVE : PACKET_HEADER_SET_VOXEL); + PACKET_TYPE message = (_destructiveAddVoxel->isChecked() ? + PACKET_TYPE_SET_VOXEL_DESTRUCTIVE : PACKET_TYPE_SET_VOXEL); sendVoxelEditMessage(message, _mouseVoxel); // create the voxel locally so it appears immediately @@ -2772,7 +2772,7 @@ void Application::maybeEditVoxelUnderCursor() { void Application::deleteVoxelUnderCursor() { if (_mouseVoxel.s != 0) { // sending delete to the server is sufficient, server will send new version so we see updates soon enough - sendVoxelEditMessage(PACKET_HEADER_ERASE_VOXEL, _mouseVoxel); + sendVoxelEditMessage(PACKET_TYPE_ERASE_VOXEL, _mouseVoxel); AudioInjector* voxelInjector = AudioInjectionManager::injectorWithCapacity(5000); voxelInjector->setPosition(glm::vec3(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z)); // voxelInjector->setBearing(0); //straight down the z axis @@ -2881,33 +2881,33 @@ void* Application::networkReceive(void* args) { app->_packetCount++; app->_bytesCount += bytesReceived; - if (app->_incomingPacket[1] == packetVersion(app->_incomingPacket[0])) { + if (app->_incomingPacket[1] == versionForPacketType(app->_incomingPacket[0])) { // only process this packet if we have a match on the packet version switch (app->_incomingPacket[0]) { - case PACKET_HEADER_TRANSMITTER_DATA_V2: + case PACKET_TYPE_TRANSMITTER_DATA_V2: // V2 = IOS transmitter app app->_myTransmitter.processIncomingData(app->_incomingPacket, bytesReceived); break; - case PACKET_HEADER_MIXED_AUDIO: + case PACKET_TYPE_MIXED_AUDIO: app->_audio.addReceivedAudioToBuffer(app->_incomingPacket, bytesReceived); break; - case PACKET_HEADER_VOXEL_DATA: - case PACKET_HEADER_VOXEL_DATA_MONOCHROME: - case PACKET_HEADER_Z_COMMAND: - case PACKET_HEADER_ERASE_VOXEL: + case PACKET_TYPE_VOXEL_DATA: + case PACKET_TYPE_VOXEL_DATA_MONOCHROME: + case PACKET_TYPE_Z_COMMAND: + case PACKET_TYPE_ERASE_VOXEL: app->_voxels.parseData(app->_incomingPacket, bytesReceived); break; - case PACKET_HEADER_ENVIRONMENT_DATA: + case PACKET_TYPE_ENVIRONMENT_DATA: app->_environment.parseData(&senderAddress, app->_incomingPacket, bytesReceived); break; - case PACKET_HEADER_BULK_AVATAR_DATA: + case PACKET_TYPE_BULK_AVATAR_DATA: NodeList::getInstance()->processBulkNodeData(&senderAddress, app->_incomingPacket, bytesReceived); getInstance()->_bandwidthMeter.inputStream(BandwidthMeter::AVATARS).updateValue(bytesReceived); break; - case PACKET_HEADER_AVATAR_VOXEL_URL: + case PACKET_TYPE_AVATAR_VOXEL_URL: processAvatarVoxelURLMessage(app->_incomingPacket, bytesReceived); break; default: diff --git a/interface/src/Application.h b/interface/src/Application.h index 2b4bd27a3d..1b2bef6347 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -157,7 +157,7 @@ private: static void sendVoxelServerAddScene(); static bool sendVoxelsOperation(VoxelNode* node, void* extraData); - static void sendVoxelEditMessage(PACKET_HEADER header, VoxelDetail& detail); + static void sendVoxelEditMessage(PACKET_TYPE type, VoxelDetail& detail); static void sendAvatarVoxelURLMessage(const QUrl& url); static void processAvatarVoxelURLMessage(unsigned char *packetData, size_t dataBytes); static void sendPingPackets(); diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index dc303f8d4b..b381a3c178 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -99,15 +99,15 @@ inline void Audio::performIO(int16_t* inputLeft, int16_t* outputLeft, int16_t* o glm::vec3 headPosition = interfaceAvatar->getHeadJointPosition(); glm::quat headOrientation = interfaceAvatar->getHead().getOrientation(); - int leadingBytes = sizeof(PACKET_HEADER_MICROPHONE_AUDIO_NO_ECHO) + sizeof(headPosition) + sizeof(headOrientation); + int leadingBytes = sizeof(PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO) + sizeof(headPosition) + sizeof(headOrientation); // we need the amount of bytes in the buffer + 1 for type // + 12 for 3 floats for position + float for bearing + 1 attenuation byte unsigned char dataPacket[BUFFER_LENGTH_BYTES_PER_CHANNEL + leadingBytes]; dataPacket[0] = (Application::getInstance()->shouldEchoAudio()) - ? PACKET_HEADER_MICROPHONE_AUDIO_WITH_ECHO - : PACKET_HEADER_MICROPHONE_AUDIO_NO_ECHO; + ? PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO + : PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO; unsigned char *currentPacketPtr = dataPacket + 1; // memcpy the three float positions @@ -446,10 +446,10 @@ void Audio::addReceivedAudioToBuffer(unsigned char* receivedData, int receivedBy //printf("Got audio packet %d\n", _packetsReceivedThisPlayback); - _ringBuffer.parseData((unsigned char*) receivedData, PACKET_LENGTH_BYTES + sizeof(PACKET_HEADER)); + _ringBuffer.parseData((unsigned char*) receivedData, PACKET_LENGTH_BYTES + sizeof(PACKET_TYPE)); Application::getInstance()->getBandwidthMeter()->inputStream(BandwidthMeter::AUDIO) - .updateValue(PACKET_LENGTH_BYTES + sizeof(PACKET_HEADER)); + .updateValue(PACKET_LENGTH_BYTES + sizeof(PACKET_TYPE)); _lastReceiveTime = currentReceiveTime; } diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 97c3e4bcd5..8912762d6e 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -117,21 +117,21 @@ int VoxelSystem::parseData(unsigned char* sourceBuffer, int numBytes) { pthread_mutex_lock(&_treeLock); switch(command) { - case PACKET_HEADER_VOXEL_DATA: + case PACKET_TYPE_VOXEL_DATA: { PerformanceWarning warn(_renderWarningsOn, "readBitstreamToTree()"); // ask the VoxelTree to read the bitstream into the tree _tree->readBitstreamToTree(voxelData, numBytes - 1, WANT_COLOR, WANT_EXISTS_BITS); } break; - case PACKET_HEADER_VOXEL_DATA_MONOCHROME: + case PACKET_TYPE_VOXEL_DATA_MONOCHROME: { PerformanceWarning warn(_renderWarningsOn, "readBitstreamToTree()"); // ask the VoxelTree to read the MONOCHROME bitstream into the tree _tree->readBitstreamToTree(voxelData, numBytes - 1, NO_COLOR, WANT_EXISTS_BITS); } break; - case PACKET_HEADER_Z_COMMAND: + case PACKET_TYPE_Z_COMMAND: // the Z command is a special command that allows the sender to send high level semantic // requests, like erase all, or add sphere scene, different receivers may handle these diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 16c381a036..44a8257e4a 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -70,7 +70,7 @@ void AudioInjector::injectAudio(UDPSocket* injectorSocket, sockaddr* destination timeval startTime; // calculate the number of bytes required for additional data - int leadingBytes = sizeof(PACKET_HEADER) + int leadingBytes = sizeof(PACKET_TYPE) + sizeof(_streamIdentifier) + sizeof(_position) + sizeof(_orientation) @@ -79,8 +79,8 @@ void AudioInjector::injectAudio(UDPSocket* injectorSocket, sockaddr* destination unsigned char dataPacket[(BUFFER_LENGTH_SAMPLES_PER_CHANNEL * sizeof(int16_t)) + leadingBytes]; - dataPacket[0] = PACKET_HEADER_INJECT_AUDIO; - unsigned char *currentPacketPtr = dataPacket + sizeof(PACKET_HEADER_INJECT_AUDIO); + dataPacket[0] = PACKET_TYPE_INJECT_AUDIO; + unsigned char *currentPacketPtr = dataPacket + sizeof(PACKET_TYPE_INJECT_AUDIO); // copy the identifier for this injector memcpy(currentPacketPtr, &_streamIdentifier, sizeof(_streamIdentifier)); diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index 79e94e625d..8e2e28e964 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -34,7 +34,7 @@ void AudioRingBuffer::reset() { } int AudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { - return parseAudioSamples(sourceBuffer + sizeof(PACKET_HEADER_MIXED_AUDIO), numBytes - sizeof(PACKET_HEADER_MIXED_AUDIO)); + return parseAudioSamples(sourceBuffer + sizeof(PACKET_TYPE_MIXED_AUDIO), numBytes - sizeof(PACKET_TYPE_MIXED_AUDIO)); } int AudioRingBuffer::parseAudioSamples(unsigned char* sourceBuffer, int numBytes) { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 9779d0a1f5..64bde13d4a 100755 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -169,7 +169,7 @@ int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { } // increment to push past the packet header - sourceBuffer += sizeof(PACKET_HEADER_HEAD_DATA); + sourceBuffer += sizeof(PACKET_TYPE_HEAD_DATA); unsigned char* startPosition = sourceBuffer; diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index fad925541c..a934624bad 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -90,18 +90,18 @@ void NodeList::timePingReply(sockaddr *nodeAddress, unsigned char *packetData) { void NodeList::processNodeData(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes) { switch (((char *)packetData)[0]) { - case PACKET_HEADER_DOMAIN: { + case PACKET_TYPE_DOMAIN: { processDomainServerList(packetData, dataBytes); break; } - case PACKET_HEADER_PING: { + case PACKET_TYPE_PING: { char pingPacket[dataBytes]; memcpy(pingPacket, packetData, dataBytes); - pingPacket[0] = PACKET_HEADER_PING_REPLY; + pingPacket[0] = PACKET_TYPE_PING_REPLY; _nodeSocket.send(senderAddress, pingPacket, dataBytes); break; } - case PACKET_HEADER_PING_REPLY: { + case PACKET_TYPE_PING_REPLY: { timePingReply(senderAddress, packetData); break; } @@ -123,7 +123,7 @@ void NodeList::processBulkNodeData(sockaddr *senderAddress, unsigned char *packe unsigned char *currentPosition = startPosition + 1; unsigned char packetHolder[numTotalBytes]; - packetHolder[0] = PACKET_HEADER_HEAD_DATA; + packetHolder[0] = PACKET_TYPE_HEAD_DATA; uint16_t nodeID = -1; @@ -237,19 +237,22 @@ 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(PACKET_VERSION) + sizeof(NODE_TYPE) + sizeof(uint16_t) + + int numPacketBytes = sizeof(PACKET_TYPE) + 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; - *(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)); + PACKET_TYPE nodePacketType = (memchr(SOLO_NODE_TYPES, _ownerType, sizeof(SOLO_NODE_TYPES))) + ? PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY + : PACKET_TYPE_DOMAIN_LIST_REQUEST; + + int numHeaderBytes = populateTypeAndVersion(packetPosition, nodePacketType); + packetPosition += numHeaderBytes; + *(packetPosition++) = _ownerType; - packetPosition += packSocket(checkInPacket + sizeof(PACKET_HEADER) + sizeof(PACKET_VERSION) + sizeof(NODE_TYPE), + packetPosition += packSocket(checkInPacket + numHeaderBytes + sizeof(NODE_TYPE), getLocalAddress(), htons(_nodeSocket.getListeningPort())); @@ -418,8 +421,8 @@ void *pingUnknownNodes(void *args) { if (!node->getActiveSocket() && node->getPublicSocket() && node->getLocalSocket()) { // ping both of the sockets for the node so we can figure out // which socket we can use - nodeList->getNodeSocket()->send(node->getPublicSocket(), &PACKET_HEADER_PING, 1); - nodeList->getNodeSocket()->send(node->getLocalSocket(), &PACKET_HEADER_PING, 1); + nodeList->getNodeSocket()->send(node->getPublicSocket(), &PACKET_TYPE_PING, 1); + nodeList->getNodeSocket()->send(node->getLocalSocket(), &PACKET_TYPE_PING, 1); } } diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp index fff453abdc..f892afc124 100644 --- a/libraries/shared/src/PacketHeaders.cpp +++ b/libraries/shared/src/PacketHeaders.cpp @@ -8,10 +8,18 @@ #include "PacketHeaders.h" -PACKET_VERSION packetVersion(PACKET_HEADER header) { - switch (header) { +PACKET_VERSION versionForPacketType(PACKET_TYPE type) { + switch (type) { default: return 0; break; } +} + +int populateTypeAndVersion(unsigned char* destination, PACKET_TYPE type) { + destination[0] = type; + destination[1] = versionForPacketType(type); + + // return the number of bytes written for pointer pushing + return 2; } \ No newline at end of file diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index 7f69e09668..ec7f717721 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -12,30 +12,33 @@ #ifndef hifi_PacketHeaders_h #define hifi_PacketHeaders_h -typedef char PACKET_HEADER; -const PACKET_HEADER PACKET_HEADER_DOMAIN = 'D'; -const PACKET_HEADER PACKET_HEADER_PING = 'P'; -const PACKET_HEADER PACKET_HEADER_PING_REPLY = 'R'; -const PACKET_HEADER PACKET_HEADER_HEAD_DATA = 'H'; -const PACKET_HEADER PACKET_HEADER_Z_COMMAND = 'Z'; -const PACKET_HEADER PACKET_HEADER_INJECT_AUDIO = 'I'; -const PACKET_HEADER PACKET_HEADER_MIXED_AUDIO = 'A'; -const PACKET_HEADER PACKET_HEADER_MICROPHONE_AUDIO_NO_ECHO = 'M'; -const PACKET_HEADER PACKET_HEADER_MICROPHONE_AUDIO_WITH_ECHO = 'm'; -const PACKET_HEADER PACKET_HEADER_SET_VOXEL = 'S'; -const PACKET_HEADER PACKET_HEADER_SET_VOXEL_DESTRUCTIVE = 'O'; -const PACKET_HEADER PACKET_HEADER_ERASE_VOXEL = 'E'; -const PACKET_HEADER PACKET_HEADER_VOXEL_DATA = 'V'; -const PACKET_HEADER PACKET_HEADER_VOXEL_DATA_MONOCHROME = 'v'; -const PACKET_HEADER PACKET_HEADER_BULK_AVATAR_DATA = 'X'; -const PACKET_HEADER PACKET_HEADER_AVATAR_VOXEL_URL = 'U'; -const PACKET_HEADER PACKET_HEADER_TRANSMITTER_DATA_V2 = 'T'; -const PACKET_HEADER PACKET_HEADER_ENVIRONMENT_DATA = 'e'; -const PACKET_HEADER PACKET_HEADER_DOMAIN_LIST_REQUEST = 'L'; -const PACKET_HEADER PACKET_HEADER_DOMAIN_REPORT_FOR_DUTY = 'C'; +typedef char PACKET_TYPE; +const PACKET_TYPE PACKET_TYPE_DOMAIN = 'D'; +const PACKET_TYPE PACKET_TYPE_PING = 'P'; +const PACKET_TYPE PACKET_TYPE_PING_REPLY = 'R'; +const PACKET_TYPE PACKET_TYPE_HEAD_DATA = 'H'; +const PACKET_TYPE PACKET_TYPE_Z_COMMAND = 'Z'; +const PACKET_TYPE PACKET_TYPE_INJECT_AUDIO = 'I'; +const PACKET_TYPE PACKET_TYPE_MIXED_AUDIO = 'A'; +const PACKET_TYPE PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO = 'M'; +const PACKET_TYPE PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO = 'm'; +const PACKET_TYPE PACKET_TYPE_SET_VOXEL = 'S'; +const PACKET_TYPE PACKET_TYPE_SET_VOXEL_DESTRUCTIVE = 'O'; +const PACKET_TYPE PACKET_TYPE_ERASE_VOXEL = 'E'; +const PACKET_TYPE PACKET_TYPE_VOXEL_DATA = 'V'; +const PACKET_TYPE PACKET_TYPE_VOXEL_DATA_MONOCHROME = 'v'; +const PACKET_TYPE PACKET_TYPE_BULK_AVATAR_DATA = 'X'; +const PACKET_TYPE PACKET_TYPE_AVATAR_VOXEL_URL = 'U'; +const PACKET_TYPE PACKET_TYPE_TRANSMITTER_DATA_V2 = 'T'; +const PACKET_TYPE PACKET_TYPE_ENVIRONMENT_DATA = 'e'; +const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L'; +const PACKET_TYPE PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY = 'C'; typedef char PACKET_VERSION; -PACKET_VERSION packetVersion(PACKET_HEADER header); +PACKET_VERSION versionForPacketType(PACKET_TYPE header); +int populateTypeAndVersion(unsigned char* destination, PACKET_TYPE header); + +const int MAX_PACKET_HEADER_BYTES = sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); // These are supported Z-Command #define ERASE_ALL_COMMAND "erase all" diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index b16425370e..21e406400d 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -535,7 +535,7 @@ void VoxelTree::readCodeColorBufferToTreeRecursion(VoxelNode* node, void* extraD void VoxelTree::processRemoveVoxelBitstream(unsigned char * bitstream, int bufferSizeBytes) { //unsigned short int itemNumber = (*((unsigned short int*)&bitstream[sizeof(PACKET_HEADER)])); - int atByte = sizeof(short int) + sizeof(PACKET_HEADER); + int atByte = sizeof(short int) + sizeof(PACKET_TYPE); unsigned char* voxelCode = (unsigned char*)&bitstream[atByte]; while (atByte < bufferSizeBytes) { int codeLength = numberOfThreeBitSectionsInCode(voxelCode); diff --git a/voxel-server/src/VoxelNodeData.cpp b/voxel-server/src/VoxelNodeData.cpp index f2cce906cf..2b4b405c48 100644 --- a/voxel-server/src/VoxelNodeData.cpp +++ b/voxel-server/src/VoxelNodeData.cpp @@ -27,7 +27,7 @@ VoxelNodeData::VoxelNodeData(Node* owningNode) : void VoxelNodeData::resetVoxelPacket() { - _voxelPacket[0] = getWantColor() ? PACKET_HEADER_VOXEL_DATA : PACKET_HEADER_VOXEL_DATA_MONOCHROME; + _voxelPacket[0] = getWantColor() ? PACKET_TYPE_VOXEL_DATA : PACKET_TYPE_VOXEL_DATA_MONOCHROME; _voxelPacketAt = &_voxelPacket[1]; _voxelPacketAvailableBytes = MAX_VOXEL_PACKET_SIZE - 1; _voxelPacketWaiting = false; diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 64a4565b6c..7a5fe4f816 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -201,7 +201,7 @@ void resInVoxelDistributor(NodeList* nodeList, // send the environment packets if (shouldSendEnvironments) { int envPacketLength = 1; - *tempOutputBuffer = PACKET_HEADER_ENVIRONMENT_DATA; + *tempOutputBuffer = PACKET_TYPE_ENVIRONMENT_DATA; for (int i = 0; i < sizeof(environmentData) / sizeof(environmentData[0]); i++) { envPacketLength += environmentData[i].getBroadcastData(tempOutputBuffer + envPacketLength); } @@ -387,7 +387,7 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, // send the environment packet if (shouldSendEnvironments) { int envPacketLength = 1; - *tempOutputBuffer = PACKET_HEADER_ENVIRONMENT_DATA; + *tempOutputBuffer = PACKET_TYPE_ENVIRONMENT_DATA; for (int i = 0; i < sizeof(environmentData) / sizeof(environmentData[0]); i++) { envPacketLength += environmentData[i].getBroadcastData(tempOutputBuffer + envPacketLength); } @@ -637,18 +637,18 @@ int main(int argc, const char * argv[]) { persistVoxelsWhenDirty(); if (nodeList->getNodeSocket()->receive(&nodePublicAddress, packetData, &receivedBytes)) { - if (packetData[0] == PACKET_HEADER_SET_VOXEL || packetData[0] == PACKET_HEADER_SET_VOXEL_DESTRUCTIVE) { - bool destructive = (packetData[0] == PACKET_HEADER_SET_VOXEL_DESTRUCTIVE); + if (packetData[0] == PACKET_TYPE_SET_VOXEL || packetData[0] == PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) { + bool destructive = (packetData[0] == PACKET_TYPE_SET_VOXEL_DESTRUCTIVE); PerformanceWarning warn(::shouldShowAnimationDebug, - destructive ? "PACKET_HEADER_SET_VOXEL_DESTRUCTIVE" : "PACKET_HEADER_SET_VOXEL", + destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", ::shouldShowAnimationDebug); unsigned short int itemNumber = (*((unsigned short int*)&packetData[1])); if (::shouldShowAnimationDebug) { printf("got %s - command from client receivedBytes=%ld itemNumber=%d\n", - destructive ? "PACKET_HEADER_SET_VOXEL_DESTRUCTIVE" : "PACKET_HEADER_SET_VOXEL", + destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", receivedBytes,itemNumber); } - int atByte = sizeof(PACKET_HEADER) + sizeof(itemNumber); + int atByte = sizeof(PACKET_TYPE) + sizeof(itemNumber); unsigned char* voxelData = (unsigned char*)&packetData[atByte]; while (atByte < receivedBytes) { unsigned char octets = (unsigned char)*voxelData; @@ -691,20 +691,20 @@ int main(int argc, const char * argv[]) { atByte += voxelDataSize; } } - if (packetData[0] == PACKET_HEADER_ERASE_VOXEL) { + if (packetData[0] == PACKET_TYPE_ERASE_VOXEL) { // Send these bits off to the VoxelTree class to process them pthread_mutex_lock(&::treeLock); serverTree.processRemoveVoxelBitstream((unsigned char*)packetData, receivedBytes); pthread_mutex_unlock(&::treeLock); } - if (packetData[0] == PACKET_HEADER_Z_COMMAND) { + if (packetData[0] == PACKET_TYPE_Z_COMMAND) { // the Z command is a special command that allows the sender to send the voxel server high level semantic // requests, like erase all, or add sphere scene char* command = (char*) &packetData[1]; // start of the command int commandLength = strlen(command); // commands are null terminated strings - int totalLength = sizeof(PACKET_HEADER_Z_COMMAND) + commandLength + 1; // 1 for null termination + int totalLength = sizeof(PACKET_TYPE_Z_COMMAND) + commandLength + 1; // 1 for null termination printf("got Z message len(%ld)= %s\n", receivedBytes, command); bool rebroadcast = true; // by default rebroadcast @@ -731,11 +731,11 @@ int main(int argc, const char * argv[]) { nodeList->broadcastToNodes(packetData, receivedBytes, &NODE_TYPE_AGENT, 1); } } - // If we got a PACKET_HEADER_HEAD_DATA, then we're talking to an NODE_TYPE_AVATAR, and we + // If we got a PACKET_TYPE_HEAD_DATA, then we're talking to an NODE_TYPE_AVATAR, and we // need to make sure we have it in our nodeList. - if (packetData[0] == PACKET_HEADER_HEAD_DATA) { + if (packetData[0] == PACKET_TYPE_HEAD_DATA) { uint16_t nodeID = 0; - unpackNodeId(packetData + sizeof(PACKET_HEADER_HEAD_DATA), &nodeID); + unpackNodeId(packetData + sizeof(PACKET_TYPE_HEAD_DATA), &nodeID); Node* node = nodeList->addOrUpdateNode(&nodePublicAddress, &nodePublicAddress, NODE_TYPE_AGENT, @@ -744,7 +744,7 @@ int main(int argc, const char * argv[]) { nodeList->updateNodeWithData(node, packetData, receivedBytes); } // If the packet is a ping, let processNodeData handle it. - if (packetData[0] == PACKET_HEADER_PING) { + if (packetData[0] == PACKET_TYPE_PING) { nodeList->processNodeData(&nodePublicAddress, packetData, receivedBytes); } } From 693463ae5beb3f60d261e4d882d79813481d26e3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 11:54:00 -0700 Subject: [PATCH 04/27] voxel-server packet version handling --- libraries/shared/src/NodeList.cpp | 2 +- libraries/shared/src/PacketHeaders.h | 6 ++++-- libraries/voxels/src/VoxelTree.cpp | 2 +- voxel-server/src/main.cpp | 17 +++++++++-------- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index a934624bad..a019131ebd 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -97,7 +97,7 @@ void NodeList::processNodeData(sockaddr *senderAddress, unsigned char *packetDat case PACKET_TYPE_PING: { char pingPacket[dataBytes]; memcpy(pingPacket, packetData, dataBytes); - pingPacket[0] = PACKET_TYPE_PING_REPLY; + populateTypeAndVersion((unsigned char*) pingPacket, PACKET_TYPE_PING_REPLY); _nodeSocket.send(senderAddress, pingPacket, dataBytes); break; } diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index ec7f717721..d521dda605 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -35,8 +35,10 @@ const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L'; const PACKET_TYPE PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY = 'C'; typedef char PACKET_VERSION; -PACKET_VERSION versionForPacketType(PACKET_TYPE header); -int populateTypeAndVersion(unsigned char* destination, PACKET_TYPE header); + +PACKET_VERSION versionForPacketType(PACKET_TYPE type); + +int populateTypeAndVersion(unsigned char* destination, PACKET_TYPE type); const int MAX_PACKET_HEADER_BYTES = sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 21e406400d..2beae43d83 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -535,7 +535,7 @@ void VoxelTree::readCodeColorBufferToTreeRecursion(VoxelNode* node, void* extraD void VoxelTree::processRemoveVoxelBitstream(unsigned char * bitstream, int bufferSizeBytes) { //unsigned short int itemNumber = (*((unsigned short int*)&bitstream[sizeof(PACKET_HEADER)])); - int atByte = sizeof(short int) + sizeof(PACKET_TYPE); + int atByte = sizeof(short int) + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); unsigned char* voxelCode = (unsigned char*)&bitstream[atByte]; while (atByte < bufferSizeBytes) { int codeLength = numberOfThreeBitSectionsInCode(voxelCode); diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 7a5fe4f816..7205023c5a 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -636,19 +636,20 @@ int main(int argc, const char * argv[]) { // check to see if we need to persist our voxel state persistVoxelsWhenDirty(); - if (nodeList->getNodeSocket()->receive(&nodePublicAddress, packetData, &receivedBytes)) { + if (nodeList->getNodeSocket()->receive(&nodePublicAddress, packetData, &receivedBytes) && + versionForPacketType(packetData[0]) == packetData[1]) { if (packetData[0] == PACKET_TYPE_SET_VOXEL || packetData[0] == PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) { bool destructive = (packetData[0] == PACKET_TYPE_SET_VOXEL_DESTRUCTIVE); PerformanceWarning warn(::shouldShowAnimationDebug, destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", ::shouldShowAnimationDebug); - unsigned short int itemNumber = (*((unsigned short int*)&packetData[1])); + unsigned short int itemNumber = (*((unsigned short int*)&packetData[2])); if (::shouldShowAnimationDebug) { printf("got %s - command from client receivedBytes=%ld itemNumber=%d\n", destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", receivedBytes,itemNumber); } - int atByte = sizeof(PACKET_TYPE) + sizeof(itemNumber); + int atByte = sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION) + sizeof(itemNumber); unsigned char* voxelData = (unsigned char*)&packetData[atByte]; while (atByte < receivedBytes) { unsigned char octets = (unsigned char)*voxelData; @@ -702,7 +703,7 @@ int main(int argc, const char * argv[]) { // the Z command is a special command that allows the sender to send the voxel server high level semantic // requests, like erase all, or add sphere scene - char* command = (char*) &packetData[1]; // start of the command + char* command = (char*) &packetData[2]; // start of the command int commandLength = strlen(command); // commands are null terminated strings int totalLength = sizeof(PACKET_TYPE_Z_COMMAND) + commandLength + 1; // 1 for null termination printf("got Z message len(%ld)= %s\n", receivedBytes, command); @@ -735,11 +736,11 @@ int main(int argc, const char * argv[]) { // need to make sure we have it in our nodeList. if (packetData[0] == PACKET_TYPE_HEAD_DATA) { uint16_t nodeID = 0; - unpackNodeId(packetData + sizeof(PACKET_TYPE_HEAD_DATA), &nodeID); + unpackNodeId(packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION), &nodeID); Node* node = nodeList->addOrUpdateNode(&nodePublicAddress, - &nodePublicAddress, - NODE_TYPE_AGENT, - nodeID); + &nodePublicAddress, + NODE_TYPE_AGENT, + nodeID); nodeList->updateNodeWithData(node, packetData, receivedBytes); } From 9b1fefe67160b5c2cb136ca4409eb7cccc961c44 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 11:55:33 -0700 Subject: [PATCH 05/27] packet version handling in audio-mixer --- audio-mixer/src/main.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 62ac66a3f4..bab2345e7f 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -345,13 +345,14 @@ int main(int argc, const char* argv[]) { } // pull any new audio data from nodes off of the network stack - while (nodeList->getNodeSocket()->receive(nodeAddress, packetData, &receivedBytes)) { + while (nodeList->getNodeSocket()->receive(nodeAddress, packetData, &receivedBytes) && + versionForPacketType(packetData[0]) == packetData[1]) { if (packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO || packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO) { Node* avatarNode = nodeList->addOrUpdateNode(nodeAddress, - nodeAddress, - NODE_TYPE_AGENT, - nodeList->getLastNodeID()); + nodeAddress, + NODE_TYPE_AGENT, + nodeList->getLastNodeID()); if (avatarNode->getNodeID() == nodeList->getLastNodeID()) { nodeList->increaseNodeID(); @@ -382,9 +383,9 @@ int main(int argc, const char* argv[]) { if (!matchingInjector) { matchingInjector = nodeList->addOrUpdateNode(NULL, - NULL, - NODE_TYPE_AUDIO_INJECTOR, - nodeList->getLastNodeID()); + NULL, + NODE_TYPE_AUDIO_INJECTOR, + nodeList->getLastNodeID()); nodeList->increaseNodeID(); } From 5faad80e123abae6f918de867e2b6e98aa1e3294 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 11:58:19 -0700 Subject: [PATCH 06/27] remove ping unknown thread, version for ping reply --- eve/src/main.cpp | 4 --- interface/src/Application.cpp | 1 - libraries/shared/src/NodeList.cpp | 43 +------------------------------ libraries/shared/src/NodeList.h | 3 --- 4 files changed, 1 insertion(+), 50 deletions(-) diff --git a/eve/src/main.cpp b/eve/src/main.cpp index 827bd67bc6..cae9221e1a 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -85,9 +85,6 @@ int main(int argc, const char* argv[]) { // start the node list thread that will kill off nodes when they stop talking nodeList->startSilentNodeRemovalThread(); - // start the ping thread that hole punches to create an active connection to other nodes - nodeList->startPingUnknownNodesThread(); - pthread_t receiveNodeDataThread; pthread_create(&receiveNodeDataThread, NULL, receiveNodeData, NULL); @@ -210,6 +207,5 @@ int main(int argc, const char* argv[]) { pthread_join(receiveNodeDataThread, NULL); // stop the node list's threads - nodeList->stopPingUnknownNodesThread(); nodeList->stopSilentNodeRemovalThread(); } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fb76e0adea..2fb7cd1e93 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -248,7 +248,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : // start the nodeList threads NodeList::getInstance()->startSilentNodeRemovalThread(); - NodeList::getInstance()->startPingUnknownNodesThread(); _window->setCentralWidget(_glWidget); diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index a019131ebd..b4f69c24bf 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -72,7 +72,6 @@ NodeList::~NodeList() { // stop the spawned threads, if they were started stopSilentNodeRemovalThread(); - stopPingUnknownNodesThread(); pthread_mutex_destroy(&mutex); } @@ -81,7 +80,7 @@ void NodeList::timePingReply(sockaddr *nodeAddress, unsigned char *packetData) { for(NodeList::iterator node = begin(); node != end(); node++) { if (socketMatch(node->getPublicSocket(), nodeAddress) || socketMatch(node->getLocalSocket(), nodeAddress)) { - int pingTime = usecTimestampNow() - *(long long *)(packetData + 1); + int pingTime = usecTimestampNow() - *(long long *)(packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION)); node->setPingMs(pingTime / 1000); break; } @@ -405,46 +404,6 @@ Node* NodeList::soloNodeOfType(char nodeType) { return NULL; } -void *pingUnknownNodes(void *args) { - - NodeList* nodeList = (NodeList*) args; - const int PING_INTERVAL_USECS = 1 * 1000000; - - timeval lastSend; - - while (!pingUnknownNodeThreadStopFlag) { - gettimeofday(&lastSend, NULL); - - for(NodeList::iterator node = nodeList->begin(); - node != nodeList->end(); - node++) { - if (!node->getActiveSocket() && node->getPublicSocket() && node->getLocalSocket()) { - // ping both of the sockets for the node so we can figure out - // which socket we can use - nodeList->getNodeSocket()->send(node->getPublicSocket(), &PACKET_TYPE_PING, 1); - nodeList->getNodeSocket()->send(node->getLocalSocket(), &PACKET_TYPE_PING, 1); - } - } - - long long usecToSleep = PING_INTERVAL_USECS - (usecTimestampNow() - usecTimestamp(&lastSend)); - - if (usecToSleep > 0) { - usleep(usecToSleep); - } - } - - return NULL; -} - -void NodeList::startPingUnknownNodesThread() { - pthread_create(&pingUnknownNodesThread, NULL, pingUnknownNodes, (void *)this); -} - -void NodeList::stopPingUnknownNodesThread() { - pingUnknownNodeThreadStopFlag = true; - pthread_join(pingUnknownNodesThread, NULL); -} - void *removeSilentNodes(void *args) { NodeList* nodeList = (NodeList*) args; long long checkTimeUSecs, sleepTime; diff --git a/libraries/shared/src/NodeList.h b/libraries/shared/src/NodeList.h index b1f7acdbb3..da9c4a556a 100644 --- a/libraries/shared/src/NodeList.h +++ b/libraries/shared/src/NodeList.h @@ -89,8 +89,6 @@ public: void startSilentNodeRemovalThread(); void stopSilentNodeRemovalThread(); - void startPingUnknownNodesThread(); - void stopPingUnknownNodesThread(); friend class NodeListIterator; private: @@ -113,7 +111,6 @@ private: uint16_t _lastNodeID; pthread_t removeSilentNodesThread; pthread_t checkInWithDomainServerThread; - pthread_t pingUnknownNodesThread; pthread_mutex_t mutex; void handlePingReply(sockaddr *nodeAddress); From 8a684244ccfeea08ae09bdbf33a4e0fdbf40192a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 12:53:07 -0700 Subject: [PATCH 07/27] packet versioning for HEAD_DATA packets --- avatar-mixer/src/main.cpp | 5 +++-- eve/src/main.cpp | 4 ++-- interface/src/Application.cpp | 3 ++- libraries/avatars/src/AvatarData.cpp | 2 +- libraries/shared/src/NodeList.cpp | 27 +++++++++++++++------------ 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/avatar-mixer/src/main.cpp b/avatar-mixer/src/main.cpp index f55218e7c6..c623c07d6b 100644 --- a/avatar-mixer/src/main.cpp +++ b/avatar-mixer/src/main.cpp @@ -92,7 +92,8 @@ int main(int argc, const char* argv[]) { NodeList::getInstance()->sendDomainServerCheckIn(); } - if (nodeList->getNodeSocket()->receive(nodeAddress, packetData, &receivedBytes)) { + if (nodeList->getNodeSocket()->receive(nodeAddress, packetData, &receivedBytes) && + versionForPacketType(packetData[0]) == packetData[1]) { switch (packetData[0]) { case PACKET_TYPE_HEAD_DATA: // grab the node ID from the packet @@ -118,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 + 1, &nodeID); + unpackNodeId(packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION), &nodeID); // let everyone else know about the update for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) { diff --git a/eve/src/main.cpp b/eve/src/main.cpp index cae9221e1a..6991c63716 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -122,7 +122,7 @@ int main(int argc, const char* argv[]) { nodeList->linkedDataCreateCallback = createAvatarDataForNode; unsigned char broadcastPacket[MAX_PACKET_SIZE]; - broadcastPacket[0] = PACKET_TYPE_HEAD_DATA; + int numHeaderBytes = populateTypeAndVersion(broadcastPacket, PACKET_TYPE_HEAD_DATA); timeval thisSend; long long numMicrosecondsSleep = 0; @@ -150,7 +150,7 @@ int main(int argc, const char* argv[]) { // make sure we actually have an avatar mixer with an active socket if (nodeList->getOwnerID() != UNKNOWN_NODE_ID && avatarMixer && avatarMixer->getActiveSocket() != NULL) { - unsigned char* packetPosition = broadcastPacket + sizeof(PACKET_TYPE); + unsigned char* packetPosition = broadcastPacket + numHeaderBytes; packetPosition += packNodeId(packetPosition, nodeList->getOwnerID()); // use the getBroadcastData method in the AvatarData class to populate the broadcastPacket buffer diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2fb7cd1e93..ad309a9000 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1988,7 +1988,8 @@ void Application::updateAvatar(float deltaTime) { unsigned char broadcastString[200]; unsigned char* endOfBroadcastStringWrite = broadcastString; - *(endOfBroadcastStringWrite++) = PACKET_TYPE_HEAD_DATA; + endOfBroadcastStringWrite += populateTypeAndVersion(endOfBroadcastStringWrite, PACKET_TYPE_HEAD_DATA); + endOfBroadcastStringWrite += packNodeId(endOfBroadcastStringWrite, nodeList->getOwnerID()); endOfBroadcastStringWrite += _myAvatar.getBroadcastData(endOfBroadcastStringWrite); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 64bde13d4a..b65746c592 100755 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -169,7 +169,7 @@ int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { } // increment to push past the packet header - sourceBuffer += sizeof(PACKET_TYPE_HEAD_DATA); + sourceBuffer += sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); unsigned char* startPosition = sourceBuffer; diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index b4f69c24bf..bce010e265 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -119,16 +119,19 @@ void NodeList::processBulkNodeData(sockaddr *senderAddress, unsigned char *packe } unsigned char *startPosition = packetData; - unsigned char *currentPosition = startPosition + 1; + unsigned char *currentPosition = startPosition + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); unsigned char packetHolder[numTotalBytes]; - packetHolder[0] = PACKET_TYPE_HEAD_DATA; + // we've already verified packet version for the bulk packet, so all head data in the packet is also up to date + populateTypeAndVersion(packetHolder, PACKET_TYPE_HEAD_DATA); uint16_t nodeID = -1; while ((currentPosition - startPosition) < numTotalBytes) { unpackNodeId(currentPosition, &nodeID); - memcpy(packetHolder + 1, currentPosition, numTotalBytes - (currentPosition - startPosition)); + memcpy(packetHolder + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION), + currentPosition, + numTotalBytes - (currentPosition - startPosition)); Node* matchingNode = nodeWithID(nodeID); @@ -138,8 +141,8 @@ void NodeList::processBulkNodeData(sockaddr *senderAddress, unsigned char *packe } currentPosition += updateNodeWithData(matchingNode, - packetHolder, - numTotalBytes - (currentPosition - startPosition)); + packetHolder, + numTotalBytes - (currentPosition - startPosition)); } unlock(); @@ -272,7 +275,7 @@ void NodeList::sendDomainServerCheckIn() { _nodeSocket.send(DOMAIN_IP, DOMAINSERVER_PORT, checkInPacket, checkInPacketSize); } -int NodeList::processDomainServerList(unsigned char *packetData, size_t dataBytes) { +int NodeList::processDomainServerList(unsigned char* packetData, size_t dataBytes) { int readNodes = 0; char nodeType; @@ -284,16 +287,16 @@ int NodeList::processDomainServerList(unsigned char *packetData, size_t dataByte sockaddr_in nodeLocalSocket; nodeLocalSocket.sin_family = AF_INET; - unsigned char *readPtr = packetData + 1; - unsigned char *startPtr = packetData; + unsigned char* readPtr = packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); + unsigned char* startPtr = packetData; while((readPtr - startPtr) < dataBytes - sizeof(uint16_t)) { nodeType = *readPtr++; - readPtr += unpackNodeId(readPtr, (uint16_t *)&nodeId); - readPtr += unpackSocket(readPtr, (sockaddr *)&nodePublicSocket); - readPtr += unpackSocket(readPtr, (sockaddr *)&nodeLocalSocket); + readPtr += unpackNodeId(readPtr, (uint16_t*) &nodeId); + readPtr += unpackSocket(readPtr, (sockaddr*) &nodePublicSocket); + readPtr += unpackSocket(readPtr, (sockaddr*) &nodeLocalSocket); - addOrUpdateNode((sockaddr *)&nodePublicSocket, (sockaddr *)&nodeLocalSocket, nodeType, nodeId); + addOrUpdateNode((sockaddr*) &nodePublicSocket, (sockaddr*) &nodeLocalSocket, nodeType, nodeId); } // read out our ID from the packet From e3d9289f1f684da0434953366bb5197b9125f092 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 13:44:01 -0700 Subject: [PATCH 08/27] refactor packet version handling and apply to DS --- avatar-mixer/src/main.cpp | 4 +-- domain-server/src/main.cpp | 20 +++++++------- libraries/shared/src/NodeList.cpp | 2 +- libraries/shared/src/PacketHeaders.cpp | 36 +++++++++++++++++++++++--- libraries/shared/src/PacketHeaders.h | 5 +++- 5 files changed, 51 insertions(+), 16 deletions(-) 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 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); From 6deaa5fd5183e376a224343b926604395fe929e6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 13:55:35 -0700 Subject: [PATCH 09/27] apply refactoring changes to PACKET_TYPE_PING --- audio-mixer/src/main.cpp | 2 +- libraries/shared/src/NodeList.cpp | 2 +- libraries/voxels/src/VoxelTree.cpp | 4 ++-- voxel-server/src/main.cpp | 17 +++++++++++------ 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index bab2345e7f..46d09a52bd 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -346,7 +346,7 @@ int main(int argc, const char* argv[]) { // pull any new audio data from nodes off of the network stack while (nodeList->getNodeSocket()->receive(nodeAddress, packetData, &receivedBytes) && - versionForPacketType(packetData[0]) == packetData[1]) { + packetVersionMatch(packetData)) { if (packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO || packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO) { Node* avatarNode = nodeList->addOrUpdateNode(nodeAddress, diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 43314b290c..210c07417b 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -80,7 +80,7 @@ void NodeList::timePingReply(sockaddr *nodeAddress, unsigned char *packetData) { for(NodeList::iterator node = begin(); node != end(); node++) { if (socketMatch(node->getPublicSocket(), nodeAddress) || socketMatch(node->getLocalSocket(), nodeAddress)) { - int pingTime = usecTimestampNow() - *(long long *)(packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION)); + int pingTime = usecTimestampNow() - *(long long *)(packetData + numBytesForPacketHeader(packetData)); node->setPingMs(pingTime / 1000); break; } diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 2beae43d83..a645ee95eb 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -533,9 +533,9 @@ void VoxelTree::readCodeColorBufferToTreeRecursion(VoxelNode* node, void* extraD } } -void VoxelTree::processRemoveVoxelBitstream(unsigned char * bitstream, int bufferSizeBytes) { +void VoxelTree::processRemoveVoxelBitstream(unsigned char* bitstream, int bufferSizeBytes) { //unsigned short int itemNumber = (*((unsigned short int*)&bitstream[sizeof(PACKET_HEADER)])); - int atByte = sizeof(short int) + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); + int atByte = sizeof(short int) + numBytesForPacketHeader(bitstream); unsigned char* voxelCode = (unsigned char*)&bitstream[atByte]; while (atByte < bufferSizeBytes) { int codeLength = numberOfThreeBitSectionsInCode(voxelCode); diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 7205023c5a..78f6eb2233 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -637,19 +637,23 @@ int main(int argc, const char * argv[]) { persistVoxelsWhenDirty(); if (nodeList->getNodeSocket()->receive(&nodePublicAddress, packetData, &receivedBytes) && - versionForPacketType(packetData[0]) == packetData[1]) { + packetVersionMatch(packetData)) { + + int numBytesPacketHeader = numBytesForPacketHeader(packetData); + if (packetData[0] == PACKET_TYPE_SET_VOXEL || packetData[0] == PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) { bool destructive = (packetData[0] == PACKET_TYPE_SET_VOXEL_DESTRUCTIVE); PerformanceWarning warn(::shouldShowAnimationDebug, destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", ::shouldShowAnimationDebug); - unsigned short int itemNumber = (*((unsigned short int*)&packetData[2])); + + unsigned short int itemNumber = (*((unsigned short int*)(packetData + numBytesPacketHeader))); if (::shouldShowAnimationDebug) { printf("got %s - command from client receivedBytes=%ld itemNumber=%d\n", destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", receivedBytes,itemNumber); } - int atByte = sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION) + sizeof(itemNumber); + int atByte = numBytesPacketHeader + sizeof(itemNumber); unsigned char* voxelData = (unsigned char*)&packetData[atByte]; while (atByte < receivedBytes) { unsigned char octets = (unsigned char)*voxelData; @@ -703,9 +707,10 @@ int main(int argc, const char * argv[]) { // the Z command is a special command that allows the sender to send the voxel server high level semantic // requests, like erase all, or add sphere scene - char* command = (char*) &packetData[2]; // start of the command + + char* command = (char*) &packetData[numBytesPacketHeader]; // start of the command int commandLength = strlen(command); // commands are null terminated strings - int totalLength = sizeof(PACKET_TYPE_Z_COMMAND) + commandLength + 1; // 1 for null termination + int totalLength = numBytesPacketHeader + commandLength + 1; // 1 for null termination printf("got Z message len(%ld)= %s\n", receivedBytes, command); bool rebroadcast = true; // by default rebroadcast @@ -736,7 +741,7 @@ int main(int argc, const char * argv[]) { // need to make sure we have it in our nodeList. if (packetData[0] == PACKET_TYPE_HEAD_DATA) { uint16_t nodeID = 0; - unpackNodeId(packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION), &nodeID); + unpackNodeId(packetData + numBytesPacketHeader, &nodeID); Node* node = nodeList->addOrUpdateNode(&nodePublicAddress, &nodePublicAddress, NODE_TYPE_AGENT, From 729074b50215e2013a29b25168a9d7142ef543c8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 13:58:20 -0700 Subject: [PATCH 10/27] use packet header byte methods in NodeList bulk processing --- libraries/shared/src/NodeList.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 210c07417b..9ba2e54008 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -117,9 +117,11 @@ void NodeList::processBulkNodeData(sockaddr *senderAddress, unsigned char *packe bulkSendNode->setLastHeardMicrostamp(usecTimestampNow()); bulkSendNode->recordBytesReceived(numTotalBytes); } - + + int numBytesPacketHeader = numBytesForPacketHeader(packetData); + unsigned char *startPosition = packetData; - unsigned char *currentPosition = startPosition + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); + unsigned char *currentPosition = startPosition + numBytesPacketHeader; unsigned char packetHolder[numTotalBytes]; // we've already verified packet version for the bulk packet, so all head data in the packet is also up to date @@ -129,7 +131,7 @@ void NodeList::processBulkNodeData(sockaddr *senderAddress, unsigned char *packe while ((currentPosition - startPosition) < numTotalBytes) { unpackNodeId(currentPosition, &nodeID); - memcpy(packetHolder + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION), + memcpy(packetHolder + numBytesPacketHeader, currentPosition, numTotalBytes - (currentPosition - startPosition)); From c64a961a380b81edb249af2fe3a38deda365b8cf Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 14:01:10 -0700 Subject: [PATCH 11/27] packet version handling in VoxelSystem parseData --- interface/src/VoxelSystem.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 8912762d6e..ca939bf322 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -112,32 +112,31 @@ float VoxelSystem::getVoxelsBytesReadPerSecondAverage() { int VoxelSystem::parseData(unsigned char* sourceBuffer, int numBytes) { unsigned char command = *sourceBuffer; - unsigned char *voxelData = sourceBuffer + 1; + int numBytesPacketHeader = numBytesForPacketHeader(sourceBuffer); + unsigned char *voxelData = sourceBuffer + numBytesPacketHeader; pthread_mutex_lock(&_treeLock); switch(command) { - case PACKET_TYPE_VOXEL_DATA: - { + case PACKET_TYPE_VOXEL_DATA: { PerformanceWarning warn(_renderWarningsOn, "readBitstreamToTree()"); // ask the VoxelTree to read the bitstream into the tree - _tree->readBitstreamToTree(voxelData, numBytes - 1, WANT_COLOR, WANT_EXISTS_BITS); + _tree->readBitstreamToTree(voxelData, numBytes - numBytesPacketHeader, WANT_COLOR, WANT_EXISTS_BITS); } - break; - case PACKET_TYPE_VOXEL_DATA_MONOCHROME: - { + break; + case PACKET_TYPE_VOXEL_DATA_MONOCHROME: { PerformanceWarning warn(_renderWarningsOn, "readBitstreamToTree()"); // ask the VoxelTree to read the MONOCHROME bitstream into the tree - _tree->readBitstreamToTree(voxelData, numBytes - 1, NO_COLOR, WANT_EXISTS_BITS); + _tree->readBitstreamToTree(voxelData, numBytes - numBytesPacketHeader, NO_COLOR, WANT_EXISTS_BITS); } - break; + break; case PACKET_TYPE_Z_COMMAND: // the Z command is a special command that allows the sender to send high level semantic // requests, like erase all, or add sphere scene, different receivers may handle these // messages differently char* packetData = (char *)sourceBuffer; - char* command = &packetData[1]; // start of the command + char* command = &packetData[numBytesPacketHeader]; // start of the command int commandLength = strlen(command); // commands are null terminated strings int totalLength = 1+commandLength+1; From 8f7a3f3567f9845b0de36474ab6411a50343960c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 14:07:34 -0700 Subject: [PATCH 12/27] use packet version helpers for PACKET_TYPE_INJECT_AUDIO --- audio-mixer/src/InjectedAudioRingBuffer.cpp | 2 +- injector/src/main.cpp | 7 ++++--- libraries/audio/src/AudioInjector.cpp | 5 ++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/audio-mixer/src/InjectedAudioRingBuffer.cpp b/audio-mixer/src/InjectedAudioRingBuffer.cpp index 3309e79efc..7e93c7716c 100644 --- a/audio-mixer/src/InjectedAudioRingBuffer.cpp +++ b/audio-mixer/src/InjectedAudioRingBuffer.cpp @@ -21,7 +21,7 @@ InjectedAudioRingBuffer::InjectedAudioRingBuffer() : } int InjectedAudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { - unsigned char* currentBuffer = sourceBuffer + sizeof(PACKET_TYPE_INJECT_AUDIO); + unsigned char* currentBuffer = sourceBuffer + numBytesForPacketHeader(sourceBuffer); // pull stream identifier from the packet memcpy(&_streamIdentifier, currentBuffer, sizeof(_streamIdentifier)); diff --git a/injector/src/main.cpp b/injector/src/main.cpp index 68c0938ab0..fe68c99a36 100644 --- a/injector/src/main.cpp +++ b/injector/src/main.cpp @@ -144,7 +144,8 @@ int main(int argc, char* argv[]) { nodeList->linkedDataCreateCallback = createAvatarDataForNode; timeval lastSend = {}; - unsigned char broadcastPacket = PACKET_TYPE_INJECT_AUDIO; + int numBytesPacketHeader = numBytesForPacketHeader((unsigned char*) &PACKET_TYPE_INJECT_AUDIO); + unsigned char* broadcastPacket = new unsigned char[numBytesPacketHeader]; timeval lastDomainServerCheckIn = {}; @@ -210,8 +211,8 @@ int main(int argc, char* argv[]) { // use the UDPSocket instance attached to our node list to ask avatar mixer for a list of avatars nodeList->getNodeSocket()->send(avatarMixer->getActiveSocket(), - &broadcastPacket, - sizeof(broadcastPacket)); + &broadcastPacket, + numBytesPacketHeader); } } else { if (!injector.isInjectingAudio() && (::shouldLoopAudio || !::hasInjectedAudioOnce)) { diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 44a8257e4a..b1d5839acd 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -70,7 +70,7 @@ void AudioInjector::injectAudio(UDPSocket* injectorSocket, sockaddr* destination timeval startTime; // calculate the number of bytes required for additional data - int leadingBytes = sizeof(PACKET_TYPE) + int leadingBytes = numBytesForPacketHeader((unsigned char*) &PACKET_TYPE_INJECT_AUDIO) + sizeof(_streamIdentifier) + sizeof(_position) + sizeof(_orientation) @@ -79,8 +79,7 @@ void AudioInjector::injectAudio(UDPSocket* injectorSocket, sockaddr* destination unsigned char dataPacket[(BUFFER_LENGTH_SAMPLES_PER_CHANNEL * sizeof(int16_t)) + leadingBytes]; - dataPacket[0] = PACKET_TYPE_INJECT_AUDIO; - unsigned char *currentPacketPtr = dataPacket + sizeof(PACKET_TYPE_INJECT_AUDIO); + unsigned char *currentPacketPtr = dataPacket + populateTypeAndVersion(dataPacket, PACKET_TYPE_INJECT_AUDIO); // copy the identifier for this injector memcpy(currentPacketPtr, &_streamIdentifier, sizeof(_streamIdentifier)); From 81e6bccd0800034dc590be3ad3f2468095c8b2d9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 14:13:36 -0700 Subject: [PATCH 13/27] use packet version helpers in parseData methods --- audio-mixer/src/PositionalAudioRingBuffer.cpp | 2 +- interface/src/Environment.cpp | 7 +++++-- libraries/audio/src/AudioRingBuffer.cpp | 3 ++- libraries/avatars/src/AvatarData.cpp | 3 ++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/audio-mixer/src/PositionalAudioRingBuffer.cpp b/audio-mixer/src/PositionalAudioRingBuffer.cpp index b8cd32bbf6..60ec9a425e 100644 --- a/audio-mixer/src/PositionalAudioRingBuffer.cpp +++ b/audio-mixer/src/PositionalAudioRingBuffer.cpp @@ -22,7 +22,7 @@ PositionalAudioRingBuffer::PositionalAudioRingBuffer() : } int PositionalAudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { - unsigned char* currentBuffer = sourceBuffer + sizeof(PACKET_TYPE); + unsigned char* currentBuffer = sourceBuffer + numBytesForPacketHeader(sourceBuffer); currentBuffer += parsePositionalData(currentBuffer, numBytes - (currentBuffer - sourceBuffer)); currentBuffer += parseAudioSamples(currentBuffer, numBytes - (currentBuffer - sourceBuffer)); diff --git a/interface/src/Environment.cpp b/interface/src/Environment.cpp index d087281569..35ed121e38 100644 --- a/interface/src/Environment.cpp +++ b/interface/src/Environment.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include "Camera.h" @@ -138,8 +139,10 @@ bool Environment::findCapsulePenetration(const glm::vec3& start, const glm::vec3 int Environment::parseData(sockaddr *senderAddress, unsigned char* sourceBuffer, int numBytes) { // push past the packet header unsigned char* start = sourceBuffer; - sourceBuffer++; - numBytes--; + + int numBytesPacketHeader = numBytesForPacketHeader(sourceBuffer); + sourceBuffer += numBytesPacketHeader; + numBytes -= numBytesPacketHeader; // get the lock for the duration of the call QMutexLocker locker(&_mutex); diff --git a/libraries/audio/src/AudioRingBuffer.cpp b/libraries/audio/src/AudioRingBuffer.cpp index 8e2e28e964..d5830ee72f 100644 --- a/libraries/audio/src/AudioRingBuffer.cpp +++ b/libraries/audio/src/AudioRingBuffer.cpp @@ -34,7 +34,8 @@ void AudioRingBuffer::reset() { } int AudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { - return parseAudioSamples(sourceBuffer + sizeof(PACKET_TYPE_MIXED_AUDIO), numBytes - sizeof(PACKET_TYPE_MIXED_AUDIO)); + int numBytesPacketHeader = numBytesForPacketHeader(sourceBuffer); + return parseAudioSamples(sourceBuffer + numBytesPacketHeader, numBytes - numBytesPacketHeader); } int AudioRingBuffer::parseAudioSamples(unsigned char* sourceBuffer, int numBytes) { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index b65746c592..72327cc155 100755 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -169,7 +169,8 @@ int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { } // increment to push past the packet header - sourceBuffer += sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION); + int numBytesPacketHeader = numBytesForPacketHeader(sourceBuffer); + sourceBuffer += numBytesPacketHeader; unsigned char* startPosition = sourceBuffer; From 7d20455d83ed5f81f374789a59d46b49bb6c4fa8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 14:16:04 -0700 Subject: [PATCH 14/27] use packet version helpers for PACKET_TYPE_MIXED_AUDIO --- audio-mixer/src/main.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 46d09a52bd..c602a37590 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -103,8 +103,9 @@ int main(int argc, const char* argv[]) { int nextFrame = 0; timeval startTime; - unsigned char clientPacket[BUFFER_LENGTH_BYTES_STEREO + sizeof(PACKET_TYPE_MIXED_AUDIO)]; - clientPacket[0] = PACKET_TYPE_MIXED_AUDIO; + int numBytesPacketHeader = numBytesForPacketHeader((unsigned char*) &PACKET_TYPE_MIXED_AUDIO); + unsigned char clientPacket[BUFFER_LENGTH_BYTES_STEREO + numBytesPacketHeader]; + populateTypeAndVersion(clientPacket, PACKET_TYPE_MIXED_AUDIO); int16_t clientSamples[BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 2] = {}; @@ -325,7 +326,7 @@ int main(int argc, const char* argv[]) { } } - memcpy(clientPacket + sizeof(PACKET_TYPE_MIXED_AUDIO), clientSamples, sizeof(clientSamples)); + memcpy(clientPacket + numBytesPacketHeader, clientSamples, sizeof(clientSamples)); nodeList->getNodeSocket()->send(node->getPublicSocket(), clientPacket, sizeof(clientPacket)); } } From b816761a74710a63bb366732e6b5d082aacc400d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 14:24:08 -0700 Subject: [PATCH 15/27] use packet version helpers for PACKET_TYPE_MICROPHONE --- interface/src/Audio.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index b381a3c178..085049d6e1 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -99,16 +99,18 @@ inline void Audio::performIO(int16_t* inputLeft, int16_t* outputLeft, int16_t* o glm::vec3 headPosition = interfaceAvatar->getHeadJointPosition(); glm::quat headOrientation = interfaceAvatar->getHead().getOrientation(); - int leadingBytes = sizeof(PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO) + sizeof(headPosition) + sizeof(headOrientation); + int numBytesPacketHeader = numBytesForPacketHeader((unsigned char*) &PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO); + int leadingBytes = numBytesPacketHeader + sizeof(headPosition) + sizeof(headOrientation); // we need the amount of bytes in the buffer + 1 for type // + 12 for 3 floats for position + float for bearing + 1 attenuation byte unsigned char dataPacket[BUFFER_LENGTH_BYTES_PER_CHANNEL + leadingBytes]; - dataPacket[0] = (Application::getInstance()->shouldEchoAudio()) + PACKET_TYPE packetType = (Application::getInstance()->shouldEchoAudio()) ? PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO : PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO; - unsigned char *currentPacketPtr = dataPacket + 1; + + unsigned char *currentPacketPtr = dataPacket + populateTypeAndVersion(dataPacket, packetType); // memcpy the three float positions memcpy(currentPacketPtr, &headPosition, sizeof(headPosition)); From 374fffb1512484702ce7d97144797f18dd54fcba Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 14:40:15 -0700 Subject: [PATCH 16/27] use packet version helpers for PACKET_TYPE_SET_VOXEL commands --- interface/src/Application.cpp | 23 ++++++++++++-------- libraries/shared/src/SharedUtil.cpp | 33 +++++++++++++++++------------ 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ad309a9000..42a58abab7 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1312,7 +1312,8 @@ bool Application::sendVoxelsOperation(VoxelNode* node, void* extraData) { // if we have room don't have room in the buffer, then send the previously generated message first if (args->bufferInUse + codeAndColorLength > MAXIMUM_EDIT_VOXEL_MESSAGE_SIZE) { controlledBroadcastToNodes(args->messageBuffer, args->bufferInUse, & NODE_TYPE_VOXEL_SERVER, 1); - args->bufferInUse = sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int); // reset + args->bufferInUse = numBytesForPacketHeader((unsigned char*) &PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + + sizeof(unsigned short int); // reset } // copy this node's code color details into our buffer. @@ -1375,10 +1376,12 @@ void Application::importVoxels() { // the server as an set voxel message, this will also rebase the voxels to the new location unsigned char* calculatedOctCode = NULL; SendVoxelsOperationArgs args; - args.messageBuffer[0] = PACKET_TYPE_SET_VOXEL_DESTRUCTIVE; - unsigned short int* sequenceAt = (unsigned short int*)&args.messageBuffer[sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE)]; + + int numBytesPacketHeader = populateTypeAndVersion(args.messageBuffer, PACKET_TYPE_SET_VOXEL_DESTRUCTIVE); + + unsigned short int* sequenceAt = (unsigned short int*)&args.messageBuffer[numBytesPacketHeader]; *sequenceAt = 0; - args.bufferInUse = sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int); // set to command + sequence + args.bufferInUse = numBytesPacketHeader + sizeof(unsigned short int); // set to command + sequence // we only need the selected voxel to get the newBaseOctCode, which we can actually calculate from the // voxel size/position details. @@ -1391,7 +1394,7 @@ void Application::importVoxels() { importVoxels.recurseTreeWithOperation(sendVoxelsOperation, &args); // If we have voxels left in the packet, then send the packet - if (args.bufferInUse > (sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int))) { + if (args.bufferInUse > (numBytesPacketHeader + sizeof(unsigned short int))) { controlledBroadcastToNodes(args.messageBuffer, args.bufferInUse, & NODE_TYPE_VOXEL_SERVER, 1); } @@ -1426,10 +1429,12 @@ void Application::pasteVoxels() { // Recurse the clipboard tree, where everything is root relative, and send all the colored voxels to // the server as an set voxel message, this will also rebase the voxels to the new location SendVoxelsOperationArgs args; - args.messageBuffer[0] = PACKET_TYPE_SET_VOXEL_DESTRUCTIVE; - unsigned short int* sequenceAt = (unsigned short int*)&args.messageBuffer[sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE)]; + + int numBytesPacketHeader = populateTypeAndVersion(args.messageBuffer, PACKET_TYPE_SET_VOXEL_DESTRUCTIVE); + + unsigned short int* sequenceAt = (unsigned short int*)&args.messageBuffer[numBytesPacketHeader]; *sequenceAt = 0; - args.bufferInUse = sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int); // set to command + sequence + args.bufferInUse = numBytesPacketHeader + sizeof(unsigned short int); // set to command + sequence // we only need the selected voxel to get the newBaseOctCode, which we can actually calculate from the // voxel size/position details. If we don't have an actual selectedNode then use the mouseVoxel to create a @@ -1443,7 +1448,7 @@ void Application::pasteVoxels() { _clipboardTree.recurseTreeWithOperation(sendVoxelsOperation, &args); // If we have voxels left in the packet, then send the packet - if (args.bufferInUse > (sizeof(PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) + sizeof(unsigned short int))) { + if (args.bufferInUse > (numBytesPacketHeader + sizeof(unsigned short int))) { controlledBroadcastToNodes(args.messageBuffer, args.bufferInUse, & NODE_TYPE_VOXEL_SERVER, 1); } diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index bdc35ff3f5..4a5a78b4e3 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -11,17 +11,20 @@ #include #include #include + #ifdef _WIN32 #include "Syssocket.h" #endif -#include "Log.h" -#include "SharedUtil.h" -#include "OctalCode.h" #ifdef __APPLE__ #include #endif +#include "Log.h" +#include "OctalCode.h" +#include "PacketHeaders.h" +#include "SharedUtil.h" + long long usecTimestamp(timeval *time) { return (time->tv_sec * 1000000 + time->tv_usec); } @@ -209,13 +212,14 @@ bool createVoxelEditMessage(unsigned char command, short int sequence, int messageSize = MAXIMUM_EDIT_VOXEL_MESSAGE_SIZE; // just a guess for now int actualMessageSize = 3; unsigned char* messageBuffer = new unsigned char[messageSize]; - unsigned short int* sequenceAt = (unsigned short int*)&messageBuffer[1]; - messageBuffer[0]=command; - *sequenceAt=sequence; - unsigned char* copyAt = &messageBuffer[3]; + int numBytesPacketHeader = populateTypeAndVersion(messageBuffer, command); + unsigned short int* sequenceAt = (unsigned short int*) &messageBuffer[numBytesPacketHeader]; + + *sequenceAt = sequence; + unsigned char* copyAt = &messageBuffer[numBytesPacketHeader + sizeof(sequence)]; - for (int i=0;i MAXIMUM_EDIT_VOXEL_MESSAGE_SIZE) { - success=false; + success = false; } else { // add it to our message - memcpy(copyAt,voxelData,lengthOfVoxelData); - copyAt+=lengthOfVoxelData; - actualMessageSize+=lengthOfVoxelData; + memcpy(copyAt, voxelData, lengthOfVoxelData); + copyAt += lengthOfVoxelData; + actualMessageSize += lengthOfVoxelData; } // cleanup delete[] voxelData; @@ -238,9 +242,10 @@ bool createVoxelEditMessage(unsigned char command, short int sequence, if (success) { // finally, copy the result to the output bufferOut = new unsigned char[actualMessageSize]; - sizeOut=actualMessageSize; - memcpy(bufferOut,messageBuffer,actualMessageSize); + sizeOut = actualMessageSize; + memcpy(bufferOut, messageBuffer, actualMessageSize); } + delete[] messageBuffer; // clean up our temporary buffer return success; } From a287d6d940e1d5c1012785103c2a375217c2600f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 14:43:16 -0700 Subject: [PATCH 17/27] use packet version helpers for PACKET_TYPE_VOXEL_DATA --- voxel-server/src/VoxelNodeData.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/voxel-server/src/VoxelNodeData.cpp b/voxel-server/src/VoxelNodeData.cpp index 2b4b405c48..98af7bb847 100644 --- a/voxel-server/src/VoxelNodeData.cpp +++ b/voxel-server/src/VoxelNodeData.cpp @@ -27,9 +27,10 @@ VoxelNodeData::VoxelNodeData(Node* owningNode) : void VoxelNodeData::resetVoxelPacket() { - _voxelPacket[0] = getWantColor() ? PACKET_TYPE_VOXEL_DATA : PACKET_TYPE_VOXEL_DATA_MONOCHROME; - _voxelPacketAt = &_voxelPacket[1]; - _voxelPacketAvailableBytes = MAX_VOXEL_PACKET_SIZE - 1; + PACKET_TYPE voxelPacketType = getWantColor() ? PACKET_TYPE_VOXEL_DATA : PACKET_TYPE_VOXEL_DATA_MONOCHROME; + int numBytesPacketHeader = populateTypeAndVersion(_voxelPacket, voxelPacketType); + _voxelPacketAt = _voxelPacket + numBytesPacketHeader; + _voxelPacketAvailableBytes = MAX_VOXEL_PACKET_SIZE - numBytesPacketHeader; _voxelPacketWaiting = false; } From 202d446f076bb7f8921446e702af5d71296fe85a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 14:59:00 -0700 Subject: [PATCH 18/27] use packet version helpers for PACKET_TYPE_AVATAR_VOXEL_URL --- interface/src/Application.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 42a58abab7..fe9ae8b3fc 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -993,7 +993,11 @@ void Application::sendAvatarVoxelURLMessage(const QUrl& url) { return; // we don't yet know who we are } QByteArray message; - message.append(PACKET_TYPE_AVATAR_VOXEL_URL); + + char packetHeader[MAX_PACKET_HEADER_BYTES]; + int numBytesPacketHeader = populateTypeAndVersion((unsigned char*) packetHeader, PACKET_TYPE_AVATAR_VOXEL_URL); + + message.append(packetHeader, numBytesPacketHeader); message.append((const char*)&ownerID, sizeof(ownerID)); message.append(url.toEncoded()); @@ -1002,8 +1006,9 @@ void Application::sendAvatarVoxelURLMessage(const QUrl& url) { void Application::processAvatarVoxelURLMessage(unsigned char *packetData, size_t dataBytes) { // skip the header - packetData++; - dataBytes--; + int numBytesPacketHeader = numBytesForPacketHeader(packetData); + packetData += numBytesPacketHeader; + dataBytes -= numBytesPacketHeader; // read the node id uint16_t nodeID = *(uint16_t*)packetData; From 185d5bb0a2cb2a6ed30d5eb7c321897391ee9525 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 15:01:57 -0700 Subject: [PATCH 19/27] use packet version helpers for PACKET_TYPE_TRANSMITTER_DATA --- interface/src/Transmitter.cpp | 21 ++++++++++++++------- interface/src/Transmitter.h | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/interface/src/Transmitter.cpp b/interface/src/Transmitter.cpp index 8cbb4a5c29..b16fb79295 100644 --- a/interface/src/Transmitter.cpp +++ b/interface/src/Transmitter.cpp @@ -3,15 +3,20 @@ // hifi // // Created by Philip Rosedale on 5/20/13. -// +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // -#include "Transmitter.h" -#include "InterfaceConfig.h" -#include "Util.h" #include + #include + +#include + +#include "InterfaceConfig.h" #include "Log.h" +#include "Transmitter.h" +#include "Util.h" + const float DELTA_TIME = 1.f / 60.f; const float DECAY_RATE = 0.15f; @@ -45,7 +50,9 @@ void Transmitter::resetLevels() { } void Transmitter::processIncomingData(unsigned char* packetData, int numBytes) { - const int PACKET_HEADER_SIZE = 1; // Packet's first byte is 'T' + // Packet's first byte is 'T' + int numBytesPacketHeader = numBytesForPacketHeader(packetData); + const int ROTATION_MARKER_SIZE = 1; // 'R' = Rotation (clockwise about x,y,z) const int ACCELERATION_MARKER_SIZE = 1; // 'A' = Acceleration (x,y,z) if (!_lastReceivedPacket) { @@ -53,10 +60,10 @@ void Transmitter::processIncomingData(unsigned char* packetData, int numBytes) { } gettimeofday(_lastReceivedPacket, NULL); - if (numBytes == PACKET_HEADER_SIZE + ROTATION_MARKER_SIZE + ACCELERATION_MARKER_SIZE + if (numBytes == numBytesPacketHeader + ROTATION_MARKER_SIZE + ACCELERATION_MARKER_SIZE + sizeof(_lastRotationRate) + sizeof(_lastAcceleration) + sizeof(_touchState.x) + sizeof(_touchState.y) + sizeof(_touchState.state)) { - unsigned char* packetDataPosition = &packetData[PACKET_HEADER_SIZE + ROTATION_MARKER_SIZE]; + unsigned char* packetDataPosition = packetData + numBytesPacketHeader + ROTATION_MARKER_SIZE; memcpy(&_lastRotationRate, packetDataPosition, sizeof(_lastRotationRate)); packetDataPosition += sizeof(_lastRotationRate) + ACCELERATION_MARKER_SIZE; memcpy(&_lastAcceleration, packetDataPosition, sizeof(_lastAcceleration)); diff --git a/interface/src/Transmitter.h b/interface/src/Transmitter.h index 95d80249e8..27426e1d27 100644 --- a/interface/src/Transmitter.h +++ b/interface/src/Transmitter.h @@ -3,7 +3,7 @@ // hifi // // Created by Philip Rosedale on 5/20/13. -// +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // #ifndef __hifi__Transmitter__ From c8b0e4bfe72725b55c684d1c66063e32c3fbc410 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 15:04:49 -0700 Subject: [PATCH 20/27] use packet version helpers for PACKET_TYPE_ENVIRONMENT_DATA --- voxel-server/src/main.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 78f6eb2233..c25d352228 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -201,10 +201,12 @@ void resInVoxelDistributor(NodeList* nodeList, // send the environment packets if (shouldSendEnvironments) { int envPacketLength = 1; - *tempOutputBuffer = PACKET_TYPE_ENVIRONMENT_DATA; - for (int i = 0; i < sizeof(environmentData) / sizeof(environmentData[0]); i++) { + int numBytesPacketHeader = populateTypeAndVersion(tempOutputBuffer, PACKET_TYPE_ENVIRONMENT_DATA); + + for (int i = 0; i < sizeof(environmentData) / numBytesPacketHeader; i++) { envPacketLength += environmentData[i].getBroadcastData(tempOutputBuffer + envPacketLength); } + nodeList->getNodeSocket()->send(node->getActiveSocket(), tempOutputBuffer, envPacketLength); trueBytesSent += envPacketLength; truePacketsSent++; @@ -387,10 +389,13 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, // send the environment packet if (shouldSendEnvironments) { int envPacketLength = 1; - *tempOutputBuffer = PACKET_TYPE_ENVIRONMENT_DATA; - for (int i = 0; i < sizeof(environmentData) / sizeof(environmentData[0]); i++) { + + int numBytesPacketHeader = populateTypeAndVersion(tempOutputBuffer, PACKET_TYPE_ENVIRONMENT_DATA); + + for (int i = 0; i < sizeof(environmentData) / numBytesPacketHeader; i++) { envPacketLength += environmentData[i].getBroadcastData(tempOutputBuffer + envPacketLength); } + nodeList->getNodeSocket()->send(node->getActiveSocket(), tempOutputBuffer, envPacketLength); trueBytesSent += envPacketLength; truePacketsSent++; From b482f479b65931151e9a89d358e5dbc9bd45a303 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 15:09:14 -0700 Subject: [PATCH 21/27] more packet version changes to various server targets --- animation-server/src/main.cpp | 3 ++- eve/src/main.cpp | 3 ++- injector/src/main.cpp | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/animation-server/src/main.cpp b/animation-server/src/main.cpp index 876512e13a..b838ed7516 100644 --- a/animation-server/src/main.cpp +++ b/animation-server/src/main.cpp @@ -724,7 +724,8 @@ int main(int argc, const char * argv[]) } // Nodes sending messages to us... - if (nodeList->getNodeSocket()->receive(&nodePublicAddress, packetData, &receivedBytes)) { + if (nodeList->getNodeSocket()->receive(&nodePublicAddress, packetData, &receivedBytes) && + packetVersionMatch(packetData)) { NodeList::getInstance()->processNodeData(&nodePublicAddress, packetData, receivedBytes); } } diff --git a/eve/src/main.cpp b/eve/src/main.cpp index 6991c63716..a55095aa8a 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -49,7 +49,8 @@ void *receiveNodeData(void *args) { NodeList* nodeList = NodeList::getInstance(); while (!::stopReceiveNodeDataThread) { - if (nodeList->getNodeSocket()->receive(&senderAddress, incomingPacket, &bytesReceived)) { + if (nodeList->getNodeSocket()->receive(&senderAddress, incomingPacket, &bytesReceived) && + packetVersionMatch(incomingPacket)) { switch (incomingPacket[0]) { case PACKET_TYPE_BULK_AVATAR_DATA: // this is the positional data for other nodes diff --git a/injector/src/main.cpp b/injector/src/main.cpp index fe68c99a36..200e6d4710 100644 --- a/injector/src/main.cpp +++ b/injector/src/main.cpp @@ -169,7 +169,8 @@ int main(int argc, char* argv[]) { NodeList::getInstance()->sendDomainServerCheckIn(); } - while (nodeList->getNodeSocket()->receive(&senderAddress, incomingPacket, &bytesReceived)) { + while (nodeList->getNodeSocket()->receive(&senderAddress, incomingPacket, &bytesReceived) && + packetVersionMatch(incomingPacket)) { switch (incomingPacket[0]) { case PACKET_TYPE_BULK_AVATAR_DATA: // this is the positional data for other nodes // pass that off to the nodeList processBulkNodeData method From aaaba9c42edf54d8499a24c081fd5f7cd21e26ed Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 8 Jul 2013 15:14:18 -0700 Subject: [PATCH 22/27] more packet version refactoring --- interface/src/Application.cpp | 2 +- libraries/shared/src/PacketHeaders.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fe9ae8b3fc..1483fcf610 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2891,7 +2891,7 @@ void* Application::networkReceive(void* args) { app->_packetCount++; app->_bytesCount += bytesReceived; - if (app->_incomingPacket[1] == versionForPacketType(app->_incomingPacket[0])) { + if (packetVersionMatch(app->_incomingPacket)) { // only process this packet if we have a match on the packet version switch (app->_incomingPacket[0]) { case PACKET_TYPE_TRANSMITTER_DATA_V2: diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp index 7188ea8179..9f8314e0b7 100644 --- a/libraries/shared/src/PacketHeaders.cpp +++ b/libraries/shared/src/PacketHeaders.cpp @@ -6,6 +6,8 @@ // Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // +#include + #include "PacketHeaders.h" PACKET_VERSION versionForPacketType(PACKET_TYPE type) { @@ -19,7 +21,12 @@ PACKET_VERSION versionForPacketType(PACKET_TYPE 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]); + if (packetHeader[1] == versionForPacketType(packetHeader[0])) { + return true; + } else { + printf("There is a packet version mismatch for packet with header %c\n", packetHeader[0]); + return false; + } } int populateTypeAndVersion(unsigned char* destinationHeader, PACKET_TYPE type) { From cc10afb8c41daa31bb1099ba640422bbc550ba58 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 11 Jul 2013 11:07:27 -0700 Subject: [PATCH 23/27] send brodcastPacket instead of pointer to broadcastPacket --- injector/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/injector/src/main.cpp b/injector/src/main.cpp index 200e6d4710..e2c1effc15 100644 --- a/injector/src/main.cpp +++ b/injector/src/main.cpp @@ -212,7 +212,7 @@ int main(int argc, char* argv[]) { // use the UDPSocket instance attached to our node list to ask avatar mixer for a list of avatars nodeList->getNodeSocket()->send(avatarMixer->getActiveSocket(), - &broadcastPacket, + broadcastPacket, numBytesPacketHeader); } } else { From 430f255730023c4baef9e6eadddeca7f2820200a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 11 Jul 2013 11:10:03 -0700 Subject: [PATCH 24/27] type squish in Audio class --- interface/src/Audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 085049d6e1..7a480cff57 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -110,7 +110,7 @@ inline void Audio::performIO(int16_t* inputLeft, int16_t* outputLeft, int16_t* o ? PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO : PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO; - unsigned char *currentPacketPtr = dataPacket + populateTypeAndVersion(dataPacket, packetType); + unsigned char* currentPacketPtr = dataPacket + populateTypeAndVersion(dataPacket, packetType); // memcpy the three float positions memcpy(currentPacketPtr, &headPosition, sizeof(headPosition)); From 38a33e0283d5b8ee959c81843967275e14dd9eed Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 11 Jul 2013 11:11:33 -0700 Subject: [PATCH 25/27] couple more type squishes --- interface/src/VoxelSystem.cpp | 2 +- libraries/audio/src/AudioInjector.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index f1caad161c..05180ebca4 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -114,7 +114,7 @@ int VoxelSystem::parseData(unsigned char* sourceBuffer, int numBytes) { unsigned char command = *sourceBuffer; int numBytesPacketHeader = numBytesForPacketHeader(sourceBuffer); - unsigned char *voxelData = sourceBuffer + numBytesPacketHeader; + unsigned char* voxelData = sourceBuffer + numBytesPacketHeader; pthread_mutex_lock(&_treeLock); diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index c0df34b677..a2ba56b8ef 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -79,7 +79,7 @@ void AudioInjector::injectAudio(UDPSocket* injectorSocket, sockaddr* destination unsigned char dataPacket[(BUFFER_LENGTH_SAMPLES_PER_CHANNEL * sizeof(int16_t)) + leadingBytes]; - unsigned char *currentPacketPtr = dataPacket + populateTypeAndVersion(dataPacket, PACKET_TYPE_INJECT_AUDIO); + unsigned char* currentPacketPtr = dataPacket + populateTypeAndVersion(dataPacket, PACKET_TYPE_INJECT_AUDIO); // copy the identifier for this injector memcpy(currentPacketPtr, &_streamIdentifier, sizeof(_streamIdentifier)); From 6804ab8a33fb8b1ff72b98522fa0c4e0ad7d8c3e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 11 Jul 2013 11:12:14 -0700 Subject: [PATCH 26/27] type squish in NodeList --- libraries/shared/src/NodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 81c4b14f80..127b6ef79b 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -81,7 +81,7 @@ void NodeList::timePingReply(sockaddr *nodeAddress, unsigned char *packetData) { if (socketMatch(node->getPublicSocket(), nodeAddress) || socketMatch(node->getLocalSocket(), nodeAddress)) { - int pingTime = usecTimestampNow() - *(uint64_t *)(packetData + numBytesForPacketHeader(packetData)); + int pingTime = usecTimestampNow() - *(uint64_t*)(packetData + numBytesForPacketHeader(packetData)); node->setPingMs(pingTime / 1000); break; From 544f9c2e7a2e903270a148dd3ef2a858f3097752 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 11 Jul 2013 11:15:02 -0700 Subject: [PATCH 27/27] type squish and magic number removal --- libraries/shared/src/NodeList.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 127b6ef79b..35632d4511 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -89,8 +89,8 @@ void NodeList::timePingReply(sockaddr *nodeAddress, unsigned char *packetData) { } } -void NodeList::processNodeData(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes) { - switch (((char *)packetData)[0]) { +void NodeList::processNodeData(sockaddr* senderAddress, unsigned char* packetData, size_t dataBytes) { + switch (packetData[0]) { case PACKET_TYPE_DOMAIN: { processDomainServerList(packetData, dataBytes); break; @@ -238,13 +238,15 @@ void NodeList::sendDomainServerCheckIn() { // construct the DS check in packet if we need to static unsigned char* checkInPacket = NULL; static int checkInPacketSize; + + const int IP_ADDRESS_BYTES = 4; if (!checkInPacket) { 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_TYPE) + sizeof(PACKET_VERSION) + sizeof(NODE_TYPE) + sizeof(uint16_t) + - (sizeof(char) * 4) + numBytesNodesOfInterest + sizeof(unsigned char); + IP_ADDRESS_BYTES + numBytesNodesOfInterest + sizeof(unsigned char); checkInPacket = new unsigned char[numPacketBytes]; unsigned char* packetPosition = checkInPacket;