diff --git a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java index ea135f792..d01acdf4f 100644 --- a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java +++ b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java @@ -34,6 +34,11 @@ public class SessionStatusMessage extends I2CPMessageImpl { public final static int STATUS_INVALID = 3; /** @since 0.9.12 */ public final static int STATUS_REFUSED = 4; + /** + * Used internally, not in spec, will be remapped to STATUS_INVALID before being sent. + * @since 0.9.44 + */ + public final static int STATUS_DUP_DEST = 5; public SessionStatusMessage() { setStatus(STATUS_INVALID); diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java index ac930391a..32a17568c 100644 --- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java +++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java @@ -552,7 +552,7 @@ class ClientConnectionRunner { sp.config = config; SessionParams old = _sessions.putIfAbsent(destHash, sp); if (old != null) - return SessionStatusMessage.STATUS_INVALID; + return SessionStatusMessage.STATUS_DUP_DEST; // We process a few options here, but most are handled by the tunnel manager. // The ones here can't be changed later. Properties opts = config.getOptions(); diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java index 07f234f1d..df2eee976 100644 --- a/router/java/src/net/i2p/router/client/ClientManager.java +++ b/router/java/src/net/i2p/router/client/ClientManager.java @@ -325,7 +325,7 @@ class ClientManager { synchronized (_runners) { boolean fail = _runnersByHash.containsKey(dest.calculateHash()); if (fail) { - rv = SessionStatusMessage.STATUS_INVALID; + rv = SessionStatusMessage.STATUS_DUP_DEST; } else { SessionId id = locked_getNextSessionId(); if (id != null) { @@ -339,7 +339,7 @@ class ClientManager { } } } - if (rv == SessionStatusMessage.STATUS_INVALID) { + if (rv == SessionStatusMessage.STATUS_DUP_DEST) { _log.log(Log.CRIT, "Client attempted to register duplicate destination " + dest.toBase32()); } else if (rv == SessionStatusMessage.STATUS_REFUSED) { _log.error("Max sessions exceeded " + dest.toBase32()); diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java index b44a3a42a..344f9d310 100644 --- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java +++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java @@ -326,12 +326,17 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi if (_log.shouldLog(Log.ERROR)) _log.error("Session establish failed: code = " + status); String msg; - if (status == SessionStatusMessage.STATUS_INVALID) + if (status == SessionStatusMessage.STATUS_DUP_DEST) { msg = "duplicate destination"; - else if (status == SessionStatusMessage.STATUS_REFUSED) + // not in spec, change to INVALID if we send it + // status = SessionStatusMessage.STATUS_INVALID + } else if (status == SessionStatusMessage.STATUS_INVALID) { + msg = "bad session configuration parameters"; + } else if (status == SessionStatusMessage.STATUS_REFUSED) { msg = "session limit exceeded"; - else + } else { msg = "unknown error"; + } _runner.disconnectClient(msg); return; }