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, toString
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
getMTU, getRemoteHostId, getRemoteIPAddress, getRemotePort, isIPv6
public static final int MIN_SSU_IPV4_MTU
public static final int MAX_SSU_IPV4_MTU
public static final int DEFAULT_SSU_IPV4_MTU
public static final int MIN_SSU_IPV6_MTU
public static final int MAX_SSU_IPV6_MTU
public static final int DEFAULT_SSU_IPV6_MTU
public static final int MIN_MTU
public static final int MAX_MTU
public static final int DEFAULT_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 availablevoid sendAck0()
public int getVersion()
getVersion
in class PeerState
int fragmentSize()
fragmentSize
in class PeerState
int fragmentOverhead()
fragmentOverhead
in class PeerState
void clearWantedACKSendSince()
clearWantedACKSendSince
in class PeerState
protected void messagePartiallyReceived(long now)
messagePartiallyReceived
in class PeerState
int finishMessages(long now)
finishMessages
in class PeerState
List<OutboundMessageState> allocateSend(long now)
allocateSend
in class PeerState
public long getNextPacketNumber() throws IOException
getNextPacketNumber
in interface SSU2Sender
IOException
protected long getNextPacketNumberNoThrow()
public long getSendConnID()
getSendConnID
in interface SSU2Sender
public CipherState getSendCipher()
getSendCipher
in interface SSU2Sender
public byte[] getSendHeaderEncryptKey1()
getSendHeaderEncryptKey1
in interface SSU2Sender
public byte[] getSendHeaderEncryptKey2()
getSendHeaderEncryptKey2
in interface SSU2Sender
public void setDestroyReason(int reason)
setDestroyReason
in interface SSU2Sender
long getRcvConnID()
byte[] getRcvHeaderEncryptKey1()
byte[] getRcvHeaderEncryptKey2()
int getDestroyReason()
CipherState getRcvCipher()
void setOurAddress(byte[] ip, int port)
byte[] getOurIP()
int getOurPort()
public SSU2Bitfield getReceivedMessages()
getReceivedMessages
in interface SSU2Sender
public SSU2Bitfield getAckedMessages()
getAckedMessages
in interface SSU2Sender
void receivePacket(UDPPacket packet)
packet
- fully encrypted, header and body decryption will be done herevoid receivePacket(RemoteHostId from, UDPPacket packet)
from
- source addresspacket
- fully encrypted, header and body decryption will be done herepublic void gotDateTime(long time)
gotDateTime
in interface SSU2Payload.PayloadCallback
public void gotOptions(byte[] options, boolean isHandshake)
gotOptions
in interface SSU2Payload.PayloadCallback
isHandshake
- true only for message 3 part 2public void gotRI(RouterInfo ri, boolean isHandshake, boolean flood) throws DataFormatException
gotRI
in interface SSU2Payload.PayloadCallback
ri
- will already be validatedisHandshake
- true only for message 3 part 2DataFormatException
public void gotRIFragment(byte[] data, boolean isHandshake, boolean flood, boolean isGzipped, int frag, int totalFrags)
gotRIFragment
in interface SSU2Payload.PayloadCallback
data
- is first gzipped and then fragmentedisHandshake
- true only for message 3 part 2public void gotAddress(byte[] ip, int port)
gotAddress
in interface SSU2Payload.PayloadCallback
public void gotRelayTagRequest()
gotRelayTagRequest
in interface SSU2Payload.PayloadCallback
public void gotRelayTag(long tag)
gotRelayTag
in interface SSU2Payload.PayloadCallback
public void gotRelayRequest(byte[] data)
gotRelayRequest
in interface SSU2Payload.PayloadCallback
data
- excludes flag, includes signaturepublic void gotRelayResponse(int status, byte[] data)
gotRelayResponse
in interface SSU2Payload.PayloadCallback
status
- 0 = accept, 1-255 = rejectdata
- excludes flag, includes signaturepublic void gotRelayIntro(Hash aliceHash, byte[] data)
gotRelayIntro
in interface SSU2Payload.PayloadCallback
data
- excludes flag, includes signaturepublic void gotPeerTest(int msg, int status, Hash h, byte[] data)
gotPeerTest
in interface SSU2Payload.PayloadCallback
msg
- 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 gotToken(long token, long expires)
gotToken
in interface SSU2Payload.PayloadCallback
public void gotI2NP(I2NPMessage msg)
gotI2NP
in interface SSU2Payload.PayloadCallback
public void gotFragment(byte[] data, int off, int len, long messageId, int frag, boolean isLast) throws DataFormatException
SSU2Payload.PayloadCallback
gotFragment
in interface SSU2Payload.PayloadCallback
off
- offset in datalen
- length of data to copyDataFormatException
public void gotACK(long ackThru, int acks, byte[] ranges)
gotACK
in interface SSU2Payload.PayloadCallback
ranges
- null if nonepublic void gotTermination(int reason, long count)
gotTermination
in interface SSU2Payload.PayloadCallback
count
- in theory could wrap around to negative, but very unlikelypublic void gotPathChallenge(RemoteHostId from, byte[] data)
gotPathChallenge
in interface SSU2Payload.PayloadCallback
from
- null if unknownpublic void gotPathResponse(RemoteHostId from, byte[] data)
gotPathResponse
in interface SSU2Payload.PayloadCallback
from
- null if unknownvoid changeAddress(RemoteHostId id)
public void fragmentsSent(long pktNum, int length, List<PacketBuilder.Fragment> fragments)
fragmentsSent
in interface SSU2Sender
length
- including ip/udp header, for logging onlypublic void bitSet(long pktNum)
bitSet
in interface SSU2Bitfield.Callback
void confirmedPacketsSent(byte[][] data)
public byte getFlags()
getFlags
in interface SSU2Sender
boolean isDead()