From fc817b0ec00327211db57152a749173d4d63f7d5 Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 26 Jul 2018 12:17:50 +0000 Subject: [PATCH] NTCP2: Defer NTCP 1/2 classifiation until receiving 64 bytes --- .../transport/ntcp/InboundEstablishState.java | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java b/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java index cf88963ef..53221104d 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java @@ -147,17 +147,28 @@ class InboundEstablishState extends EstablishBase implements NTCP2Payload.Payloa receiveInboundNTCP2(src); return; } - // TODO if less than 64, buffer and decide later? if (_state == State.IB_INIT && src.hasRemaining()) { int remaining = src.remaining(); - if (remaining < NTCP1_MSG1_SIZE && _transport.isNTCP2Enabled()) { - // NTCP2 - // TODO can't change our mind later if we get more than 287 - _con.setVersion(2); - changeState(State.IB_NTCP2_INIT); - receiveInboundNTCP2(src); - // releaseBufs() will return the unused DH - return; + if (_transport.isNTCP2Enabled()) { + if (remaining + _received < MSG1_SIZE) { + // Less than 64 total received, so we defer the NTCP 1 or 2 decision. + // Buffer in _X. + // Stay in the IB_INIT state, and wait for more data. + src.get(_X, _received, remaining); + _received += remaining; + if (_log.shouldWarn()) + _log.warn("Short buffer got " + remaining + " total now " + _received + " on " + this); + return; + } + if (remaining + _received < NTCP1_MSG1_SIZE) { + // Less than 288 total received, assume NTCP2 + // TODO can't change our mind later if we get more than 287 + _con.setVersion(2); + changeState(State.IB_NTCP2_INIT); + receiveInboundNTCP2(src); + // releaseBufs() will return the unused DH + return; + } } int toGet = Math.min(remaining, XY_SIZE - _received); src.get(_X, _received, toGet); @@ -620,7 +631,7 @@ class InboundEstablishState extends EstablishBase implements NTCP2Payload.Payloa src.get(_X, _received, toGet); _received += toGet; if (_received < MSG1_SIZE) { - // TODO if we got less than 64 should we even be here? + // Won't get here, now handled in receiveInbound() if (_log.shouldWarn()) _log.warn("Short buffer got " + toGet + " total now " + _received); return;