Class OutboundMessageState

java.lang.Object
net.i2p.router.transport.udp.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.
  • Field Details

  • Constructor Details

  • Method Details

    • getVersion

      public int getVersion()
      Since:
      0.9.54
    • getMessage

      public OutNetMessage getMessage()
    • 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
    • getPeer

      public PeerState getPeer()
    • 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)
      Returns:
      true if the fragment has not been ACKed
    • 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
    • acked

      public boolean acked(int fragmentNum)
      Ack this fragment number. For SSU 2 only.
      Returns:
      true if the message was completely ACKed
      Since:
      0.9.54
    • 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 (SSU2 is 3 for all fragments, + 5 for followon fragments)
      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
    • toString

      public String toString()
      Overrides:
      toString in class Object