Class I2PSessionImpl2

    • Field Detail

      • _sendingStates

        protected final Map<Long,​MessageState> _sendingStates
        set of MessageState objects, representing all of the messages in the process of being sent
      • _sendMessageNonce

        protected final AtomicLong _sendMessageNonce
      • _noEffort

        protected boolean _noEffort
        Don't expect any MSMs from the router for outbound traffic @since 0.8.1
    • Method Detail

      • startVerifyUsage

        protected void startVerifyUsage()
        Fire up a periodic task to check for unclaimed messages
        Overrides:
        startVerifyUsage in class I2PSessionImpl
        Since:
        0.9.14
      • getTimeout

        protected long getTimeout()
      • destroySession

        public void destroySession​(boolean sendDisconnect)
        Description copied from class: I2PSessionImpl
        Tear down the session, and do NOT reconnect. Will interrupt an open in progress. Calls sessionlistener.disconnected()
        Overrides:
        destroySession in class I2PSessionImpl
      • shouldCompress

        protected boolean shouldCompress​(int size)
      • addSessionListener

        public void addSessionListener​(I2PSessionListener lsnr,
                                       int proto,
                                       int port)
        Description copied from interface: I2PSession
        Listen on specified protocol and port. An existing listener with the same proto and port is replaced. Only the listener with the best match is called back for each message.
        proto - 1-254 or PROTO_ANY (0) for all; recommended: I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        port - 1-65535 or PORT_ANY (0) for all
        Throws:
        UnsupportedOperationException - always, use MuxedImpl
      • addMuxedSessionListener

        public void addMuxedSessionListener​(I2PSessionMuxedListener l,
                                            int proto,
                                            int port)
        Description copied from interface: I2PSession
        Listen on specified protocol and port, and receive notification of proto, fromPort, and toPort for every message.
        proto - 1-254 or PROTO_ANY (0) for all; 255 disallowed
        port - 1-65535 or PORT_ANY (0) for all
        Throws:
        UnsupportedOperationException - always, use MuxedImpl
      • removeListener

        public void removeListener​(int proto,
                                   int port)
        Description copied from interface: I2PSession
        removes the specified listener (only)
        Throws:
        UnsupportedOperationException - always, use MuxedImpl
      • sendMessage

        public boolean sendMessage​(Destination dest,
                                   byte[] payload,
                                   int offset,
                                   int size,
                                   SessionKey keyUsed,
                                   Set<SessionTag> tagsSent,
                                   int proto,
                                   int fromport,
                                   int toport)
                            throws I2PSessionException
        Description copied from interface: I2PSession
        See I2PSessionMuxedImpl for proto/port details. End-to-End Crypto is disabled, tags and keys are ignored.
        keyUsed - UNUSED, IGNORED.
        tagsSent - UNUSED, IGNORED.
        proto - 1-254 or 0 for unset; recommended: I2PSession.PROTO_UNSPECIFIED I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        fromport - 1-65535 or 0 for unset
        toport - 1-65535 or 0 for unset
        Returns:
        success
        Throws:
        UnsupportedOperationException - always, use MuxedImpl
        I2PSessionException
      • sendMessage

        public boolean sendMessage​(Destination dest,
                                   byte[] payload,
                                   int offset,
                                   int size,
                                   SessionKey keyUsed,
                                   Set<SessionTag> tagsSent,
                                   long expire,
                                   int proto,
                                   int fromport,
                                   int toport)
                            throws I2PSessionException
        Description copied from interface: I2PSession
        See I2PSessionMuxedImpl for proto/port details. End-to-End Crypto is disabled, tags and keys are ignored.
        keyUsed - UNUSED, IGNORED.
        tagsSent - UNUSED, IGNORED.
        expire - absolute expiration timestamp, NOT interval from now
        proto - 1-254 or 0 for unset; recommended: I2PSession.PROTO_UNSPECIFIED I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        fromport - 1-65535 or 0 for unset
        toport - 1-65535 or 0 for unset
        Returns:
        success
        Throws:
        UnsupportedOperationException - always, use MuxedImpl
        I2PSessionException
      • sendMessage

        public boolean sendMessage​(Destination dest,
                                   byte[] payload,
                                   int offset,
                                   int size,
                                   SessionKey keyUsed,
                                   Set<SessionTag> tagsSent,
                                   long expire,
                                   int proto,
                                   int fromport,
                                   int toport,
                                   int flags)
                            throws I2PSessionException
        Description copied from interface: I2PSession
        See I2PSessionMuxedImpl for proto/port details. End-to-End Crypto is disabled, tags and keys are ignored.
        keyUsed - UNUSED, IGNORED.
        tagsSent - UNUSED, IGNORED.
        expire - absolute expiration timestamp, NOT interval from now
        proto - 1-254 or 0 for unset; recommended: I2PSession.PROTO_UNSPECIFIED I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        fromport - 1-65535 or 0 for unset
        toport - 1-65535 or 0 for unset
        Returns:
        success
        Throws:
        UnsupportedOperationException - always, use MuxedImpl
        I2PSessionException
      • sendMessage

        public boolean sendMessage​(Destination dest,
                                   byte[] payload,
                                   int offset,
                                   int size,
                                   int proto,
                                   int fromport,
                                   int toport,
                                   SendMessageOptions options)
                            throws I2PSessionException
        Description copied from interface: I2PSession
        See I2PSessionMuxedImpl for proto/port details. See SendMessageOptions for option details.
        proto - 1-254 or 0 for unset; recommended: I2PSession.PROTO_UNSPECIFIED I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        fromport - 1-65535 or 0 for unset
        toport - 1-65535 or 0 for unset
        options - to be passed to the router
        Returns:
        success
        Throws:
        UnsupportedOperationException - always, use MuxedImpl
        I2PSessionException
      • sendMessage

        public long sendMessage​(Destination dest,
                                byte[] payload,
                                int offset,
                                int size,
                                int proto,
                                int fromport,
                                int toport,
                                SendMessageOptions options,
                                SendMessageStatusListener listener)
                         throws I2PSessionException
        Description copied from interface: I2PSession
        Send a message and request an asynchronous notification of delivery status. Notifications will be delivered at least up to the expiration specified in the options, or 60 seconds if not specified. See I2PSessionMuxedImpl for proto/port details. See SendMessageOptions for option details.
        proto - 1-254 or 0 for unset; recommended: I2PSession.PROTO_UNSPECIFIED I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        fromport - 1-65535 or 0 for unset
        toport - 1-65535 or 0 for unset
        options - to be passed to the router
        Returns:
        the message ID to be used for later notification to the listener
        Throws:
        UnsupportedOperationException - always, use MuxedImpl
        I2PSessionException - on all errors
      • sendMessage

        public boolean sendMessage​(Destination dest,
                                   byte[] payload)
                            throws I2PSessionException
        unused, see MuxedImpl override
        Parameters:
        dest - location to send the message
        payload - body of the message to be sent (unencrypted)
        Returns:
        whether it was accepted by the router for delivery or not
        Throws:
        I2PSessionException
      • sendMessage

        public boolean sendMessage​(Destination dest,
                                   byte[] payload,
                                   int offset,
                                   int size)
                            throws I2PSessionException
        Description copied from interface: I2PSession
        Send a new message to the given destination, containing the specified payload, returning true if the router feels confident that the message was delivered. WARNING: It is recommended that you use a method that specifies the protocol and ports.
        Parameters:
        dest - location to send the message
        payload - body of the message to be sent (unencrypted)
        Returns:
        success
        Throws:
        I2PSessionException
      • sendMessage

        public boolean sendMessage​(Destination dest,
                                   byte[] payload,
                                   SessionKey keyUsed,
                                   Set<SessionTag> tagsSent)
                            throws I2PSessionException
        Description copied from interface: I2PSession
        End-to-End Crypto is disabled, tags and keys are ignored! Like sendMessage above, except the key used and the tags sent are exposed to the application.

        If some application layer message delivery confirmation is used, rather than i2p's (slow) built in confirmation via guaranteed delivery mode, the application can update the SessionKeyManager, ala:

           SessionKeyManager.getInstance().tagsDelivered(dest.getPublicKey(), keyUsed, tagsSent);
         
        If an application is using guaranteed delivery mode, this is not useful, but for applications using best effort delivery mode, if they can know with certainty that a message was delivered and can update the SessionKeyManager appropriately, a significant performance boost will occur (subsequent message encryption and decryption will be done via AES and a SessionTag, rather than ElGamal+AES, which is 1000x slower).
        Parameters:
        keyUsed - unused - no end-to-end crypto
        tagsSent - unused - no end-to-end crypto
        dest - location to send the message
        payload - body of the message to be sent (unencrypted)
        Returns:
        success
        Throws:
        I2PSessionException
      • sendMessage

        public boolean sendMessage​(Destination dest,
                                   byte[] payload,
                                   int offset,
                                   int size,
                                   SessionKey keyUsed,
                                   Set<SessionTag> tagsSent)
                            throws I2PSessionException
        Description copied from interface: I2PSession
        End-to-End Crypto is disabled, tags and keys are ignored.
        Parameters:
        keyUsed - unused - no end-to-end crypto
        tagsSent - unused - no end-to-end crypto
        Returns:
        success
        Throws:
        I2PSessionException
      • sendMessage

        public boolean sendMessage​(Destination dest,
                                   byte[] payload,
                                   int offset,
                                   int size,
                                   SessionKey keyUsed,
                                   Set<SessionTag> tagsSent,
                                   long expires)
                            throws I2PSessionException
        Unused? see MuxedImpl override
        Parameters:
        keyUsed - unused - no end-to-end crypto
        tagsSent - unused - no end-to-end crypto
        expires - absolute expiration timestamp, NOT interval from now
        Returns:
        success
        Throws:
        I2PSessionException
      • sendBestEffort

        protected boolean sendBestEffort​(Destination dest,
                                         byte[] payload,
                                         long expires,
                                         int flags)
                                  throws I2PSessionException
        TODO - Don't need to save MessageState since actuallyWait is false... But for now just use sendNoEffort() instead.
        Parameters:
        flags - to be passed to the router
        Throws:
        I2PSessionException
        Since:
        0.8.4
      • sendNoEffort

        protected boolean sendNoEffort​(Destination dest,
                                       byte[] payload,
                                       long expires,
                                       int flags)
                                throws I2PSessionException
        Same as sendBestEffort(), except we do not expect any MessageStatusMessage responses - not for accepted, or success, or failure. So we don't create a MessageState and save it on the _sendingStates HashSet
        Returns:
        true always
        Throws:
        I2PSessionException
        Since:
        0.8.1
      • receiveStatus

        public void receiveStatus​(int msgId,
                                  long nonce,
                                  int status)
        Only call this with nonzero status, i.e. for outbound messages whose MessageState may be queued on _sendingStates. Even when using sendBestEffort(), this is a waste, because the MessageState is removed from _sendingStates immediately and so the lookup here fails. This is now pretty much avoided since streaming now sets i2cp.messageReliability = none, which forces sendNoEffort() instead of sendBestEffort(), so the router won't send us any MSM's for outbound traffic.
        Specified by:
        receiveStatus in class I2PSessionImpl
        Parameters:
        status - != 0
      • reconnect

        protected boolean reconnect()
        Called whenever we want to reconnect (used only in the superclass). We need to override this to clear out the message state
        Overrides:
        reconnect in class I2PSessionImpl