diff --git a/Streaming.cpp b/Streaming.cpp index b702e56a..a22d1cd0 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -77,15 +77,14 @@ namespace stream m_ReceiveQueue.Put (packet); else delete packet; - + + SendQuickAck (); if (flags & PACKET_FLAG_CLOSE) { LogPrint ("Closed"); m_IsOpen = false; m_ReceiveQueue.WakeUp (); - } - else - SendQuickAck (); + } } size_t Stream::Send (uint8_t * buf, size_t len, int timeout) @@ -325,11 +324,12 @@ namespace stream size += 256; // encryption key memset (buf + size, 0, 128); size += 128; // signing key - auto tunnel = i2p::tunnel::tunnels.GetNextInboundTunnel (); - if (tunnel) + auto tunnels = i2p::tunnel::tunnels.GetInboundTunnels (5); // 5 tunnels maximum + buf[size] = tunnels.size (); // num leases + size++; // num + for (auto it: tunnels) { - buf[size] = 1; // 1 lease - size++; // num + auto tunnel = it; memcpy (buf + size, (const uint8_t *)tunnel->GetNextIdentHash (), 32); size += 32; // tunnel_gw *(uint32_t *)(buf + size) = htobe32 (tunnel->GetNextTunnelID ()); @@ -339,11 +339,6 @@ namespace stream *(uint64_t *)(buf + size) = htobe64 (ts); size += 8; // end_date } - else - { - buf[size] = 0; // zero leases - size++; // num - } Sign (buf, size, buf+ size); size += 40; // signature diff --git a/Tunnel.cpp b/Tunnel.cpp index 2a87a939..c5f9730f 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -211,6 +211,23 @@ namespace tunnel } return tunnel; } + + std::vector Tunnels::GetInboundTunnels (int num) const + { + std::vector v; + int i = 0; + for (auto it : m_InboundTunnels) + { + if (i >= num) break; + if (it.second->GetNextIdentHash () != i2p::context.GetRouterInfo ().GetIdentHash ()) + { + // exclude one hop tunnels + v.push_back (it.second); + i++; + } + } + return v; + } OutboundTunnel * Tunnels::GetNextOutboundTunnel () { diff --git a/Tunnel.h b/Tunnel.h index cec82958..3f94d787 100644 --- a/Tunnel.h +++ b/Tunnel.h @@ -107,6 +107,7 @@ namespace tunnel InboundTunnel * GetInboundTunnel (uint32_t tunnelID); Tunnel * GetPendingTunnel (uint32_t replyMsgID); InboundTunnel * GetNextInboundTunnel (); + std::vector GetInboundTunnels (int num) const; OutboundTunnel * GetNextOutboundTunnel (); TransitTunnel * GetTransitTunnel (uint32_t tunnelID); void AddTransitTunnel (TransitTunnel * tunnel);