mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-11-01 10:21:59 +00:00
Merge pull request #3573 from meshcore-dev/ack-timing-fix
ACK forwarding timing fix
This commit is contained in:
+6
-6
@@ -87,13 +87,14 @@ DispatcherAction Mesh::onRecvPacket(Packet* pkt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (self_id.isHashMatch(pkt->path, pkt->getPathHashSize()) && allowPacketForward(pkt)) {
|
if (self_id.isHashMatch(pkt->path, pkt->getPathHashSize()) && allowPacketForward(pkt)) {
|
||||||
|
uint32_t d = getDirectRetransmitDelay(pkt);
|
||||||
if (pkt->getPayloadType() == PAYLOAD_TYPE_MULTIPART) {
|
if (pkt->getPayloadType() == PAYLOAD_TYPE_MULTIPART) {
|
||||||
return forwardMultipartDirect(pkt);
|
return forwardMultipartDirect(pkt, d);
|
||||||
} else if (pkt->getPayloadType() == PAYLOAD_TYPE_ACK) {
|
} else if (pkt->getPayloadType() == PAYLOAD_TYPE_ACK) {
|
||||||
if (!_tables->wasSeen(pkt)) { // don't retransmit!
|
if (!_tables->wasSeen(pkt)) { // don't retransmit!
|
||||||
_tables->markSeen(pkt);
|
_tables->markSeen(pkt);
|
||||||
removeSelfFromPath(pkt);
|
removeSelfFromPath(pkt);
|
||||||
routeDirectRecvAcks(pkt, 0);
|
routeDirectRecvAcks(pkt, d);
|
||||||
}
|
}
|
||||||
return ACTION_RELEASE;
|
return ACTION_RELEASE;
|
||||||
}
|
}
|
||||||
@@ -102,7 +103,6 @@ DispatcherAction Mesh::onRecvPacket(Packet* pkt) {
|
|||||||
_tables->markSeen(pkt);
|
_tables->markSeen(pkt);
|
||||||
removeSelfFromPath(pkt);
|
removeSelfFromPath(pkt);
|
||||||
|
|
||||||
uint32_t d = getDirectRetransmitDelay(pkt);
|
|
||||||
return ACTION_RETRANSMIT_DELAYED(0, d); // Routed traffic is HIGHEST priority
|
return ACTION_RETRANSMIT_DELAYED(0, d); // Routed traffic is HIGHEST priority
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -356,7 +356,7 @@ DispatcherAction Mesh::routeRecvPacket(Packet* packet) {
|
|||||||
return ACTION_RELEASE;
|
return ACTION_RELEASE;
|
||||||
}
|
}
|
||||||
|
|
||||||
DispatcherAction Mesh::forwardMultipartDirect(Packet* pkt) {
|
DispatcherAction Mesh::forwardMultipartDirect(Packet* pkt, uint32_t delay_millis) {
|
||||||
uint8_t remaining = pkt->payload[0] >> 4; // num of packets in this multipart sequence still to be sent
|
uint8_t remaining = pkt->payload[0] >> 4; // num of packets in this multipart sequence still to be sent
|
||||||
uint8_t type = pkt->payload[0] & 0x0F;
|
uint8_t type = pkt->payload[0] & 0x0F;
|
||||||
|
|
||||||
@@ -370,7 +370,7 @@ DispatcherAction Mesh::forwardMultipartDirect(Packet* pkt) {
|
|||||||
if (!_tables->wasSeen(&tmp)) { // don't retransmit!
|
if (!_tables->wasSeen(&tmp)) { // don't retransmit!
|
||||||
_tables->markSeen(&tmp);
|
_tables->markSeen(&tmp);
|
||||||
removeSelfFromPath(&tmp);
|
removeSelfFromPath(&tmp);
|
||||||
routeDirectRecvAcks(&tmp, ((uint32_t)remaining + 1) * 300); // expect multipart ACKs 300ms apart (x2)
|
routeDirectRecvAcks(&tmp, delay_millis + ((uint32_t)remaining + 1) * 300); // expect multipart ACKs 300ms apart (x2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ACTION_RELEASE;
|
return ACTION_RELEASE;
|
||||||
@@ -380,13 +380,13 @@ void Mesh::routeDirectRecvAcks(Packet* packet, uint32_t delay_millis) {
|
|||||||
if (!packet->isMarkedDoNotRetransmit()) {
|
if (!packet->isMarkedDoNotRetransmit()) {
|
||||||
uint8_t extra = getExtraAckTransmitCount();
|
uint8_t extra = getExtraAckTransmitCount();
|
||||||
while (extra > 0) {
|
while (extra > 0) {
|
||||||
delay_millis += getDirectRetransmitDelay(packet) + 300;
|
|
||||||
auto a1 = createMultiAck(packet->payload, packet->payload_len, extra);
|
auto a1 = createMultiAck(packet->payload, packet->payload_len, extra);
|
||||||
if (a1) {
|
if (a1) {
|
||||||
a1->path_len = Packet::copyPath(a1->path, packet->path, packet->path_len);
|
a1->path_len = Packet::copyPath(a1->path, packet->path, packet->path_len);
|
||||||
a1->header &= ~PH_ROUTE_MASK;
|
a1->header &= ~PH_ROUTE_MASK;
|
||||||
a1->header |= ROUTE_TYPE_DIRECT;
|
a1->header |= ROUTE_TYPE_DIRECT;
|
||||||
sendPacket(a1, 0, delay_millis);
|
sendPacket(a1, 0, delay_millis);
|
||||||
|
delay_millis += 300;
|
||||||
}
|
}
|
||||||
extra--;
|
extra--;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -32,7 +32,7 @@ class Mesh : public Dispatcher {
|
|||||||
void removeSelfFromPath(Packet* packet);
|
void removeSelfFromPath(Packet* packet);
|
||||||
void routeDirectRecvAcks(Packet* packet, uint32_t delay_millis);
|
void routeDirectRecvAcks(Packet* packet, uint32_t delay_millis);
|
||||||
//void routeRecvAcks(Packet* packet, uint32_t delay_millis);
|
//void routeRecvAcks(Packet* packet, uint32_t delay_millis);
|
||||||
DispatcherAction forwardMultipartDirect(Packet* pkt);
|
DispatcherAction forwardMultipartDirect(Packet* pkt, uint32_t delay_millis);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
DispatcherAction onRecvPacket(Packet* pkt) override;
|
DispatcherAction onRecvPacket(Packet* pkt) override;
|
||||||
|
|||||||
Reference in New Issue
Block a user