mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 00:00:29 +03:00
handle SessionConfirmed fragments in reversed order
This commit is contained in:
parent
16290bf66f
commit
dc30cd1112
@ -409,7 +409,7 @@ namespace transport
|
||||
}
|
||||
default:
|
||||
{
|
||||
LogPrint (eLogWarning, "SSU2: Unexpected message type ", (int)header.h.type, " from ", m_RemoteEndpoint);
|
||||
LogPrint (eLogWarning, "SSU2: Unexpected message type ", (int)header.h.type, " from ", m_RemoteEndpoint, " of ", len, " bytes");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -727,8 +727,9 @@ namespace transport
|
||||
header.ll[1] ^= CreateHeaderMask (kh2, buf + (len - 12));
|
||||
if (header.h.type != eSSU2SessionConfirmed)
|
||||
{
|
||||
LogPrint (eLogWarning, "SSU2: Unexpected message type ", (int)header.h.type, " instead ", (int)eSSU2SessionConfirmed);
|
||||
return false;
|
||||
LogPrint (eLogInfo, "SSU2: Unexpected message type ", (int)header.h.type, " instead ", (int)eSSU2SessionConfirmed);
|
||||
// TODO: queue up
|
||||
return true;
|
||||
}
|
||||
// check if fragmented
|
||||
if ((header.h.flags[0] & 0x0F) > 1)
|
||||
@ -743,13 +744,33 @@ namespace transport
|
||||
m_SessionConfirmedFragment->header = header;
|
||||
memcpy (m_SessionConfirmedFragment->payload, buf + 16, len - 16);
|
||||
m_SessionConfirmedFragment->payloadSize = len - 16;
|
||||
return true; // wait for second fragment
|
||||
}
|
||||
else if (m_SessionConfirmedFragment->isSecondFragment)
|
||||
{
|
||||
// we have second fragment
|
||||
m_SessionConfirmedFragment->header = header;
|
||||
memmove (m_SessionConfirmedFragment->payload + (len - 16), m_SessionConfirmedFragment->payload, m_SessionConfirmedFragment->payloadSize);
|
||||
memcpy (m_SessionConfirmedFragment->payload, buf + 16, len - 16);
|
||||
m_SessionConfirmedFragment->payloadSize += (len - 16);
|
||||
buf = m_SessionConfirmedFragment->payload - 16;
|
||||
len = m_SessionConfirmedFragment->payloadSize + 16;
|
||||
}
|
||||
return true; // wait for second fragment
|
||||
else
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// second fragment
|
||||
if (!m_SessionConfirmedFragment) return false; // out of sequence
|
||||
if (!m_SessionConfirmedFragment)
|
||||
{
|
||||
// out of sequence, save it
|
||||
m_SessionConfirmedFragment.reset (new HandshakePacket);
|
||||
memcpy (m_SessionConfirmedFragment->payload, buf + 16, len - 16);
|
||||
m_SessionConfirmedFragment->payloadSize = len - 16;
|
||||
m_SessionConfirmedFragment->isSecondFragment = true;
|
||||
return true;
|
||||
}
|
||||
header = m_SessionConfirmedFragment->header;
|
||||
memcpy (m_SessionConfirmedFragment->payload + m_SessionConfirmedFragment->payloadSize, buf + 16, len - 16);
|
||||
m_SessionConfirmedFragment->payloadSize += (len - 16);
|
||||
|
@ -199,6 +199,7 @@ namespace transport
|
||||
uint8_t payload[SSU2_MAX_PACKET_SIZE*2];
|
||||
size_t payloadSize = 0;
|
||||
uint32_t nextResendTime = 0; // in seconds
|
||||
bool isSecondFragment = false; // for SessionConfirmed
|
||||
};
|
||||
|
||||
typedef std::function<void ()> OnEstablished;
|
||||
|
Loading…
Reference in New Issue
Block a user