From 79e1096eca4d5adf5e0f1f05d8145c3e83263a4c Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 2 Jan 2015 10:04:57 -0500 Subject: [PATCH] process follow-on packets with zero send stream id --- Streaming.cpp | 46 ++++++++++++++++++++++++++++------------------ Streaming.h | 1 - 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/Streaming.cpp b/Streaming.cpp index 367777b2..79296fe4 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -162,10 +162,7 @@ namespace stream optionData += m_RemoteIdentity.FromBuffer (optionData, packet->GetOptionSize ()); LogPrint (eLogInfo, "From identity ", m_RemoteIdentity.GetIdentHash ().ToBase64 ()); if (!m_RemoteLeaseSet) - { LogPrint (eLogDebug, "Incoming stream from ", m_RemoteIdentity.GetIdentHash ().ToBase64 ()); - m_LocalDestination.StreamAccepted (shared_from_this ()); - } } if (flags & PACKET_FLAG_MAX_PACKET_SIZE_INCLUDED) @@ -645,17 +642,6 @@ namespace stream m_Streams.clear (); } } - - void StreamingDestination::StreamAccepted (std::shared_ptr stream) - { - if (m_Acceptor != nullptr) - m_Acceptor (stream); - else - { - LogPrint ("Acceptor for incoming stream is not set"); - DeleteStream (stream); - } - } void StreamingDestination::HandleNextPacket (Packet * packet) { @@ -667,14 +653,38 @@ namespace stream it->second->HandleNextPacket (packet); else { - LogPrint ("Unknown stream ", sendStreamID); + LogPrint ("Unknown stream sendStreamID=", sendStreamID); delete packet; } } - else // new incoming stream + else { - auto incomingStream = CreateNewIncomingStream (); - incomingStream->HandleNextPacket (packet); + if (packet->IsSYN () && !packet->GetSeqn ()) // new incoming stream + { + auto incomingStream = CreateNewIncomingStream (); + incomingStream->HandleNextPacket (packet); + if (m_Acceptor != nullptr) + m_Acceptor (incomingStream); + else + { + LogPrint ("Acceptor for incoming stream is not set"); + DeleteStream (incomingStream); + } + } + else // follow on packet without SYN + { + uint32_t receiveStreamID = packet->GetReceiveStreamID (); + for (auto it: m_Streams) + if (it.second->GetSendStreamID () == receiveStreamID) + { + // found + it.second->HandleNextPacket (packet); + return; + } + // TODO: should queue it up + LogPrint ("Unknown stream receiveStreamID=", receiveStreamID); + delete packet; + } } } diff --git a/Streaming.h b/Streaming.h index f049540e..69ef124d 100644 --- a/Streaming.h +++ b/Streaming.h @@ -170,7 +170,6 @@ namespace stream void SetAcceptor (const Acceptor& acceptor) { m_Acceptor = acceptor; }; void ResetAcceptor () { m_Acceptor = nullptr; }; bool IsAcceptorSet () const { return m_Acceptor != nullptr; }; - void StreamAccepted (std::shared_ptr stream); i2p::client::ClientDestination& GetOwner () { return m_Owner; }; void HandleDataMessagePayload (const uint8_t * buf, size_t len);