diff --git a/libi2pd/SSU2Session.cpp b/libi2pd/SSU2Session.cpp index aedf346c..9c2153a6 100644 --- a/libi2pd/SSU2Session.cpp +++ b/libi2pd/SSU2Session.cpp @@ -1836,7 +1836,7 @@ namespace transport session->SendData (payload, payloadSize); } - void SSU2Session::HandleRelayIntro (const uint8_t * buf, size_t len) + void SSU2Session::HandleRelayIntro (const uint8_t * buf, size_t len, int attempts) { // we are Charlie SSU2RelayResponseCode code = eSSU2RelayResponseCodeAccept; @@ -1891,9 +1891,22 @@ namespace transport code = eSSU2RelayResponseCodeCharlieSignatureFailure; } } - else + else if (!attempts) { - LogPrint (eLogError, "SSU2: RelayIntro unknown router to introduce"); + // RouterInfo migth come in the next packet, try again + auto vec = std::make_shared >(len); + memcpy (vec->data (), buf, len); + auto s = shared_from_this (); + m_Server.GetService ().post ([s, vec, attempts]() + { + LogPrint (eLogDebug, "SSU2: RelayIntro attempt ", attempts + 1); + s->HandleRelayIntro (vec->data (), vec->size (), attempts + 1); + }); + return; + } + else + { + LogPrint (eLogWarning, "SSU2: RelayIntro unknown router to introduce"); code = eSSU2RelayResponseCodeCharlieAliceIsUnknown; } // send relay response to Bob diff --git a/libi2pd/SSU2Session.h b/libi2pd/SSU2Session.h index c9592a58..aab02127 100644 --- a/libi2pd/SSU2Session.h +++ b/libi2pd/SSU2Session.h @@ -305,7 +305,7 @@ namespace transport void HandleFollowOnFragment (const uint8_t * buf, size_t len); bool ConcatOutOfSequenceFragments (std::shared_ptr m); // true if message complete void HandleRelayRequest (const uint8_t * buf, size_t len); - void HandleRelayIntro (const uint8_t * buf, size_t len); + void HandleRelayIntro (const uint8_t * buf, size_t len, int attempts = 0); void HandleRelayResponse (const uint8_t * buf, size_t len); void HandlePeerTest (const uint8_t * buf, size_t len);