mirror of
https://github.com/overte-org/overte.git
synced 2025-04-08 08:14:48 +02:00
refactor packet version handling and apply to DS
This commit is contained in:
parent
8a684244cc
commit
e3d9289f1f
5 changed files with 51 additions and 16 deletions
|
@ -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++) {
|
||||
|
|
|
@ -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<char, Node *> 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()) {
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue