## net.i2p.router.tunnel
Class TunnelDispatcher

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

All Implemented Interfaces:
  Service

    public class TunnelDispatcher

extends java.lang.Object
implements Service

Handle the actual processing and forwarding of messages through the various tunnels.

Constructor Summary
`TunnelDispatcher(RouterContext ctx)` Creates a new instance of TunnelDispatcher

Method Summary
`void` `dispatch(TunnelDataMessage msg, Hash recvFrom)` We are participating in a tunnel (perhaps we're even the endpoint), so take the message and do what it says.
`void` `dispatch(TunnelGatewayMessage msg)` We are the inbound tunnel gateway, so encrypt it as necessary and forward it on.
`void` `dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, Hash targetPeer)` We are the outbound tunnel gateway (we created it), so wrap up this message with instructions to be forwarded to the targetPeer when it reaches the endpoint.
`void` `dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, TunnelId targetTunnel, Hash targetPeer)` We are the outbound tunnel gateway (we created it), so wrap up this message with instructions to be forwarded to the targetTunnel on the targetPeer when it reaches the endpoint.
`void` `dropBiggestParticipating()` If a router is too overloaded to build its own tunnels, the build executor may call this.
`long` `getLastParticipatingExpiration()` what is the date/time on which the last non-locally-created tunnel expires?
`int` `getParticipatingCount()`
`void` `joinInbound(TunnelCreatorConfig cfg)` We are the inbound endpoint - we created this tunnel
`void` `joinInboundGateway(HopConfig cfg)` We are the inbound gateway in this tunnel, and did not create it
`void` `joinOutbound(TunnelCreatorConfig cfg)` We are the outbound gateway - we created this tunnel
`void` `joinOutboundEndpoint(HopConfig cfg)` We are the outbound endpoint in this tunnel, and did not create it
`void` `joinParticipant(HopConfig cfg)` We are a participant in this tunnel, but not as the endpoint or gateway
`java.util.List` `listParticipatingTunnels()`
`void` `remove(HopConfig cfg)` No longer participate in the tunnel that someone asked us to be a member of
`void` `remove(TunnelCreatorConfig cfg)` We no longer want to participate in this tunnel that we created
`void` `renderStatusHTML(java.io.Writer out)`
`void` `restart()` Perform a soft restart.
`void` `shutdown()` Instruct the service that the router is shutting down and that it should do whatever is necessary to go down gracefully.
`void` `startup()` Instruct the service that it should start normal operation.

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

Constructor Detail

### TunnelDispatcher

    public TunnelDispatcher(RouterContext ctx)

  Creates a new instance of TunnelDispatcher

Method Detail

### joinOutbound

    public void joinOutbound(TunnelCreatorConfig cfg)

  We are the outbound gateway - we created this tunnel

### joinInbound

    public void joinInbound(TunnelCreatorConfig cfg)

  We are the inbound endpoint - we created this tunnel

### joinParticipant

    public void joinParticipant(HopConfig cfg)

  We are a participant in this tunnel, but not as the endpoint or gateway

### joinOutboundEndpoint

    public void joinOutboundEndpoint(HopConfig cfg)

  We are the outbound endpoint in this tunnel, and did not create it

### joinInboundGateway

    public void joinInboundGateway(HopConfig cfg)

  We are the inbound gateway in this tunnel, and did not create it

### getParticipatingCount

    public int getParticipatingCount()

### getLastParticipatingExpiration

    public long getLastParticipatingExpiration()

  what is the date/time on which the last non-locally-created tunnel expires?

### remove

    public void remove(TunnelCreatorConfig cfg)

  We no longer want to participate in this tunnel that we created

### remove

    public void remove(HopConfig cfg)

  No longer participate in the tunnel that someone asked us to be a member of

### dispatch

    public void dispatch(TunnelDataMessage msg,
                         Hash recvFrom)

  We are participating in a tunnel (perhaps we're even the endpoint), so take the message and do what it says. If there are later hops, that means encrypt a layer and forward it on. If there aren't later hops, how we handle it depends upon whether we created it or not. If we didn't, simply honor the instructions. If we did, unwrap all the layers of encryption and honor those instructions (within reason).

### dispatch

    public void dispatch(TunnelGatewayMessage msg)

  We are the inbound tunnel gateway, so encrypt it as necessary and forward it on.

### dispatchOutbound

    public void dispatchOutbound(I2NPMessage msg,
                                 TunnelId outboundTunnel,
                                 Hash targetPeer)

  We are the outbound tunnel gateway (we created it), so wrap up this message with instructions to be forwarded to the targetPeer when it reaches the endpoint.

  Parameters:
    `msg` - raw message to deliver to the target peer
    `outboundTunnel` - tunnel to send the message out
    `targetPeer` - peer to receive the message

### dispatchOutbound

    public void dispatchOutbound(I2NPMessage msg,
                                 TunnelId outboundTunnel,
                                 TunnelId targetTunnel,
                                 Hash targetPeer)

  We are the outbound tunnel gateway (we created it), so wrap up this message with instructions to be forwarded to the targetTunnel on the targetPeer when it reaches the endpoint.

  Parameters:
    `msg` - raw message to deliver to the targetTunnel on the targetPeer
    `outboundTunnel` - tunnel to send the message out
    `targetTunnel` - tunnel on the targetPeer to deliver the message to
    `targetPeer` - gateway to the tunnel to receive the message

### listParticipatingTunnels

    public java.util.List listParticipatingTunnels()

### dropBiggestParticipating

    public void dropBiggestParticipating()

  If a router is too overloaded to build its own tunnels, the build executor may call this.

### startup

    public void startup()

  Description copied from interface: `Service`
  Instruct the service that it should start normal operation. This call DOES block until the service is ready.

  Specified by:
    `startup` in interface `Service`

### shutdown

    public void shutdown()

  Description copied from interface: `Service`
  Instruct the service that the router is shutting down and that it should do whatever is necessary to go down gracefully. It should not depend on other components at this point. This call DOES block.

  Specified by:
    `shutdown` in interface `Service`

### restart

    public void restart()

  Description copied from interface: `Service`
  Perform a soft restart.

  Specified by:
    `restart` in interface `Service`

### renderStatusHTML

    public void renderStatusHTML(java.io.Writer out)
                          throws java.io.IOException

  Specified by:
    `renderStatusHTML` in interface `Service`
  Throws:
    `java.io.IOException`