public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback, SSU2Bitfield.Callback, SSU2Sender
| Modifier and Type | Field and Description |
|---|---|
static int |
DEFAULT_MTU |
static int |
DEFAULT_SSU_IPV4_MTU |
static int |
DEFAULT_SSU_IPV6_MTU |
static int |
MAX_MTU |
static int |
MAX_SSU_IPV4_MTU |
static int |
MAX_SSU_IPV6_MTU |
static int |
MIN_MTU |
static int |
MIN_SSU_IPV4_MTU |
static int |
MIN_SSU_IPV6_MTU |
_context, _dead, _inboundMessages, _isInbound, _keyEstablishedTime, _lastACKSend, _log, _mtu, _packetsReceivedDuplicate, _remoteHostId, _remoteIP, _remoteIPAddress, _remotePeer, _remotePort, _rtt, _transport, _wantACKSendSince, ACK_FREQUENCY, CLOCK_SKEW_FUDGE, LARGE_MTU, MAX_IPV6_MTU, MIN_IPV6_MTU, RETRANSMISSION_PERIOD_WIDTH| Constructor and Description |
|---|
PeerState2(RouterContext ctx,
UDPTransport transport,
InetSocketAddress remoteAddress,
Hash remotePeer,
boolean isInbound,
int rtt,
CipherState sendCha,
CipherState rcvCha,
long sendID,
long rcvID,
byte[] sendHdrKey1,
byte[] sendHdrKey2,
byte[] rcvHdrKey2)
If inbound, caller MUST immediately call setWeRelayToThemAs() (if nonzero) and sendAck0().
|
| Modifier and Type | Method and Description |
|---|---|
(package private) List<OutboundMessageState> |
allocateSend(long now)
Overridden to retransmit SessionConfirmed also
|
void |
bitSet(long pktNum)
Callback from SSU2Bitfield.forEachAndNot().
|
(package private) void |
changeAddress(RemoteHostId id)
Caller should sync; UDPTransport must remove and add to peersByRemoteHost map
|
(package private) void |
clearWantedACKSendSince()
All acks have been sent.
|
(package private) void |
confirmedPacketsSent(byte[][] data)
Note that we just sent the SessionConfirmed packets
and save them for retransmission.
|
(package private) int |
finishMessages(long now)
Overridden to expire unacked packets in _sentMessages.
|
(package private) int |
fragmentOverhead()
Packet overhead
This is 5 bytes too high for first or only fragment,
because the 9 byte I2NP header is included in that fragment.
|
(package private) int |
fragmentSize()
how much payload data can we shove in there?
This is 5 bytes too low for first or only fragment,
because the 9 byte I2NP header is included in that fragment.
|
void |
fragmentsSent(long pktNum,
int length,
List<PacketBuilder.Fragment> fragments)
Record the mapping of packet number to what fragments were in it,
so we can process acks.
|
SSU2Bitfield |
getAckedMessages() |
(package private) int |
getDestroyReason() |
byte |
getFlags()
Flag byte to be sent in header
|
long |
getNextPacketNumber()
Next outbound packet number,
starts at 1 for Alice (0 is Session Confirmed) and 0 for Bob
|
protected long |
getNextPacketNumberNoThrow()
For PeerStateDestroyed only, after we are dead
|
(package private) byte[] |
getOurIP()
As received in the Address Block in the handshake,
or subsequently in the data phase.
|
(package private) int |
getOurPort()
As received in the Address Block in the handshake,
or subsequently in the data phase.
|
(package private) CipherState |
getRcvCipher() |
(package private) long |
getRcvConnID() |
(package private) byte[] |
getRcvHeaderEncryptKey1() |
(package private) byte[] |
getRcvHeaderEncryptKey2() |
SSU2Bitfield |
getReceivedMessages() |
CipherState |
getSendCipher()
Caller must sync on returned object when encrypting
|
long |
getSendConnID() |
byte[] |
getSendHeaderEncryptKey1() |
byte[] |
getSendHeaderEncryptKey2() |
int |
getVersion() |
void |
gotACK(long ackThru,
int acks,
byte[] ranges) |
void |
gotAddress(byte[] ip,
int port) |
void |
gotDateTime(long time) |
void |
gotFragment(byte[] data,
int off,
int len,
long messageId,
int frag,
boolean isLast)
Data must be copied out in this method.
|
void |
gotI2NP(I2NPMessage msg) |
void |
gotOptions(byte[] options,
boolean isHandshake) |
void |
gotPathChallenge(RemoteHostId from,
byte[] data) |
void |
gotPathResponse(RemoteHostId from,
byte[] data) |
void |
gotPeerTest(int msg,
int status,
Hash h,
byte[] data) |
void |
gotRelayIntro(Hash aliceHash,
byte[] data) |
void |
gotRelayRequest(byte[] data) |
void |
gotRelayResponse(int status,
byte[] data) |
void |
gotRelayTag(long tag) |
void |
gotRelayTagRequest() |
void |
gotRI(RouterInfo ri,
boolean isHandshake,
boolean flood) |
void |
gotRIFragment(byte[] data,
boolean isHandshake,
boolean flood,
boolean isGzipped,
int frag,
int totalFrags) |
void |
gotTermination(int reason,
long count) |
void |
gotToken(long token,
long expires) |
(package private) boolean |
isDead() |
protected void |
messagePartiallyReceived(long now)
Overridden to use our version of ACKTimer
|
(package private) void |
receivePacket(RemoteHostId from,
UDPPacket packet)
From different than expected source IP/port
|
(package private) void |
receivePacket(UDPPacket packet) |
(package private) void |
sendAck0()
Send immediate ACK 0 of Session Confirmed.
|
void |
setDestroyReason(int reason) |
(package private) void |
setOurAddress(byte[] ip,
int port)
For initialization by IES2/OES2 only.
|
acked, add, adjustClockSkew, changePort, dataReceived, dropOutbound, ECNReceived, expireInboundMessages, getClockSkew, getConcurrentSends, getConcurrentSendWindow, getConsecutiveFailedSends, getConsecutiveSendRejections, getInactivityTime, getInboundMessages, getIntroducerTime, getKeyEstablishedTime, getLastACKSend, getLastReceiveTime, getLastSendFullyTime, getLastSendOrPingTime, getLastSendTime, getMayDisconnect, getMessagesReceived, getMessagesSent, getMTU, getNextDelay, getOutboundMessageCount, getPacketsReceived, getPacketsReceivedDuplicate, getPacketsRetransmitted, getPacketsTransmitted, getReceiveBps, getReceiveMTU, getRemoteHostId, getRemoteIP, getRemoteIPAddress, getRemotePeer, getRemotePort, getRTO, getRTT, getRTTDeviation, getSendBps, getSendWindowBytes, getSendWindowBytesRemaining, getSlowStartThreshold, getTheyRelayToUsAs, getTransport, getWeRelayToThemAs, highestSeqNumAcked, incrementConsecutiveFailedSends, isBacklogged, isInbound, isIPv6, loadFrom, messageFullyReceived, messagePartiallyReceived, messageRetransmitted, packetReceived, packetsTransmitted, setHisMTU, setIntroducerTime, setLastPingTime, setLastReceiveTime, setLastSendTime, setMayDisconnect, setTheyRelayToUsAs, setWeRelayToThemAs, shouldRequestImmediateAck, toStringclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitgetMTU, getRemoteHostId, getRemoteIPAddress, getRemotePort, isIPv6public static final int DEFAULT_MTU
public static final int DEFAULT_SSU_IPV4_MTU
public static final int DEFAULT_SSU_IPV6_MTU
public static final int MAX_MTU
public static final int MAX_SSU_IPV4_MTU
public static final int MAX_SSU_IPV6_MTU
public static final int MIN_MTU
public static final int MIN_SSU_IPV4_MTU
public static final int MIN_SSU_IPV6_MTU
public PeerState2(RouterContext ctx, UDPTransport transport, InetSocketAddress remoteAddress, Hash remotePeer, boolean isInbound, int rtt, CipherState sendCha, CipherState rcvCha, long sendID, long rcvID, byte[] sendHdrKey1, byte[] sendHdrKey2, byte[] rcvHdrKey2)
rtt - from the EstablishState, or 0 if not availableList<OutboundMessageState> allocateSend(long now)
allocateSend in class PeerStatepublic void bitSet(long pktNum)
bitSet in interface SSU2Bitfield.Callbackvoid changeAddress(RemoteHostId id)
void clearWantedACKSendSince()
clearWantedACKSendSince in class PeerStatevoid confirmedPacketsSent(byte[][] data)
int finishMessages(long now)
finishMessages in class PeerStatenow - current time in milliseconds for expiration checksint fragmentOverhead()
fragmentOverhead in class PeerStateint fragmentSize()
fragmentSize in class PeerStatepublic void fragmentsSent(long pktNum,
int length,
List<PacketBuilder.Fragment> fragments)
fragmentsSent in interface SSU2Senderlength - including ip/udp header, for logging onlypublic SSU2Bitfield getAckedMessages()
getAckedMessages in interface SSU2Senderint getDestroyReason()
public byte getFlags()
getFlags in interface SSU2Senderpublic long getNextPacketNumber()
throws IOException
getNextPacketNumber in interface SSU2SenderIOExceptionprotected long getNextPacketNumberNoThrow()
byte[] getOurIP()
int getOurPort()
CipherState getRcvCipher()
long getRcvConnID()
byte[] getRcvHeaderEncryptKey1()
byte[] getRcvHeaderEncryptKey2()
public SSU2Bitfield getReceivedMessages()
getReceivedMessages in interface SSU2Senderpublic CipherState getSendCipher()
getSendCipher in interface SSU2Senderpublic long getSendConnID()
getSendConnID in interface SSU2Senderpublic byte[] getSendHeaderEncryptKey1()
getSendHeaderEncryptKey1 in interface SSU2Senderpublic byte[] getSendHeaderEncryptKey2()
getSendHeaderEncryptKey2 in interface SSU2Senderpublic int getVersion()
getVersion in class PeerStatepublic void gotACK(long ackThru,
int acks,
byte[] ranges)
gotACK in interface SSU2Payload.PayloadCallbackranges - null if nonepublic void gotAddress(byte[] ip,
int port)
gotAddress in interface SSU2Payload.PayloadCallbackpublic void gotDateTime(long time)
gotDateTime in interface SSU2Payload.PayloadCallbackpublic void gotFragment(byte[] data,
int off,
int len,
long messageId,
int frag,
boolean isLast)
throws DataFormatException
SSU2Payload.PayloadCallbackgotFragment in interface SSU2Payload.PayloadCallbackoff - offset in datalen - length of data to copyDataFormatExceptionpublic void gotI2NP(I2NPMessage msg)
gotI2NP in interface SSU2Payload.PayloadCallbackpublic void gotOptions(byte[] options,
boolean isHandshake)
gotOptions in interface SSU2Payload.PayloadCallbackisHandshake - true only for message 3 part 2public void gotPathChallenge(RemoteHostId from, byte[] data)
gotPathChallenge in interface SSU2Payload.PayloadCallbackfrom - null if unknownpublic void gotPathResponse(RemoteHostId from, byte[] data)
gotPathResponse in interface SSU2Payload.PayloadCallbackfrom - null if unknownpublic void gotPeerTest(int msg,
int status,
Hash h,
byte[] data)
gotPeerTest in interface SSU2Payload.PayloadCallbackmsg - 1-7status - 0 = accept, 1-255 = rejecth - Alice or Charlie hash for msg 2 and 4, null for msg 1, 3, 5-7data - excludes flag, includes signaturepublic void gotRelayIntro(Hash aliceHash, byte[] data)
gotRelayIntro in interface SSU2Payload.PayloadCallbackdata - excludes flag, includes signaturepublic void gotRelayRequest(byte[] data)
gotRelayRequest in interface SSU2Payload.PayloadCallbackdata - excludes flag, includes signaturepublic void gotRelayResponse(int status,
byte[] data)
gotRelayResponse in interface SSU2Payload.PayloadCallbackstatus - 0 = accept, 1-255 = rejectdata - excludes flag, includes signaturepublic void gotRelayTag(long tag)
gotRelayTag in interface SSU2Payload.PayloadCallbackpublic void gotRelayTagRequest()
gotRelayTagRequest in interface SSU2Payload.PayloadCallbackpublic void gotRI(RouterInfo ri, boolean isHandshake, boolean flood) throws DataFormatException
gotRI in interface SSU2Payload.PayloadCallbackri - will already be validatedisHandshake - true only for message 3 part 2DataFormatExceptionpublic void gotRIFragment(byte[] data,
boolean isHandshake,
boolean flood,
boolean isGzipped,
int frag,
int totalFrags)
gotRIFragment in interface SSU2Payload.PayloadCallbackdata - is first gzipped and then fragmentedisHandshake - true only for message 3 part 2public void gotTermination(int reason,
long count)
gotTermination in interface SSU2Payload.PayloadCallbackcount - in theory could wrap around to negative, but very unlikelypublic void gotToken(long token,
long expires)
gotToken in interface SSU2Payload.PayloadCallbackboolean isDead()
protected void messagePartiallyReceived(long now)
messagePartiallyReceived in class PeerStatevoid receivePacket(RemoteHostId from, UDPPacket packet)
from - source addresspacket - fully encrypted, header and body decryption will be done herevoid receivePacket(UDPPacket packet)
packet - fully encrypted, header and body decryption will be done herevoid sendAck0()
public void setDestroyReason(int reason)
setDestroyReason in interface SSU2Sendervoid setOurAddress(byte[] ip,
int port)