Class UDPTransport

    • Field Detail

      • DEFAULT_INTERNAL_PORT

        @Deprecated
        public static final int DEFAULT_INTERNAL_PORT
        Deprecated.
        unused
        now unused, we pick a random port
        See Also:
        Constant Field Values
      • PROP_EXTERNAL_HOST

        public static final String PROP_EXTERNAL_HOST
        define this to explicitly set an external IP address
        See Also:
        Constant Field Values
      • PROP_EXTERNAL_PORT

        public static final String PROP_EXTERNAL_PORT
        define this to explicitly set an external port
        See Also:
        Constant Field Values
      • PROP_PREFER_UDP

        public static final String PROP_PREFER_UDP
        If i2np.udp.preferred is set to "always", the UDP bids will always be under the bid from the TCP transport - even if a TCP connection already exists. If it is set to "true", it will prefer UDP unless no UDP session exists and a TCP connection already exists. If it is set to "false" (the default), it will prefer TCP unless no TCP session exists and a UDP connection already exists.
        See Also:
        Constant Field Values
      • DEFAULT_SOURCES

        public static final String DEFAULT_SOURCES
      • PROP_FORCE_INTRODUCERS

        public static final String PROP_FORCE_INTRODUCERS
        do we require introducers, regardless of our status?
        See Also:
        Constant Field Values
      • PROP_ALLOW_DIRECT

        public static final String PROP_ALLOW_DIRECT
        do we allow direct SSU connections, sans introducers?
        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
      • PUBLIC_RELAY_COUNT

        public static final int PUBLIC_RELAY_COUNT
        how many relays offered to us will we use at a time?
        See Also:
        Constant Field Values
      • RATES

        static final long[] RATES
      • INTRODUCER_EXPIRATION_MARGIN

        static final long INTRODUCER_EXPIRATION_MARGIN
        See Also:
        Constant Field Values
      • EXPIRE_TIMEOUT

        public static final int EXPIRE_TIMEOUT
        We used to have MAX_IDLE_TIME = 5m, but this causes us to drop peers and lose the old introducer tags, causing introduction fails, so we keep the max time long to give the introducer keepalive code in the IntroductionManager a chance to work.
        See Also:
        Constant Field Values
    • Method Detail

      • shutdown

        public void shutdown()
      • fail

        public void fail​(UDPEndpoint endpoint)
        The endpoint has failed. Remove it.
        Since:
        0.9.16
      • getIntroKey

        SessionKey getIntroKey()
        Introduction key that people should use to contact us
      • getExternalPort

        int getExternalPort​(boolean ipv6)
        Published or requested port
      • getExternalIP

        byte[] getExternalIP()
        Published IP, IPv4 only
        Returns:
        IP or null
        Since:
        0.9.2
      • hasIPv6Address

        boolean hasIPv6Address()
        For PeerTestManager
        Since:
        0.9.30
      • isTooClose

        boolean isTooClose​(byte[] ip)
        Is this IP too close to ours to trust it for things like relaying?
        Parameters:
        ip - IPv4 or IPv6
        Since:
        IPv6
      • getRequestedPort

        public int getRequestedPort()
        The current or configured internal IPv4 port. UDPEndpoint should always be instantiated (and a random port picked if not configured) before this is called, so the returned value should be > 0 unless the endpoint failed to bind.
        Specified by:
        getRequestedPort in interface Transport
        Overrides:
        getRequestedPort in class TransportImpl
        Returns:
        port or -1 for none or 0 for any
      • getMTU

        public int getMTU​(boolean ipv6)
        The MTU for the socket interface. To be used as the "large" MTU.
        Returns:
        limited to range PeerState.MIN_MTU to PeerState.LARGE_MTU.
        Since:
        0.9.2, public since 0.9.31
      • inboundConnectionReceived

        void inboundConnectionReceived​(boolean isIPv6)
      • externalAddressReceived

        public void externalAddressReceived​(Transport.AddressSource source,
                                            byte[] ip,
                                            int port)
        From config, UPnP, local i/f, ... Not for info received from peers - see externalAddressReceived(Hash, ip, port)
        Specified by:
        externalAddressReceived in interface Transport
        Specified by:
        externalAddressReceived in class TransportImpl
        Parameters:
        source - as defined in Transport.SOURCE_xxx
        ip - publicly routable IPv4 or IPv6, null ok
        port - 0 if unknown
      • forwardPortStatus

        public void forwardPortStatus​(byte[] ip,
                                      int port,
                                      int externalPort,
                                      boolean success,
                                      String reason)
        Callback from UPnP. If we we have an IP address and UPnP claims success, believe it. If this is wrong, the peer test will figure it out and change the status. Don't do anything if UPnP claims failure.
        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.
      • externalAddressReceived

        void externalAddressReceived​(Hash from,
                                     byte[] ourIP,
                                     int ourPort)
        Someone we tried to contact gave us what they think our IP address is. Right now, we just blindly trust them, changing our IP and port on a whim. this is not good ;) Slight enhancement - require two different peers in a row to agree Todo: - Much better tracking of troublemakers - Disable if we have good local address or UPnP - This gets harder if and when we publish multiple addresses, or IPv6
        Parameters:
        from - Hash of inbound destination
        ourIP - publicly routable IPv4 or IPv6 only, non-null
        ourPort - >= 1024
      • isValid

        public final boolean isValid​(byte[] addr)
        An IPv6 address is only valid if we are configured to support IPv6 AND we have a public IPv6 address.
        Parameters:
        addr - may be null, returns false
      • getPeerState

        PeerState getPeerState​(RemoteHostId hostInfo)
        get the state for the peer at the given remote host/port, or null if no state exists
      • getPeerStatesByIP

        List<PeerState> getPeerStatesByIP​(RemoteHostId hostInfo)
        Get the states for all peers at the given remote host, ignoring port. Used for a last-chance search for a peer that changed port, by PacketHandler. Always returns empty list for IPv6 hostInfo.
        Since:
        0.9.3
      • getPeerState

        PeerState getPeerState​(Hash remotePeer)
        get the state for the peer with the given ident, or null if no state exists
      • getPeers

        public Collection<PeerState> 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.
        Specified by:
        getEstablished in interface Transport
        Returns:
        not a copy, do not modify
        Since:
        0.9.34
      • changePeerPort

        void changePeerPort​(PeerState peer,
                            int newPort)
        Remove and add to peersByRemoteHost map
        Since:
        0.9.3
      • getEstablisher

        EstablishmentManager getEstablisher()
        For IntroductionManager
        Returns:
        may be null if not started
        Since:
        0.9.2
      • addRemotePeerState

        boolean addRemotePeerState​(PeerState peer)
        add the peer info, returning true if it went in properly, false if it was rejected (causes include peer ident already connected, or no remote host info known
      • messageReceived

        public void messageReceived​(I2NPMessage inMsg,
                                    RouterIdentity remoteIdent,
                                    Hash remoteIdentHash,
                                    long msToReceive,
                                    int bytesReceived)
        infinite loop public RouterAddress getCurrentAddress() { if (needsRebuild()) rebuildExternalAddress(false); return super.getCurrentAddress(); }
        Overrides:
        messageReceived in class TransportImpl
        Parameters:
        inMsg - non-null
        remoteIdent - may be null
        remoteIdentHash - may be null, calculated from remoteIdent if null
      • dropPeer

        void dropPeer​(Hash peer,
                      boolean shouldBanlist,
                      String why)
        This does not send a session destroy, caller must do that if desired.
        Parameters:
        shouldBanlist - doesn't really, only sets unreachable
      • dropPeer

        void dropPeer​(PeerState peer,
                      boolean shouldBanlist,
                      String why)
        This does not send a session destroy, caller must do that if desired.
        Parameters:
        shouldBanlist - doesn't really, only sets unreachable
      • send

        void send​(UDPPacket packet)
        This sends it directly out, bypassing OutboundMessageFragments. The only queueing is for the bandwidth limiter. BLOCKING if OB queue is full.
      • sendDestroy

        void sendDestroy​(PeerState peer)
        Send a session destroy message, bypassing OMF and PacketPusher. BLOCKING if OB queue is full.
        Since:
        0.8.9
      • bid

        public TransportBid bid​(RouterInfo toAddress,
                                int dataSize)
        Specified by:
        bid in interface Transport
        dataSize - assumes full 16-byte header, transports should adjust as necessary
        Returns:
        a bid or null if unwilling to send
      • getTargetAddress

        RouterAddress getTargetAddress​(RouterInfo target)
        Get first available address we can use.
        Returns:
        address or null
        Since:
        0.9.6
      • getStyle

        public String getStyle()
        Description copied from interface: Transport
        The unique identity of this Transport
        Specified by:
        getStyle in interface Transport
      • send

        public void send​(OutNetMessage msg)
        Description copied from class: TransportImpl
        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
        Overrides:
        send in class TransportImpl
      • sendIfEstablished

        void sendIfEstablished​(OutNetMessage msg)
        Send only if established, otherwise fail immediately. Never queue with the establisher.
        Since:
        0.9.2
      • send

        void send​(I2NPMessage msg,
                  PeerState peer)
        "injected" message from the EstablishmentManager. If you have multiple messages, use the list variant, so the messages may be bundled efficiently.
        Parameters:
        peer - all messages MUST be going to this peer
      • send

        void 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. Called at end of outbound establishment.
        Parameters:
        msg - may be null if nothing to inject
        msgs - non-null, may be empty
        peer - all messages MUST be going to this peer
        Since:
        0.9.24
      • send

        void send​(List<I2NPMessage> msgs,
                  PeerState peer)
        "injected" messages from the EstablishmentManager. Called at end of inbound establishment.
        Parameters:
        peer - all messages MUST be going to this peer
        Since:
        0.9.24
      • 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
      • updateAddress

        public List<RouterAddress> updateAddress()
        Rebuild to get updated cost and introducers. IPv4 only, unless configured as IPv6 only. Do not tell the router (he is the one calling this)
        Specified by:
        updateAddress in interface Transport
        Overrides:
        updateAddress in class TransportImpl
        Returns:
        all addresses, non-null
        Since:
        0.7.12
      • getCurrentExternalAddress

        public RouterAddress getCurrentExternalAddress​(boolean isIPv6)
        Simple fetch of stored IP and port, since we don't put them in the real, published RouterAddress anymore if we are firewalled.
        Since:
        0.9.18, public for PacketBuilder and TransportManager since 0.9.50
      • replaceAddress

        protected void replaceAddress​(RouterAddress address)
        Replace then tell NTCP that we changed.
        Overrides:
        replaceAddress in class TransportImpl
        Parameters:
        address - the new address or null to remove all
      • removeAddress

        protected void removeAddress​(boolean ipv6)
        Remove then tell NTCP that we changed.
        Overrides:
        removeAddress in class TransportImpl
        Parameters:
        ipv6 - true to remove all IPv6 addresses, false to remove all IPv4 addresses
        Since:
        0.9.20
      • introducersMaybeRequired

        boolean introducersMaybeRequired​(boolean ipv6)
        MIGHT we require introducers? This is like introducersRequired, but if we aren't sure, this returns true. Used only by EstablishmentManager.
        Since:
        0.9.24
      • canIntroduce

        boolean canIntroduce​(boolean ipv6)
        For EstablishmentManager.
        Since:
        0.9.3
      • getPacketHandlerStatus

        String getPacketHandlerStatus()
      • countActivePeers

        public int countActivePeers()
        Description copied from class: TransportImpl
        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
        Specified by:
        countActivePeers in class TransportImpl
      • forceDisconnect

        public void forceDisconnect​(Hash peer)
        Tell the transport to disconnect from this peer.
        Specified by:
        forceDisconnect in interface Transport
        Since:
        0.9.38
      • allowConnection

        public boolean allowConnection()
      • 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
      • getDHBuilder

        DHSessionKeyBuilder getDHBuilder()
        Returns:
        a new DHSessionKeyBuilder
        Since:
        0.9
      • getHMAC

        HMACGenerator getHMAC()
        Returns:
        the SSU HMAC
        Since:
        0.9.42
      • setReachabilityStatus

        void setReachabilityStatus​(CommSystemFacade.Status status,
                                   boolean isIPv6)
        Parameters:
        isIPv6 - Is the change an IPv6 change?
        Since:
        0.9.27
      • pickTestPeer

        PeerState pickTestPeer​(PeerTestState.Role peerRole,
                               boolean isIPv6,
                               RemoteHostId dontInclude)
        Pick a Bob (if we are Alice) or a Charlie (if we are Bob). For Bob (as called from PeerTestEvent below), returns an established IPv4/v6 peer. While the protocol allows Alice to select an unestablished Bob, we don't support that. For Charlie (as called from PeerTestManager), returns an established IPv4 or IPv6 peer. (doesn't matter how Bob and Charlie communicate) Any returned peer must advertise an IPv4 address to prove it is IPv4-capable. Ditto for v6.
        Parameters:
        peerRole - The role of the peer we are looking for, BOB or CHARLIE only (NOT our role)
        isIPv6 - true to get a v6-capable peer back
        dontInclude - may be null
        Returns:
        IPv4 peer or null