net.i2p.router.transport.ntcp
Class NTCPTransport

java.lang.Object
  extended by net.i2p.router.transport.TransportImpl
      extended by net.i2p.router.transport.ntcp.NTCPTransport
All Implemented Interfaces:
Transport

public class NTCPTransport
extends TransportImpl

The NIO TCP transport


Nested Class Summary
 
Nested classes/interfaces inherited from interface net.i2p.router.transport.Transport
Transport.AddressSource
 
Field Summary
static int DEFAULT_COST
           
static int ESTABLISH_TIMEOUT
          how long from initial connection attempt (accept() or connect()) until the con must be established to avoid premature close()ing
static String MIN_SIGTYPE_VERSION
          RI sigtypes supported in 0.9.16
static String PROP_BIND_INTERFACE
          this is rarely if ever used, default is to bind to wildcard address
static String PROP_I2NP_NTCP_AUTO_IP
           
static String PROP_I2NP_NTCP_AUTO_PORT
           
static String PROP_I2NP_NTCP_HOSTNAME
           
static String PROP_I2NP_NTCP_PORT
           
static String STYLE
           
 
Fields inherited from class net.i2p.router.transport.TransportImpl
_context, _currentAddresses, ADJUST_COST, CONGESTION_COST_ADJUSTMENT
 
Constructor Summary
NTCPTransport(RouterContext ctx, DHSessionKeyBuilder.Factory dh)
           
 
Method Summary
 void afterSend(OutNetMessage msg, boolean sendSuccessful, boolean allowRequeue, long msToSend)
          The transport is done sending this message.
 boolean allowConnection()
           
 TransportBid bid(RouterInfo toAddress, long dataSize)
           
 int countActivePeers()
          How many peers have we talked to in the last 5 minutes? As of 0.9.20, actually returns active peer count, not total.
 int countActiveSendPeers()
          How many peers are we actively sending messages to (this minute)
 int countPeers()
          How many peers are we connected to?
(package private)  void establishing(NTCPConnection con)
          add us to the establishment timeout process
(package private)  void expireTimedOut()
          called in the EventPumper no more than once a second or so, closing any unconnected/unestablished connections
 void externalAddressReceived(Transport.AddressSource source, byte[] ip, int port)
          UDP changed addresses, tell NTCP and (possibly) restart
 void externalAddressRemoved(Transport.AddressSource source, boolean ipv6)
          Notify a transport of an external address change.
 void forwardPortStatus(byte[] ip, int port, int externalPort, boolean success, String reason)
          If we didn't used to be forwarded, and we have an address, and we are configured to use UPnP, update our RouterAddress Don't do anything now.
 Vector<Long> getClockSkews()
          Return our peer clock skews on this transport.
(package private)  DHSessionKeyBuilder getDHBuilder()
           
(package private)  EventPumper getPumper()
          Hook for NTCPConnection
 CommSystemFacade.Status getReachabilityStatus()
          Maybe we should trust UPnP here and report OK if it opened the port, but for now we don't.
(package private)  Reader getReader()
          Hook for NTCPConnection
 int getRequestedPort()
          What INTERNAL port would the transport like to have forwarded by UPnP.
 String getStyle()
          The unique identity of this Transport
(package private)  Writer getWriter()
          Hook for NTCPConnection
(package private)  NTCPConnection inboundEstablished(NTCPConnection con)
           
 boolean isAlive()
           
 boolean isBacklogged(Hash dest)
           
 boolean isEstablished(Hash dest)
           
(package private)  boolean isHXHIValid(byte[] hxhi)
          Incoming connection replay detection.
protected  void outboundMessageReady()
          This message is called whenever a new message is added to the send pool, and it should not block Only used by NTCP.
(package private)  NTCPConnection removeCon(NTCPConnection con)
           
 void renderStatusHTML(Writer out, int sortFlags)
           
 void renderStatusHTML(Writer out, String urlBase, int sortFlags)
           
(package private)  void returnUnused(DHSessionKeyBuilder builder)
          Return an unused DH key builder to be put back onto the queue for reuse.
(package private)  void sendComplete(OutNetMessage msg)
          queue up afterSend call, which can take some time w/ jobs, etc
(package private)  void setLastBadSkew(long skew)
          A positive number means our clock is ahead of theirs.
 void startListening()
          Called by TransportManager.
 void stopListening()
          This doesn't (completely) block, caller should check isAlive() before calling startListening() or restartListening()
 
Methods inherited from class net.i2p.router.transport.TransportImpl
_t, _t, afterSend, afterSend, afterSend, getCurrentAddress, getCurrentAddresses, getIP, getIPv6Config, getMaxConnections, getMostRecentErrorMessages, getNextMessage, getSavedLocalAddresses, getTargetAddresses, hasCurrentAddress, haveCapacity, haveCapacity, isIPv4Firewalled, isPubliclyRoutable, isUnreachable, markReachable, markUnreachable, messageReceived, ngettext, recheckReachability, removeAddress, removeAddress, renderStatusHTML, replaceAddress, saveLocalAddress, send, setIP, setListener, updateAddress, wasUnreachable
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

PROP_I2NP_NTCP_HOSTNAME

public static final String PROP_I2NP_NTCP_HOSTNAME
See Also:
Constant Field Values

PROP_I2NP_NTCP_PORT

public static final String PROP_I2NP_NTCP_PORT
See Also:
Constant Field Values

PROP_I2NP_NTCP_AUTO_PORT

public static final String PROP_I2NP_NTCP_AUTO_PORT
See Also:
Constant Field Values

PROP_I2NP_NTCP_AUTO_IP

public static final String PROP_I2NP_NTCP_AUTO_IP
See Also:
Constant Field Values

DEFAULT_COST

public static final int DEFAULT_COST
See Also:
Constant Field Values

PROP_BIND_INTERFACE

public static final String PROP_BIND_INTERFACE
this is rarely if ever used, default is to bind to wildcard address

See Also:
Constant Field Values

MIN_SIGTYPE_VERSION

public static final String MIN_SIGTYPE_VERSION
RI sigtypes supported in 0.9.16

See Also:
Constant Field Values

ESTABLISH_TIMEOUT

public static final int ESTABLISH_TIMEOUT
how long from initial connection attempt (accept() or connect()) until the con must be established to avoid premature close()ing

See Also:
Constant Field Values

STYLE

public static final String STYLE
See Also:
Constant Field Values
Constructor Detail

NTCPTransport

public NTCPTransport(RouterContext ctx,
                     DHSessionKeyBuilder.Factory dh)
Method Detail

inboundEstablished

NTCPConnection inboundEstablished(NTCPConnection con)
Parameters:
con - that is established
Returns:
the previous connection to the same peer, must be closed by caller, null if no such.

outboundMessageReady

protected void outboundMessageReady()
Description copied from class: TransportImpl
This message is called whenever a new message is added to the send pool, and it should not block Only used by NTCP. SSU throws UOE.

Specified by:
outboundMessageReady in class TransportImpl

afterSend

public void afterSend(OutNetMessage msg,
                      boolean sendSuccessful,
                      boolean allowRequeue,
                      long msToSend)
Description copied from class: TransportImpl
The transport is done sending this message. This is the method that actually does all of the cleanup - firing off jobs, requeueing, updating stats, etc.

Overrides:
afterSend in class TransportImpl
Parameters:
msg - message in question
sendSuccessful - true if the peer received it
allowRequeue - true if we should try other transports if available
msToSend - how long it took to transfer the data to the peer

bid

public TransportBid bid(RouterInfo toAddress,
                        long dataSize)

allowConnection

public boolean allowConnection()

sendComplete

void sendComplete(OutNetMessage msg)
queue up afterSend call, which can take some time w/ jobs, etc


isEstablished

public boolean isEstablished(Hash dest)
Specified by:
isEstablished in interface Transport
Overrides:
isEstablished in class TransportImpl

isBacklogged

public boolean isBacklogged(Hash dest)
Specified by:
isBacklogged in interface Transport
Overrides:
isBacklogged in class TransportImpl

removeCon

NTCPConnection removeCon(NTCPConnection con)
Returns:
usually the con passed in, but possibly a second connection with the same peer...

countPeers

public int countPeers()
Description copied from class: TransportImpl
How many peers are we connected to?

Specified by:
countPeers in interface Transport
Specified by:
countPeers in class TransportImpl

countActivePeers

public int countActivePeers()
How many peers have we talked to in the last 5 minutes? As of 0.9.20, actually returns active peer count, not total.

Specified by:
countActivePeers in interface Transport
Specified by:
countActivePeers in class TransportImpl

countActiveSendPeers

public int countActiveSendPeers()
How many peers are we actively sending messages to (this minute)

Specified by:
countActiveSendPeers in interface Transport
Specified by:
countActiveSendPeers in class TransportImpl

setLastBadSkew

void setLastBadSkew(long skew)
A positive number means our clock is ahead of theirs.

Parameters:
skew - in seconds

getClockSkews

public Vector<Long> getClockSkews()
Return our peer clock skews on this transport. Vector composed of Long, each element representing a peer skew in seconds. A positive number means our clock is ahead of theirs.

Specified by:
getClockSkews in interface Transport
Overrides:
getClockSkews in class TransportImpl

isHXHIValid

boolean isHXHIValid(byte[] hxhi)
Incoming connection replay detection. As there is no timestamp in the first message, we can't detect something long-delayed. To be fixed in next version of NTCP.

Parameters:
hxhi - 32 bytes
Returns:
valid
Since:
0.9.12

startListening

public void startListening()
Called by TransportManager. Caller should stop the transport first, then verify stopped with isAlive() Unfortunately TransportManager doesn't do that, so we check here to prevent two pumpers.


isAlive

public boolean isAlive()

getReader

Reader getReader()
Hook for NTCPConnection


getWriter

Writer getWriter()
Hook for NTCPConnection


getStyle

public String getStyle()
Description copied from interface: Transport
The unique identity of this Transport


getPumper

EventPumper getPumper()
Hook for NTCPConnection


getDHBuilder

DHSessionKeyBuilder getDHBuilder()
Since:
0.9

returnUnused

void returnUnused(DHSessionKeyBuilder builder)
Return an unused DH key builder to be put back onto the queue for reuse.

Parameters:
builder - must not have a peerPublicValue set
Since:
0.9.16

establishing

void establishing(NTCPConnection con)
add us to the establishment timeout process


expireTimedOut

void expireTimedOut()
called in the EventPumper no more than once a second or so, closing any unconnected/unestablished connections


externalAddressReceived

public void externalAddressReceived(Transport.AddressSource source,
                                    byte[] ip,
                                    int port)
UDP changed addresses, tell NTCP and (possibly) restart

Specified by:
externalAddressReceived in interface Transport
Overrides:
externalAddressReceived in class TransportImpl
Parameters:
ip - typ. IPv4 or IPv6 non-local; may be null to indicate IPv4 failure or port info only
source - defined in Transport.java
port - 0 for unknown or unchanged
Since:
IPv6 moved from CSFI.notifyReplaceAddress()

externalAddressRemoved

public void externalAddressRemoved(Transport.AddressSource source,
                                   boolean ipv6)
Notify a transport of an external address change. This may be from a local interface, UPnP, a config change, etc. This should not be called if the ip didn't change (from that source's point of view), or is a local address. May be called multiple times for IPv4 or IPv6. The transport should also do its own checking on whether to accept notifications from this source. This can be called after the transport is running. TODO externalAddressRemoved(source, ip, port)

Specified by:
externalAddressRemoved in interface Transport
Overrides:
externalAddressRemoved in class TransportImpl
Parameters:
source - defined in Transport.java
Since:
0.9.20

forwardPortStatus

public void forwardPortStatus(byte[] ip,
                              int port,
                              int externalPort,
                              boolean success,
                              String reason)
If we didn't used to be forwarded, and we have an address, and we are configured to use UPnP, update our RouterAddress Don't do anything now. If it fails, we don't know if it's because there is no firewall, or if the firewall rejected the request. So we just use the SSU reachability status to decide whether to enable inbound NTCP. SSU will have CSFI build a new NTCP address when it transitions to OK.

Specified by:
forwardPortStatus in interface Transport
Overrides:
forwardPortStatus in class TransportImpl
Parameters:
ip - may be null
port - the internal port
externalPort - the external port, which for now should always be the same as the internal port if the forwarding was successful.

getRequestedPort

public int getRequestedPort()
Description copied from class: TransportImpl
What INTERNAL port would the transport like to have forwarded by UPnP. This can't be passed via getCurrentAddress(), as we have to open the port before we can publish the address, and that's the external port anyway.

Specified by:
getRequestedPort in interface Transport
Overrides:
getRequestedPort in class TransportImpl
Returns:
current IPv4 port, else NTCP configured port, else -1 (but not UDP port if auto)

getReachabilityStatus

public CommSystemFacade.Status getReachabilityStatus()
Maybe we should trust UPnP here and report OK if it opened the port, but for now we don't. Just go through and if we have one inbound connection, we must be good. As we drop idle connections pretty quickly, this will be fairly accurate. We have to be careful here because much of the router console code assumes that the reachability status is really just the UDP status. This only returns OK, DISABLED, or UNKNOWN for IPv4 and IPv6. We leave the FIREWALLED status for UDP. Previously returned short, now enum as of 0.9.20

Specified by:
getReachabilityStatus in interface Transport
Specified by:
getReachabilityStatus in class TransportImpl

stopListening

public void stopListening()
This doesn't (completely) block, caller should check isAlive() before calling startListening() or restartListening()


renderStatusHTML

public void renderStatusHTML(Writer out,
                             int sortFlags)
                      throws IOException
Throws:
IOException

renderStatusHTML

public void renderStatusHTML(Writer out,
                             String urlBase,
                             int sortFlags)
                      throws IOException
Specified by:
renderStatusHTML in interface Transport
Overrides:
renderStatusHTML in class TransportImpl
Throws:
IOException