Package net.i2p.router.transport.udp
Class OutboundMessageState
java.lang.Object
net.i2p.router.transport.udp.OutboundMessageState
Maintain the outbound fragmentation for resending, for a single message.
All methods are thread-safe.
-
Field Summary
-
Constructor Summary
ConstructorDescriptionOutboundMessageState
(I2PAppContext context, I2NPMessage msg, PeerState peer) "injected" message from the establisher.OutboundMessageState
(I2PAppContext context, OutNetMessage m, PeerState peer) Normal constructor. -
Method Summary
Modifier and TypeMethodDescriptionboolean
acked
(int fragmentNum) Ack this fragment number.boolean
acked
(ACKBitfield bitfield) Ack all the fragments in the ack list.void
void
drop()
For CDQint
fragmentSize
(int fragmentNum) The size in bytes of the fragment.long
For CDQint
How many fragments in the messagelong
int
The max number of sends for any fragment.long
int
The size of the I2NP message.int
The minimum number of bytes we can send, which is the smallest unacked fragment we will send next.int
getNACKs()
getPeer()
int
For CDPQint
The number of times we've pushed some fragments.int
getSendSize
(int max) How many bytes we can send under the max given.long
For CDPQint
int
As of 0.9.49, includes packet overheadint
boolean
Is any fragment unsent?int
boolean
boolean
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 CDPQtoString()
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:
-
-
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
-
getVersion
public int getVersion()- Since:
- 0.9.54
-
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) - Returns:
- true if the fragment has not been ACKed
-
getLifetime
public long getLifetime() -
acked
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
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 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
-