public class UDPTransport extends TransportImpl implements TimedWeightedPriorityMessageQueue.FailedListener
Transport.AddressSource
Modifier and Type | Field and Description |
---|---|
static int |
DEFAULT_COST |
static int |
DEFAULT_INTERNAL_PORT
Deprecated.
unused
|
static 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 address
|
static String |
PROP_EXTERNAL_HOST
define this to explicitly set an external IP address
|
static String |
PROP_EXTERNAL_PORT
define this to explicitly set an external port
|
static 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 changes
|
static 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 updates
|
static String |
PROP_SSU2_IKEY
b64 static IV
|
static String |
PROP_SSU2_SP
b64 static private key
|
static int |
PUBLIC_RELAY_COUNT
how many relays offered to us will we use at a time?
|
(package private) static long[] |
RATES |
(package private) static int |
SSU2_INT_VERSION |
(package private) static String |
SSU2_VERSION
"2"
|
(package private) static String |
SSU2_VERSION_ALT
"2,"
|
static String |
STYLE |
static String |
STYLE2 |
_context, ADJUST_COST, CAP_IPV4, CAP_IPV4_IPV6, CAP_IPV6, CONGESTION_COST_ADJUSTMENT, PROP_IPV6_FIREWALLED
Constructor and Description |
---|
UDPTransport(RouterContext ctx,
X25519KeyFactory xdh) |
Modifier and Type | Method and Description |
---|---|
(package private) void |
addRecentlyClosed(PeerStateDestroyed peer)
Start listening for packets on a destroyed connection
|
(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 known
|
boolean |
allowConnection() |
TransportBid |
bid(RouterInfo toAddress,
int dataSize) |
(package private) boolean |
canIntroduce(boolean ipv6)
For EstablishmentManager.
|
(package private) boolean |
canTestAsCharlie(boolean ipv6)
Can we be a Charlie right now?
|
(package private) void |
changePeerAddress(PeerState2 peer,
RemoteHostId newAddress)
Remove and add to peersByRemoteHost map
|
(package private) void |
changePeerPort(PeerState peer,
int newPort)
Remove and add to peersByRemoteHost map
|
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.
|
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(OutboundMessageState msg) |
(package private) void |
failed(OutboundMessageState msg,
boolean allowPeerFailure) |
void |
failed(OutNetMessage msg,
String reason) |
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.
|
String |
getAltStyle()
An alternate supported style, or null.
|
(package private) PacketBuilder2 |
getBuilder2() |
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.
|
List<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) InboundMessageFragments |
getInboundFragments() |
(package private) SessionKey |
getIntroKey()
Introduction key that people should use to contact us,
or null if SSU1 disabled.
|
(package private) IntroductionManager |
getIntroManager() |
int |
getMTU(boolean ipv6)
The MTU for the socket interface.
|
(package private) OutboundMessageFragments |
getOMF() |
(package private) PacketHandler |
getPacketHandler() |
(package private) String |
getPacketHandlerStatus() |
int[] |
getPeerCounts() |
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) PeerState2 |
getPeerState(long rcvConnID)
Get the state by SSU2 connection ID
|
(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.
|
(package private) PeerTestManager |
getPeerTestManager() |
CommSystemFacade.Status |
getReachabilityStatus()
Previously returned short, now enum as of 0.9.20
|
(package private) PeerStateDestroyed |
getRecentlyClosed(long rcvConnID)
Was the state for this SSU2 receive connection ID recently closed?
|
int |
getRequestedPort()
The current or configured internal IPv4 port.
|
int |
getSSU2MTU(boolean ipv6)
The SSU2 MTU for the socket interface.
|
(package private) byte[] |
getSSU2StaticIntroKey()
The static Intro key
|
(package private) byte[] |
getSSU2StaticPrivKey()
The static priv key
|
(package private) byte[] |
getSSU2StaticPubKey()
The static pub key
|
(package private) int |
getSSUVersion(RouterAddress addr)
Get the valid SSU version of Bob's SSU address
for our outbound connections as Alice.
|
String |
getStyle()
The unique identity of this Transport
|
(package private) RouterAddress |
getTargetAddress(RouterInfo target)
Get first available address we can use.
|
(package private) X25519KeyFactory |
getXDHFactory() |
(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 |
isSymNatted()
Is IPv4 Symmetric NATted?
|
(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,
int version,
boolean isIPv6,
RemoteHostId dontInclude)
Pick a Bob (if we are Alice) or a Charlie (if we are Bob).
|
void |
recheckReachability()
Deprecated.
unused
|
protected void |
removeAddress(boolean ipv6)
Remove then tell NTCP that we changed.
|
protected void |
removeAddress(RouterAddress address)
Remove then tell NTCP that we changed.
|
(package private) void |
removeRecentlyClosed(PeerStateDestroyed peer)
Stop listening for packets on a destroyed connection
|
void |
renderStatusHTML(Writer out,
String urlBase,
int sortFlags)
Deprecated.
as of 0.9.31
|
protected void |
replaceAddress(RouterAddress address)
Replace then tell NTCP that we changed.
|
(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.
|
(package private) void |
send(List<I2NPMessage> msgs,
PeerState peer)
"injected" messages 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,
int reasonCode)
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.
|
_t, _t, afterSend, afterSend, afterSend, afterSend, allowLocal, externalAddressRemoved, getCurrentAddress, getCurrentAddresses, getIP, getIPv6Config, getMaxConnections, getMostRecentErrorMessages, getNextMessage, getSavedLocalAddresses, getTargetAddresses, hasCurrentAddress, haveCapacity, haveCapacity, isIPv4Firewalled, isIPv6Firewalled, isPubliclyRoutable, isUnreachable, markReachable, markUnreachable, ngettext, renderStatusHTML, saveLocalAddress, setIP, setListener, wasUnreachable
public static final String STYLE2
static final int SSU2_INT_VERSION
static final String SSU2_VERSION
static final String SSU2_VERSION_ALT
public static final String PROP_SSU2_SP
public static final String PROP_SSU2_IKEY
public static final String STYLE
public static final String PROP_INTERNAL_PORT
@Deprecated public static final int DEFAULT_INTERNAL_PORT
public static final String PROP_EXTERNAL_HOST
public static final String PROP_EXTERNAL_PORT
public static final String PROP_PREFER_UDP
public static final String PROP_SOURCES
public static final String DEFAULT_SOURCES
public static final String PROP_IP
public static final String PROP_IP_CHANGE
public static final String PROP_LAPTOP_MODE
public static final String PROP_IPV6
public static final String PROP_FORCE_INTRODUCERS
public static final String PROP_ALLOW_DIRECT
public static final String PROP_BIND_INTERFACE
public static final String PROP_INTRO_KEY
public static final int PUBLIC_RELAY_COUNT
public static final int DEFAULT_COST
static final long[] RATES
static final long INTRODUCER_EXPIRATION_MARGIN
public static final int EXPIRE_TIMEOUT
public static final int MIN_EXPIRE_TIMEOUT
public UDPTransport(RouterContext ctx, X25519KeyFactory xdh)
xdh
- non-nullOutboundMessageFragments getOMF()
public void shutdown()
public void fail(UDPEndpoint endpoint)
SessionKey getIntroKey()
byte[] getSSU2StaticIntroKey()
byte[] getSSU2StaticPubKey()
byte[] getSSU2StaticPrivKey()
int getSSUVersion(RouterAddress addr)
int getExternalPort(boolean ipv6)
byte[] getExternalIP()
boolean hasIPv6Address()
boolean isTooClose(byte[] ip)
ip
- IPv4 or IPv6public int getRequestedPort()
getRequestedPort
in interface Transport
getRequestedPort
in class TransportImpl
public int getMTU(boolean ipv6)
public int getSSU2MTU(boolean ipv6)
void inboundConnectionReceived(boolean isIPv6)
public void externalAddressReceived(Transport.AddressSource source, byte[] ip, int port)
externalAddressReceived
in interface Transport
externalAddressReceived
in class TransportImpl
source
- as defined in Transport.SOURCE_xxxip
- publicly routable IPv4 or IPv6, null okport
- 0 if unknownpublic void forwardPortStatus(byte[] ip, int port, int externalPort, boolean success, String reason)
forwardPortStatus
in interface Transport
forwardPortStatus
in class TransportImpl
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.void externalAddressReceived(Hash from, byte[] ourIP, int ourPort)
from
- Hash of inbound destinationourIP
- publicly routable IPv4 or IPv6 only, non-nullourPort
- >= 1024public final boolean isValid(byte[] addr)
addr
- may be null, returns falsePeerState getPeerState(RemoteHostId hostInfo)
List<PeerState> getPeerStatesByIP(RemoteHostId hostInfo)
PeerState getPeerState(Hash remotePeer)
PeerState2 getPeerState(long rcvConnID)
PeerStateDestroyed getRecentlyClosed(long rcvConnID)
void addRecentlyClosed(PeerStateDestroyed peer)
void removeRecentlyClosed(PeerStateDestroyed peer)
public Collection<PeerState> getPeers()
public List<Hash> getEstablished()
getEstablished
in interface Transport
void changePeerPort(PeerState peer, int newPort)
void changePeerAddress(PeerState2 peer, RemoteHostId newAddress)
EstablishmentManager getEstablisher()
boolean addRemotePeerState(PeerState peer)
public void messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived)
messageReceived
in class TransportImpl
inMsg
- non-nullremoteIdent
- may be nullremoteIdentHash
- may be null, calculated from remoteIdent if nullboolean isInDropList(RemoteHostId peer)
void dropPeer(Hash peer, boolean shouldBanlist, String why)
shouldBanlist
- doesn't really, only sets unreachablevoid dropPeer(PeerState peer, boolean shouldBanlist, String why)
shouldBanlist
- doesn't really, only sets unreachablevoid send(UDPPacket packet)
void sendDestroy(PeerState peer, int reasonCode)
reasonCode
- SSU2 only, ignored for SSU1public TransportBid bid(RouterInfo toAddress, int dataSize)
RouterAddress getTargetAddress(RouterInfo target)
public String getStyle()
Transport
public String getAltStyle()
getAltStyle
in class TransportImpl
public void send(OutNetMessage msg)
TransportImpl
send
in interface Transport
send
in class TransportImpl
void sendIfEstablished(OutNetMessage msg)
void send(I2NPMessage msg, PeerState peer)
peer
- the message MUST be going to this peervoid send(I2NPMessage msg, List<OutNetMessage> msgs, PeerState peer)
msg
- may be null if nothing to injectmsgs
- non-null, may be emptypeer
- all messages MUST be going to this peervoid send(List<I2NPMessage> msgs, PeerState peer)
peer
- all messages MUST be going to this peerprotected void outboundMessageReady()
TransportImpl
outboundMessageReady
in class TransportImpl
public void startListening()
startListening
in interface Transport
public void stopListening()
stopListening
in interface Transport
public List<RouterAddress> updateAddress()
updateAddress
in interface Transport
updateAddress
in class TransportImpl
public RouterAddress getCurrentExternalAddress(boolean isIPv6)
protected void replaceAddress(RouterAddress address)
replaceAddress
in class TransportImpl
address
- the new address or null to remove allprotected void removeAddress(RouterAddress address)
removeAddress
in class TransportImpl
protected void removeAddress(boolean ipv6)
removeAddress
in class TransportImpl
ipv6
- true to remove all IPv6 addresses, false to remove all IPv4 addressesboolean introducersMaybeRequired(boolean ipv6)
boolean canIntroduce(boolean ipv6)
String getPacketHandlerStatus()
PacketHandler getPacketHandler()
public void failed(OutboundMessageState msg)
void failed(OutboundMessageState msg, boolean allowPeerFailure)
public void failed(OutNetMessage msg, String reason)
failed
in interface TimedWeightedPriorityMessageQueue.FailedListener
public void succeeded(OutboundMessageState msg)
public int countPeers()
TransportImpl
countPeers
in interface Transport
countPeers
in class TransportImpl
public int[] getPeerCounts()
getPeerCounts
in interface Transport
public int countActivePeers()
TransportImpl
countActivePeers
in interface Transport
countActivePeers
in class TransportImpl
public int countActiveSendPeers()
TransportImpl
countActiveSendPeers
in interface Transport
countActiveSendPeers
in class TransportImpl
public boolean isEstablished(Hash dest)
isEstablished
in interface Transport
isEstablished
in class TransportImpl
public boolean isBacklogged(Hash dest)
isBacklogged
in interface Transport
isBacklogged
in class TransportImpl
public void mayDisconnect(Hash peer)
mayDisconnect
in interface Transport
mayDisconnect
in class TransportImpl
public void forceDisconnect(Hash peer)
forceDisconnect
in interface Transport
public boolean allowConnection()
public List<Long> getClockSkews()
getClockSkews
in interface Transport
getClockSkews
in class TransportImpl
X25519KeyFactory getXDHFactory()
PacketBuilder2 getBuilder2()
IntroductionManager getIntroManager()
PeerTestManager getPeerTestManager()
InboundMessageFragments getInboundFragments()
@Deprecated public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException
renderStatusHTML
in interface Transport
renderStatusHTML
in class TransportImpl
IOException
void setReachabilityStatus(CommSystemFacade.Status status, boolean isIPv6)
isIPv6
- Is the change an IPv6 change?public CommSystemFacade.Status getReachabilityStatus()
getReachabilityStatus
in interface Transport
getReachabilityStatus
in class TransportImpl
boolean isSymNatted()
boolean canTestAsCharlie(boolean ipv6)
@Deprecated public void recheckReachability()
recheckReachability
in interface Transport
recheckReachability
in class TransportImpl
PeerState pickTestPeer(PeerTestState.Role peerRole, int version, boolean isIPv6, RemoteHostId dontInclude)
peerRole
- The role of the peer we are looking for, BOB or CHARLIE only (NOT our role)version
- 1 or 2 for role CHARLIE; ignored for role BOBisIPv6
- true to get a v6-capable peer backdontInclude
- may be null