Class 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 Detail

      • OB_MESSAGE_TIMEOUT

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

        public static final long MAX_TAG_VALUE
        the relay tag is a 4-byte field in the protocol
        See Also:
        Constant Field Values
    • Method Detail

      • startup

        public void startup()
      • shutdown

        public void shutdown()
      • 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
      • receiveRelayResponse

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

        void receiveHolePunch​(InetAddress from,
                              int fromPort)
        Called from UDPReceiver. Accelerate response to RelayResponse if we haven't sent it yet.
        Since:
        0.9.15
      • 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
      • isInboundTokenValid

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