From e53807ca82b80b0e0f1d1c1e8bdea194ea9c4a23 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 9 Sep 2013 17:29:33 -0700 Subject: [PATCH] store an attached local and public socket with assignment --- assignment-client/src/main.cpp | 4 +-- assignment-server/src/main.cpp | 6 ++-- libraries/shared/src/Assignment.cpp | 55 ++++++++++++++++++----------- libraries/shared/src/Assignment.h | 10 ++++-- libraries/shared/src/UDPSocket.cpp | 11 ++++++ libraries/shared/src/UDPSocket.h | 1 + 6 files changed, 58 insertions(+), 29 deletions(-) diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index f5137aac39..96652318ed 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -70,8 +70,8 @@ void childClient() { qDebug() << "Received an assignment -" << deployedAssignment << "\n"; // switch our nodelist DOMAIN_IP to the ip receieved in the assignment - if (deployedAssignment.getDestinationSocket()->sa_family == AF_INET) { - in_addr domainSocketAddr = ((sockaddr_in*) deployedAssignment.getDestinationSocket())->sin_addr; + if (deployedAssignment.getAttachedPublicSocket()->sa_family == AF_INET) { + in_addr domainSocketAddr = ((sockaddr_in*) deployedAssignment.getAttachedPublicSocket())->sin_addr; nodeList->setDomainIP(inet_ntoa(domainSocketAddr)); qDebug("Destination IP for assignment is %s\n", inet_ntoa(domainSocketAddr)); diff --git a/assignment-server/src/main.cpp b/assignment-server/src/main.cpp index d92ab46f63..764d68f879 100644 --- a/assignment-server/src/main.cpp +++ b/assignment-server/src/main.cpp @@ -96,10 +96,10 @@ int main(int argc, const char* argv[]) { qDebug() << "Received a created assignment:" << *createdAssignment; qDebug() << "Current queue size is" << assignmentQueue.size(); - // assignment server is on a public server + // assignment server is likely 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->setDestinationSocket((sockaddr*) &senderSocket); + // and store that with the assignment so it can be given to the requestor later if necessary + createdAssignment->setAttachedPublicSocket((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 7151259b7c..5da675ced9 100644 --- a/libraries/shared/src/Assignment.cpp +++ b/libraries/shared/src/Assignment.cpp @@ -17,7 +17,8 @@ Assignment::Assignment(Assignment::Direction direction, Assignment::Type type, c _direction(direction), _type(type), _pool(NULL), - _destinationSocket(NULL) + _attachedPublicSocket(NULL), + _attachedLocalSocket(NULL) { // set the create time on this assignment gettimeofday(&_time, NULL); @@ -34,7 +35,8 @@ Assignment::Assignment(Assignment::Direction direction, Assignment::Type type, c Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : _pool(NULL), - _destinationSocket(NULL) + _attachedPublicSocket(NULL), + _attachedLocalSocket(NULL) { // set the create time on this assignment gettimeofday(&_time, NULL); @@ -65,11 +67,15 @@ Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : if (numBytes > numBytesRead) { + sockaddr* socketDestination = (_direction == Assignment::Create) + ? _attachedLocalSocket + : _attachedPublicSocket; + if (dataBuffer[numBytesRead++] == IPv4_ADDRESS_DESIGNATOR) { // IPv4 address - delete _destinationSocket; - _destinationSocket = (sockaddr*) new sockaddr_in; - unpackSocket(dataBuffer + numBytesRead, _destinationSocket); + delete socketDestination; + socketDestination = (sockaddr*) new sockaddr_in; + unpackSocket(dataBuffer + numBytesRead, socketDestination); } else { // IPv6 address, or bad designator qDebug("Received a socket that cannot be unpacked!\n"); @@ -78,26 +84,30 @@ Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : } Assignment::~Assignment() { - delete _destinationSocket; + delete _attachedPublicSocket; + delete _attachedLocalSocket; delete _pool; } -void Assignment::setDestinationSocket(const sockaddr* destinationSocket) { +void Assignment::setAttachedPublicSocket(const sockaddr* attachedPublicSocket) { - if (_destinationSocket) { - // delete the old _domainSocket if it exists - delete _destinationSocket; - _destinationSocket = NULL; + if (_attachedPublicSocket) { + // delete the old socket if it exists + delete _attachedPublicSocket; + _attachedPublicSocket = NULL; } - // create a new sockaddr or sockaddr_in depending on what type of address this is - if (destinationSocket->sa_family == AF_INET) { - _destinationSocket = (sockaddr*) new sockaddr_in; - memcpy(_destinationSocket, destinationSocket, sizeof(sockaddr_in)); - } else { - _destinationSocket = (sockaddr*) new sockaddr_in6; - memcpy(_destinationSocket, destinationSocket, sizeof(sockaddr_in6)); + copySocketToEmptySocketPointer(_attachedPublicSocket, attachedPublicSocket); +} + +void Assignment::setAttachedLocalSocket(const sockaddr* attachedLocalSocket) { + if (_attachedLocalSocket) { + // delete the old socket if it exists + delete _attachedLocalSocket; + _attachedLocalSocket = NULL; } + + copySocketToEmptySocketPointer(_attachedLocalSocket, attachedLocalSocket); } int Assignment::packToBuffer(unsigned char* buffer) { @@ -116,11 +126,14 @@ int Assignment::packToBuffer(unsigned char* buffer) { numPackedBytes += sizeof(char); } - if (_destinationSocket) { - buffer[numPackedBytes++] = (_destinationSocket->sa_family == AF_INET) + if (_attachedPublicSocket || _attachedLocalSocket) { + sockaddr* socketToPack = (_attachedPublicSocket) ? _attachedPublicSocket : _attachedLocalSocket; + + // we have a socket to pack, add the designator + buffer[numPackedBytes++] = (socketToPack->sa_family == AF_INET) ? IPv4_ADDRESS_DESIGNATOR : IPv6_ADDRESS_DESIGNATOR; - numPackedBytes += packSocket(buffer + numPackedBytes, _destinationSocket); + numPackedBytes += packSocket(buffer + numPackedBytes, socketToPack); } return numPackedBytes; diff --git a/libraries/shared/src/Assignment.h b/libraries/shared/src/Assignment.h index de56b684b6..b72aafb67e 100644 --- a/libraries/shared/src/Assignment.h +++ b/libraries/shared/src/Assignment.h @@ -43,8 +43,11 @@ public: const char* getPool() const { return _pool; } const timeval& getTime() const { return _time; } - const sockaddr* getDestinationSocket() { return _destinationSocket; } - void setDestinationSocket(const sockaddr* destinationSocket); + const sockaddr* getAttachedPublicSocket() { return _attachedPublicSocket; } + void setAttachedPublicSocket(const sockaddr* attachedPublicSocket); + + const sockaddr* getAttachedLocalSocket() { return _attachedLocalSocket; } + void setAttachedLocalSocket(const sockaddr* attachedLocalSocket); /// Packs the assignment to the passed buffer /// \param buffer the buffer in which to pack the assignment @@ -58,7 +61,8 @@ 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* _destinationSocket; /// pointer to destination socket for assignment + sockaddr* _attachedPublicSocket; /// pointer to a public socket that relates to assignment, depends on direction + sockaddr* _attachedLocalSocket; /// pointer to a local socket that relates to assignment, depends on direction 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 9ce9ba695c..0405f83c85 100644 --- a/libraries/shared/src/UDPSocket.cpp +++ b/libraries/shared/src/UDPSocket.cpp @@ -75,6 +75,17 @@ int unpackSocket(const unsigned char* packedData, sockaddr* unpackDestSocket) { return 6; // this could be more if we ever need IPv6 } +void copySocketToEmptySocketPointer(sockaddr* destination, const sockaddr* source) { + // create a new sockaddr or sockaddr_in depending on what type of address this is + if (source->sa_family == AF_INET) { + destination = (sockaddr*) new sockaddr_in; + memcpy(destination, source, sizeof(sockaddr_in)); + } else { + destination = (sockaddr*) new sockaddr_in6; + memcpy(destination, source, sizeof(sockaddr_in6)); + } +} + int getLocalAddress() { // get this node's local address so we can pass that to DS struct ifaddrs* ifAddrStruct = NULL; diff --git a/libraries/shared/src/UDPSocket.h b/libraries/shared/src/UDPSocket.h index 447d234ca5..21b19920b2 100644 --- a/libraries/shared/src/UDPSocket.h +++ b/libraries/shared/src/UDPSocket.h @@ -45,6 +45,7 @@ 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(const unsigned char* packedData, sockaddr* unpackDestSocket); +void copySocketToEmptySocketPointer(sockaddr* destination, const sockaddr* source); int getLocalAddress(); unsigned short loadBufferWithSocketInfo(char* addressBuffer, sockaddr* socket); sockaddr_in socketForHostnameAndHostOrderPort(const char* hostname, unsigned short port = 0);