Package net.i2p.router.transport.udp
Class UDPTransport
java.lang.Object
net.i2p.router.transport.TransportImpl
net.i2p.router.transport.udp.UDPTransport
- All Implemented Interfaces:
Transport
,TimedWeightedPriorityMessageQueue.FailedListener
public class UDPTransport extends TransportImpl implements TimedWeightedPriorityMessageQueue.FailedListener
The SSU transport
-
Nested Class Summary
Nested classes/interfaces inherited from interface net.i2p.router.transport.Transport
Transport.AddressSource
-
Field Summary
Fields Modifier and Type Field Description static int
DEFAULT_COST
static int
DEFAULT_INTERNAL_PORT
Deprecated.unusedstatic String
DEFAULT_SOURCES
static 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.(package private) static long
INTRODUCER_EXPIRATION_MARGIN
static int
MIN_EXPIRE_TIMEOUT
static String
PROP_ALLOW_DIRECT
do we allow direct SSU connections, sans introducers?static String
PROP_BIND_INTERFACE
this is rarely if ever used, default is to bind to wildcard addressstatic String
PROP_EXTERNAL_HOST
define this to explicitly set an external IP addressstatic String
PROP_EXTERNAL_PORT
define this to explicitly set an external portstatic String
PROP_FORCE_INTRODUCERS
do we require introducers, regardless of our status?static String
PROP_INTERNAL_PORT
static String
PROP_INTRO_KEY
static String
PROP_IP
remember IP changesstatic String
PROP_IP_CHANGE
static String
PROP_IPV6
static String
PROP_LAPTOP_MODE
static 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.static String
PROP_SOURCES
allowed sources of address updatesstatic int
PUBLIC_RELAY_COUNT
how many relays offered to us will we use at a time?(package private) static long[]
RATES
static String
STYLE
Fields inherited from class net.i2p.router.transport.TransportImpl
_context, _currentAddresses, ADJUST_COST, CAP_IPV4, CAP_IPV4_IPV6, CAP_IPV6, CONGESTION_COST_ADJUSTMENT, PROP_IPV6_FIREWALLED
-
Constructor Summary
Constructors Constructor Description UDPTransport(RouterContext ctx, DHSessionKeyBuilder.Factory dh)
-
Method Summary
Modifier and Type Method Description (package private) 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 knownboolean
allowConnection()
TransportBid
bid(RouterInfo toAddress, int dataSize)
(package private) boolean
canIntroduce(boolean ipv6)
For EstablishmentManager.(package private) void
changePeerPort(PeerState peer, int newPort)
Remove and add to peersByRemoteHost mapint
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.int
countActiveSendPeers()
How many peers are we currently connected to, that we have sent a message to in the last minute.int
countPeers()
How many peers are we connected to?(package private) void
dropPeer(Hash peer, boolean shouldBanlist, String why)
This does not send a session destroy, caller must do that if desired.(package private) void
dropPeer(PeerState peer, boolean shouldBanlist, String why)
This does not send a session destroy, caller must do that if desired.(package private) void
externalAddressReceived(Hash from, byte[] ourIP, int ourPort)
Someone we tried to contact gave us what they think our IP address is.void
externalAddressReceived(Transport.AddressSource source, byte[] ip, int port)
From config, UPnP, local i/f, ...void
fail(UDPEndpoint endpoint)
The endpoint has failed.void
failed(OutNetMessage msg, String reason)
void
failed(OutboundMessageState msg)
(package private) void
failed(OutboundMessageState msg, boolean allowPeerFailure)
void
forceDisconnect(Hash peer)
Tell the transport to disconnect from this peer.void
forwardPortStatus(byte[] ip, int port, int externalPort, boolean success, String reason)
Callback from UPnP.List<Long>
getClockSkews()
Return our peer clock skews on this transport.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.(package private) DHSessionKeyBuilder
getDHBuilder()
(package private) DHSessionKeyBuilder.Factory
getDHFactory()
Set<Hash>
getEstablished()
Connected peers.(package private) EstablishmentManager
getEstablisher()
For IntroductionManager(package private) byte[]
getExternalIP()
Published IP, IPv4 only(package private) int
getExternalPort(boolean ipv6)
Published or requested port(package private) HMACGenerator
getHMAC()
(package private) SessionKey
getIntroKey()
Introduction key that people should use to contact usint
getMTU(boolean ipv6)
The MTU for the socket interface.(package private) OutboundMessageFragments
getOMF()
(package private) PacketHandler
getPacketHandler()
(package private) String
getPacketHandlerStatus()
Collection<PeerState>
getPeers()
For /peers UI only.(package private) PeerState
getPeerState(Hash remotePeer)
get the state for the peer with the given ident, or null if no state exists(package private) PeerState
getPeerState(RemoteHostId hostInfo)
get the state for the peer at the given remote host/port, or null if no state exists(package private) List<PeerState>
getPeerStatesByIP(RemoteHostId hostInfo)
Get the states for all peers at the given remote host, ignoring port.CommSystemFacade.Status
getReachabilityStatus()
Previously returned short, now enum as of 0.9.20int
getRequestedPort()
The current or configured internal IPv4 port.String
getStyle()
The unique identity of this Transport(package private) RouterAddress
getTargetAddress(RouterInfo target)
Get first available address we can use.(package private) boolean
hasIPv6Address()
For PeerTestManager(package private) void
inboundConnectionReceived(boolean isIPv6)
(package private) boolean
introducersMaybeRequired(boolean ipv6)
MIGHT we require introducers? This is like introducersRequired, but if we aren't sure, this returns true.boolean
isBacklogged(Hash dest)
boolean
isEstablished(Hash dest)
(package private) boolean
isInDropList(RemoteHostId peer)
(package private) boolean
isTooClose(byte[] ip)
Is this IP too close to ours to trust it for things like relaying?boolean
isValid(byte[] addr)
An IPv6 address is only valid if we are configured to support IPv6 AND we have a public IPv6 address.void
mayDisconnect(Hash peer)
Tell the transport that we may disconnect from this peer.void
messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived)
infinite loop public RouterAddress getCurrentAddress() { if (needsRebuild()) rebuildExternalAddress(false); return super.getCurrentAddress(); }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) PeerState
pickTestPeer(PeerTestState.Role peerRole, boolean isIPv6, RemoteHostId dontInclude)
Pick a Bob (if we are Alice) or a Charlie (if we are Bob).void
recheckReachability()
Deprecated.unusedprotected void
removeAddress(boolean ipv6)
Remove then tell NTCP that we changed.protected void
removeAddress(RouterAddress address)
Remove then tell NTCP that we changed.void
renderStatusHTML(Writer out, String urlBase, int sortFlags)
Deprecated.as of 0.9.31protected void
replaceAddress(RouterAddress address)
Replace then tell NTCP that we changed.(package private) void
send(List<I2NPMessage> msgs, PeerState peer)
"injected" messages from the EstablishmentManager.(package private) 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.(package private) void
send(I2NPMessage msg, PeerState peer)
"injected" message from the EstablishmentManager.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).(package private) void
send(UDPPacket packet)
This sends it directly out, bypassing OutboundMessageFragments.(package private) void
sendDestroy(PeerState peer)
Send a session destroy message, bypassing OMF and PacketPusher.(package private) void
sendIfEstablished(OutNetMessage msg)
Send only if established, otherwise fail immediately.(package private) void
setReachabilityStatus(CommSystemFacade.Status status, boolean isIPv6)
void
shutdown()
void
startListening()
void
stopListening()
void
succeeded(OutboundMessageState msg)
List<RouterAddress>
updateAddress()
Rebuild to get updated cost and introducers.Methods inherited from class net.i2p.router.transport.TransportImpl
_t, _t, afterSend, afterSend, afterSend, afterSend, allowLocal, externalAddressRemoved, getAltStyle, getCurrentAddress, getCurrentAddresses, getIP, getIPv6Config, getMaxConnections, getMostRecentErrorMessages, getNextMessage, getSavedLocalAddresses, getTargetAddresses, hasCurrentAddress, haveCapacity, haveCapacity, isIPv4Firewalled, isIPv6Firewalled, isPubliclyRoutable, isUnreachable, markReachable, markUnreachable, ngettext, renderStatusHTML, saveLocalAddress, setIP, setListener, wasUnreachable
-
Field Details
-
STYLE
- See Also:
- Constant Field Values
-
PROP_INTERNAL_PORT
- See Also:
- Constant Field Values
-
DEFAULT_INTERNAL_PORT
Deprecated.unusednow unused, we pick a random port- See Also:
- Constant Field Values
-
PROP_EXTERNAL_HOST
define this to explicitly set an external IP address- See Also:
- Constant Field Values
-
PROP_EXTERNAL_PORT
define this to explicitly set an external port- See Also:
- Constant Field Values
-
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
-
PROP_SOURCES
allowed sources of address updates- See Also:
- Constant Field Values
-
DEFAULT_SOURCES
-
PROP_IP
remember IP changes- See Also:
- Constant Field Values
-
PROP_IP_CHANGE
- See Also:
- Constant Field Values
-
PROP_LAPTOP_MODE
- See Also:
- Constant Field Values
-
PROP_IPV6
- Since:
- 0.9.43
- See Also:
- Constant Field Values
-
PROP_FORCE_INTRODUCERS
do we require introducers, regardless of our status?- See Also:
- Constant Field Values
-
PROP_ALLOW_DIRECT
do we allow direct SSU connections, sans introducers?- See Also:
- Constant Field Values
-
PROP_BIND_INTERFACE
this is rarely if ever used, default is to bind to wildcard address- See Also:
- Constant Field Values
-
PROP_INTRO_KEY
- Since:
- 0.9.48
- See Also:
- Constant Field Values
-
PUBLIC_RELAY_COUNT
public static final int PUBLIC_RELAY_COUNThow many relays offered to us will we use at a time?- See Also:
- Constant Field Values
-
DEFAULT_COST
public static final int DEFAULT_COST- 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_TIMEOUTWe 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
-
MIN_EXPIRE_TIMEOUT
public static final int MIN_EXPIRE_TIMEOUT- See Also:
- Constant Field Values
-
-
Constructor Details
-
Method Details
-
getOMF
OutboundMessageFragments getOMF()- Returns:
- the instance of OutboundMessageFragments
- Since:
- 0.9.48
-
shutdown
public void shutdown() -
fail
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 interfaceTransport
- Overrides:
getRequestedPort
in classTransportImpl
- 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
From config, UPnP, local i/f, ... Not for info received from peers - see externalAddressReceived(Hash, ip, port)- Specified by:
externalAddressReceived
in interfaceTransport
- Specified by:
externalAddressReceived
in classTransportImpl
- Parameters:
source
- as defined in Transport.SOURCE_xxxip
- publicly routable IPv4 or IPv6, null okport
- 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 interfaceTransport
- Overrides:
forwardPortStatus
in classTransportImpl
- Parameters:
ip
- may be nullport
- the internal portexternalPort
- the external port, which for now should always be the same as the internal port if the forwarding was successful.
-
externalAddressReceived
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 destinationourIP
- publicly routable IPv4 or IPv6 only, non-nullourPort
- >= 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
get the state for the peer at the given remote host/port, or null if no state exists -
getPeerStatesByIP
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
get the state for the peer with the given ident, or null if no state exists -
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
Connected peers.- Specified by:
getEstablished
in interfaceTransport
- Returns:
- not a copy, do not modify
- Since:
- 0.9.34
-
changePeerPort
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
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 classTransportImpl
- Parameters:
inMsg
- non-nullremoteIdent
- may be nullremoteIdentHash
- may be null, calculated from remoteIdent if null
-
isInDropList
-
dropPeer
This does not send a session destroy, caller must do that if desired.- Parameters:
shouldBanlist
- doesn't really, only sets unreachable
-
dropPeer
This does not send a session destroy, caller must do that if desired.- Parameters:
shouldBanlist
- doesn't really, only sets unreachable
-
send
This sends it directly out, bypassing OutboundMessageFragments. The only queueing is for the bandwidth limiter. BLOCKING if OB queue is full. -
sendDestroy
Send a session destroy message, bypassing OMF and PacketPusher. BLOCKING if OB queue is full.- Since:
- 0.8.9
-
bid
-
getTargetAddress
Get first available address we can use.- Returns:
- address or null
- Since:
- 0.9.6
-
getStyle
Description copied from interface:Transport
The unique identity of this Transport -
send
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 interfaceTransport
- Overrides:
send
in classTransportImpl
-
sendIfEstablished
Send only if established, otherwise fail immediately. Never queue with the establisher.- Since:
- 0.9.2
-
send
"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
"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 injectmsgs
- non-null, may be emptypeer
- all messages MUST be going to this peer- Since:
- 0.9.24
-
send
"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 classTransportImpl
-
startListening
public void startListening()- Specified by:
startListening
in interfaceTransport
-
stopListening
public void stopListening()- Specified by:
stopListening
in interfaceTransport
-
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 interfaceTransport
- Overrides:
updateAddress
in classTransportImpl
- Returns:
- all addresses, non-null
- Since:
- 0.7.12
-
getCurrentExternalAddress
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
Replace then tell NTCP that we changed.- Overrides:
replaceAddress
in classTransportImpl
- Parameters:
address
- the new address or null to remove all
-
removeAddress
Remove then tell NTCP that we changed.- Overrides:
removeAddress
in classTransportImpl
- Since:
- 0.9.20
-
removeAddress
protected void removeAddress(boolean ipv6)Remove then tell NTCP that we changed.- Overrides:
removeAddress
in classTransportImpl
- 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() -
getPacketHandler
PacketHandler getPacketHandler()- Since:
- IPv6
-
failed
-
failed
-
failed
- Specified by:
failed
in interfaceTimedWeightedPriorityMessageQueue.FailedListener
-
succeeded
-
countPeers
public int countPeers()Description copied from class:TransportImpl
How many peers are we connected to?- Specified by:
countPeers
in interfaceTransport
- Specified by:
countPeers
in classTransportImpl
-
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 interfaceTransport
- Specified by:
countActivePeers
in classTransportImpl
-
countActiveSendPeers
public int countActiveSendPeers()Description copied from class:TransportImpl
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 interfaceTransport
- Specified by:
countActiveSendPeers
in classTransportImpl
-
isEstablished
- Specified by:
isEstablished
in interfaceTransport
- Overrides:
isEstablished
in classTransportImpl
-
isBacklogged
- Specified by:
isBacklogged
in interfaceTransport
- Overrides:
isBacklogged
in classTransportImpl
- Since:
- 0.9.3
-
mayDisconnect
Tell the transport that we may disconnect from this peer. This is advisory only.- Specified by:
mayDisconnect
in interfaceTransport
- Overrides:
mayDisconnect
in classTransportImpl
- Since:
- 0.9.24
-
forceDisconnect
Tell the transport to disconnect from this peer.- Specified by:
forceDisconnect
in interfaceTransport
- Since:
- 0.9.38
-
allowConnection
public boolean allowConnection() -
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 interfaceTransport
- Overrides:
getClockSkews
in classTransportImpl
-
getDHBuilder
DHSessionKeyBuilder getDHBuilder()- Returns:
- a new DHSessionKeyBuilder
- Since:
- 0.9
-
getDHFactory
DHSessionKeyBuilder.Factory getDHFactory()- Returns:
- the factory
- Since:
- 0.9.2
-
getHMAC
HMACGenerator getHMAC()- Returns:
- the SSU HMAC
- Since:
- 0.9.42
-
renderStatusHTML
@Deprecated public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOExceptionDeprecated.as of 0.9.31Does nothing- Specified by:
renderStatusHTML
in interfaceTransport
- Overrides:
renderStatusHTML
in classTransportImpl
- Throws:
IOException
-
setReachabilityStatus
- Parameters:
isIPv6
- Is the change an IPv6 change?- Since:
- 0.9.27
-
getReachabilityStatus
Previously returned short, now enum as of 0.9.20- Specified by:
getReachabilityStatus
in interfaceTransport
- Specified by:
getReachabilityStatus
in classTransportImpl
-
recheckReachability
Deprecated.unused- Specified by:
recheckReachability
in interfaceTransport
- Overrides:
recheckReachability
in classTransportImpl
-
pickTestPeer
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 backdontInclude
- may be null- Returns:
- IPv4 peer or null
-