Class NTCPTransport

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

public class NTCPTransport extends TransportImpl
The NIO TCP transport
  • Field Details

  • Constructor Details

  • Method Details

    • 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, int dataSize)
      Parameters:
      dataSize - assumes full 16-byte header, transports should adjust as necessary
      Returns:
      a bid or null if unwilling to send
    • 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
    • mayDisconnect

      public void mayDisconnect(Hash peer)
      Tell the transport that we may disconnect from this peer. This is advisory only.
      Specified by:
      mayDisconnect in interface Transport
      Overrides:
      mayDisconnect in class TransportImpl
      Since:
      0.9.24
    • forceDisconnect

      public void forceDisconnect(Hash peer)
      Tell the transport to disconnect from this peer.
      Since:
      0.9.38
    • removeCon

      Returns:
      usually the con passed in, but possibly a second connection with the same peer... only con or null as of 0.9.37
    • 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
    • getPeerCounts

      public int[] getPeerCounts()
      Returns:
      8 bytes: version 1 4 bytes all zeros version 2 ipv4 in/out, ipv6 in/out
      Since:
      0.9.57
    • getPeers

      public Collection<NTCPConnection> getPeers()
      For /peers UI only. Not a public API, not for external use.
      Returns:
      not a copy, do not modify
      Since:
      0.9.31
    • getEstablished

      public Set<Hash> getEstablished()
      Connected peers.
      Returns:
      a copy, modifiable
      Since:
      0.9.34
    • 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 List<Long> getClockSkews()
      Return our peer clock skews on this transport. List 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 - using first 8 bytes only
      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
      Returns:
      always "NTCP"
    • getAltStyle

      public String getAltStyle()
      An alternate supported style
      Overrides:
      getAltStyle in class TransportImpl
      Returns:
      "NTCP2" always
      Since:
      0.9.35
    • getPumper

      EventPumper getPumper()
      Hook for NTCPConnection
    • getXDHFactory

      X25519KeyFactory getXDHFactory()
      Returns:
      null if not configured for NTCP2
      Since:
      0.9.36
    • 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
    • getNTCP2StaticPubkey

      byte[] getNTCP2StaticPubkey()
      The static priv key
      Since:
      0.9.36
    • getNTCP2StaticPrivkey

      byte[] getNTCP2StaticPrivkey()
      The static priv key
      Since:
      0.9.35
    • getNTCP2StaticIV

      byte[] getNTCP2StaticIV()
      The static IV
      Since:
      0.9.36
    • 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
      Specified by:
      externalAddressReceived in class TransportImpl
      Parameters:
      source - defined in Transport.java
      ip - typ. IPv4 or IPv6 non-local; may be null to indicate IPv4 failure or port info only
      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

      @Deprecated public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException
      Deprecated.
      as of 0.9.31
      Does nothing
      Specified by:
      renderStatusHTML in interface Transport
      Overrides:
      renderStatusHTML in class TransportImpl
      Throws:
      IOException