diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index 2304ec11..b81b00fb 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -1607,26 +1607,32 @@ namespace transport } // ranges uint32_t lastNum = ackThrough - acnt; - it++; - while (it != m_OutOfSequencePackets.rend () && lastNum > m_ReceivePacketNum && numRanges < 8) + while (it != m_OutOfSequencePackets.rend () && lastNum > m_ReceivePacketNum && numRanges < SSU2_MAX_NUM_ACK_RANGES) { if (lastNum - (*it) < 255) { - buf[7 + numRanges*2] = lastNum - (*it); // NACKs - lastNum = *it; - uint8_t numAcks = 0; + buf[7 + numRanges*2] = lastNum - (*it) - 1; // NACKs + lastNum = *it; it++; + uint8_t numAcks = 1; while (it != m_OutOfSequencePackets.rend () && numAcks < 255 && lastNum > m_ReceivePacketNum && *it == lastNum - 1) { numAcks++; lastNum--; it++; } buf[7 + numRanges*2 + 1] = numAcks; // Acks - numRanges++; it++; + numRanges++; if (numAcks == 255) break; } else break; } + if (numRanges < SSU2_MAX_NUM_ACK_RANGES && m_ReceivePacketNum) + { + // add received packets to last range + int numAcks = buf[7 + numRanges*2 + 1] + m_ReceivePacketNum; + if (numAcks > 255) numAcks = 255; + buf[7 + numRanges*2 + 1] = numAcks; + } } } buf[7] = acnt; // acnt diff --git a/libi2pd/SSU2Session.h b/libi2pd/SSU2Session.h index 1fc09d76..364c65c6 100644 --- a/libi2pd/SSU2Session.h +++ b/libi2pd/SSU2Session.h @@ -34,6 +34,7 @@ namespace transport const int SSU2_MAX_NUM_RESENDS = 5; const int SSU2_INCOMPLETE_MESSAGES_CLEANUP_TIMEOUT = 30; // in seconds const size_t SSU2_MAX_WINDOW_SIZE = 128; // in packets + const int SSU2_MAX_NUM_ACK_RANGES = 32; // to send enum SSU2MessageType {