package net.i2p.router.transport.udp;
import java.net.InetAddress;
import java.util.concurrent.atomic.AtomicInteger;
import net.i2p.data.SessionKey;
/**
* Track the state of a peer test.
* Used only by PeerTestManager.
*/
class PeerTestState {
private final long _testNonce;
private final Role _ourRole;
private final boolean _isIPv6;
private InetAddress _aliceIP;
private int _alicePort;
private InetAddress _bobIP;
private int _bobPort;
private InetAddress _charlieIP;
private int _charliePort;
private InetAddress _aliceIPFromCharlie;
private int _alicePortFromCharlie;
private SessionKey _aliceIntroKey;
private SessionKey _charlieIntroKey;
private SessionKey _bobCipherKey;
private SessionKey _bobMACKey;
private final long _beginTime;
private long _lastSendTime;
private long _receiveAliceTime;
private long _receiveBobTime;
private long _receiveCharlieTime;
private final AtomicInteger _packetsRelayed = new AtomicInteger();
public enum Role {ALICE, BOB, CHARLIE};
public PeerTestState(Role role, boolean isIPv6, long nonce, long now) {
_ourRole = role;
_isIPv6 = isIPv6;
_testNonce = nonce;
_beginTime = now;
}
public long getNonce() { return _testNonce; }
/** Are we Alice, bob, or Charlie. */
public Role getOurRole() { return _ourRole; }
/**
* Is this an IPv6 test?
* @since 0.9.27
*/
public boolean isIPv6() { return _isIPv6; }
/**
* If we are Alice, this will contain the IP that Bob says we
* can be reached at - the IP Charlie says we can be reached
* at is _aliceIPFromCharlie
*
*/
public InetAddress getAliceIP() { return _aliceIP; }
public void setAliceIP(InetAddress ip) { _aliceIP = ip; }
public InetAddress getBobIP() { return _bobIP; }
public void setBobIP(InetAddress ip) { _bobIP = ip; }
public InetAddress getCharlieIP() { return _charlieIP; }
public void setCharlieIP(InetAddress ip) { _charlieIP = ip; }
public InetAddress getAliceIPFromCharlie() { return _aliceIPFromCharlie; }
public void setAliceIPFromCharlie(InetAddress ip) { _aliceIPFromCharlie = ip; }
/**
* If we are Alice, this will contain the port that Bob says we
* can be reached at - the port Charlie says we can be reached
* at is _alicePortFromCharlie
*
*/
public int getAlicePort() { return _alicePort; }
public void setAlicePort(int alicePort) { _alicePort = alicePort; }
public int getBobPort() { return _bobPort; }
public void setBobPort(int bobPort) { _bobPort = bobPort; }
public int getCharliePort() { return _charliePort; }
public void setCharliePort(int charliePort) { _charliePort = charliePort; }
public int getAlicePortFromCharlie() { return _alicePortFromCharlie; }
public void setAlicePortFromCharlie(int alicePortFromCharlie) { _alicePortFromCharlie = alicePortFromCharlie; }
public SessionKey getAliceIntroKey() { return _aliceIntroKey; }
public void setAliceIntroKey(SessionKey key) { _aliceIntroKey = key; }
public SessionKey getCharlieIntroKey() { return _charlieIntroKey; }
public void setCharlieIntroKey(SessionKey key) { _charlieIntroKey = key; }
public SessionKey getBobCipherKey() { return _bobCipherKey; }
public void setBobCipherKey(SessionKey key) { _bobCipherKey = key; }
public SessionKey getBobMACKey() { return _bobMACKey; }
public void setBobMACKey(SessionKey key) { _bobMACKey = key; }
/** when did this test begin? */
public long getBeginTime() { return _beginTime; }
/** when did we last send out a packet? */
public long getLastSendTime() { return _lastSendTime; }
public void setLastSendTime(long when) { _lastSendTime = when; }
/**
* when did we last hear from alice?
*/
public long getReceiveAliceTime() { return _receiveAliceTime; }
public void setReceiveAliceTime(long when) { _receiveAliceTime = when; }
/** when did we last hear from bob? */
public long getReceiveBobTime() { return _receiveBobTime; }
public void setReceiveBobTime(long when) { _receiveBobTime = when; }
/** when did we last hear from charlie? */
public long getReceiveCharlieTime() { return _receiveCharlieTime; }
public void setReceiveCharlieTime(long when) { _receiveCharlieTime = when; }
/** @return new value */
public int incrementPacketsRelayed() { return _packetsRelayed.incrementAndGet(); }
@Override
public String toString() {
StringBuilder buf = new StringBuilder(256);
buf.append("PeerTest ").append(_testNonce)
.append(" as ").append(_ourRole.toString());
if (_aliceIP != null)
buf.append("; Alice: ").append(_aliceIP).append(':').append(_alicePort);
if (_aliceIPFromCharlie != null)
buf.append(" (fromCharlie ").append(_aliceIPFromCharlie).append(':').append(_alicePortFromCharlie).append(')');
if (_bobIP != null)
buf.append("; Bob: ").append(_bobIP).append(':').append(_bobPort);
if (_charlieIP != null)
buf.append(" Charlie: ").append(_charlieIP).append(':').append(_charliePort);
buf.append("; last send after ").append(_lastSendTime - _beginTime);
if (_receiveAliceTime > 0)
buf.append("; rcvd from Alice after ").append(_receiveAliceTime - _beginTime);
if (_receiveBobTime > 0)
buf.append("; rcvd from Bob after ").append(_receiveBobTime - _beginTime);
if (_receiveCharlieTime > 0)
buf.append("; rcvd from Charlie after ").append(_receiveCharlieTime - _beginTime);
buf.append("; pkts relayed: ").append(_packetsRelayed.get());
return buf.toString();
}
}