Packages that use I2NPMessage
Package
Description
Low-level messages sent between routers - the Invisible Internet Network Protocol (I2NP).
The I2P router application handles I2P network communication.
Garlic message creation, parsing and handling, and the outbound message jobs: one-shot sends, source routing and delivery status handling.
Network database message handling shared by all facades: database lookup jobs and local RouterInfo publication.
The Kademlia distributed hash table (DHT) network database: lookup, store and explore jobs, the data store, the floodfill variants, and lookup throttling.
Peer profiles and capacity calculation, peer test jobs, peer selection for tunnel building, and the database and tunnel history used for peer selection.
Transport framework: the transport lifecycle and pool management, connection handling and bandwidth throttling for the transports (NTCP2 over TCP, SSU over UDP) that carry I2P messages between routers, plus NAT traversal via UPnP and GeoIP country lookups.
NTCP2, the TCP transport: framed, ratchet-encrypted and mutually authenticated connections between routers.
SSU2, the UDP transport: datagram sessions with Holepunch peer discovery, plus the older SSU compatibility code.
Tunnel messages and the tunnel layer: the
TunnelManagerFacade, tunnel build request and reply processing, and the inbound and outbound tunnel structures. Tunnel pool management: pool lifecycle, peer selection, build scheduling and failure handling for client and exploratory tunnels.
Uses of I2NPMessage in net.i2p.data.i2np
Classes in net.i2p.data.i2np that implement I2NPMessageModifier and TypeClassDescriptionclassDefines the message a router sends to another router to search for a key in the network database.classDefines 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.classDefines the message a router sends to another router to test the network database reachability, as well as the reply message sent back.classDefines a message containing arbitrary bytes of data.classDefines the message sent back in reply to a message when requested, containing the private ack id.classIgnore, but save, the SHA-256 checksum in the full 16-byte header when read in.classDefines the wrapped garlic message.classDefines the base message implementation.classSent from the OBEP to the tunnel creator via an inbound tunnel.classVariable size, small records.classInternal use only, to convert an inbound STBM to a reply.classThe basic build message with 8 records.classBase for TBM, TBRM, VTBM, VTBRM Retrofitted over them.classThe basic build reply message with 8 records.classDefines the message sent between routers as part of the tunnel deliveryclassDefines the message sent between one tunnel's endpoint and another's gateway.classThis is similar to DataMessage or GarlicMessage but with a variable message type.classVariable number of records.classTransmitted from the new outbound endpoint to the creator through a reply tunnel.Fields in net.i2p.data.i2np declared as I2NPMessageModifier and TypeFieldDescriptionprivate I2NPMessageI2NPMessageHandler._lastReadThe message read last, reused between reads.private I2NPMessageGarlicClove._msgThe message payload wrapped in this clove.private I2NPMessageTunnelGatewayMessage._msgThe message carried inside.Methods in net.i2p.data.i2np that return I2NPMessageModifier and TypeMethodDescriptionI2NPMessageImpl.Builder.build(I2PAppContext ctx) Instantiate a new I2NPMessage to be populated shortly.UnknownI2NPMessage.convert()Attempt to convert this message to a known message class.static I2NPMessageI2NPMessageImpl.createMessage(I2PAppContext context, int type) Yes, this is fairly ugly, but its the only place it ever happens.static I2NPMessageI2NPMessageImpl.fromRawByteArray(I2PAppContext ctx, byte[] buffer, int offset, int len, I2NPMessageHandler handler) Read the message with a short 5-byte header.static I2NPMessageI2NPMessageImpl.fromRawByteArrayNTCP2(I2PAppContext ctx, byte[] buffer, int offset, int len, I2NPMessageHandler handler) Read the message with a short 9-byte header.GarlicClove.getData()The message payload wrapped in this clove.TunnelGatewayMessage.getMessage()Warning, at the IBGW, where the message was read in, this will be an UnknownI2NPMessage.I2NPMessageHandler.lastRead()Clear the last message read from a byte array with an offset.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 I2NPMessageModifier and TypeMethodDescriptionvoidGarlicClove.setData(I2NPMessage msg) Message payload wrapped in this clove.voidTunnelGatewayMessage.setMessage(I2NPMessage msg) Embedded message; may only be set once.Uses of I2NPMessage in net.i2p.router
Fields in net.i2p.router declared as I2NPMessageModifier and TypeFieldDescriptionprivate final I2NPMessageOutNetMessage._messageThe message to send.(package private) final I2NPMessageInNetMessagePool.QueuedMessage.messageThe message waiting to be handled.Fields in net.i2p.router with type parameters of type I2NPMessageModifier and TypeFieldDescriptionprivate final LinkedBlockingQueue<I2NPMessage> InNetMessagePool._pendingGatewayMessagesMessages waiting for a gateway job.Methods in net.i2p.router that return I2NPMessageMethods in net.i2p.router with parameters of type I2NPMessageModifier and TypeMethodDescriptionintInNetMessagePool.add(I2NPMessage messageBody, RouterIdentity fromRouter, Hash fromRouterHash) Adds a new inbound message to be processed.intInNetMessagePool.add(I2NPMessage messageBody, RouterIdentity fromRouter, Hash fromRouterHash, long msgIDBloomXor) Adds a new inbound message with optional bloom filter XOR id.HandlerJobBuilder.createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) Create a new job to handle the received message.private voidInNetMessagePool.doShortCircuitTunnelData(I2NPMessage messageBody, Hash from) Actual direct dispatch of a tunnel data message.private voidInNetMessagePool.doShortCircuitTunnelGateway(I2NPMessage messageBody) Actual direct dispatch of a tunnel gateway message.voidMessageHistory.droppedOtherMessage(I2NPMessage message, Hash from) We received another message we weren't waiting for and don't know how to handle.private voidInNetMessagePool.handleDroppedUnmatchedMessage(I2NPMessage messageBody, RouterIdentity fromRouter, Hash fromRouterHash, boolean doHistory) Handles dropping messages that are not matched or handled.private voidInNetMessagePool.handleInvalidMessage(I2NPMessage messageBody, String invalidReason, RouterIdentity fromRouter, Hash fromRouterHash, boolean doHistory, long msgIDBloomXor) Handles invalid or duplicate messages by logging, statistics updates, and history recording.intInNetMessagePool.handleReplies(I2NPMessage messageBody) Handles replies for outbound messages that correspond to this inbound message.booleanMessageSelector.isMatch(I2NPMessage message) Returns true if the received message matches the selector.private booleanInNetMessagePool.processDatabaseStoreMessage(I2NPMessage messageBody, RouterIdentity fromRouter, Hash fromRouterHash, boolean doHistory) Processes DatabaseStoreMessage types by running or queueing corresponding jobs.voidReplyJob.setMessage(I2NPMessage message) Called byInNetMessagePoolwhen an I2NPMessage matching a MessageSelector registered with the OutboundMessageRegistry is received.private voidInNetMessagePool.shortCircuitTunnelData(I2NPMessage messageBody, Hash from) Shortcut dispatch tunnel data message either directly or queued.private voidInNetMessagePool.shortCircuitTunnelGateway(I2NPMessage messageBody) Shortcut dispatch tunnel gateway message either directly or queued.Constructors in net.i2p.router with parameters of type I2NPMessageModifierConstructorDescriptionOutNetMessage(RouterContext context, I2NPMessage msg, long expiration, int priority, RouterInfo target) Standard constructor.(package private)QueuedMessage(I2NPMessage m, Hash f) Records one queued message.Uses of I2NPMessage in net.i2p.router.message
Fields in net.i2p.router.message declared as I2NPMessageModifier and TypeFieldDescriptionprivate final I2NPMessageSendMessageDirectJob._messageThe message to send.private final I2NPMessagePayloadGarlicConfig._payloadThe message carried inside the clove.Methods in net.i2p.router.message that return I2NPMessageModifier and TypeMethodDescriptionPayloadGarlicConfig.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 I2NPMessageModifier and TypeMethodDescriptionGarlicMessageHandler.createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) Create and return a job to handle this message.voidGarlicMessageReceiver.CloveReceiver.handleClove(DeliveryInstructions instructions, I2NPMessage data) Handles a decrypted garlic clove.voidHandleGarlicMessageJob.handleClove(DeliveryInstructions instructions, I2NPMessage data) Handle each garlic clove based on its delivery instructions.booleanOutboundClientMessageOneShotJob.ReplySelector.isMatch(I2NPMessage inMsg) voidOutboundClientMessageOneShotJob.SendSuccessJob.setMessage(I2NPMessage msg) Constructors in net.i2p.router.message with parameters of type I2NPMessageModifierConstructorDescriptionPayloadGarlicConfig(Certificate cert, long id, long expiration, DeliveryInstructions di, I2NPMessage message) Create a garlic config wrapping the given I2NP message payload.SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, int timeoutMs, int priority) Send a message directly to a peer.SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, int timeoutMs, int priority, long msgIDBloomXor) Send a message directly to a peer with an XOR mask.SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, Job onSend, ReplyJob onSuccess, Job onFail, MessageSelector selector, int timeoutMs, int priority, long msgIDBloomXor) Send a message directly to a peer with full options.SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, ReplyJob onSuccess, Job onFail, MessageSelector selector, int timeoutMs, int priority) Send a message directly to a peer with reply handling.SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, ReplyJob onSuccess, Job onFail, MessageSelector selector, int timeoutMs, int priority, long msgIDBloomXor) Send a message directly to a peer with reply handling and XOR mask.Uses of I2NPMessage in net.i2p.router.networkdb
Methods in net.i2p.router.networkdb with parameters of type I2NPMessageModifier and TypeMethodDescriptionprotected voidHandleDatabaseLookupMessageJob.sendMessage(I2NPMessage message, Hash toPeer, TunnelId replyTunnel) Send an I2NP message to the specified peer.private voidHandleDatabaseLookupMessageJob.sendThroughTunnel(I2NPMessage message, Hash toPeer, TunnelId replyTunnel) Sends the message through the reply tunnel.Uses of I2NPMessage in net.i2p.router.networkdb.kademlia
Fields in net.i2p.router.networkdb.kademlia declared as I2NPMessageModifier and TypeFieldDescriptionprivate I2NPMessageFloodfillVerifyStoreJob.VerifyReplyJob._messageThe reply message being handled.private I2NPMessageSearchUpdateReplyFoundJob._messageThe reply message that was found.Methods in net.i2p.router.networkdb.kademlia that return I2NPMessageModifier and TypeMethodDescriptionprotected I2NPMessageExploreJob.buildMessage(TunnelId replyTunnelId, Hash replyGateway, long expiration, RouterInfo peer) Builds the database lookup message to send to a peer.protected I2NPMessageSearchJob.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 I2NPMessageModifier and TypeMethodDescriptionFloodfillDatabaseLookupMessageHandler.createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) Creates a job to handle an incoming DatabaseLookupMessage, or returns null if the lookup should be dropped.FloodfillDatabaseStoreMessageHandler.createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) booleanFloodfillVerifyStoreJob.VerifyReplySelector.isMatch(I2NPMessage message) booleanFloodOnlyLookupSelector.isMatch(I2NPMessage message) Whether the message is a store for the searched key.booleanIterativeLookupSelector.isMatch(I2NPMessage message) This only returns true for DSMs, not for DSRMs.booleanSearchMessageSelector.isMatch(I2NPMessage message) Whether the message is a store for the searched key.booleanStoreMessageSelector.isMatch(I2NPMessage message) voidDirectLookupMatchJob.setMessage(I2NPMessage message) Override to not call failed() in setMessage(), as it will be called from runJob().voidFloodfillVerifyStoreJob.VerifyReplyJob.setMessage(I2NPMessage message) voidFloodOnlyLookupMatchJob.setMessage(I2NPMessage message) voidSearchUpdateReplyFoundJob.setMessage(I2NPMessage message) Store the matched message, then continue the search.voidStoreJob.SendSuccessJob.setMessage(I2NPMessage message) Received message (unused, selector already verified match).(package private) static MessageWrapper.WrappedMessageMessageWrapper.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 GarlicMessageMessageWrapper.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 GarlicMessageMessageWrapper.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.static GarlicMessageMessageWrapper.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 GarlicMessageMessageWrapper.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.Uses of I2NPMessage in net.i2p.router.peermanager
Methods in net.i2p.router.peermanager with parameters of type I2NPMessageModifier and TypeMethodDescriptionbooleanPeerTestJob.ReplySelector.isMatch(I2NPMessage message) Whether the message matches this test.voidPeerTestJob.PeerReplyFoundJob.setMessage(I2NPMessage message) Store the message for this job.Uses of I2NPMessage in net.i2p.router.transport
Methods in net.i2p.router.transport with parameters of type I2NPMessageModifier and TypeMethodDescriptionOutboundMessageRegistry.getOriginalMessages(I2NPMessage message) Retrieve all messages that are waiting for the specified message.voidTransportEventListener.messageReceived(I2NPMessage message, RouterIdentity fromRouter, Hash fromRouterHash) Message received.voidTransportImpl.messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived) Message received from the I2NPMessageReader - send it to the listener.voidTransportManager.messageReceived(I2NPMessage message, RouterIdentity fromRouter, Hash fromRouterHash) Handle incoming I2NP message from a peer.Uses of I2NPMessage in net.i2p.router.transport.ntcp
Fields in net.i2p.router.transport.ntcp declared as I2NPMessageModifier and TypeFieldDescriptionprivate I2NPMessageNTCP2Payload.I2NPBlock.mThe message carried in the block.Methods in net.i2p.router.transport.ntcp with parameters of type I2NPMessageModifier and TypeMethodDescription(package private) NTCP2Payload.I2NPBlockNTCPConnection.BlockPool.acquireI2NP(I2NPMessage m) Get an I2NP block, reusing a pooled one if available.(package private) static intNTCPConnection.getMessageDataSize(I2NPMessage m) NTCP2 frame-size contribution of one message.voidInboundEstablishState.gotI2NP(I2NPMessage msg) Illegal during handshake - I2NP messages are only in the data phase.voidNTCP2Payload.PayloadCallback.gotI2NP(I2NPMessage msg) Receive an I2NP message block.voidNTCPConnection.NTCP2ReadState.gotI2NP(I2NPMessage msg) (package private) static booleanNTCPTransport.isOwnRouterInfoStore(I2NPMessage m, Hash ourHash) Whether a DatabaseStoreMessage stored our own RouterInfo under our own key.(package private) static booleanNTCPTransport.isRouterInfoStoreFlood(I2NPMessage m) Whether a DatabaseStoreMessage of our own RouterInfo carries a flood reply token.(package private) voidNTCP2Payload.I2NPBlock.setMessage(I2NPMessage msg) Set the message, for reuse of a pooled block.Constructors in net.i2p.router.transport.ntcp with parameters of type I2NPMessageUses of I2NPMessage in net.i2p.router.transport.udp
Fields in net.i2p.router.transport.udp declared as I2NPMessageModifier and TypeFieldDescriptionprivate final I2NPMessageOutboundMessageState._i2npMessageThe message being tracked.Methods in net.i2p.router.transport.udp that return I2NPMessageModifier and TypeMethodDescriptionprivate I2NPMessageMessageReceiver.readMessage(ByteArray buf, InboundMessageState state, I2NPMessageHandler handler) Assemble all the fragments into an I2NP message.Methods in net.i2p.router.transport.udp with parameters of type I2NPMessageModifier and TypeMethodDescriptionvoidEstablishmentManager.HPCallback.gotI2NP(I2NPMessage msg) Got an I2NP block.voidInboundEstablishState2.gotI2NP(I2NPMessage msg) Got an I2NP block.voidOutboundEstablishState2.gotI2NP(I2NPMessage msg) voidPeerState2.gotI2NP(I2NPMessage msg) Process a received I2NP block.voidPeerStateDestroyed.gotI2NP(I2NPMessage msg) Process a received I2NP block.voidPeerTestManager.PTCallback.gotI2NP(I2NPMessage msg) voidSSU2Payload.PayloadCallback.gotI2NP(I2NPMessage msg) Receive an I2NP message block.voidUDPTransport.messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived) Handle incoming message from transport layer.(package private) voidUDPTransport.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) voidUDPTransport.send(I2NPMessage msg, PeerState peer) "injected" message from the EstablishmentManager.Method parameters in net.i2p.router.transport.udp with type arguments of type I2NPMessageModifier and TypeMethodDescription(package private) voidUDPTransport.send(List<I2NPMessage> msgs, PeerState peer) "injected" messages from the EstablishmentManager.Constructors in net.i2p.router.transport.udp with parameters of type I2NPMessageModifierConstructorDescriptionOutboundMessageState(I2PAppContext context, I2NPMessage msg, PeerState peer) "injected" message from the establisher.privateOutboundMessageState(I2PAppContext context, OutNetMessage m, I2NPMessage msg, PeerState peer) Fragments the given message for transmission.Uses of I2NPMessage in net.i2p.router.tunnel
Fields in net.i2p.router.tunnel declared as I2NPMessageModifier and TypeFieldDescriptionprivate final I2NPMessageOutboundMessageDistributor.DistributeJob._messageThe message to distribute.Methods in net.i2p.router.tunnel with parameters of type I2NPMessageModifier and TypeMethodDescriptionbooleanPumpedTunnelGateway.add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) Adds a message to be sent down the tunnel.booleanThrottledPumpedTunnelGateway.add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) Adds a message to the inbound gateway after a bandwidth-based drop check.booleanTunnelGateway.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).booleanTunnelGatewayZeroHop.add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) Add a message to be sent down the tunnel (immediately forwarding it to theInboundMessageDistributororOutboundMessageDistributor, as necessary).booleanTunnelDispatcher.dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, Hash targetPeer) Dispatch an outbound message through a tunnel.booleanTunnelDispatcher.dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, TunnelId targetTunnel, Hash targetPeer) Dispatch an outbound message through a tunnel.voidInboundMessageDistributor.distribute(I2NPMessage msg, Hash target) Distribute the message to the target, with no tunnel ID.voidInboundMessageDistributor.distribute(I2NPMessage msg, Hash target, TunnelId tunnel) Distribute the message to the target, giving the tunnel ID for remote delivery.voidOutboundMessageDistributor.distribute(I2NPMessage msg, Hash target) Warning - as of 0.9.63, msg will be an UnknownI2NPMessage, and must be converted before handling locally.voidOutboundMessageDistributor.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.private voidOutboundMessageDistributor.distribute(I2NPMessage msg, RouterInfo target, TunnelId tunnel) Warning - as of 0.9.63, msg will be an UnknownI2NPMessage, and must be converted before handling locally.private static intOutboundGatewayMessage.getPriority(I2NPMessage message) This is just for priority in the queue waiting for the fragmenter.voidInboundMessageDistributor.handleClove(DeliveryInstructions instructions, I2NPMessage data) Handle a clove removed from the garlic message.voidFragmentHandler.DefragmentedReceiver.receiveComplete(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) Receive a fully formed I2NPMessage out of the tunnel.voidOutboundTunnelEndpoint.DefragmentedHandler.receiveComplete(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) Warning - as of 0.9.63, msg will be an UnknownI2NPMessage, and must be converted before handling locally.voidTunnelParticipant.DefragmentedHandler.receiveComplete(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) Distribute the complete message to its target.Constructors in net.i2p.router.tunnel with parameters of type I2NPMessageModifierConstructorDescriptionDistributeJob(RouterContext ctx, I2NPMessage msg, Hash target, TunnelId id) Builds the distribution job.OutboundGatewayMessage(I2NPMessage message, Hash toRouter, TunnelId toTunnel) Caches the message priority, which the fragmenter queue orders by.PendingGatewayMessage(I2NPMessage message, Hash toRouter, TunnelId toTunnel) Stores the message data, destination, and expiration for a pending send.Uses of I2NPMessage in net.i2p.router.tunnel.pool
Methods in net.i2p.router.tunnel.pool with parameters of type I2NPMessageModifier and TypeMethodDescriptionBuildHandler.TunnelBuildMessageHandlerJobBuilder.createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) Either from or fromHash may be null, but both should be null only if we're to be a IBGW and it came from us as a OBEP.BuildHandler.TunnelBuildReplyMessageHandlerJobBuilder.createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) private static booleanBuildRequestor.handleInboundBuild(RouterContext ctx, PooledTunnelCreatorConfig cfg, TunnelInfo pairedTunnel, I2NPMessage msgIn, BuildExecutor exec, Log log) Dispatch an inbound build request through the paired tunnel, garlic-wrapping the ShortTBM when the IBGW differs from the paired tunnel's endpoint so the IBGW identity stays hidden.private static voidBuildRequestor.handleOutboundBuild(RouterContext ctx, PooledTunnelCreatorConfig cfg, TunnelInfo pairedTunnel, I2NPMessage msg, BuildExecutor exec, Log log, long firstHopTimeout) Builds and sends the records for one outbound tunnel.booleanTestJob.ReplySelector.isMatch(I2NPMessage m) private booleanTestJob.sendTest(I2NPMessage m, int testPeriod, TestJob.RoundToken token) Send the tunnel test message through the selected tunnels.voidTestJob.OnTestReply.setMessage(I2NPMessage message) Record the arrival time of the reply message.Constructors in net.i2p.router.tunnel.pool with parameters of type I2NPMessageModifierConstructorDescriptionThe tunnel config, message, and receive time of a build end reply.BuildMessageState(RouterContext ctx, I2NPMessage m, RouterIdentity f, Hash h) Either f or h may be null, but both should be null only if we're to be a IBGW and it came from us as a OBEP.The reply message and the time it was received.