From 97803b827e520189be2ba64297ba27de75b8b712 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 9 Sep 2013 16:45:44 -0700 Subject: [PATCH] pack destination socket for assignment as tightly as possible --- assignment-server/src/main.cpp | 2 +- libraries/shared/src/Assignment.cpp | 48 +++++++++++++---------------- libraries/shared/src/Assignment.h | 6 ++-- libraries/shared/src/UDPSocket.cpp | 2 +- libraries/shared/src/UDPSocket.h | 2 +- 5 files changed, 28 insertions(+), 32 deletions(-) diff --git a/assignment-server/src/main.cpp b/assignment-server/src/main.cpp index dbbd6b2607..d92ab46f63 100644 --- a/assignment-server/src/main.cpp +++ b/assignment-server/src/main.cpp @@ -99,7 +99,7 @@ int main(int argc, const char* argv[]) { // assignment server is on a public server // assume that the address we now have for the sender is the public address/port // and store that with the assignment so it can be given to the requestor later - createdAssignment->setDomainSocket((sockaddr*) &senderSocket); + createdAssignment->setDestinationSocket((sockaddr*) &senderSocket); // add this assignment to the queue assignmentQueue.push_back(createdAssignment); diff --git a/libraries/shared/src/Assignment.cpp b/libraries/shared/src/Assignment.cpp index 850922396f..7151259b7c 100644 --- a/libraries/shared/src/Assignment.cpp +++ b/libraries/shared/src/Assignment.cpp @@ -17,7 +17,7 @@ Assignment::Assignment(Assignment::Direction direction, Assignment::Type type, c _direction(direction), _type(type), _pool(NULL), - _domainSocket(NULL) + _destinationSocket(NULL) { // set the create time on this assignment gettimeofday(&_time, NULL); @@ -34,7 +34,7 @@ Assignment::Assignment(Assignment::Direction direction, Assignment::Type type, c Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : _pool(NULL), - _domainSocket(NULL) + _destinationSocket(NULL) { // set the create time on this assignment gettimeofday(&_time, NULL); @@ -64,41 +64,39 @@ Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : } if (numBytes > numBytesRead) { + if (dataBuffer[numBytesRead++] == IPv4_ADDRESS_DESIGNATOR) { // IPv4 address - sockaddr_in destinationSocket = {}; - memcpy(&destinationSocket, dataBuffer + numBytesRead, sizeof(sockaddr_in)); - destinationSocket.sin_family = AF_INET; - setDomainSocket((sockaddr*) &destinationSocket); + delete _destinationSocket; + _destinationSocket = (sockaddr*) new sockaddr_in; + unpackSocket(dataBuffer + numBytesRead, _destinationSocket); } else { - // IPv6 address - sockaddr_in6 destinationSocket = {}; - memcpy(&destinationSocket, dataBuffer + numBytesRead, sizeof(sockaddr_in6)); - setDomainSocket((sockaddr*) &destinationSocket); + // IPv6 address, or bad designator + qDebug("Received a socket that cannot be unpacked!\n"); } } } Assignment::~Assignment() { - delete _domainSocket; + delete _destinationSocket; delete _pool; } -void Assignment::setDomainSocket(const sockaddr* domainSocket) { +void Assignment::setDestinationSocket(const sockaddr* destinationSocket) { - if (_domainSocket) { + if (_destinationSocket) { // delete the old _domainSocket if it exists - delete _domainSocket; - _domainSocket = NULL; + delete _destinationSocket; + _destinationSocket = NULL; } // create a new sockaddr or sockaddr_in depending on what type of address this is - if (domainSocket->sa_family == AF_INET) { - _domainSocket = (sockaddr*) new sockaddr_in; - memcpy(_domainSocket, domainSocket, sizeof(sockaddr_in)); + if (destinationSocket->sa_family == AF_INET) { + _destinationSocket = (sockaddr*) new sockaddr_in; + memcpy(_destinationSocket, destinationSocket, sizeof(sockaddr_in)); } else { - _domainSocket = (sockaddr*) new sockaddr_in6; - memcpy(_domainSocket, domainSocket, sizeof(sockaddr_in6)); + _destinationSocket = (sockaddr*) new sockaddr_in6; + memcpy(_destinationSocket, destinationSocket, sizeof(sockaddr_in6)); } } @@ -118,13 +116,11 @@ int Assignment::packToBuffer(unsigned char* buffer) { numPackedBytes += sizeof(char); } - if (_domainSocket) { - buffer[numPackedBytes++] = (_domainSocket->sa_family == AF_INET) ? IPv4_ADDRESS_DESIGNATOR : IPv6_ADDRESS_DESIGNATOR; + if (_destinationSocket) { + buffer[numPackedBytes++] = (_destinationSocket->sa_family == AF_INET) + ? IPv4_ADDRESS_DESIGNATOR : IPv6_ADDRESS_DESIGNATOR; - int numSocketBytes = (_domainSocket->sa_family == AF_INET) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6); - - memcpy(buffer + numPackedBytes, _domainSocket, numSocketBytes); - numPackedBytes += numSocketBytes; + numPackedBytes += packSocket(buffer + numPackedBytes, _destinationSocket); } return numPackedBytes; diff --git a/libraries/shared/src/Assignment.h b/libraries/shared/src/Assignment.h index 693cc42577..de56b684b6 100644 --- a/libraries/shared/src/Assignment.h +++ b/libraries/shared/src/Assignment.h @@ -43,8 +43,8 @@ public: const char* getPool() const { return _pool; } const timeval& getTime() const { return _time; } - const sockaddr* getDomainSocket() { return _domainSocket; } - void setDomainSocket(const sockaddr* domainSocket); + const sockaddr* getDestinationSocket() { return _destinationSocket; } + void setDestinationSocket(const sockaddr* destinationSocket); /// Packs the assignment to the passed buffer /// \param buffer the buffer in which to pack the assignment @@ -58,7 +58,7 @@ private: Assignment::Direction _direction; /// the direction of the assignment (Create, Deploy, Request) Assignment::Type _type; /// the type of the assignment, defines what the assignee will do char* _pool; /// the pool this assignment is for/from - sockaddr* _domainSocket; /// pointer to socket for domain server that created assignment + sockaddr* _destinationSocket; /// pointer to destination socket for assignment timeval _time; /// time the assignment was created (set in constructor) }; diff --git a/libraries/shared/src/UDPSocket.cpp b/libraries/shared/src/UDPSocket.cpp index d89265b471..9ce9ba695c 100644 --- a/libraries/shared/src/UDPSocket.cpp +++ b/libraries/shared/src/UDPSocket.cpp @@ -68,7 +68,7 @@ int packSocket(unsigned char* packStore, sockaddr* socketToPack) { return packSocket(packStore, ((sockaddr_in*) socketToPack)->sin_addr.s_addr, ((sockaddr_in*) socketToPack)->sin_port); } -int unpackSocket(unsigned char* packedData, sockaddr* unpackDestSocket) { +int unpackSocket(const unsigned char* packedData, sockaddr* unpackDestSocket) { sockaddr_in* destinationSocket = (sockaddr_in*) unpackDestSocket; destinationSocket->sin_addr.s_addr = (packedData[0] << 24) + (packedData[1] << 16) + (packedData[2] << 8) + packedData[3]; destinationSocket->sin_port = (packedData[4] << 8) + packedData[5]; diff --git a/libraries/shared/src/UDPSocket.h b/libraries/shared/src/UDPSocket.h index 1b627dbd41..447d234ca5 100644 --- a/libraries/shared/src/UDPSocket.h +++ b/libraries/shared/src/UDPSocket.h @@ -44,7 +44,7 @@ private: bool socketMatch(const sockaddr* first, const sockaddr* second); int packSocket(unsigned char* packStore, in_addr_t inAddress, in_port_t networkOrderPort); int packSocket(unsigned char* packStore, sockaddr* socketToPack); -int unpackSocket(unsigned char* packedData, sockaddr* unpackDestSocket); +int unpackSocket(const unsigned char* packedData, sockaddr* unpackDestSocket); int getLocalAddress(); unsigned short loadBufferWithSocketInfo(char* addressBuffer, sockaddr* socket); sockaddr_in socketForHostnameAndHostOrderPort(const char* hostname, unsigned short port = 0);