|
|
|
@ -113,7 +113,7 @@ namespace ssu
@@ -113,7 +113,7 @@ namespace ssu
|
|
|
|
|
m_IncomleteMessages[msgID] = new IncompleteMessage (msg); |
|
|
|
|
if (isLast) |
|
|
|
|
{ |
|
|
|
|
m_Session.SendMsgAck (msgID); |
|
|
|
|
SendMsgAck (msgID); |
|
|
|
|
msg->FromSSU (msgID); |
|
|
|
|
if (m_Session.GetState () == eSessionStateEstablished) |
|
|
|
|
i2p::HandleI2NPMessage (msg); |
|
|
|
@ -183,6 +183,23 @@ namespace ssu
@@ -183,6 +183,23 @@ namespace ssu
|
|
|
|
|
} |
|
|
|
|
DeleteI2NPMessage (msg); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void SSUData::SendMsgAck (uint32_t msgID) |
|
|
|
|
{ |
|
|
|
|
uint8_t buf[48 + 18]; // actual length is 44 = 37 + 7 but pad it to multiple of 16
|
|
|
|
|
uint8_t * payload = buf + sizeof (SSUHeader); |
|
|
|
|
*payload = DATA_FLAG_EXPLICIT_ACKS_INCLUDED; // flag
|
|
|
|
|
payload++; |
|
|
|
|
*payload = 1; // number of ACKs
|
|
|
|
|
payload++; |
|
|
|
|
*(uint32_t *)(payload) = htobe32 (msgID); // msgID
|
|
|
|
|
payload += 4; |
|
|
|
|
*payload = 0; // number of fragments
|
|
|
|
|
|
|
|
|
|
// encrypt message with session key
|
|
|
|
|
m_Session.FillHeaderAndEncrypt (PAYLOAD_TYPE_DATA, buf, 48); |
|
|
|
|
m_Session.Send (buf, 48); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|