mirror of
https://github.com/overte-org/overte.git
synced 2025-08-11 01:53:10 +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) &&
|
if (nodeList->getNodeSocket()->receive(nodeAddress, packetData, &receivedBytes) &&
|
||||||
versionForPacketType(packetData[0]) == packetData[1]) {
|
packetVersionMatch(packetData)) {
|
||||||
switch (packetData[0]) {
|
switch (packetData[0]) {
|
||||||
case PACKET_TYPE_HEAD_DATA:
|
case PACKET_TYPE_HEAD_DATA:
|
||||||
// grab the node ID from the packet
|
// grab the node ID from the packet
|
||||||
|
@ -119,7 +119,7 @@ int main(int argc, const char* argv[]) {
|
||||||
break;
|
break;
|
||||||
case PACKET_TYPE_AVATAR_VOXEL_URL:
|
case PACKET_TYPE_AVATAR_VOXEL_URL:
|
||||||
// grab the node ID from the packet
|
// 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
|
// let everyone else know about the update
|
||||||
for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) {
|
for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) {
|
||||||
|
|
|
@ -87,12 +87,14 @@ int main(int argc, const char * argv[])
|
||||||
while (true) {
|
while (true) {
|
||||||
if (nodeList->getNodeSocket()->receive((sockaddr *)&nodePublicAddress, packetData, &receivedBytes) &&
|
if (nodeList->getNodeSocket()->receive((sockaddr *)&nodePublicAddress, packetData, &receivedBytes) &&
|
||||||
(packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_TYPE_DOMAIN_LIST_REQUEST) &&
|
(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
|
// this is an RFD or domain list request packet, and there is a version match
|
||||||
std::map<char, Node *> newestSoloNodes;
|
std::map<char, Node *> newestSoloNodes;
|
||||||
|
|
||||||
|
int numBytesSenderHeader = numBytesForPacketHeader(packetData);
|
||||||
|
|
||||||
nodeType = packetData[1];
|
nodeType = packetData[1];
|
||||||
int numBytesSocket = unpackSocket(packetData + numHeaderBytes + sizeof(NODE_TYPE),
|
int numBytesSocket = unpackSocket(packetData + numBytesSenderHeader + sizeof(NODE_TYPE),
|
||||||
(sockaddr*) &nodeLocalAddress);
|
(sockaddr*) &nodeLocalAddress);
|
||||||
|
|
||||||
sockaddr* destinationSocket = (sockaddr*) &nodePublicAddress;
|
sockaddr* destinationSocket = (sockaddr*) &nodePublicAddress;
|
||||||
|
@ -110,18 +112,18 @@ int main(int argc, const char * argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
Node* newNode = nodeList->addOrUpdateNode((sockaddr*) &nodePublicAddress,
|
Node* newNode = nodeList->addOrUpdateNode((sockaddr*) &nodePublicAddress,
|
||||||
(sockaddr*) &nodeLocalAddress,
|
(sockaddr*) &nodeLocalAddress,
|
||||||
nodeType,
|
nodeType,
|
||||||
nodeList->getLastNodeID());
|
nodeList->getLastNodeID());
|
||||||
|
|
||||||
if (newNode->getNodeID() == nodeList->getLastNodeID()) {
|
if (newNode->getNodeID() == nodeList->getLastNodeID()) {
|
||||||
nodeList->increaseNodeID();
|
nodeList->increaseNodeID();
|
||||||
}
|
}
|
||||||
|
|
||||||
currentBufferPos = broadcastPacket + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION);
|
currentBufferPos = broadcastPacket + numHeaderBytes;
|
||||||
startPointer = currentBufferPos;
|
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);
|
+ numBytesSocket + sizeof(unsigned char);
|
||||||
int numInterestTypes = *(nodeTypesOfInterest - 1);
|
int numInterestTypes = *(nodeTypesOfInterest - 1);
|
||||||
|
|
||||||
|
@ -174,8 +176,8 @@ int main(int argc, const char * argv[])
|
||||||
|
|
||||||
// send the constructed list back to this node
|
// send the constructed list back to this node
|
||||||
nodeList->getNodeSocket()->send(destinationSocket,
|
nodeList->getNodeSocket()->send(destinationSocket,
|
||||||
broadcastPacket,
|
broadcastPacket,
|
||||||
(currentBufferPos - startPointer) + 1);
|
(currentBufferPos - startPointer) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Logstash::shouldSendStats()) {
|
if (Logstash::shouldSendStats()) {
|
||||||
|
|
|
@ -287,7 +287,7 @@ int NodeList::processDomainServerList(unsigned char* packetData, size_t dataByte
|
||||||
sockaddr_in nodeLocalSocket;
|
sockaddr_in nodeLocalSocket;
|
||||||
nodeLocalSocket.sin_family = AF_INET;
|
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;
|
unsigned char* startPtr = packetData;
|
||||||
|
|
||||||
while((readPtr - startPtr) < dataBytes - sizeof(uint16_t)) {
|
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) {
|
bool packetVersionMatch(unsigned char* packetHeader) {
|
||||||
destination[0] = type;
|
// currently this just checks if the version in the packet matches our return from versionForPacketType
|
||||||
destination[1] = versionForPacketType(type);
|
// 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 the number of bytes written for pointer pushing
|
||||||
return 2;
|
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);
|
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);
|
const int MAX_PACKET_HEADER_BYTES = sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue