Package net.i2p.router.transport.udp
Class OutboundMessageState
java.lang.Object
net.i2p.router.transport.udp.OutboundMessageState
class OutboundMessageState extends Object implements CDPQEntry
Maintain the outbound fragmentation for resending, for a single message.
All methods are thread-safe.
-
Field Summary
Fields Modifier and Type Field Description static int
MAX_MSG_SIZE
-
Constructor Summary
Constructors Constructor Description OutboundMessageState(I2PAppContext context, I2NPMessage msg, PeerState peer)
"injected" message from the establisher.OutboundMessageState(I2PAppContext context, OutNetMessage m, PeerState peer)
Normal constructor. -
Method Summary
Modifier and Type Method Description boolean
acked(ACKBitfield bitfield)
Ack all the fragments in the ack list.void
clearNACKs()
void
drop()
For CDQint
fragmentSize(int fragmentNum)
The size in bytes of the fragment.long
getEnqueueTime()
For CDQint
getFragmentCount()
How many fragments in the message.long
getLifetime()
int
getMaxSends()
The max number of sends for any fragment.OutNetMessage
getMessage()
long
getMessageId()
int
getMessageSize()
The size of the I2NP message.int
getMinSendSize()
The minimum number of bytes we can send, which is the smallest unacked fragment we will send next.int
getNACKs()
PeerState
getPeer()
int
getPriority()
For CDPQint
getPushCount()
The number of times we've pushed some fragments.int
getSendSize(int max)
How many bytes we can send under the max given.long
getSeqNum()
For CDPQint
getUnackedFragments()
int
getUnackedSize()
As of 0.9.49, includes packet overheadboolean
hasUnsentFragments()
Is any fragment unsent?int
incrementNACKs()
boolean
isComplete()
boolean
isExpired()
boolean
isExpired(long now)
boolean
needsSending(int fragment)
int
push(List<PacketBuilder.Fragment> toSend)
Add fragments up to the number of bytes allowed by setAllowedSendBytes() Side effects: Clears setAllowedSendBytes.void
setEnqueueTime(long now)
For CDQvoid
setSeqNum(long num)
For CDPQString
toString()
int
writeFragment(byte[] out, int outOffset, int fragmentNum)
Write a part of the the message onto the specified buffer.
-
Field Details
-
MAX_MSG_SIZE
public static final int MAX_MSG_SIZE- See Also:
- Constant Field Values
-
-
Constructor Details
-
OutboundMessageState
"injected" message from the establisher. Called from UDPTransport.- Throws:
IllegalArgumentException
- if too big or if msg or peer is null
-
OutboundMessageState
Normal constructor. Called from OutboundMessageFragments.- Throws:
IllegalArgumentException
- if too big or if msg or peer is null
-
-
Method Details
-
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
-
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
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
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 writeoutOffset
- into outOffset to begin writingfragmentNum
- fragment to write (0 indexed)- Returns:
- bytesWritten, NOT including packet overhead
-
setEnqueueTime
public void setEnqueueTime(long now)For CDQ- Specified by:
setEnqueueTime
in interfaceCDQEntry
- Since:
- 0.9.3
-
getEnqueueTime
public long getEnqueueTime()For CDQ- Specified by:
getEnqueueTime
in interfaceCDQEntry
- Since:
- 0.9.3
-
drop
public void drop()For CDQ -
setSeqNum
public void setSeqNum(long num)For CDPQ -
getSeqNum
public long getSeqNum()For CDPQ -
getPriority
public int getPriority()For CDPQ- Specified by:
getPriority
in interfacePQEntry
- Returns:
- OutNetMessage priority or 1000 for injected
- Since:
- 0.9.3
-
toString
-