net.i2p.router.client
Class ClientConnectionRunner

java.lang.Object
  extended by net.i2p.router.client.ClientConnectionRunner
Direct Known Subclasses:
QueuedClientConnectionRunner

 class ClientConnectionRunner
extends Object

Bridge the router and the client - managing state for a client. As of release 0.9.21, multiple sessions are supported on a single I2CP connection. These sessions share tunnels and some configuration.

Author:
jrandom

Field Summary
protected  RouterContext _context
           
protected  Log _log
           
protected  ClientManager _manager
           
protected  I2CPMessageReader _reader
          thingy that does stuff
 
Constructor Summary
ClientConnectionRunner(RouterContext context, ClientManager manager, Socket socket)
          Create a new runner against the given socket
 
Method Summary
(package private)  void ackSendMessage(SessionId sid, MessageId id, long nonce)
          Send a notification to the client that their message (id specified) was accepted for delivery (but not necessarily delivered) Doesn't do anything if i2cp.messageReliability = "none" or if the nonce is 0.
protected  I2CPMessageReader.I2CPMessageEventListener createListener()
          Allow override for testing
(package private)  void disconnectClient(String reason)
          Send a DisconnectMessage and log with level Log.ERROR.
(package private)  void disconnectClient(String reason, int logLevel)
           
(package private)  void disconnected()
           
(package private)  MessageId distributeMessage(SendMessageMessage message)
          Distribute the message.
(package private)  void doSend(I2CPMessage msg)
          Actually send the I2CPMessage to the peer through the socket
 void failLeaseRequest(LeaseRequestState req)
           
 String getClientVersion()
          The client version.
 SessionConfig getConfig(Hash h)
          Current client's config, will be null if session not found IS subsession aware.
 SessionConfig getConfig(SessionId id)
          Current client's config, will be null if session not found IS subsession aware.
 Hash getDestHash()
          Equivalent to getConfig().getDestination().calculateHash(); will be null before session is established Not subsession aware.
 Hash getDestHash(SessionId id)
          Return the hash for the given ID
 Destination getDestination(SessionId id)
          Return the dest for the given ID
(package private)  List<Destination> getDestinations()
          Subsession aware.
(package private)  boolean getIsDead()
           
(package private)  LeaseRequestState getLeaseRequest(Hash h)
          Data for the current leaseRequest, or null if there is no active leaseSet request.
 LeaseSet getLeaseSet(Hash h)
          Currently allocated leaseSet.
 int getNextMessageId()
           
(package private)  Payload getPayload(MessageId id)
          Only call if _dontSendMSMOnReceive is false, otherwise will always be null
 SessionConfig getPrimaryConfig()
          Primary client's config, will be null if session not set up
(package private)  SessionId getSessionId(Hash h)
          Subsession aware.
(package private)  List<SessionId> getSessionIds()
          Subsession aware.
 SessionKeyManager getSessionKeyManager()
          current client's sessionkeymanager
(package private)  boolean isDead()
          already closed?
(package private)  void leaseSetCreated(LeaseSet ls)
          called after a new leaseSet is granted by the client, the NetworkDb has been updated.
(package private)  void receiveMessage(Destination toDest, Destination fromDest, Payload payload)
          Asynchronously deliver the message to the current runner Note that no failure indication is available.
(package private)  void receiveMessage(Hash toHash, Destination fromDest, Payload payload)
          Asynchronously deliver the message to the current runner Note that no failure indication is available.
(package private)  void removePayload(MessageId id)
          Only call if _dontSendMSMOnReceive is false
(package private)  void removeSession(SessionId id)
          Kill the session.
 void reportAbuse(Destination dest, String reason, int severity)
          Send async abuse message to the client
(package private)  void requestLeaseSet(Hash h, LeaseSet set, long expirationTime, Job onCreateJob, Job onFailedJob)
          Request that a particular client authorize the Leases contained in the LeaseSet, after which the onCreateJob is queued up.
 int sessionEstablished(SessionConfig config)
          Caller must send a SessionStatusMessage to the client with the returned code.
 void setClientVersion(String version)
          The client version.
(package private)  void setLeaseSet(LeaseSet ls)
          Currently allocated leaseSet.
(package private)  void setPayload(MessageId id, Payload payload)
          Only call if _dontSendMSMOnReceive is false
(package private)  void setSessionId(Hash hash, SessionId id)
          To be called only by ClientManager.
 void startRunning()
          Actually run the connection - listen for I2CP messages and respond.
 void stopRunning()
          Die a horrible death.
(package private)  void updateMessageDeliveryStatus(Destination dest, MessageId id, long messageNonce, int status)
          Send a notification to the client that their message (id specified) was delivered (or failed delivery) Note that this sends the Guaranteed status codes, even though we only support best effort.
(package private)  void writeMessage(I2CPMessage msg)
          Not thread-safe.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_log

protected final Log _log

_context

protected final RouterContext _context

_manager

protected final ClientManager _manager

_reader

protected I2CPMessageReader _reader
thingy that does stuff

Constructor Detail

ClientConnectionRunner

public ClientConnectionRunner(RouterContext context,
                              ClientManager manager,
                              Socket socket)
Create a new runner against the given socket

Method Detail

startRunning

public void startRunning()
                  throws IOException
Actually run the connection - listen for I2CP messages and respond. This is the main driver for this class, though it gets all its meat from the I2CPMessageReader

Throws:
IOException

createListener

protected I2CPMessageReader.I2CPMessageEventListener createListener()
Allow override for testing

Since:
0.9.8

stopRunning

public void stopRunning()
Die a horrible death. Cannot be restarted.


getConfig

public SessionConfig getConfig(Hash h)
Current client's config, will be null if session not found IS subsession aware.

Since:
0.9.21 added hash param

getConfig

public SessionConfig getConfig(SessionId id)
Current client's config, will be null if session not found IS subsession aware. Returns null if id is null.

Since:
0.9.21 added id param

getPrimaryConfig

public SessionConfig getPrimaryConfig()
Primary client's config, will be null if session not set up

Since:
0.9.21

setClientVersion

public void setClientVersion(String version)
The client version.

Since:
0.9.7

getClientVersion

public String getClientVersion()
The client version.

Returns:
null if unknown or less than 0.8.7
Since:
0.9.7

getSessionKeyManager

public SessionKeyManager getSessionKeyManager()
current client's sessionkeymanager


getLeaseSet

public LeaseSet getLeaseSet(Hash h)
Currently allocated leaseSet. IS subsession aware. Returns primary leaseset only.

Returns:
leaseSet or null if not yet set or unknown hash
Since:
0.9.21 added hash parameter

setLeaseSet

void setLeaseSet(LeaseSet ls)
Currently allocated leaseSet. IS subsession aware.


getDestHash

public Hash getDestHash()
Equivalent to getConfig().getDestination().calculateHash(); will be null before session is established Not subsession aware. Returns primary session hash. Don't use if you can help it.

Returns:
primary hash or null if not yet set

getDestHash

public Hash getDestHash(SessionId id)
Return the hash for the given ID

Returns:
hash or null if unknown
Since:
0.9.21

getDestination

public Destination getDestination(SessionId id)
Return the dest for the given ID

Returns:
dest or null if unknown
Since:
0.9.21

getSessionId

SessionId getSessionId(Hash h)
Subsession aware.

Parameters:
h - the local target
Returns:
current client's sessionId or null if not yet set or not a valid hash
Since:
0.9.21

getSessionIds

List<SessionId> getSessionIds()
Subsession aware.

Returns:
all current client's sessionIds, non-null
Since:
0.9.21

getDestinations

List<Destination> getDestinations()
Subsession aware.

Returns:
all current client's destinations, non-null
Since:
0.9.21

setSessionId

void setSessionId(Hash hash,
                  SessionId id)
To be called only by ClientManager.

Parameters:
hash - for the session
Throws:
IllegalStateException - if already set
Since:
0.9.21 added hash param

removeSession

void removeSession(SessionId id)
Kill the session. Caller must kill runner if none left.

Since:
0.9.21

getLeaseRequest

LeaseRequestState getLeaseRequest(Hash h)
Data for the current leaseRequest, or null if there is no active leaseSet request. Not subsession aware. Returns primary ID only.

Since:
0.9.21 added hash param

failLeaseRequest

public void failLeaseRequest(LeaseRequestState req)
Parameters:
req - non-null

isDead

boolean isDead()
already closed?


getPayload

Payload getPayload(MessageId id)
Only call if _dontSendMSMOnReceive is false, otherwise will always be null


setPayload

void setPayload(MessageId id,
                Payload payload)
Only call if _dontSendMSMOnReceive is false


removePayload

void removePayload(MessageId id)
Only call if _dontSendMSMOnReceive is false


sessionEstablished

public int sessionEstablished(SessionConfig config)
Caller must send a SessionStatusMessage to the client with the returned code. Caller must call disconnectClient() on failure. Side effect: Sets the session ID.

Returns:
SessionStatusMessage return code, 1 for success, != 1 for failure

updateMessageDeliveryStatus

void updateMessageDeliveryStatus(Destination dest,
                                 MessageId id,
                                 long messageNonce,
                                 int status)
Send a notification to the client that their message (id specified) was delivered (or failed delivery) Note that this sends the Guaranteed status codes, even though we only support best effort. Doesn't do anything if i2cp.messageReliability = "none" Do not use for status = STATUS_SEND_ACCEPTED; use ackSendMessage() for that.

Parameters:
dest - the client
id - the router's ID for this message
messageNonce - the client's ID for this message
status - see I2CP MessageStatusMessage for success/failure codes

leaseSetCreated

void leaseSetCreated(LeaseSet ls)
called after a new leaseSet is granted by the client, the NetworkDb has been updated. This takes care of all the LeaseRequestState stuff (including firing any jobs)


disconnectClient

void disconnectClient(String reason)
Send a DisconnectMessage and log with level Log.ERROR. This is always bad. See ClientMessageEventListener.handleCreateSession() for why we don't send a SessionStatusMessage when we do this.

Parameters:
reason - will be truncated to 255 bytes

disconnectClient

void disconnectClient(String reason,
                      int logLevel)
Parameters:
reason - will be truncated to 255 bytes
logLevel - e.g. Log.WARN
Since:
0.8.2

distributeMessage

MessageId distributeMessage(SendMessageMessage message)
Distribute the message. If the dest is local, it blocks until its passed to the target ClientConnectionRunner (which then fires it into a MessageReceivedJob). If the dest is remote, it blocks until it is added into the ClientMessagePool


ackSendMessage

void ackSendMessage(SessionId sid,
                    MessageId id,
                    long nonce)
Send a notification to the client that their message (id specified) was accepted for delivery (but not necessarily delivered) Doesn't do anything if i2cp.messageReliability = "none" or if the nonce is 0.

Parameters:
id - OUR id for the message
nonce - HIS id for the message

receiveMessage

void receiveMessage(Destination toDest,
                    Destination fromDest,
                    Payload payload)
Asynchronously deliver the message to the current runner Note that no failure indication is available. Fails silently on e.g. queue overflow to client, client dead, etc.

Parameters:
toDest - non-null
fromDest - generally null when from remote, non-null if from local

receiveMessage

void receiveMessage(Hash toHash,
                    Destination fromDest,
                    Payload payload)
Asynchronously deliver the message to the current runner Note that no failure indication is available. Fails silently on e.g. queue overflow to client, client dead, etc.

Parameters:
toHash - non-null
fromDest - generally null when from remote, non-null if from local
Since:
0.9.21

reportAbuse

public void reportAbuse(Destination dest,
                        String reason,
                        int severity)
Send async abuse message to the client


requestLeaseSet

void requestLeaseSet(Hash h,
                     LeaseSet set,
                     long expirationTime,
                     Job onCreateJob,
                     Job onFailedJob)
Request that a particular client authorize the Leases contained in the LeaseSet, after which the onCreateJob is queued up. If that doesn't occur within the timeout specified, queue up the onFailedJob. This call does not block. Job args are always null, may need some fixups if we start using them.

Parameters:
h - the Destination's hash
set - LeaseSet with requested leases - this object must be updated to contain the signed version (as well as any changed/added/removed Leases) The LeaseSet contains Leases and destination only, it is unsigned.
expirationTime - ms to wait before failing
onCreateJob - Job to run after the LeaseSet is authorized, null OK
onFailedJob - Job to run after the timeout passes without receiving authorization, null OK

disconnected

void disconnected()

getIsDead

boolean getIsDead()

writeMessage

void writeMessage(I2CPMessage msg)
Not thread-safe. Blocking. Only used for external sockets. ClientWriterRunner thread is the only caller. Others must use doSend().


doSend

void doSend(I2CPMessage msg)
      throws I2CPMessageException
Actually send the I2CPMessage to the peer through the socket

Throws:
I2CPMessageException

getNextMessageId

public int getNextMessageId()