## Uses of Interface
net.i2p.data.i2np.I2NPMessage

- Packages that use I2NPMessage
  Package | Description
  --- | ---
  net.i2p.data.i2np | This package defines the low-level messages sent between routers, called Invisible Internet Network Protocol (I2NP).
  net.i2p.router | The I2P router application handles I2P network communication.
  net.i2p.router.message | Garlic message creation, parsing, and source routing for I2P communications.
  net.i2p.router.networkdb | Network database management and coordination for the I2P distributed hash table.
  net.i2p.router.networkdb.kademlia | Kademlia DHT implementation and floodfill router functionality for I2P.
  net.i2p.router.transport | Transport layer implementations and management for I2P network communication.
  net.i2p.router.transport.ntcp | The NTCP (New TCP) transport for I2P, allowing I2P messages to be passed over TCP connections.
  net.i2p.router.transport.udp | The UDP transport (also known as 'SSU' or Secure Semi-reliable UDP transport) for I2P, allowing I2P messages to be passed over UDP connections.
  net.i2p.router.tunnel | Core tunnel management, message processing, and encryption for I2P's anonymous routing system.

- - ### Uses of I2NPMessage in net.i2p.data.i2np

    Classes in net.i2p.data.i2np that implement I2NPMessage
    Modifier and Type | Class and Description
    --- | ---
    `class` | `DatabaseLookupMessage` Defines the message a router sends to another router to search for a key in the network database.
    `class` | `DatabaseSearchReplyMessage` Defines the message a router sends to another router in response to a search (DatabaseFindNearest or DatabaseLookup) when it doesn't have the value, specifying what routers it would search.
    `class` | `DatabaseStoreMessage` Defines the message a router sends to another router to test the network database reachability, as well as the reply message sent back.
    `class` | `DataMessage` Defines a message containing arbitrary bytes of data This is what goes in a GarlicClove.
    `class` | `DeliveryStatusMessage` Defines the message sent back in reply to a message when requested, containing the private ack id.
    `class` | `FastI2NPMessageImpl` Ignore, but save, the SHA-256 checksum in the full 16-byte header when read in.
    `class` | `GarlicMessage` Defines the wrapped garlic message
    `class` | `I2NPMessageImpl` Defines the base message implementation.
    `class` | `OutboundTunnelBuildReplyMessage` Sent from the OBEP to the tunnel creator via an inbound tunnel.
    `class` | `ShortTunnelBuildMessage` Variable size, small records.
    `class` | `ShortTunnelBuildReplyMessage` Internal use only, to convert an inbound STBM to a reply.
    `class` | `TunnelBuildMessage` The basic build message with 8 records.
    `class` | `TunnelBuildMessageBase` Base for TBM, TBRM, VTBM, VTBRM Retrofitted over them.
    `class` | `TunnelBuildReplyMessage` The basic build reply message with 8 records.
    `class` | `TunnelDataMessage` Defines the message sent between routers as part of the tunnel delivery The tunnel ID is changed in-place by TunnelParticipant.send(), so we can't reuse the checksum on output, but we still subclass FastI2NPMessageImpl so we don't verify the checksum on input...
    `class` | `TunnelGatewayMessage` Defines the message sent between one tunnel's endpoint and another's gateway.
    `class` | `UnknownI2NPMessage` This is similar to DataMessage or GarlicMessage but with a variable message type.
    `class` | `VariableTunnelBuildMessage` Variable number of records.
    `class` | `VariableTunnelBuildReplyMessage` Transmitted from the new outbound endpoint to the creator through a reply tunnel.

    Methods in net.i2p.data.i2np that return I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `I2NPMessage` | I2NPMessageImpl.Builder.`build(I2PAppContext ctx)` instantiate a new I2NPMessage to be populated shortly
    `I2NPMessage` | UnknownI2NPMessage.`convert()` Attempt to convert this message to a known message class.
    `static I2NPMessage` | I2NPMessageImpl.`createMessage(I2PAppContext context, int type)` Yes, this is fairly ugly, but its the only place it ever happens.
    `static I2NPMessage` | I2NPMessageImpl.`fromRawByteArray(I2PAppContext ctx, byte[] buffer, int offset, int len, I2NPMessageHandler handler)` Read the message with a short 5-byte header.
    `static I2NPMessage` | I2NPMessageImpl.`fromRawByteArrayNTCP2(I2PAppContext ctx, byte[] buffer, int offset, int len, I2NPMessageHandler handler)` Read the message with a short 9-byte header.
    `I2NPMessage` | GarlicClove.`getData()`
    `I2NPMessage` | TunnelGatewayMessage.`getMessage()` Warning, at the IBGW, where the message was read in, this will be an UnknownI2NPMessage.
    `I2NPMessage` | I2NPMessageHandler.`lastRead()` clear the last message read from a byte array with an offset
    `I2NPMessage` | I2NPMessageHandler.`readMessage(byte[] data)` Read an I2NPMessage from the byte array and return the fully populated object.

    Methods in net.i2p.data.i2np with parameters of type I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `void` | GarlicClove.`setData(I2NPMessage msg)`
    `void` | TunnelGatewayMessage.`setMessage(I2NPMessage msg)`

  - ### Uses of I2NPMessage in net.i2p.router

    Methods in net.i2p.router that return I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `I2NPMessage` | OutNetMessage.`getMessage()` Specifies the message to be sent.

    Methods in net.i2p.router with parameters of type I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `int` | InNetMessagePool.`add(I2NPMessage messageBody, RouterIdentity fromRouter, Hash fromRouterHash)` Adds a new inbound message to be processed.
    `int` | InNetMessagePool.`add(I2NPMessage messageBody, RouterIdentity fromRouter, Hash fromRouterHash, long msgIDBloomXor)` Adds a new inbound message with optional bloom filter XOR id.
    `Job` | HandlerJobBuilder.`createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash)` Create a new job to handle the received message.
    `void` | MessageHistory.`droppedOtherMessage(I2NPMessage message, Hash from)` We received another message we weren't waiting for and don't know how to handle
    `int` | InNetMessagePool.`handleReplies(I2NPMessage messageBody)` Handles replies for outbound messages that correspond to this inbound message.
    `boolean` | MessageSelector.`isMatch(I2NPMessage message)` Returns true if the received message matches the selector.
    `void` | ReplyJob.`setMessage(I2NPMessage message)` Called by InNetMessagePool when an I2NPMessage matching a MessageSelector registered with the OutboundMessageRegistry is received

    Constructors in net.i2p.router with parameters of type I2NPMessage
    Constructor and Description
    `OutNetMessage(RouterContext context, I2NPMessage msg, long expiration, int priority, RouterInfo target)` Standard constructor

  - ### Uses of I2NPMessage in net.i2p.router.message

    Methods in net.i2p.router.message that return I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `I2NPMessage` | PayloadGarlicConfig.`getPayload()` Specify the I2NP message to be sent - if this is set, no other cloves can be included in this block

    Methods in net.i2p.router.message with parameters of type I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `Job` | GarlicMessageHandler.`createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash)`
    `void` | GarlicMessageReceiver.CloveReceiver.`handleClove(DeliveryInstructions instructions, I2NPMessage data)` Handles a decrypted garlic clove.
    `void` | HandleGarlicMessageJob.`handleClove(DeliveryInstructions instructions, I2NPMessage data)` Handle each garlic clove based on its delivery instructions.

    Constructors in net.i2p.router.message with parameters of type I2NPMessage
    Constructor and Description
    `PayloadGarlicConfig(Certificate cert, long id, long expiration, DeliveryInstructions di, I2NPMessage message)`
    `SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, int timeoutMs, int priority)`
    `SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, int timeoutMs, int priority, long msgIDBloomXor)`
    `SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, Job onSend, ReplyJob onSuccess, Job onFail, MessageSelector selector, int timeoutMs, int priority, long msgIDBloomXor)`
    `SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, ReplyJob onSuccess, Job onFail, MessageSelector selector, int timeoutMs, int priority)`
    `SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, ReplyJob onSuccess, Job onFail, MessageSelector selector, int timeoutMs, int priority, long msgIDBloomXor)`

  - ### Uses of I2NPMessage in net.i2p.router.networkdb

    Methods in net.i2p.router.networkdb with parameters of type I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `protected void` | HandleDatabaseLookupMessageJob.`sendMessage(I2NPMessage message, Hash toPeer, TunnelId replyTunnel)`

  - ### Uses of I2NPMessage in net.i2p.router.networkdb.kademlia

    Methods in net.i2p.router.networkdb.kademlia that return I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `protected I2NPMessage` | ExploreJob.`buildMessage(TunnelId replyTunnelId, Hash replyGateway, long expiration, RouterInfo peer)` Builds the database lookup message to send to a peer.
    `protected I2NPMessage` | SearchJob.`buildMessage(TunnelId replyTunnelId, Hash replyGateway, long expiration, RouterInfo peer)` Build the database search message

    Methods in net.i2p.router.networkdb.kademlia with parameters of type I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `Job` | FloodfillDatabaseStoreMessageHandler.`createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash)`
    `Job` | FloodfillDatabaseLookupMessageHandler.`createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash)` Creates a job to handle an incoming DatabaseLookupMessage, or returns null if the lookup should be dropped.
    `boolean` | SearchMessageSelector.`isMatch(I2NPMessage message)`
    `boolean` | StoreMessageSelector.`isMatch(I2NPMessage message)`
    `boolean` | FloodOnlyLookupSelector.`isMatch(I2NPMessage message)`
    `boolean` | IterativeLookupSelector.`isMatch(I2NPMessage message)` This only returns true for DSMs, not for DSRMs.
    `void` | SearchUpdateReplyFoundJob.`setMessage(I2NPMessage message)`
    `void` | FloodOnlyLookupMatchJob.`setMessage(I2NPMessage message)`
    `void` | DirectLookupMatchJob.`setMessage(I2NPMessage message)` Override to not call failed() in setMessage(), as it will be called from runJob()
    `(package private) static MessageWrapper.WrappedMessage` | MessageWrapper.`wrap(RouterContext ctx, I2NPMessage m, Hash from, RouterInfo to)` Garlic wrap a message from a client or this router, destined for a router, to hide the contents from the OBEP.
    `static GarlicMessage` | MessageWrapper.`wrap(RouterContext ctx, I2NPMessage m, MessageWrapper.OneTimeSession session)` Garlic wrap a message from nobody, destined for an unknown router, to hide the contents from the IBGW.
    `static GarlicMessage` | MessageWrapper.`wrap(RouterContext ctx, I2NPMessage m, RouterInfo to)` Garlic wrap a message from nobody, destined for a router, to hide the contents from the OBEP.
    `static GarlicMessage` | MessageWrapper.`wrap(RouterContext ctx, I2NPMessage m, SessionKey encryptKey, RatchetSessionTag encryptTag)` Garlic wrap a message from nobody, destined for an unknown router, to hide the contents from the IBGW.
    `static GarlicMessage` | MessageWrapper.`wrap(RouterContext ctx, I2NPMessage m, SessionKey encryptKey, SessionTag encryptTag)` Garlic wrap a message from nobody, destined for an unknown router, to hide the contents from the IBGW.

  - ### Uses of I2NPMessage in net.i2p.router.transport

    Methods in net.i2p.router.transport with parameters of type I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `List<OutNetMessage>` | OutboundMessageRegistry.`getOriginalMessages(I2NPMessage message)` Retrieve all messages that are waiting for the specified message.
    `void` | TransportEventListener.`messageReceived(I2NPMessage message, RouterIdentity fromRouter, Hash fromRouterHash)` Message received
    `void` | TransportManager.`messageReceived(I2NPMessage message, RouterIdentity fromRouter, Hash fromRouterHash)` Handle incoming I2NP message from a peer.
    `void` | TransportImpl.`messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived)` Message received from the I2NPMessageReader - send it to the listener

  - ### Uses of I2NPMessage in net.i2p.router.transport.ntcp

    Methods in net.i2p.router.transport.ntcp with parameters of type I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `void` | InboundEstablishState.`gotI2NP(I2NPMessage msg)` Illegal during handshake - I2NP messages are only in the data phase.
    `void` | NTCP2Payload.PayloadCallback.`gotI2NP(I2NPMessage msg)`

    Constructors in net.i2p.router.transport.ntcp with parameters of type I2NPMessage
    Constructor and Description
    `I2NPBlock(I2NPMessage msg)`

  - ### Uses of I2NPMessage in net.i2p.router.transport.udp

    Methods in net.i2p.router.transport.udp with parameters of type I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `void` | SSU2Payload.PayloadCallback.`gotI2NP(I2NPMessage msg)`
    `void` | OutboundEstablishState2.`gotI2NP(I2NPMessage msg)`
    `void` | InboundEstablishState2.`gotI2NP(I2NPMessage msg)`
    `void` | PeerStateDestroyed.`gotI2NP(I2NPMessage msg)`
    `void` | PeerState2.`gotI2NP(I2NPMessage msg)`
    `void` | UDPTransport.`messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived)`
    `(package private) void` | UDPTransport.`send(I2NPMessage msg, List<OutNetMessage> msgs, PeerState peer)` "injected" message from the EstablishmentManager, plus pending messages to send, so the messages may be bundled efficiently.
    `(package private) void` | UDPTransport.`send(I2NPMessage msg, PeerState peer)` "injected" message from the EstablishmentManager.

    Method parameters in net.i2p.router.transport.udp with type arguments of type I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `(package private) void` | UDPTransport.`send(List<I2NPMessage> msgs, PeerState peer)` "injected" messages from the EstablishmentManager.

    Constructors in net.i2p.router.transport.udp with parameters of type I2NPMessage
    Constructor and Description
    `OutboundMessageState(I2PAppContext context, I2NPMessage msg, PeerState peer)` "injected" message from the establisher.

  - ### Uses of I2NPMessage in net.i2p.router.tunnel

    Methods in net.i2p.router.tunnel with parameters of type I2NPMessage
    Modifier and Type | Method and Description
    --- | ---
    `void` | TunnelGatewayZeroHop.`add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel)` Add a message to be sent down the tunnel (immediately forwarding it to the `InboundMessageDistributor` or `OutboundMessageDistributor`, as necessary).
    `void` | PumpedTunnelGateway.`add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel)` Adds a message to be sent down the tunnel.
    `void` | ThrottledPumpedTunnelGateway.`add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel)` Adds a message to the inbound gateway after a bandwidth-based drop check.
    `void` | TunnelGateway.`add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel)` Add a message to be sent down the tunnel, either sending it now (perhaps coalesced with other pending messages) or after a brief pause (_flushFrequency).
    `void` | TunnelDispatcher.`dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, Hash targetPeer)` Dispatch an outbound message through a tunnel
    `void` | TunnelDispatcher.`dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, TunnelId targetTunnel, Hash targetPeer)`
    `void` | InboundMessageDistributor.`distribute(I2NPMessage msg, Hash target)`
    `void` | OutboundMessageDistributor.`distribute(I2NPMessage msg, Hash target)` Warning - as of 0.9.63, msg will be an UnknownI2NPMessage, and must be converted before handling locally.
    `void` | InboundMessageDistributor.`distribute(I2NPMessage msg, Hash target, TunnelId tunnel)`
    `void` | OutboundMessageDistributor.`distribute(I2NPMessage msg, Hash target, TunnelId tunnel)` Warning - as of 0.9.63, msg will be an UnknownI2NPMessage, and must be converted before handling locally.
    `void` | InboundMessageDistributor.`handleClove(DeliveryInstructions instructions, I2NPMessage data)` Handle a clove removed from the garlic message
    `void` | FragmentHandler.DefragmentedReceiver.`receiveComplete(I2NPMessage msg, Hash toRouter, TunnelId toTunnel)` Receive a fully formed I2NPMessage out of the tunnel

    Constructors in net.i2p.router.tunnel with parameters of type I2NPMessage
    Constructor and Description
    `OutboundGatewayMessage(I2NPMessage message, Hash toRouter, TunnelId toTunnel)`
    `PendingGatewayMessage(I2NPMessage message, Hash toRouter, TunnelId toTunnel)`