Browse Source

handle SessionConfirmed fragments in reversed order

pull/1786/head
orignal 2 years ago
parent
commit
dc30cd1112
  1. 31
      libi2pd/SSU2Session.cpp
  2. 1
      libi2pd/SSU2Session.h

31
libi2pd/SSU2Session.cpp

@ -409,7 +409,7 @@ namespace transport @@ -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 @@ -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 @@ -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);

1
libi2pd/SSU2Session.h

@ -199,6 +199,7 @@ namespace transport @@ -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…
Cancel
Save