Package net.i2p.router.transport.udp
Class OutboundEstablishState
java.lang.Object
net.i2p.router.transport.udp.OutboundEstablishState
class OutboundEstablishState extends Object
Data for a new connection being established, where we initiated the
connection with a remote peer. In other words, we are Alice and
they are Bob.
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classOutboundEstablishState.OutboundState -
Constructor Summary
Constructors Constructor Description OutboundEstablishState(RouterContext ctx, RemoteHostId claimedAddress, RemoteHostId remoteHostId, RouterIdentity remotePeer, boolean allowExtendedOptions, boolean needIntroduction, SessionKey introKey, UDPAddress addr, DHSessionKeyBuilder.Factory dh) -
Method Summary
Modifier and Type Method Description voidaddMessage(OutNetMessage msg)Queue a message to be sent after the session is established.booleancomplete()voidconfirmedPacketsSent()note that we just sent the SessionConfirmed packetvoiddataReceived()we have received a real data packet, so we're done establishingvoidfail()The SessionCreated validation failedSessionKeygetCipherKey()(package private) RemoteHostIdgetClaimedAddress()This will never be a hash-based address.longgetConfirmedSentTime()longgetEstablishBeginTime()SessionKeygetIntroKey()Bob's introduction key, as published in the netdblonggetIntroNonce()longgetIntroSentTime()longgetLifetime()how long have we been trying to establish this session?SessionKeygetMACKey()OutNetMessagegetNextQueuedMessage()longgetNextSendTime()byte[]getReceivedIP()intgetReceivedPort()longgetReceivedRelayTag()longgetReceivedSignedOnTime()UDPAddressgetRemoteAddress()(package private) RemoteHostIdgetRemoteHostId()This should be what the state is currently indexed by in the _outboundStates table.RouterIdentitygetRemoteIdentity()longgetRequestSentTime()(package private) intgetRTT()byte[]getSentIP()The remote side (Bob) - note that in some places he's called Charlie.intgetSentPort()The remote side (Bob) - note that in some places he's called Charlie.SignaturegetSentSignature()longgetSentSignedOnTime()byte[]getSentX()OutboundEstablishState.OutboundStategetState()voidintroduced(byte[] bobIP, int bobPort)This changes the remoteHostId from a hash-based one or possibly incorrect IP/port to what the introducer told us.voidintroductionFailed()voidintroSent()note that we just sent the RelayRequest packetbooleanisExtendedOptionsAllowed()Are we allowed to send extended options to this peer?booleanisFirstMessageOurDSM()Is the first message queued our own DatabaseStoreMessage?booleanneedIntroduction()Should we ask this peer to be an introducer for us? Ignored unless allowExtendedOptions is truevoidprepareSessionConfirmed()Let's sign everything so we can fragment properly.(package private) booleanreceiveHolePunch()Accelerate response to RelayResponse if we haven't sent it yet.voidreceiveSessionCreated(UDPPacketReader.SessionCreatedReader reader)voidrequestSent()note that we just sent the SessionRequest packetvoidsetIntroNonce(long nonce)StringtoString()booleanvalidateSessionCreated()Blocking call (run in the establisher thread) to determine if the session was created properly.
-
Constructor Details
-
OutboundEstablishState
public OutboundEstablishState(RouterContext ctx, RemoteHostId claimedAddress, RemoteHostId remoteHostId, RouterIdentity remotePeer, boolean allowExtendedOptions, boolean needIntroduction, SessionKey introKey, UDPAddress addr, DHSessionKeyBuilder.Factory dh)- Parameters:
claimedAddress- an IP/port based RemoteHostId, or null if unknownremoteHostId- non-null, == claimedAddress if direct, or a hash-based one if indirectremotePeer- must have supported sig typeallowExtendedOptions- are we allowed to send extended options to Bob?needIntroduction- should we ask Bob to be an introducer for us? ignored unless allowExtendedOptions is trueintroKey- Bob's introduction key, as published in the netdbaddr- non-null
-
-
Method Details
-
getState
-
complete
public boolean complete()- Returns:
- if previously complete
-
getRemoteAddress
- Returns:
- non-null
-
setIntroNonce
public void setIntroNonce(long nonce) -
getIntroNonce
public long getIntroNonce()- Returns:
- -1 if unset
-
isExtendedOptionsAllowed
public boolean isExtendedOptionsAllowed()Are we allowed to send extended options to this peer?- Since:
- 0.9.24
-
needIntroduction
public boolean needIntroduction()Should we ask this peer to be an introducer for us? Ignored unless allowExtendedOptions is true- Since:
- 0.9.24
-
getRTT
int getRTT() -
addMessage
Queue a message to be sent after the session is established. -
isFirstMessageOurDSM
public boolean isFirstMessageOurDSM()Is the first message queued our own DatabaseStoreMessage?- Since:
- 0.9.12
-
getNextQueuedMessage
- Returns:
- null if none
-
getRemoteIdentity
-
getIntroKey
Bob's introduction key, as published in the netdb -
getSentX
public byte[] getSentX() -
getSentIP
public byte[] getSentIP()The remote side (Bob) - note that in some places he's called Charlie. Warning - may change after introduction. May be null before introduction. -
getSentPort
public int getSentPort()The remote side (Bob) - note that in some places he's called Charlie. Warning - may change after introduction. May be -1 before introduction. -
receiveSessionCreated
-
validateSessionCreated
public boolean validateSessionCreated()Blocking call (run in the establisher thread) to determine if the session was created properly. If it wasn't, all the SessionCreated remnants are dropped (perhaps they were spoofed, etc) so that we can receive another one Generates session key and mac key.- Returns:
- true if valid
-
fail
public void fail()The SessionCreated validation failed -
getCipherKey
-
getMACKey
-
getReceivedRelayTag
public long getReceivedRelayTag() -
getSentSignedOnTime
public long getSentSignedOnTime() -
getReceivedSignedOnTime
public long getReceivedSignedOnTime() -
getReceivedIP
public byte[] getReceivedIP() -
getReceivedPort
public int getReceivedPort() -
prepareSessionConfirmed
public void prepareSessionConfirmed()Let's sign everything so we can fragment properly. Note that while a SessionConfirmed could in theory be fragmented, in practice a RouterIdentity is 387 bytes and a single fragment is 512 bytes max, so it will never be fragmented. -
getSentSignature
-
confirmedPacketsSent
public void confirmedPacketsSent()note that we just sent the SessionConfirmed packet -
getConfirmedSentTime
public long getConfirmedSentTime()- Returns:
- when we sent the first SessionConfirmed packet, or 0
- Since:
- 0.9.2
-
requestSent
public void requestSent()note that we just sent the SessionRequest packet -
getRequestSentTime
public long getRequestSentTime()- Returns:
- when we sent the first SessionRequest packet, or 0
- Since:
- 0.9.2
-
introSent
public void introSent()note that we just sent the RelayRequest packet -
getIntroSentTime
public long getIntroSentTime()- Returns:
- when we sent the first RelayRequest packet, or 0
- Since:
- 0.9.2
-
introductionFailed
public void introductionFailed() -
introduced
public void introduced(byte[] bobIP, int bobPort)This changes the remoteHostId from a hash-based one or possibly incorrect IP/port to what the introducer told us. All params are for the remote end (NOT the introducer) and must have been validated already. -
receiveHolePunch
boolean receiveHolePunch()Accelerate response to RelayResponse if we haven't sent it yet.- Returns:
- true if we should send the SessionRequest now
- Since:
- 0.9.15
-
getLifetime
public long getLifetime()how long have we been trying to establish this session? -
getEstablishBeginTime
public long getEstablishBeginTime() -
getNextSendTime
public long getNextSendTime()- Returns:
- 0 at initialization (to force sending session request), rcv time after receiving a packet, send time + delay after sending a packet (including session request)
-
getRemoteHostId
RemoteHostId getRemoteHostId()This should be what the state is currently indexed by in the _outboundStates table. Beware - During introduction, this is a router hash. After introduced() is called, this is set to the IP/port the introducer told us.- Returns:
- non-null
-
getClaimedAddress
RemoteHostId getClaimedAddress()This will never be a hash-based address. This is the 'claimed' (unverified) address from the netdb, or null. It is not changed after introduction. Use getRemoteHostId() for the verified address.- Returns:
- may be null
-
dataReceived
public void dataReceived()we have received a real data packet, so we're done establishing -
toString
-