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 intDEFAULT_COSTstatic intDEFAULT_INTERNAL_PORTDeprecated.unusedstatic StringDEFAULT_SOURCESstatic intEXPIRE_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.(package private) static longINTRODUCER_EXPIRATION_MARGINstatic intMIN_EXPIRE_TIMEOUTstatic StringPROP_ALLOW_DIRECTdo we allow direct SSU connections, sans introducers?static StringPROP_BIND_INTERFACEthis is rarely if ever used, default is to bind to wildcard addressstatic StringPROP_EXTERNAL_HOSTdefine this to explicitly set an external IP addressstatic StringPROP_EXTERNAL_PORTdefine this to explicitly set an external portstatic StringPROP_FORCE_INTRODUCERSdo we require introducers, regardless of our status?static StringPROP_INTERNAL_PORTstatic StringPROP_INTRO_KEYstatic StringPROP_IPremember IP changesstatic StringPROP_IP_CHANGEstatic StringPROP_IPV6static StringPROP_LAPTOP_MODEstatic StringPROP_PREFER_UDPIf 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 StringPROP_SOURCESallowed sources of address updatesstatic intPUBLIC_RELAY_COUNThow many relays offered to us will we use at a time?(package private) static long[]RATESstatic StringSTYLEFields 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) booleanaddRemotePeerState(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 knownbooleanallowConnection()TransportBidbid(RouterInfo toAddress, int dataSize)(package private) booleancanIntroduce(boolean ipv6)For EstablishmentManager.(package private) voidchangePeerPort(PeerState peer, int newPort)Remove and add to peersByRemoteHost mapintcountActivePeers()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.intcountActiveSendPeers()How many peers are we currently connected to, that we have sent a message to in the last minute.intcountPeers()How many peers are we connected to?(package private) voiddropPeer(Hash peer, boolean shouldBanlist, String why)This does not send a session destroy, caller must do that if desired.(package private) voiddropPeer(PeerState peer, boolean shouldBanlist, String why)This does not send a session destroy, caller must do that if desired.(package private) voidexternalAddressReceived(Hash from, byte[] ourIP, int ourPort)Someone we tried to contact gave us what they think our IP address is.voidexternalAddressReceived(Transport.AddressSource source, byte[] ip, int port)From config, UPnP, local i/f, ...voidfail(UDPEndpoint endpoint)The endpoint has failed.voidfailed(OutNetMessage msg, String reason)voidfailed(OutboundMessageState msg)(package private) voidfailed(OutboundMessageState msg, boolean allowPeerFailure)voidforceDisconnect(Hash peer)Tell the transport to disconnect from this peer.voidforwardPortStatus(byte[] ip, int port, int externalPort, boolean success, String reason)Callback from UPnP.List<Long>getClockSkews()Return our peer clock skews on this transport.RouterAddressgetCurrentExternalAddress(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) DHSessionKeyBuildergetDHBuilder()(package private) DHSessionKeyBuilder.FactorygetDHFactory()Set<Hash>getEstablished()Connected peers.(package private) EstablishmentManagergetEstablisher()For IntroductionManager(package private) byte[]getExternalIP()Published IP, IPv4 only(package private) intgetExternalPort(boolean ipv6)Published or requested port(package private) HMACGeneratorgetHMAC()(package private) SessionKeygetIntroKey()Introduction key that people should use to contact usintgetMTU(boolean ipv6)The MTU for the socket interface.(package private) OutboundMessageFragmentsgetOMF()(package private) PacketHandlergetPacketHandler()(package private) StringgetPacketHandlerStatus()Collection<PeerState>getPeers()For /peers UI only.(package private) PeerStategetPeerState(Hash remotePeer)get the state for the peer with the given ident, or null if no state exists(package private) PeerStategetPeerState(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.StatusgetReachabilityStatus()Previously returned short, now enum as of 0.9.20intgetRequestedPort()The current or configured internal IPv4 port.StringgetStyle()The unique identity of this Transport(package private) RouterAddressgetTargetAddress(RouterInfo target)Get first available address we can use.(package private) booleanhasIPv6Address()For PeerTestManager(package private) voidinboundConnectionReceived(boolean isIPv6)(package private) booleanintroducersMaybeRequired(boolean ipv6)MIGHT we require introducers? This is like introducersRequired, but if we aren't sure, this returns true.booleanisBacklogged(Hash dest)booleanisEstablished(Hash dest)(package private) booleanisInDropList(RemoteHostId peer)(package private) booleanisTooClose(byte[] ip)Is this IP too close to ours to trust it for things like relaying?booleanisValid(byte[] addr)An IPv6 address is only valid if we are configured to support IPv6 AND we have a public IPv6 address.voidmayDisconnect(Hash peer)Tell the transport that we may disconnect from this peer.voidmessageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived)infinite loop public RouterAddress getCurrentAddress() { if (needsRebuild()) rebuildExternalAddress(false); return super.getCurrentAddress(); }protected voidoutboundMessageReady()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) PeerStatepickTestPeer(PeerTestState.Role peerRole, boolean isIPv6, RemoteHostId dontInclude)Pick a Bob (if we are Alice) or a Charlie (if we are Bob).voidrecheckReachability()Deprecated.unusedprotected voidremoveAddress(boolean ipv6)Remove then tell NTCP that we changed.protected voidremoveAddress(RouterAddress address)Remove then tell NTCP that we changed.voidrenderStatusHTML(Writer out, String urlBase, int sortFlags)Deprecated.as of 0.9.31protected voidreplaceAddress(RouterAddress address)Replace then tell NTCP that we changed.(package private) voidsend(List<I2NPMessage> msgs, PeerState peer)"injected" messages from the EstablishmentManager.(package private) voidsend(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) voidsend(I2NPMessage msg, PeerState peer)"injected" message from the EstablishmentManager.voidsend(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) voidsend(UDPPacket packet)This sends it directly out, bypassing OutboundMessageFragments.(package private) voidsendDestroy(PeerState peer)Send a session destroy message, bypassing OMF and PacketPusher.(package private) voidsendIfEstablished(OutNetMessage msg)Send only if established, otherwise fail immediately.(package private) voidsetReachabilityStatus(CommSystemFacade.Status status, boolean isIPv6)voidshutdown()voidstartListening()voidstopListening()voidsucceeded(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:
getRequestedPortin interfaceTransport- Overrides:
getRequestedPortin 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:
externalAddressReceivedin interfaceTransport- Specified by:
externalAddressReceivedin 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:
forwardPortStatusin interfaceTransport- Overrides:
forwardPortStatusin 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:
getEstablishedin 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:
messageReceivedin 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:TransportThe unique identity of this Transport -
send
Description copied from class:TransportImplAsynchronously 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:
sendin interfaceTransport- Overrides:
sendin 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:TransportImplThis 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:
outboundMessageReadyin classTransportImpl
-
startListening
public void startListening()- Specified by:
startListeningin interfaceTransport
-
stopListening
public void stopListening()- Specified by:
stopListeningin 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:
updateAddressin interfaceTransport- Overrides:
updateAddressin 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:
replaceAddressin classTransportImpl- Parameters:
address- the new address or null to remove all
-
removeAddress
Remove then tell NTCP that we changed.- Overrides:
removeAddressin classTransportImpl- Since:
- 0.9.20
-
removeAddress
protected void removeAddress(boolean ipv6)Remove then tell NTCP that we changed.- Overrides:
removeAddressin 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:
failedin interfaceTimedWeightedPriorityMessageQueue.FailedListener
-
succeeded
-
countPeers
public int countPeers()Description copied from class:TransportImplHow many peers are we connected to?- Specified by:
countPeersin interfaceTransport- Specified by:
countPeersin classTransportImpl
-
countActivePeers
public int countActivePeers()Description copied from class:TransportImplHow 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:
countActivePeersin interfaceTransport- Specified by:
countActivePeersin classTransportImpl
-
countActiveSendPeers
public int countActiveSendPeers()Description copied from class:TransportImplHow 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:
countActiveSendPeersin interfaceTransport- Specified by:
countActiveSendPeersin classTransportImpl
-
isEstablished
- Specified by:
isEstablishedin interfaceTransport- Overrides:
isEstablishedin classTransportImpl
-
isBacklogged
- Specified by:
isBackloggedin interfaceTransport- Overrides:
isBackloggedin classTransportImpl- Since:
- 0.9.3
-
mayDisconnect
Tell the transport that we may disconnect from this peer. This is advisory only.- Specified by:
mayDisconnectin interfaceTransport- Overrides:
mayDisconnectin classTransportImpl- Since:
- 0.9.24
-
forceDisconnect
Tell the transport to disconnect from this peer.- Specified by:
forceDisconnectin 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:
getClockSkewsin interfaceTransport- Overrides:
getClockSkewsin 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:
renderStatusHTMLin interfaceTransport- Overrides:
renderStatusHTMLin 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:
getReachabilityStatusin interfaceTransport- Specified by:
getReachabilityStatusin classTransportImpl
-
recheckReachability
Deprecated.unused- Specified by:
recheckReachabilityin interfaceTransport- Overrides:
recheckReachabilityin 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
-