mirror of
https://github.com/liquidraver/ZephCore.git
synced 2026-09-02 18:33:47 +00:00
sync with vnailla dev
This commit is contained in:
+21
-9
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user