Class OutboundMessageState

  • All Implemented Interfaces:
    CDPQEntry, CDQEntry, PQEntry

    class OutboundMessageState
    extends Object
    implements CDPQEntry
    Maintain the outbound fragmentation for resending, for a single message. All methods are thread-safe.
    • Method Detail

      • getMessageId

        public long getMessageId()
      • incrementNACKs

        public int incrementNACKs()
        Returns:
        new value
        Since:
        0.9.49
      • getNACKs

        public int getNACKs()
        Since:
        0.9.49
      • clearNACKs

        public void clearNACKs()
        Since:
        0.9.49
      • isExpired

        public boolean isExpired()
      • isExpired

        public boolean isExpired​(long now)
        Since:
        0.9.38
      • isComplete

        public boolean isComplete()
      • getUnackedSize

        public int getUnackedSize()
        As of 0.9.49, includes packet overhead
      • getUnackedFragments

        public int getUnackedFragments()
        Returns:
        count of unacked fragments
        Since:
        0.9.49
      • hasUnsentFragments

        public boolean hasUnsentFragments()
        Is any fragment unsent?
        Since:
        0.9.49
      • getMinSendSize

        public int getMinSendSize()
        The minimum number of bytes we can send, which is the smallest unacked fragment we will send next. Includes packet overhead.
        Returns:
        0 to total size
        Since:
        0.9.49
      • getSendSize

        public int getSendSize​(int max)
        How many bytes we can send under the max given. Side effect: if applicable, amount to send will be saved for the push() call. Note: With multiple fragments, this will allocate only the fragments with the lowest push count. Example: If push counts are 1 1 1 0 0, this will only return the size of the last two fragments, even if any of the first three need to be retransmitted. Includes packet overhead.
        Parameters:
        max - the maximum number of bytes we can send, including packet overhead
        Returns:
        0 to max bytes
        Since:
        0.9.49
      • needsSending

        public boolean needsSending​(int fragment)
      • getLifetime

        public long getLifetime()
      • acked

        public boolean acked​(ACKBitfield bitfield)
        Ack all the fragments in the ack list.
        Returns:
        true if the message was completely ACKed
      • getMaxSends

        public int getMaxSends()
        The max number of sends for any fragment. As of 0.9.49, may be less than getPushCount() if we pushed only some fragments
      • getPushCount

        public int getPushCount()
        The number of times we've pushed some fragments. As of 0.9.49, may be greater than getMaxSends() if we pushed only some fragments.
      • push

        public int push​(List<PacketBuilder.Fragment> toSend)
        Add fragments up to the number of bytes allowed by setAllowedSendBytes() Side effects: Clears setAllowedSendBytes. Increments pushCount. Increments maxSends if applicable. Note: With multiple fragments, this will send only the fragments with the lowest push count. Example: If push counts are 1 1 1 0 0, this will only send the last two fragments, even if any of the first three need to be retransmitted.
        Parameters:
        toSend - out parameter
        Returns:
        the number of Fragments added
        Since:
        0.9.49
      • getFragmentCount

        public int getFragmentCount()
        How many fragments in the message
      • getMessageSize

        public int getMessageSize()
        The size of the I2NP message. Does not include any SSU overhead.
      • fragmentSize

        public int fragmentSize​(int fragmentNum)
        The size in bytes of the fragment. Does NOT include any SSU overhead.
        Parameters:
        fragmentNum - the number of the fragment
        Returns:
        the size of the fragment specified by the number
      • writeFragment

        public int writeFragment​(byte[] out,
                                 int outOffset,
                                 int fragmentNum)
        Write a part of the the message onto the specified buffer.
        Parameters:
        out - target to write
        outOffset - into outOffset to begin writing
        fragmentNum - fragment to write (0 indexed)
        Returns:
        bytesWritten, NOT including packet overhead
      • setEnqueueTime

        public void setEnqueueTime​(long now)
        For CDQ
        Specified by:
        setEnqueueTime in interface CDQEntry
        Since:
        0.9.3
      • getEnqueueTime

        public long getEnqueueTime()
        For CDQ
        Specified by:
        getEnqueueTime in interface CDQEntry
        Since:
        0.9.3
      • drop

        public void drop()
        For CDQ
        Specified by:
        drop in interface CDQEntry
        Since:
        0.9.3
      • setSeqNum

        public void setSeqNum​(long num)
        For CDPQ
        Specified by:
        setSeqNum in interface PQEntry
        Since:
        0.9.3
      • getSeqNum

        public long getSeqNum()
        For CDPQ
        Specified by:
        getSeqNum in interface PQEntry
        Since:
        0.9.3
      • getPriority

        public int getPriority()
        For CDPQ
        Specified by:
        getPriority in interface PQEntry
        Returns:
        OutNetMessage priority or 1000 for injected
        Since:
        0.9.3