From 9e0df2dbd15ac1bbe36d4132b4972be4019c9de8 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 18 Mar 2013 17:10:05 -0600 Subject: [PATCH 01/14] Add unique id to agents and broadcast back --- domain/src/main.cpp | 1 + shared/src/Agent.cpp | 11 ++++++++++- shared/src/Agent.h | 5 ++++- shared/src/AgentList.cpp | 5 ++++- shared/src/AgentList.h | 2 +- 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index e32434c543..8bdd0a736b 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -44,6 +44,7 @@ AgentList agentList(DOMAIN_LISTEN_PORT); unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { *currentPosition++ = agentToAdd->getType(); + currentPosition += agentToAdd->getAgentId(); currentPosition += packSocket(currentPosition, agentToAdd->getPublicSocket()); currentPosition += packSocket(currentPosition, agentToAdd->getLocalSocket()); diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index cacb3a5f94..f48d139eae 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -14,7 +14,7 @@ Agent::Agent() {} -Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType) { +Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, int16_t thisAgentId) { publicSocket = new sockaddr; memcpy(publicSocket, agentPublicSocket, sizeof(sockaddr)); @@ -22,6 +22,7 @@ Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agent memcpy(localSocket, agentLocalSocket, sizeof(sockaddr)); type = agentType; + agentId = thisAgentId; firstRecvTimeUsecs = usecTimestampNow(); lastRecvTimeUsecs = usecTimestampNow(); @@ -75,6 +76,14 @@ void Agent::setType(char newType) { type = newType; } +int16_t Agent::getAgentId() { + return agentId; +} + +void Agent::setAgentId(int16_t thisAgentId) { + agentId = thisAgentId; +} + double Agent::getFirstRecvTimeUsecs() { return firstRecvTimeUsecs; } diff --git a/shared/src/Agent.h b/shared/src/Agent.h index dafbeb768f..edb8f67f50 100644 --- a/shared/src/Agent.h +++ b/shared/src/Agent.h @@ -16,7 +16,7 @@ class Agent { public: Agent(); - Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType); + Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, int16_t thisAgentId); Agent(const Agent &otherAgent); ~Agent(); Agent& operator=(Agent otherAgent); @@ -25,6 +25,8 @@ class Agent { bool matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType); char getType(); void setType(char newType); + int16_t getAgentId(); + void setAgentId(int16_t thisAgentId); double getFirstRecvTimeUsecs(); void setFirstRecvTimeUsecs(double newTimeUsecs); double getLastRecvTimeUsecs(); @@ -44,6 +46,7 @@ class Agent { void swap(Agent &first, Agent &second); sockaddr *publicSocket, *localSocket, *activeSocket; char type; + int16_t agentId; double firstRecvTimeUsecs; double lastRecvTimeUsecs; AgentData *linkedData; diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 0bdedb10cd..4fc27b498b 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -20,12 +20,14 @@ AgentList::AgentList() : agentSocket(AGENT_SOCKET_LISTEN_PORT) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; voxelServerAddCallback = NULL; + lastAgentId = 0; } AgentList::AgentList(int socketListenPort) : agentSocket(socketListenPort) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; voxelServerAddCallback = NULL; + lastAgentId = 0; } AgentList::~AgentList() { @@ -139,7 +141,8 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, if (agent == agents.end()) { // we didn't have this agent, so add them - Agent newAgent = Agent(publicSocket, localSocket, agentType); + Agent newAgent = Agent(publicSocket, localSocket, agentType, this->lastAgentId); + ++this->lastAgentId; if (socketMatch(publicSocket, localSocket)) { // likely debugging scenario with DS + agent on local network diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index d4c9b69d23..d1c607f066 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -45,7 +45,7 @@ class AgentList { UDPSocket agentSocket; std::vector agents; pthread_t removeSilentAgentsThread; - + int16_t lastAgentId; int indexOfMatchingAgent(sockaddr *senderAddress); void handlePingReply(sockaddr *agentAddress); }; From e396269d78bb032525850065196e96488dd3adb1 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Tue, 19 Mar 2013 11:02:47 -0600 Subject: [PATCH 02/14] Switching to unsigned --- shared/src/Agent.cpp | 6 +++--- shared/src/Agent.h | 8 ++++---- shared/src/AgentList.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index f48d139eae..2c0d6b8927 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -14,7 +14,7 @@ Agent::Agent() {} -Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, int16_t thisAgentId) { +Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, uint16_t thisAgentId) { publicSocket = new sockaddr; memcpy(publicSocket, agentPublicSocket, sizeof(sockaddr)); @@ -76,11 +76,11 @@ void Agent::setType(char newType) { type = newType; } -int16_t Agent::getAgentId() { +uint16_t Agent::getAgentId() { return agentId; } -void Agent::setAgentId(int16_t thisAgentId) { +void Agent::setAgentId(uint16_t thisAgentId) { agentId = thisAgentId; } diff --git a/shared/src/Agent.h b/shared/src/Agent.h index edb8f67f50..61f01b4b60 100644 --- a/shared/src/Agent.h +++ b/shared/src/Agent.h @@ -16,7 +16,7 @@ class Agent { public: Agent(); - Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, int16_t thisAgentId); + Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, uint16_t thisAgentId); Agent(const Agent &otherAgent); ~Agent(); Agent& operator=(Agent otherAgent); @@ -25,8 +25,8 @@ class Agent { bool matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType); char getType(); void setType(char newType); - int16_t getAgentId(); - void setAgentId(int16_t thisAgentId); + uint16_t getAgentId(); + void setAgentId(uint16_t thisAgentId); double getFirstRecvTimeUsecs(); void setFirstRecvTimeUsecs(double newTimeUsecs); double getLastRecvTimeUsecs(); @@ -46,7 +46,7 @@ class Agent { void swap(Agent &first, Agent &second); sockaddr *publicSocket, *localSocket, *activeSocket; char type; - int16_t agentId; + uint16_t agentId; double firstRecvTimeUsecs; double lastRecvTimeUsecs; AgentData *linkedData; diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index d1c607f066..b7e12c9627 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -45,7 +45,7 @@ class AgentList { UDPSocket agentSocket; std::vector agents; pthread_t removeSilentAgentsThread; - int16_t lastAgentId; + uint16_t lastAgentId; int indexOfMatchingAgent(sockaddr *senderAddress); void handlePingReply(sockaddr *agentAddress); }; From a76f8a46cde507d172be1ea9ba42cf7f0a6f251a Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 11:20:45 -0600 Subject: [PATCH 03/14] Handle new and existing agent Ids --- domain/src/main.cpp | 2 ++ shared/src/Agent.cpp | 4 ++++ shared/src/Agent.h | 1 + shared/src/AgentList.cpp | 25 +++++++++++++++++++++---- shared/src/AgentList.h | 6 ++++-- shared/src/UDPSocket.cpp | 2 +- 6 files changed, 33 insertions(+), 7 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index cc51bb79b6..05fb088329 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -50,7 +50,9 @@ AgentList agentList(DOMAIN_LISTEN_PORT); unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { *currentPosition++ = agentToAdd->getType(); + // FIX THIS - NOT ONE BYTE currentPosition += agentToAdd->getAgentId(); + // --- currentPosition += packSocket(currentPosition, agentToAdd->getPublicSocket()); currentPosition += packSocket(currentPosition, agentToAdd->getLocalSocket()); diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index b95c3e7dbd..269703260f 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -162,6 +162,10 @@ bool Agent::matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, cha && socketMatch(localSocket, otherLocalSocket); } +bool Agent::exists(uint16_t *otherAgentId) { + return agentId == *otherAgentId; +} + std::ostream& operator<<(std::ostream& os, const Agent* agent) { sockaddr_in *agentPublicSocket = (sockaddr_in *)agent->publicSocket; sockaddr_in *agentLocalSocket = (sockaddr_in *)agent->localSocket; diff --git a/shared/src/Agent.h b/shared/src/Agent.h index 087d828b49..e5fa583f20 100644 --- a/shared/src/Agent.h +++ b/shared/src/Agent.h @@ -28,6 +28,7 @@ class Agent { bool operator==(const Agent& otherAgent); bool matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType); + bool exists(uint16_t *agentId); char getType(); void setType(char newType); uint16_t getAgentId(); diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 13869f53af..134672e971 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -109,10 +109,16 @@ int AgentList::indexOfMatchingAgent(sockaddr *senderAddress) { return -1; } +int AgentList::unpackAgentId(unsigned char *packedData, uint16_t *agentId) { + memcpy(packedData, agentId, sizeof(uint16_t)); + return sizeof(uint16_t); +} + int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { int readAgents = 0; char agentType; + uint16_t agentId; // assumes only IPv4 addresses sockaddr_in agentPublicSocket; @@ -125,17 +131,21 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { while((readPtr - startPtr) < dataBytes) { agentType = *readPtr++; + readPtr += unpackAgentId(readPtr, (uint16_t *)&agentId); readPtr += unpackSocket(readPtr, (sockaddr *)&agentPublicSocket); readPtr += unpackSocket(readPtr, (sockaddr *)&agentLocalSocket); - addOrUpdateAgent((sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType); + //syncClientAgentList(agentId, (sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType); + + addOrUpdateAgent((sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType, agentId); } return readAgents; } -bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType) { +bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId = 0) { std::vector::iterator agent; + uint16_t thisAgentId; for(agent = agents.begin(); agent != agents.end(); agent++) { if (agent->matches(publicSocket, localSocket, agentType)) { @@ -146,8 +156,15 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, if (agent == agents.end()) { // we didn't have this agent, so add them - Agent newAgent = Agent(publicSocket, localSocket, agentType, this->lastAgentId); - ++this->lastAgentId; + + if (agentId == 0) { + thisAgentId = this->lastAgentId; + ++this->lastAgentId; + } else { + thisAgentId = agentId; + } + + Agent newAgent = Agent(publicSocket, localSocket, agentType, thisAgentId); if (socketMatch(publicSocket, localSocket)) { // likely debugging scenario with DS + agent on local network diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index e152815ad1..9d6e9991dc 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -35,9 +35,11 @@ class AgentList { std::vector& getAgents(); UDPSocket& getAgentSocket(); - + int updateList(unsigned char *packetData, size_t dataBytes); - bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType); + bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId); + int unpackAgentId(unsigned char *packedData, uint16_t *agentId); + int packAgentId(unsigned char *packStore, uint16_t agentId); void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void broadcastToAgents(char *broadcastData, size_t dataBytes); diff --git a/shared/src/UDPSocket.cpp b/shared/src/UDPSocket.cpp index f4bceb884f..436b627045 100644 --- a/shared/src/UDPSocket.cpp +++ b/shared/src/UDPSocket.cpp @@ -115,7 +115,7 @@ bool UDPSocket::receive(sockaddr *recvAddress, void *receivedData, ssize_t *rece socklen_t addressSize = sizeof(&recvAddress); *receivedBytes = recvfrom(handle, static_cast(receivedData), MAX_BUFFER_LENGTH_BYTES, - 0, recvAddress, reinterpret_cast(&addressSize)); + 0, recvAddress, &addressSize); return (*receivedBytes > 0); } From a1691f54a1fa574e76037c0f9f977a77d97b69d8 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 11:30:17 -0600 Subject: [PATCH 04/14] Starting agent count at 1 to allow for 0 to be non-id specifier and packing the id into boadcast packet --- shared/src/AgentList.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 134672e971..8cae9547bd 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -25,14 +25,14 @@ AgentList::AgentList() : agentSocket(AGENT_SOCKET_LISTEN_PORT) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; voxelServerAddCallback = NULL; - lastAgentId = 0; + lastAgentId = 1; } AgentList::AgentList(int socketListenPort) : agentSocket(socketListenPort) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; voxelServerAddCallback = NULL; - lastAgentId = 0; + lastAgentId = 1; } AgentList::~AgentList() { @@ -114,6 +114,11 @@ int AgentList::unpackAgentId(unsigned char *packedData, uint16_t *agentId) { return sizeof(uint16_t); } +int AgentList::packAgentId(unsigned char *packStore, uint16_t agentId) { + memcpy(&agentId, packStore, sizeof(uint16_t)); + return sizeof(uint16_t); +} + int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { int readAgents = 0; From e3d842dff7b12a4b7af93fd96fe3107372f76265 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 11:43:16 -0600 Subject: [PATCH 05/14] Packing agent ID on domain broadcast packet --- domain/src/main.cpp | 4 +--- shared/src/AgentList.h | 5 +++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index 05fb088329..d80864eaa0 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -50,9 +50,7 @@ AgentList agentList(DOMAIN_LISTEN_PORT); unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { *currentPosition++ = agentToAdd->getType(); - // FIX THIS - NOT ONE BYTE - currentPosition += agentToAdd->getAgentId(); - // --- + currentPosition += packAgentId(currentPosition, agentToAdd->getAgentId()); currentPosition += packSocket(currentPosition, agentToAdd->getPublicSocket()); currentPosition += packSocket(currentPosition, agentToAdd->getLocalSocket()); diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index 9d6e9991dc..e376f29af7 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -38,8 +38,6 @@ class AgentList { int updateList(unsigned char *packetData, size_t dataBytes); bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId); - int unpackAgentId(unsigned char *packedData, uint16_t *agentId); - int packAgentId(unsigned char *packStore, uint16_t agentId); void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void broadcastToAgents(char *broadcastData, size_t dataBytes); @@ -56,4 +54,7 @@ class AgentList { void handlePingReply(sockaddr *agentAddress); }; +int unpackAgentId(unsigned char *packedData, uint16_t *agentId); +int packAgentId(unsigned char *packStore, uint16_t agentId); + #endif /* defined(__hifi__AgentList__) */ From a4f6d8567607cf61dbf440ea2f76ff5773cb9b4d Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 11:45:19 -0600 Subject: [PATCH 06/14] Fixing definitions --- shared/src/AgentList.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 8cae9547bd..7d71f1da2c 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -109,12 +109,12 @@ int AgentList::indexOfMatchingAgent(sockaddr *senderAddress) { return -1; } -int AgentList::unpackAgentId(unsigned char *packedData, uint16_t *agentId) { +int unpackAgentId(unsigned char *packedData, uint16_t *agentId) { memcpy(packedData, agentId, sizeof(uint16_t)); return sizeof(uint16_t); } -int AgentList::packAgentId(unsigned char *packStore, uint16_t agentId) { +int packAgentId(unsigned char *packStore, uint16_t agentId) { memcpy(&agentId, packStore, sizeof(uint16_t)); return sizeof(uint16_t); } From dc92f0be4233221f962472c67c2fd99113586afd Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 13:34:35 -0600 Subject: [PATCH 07/14] More agent IDing around the code --- domain/src/main.cpp | 6 ++++-- shared/src/AgentList.cpp | 2 -- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index d80864eaa0..bd49ca0ee9 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -73,6 +73,7 @@ int main(int argc, const char * argv[]) int packetBytesWithoutLeadingChar; sockaddr_in agentPublicAddress, agentLocalAddress; + uint16_t agentId = 0; agentLocalAddress.sin_family = AF_INET; agentList.startSilentAgentRemovalThread(); @@ -82,9 +83,10 @@ int main(int argc, const char * argv[]) std::map newestSoloAgents; agentType = packetData[0]; - unpackSocket(&packetData[1], (sockaddr *)&agentLocalAddress); + unpackAgentId(&packetData[1], (uint16_t *)&agentId); + unpackSocket(&packetData[2], (sockaddr *)&agentLocalAddress); - agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType); + agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, agentId); currentBufferPos = broadcastPacket + 1; startPointer = currentBufferPos; diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 7d71f1da2c..eab053e5d0 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -140,8 +140,6 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { readPtr += unpackSocket(readPtr, (sockaddr *)&agentPublicSocket); readPtr += unpackSocket(readPtr, (sockaddr *)&agentLocalSocket); - //syncClientAgentList(agentId, (sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType); - addOrUpdateAgent((sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType, agentId); } From ed7234d56aae7987a851090126caa7ce0182a917 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 13:50:32 -0600 Subject: [PATCH 08/14] Fixing index --- domain/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index e26332f9e9..99aa1db05e 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -84,7 +84,7 @@ int main(int argc, const char * argv[]) agentType = packetData[0]; unpackAgentId(&packetData[1], (uint16_t *)&agentId); - unpackSocket(&packetData[2], (sockaddr *)&agentLocalAddress); + unpackSocket(&packetData[3], (sockaddr *)&agentLocalAddress); agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, agentId); From 61c866a34caf5e195106d056ee508afa37cf2560 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 16:57:30 -0600 Subject: [PATCH 09/14] Handling increase of id smarter --- domain/src/main.cpp | 8 ++++---- interface/src/main.cpp | 4 ++-- shared/src/AgentList.cpp | 31 ++++++++++++++++--------------- shared/src/AgentList.h | 2 ++ 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index 99aa1db05e..fad3f21130 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -73,7 +73,6 @@ int main(int argc, const char * argv[]) int packetBytesWithoutLeadingChar; sockaddr_in agentPublicAddress, agentLocalAddress; - uint16_t agentId = 0; agentLocalAddress.sin_family = AF_INET; agentList.startSilentAgentRemovalThread(); @@ -83,10 +82,11 @@ int main(int argc, const char * argv[]) std::map newestSoloAgents; agentType = packetData[0]; - unpackAgentId(&packetData[1], (uint16_t *)&agentId); - unpackSocket(&packetData[3], (sockaddr *)&agentLocalAddress); + unpackSocket(&packetData[1], (sockaddr *)&agentLocalAddress); - agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, agentId); + if (agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, agentList.getLastAgentId())) { + agentList.increaseAgentId(); + } currentBufferPos = broadcastPacket + 1; startPointer = currentBufferPos; diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 5759aa3c8a..e23ad8ff6a 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -228,9 +228,9 @@ void Timer(int extra) // // Send a message to the domainserver telling it we are ALIVE - // + // unsigned char output[7]; - output[0] = 'I'; + output[0] = 'I'; packSocket(output + 1, localAddress, htons(AGENT_SOCKET_LISTEN_PORT)); agentList.getAgentSocket().send(DOMAIN_IP, DOMAINSERVER_PORT, output, 7); diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index ddfc619315..a32c1e1fd6 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -108,14 +108,12 @@ int AgentList::indexOfMatchingAgent(sockaddr *senderAddress) { return -1; } -int unpackAgentId(unsigned char *packedData, uint16_t *agentId) { - memcpy(packedData, agentId, sizeof(uint16_t)); - return sizeof(uint16_t); +uint16_t AgentList::getLastAgentId() { + return lastAgentId; } -int packAgentId(unsigned char *packStore, uint16_t agentId) { - memcpy(&agentId, packStore, sizeof(uint16_t)); - return sizeof(uint16_t); +void AgentList::increaseAgentId() { + ++lastAgentId; } int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { @@ -149,7 +147,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, std::vector::iterator agent; uint16_t thisAgentId; - for(agent = agents.begin(); agent != agents.end(); agent++) { + for (agent = agents.begin(); agent != agents.end(); agent++) { if (agent->matches(publicSocket, localSocket, agentType)) { // we already have this agent, stop checking break; @@ -159,14 +157,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, if (agent == agents.end()) { // we didn't have this agent, so add them - if (agentId == 0) { - thisAgentId = this->lastAgentId; - ++this->lastAgentId; - } else { - thisAgentId = agentId; - } - - Agent newAgent = Agent(publicSocket, localSocket, agentType, thisAgentId); + Agent newAgent = Agent(publicSocket, localSocket, agentType, agentId); if (socketMatch(publicSocket, localSocket)) { // likely debugging scenario with DS + agent on local network @@ -285,4 +276,14 @@ void AgentList::startSilentAgentRemovalThread() { void AgentList::stopSilentAgentRemovalThread() { stopAgentRemovalThread = true; pthread_join(removeSilentAgentsThread, NULL); +} + +int unpackAgentId(unsigned char *packedData, uint16_t *agentId) { + memcpy(packedData, agentId, sizeof(uint16_t)); + return sizeof(uint16_t); +} + +int packAgentId(unsigned char *packStore, uint16_t agentId) { + memcpy(&agentId, packStore, sizeof(uint16_t)); + return sizeof(uint16_t); } \ No newline at end of file diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index 5edb2ca620..8aabf88476 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -37,6 +37,8 @@ class AgentList { int updateList(unsigned char *packetData, size_t dataBytes); int indexOfMatchingAgent(sockaddr *senderAddress); + uint16_t getLastAgentId(); + void increaseAgentId(); bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId); void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); From be96f1cdd058d5113647f148f35da12130324621 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 16:58:52 -0600 Subject: [PATCH 10/14] No longer need exists --- shared/src/Agent.cpp | 4 ---- shared/src/Agent.h | 1 - 2 files changed, 5 deletions(-) diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index 269703260f..b95c3e7dbd 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -162,10 +162,6 @@ bool Agent::matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, cha && socketMatch(localSocket, otherLocalSocket); } -bool Agent::exists(uint16_t *otherAgentId) { - return agentId == *otherAgentId; -} - std::ostream& operator<<(std::ostream& os, const Agent* agent) { sockaddr_in *agentPublicSocket = (sockaddr_in *)agent->publicSocket; sockaddr_in *agentLocalSocket = (sockaddr_in *)agent->localSocket; diff --git a/shared/src/Agent.h b/shared/src/Agent.h index e5fa583f20..087d828b49 100644 --- a/shared/src/Agent.h +++ b/shared/src/Agent.h @@ -28,7 +28,6 @@ class Agent { bool operator==(const Agent& otherAgent); bool matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType); - bool exists(uint16_t *agentId); char getType(); void setType(char newType); uint16_t getAgentId(); From bd18aeefe4e093f57f64ae17d911807352c668bc Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 17:39:07 -0600 Subject: [PATCH 11/14] Couple of quick changes --- shared/src/AgentList.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index a32c1e1fd6..b91ad2a487 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -24,13 +24,13 @@ pthread_mutex_t vectorChangeMutex = PTHREAD_MUTEX_INITIALIZER; AgentList::AgentList() : agentSocket(AGENT_SOCKET_LISTEN_PORT) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; - lastAgentId = 1; + lastAgentId = 0; } AgentList::AgentList(int socketListenPort) : agentSocket(socketListenPort) { linkedDataCreateCallback = NULL; audioMixerSocketUpdate = NULL; - lastAgentId = 1; + lastAgentId = 0; } @@ -143,7 +143,7 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { return readAgents; } -bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId = 0) { +bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId) { std::vector::iterator agent; uint16_t thisAgentId; From 54a946ee80111c6a62c711b7629b5b84f54faddc Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 25 Mar 2013 15:54:08 -0600 Subject: [PATCH 12/14] Splitting line, adding agentId to copy constructor and swap --- domain/src/main.cpp | 7 ++++++- shared/src/Agent.cpp | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index fad3f21130..940ec5f578 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -84,8 +84,13 @@ int main(int argc, const char * argv[]) agentType = packetData[0]; unpackSocket(&packetData[1], (sockaddr *)&agentLocalAddress); - if (agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, agentList.getLastAgentId())) { + if (agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, + (sockaddr *)&agentLocalAddress, + agentType, + agentList.getLastAgentId())) { + agentList.increaseAgentId(); + } currentBufferPos = broadcastPacket + 1; diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index b95c3e7dbd..9b64fc26e1 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -43,6 +43,9 @@ Agent::Agent(const Agent &otherAgent) { localSocket = new sockaddr; memcpy(localSocket, otherAgent.localSocket, sizeof(sockaddr)); + agentId = *new uint16_t; + memcpy(&agentId, &otherAgent.agentId, sizeof(uint16_t)); + if (otherAgent.activeSocket == otherAgent.publicSocket) { activeSocket = publicSocket; } else if (otherAgent.activeSocket == otherAgent.localSocket) { @@ -153,6 +156,7 @@ void Agent::swap(Agent &first, Agent &second) { swap(first.activeSocket, second.activeSocket); swap(first.type, second.type); swap(first.linkedData, second.linkedData); + swap(first.agentId, second.agentId); } bool Agent::matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType) { From cb84b7573be51e32a6121c288dbc47ecfe0bdc54 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 25 Mar 2013 15:56:22 -0600 Subject: [PATCH 13/14] Getting rid of unused declaration --- shared/src/AgentList.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index b91ad2a487..d92e894079 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -145,7 +145,6 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId) { std::vector::iterator agent; - uint16_t thisAgentId; for (agent = agents.begin(); agent != agents.end(); agent++) { if (agent->matches(publicSocket, localSocket, agentType)) { From 63589985f4b2262ad994c9020a84a79019071aa0 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 25 Mar 2013 16:12:51 -0600 Subject: [PATCH 14/14] Removing unneeded memcpy --- shared/src/Agent.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index 9b64fc26e1..8ec12c9020 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -43,8 +43,7 @@ Agent::Agent(const Agent &otherAgent) { localSocket = new sockaddr; memcpy(localSocket, otherAgent.localSocket, sizeof(sockaddr)); - agentId = *new uint16_t; - memcpy(&agentId, &otherAgent.agentId, sizeof(uint16_t)); + agentId = otherAgent.agentId; if (otherAgent.activeSocket == otherAgent.publicSocket) { activeSocket = publicSocket;