Class EstablishmentManager

java.lang.Object
net.i2p.router.transport.udp.EstablishmentManager

class EstablishmentManager extends Object
Coordinate the establishment of new sessions - both inbound and outbound. This has its own thread to add packets to the packet queue when necessary, as well as to drop any failed establishment attempts.
  • Field Details

    • MAX_IB_ESTABLISH_TIME

      public static final int MAX_IB_ESTABLISH_TIME
      Kill any inbound that takes more than this One round trip (Created-Confirmed) Note: could be two round trips for SSU2 with retry
      See Also:
    • OB_MESSAGE_TIMEOUT

      public static final int OB_MESSAGE_TIMEOUT
      max before receiving a response to a single message during outbound establishment
      See Also:
    • IB_TOKEN_EXPIRATION

      public static final long IB_TOKEN_EXPIRATION
      See Also:
    • MAX_TAG_VALUE

      public static final long MAX_TAG_VALUE
      the relay tag is a 4-byte field in the protocol
      See Also:
  • Constructor Details

  • Method Details

    • startup

      public void startup()
    • shutdown

      public void shutdown()
    • getInboundState

      InboundEstablishState getInboundState(RemoteHostId from)
      Grab the active establishing state
      Returns:
      null if none
    • getOutboundState

      OutboundEstablishState getOutboundState(RemoteHostId from)
      Grab the active establishing state
      Returns:
      null if none
    • establish

      public void establish(OutNetMessage msg)
      Send the message to its specified recipient by establishing a connection with them and sending it off. This call does not block, and on failure, the message is failed. Note - if we go back to multiple PacketHandler threads, this may need more locking.
    • shouldAllowInboundEstablishment

      public boolean shouldAllowInboundEstablishment()
      Should we allow another inbound establishment? Used to throttle outbound hole punches.
      Since:
      0.9.2
    • receiveSessionRequest

      void receiveSessionRequest(RemoteHostId from, InboundEstablishState state, UDPPacketReader reader)
      Got a SessionRequest (initiates an inbound establishment) SSU 1 only.
      Parameters:
      state - as looked up in PacketHandler, but probably null unless retransmitted
    • receiveSessionOrTokenRequest

      void receiveSessionOrTokenRequest(RemoteHostId from, InboundEstablishState2 state, UDPPacket packet)
      Got a SessionRequest OR a TokenRequest (initiates an inbound establishment) SSU 2 only.
      Parameters:
      state - as looked up in PacketHandler, but null unless retransmitted or retry sent
      packet - header decrypted only
      Since:
      0.9.54
    • receiveSessionConfirmed

      void receiveSessionConfirmed(RemoteHostId from, InboundEstablishState state, UDPPacketReader reader)
      got a SessionConfirmed (should only happen as part of an inbound establishment) SSU 1 only.
      Parameters:
      state - as looked up in PacketHandler, if null is probably retransmitted
    • receiveSessionConfirmed

      void receiveSessionConfirmed(InboundEstablishState2 state, UDPPacket packet)
      got a SessionConfirmed (should only happen as part of an inbound establishment) SSU 2 only.
      Parameters:
      state - non-null
      packet - header decrypted only
      Since:
      0.9.54
    • receiveSessionCreated

      void receiveSessionCreated(RemoteHostId from, OutboundEstablishState state, UDPPacketReader reader)
      Got a SessionCreated (in response to our outbound SessionRequest) SSU 1 only.
      Parameters:
      state - as looked up in PacketHandler, if null is probably retransmitted
    • receiveSessionCreated

      void receiveSessionCreated(OutboundEstablishState2 state, UDPPacket packet)
      Got a SessionCreated (in response to our outbound SessionRequest) SSU 2 only.
      Parameters:
      state - non-null
      packet - header decrypted only
      Since:
      0.9.54
    • receiveRetry

      void receiveRetry(OutboundEstablishState2 state, UDPPacket packet)
      Got a Retry (in response to our outbound SessionRequest or TokenRequest) SSU 2 only.
      Since:
      0.9.54
    • receiveSessionDestroy

      void receiveSessionDestroy(RemoteHostId from, PeerState state)
      Got a SessionDestroy on an established conn SSU 1 or 2
      Since:
      0.8.1
    • receiveSessionDestroy

      void receiveSessionDestroy(RemoteHostId from, OutboundEstablishState state)
      Got a SessionDestroy during outbound establish SSU 1 or 2
      Since:
      0.8.1
    • receiveSessionDestroy

      void receiveSessionDestroy(RemoteHostId from)
      Got a SessionDestroy - maybe during an inbound establish? TODO - PacketHandler won't look up inbound establishes As this packet was essentially unauthenticated (i.e. intro key, not session key) we just log it as it could be spoofed. SSU 1 or 2
      Since:
      0.8.1
    • receiveData

      PeerState receiveData(OutboundEstablishState state)
      A data packet arrived on an outbound connection being established, which means its complete (yay!). This is a blocking call, more than I'd like...
      Returns:
      the new PeerState
    • getOurInfo

      public DatabaseStoreMessage getOurInfo()
      A database store message with our router info
      Returns:
      non-null
      Since:
      0.9.24 split from sendOurInfo(), public since 0.9.55 for UDPTransport
    • receiveRelayResponse

      void receiveRelayResponse(RemoteHostId bob, UDPPacketReader reader)
      We are Alice, we sent a RelayRequest to Bob and got a response back. SSU 1 only.
    • receiveRelayResponse

      void receiveRelayResponse(PeerState2 bob, long nonce, int code, byte[] data)
      We are Alice, we sent a RelayRequest to Bob and got a RelayResponse back. Time and version already checked by caller. SSU 2 only.
      Parameters:
      data - including nonce, including token if code == 0
      Since:
      0.9.55
    • receiveHolePunch

      void receiveHolePunch(InetAddress from, int fromPort)
      Called from UDPReceiver. Accelerate response to RelayResponse if we haven't sent it yet. SSU 1 only.
      Since:
      0.9.15
    • receiveHolePunch

      void receiveHolePunch(RemoteHostId id, UDPPacket packet)
      Called from PacketHandler. Accelerate response to RelayResponse if we haven't sent it yet. SSU 2 only.
      Parameters:
      id - non-null
      packet - header already decrypted
      Since:
      0.9.55
    • isValid

      boolean isValid(byte[] ip, int port)
      Are IP and port valid? This is only for checking the relay response. Allow IPv6 as of 0.9.50. Refuse anybody in the same /16
      Since:
      0.9.3, pkg private since 0.9.45 for PacketBuider
    • addOutboundToken

      public void addOutboundToken(RemoteHostId peer, long token, long expires)
      Remember a token that can be used later to connect to the peer
      Parameters:
      token - nonzero
      Since:
      0.9.54
    • getOutboundToken

      public long getOutboundToken(RemoteHostId peer)
      Get a token to connect to the peer
      Returns:
      0 if none available
      Since:
      0.9.54
    • ipChanged

      public void ipChanged(boolean isIPv6)
      Remove our tokens for this length
      Since:
      0.9.54
    • portChanged

      public void portChanged()
      Remove all tokens
      Since:
      0.9.54
    • getInboundToken

      public EstablishmentManager.Token getInboundToken(RemoteHostId peer)
      Get a token that can be used later for the peer to connect to us
      Since:
      0.9.54
    • getInboundToken

      public EstablishmentManager.Token getInboundToken(RemoteHostId peer, long expiration)
      Get a token that can be used later for the peer to connect to us
      Parameters:
      expiration - time from now
      Since:
      0.9.55
    • isInboundTokenValid

      public boolean isInboundTokenValid(RemoteHostId peer, long token)
      Is the token from this peer valid?
      Returns:
      valid
      Since:
      0.9.54