sync with vnailla dev

This commit is contained in:
liquidraver
2026-05-22 14:42:12 +02:00
parent 895bbbc633
commit 6b624a69e5
7 changed files with 70 additions and 66 deletions
+21 -9
View File
@@ -127,9 +127,21 @@ DispatcherAction Mesh::forwardMultipartDirect(Packet *pkt)
void Mesh::routeDirectRecvAcks(Packet *packet, uint32_t delay_millis)
{
if (!packet->isMarkedDoNotRetransmit()) {
uint32_t crc;
memcpy(&crc, packet->payload, 4);
Packet *a2 = createAck(crc);
uint8_t extra = getExtraAckTransmitCount();
while (extra > 0) {
delay_millis += getDirectRetransmitDelay(packet) + 300;
Packet *a1 = createMultiAck(packet->payload, packet->payload_len, extra);
if (a1) {
/* Trusted source: packet->path is MAX_PATH_SIZE-sized. */
a1->path_len = Packet::copyPath(a1->path, packet->path, MAX_PATH_SIZE, packet->path_len);
a1->header &= ~PH_ROUTE_MASK;
a1->header |= ROUTE_TYPE_DIRECT;
sendPacket(a1, 0, delay_millis);
}
extra--;
}
Packet *a2 = createAck(packet->payload, packet->payload_len);
if (a2) {
/* Trusted source: packet->path is MAX_PATH_SIZE-sized. */
a2->path_len = Packet::copyPath(a2->path, packet->path, MAX_PATH_SIZE, packet->path_len);
@@ -439,24 +451,24 @@ Packet *Mesh::createAdvert(const LocalIdentity &id, const uint8_t *app_data, siz
return packet;
}
Packet *Mesh::createAck(uint32_t ack_crc)
Packet *Mesh::createAck(const uint8_t *ack, uint8_t len)
{
Packet *packet = obtainNewPacket();
if (packet == nullptr) return nullptr;
packet->header = (PAYLOAD_TYPE_ACK << PH_TYPE_SHIFT);
memcpy(packet->payload, &ack_crc, 4);
packet->payload_len = 4;
memcpy(packet->payload, ack, len);
packet->payload_len = len;
return packet;
}
Packet *Mesh::createMultiAck(uint32_t ack_crc, uint8_t remaining)
Packet *Mesh::createMultiAck(const uint8_t *ack, uint8_t len, uint8_t remaining)
{
Packet *packet = obtainNewPacket();
if (packet == nullptr) return nullptr;
packet->header = (PAYLOAD_TYPE_MULTIPART << PH_TYPE_SHIFT);
packet->payload[0] = (remaining << 4) | PAYLOAD_TYPE_ACK;
memcpy(&packet->payload[1], &ack_crc, 4);
packet->payload_len = 5;
memcpy(&packet->payload[1], ack, len);
packet->payload_len = 1 + len;
return packet;
}