| 541 | } |
| 542 | |
| 543 | void I2NPMessagesHandler::PutNextMessage (std::shared_ptr<I2NPMessage>&& msg) |
| 544 | { |
| 545 | if (msg) |
| 546 | { |
| 547 | switch (msg->GetTypeID ()) |
| 548 | { |
| 549 | case eI2NPTunnelData: |
| 550 | m_TunnelMsgs.push_back (msg); |
| 551 | break; |
| 552 | case eI2NPTunnelGateway: |
| 553 | m_TunnelGatewayMsgs.push_back (msg); |
| 554 | break; |
| 555 | case eI2NPVariableTunnelBuild: |
| 556 | case eI2NPTunnelBuild: |
| 557 | case eI2NPShortTunnelBuild: |
| 558 | { |
| 559 | auto ts = i2p::util::GetMonotonicMilliseconds (); |
| 560 | if (!m_LastTunnelBuildMessageTimestamp || |
| 561 | ts > m_LastTunnelBuildMessageTimestamp + TUNNEL_BUILD_MESSAGES_MIN_INTERVAL || |
| 562 | m_NumDroppedTunnelBuildMessages > MAX_NUM_DROPPED_TUNNEL_BUILD_MESSAGES) |
| 563 | { |
| 564 | m_NumThrottledTunnelBuildMessages = 0; |
| 565 | if (m_NumDroppedTunnelBuildMessages > 0) |
| 566 | { |
| 567 | LogPrint (eLogWarning, "I2NP: ", m_NumDroppedTunnelBuildMessages, " tunnel build messages dropped"); |
| 568 | m_NumDroppedTunnelBuildMessages = 0; |
| 569 | } |
| 570 | HandleI2NPMessage (msg); |
| 571 | } |
| 572 | else |
| 573 | { |
| 574 | if (m_NumThrottledTunnelBuildMessages < MAX_NUM_THROTTLED_TUNNEL_BUILD_MESSAGES) |
| 575 | { |
| 576 | // let TBM go through |
| 577 | m_NumThrottledTunnelBuildMessages++; |
| 578 | HandleI2NPMessage (msg); |
| 579 | } |
| 580 | else // drop TBM |
| 581 | m_NumDroppedTunnelBuildMessages++; |
| 582 | } |
| 583 | m_LastTunnelBuildMessageTimestamp = ts; |
| 584 | break; |
| 585 | } |
| 586 | default: |
| 587 | HandleI2NPMessage (msg); |
| 588 | } |
| 589 | } |
| 590 | } |
| 591 | |
| 592 | void I2NPMessagesHandler::Flush () |
| 593 | { |
no test coverage detected