Package net.i2p.router.transport.udp
Class PeerState2
- java.lang.Object
-
- net.i2p.router.transport.udp.PeerState
-
- net.i2p.router.transport.udp.PeerState2
-
- All Implemented Interfaces:
SSU2Bitfield.Callback,SSU2Payload.PayloadCallback,SSU2Sender
public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback, SSU2Bitfield.Callback, SSU2Sender
Contain all of the state about a UDP connection to a peer. This is instantiated only after a connection is fully established. Public only for UI peers page. Not a public API, not for external use. SSU2 only.- Since:
- 0.9.54
-
-
Field Summary
Fields Modifier and Type Field Description static intDEFAULT_MTUstatic intDEFAULT_SSU_IPV4_MTUstatic intDEFAULT_SSU_IPV6_MTUstatic intMAX_MTUstatic intMAX_SSU_IPV4_MTUstatic intMAX_SSU_IPV6_MTUstatic intMIN_MTUstatic intMIN_SSU_IPV4_MTUstatic intMIN_SSU_IPV6_MTU-
Fields inherited from class net.i2p.router.transport.udp.PeerState
_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 Summary
Constructors Constructor 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)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) List<OutboundMessageState>allocateSend(long now)Overridden to retransmit SessionConfirmed alsovoidbitSet(long pktNum)Callback from SSU2Bitfield.forEachAndNot().(package private) voidchangeAddress(RemoteHostId id)Caller should sync; UDPTransport must remove and add to peersByRemoteHost map(package private) voidclearWantedACKSendSince()All acks have been sent.(package private) voidconfirmedPacketsSent(byte[][] data)Note that we just sent the SessionConfirmed packets and save them for retransmission.(package private) voidfetchPartialACKs(List<ACKBitfield> rv)SSU 1 only.(package private) intfinishMessages(long now)Overridden to expire unacked packets in _sentMessages.(package private) intfragmentOverhead()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) intfragmentSize()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.voidfragmentsSent(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.SSU2BitfieldgetAckedMessages()(package private) List<Long>getCurrentFullACKs()Grab a list of message ids (Long) that we want to send to the remote peer, regardless of the packet size, but don't remove it from our "want to send" list.(package private) List<Long>getCurrentResendACKs()Grab a list of message ids (Long) that we want to send to the remote peer, regardless of the packet size, but don't remove it from our "want to send" list.(package private) intgetDestroyReason()bytegetFlags()Flag byte to be sent in headerlonggetNextPacketNumber()Next outbound packet number, starts at 1 for Alice (0 is Session Confirmed) and 0 for Bobprotected longgetNextPacketNumberNoThrow()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) intgetOurPort()As received in the Address Block in the handshake, or subsequently in the data phase.(package private) CipherStategetRcvCipher()(package private) longgetRcvConnID()(package private) byte[]getRcvHeaderEncryptKey1()(package private) byte[]getRcvHeaderEncryptKey2()SSU2BitfieldgetReceivedMessages()CipherStategetSendCipher()Caller must sync on returned object when encryptinglonggetSendConnID()byte[]getSendHeaderEncryptKey1()byte[]getSendHeaderEncryptKey2()intgetVersion()voidgotACK(long ackThru, int acks, byte[] ranges)voidgotAddress(byte[] ip, int port)voidgotDateTime(long time)voidgotFragment(byte[] data, int off, int len, long messageId, int frag, boolean isLast)Data must be copied out in this method.voidgotI2NP(I2NPMessage msg)voidgotOptions(byte[] options, boolean isHandshake)voidgotPathChallenge(RemoteHostId from, byte[] data)voidgotPathResponse(RemoteHostId from, byte[] data)voidgotPeerTest(int msg, int status, Hash h, byte[] data)voidgotRelayIntro(Hash aliceHash, byte[] data)voidgotRelayRequest(byte[] data)voidgotRelayResponse(int status, byte[] data)voidgotRelayTag(long tag)voidgotRelayTagRequest()voidgotRI(RouterInfo ri, boolean isHandshake, boolean flood)voidgotRIFragment(byte[] data, boolean isHandshake, boolean flood, boolean isGzipped, int frag, int totalFrags)voidgotTermination(int reason, long count)voidgotToken(long token, long expires)(package private) booleanisDead()protected voidmessagePartiallyReceived(long now)Overridden to use our version of ACKTimer(package private) voidreceivePacket(RemoteHostId from, UDPPacket packet)From different than expected source IP/port(package private) voidreceivePacket(UDPPacket packet)(package private) voidremoveACKMessage(Long messageId)The ack was sent.voidsetDestroyReason(int reason)(package private) voidsetOurAddress(byte[] ip, int port)For initialization by IES2/OES2 only.-
Methods inherited from class net.i2p.router.transport.udp.PeerState
acked, acked, acked, add, adjustClockSkew, changePort, dataReceived, dropOutbound, ECNReceived, expireInboundMessages, getClockSkew, getConcurrentSends, getConcurrentSendWindow, getConsecutiveFailedSends, getConsecutiveSendRejections, getCurrentCipherKey, getCurrentMACKey, getInactivityTime, getInboundMessages, getIntroducerTime, getKeyEstablishedTime, getLastACKSend, getLastReceiveTime, getLastSendFullyTime, getLastSendOrPingTime, getLastSendTime, getMayDisconnect, getMessagesReceived, getMessagesSent, getMTU, getNextCipherKey, getNextDelay, getNextMACKey, 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, unsentACKThresholdReached
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface net.i2p.router.transport.udp.SSU2Sender
getMTU, getRemoteHostId, getRemoteIPAddress, getRemotePort, isIPv6
-
-
-
-
Field Detail
-
MIN_SSU_IPV4_MTU
public static final int MIN_SSU_IPV4_MTU
- See Also:
- Constant Field Values
-
MAX_SSU_IPV4_MTU
public static final int MAX_SSU_IPV4_MTU
- See Also:
- Constant Field Values
-
DEFAULT_SSU_IPV4_MTU
public static final int DEFAULT_SSU_IPV4_MTU
- See Also:
- Constant Field Values
-
MIN_SSU_IPV6_MTU
public static final int MIN_SSU_IPV6_MTU
- See Also:
- Constant Field Values
-
MAX_SSU_IPV6_MTU
public static final int MAX_SSU_IPV6_MTU
- See Also:
- Constant Field Values
-
DEFAULT_SSU_IPV6_MTU
public static final int DEFAULT_SSU_IPV6_MTU
- See Also:
- Constant Field Values
-
MIN_MTU
public static final int MIN_MTU
- See Also:
- Constant Field Values
-
MAX_MTU
public static final int MAX_MTU
- See Also:
- Constant Field Values
-
DEFAULT_MTU
public static final int DEFAULT_MTU
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
PeerState2
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)
- Parameters:
rtt- from the EstablishState, or 0 if not available
-
-
Method Detail
-
getVersion
public int getVersion()
- Overrides:
getVersionin classPeerState
-
fragmentSize
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. Does NOT leave any room for acks with a full-size fragment.- Overrides:
fragmentSizein classPeerState- Returns:
- MTU - 68 (IPv4), MTU - 88 (IPv6)
-
fragmentOverhead
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. Does NOT leave any room for acks with a full-size fragment.- Overrides:
fragmentOverheadin classPeerState- Returns:
- 68 (IPv4), 88 (IPv6)
-
clearWantedACKSendSince
void clearWantedACKSendSince()
All acks have been sent.- Overrides:
clearWantedACKSendSincein classPeerState
-
messagePartiallyReceived
protected void messagePartiallyReceived(long now)
Overridden to use our version of ACKTimer- Overrides:
messagePartiallyReceivedin classPeerState
-
finishMessages
int finishMessages(long now)
Overridden to expire unacked packets in _sentMessages. These will remain unacked if lost; fragments will be retransmitted in a new packet.- Overrides:
finishMessagesin classPeerState- Returns:
- number of active outbound messages remaining
-
allocateSend
List<OutboundMessageState> allocateSend(long now)
Overridden to retransmit SessionConfirmed also- Overrides:
allocateSendin classPeerState- Returns:
- allocated messages to send (never empty), or null if no messages or no resources
-
getCurrentFullACKs
List<Long> getCurrentFullACKs()
Description copied from class:PeerStateGrab a list of message ids (Long) that we want to send to the remote peer, regardless of the packet size, but don't remove it from our "want to send" list. If the message id is transmitted to the peer, removeACKMessage(Long) should be called. The returned list contains acks not yet sent only. The caller should NOT transmit all of them all the time, even if there is room, or the packets will have way too much overhead. SSU 1 only.- Overrides:
getCurrentFullACKsin classPeerState- Returns:
- a new list, do as you like with it
-
getCurrentResendACKs
List<Long> getCurrentResendACKs()
Description copied from class:PeerStateGrab a list of message ids (Long) that we want to send to the remote peer, regardless of the packet size, but don't remove it from our "want to send" list. The returned list contains a random assortment of acks already sent. The caller should NOT transmit all of them all the time, even if there is room, or the packets will have way too much overhead. SSU 1 only.- Overrides:
getCurrentResendACKsin classPeerState- Returns:
- a new list, do as you like with it
-
removeACKMessage
void removeACKMessage(Long messageId)
Description copied from class:PeerStateThe ack was sent. Side effect - sets _lastACKSend SSU 1 only.- Overrides:
removeACKMessagein classPeerState
-
fetchPartialACKs
void fetchPartialACKs(List<ACKBitfield> rv)
Description copied from class:PeerStateSSU 1 only.- Overrides:
fetchPartialACKsin classPeerState- Parameters:
rv- out parameter, populated with true partial ACKBitfields. no full bitfields are included.
-
getNextPacketNumber
public long getNextPacketNumber() throws IOExceptionNext outbound packet number, starts at 1 for Alice (0 is Session Confirmed) and 0 for Bob- Specified by:
getNextPacketNumberin interfaceSSU2Sender- Throws:
IOException- Since:
- public since 0.9.57 for SSU2Sender interface only
-
getNextPacketNumberNoThrow
protected long getNextPacketNumberNoThrow()
For PeerStateDestroyed only, after we are dead- Since:
- 0.9.57
-
getSendConnID
public long getSendConnID()
- Specified by:
getSendConnIDin interfaceSSU2Sender- Since:
- public since 0.9.57 for SSU2Sender interface only
-
getSendCipher
public CipherState getSendCipher()
Caller must sync on returned object when encrypting- Specified by:
getSendCipherin interfaceSSU2Sender- Since:
- public since 0.9.57 for SSU2Sender interface only
-
getSendHeaderEncryptKey1
public byte[] getSendHeaderEncryptKey1()
- Specified by:
getSendHeaderEncryptKey1in interfaceSSU2Sender- Since:
- public since 0.9.57 for SSU2Sender interface only
-
getSendHeaderEncryptKey2
public byte[] getSendHeaderEncryptKey2()
- Specified by:
getSendHeaderEncryptKey2in interfaceSSU2Sender- Since:
- public since 0.9.57 for SSU2Sender interface only
-
setDestroyReason
public void setDestroyReason(int reason)
- Specified by:
setDestroyReasonin interfaceSSU2Sender- Since:
- 0.9.57
-
getRcvConnID
long getRcvConnID()
-
getRcvHeaderEncryptKey1
byte[] getRcvHeaderEncryptKey1()
-
getRcvHeaderEncryptKey2
byte[] getRcvHeaderEncryptKey2()
-
getDestroyReason
int getDestroyReason()
- Returns:
- 0 (REASON_UNSPEC) if unset
- Since:
- 0.9.57 for PeerStateDestroyed
-
getRcvCipher
CipherState getRcvCipher()
- Since:
- 0.9.57 for PeerStateDestroyed
-
setOurAddress
void setOurAddress(byte[] ip, int port)For initialization by IES2/OES2 only.
-
getOurIP
byte[] getOurIP()
As received in the Address Block in the handshake, or subsequently in the data phase. Unvalidated. Also, if a transient IPv6 address, may be deprecated and not match our current non-deprecated IPv6 address.
-
getOurPort
int getOurPort()
As received in the Address Block in the handshake, or subsequently in the data phase. Unvalidated.
-
getReceivedMessages
public SSU2Bitfield getReceivedMessages()
- Specified by:
getReceivedMessagesin interfaceSSU2Sender- Since:
- public since 0.9.57 for SSU2Sender interface only
-
getAckedMessages
public SSU2Bitfield getAckedMessages()
- Specified by:
getAckedMessagesin interfaceSSU2Sender- Since:
- public since 0.9.57 for SSU2Sender interface only
-
receivePacket
void receivePacket(UDPPacket packet)
- Parameters:
packet- fully encrypted, header and body decryption will be done here
-
receivePacket
void receivePacket(RemoteHostId from, UDPPacket packet)
From different than expected source IP/port- Parameters:
from- source addresspacket- fully encrypted, header and body decryption will be done here- Since:
- 0.9.55
-
gotDateTime
public void gotDateTime(long time)
- Specified by:
gotDateTimein interfaceSSU2Payload.PayloadCallback
-
gotOptions
public void gotOptions(byte[] options, boolean isHandshake)- Specified by:
gotOptionsin interfaceSSU2Payload.PayloadCallbackisHandshake- true only for message 3 part 2
-
gotRI
public void gotRI(RouterInfo ri, boolean isHandshake, boolean flood) throws DataFormatException
- Specified by:
gotRIin interfaceSSU2Payload.PayloadCallback- Parameters:
ri- will already be validatedisHandshake- true only for message 3 part 2- Throws:
DataFormatException
-
gotRIFragment
public void gotRIFragment(byte[] data, boolean isHandshake, boolean flood, boolean isGzipped, int frag, int totalFrags)- Specified by:
gotRIFragmentin interfaceSSU2Payload.PayloadCallback- Parameters:
data- is first gzipped and then fragmentedisHandshake- true only for message 3 part 2
-
gotAddress
public void gotAddress(byte[] ip, int port)- Specified by:
gotAddressin interfaceSSU2Payload.PayloadCallback
-
gotRelayTagRequest
public void gotRelayTagRequest()
- Specified by:
gotRelayTagRequestin interfaceSSU2Payload.PayloadCallback
-
gotRelayTag
public void gotRelayTag(long tag)
- Specified by:
gotRelayTagin interfaceSSU2Payload.PayloadCallback
-
gotRelayRequest
public void gotRelayRequest(byte[] data)
- Specified by:
gotRelayRequestin interfaceSSU2Payload.PayloadCallback- Parameters:
data- excludes flag, includes signature
-
gotRelayResponse
public void gotRelayResponse(int status, byte[] data)- Specified by:
gotRelayResponsein interfaceSSU2Payload.PayloadCallback- Parameters:
status- 0 = accept, 1-255 = rejectdata- excludes flag, includes signature
-
gotRelayIntro
public void gotRelayIntro(Hash aliceHash, byte[] data)
- Specified by:
gotRelayIntroin interfaceSSU2Payload.PayloadCallbackdata- excludes flag, includes signature
-
gotPeerTest
public void gotPeerTest(int msg, int status, Hash h, byte[] data)- Specified by:
gotPeerTestin interfaceSSU2Payload.PayloadCallback- Parameters:
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 signature
-
gotToken
public void gotToken(long token, long expires)- Specified by:
gotTokenin interfaceSSU2Payload.PayloadCallback
-
gotI2NP
public void gotI2NP(I2NPMessage msg)
- Specified by:
gotI2NPin interfaceSSU2Payload.PayloadCallback
-
gotFragment
public void gotFragment(byte[] data, int off, int len, long messageId, int frag, boolean isLast) throws DataFormatExceptionDescription copied from interface:SSU2Payload.PayloadCallbackData must be copied out in this method. Data starts at the 9 byte header for fragment 0.- Specified by:
gotFragmentin interfaceSSU2Payload.PayloadCallbackoff- offset in datalen- length of data to copy- Throws:
DataFormatException
-
gotACK
public void gotACK(long ackThru, int acks, byte[] ranges)- Specified by:
gotACKin interfaceSSU2Payload.PayloadCallbackranges- null if none
-
gotTermination
public void gotTermination(int reason, long count)- Specified by:
gotTerminationin interfaceSSU2Payload.PayloadCallbackcount- in theory could wrap around to negative, but very unlikely
-
gotPathChallenge
public void gotPathChallenge(RemoteHostId from, byte[] data)
- Specified by:
gotPathChallengein interfaceSSU2Payload.PayloadCallback- Parameters:
from- null if unknown
-
gotPathResponse
public void gotPathResponse(RemoteHostId from, byte[] data)
- Specified by:
gotPathResponsein interfaceSSU2Payload.PayloadCallback- Parameters:
from- null if unknown
-
changeAddress
void changeAddress(RemoteHostId id)
Caller should sync; UDPTransport must remove and add to peersByRemoteHost map- Since:
- 0.9.56
-
fragmentsSent
public 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.- Specified by:
fragmentsSentin interfaceSSU2Sender- Parameters:
length- including ip/udp header, for logging only- Since:
- public since 0.9.57 for SSU2Sender interface only
-
bitSet
public void bitSet(long pktNum)
Callback from SSU2Bitfield.forEachAndNot(). A new ack was received.- Specified by:
bitSetin interfaceSSU2Bitfield.Callback
-
confirmedPacketsSent
void confirmedPacketsSent(byte[][] data)
Note that we just sent the SessionConfirmed packets and save them for retransmission. This is only called the first time. For retransmit see allocateSend() above.
-
getFlags
public byte getFlags()
Flag byte to be sent in header- Specified by:
getFlagsin interfaceSSU2Sender- Since:
- 0.9.56, public since 0.9.57 for SSU2Sender interface
-
isDead
boolean isDead()
- Since:
- 0.9.57
-
-