Browse Source

don't copy I2NP messages to NTCP2 frame

pull/1277/head
orignal 6 years ago
parent
commit
95ab68acd1
  1. 18
      libi2pd/NTCP2.cpp
  2. 6
      libi2pd/NTCP2.h

18
libi2pd/NTCP2.cpp

@ -1024,22 +1024,16 @@ namespace transport
{ {
if (!m_SendQueue.empty ()) if (!m_SendQueue.empty ())
{ {
auto buf = m_Server.NewNTCP2FrameBuffer (); std::vector<std::shared_ptr<I2NPMessage> > msgs;
uint8_t * payload = buf->data ();
size_t s = 0; size_t s = 0;
// add I2NP blocks
while (!m_SendQueue.empty ()) while (!m_SendQueue.empty ())
{ {
auto msg = m_SendQueue.front (); auto msg = m_SendQueue.front ();
size_t len = msg->GetNTCP2Length (); size_t len = msg->GetNTCP2Length ();
if (s + len + 3 <= NTCP2_UNENCRYPTED_FRAME_MAX_SIZE) // 3 bytes block header if (s + len + 3 <= NTCP2_UNENCRYPTED_FRAME_MAX_SIZE) // 3 bytes block header
{ {
payload[s] = eNTCP2BlkI2NPMessage; // blk msgs.push_back (msg);
htobe16buf (payload + s + 1, len); // size s += (len + 3);
s += 3;
msg->ToNTCP2 ();
memcpy (payload + s, msg->GetNTCP2Header (), len);
s += len;
m_SendQueue.pop_front (); m_SendQueue.pop_front ();
} }
else if (len + 3 > NTCP2_UNENCRYPTED_FRAME_MAX_SIZE) else if (len + 3 > NTCP2_UNENCRYPTED_FRAME_MAX_SIZE)
@ -1050,11 +1044,7 @@ namespace transport
else else
break; break;
} }
// add padding block SendI2NPMsgs (msgs);
s += CreatePaddingBlock (s, payload + s, NTCP2_UNENCRYPTED_FRAME_MAX_SIZE - s);
// send
SendNextFrame (payload, s);
m_Server.DeleteNTCP2FrameBuffer (buf);
} }
} }

6
libi2pd/NTCP2.h

@ -76,7 +76,6 @@ namespace transport
// RouterInfo flags // RouterInfo flags
const uint8_t NTCP2_ROUTER_INFO_FLAG_REQUEST_FLOOD = 0x01; const uint8_t NTCP2_ROUTER_INFO_FLAG_REQUEST_FLOOD = 0x01;
typedef std::array<uint8_t, NTCP2_UNENCRYPTED_FRAME_MAX_SIZE> NTCP2FrameBuffer;
struct NTCP2Establisher struct NTCP2Establisher
{ {
NTCP2Establisher (); NTCP2Establisher ();
@ -236,9 +235,6 @@ namespace transport
void Connect(const boost::asio::ip::address & address, uint16_t port, std::shared_ptr<NTCP2Session> conn); void Connect(const boost::asio::ip::address & address, uint16_t port, std::shared_ptr<NTCP2Session> conn);
NTCP2FrameBuffer * NewNTCP2FrameBuffer () { return m_NTCP2FrameBuffersPool.Acquire(); }
void DeleteNTCP2FrameBuffer (NTCP2FrameBuffer * buf) { return m_NTCP2FrameBuffersPool.Release(buf); }
private: private:
void Run (); void Run ();
@ -262,8 +258,6 @@ namespace transport
std::map<i2p::data::IdentHash, std::shared_ptr<NTCP2Session> > m_NTCP2Sessions; std::map<i2p::data::IdentHash, std::shared_ptr<NTCP2Session> > m_NTCP2Sessions;
std::list<std::shared_ptr<NTCP2Session> > m_PendingIncomingSessions; std::list<std::shared_ptr<NTCP2Session> > m_PendingIncomingSessions;
i2p::util::MemoryPool<NTCP2FrameBuffer> m_NTCP2FrameBuffersPool;
public: public:
// for HTTP/I2PControl // for HTTP/I2PControl

Loading…
Cancel
Save