Router: Ensure nonzero tunnel IDs

This commit is contained in:
zzz
2015-01-28 21:43:27 +00:00
parent 06edb9f2a6
commit 5bf515441e
3 changed files with 18 additions and 6 deletions

View File

@ -18,6 +18,10 @@ import java.io.OutputStream;
* the tunnel (otherwise they would get confused and send messages down the * the tunnel (otherwise they would get confused and send messages down the
* wrong one). * wrong one).
* *
* Note that a TunnelId must be greater than zero,
* as the DatabaseStoreMessage uses a zero ID to request
* a direct reply.
*
* @author jrandom * @author jrandom
*/ */
public class TunnelId extends DataStructureImpl { public class TunnelId extends DataStructureImpl {
@ -29,6 +33,10 @@ public class TunnelId extends DataStructureImpl {
_tunnelId = -1; _tunnelId = -1;
} }
/**
* @param id 1 to 0xffffffff
* @throws IllegalArgumentException if less than or equal to zero
*/
public TunnelId(long id) { public TunnelId(long id) {
if (id <= 0) throw new IllegalArgumentException("wtf, tunnelId " + id); if (id <= 0) throw new IllegalArgumentException("wtf, tunnelId " + id);
_tunnelId = id; _tunnelId = id;
@ -36,6 +44,10 @@ public class TunnelId extends DataStructureImpl {
public long getTunnelId() { return _tunnelId; } public long getTunnelId() { return _tunnelId; }
/**
* @param id 1 to 0xffffffff
* @throws IllegalArgumentException if less than or equal to zero
*/
public void setTunnelId(long id) { public void setTunnelId(long id) {
_tunnelId = id; _tunnelId = id;
if (id <= 0) throw new IllegalArgumentException("wtf, tunnelId " + id); if (id <= 0) throw new IllegalArgumentException("wtf, tunnelId " + id);

View File

@ -389,7 +389,7 @@ public class TunnelDispatcher implements Service {
long rv; long rv;
TunnelId tid; TunnelId tid;
do { do {
rv = _context.random().nextLong(TunnelId.MAX_ID_VALUE); rv = 1 + _context.random().nextLong(TunnelId.MAX_ID_VALUE - 1);
tid = new TunnelId(rv); tid = new TunnelId(rv);
} while (_outboundGateways.containsKey(tid)); } while (_outboundGateways.containsKey(tid));
return rv; return rv;
@ -406,7 +406,7 @@ public class TunnelDispatcher implements Service {
long rv; long rv;
TunnelId tid; TunnelId tid;
do { do {
rv = _context.random().nextLong(TunnelId.MAX_ID_VALUE); rv = 1 + _context.random().nextLong(TunnelId.MAX_ID_VALUE - 1);
tid = new TunnelId(rv); tid = new TunnelId(rv);
} while (_participants.containsKey(tid)); } while (_participants.containsKey(tid));
return rv; return rv;
@ -423,7 +423,7 @@ public class TunnelDispatcher implements Service {
long rv; long rv;
TunnelId tid; TunnelId tid;
do { do {
rv = _context.random().nextLong(TunnelId.MAX_ID_VALUE); rv = 1 + _context.random().nextLong(TunnelId.MAX_ID_VALUE - 1);
tid = new TunnelId(rv); tid = new TunnelId(rv);
} while (_inboundGateways.containsKey(tid)); } while (_inboundGateways.containsKey(tid));
return rv; return rv;
@ -612,7 +612,7 @@ public class TunnelDispatcher implements Service {
* endpoint. * endpoint.
* *
* @param msg raw message to deliver to the target peer * @param msg raw message to deliver to the target peer
* @param outboundTunnel tunnel to send the message out * @param outboundTunnel tunnel to send the message out, or null for direct
* @param targetPeer peer to receive the message * @param targetPeer peer to receive the message
*/ */
public void dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, Hash targetPeer) { public void dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, Hash targetPeer) {
@ -626,7 +626,7 @@ public class TunnelDispatcher implements Service {
* *
* @param msg raw message to deliver to the targetTunnel on the targetPeer * @param msg raw message to deliver to the targetTunnel on the targetPeer
* @param outboundTunnel tunnel to send the message out * @param outboundTunnel tunnel to send the message out
* @param targetTunnel tunnel on the targetPeer to deliver the message to * @param targetTunnel tunnel on the targetPeer to deliver the message to, or null for direct
* @param targetPeer gateway to the tunnel to receive the message * @param targetPeer gateway to the tunnel to receive the message
*/ */
public void dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, TunnelId targetTunnel, Hash targetPeer) { public void dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, TunnelId targetTunnel, Hash targetPeer) {

View File

@ -81,7 +81,7 @@ abstract class BuildRequestor {
else if (isIB && i == len - 1) else if (isIB && i == len - 1)
id = ctx.tunnelDispatcher().getNewIBEPID(); id = ctx.tunnelDispatcher().getNewIBEPID();
else else
id = ctx.random().nextLong(TunnelId.MAX_ID_VALUE); id = 1 + ctx.random().nextLong(TunnelId.MAX_ID_VALUE - 1);
cfg.getConfig(i).setReceiveTunnelId(DataHelper.toLong(4, id)); cfg.getConfig(i).setReceiveTunnelId(DataHelper.toLong(4, id));
} }