## net.i2p.router.tunnel
Class FragmentHandler

    java.lang.Object
      net.i2p.router.tunnel.FragmentHandler

Direct Known Subclasses:
  RouterFragmentHandler

    public class FragmentHandler

extends java.lang.Object

Handle fragments at the endpoint of a tunnel, peeling off fully completed I2NPMessages when they arrive, and dropping fragments if they take too long to arrive.

Nested Class Summary
`static interface` `FragmentHandler.DefragmentedReceiver` Receive messages out of the tunnel endpoint.

Field Summary
`(package private) static byte` `MASK_EXTENDED` are there follow up headers?
`(package private) static byte` `MASK_FRAGMENTED` is this the first of a fragmented message?
`(package private) static byte` `MASK_IS_SUBSEQUENT` is this a follw up byte?
`(package private) static byte` `MASK_TYPE` how should this be delivered.
`(package private) static long` `MAX_DEFRAGMENT_TIME` don't wait more than 60s to defragment the partial message
`(package private) static short` `TYPE_LOCAL`
`(package private) static short` `TYPE_ROUTER`
`(package private) static short` `TYPE_TUNNEL`

Constructor Summary
`FragmentHandler(I2PAppContext context, FragmentHandler.DefragmentedReceiver receiver)`

Method Summary
`int` `getCompleteCount()`
`int` `getFailedCount()`
`protected void` `noteCompletion(long messageId)`
`protected void` `noteFailure(long messageId, java.lang.String status)`
`protected void` `noteReception(long messageId, int fragmentId, java.lang.Object status)`
`void` `receiveTunnelMessage(byte[] preprocessed, int offset, int length)` Receive the raw preprocessed message at the endpoint, parsing out each of the fragments, using those to fill various FragmentedMessages, and sending the resulting I2NPMessages where necessary.

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Field Detail

### MAX_DEFRAGMENT_TIME

    static long MAX_DEFRAGMENT_TIME

  don't wait more than 60s to defragment the partial message

### MASK_IS_SUBSEQUENT

    static final byte MASK_IS_SUBSEQUENT

  is this a follw up byte?

  See Also:
    Constant Field Values

### MASK_TYPE

    static final byte MASK_TYPE

  how should this be delivered. shift this 5 the right and get TYPE_*

  See Also:
    Constant Field Values

### MASK_FRAGMENTED

    static final byte MASK_FRAGMENTED

  is this the first of a fragmented message?

  See Also:
    Constant Field Values

### MASK_EXTENDED

    static final byte MASK_EXTENDED

  are there follow up headers?

  See Also:
    Constant Field Values

### TYPE_LOCAL

    static final short TYPE_LOCAL

See Also:
  Constant Field Values

### TYPE_TUNNEL

    static final short TYPE_TUNNEL

See Also:
  Constant Field Values

### TYPE_ROUTER

    static final short TYPE_ROUTER

See Also:
  Constant Field Values

Constructor Detail

### FragmentHandler

    public FragmentHandler(I2PAppContext context,
                           FragmentHandler.DefragmentedReceiver receiver)

Method Detail

### receiveTunnelMessage

    public void receiveTunnelMessage(byte[] preprocessed,
                                     int offset,
                                     int length)

  Receive the raw preprocessed message at the endpoint, parsing out each of the fragments, using those to fill various FragmentedMessages, and sending the resulting I2NPMessages where necessary. The received fragments are all verified.

### getCompleteCount

    public int getCompleteCount()

### getFailedCount

    public int getFailedCount()

### noteReception

    protected void noteReception(long messageId,
                                 int fragmentId,
                                 java.lang.Object status)

### noteCompletion

    protected void noteCompletion(long messageId)

### noteFailure

    protected void noteFailure(long messageId,
                               java.lang.String status)