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
Fields -
Constructor Summary
ConstructorsConstructorDescriptionOutboundMessageState(I2PAppContext context, I2NPMessage msg, PeerState peer) "injected" message from the establisher.OutboundMessageState(I2PAppContext context, OutNetMessage m, PeerState peer) Normal constructor. -
Method Summary
Modifier and TypeMethodDescriptionbooleanacked(int fragmentNum) Ack this fragment number.booleanacked(ACKBitfield bitfield) Ack all the fragments in the ack list.voidvoiddrop()For CDQintfragmentSize(int fragmentNum) The size in bytes of the fragment.longFor CDQintHow many fragments in the messagelongintThe max number of sends for any fragment.longintThe size of the I2NP message.intThe minimum number of bytes we can send, which is the smallest unacked fragment we will send next.intgetNACKs()getPeer()intFor CDPQintThe number of times we've pushed some fragments.intgetSendSize(int max) How many bytes we can send under the max given.longFor CDPQintintAs of 0.9.49, includes packet overheadintbooleanIs any fragment unsent?intbooleanbooleanbooleanisExpired(long now) booleanneedsSending(int fragment) intpush(List<PacketBuilder.Fragment> toSend) Add fragments up to the number of bytes allowed by setAllowedSendBytes() Side effects: Clears setAllowedSendBytes.voidsetEnqueueTime(long now) For CDQvoidsetSeqNum(long num) For CDPQtoString()intwriteFragment(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:
setEnqueueTimein interfaceCDQEntry- Since:
- 0.9.3
-
getEnqueueTime
public long getEnqueueTime()For CDQ- Specified by:
getEnqueueTimein 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:
getPriorityin interfacePQEntry- Returns:
- OutNetMessage priority or 1000 for injected
- Since:
- 0.9.3
-
toString
-