Class TransportImpl

java.lang.Object
net.i2p.router.transport.TransportImpl
All Implemented Interfaces:
Transport
Direct Known Subclasses:
NTCPTransport, UDPTransport

public abstract class TransportImpl extends Object implements Transport
Defines a way to send a message to another peer and start listening for messages
  • Field Details

  • Constructor Details

    • TransportImpl

      public TransportImpl(RouterContext context)
      Initialize the new transport
  • Method Details

    • countPeers

      public abstract int countPeers()
      How many peers are we connected to?
      Specified by:
      countPeers in interface Transport
    • countActivePeers

      public abstract int countActivePeers()
      How many peers are we currently connected to, that we have sent a message to or received a message from in the last five minutes.
      Specified by:
      countActivePeers in interface Transport
    • countActiveSendPeers

      public abstract int countActiveSendPeers()
      How many peers are we currently connected to, that we have sent a message to in the last minute. Unused for anything, to be removed.
      Specified by:
      countActiveSendPeers in interface Transport
    • getMaxConnections

      public int getMaxConnections()
      Per-transport connection limit
    • haveCapacity

      public boolean haveCapacity()
      Can we initiate or accept a connection to another peer, saving some margin
      Specified by:
      haveCapacity in interface Transport
    • haveCapacity

      public boolean haveCapacity(int pct)
      Specified by:
      haveCapacity in interface Transport
      Parameters:
      pct - are we under x% 0-100
    • getClockSkews

      public List<Long> getClockSkews()
      Return our peer clock skews on a transport. List composed of Long, each element representing a peer skew in seconds. Dummy version. Transports override it.
      Specified by:
      getClockSkews in interface Transport
    • getMostRecentErrorMessages

      public List<String> getMostRecentErrorMessages()
      Specified by:
      getMostRecentErrorMessages in interface Transport
    • getNextMessage

      protected OutNetMessage getNextMessage()
      Nonblocking call to pull the next outbound message off the queue. Only used by NTCP. SSU does not call.
      Returns:
      the next message or null if none are available
    • afterSend

      protected void afterSend(OutNetMessage msg, boolean sendSuccessful)
      The transport is done sending this message
      Parameters:
      msg - message in question
      sendSuccessful - true if the peer received it
    • afterSend

      protected void afterSend(OutNetMessage msg, boolean sendSuccessful, boolean allowRequeue)
      The transport is done sending this message
      Parameters:
      msg - message in question
      sendSuccessful - true if the peer received it
      allowRequeue - true if we should try other transports if available
    • afterSend

      protected void afterSend(OutNetMessage msg, boolean sendSuccessful, long msToSend)
      The transport is done sending this message
      Parameters:
      msg - message in question
      sendSuccessful - true if the peer received it
      msToSend - how long it took to transfer the data to the peer
    • afterSend

      protected void afterSend(OutNetMessage msg, boolean sendSuccessful, boolean allowRequeue, long msToSend)
      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.
      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
    • send

      public void send(OutNetMessage msg)
      Asynchronously send the message as requested in the message and, if the send is successful, queue up any msg.getOnSendJob job, and register it with the OutboundMessageRegistry (if it has a reply selector). If the send fails, queue up any msg.getOnFailedSendJob Only used by NTCP. SSU overrides. Note that this adds to the queue and then takes it back off in the same thread, so it actually blocks, and we don't need a big queue. TODO: Override in NTCP also and get rid of queue?
      Specified by:
      send in interface Transport
    • outboundMessageReady

      protected abstract 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. SSU throws UOE.
    • messageReceived

      public void messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived)
      Message received from the I2NPMessageReader - send it to the listener
      Parameters:
      inMsg - non-null
      remoteIdent - may be null
      remoteIdentHash - may be null, calculated from remoteIdent if null
    • getCurrentAddresses

      public List<RouterAddress> getCurrentAddresses()
      What addresses are we currently listening to? Replaces getCurrentAddress()
      Specified by:
      getCurrentAddresses in interface Transport
      Returns:
      all addresses, non-null
      Since:
      IPv6
    • getCurrentAddress

      public RouterAddress getCurrentAddress(boolean ipv6)
      What address are we currently listening to? Replaces getCurrentAddress() Note: An address without a host is considered IPv4.
      Specified by:
      getCurrentAddress in interface Transport
      Parameters:
      ipv6 - true for IPv6 only; false for IPv4 only
      Returns:
      first matching address or null
      Since:
      IPv6
    • hasCurrentAddress

      public boolean hasCurrentAddress()
      Do we have any current address?
      Specified by:
      hasCurrentAddress in interface Transport
      Since:
      IPv6
    • updateAddress

      public List<RouterAddress> updateAddress()
      Ask the transport to update its address based on current information and return it Transports should override.
      Specified by:
      updateAddress in interface Transport
      Returns:
      all addresses, non-null
      Since:
      0.7.12
    • replaceAddress

      protected void replaceAddress(RouterAddress address)
      Replace any existing addresses for the current transport with the same IP length (4 or 16) with the given one. TODO: Allow multiple addresses of the same length. Calls listener.transportAddressChanged() To remove all IPv4 or IPv6 addresses, use removeAddress(boolean).
      Parameters:
      address - null to remove all
    • removeAddress

      protected void removeAddress(RouterAddress address)
      Remove only this address. Calls listener.transportAddressChanged(). To remove all IPv4 or IPv6 addresses, use removeAddress(boolean). To remove all IPv4 and IPv6 addresses, use replaceAddress(null).
      Since:
      0.9.20
    • removeAddress

      protected void removeAddress(boolean ipv6)
      Remove all existing addresses with the specified IP length (4 or 16). Calls listener.transportAddressChanged(). To remove all IPv4 and IPv6 addresses, use replaceAddress(null).
      Parameters:
      ipv6 - true to remove all IPv6 addresses, false to remove all IPv4 addresses
      Since:
      0.9.20
    • saveLocalAddress

      protected void saveLocalAddress(InetAddress address)
      Save a local address we were notified about before we started.
      Since:
      IPv6
    • getSavedLocalAddresses

      protected Collection<InetAddress> getSavedLocalAddresses()
      Return and then clear all saved local addresses.
      Since:
      IPv6
    • getTargetAddresses

      public List<RouterAddress> getTargetAddresses(RouterInfo target)
      Get all available address we can use, shuffled and then sorted by cost/preference. Lowest cost (most preferred) first.
      Returns:
      non-null, possibly empty
      Since:
      IPv6, public since 0.9.50, was protected
    • externalAddressReceived

      public abstract void externalAddressReceived(Transport.AddressSource source, byte[] ip, int port)
      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 before startListening() to set an initial address, or after the transport is running.
      Specified by:
      externalAddressReceived in interface Transport
      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
    • 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) This implementation does nothing. Transports should override if they want notification.
      Specified by:
      externalAddressRemoved in interface Transport
      Parameters:
      source - defined in Transport.java
      Since:
      0.9.20
    • forwardPortStatus

      public void forwardPortStatus(byte[] ip, int port, int externalPort, boolean success, String reason)
      Notify a transport of the results of trying to forward a port. This implementation does nothing. Transports should override if they want notification.
      Specified by:
      forwardPortStatus in interface Transport
      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()
      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
      Returns:
      port or -1 for none or 0 for any
    • setListener

      public void setListener(TransportEventListener listener)
      Who to notify on message availability
      Specified by:
      setListener in interface Transport
    • renderStatusHTML

      public void renderStatusHTML(Writer out) throws IOException
      Make this stuff pretty (only used in the old console)
      Throws:
      IOException
    • renderStatusHTML

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

      public abstract CommSystemFacade.Status getReachabilityStatus()
      Previously returned short, now enum as of 0.9.20
      Specified by:
      getReachabilityStatus in interface Transport
    • recheckReachability

      @Deprecated public void recheckReachability()
      Deprecated.
      unused
      Specified by:
      recheckReachability in interface Transport
    • isIPv4Firewalled

      public boolean isIPv4Firewalled()
      This returns true if the force-firewalled setting is configured, false otherwise.
      Specified by:
      isIPv4Firewalled in interface Transport
      Since:
      0.9.20, public since 0.9.30
    • isIPv6Firewalled

      public boolean isIPv6Firewalled()
      This returns true if the force-firewalled setting is configured, false otherwise.
      Specified by:
      isIPv6Firewalled in interface Transport
      Since:
      0.9.27, public since 0.9.30
    • isBacklogged

      public boolean isBacklogged(Hash peer)
      Specified by:
      isBacklogged in interface Transport
    • isEstablished

      public boolean isEstablished(Hash peer)
      Specified by:
      isEstablished in interface Transport
    • 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
      Since:
      0.9.24
    • isUnreachable

      public boolean isUnreachable(Hash peer)
      Specified by:
      isUnreachable in interface Transport
    • markUnreachable

      public void markUnreachable(Hash peer)
      called when we can't reach a peer
    • markReachable

      public void markReachable(Hash peer, boolean isInbound)
      called when we establish a peer connection (outbound or inbound)
    • wasUnreachable

      public boolean wasUnreachable(Hash peer)
      Was the peer UNreachable (outbound only) the last time we tried it? This is NOT reset if the peer contacts us.
      Specified by:
      wasUnreachable in interface Transport
    • allowLocal

      public boolean allowLocal()
      Are we allowed to connect to local addresses?
      Since:
      0.9.28 moved from UDPTransport
    • setIP

      public void setIP(Hash peer, byte[] ip)
      IP of the peer from the last connection (in or out, any transport).
      Parameters:
      ip - IPv4 or IPv6, non-null
    • getIP

      public static byte[] getIP(Hash peer)
      IP of the peer from the last connection (in or out, any transport).
      Returns:
      IPv4 or IPv6 or null
    • getAltStyle

      public String getAltStyle()
      An alternate supported style, or null.
      Returns:
      null, override to add support
      Since:
      0.9.35
    • clearCaches

      static void clearCaches()
      Since:
      0.9.3
    • getIPv6Config

      public TransportUtil.IPv6Config getIPv6Config()
      Specified by:
      getIPv6Config in interface Transport
      Since:
      IPv6, public since 0.9.30
    • isPubliclyRoutable

      protected boolean isPubliclyRoutable(byte[] addr)
      Allows IPv6 only if the transport is configured for it. Caller must check if we actually have a public IPv6 address.
      Parameters:
      addr - non-null
    • _t

      protected String _t(String s)
      Translate
      Since:
      0.9.8 moved from transports
    • _t

      protected String _t(String s, Object o)
      Translate
      Since:
      0.9.8 moved from transports
    • ngettext

      protected String ngettext(String s, String p, int n)
      Translate
      Since:
      0.9.8