Class 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.
    • Constructor Detail

      • 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 unknown
        remoteHostId - non-null, == claimedAddress if direct, or a hash-based one if indirect
        remotePeer - must have supported sig type
        allowExtendedOptions - are we allowed to send extended options to Bob?
        needIntroduction - should we ask Bob to be an introducer for us? ignored unless allowExtendedOptions is true
        introKey - Bob's introduction key, as published in the netdb
        addr - non-null
    • Method Detail

      • complete

        public boolean complete()
        Returns:
        if previously complete
      • getRemoteAddress

        public UDPAddress 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

        public void addMessage​(OutNetMessage msg)
        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

        public OutNetMessage getNextQueuedMessage()
        Returns:
        null if none
      • getIntroKey

        public SessionKey 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.
      • 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
      • 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

        public Signature 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