#include "client_prvmsg.h"
#include "client_channel.h"
#include "client_notify.h"
+#include "client_keyagr.h"
+
+/****************************** Definitions *********************************/
+
+/* Packet retry counter and timer defines, for exponential backoff algorithm.
+ Meaningful with UDP transport when packets may get lost. */
+#define SILC_CLIENT_RETRY_COUNT 4 /* Max packet retry count */
+#define SILC_CLIENT_RETRY_MUL 2 /* Retry timer interval growth */
+#define SILC_CLIENT_RETRY_RAND 2 /* Randomizer, timeout += rnd % 2 */
+#define SILC_CLIENT_RETRY_MIN 1 /* Min retry timeout, seconds */
+#define SLIC_CLIENT_RETRY_MAX 16 /* Max retry timeout, seconds */
+
+/********************************** Types ***********************************/
+
+/* Public key verification context */
+typedef struct {
+ SilcSKE ske;
+ SilcSKEVerifyCbCompletion completion;
+ void *completion_context;
+} *VerifyKeyContext;
/* Context to hold the connection authentication request callbacks that
will be called when the server has replied back to our request about
SilcClientParams *params; /* Client parameters */
SilcPacketEngine packet_engine; /* Packet engine */
SilcMutex lock; /* Client lock */
-
- /* List of connections in client. All the connection data is saved here. */
- SilcDList conns;
-
- /* Registered commands */
- SilcList commands;
-
- /* Generic cipher and hash objects. */
- SilcHmac md5hmac;
- SilcHmac sha1hmac;
-
- /* Client version. Used to compare to remote host's version strings. */
- char *silc_client_version;
+ SilcList commands; /* Registered commands */
+ char *silc_client_version; /* Version set by application */
+ SilcClientRunning running; /* Running/Stopped callback */
+ void *running_context; /* Context for runnign callback */
+ SilcAtomic16 conns; /* Number of connections in client */
/* Events */
- unsigned int run_callback : 1; /* Call running callback */
+ unsigned int stop : 1; /* Stop client */
+ unsigned int run_callback : 1; /* Call running/stopped callback */
+ unsigned int connection_closed : 1; /* A connection closed */
};
/* Internal context for conn->internal in SilcClientConnection. */
struct SilcClientConnectionInternalStruct {
- /* Client ID and Channel ID cache. Messages transmitted in SILC network
- are done using different unique ID's. These are the cache for
- thoses ID's used in the communication. */
- SilcIDCache client_cache;
- SilcIDCache channel_cache;
- SilcIDCache server_cache;
-
- /* Pending command queue for this connection */
- SilcList pending_commands;
-
- /* Set away message */
- SilcClientAway *away;
-
- /* Authentication request context. */
- SilcClientConnAuthRequest connauth;
-
- /* File transmission sessions */
- SilcDList ftp_sessions;
- SilcUInt32 next_session_id;
- SilcClientFtpSession active_session;
-
- /* Requested Attributes */
- SilcHashTable attrs;
+ SilcIDCacheEntry local_entry; /* Local client cache entry */
+ SilcClientConnectionParams params; /* Connection parameters */
SilcFSMStruct fsm; /* Connection FSM */
SilcFSMThreadStruct event_thread; /* FSM thread for events */
SilcFSMSemaStruct wait_event; /* Event signaller */
- SilcMutex lock; /* Connection lock */
SilcSchedule schedule; /* Connection's scheduler */
+ SilcMutex lock; /* Connection lock */
SilcSKE ske; /* Key exchange protocol */
SilcSKERekeyMaterial rekey; /* Rekey material */
- SilcHash hash; /* Negotiated hash function */
- SilcClientConnectionParams params; /* Connection parameters */
- SilcAtomic16 cmd_ident; /* Current command identifier */
- SilcIDCacheEntry local_entry; /* Local client cache entry */
SilcList thread_pool; /* Packet thread pool */
+ SilcList pending_commands; /* Pending commands list */
+ SilcHash hash; /* Negotiated hash function */
+ SilcHash sha1hash; /* SHA-1 default hash context */
+ SilcBuffer local_idp; /* Local ID Payload */
+ SilcBuffer remote_idp; /* Remote ID Payload */
+ SilcAsyncOperation op; /* Protocols async operation */
+ SilcAsyncOperation cop; /* Async operation for application */
- SilcHashTable privmsg_wait; /* Waited private messages */
+ SilcIDCache client_cache; /* Client entry cache */
+ SilcIDCache channel_cache; /* Channel entry cache */
+ SilcIDCache server_cache; /* Server entry cache */
+
+ SilcAtomic16 cmd_ident; /* Current command identifier */
+ SilcUInt8 retry_count; /* Packet retry counter */
+ SilcUInt8 retry_timer; /* Packet retry timer */
/* Events */
unsigned int connect : 1; /* Connect remote host */
- unsigned int disconnected : 1; /* Disconnected by remote host */
+ unsigned int disconnected : 1; /* Disconnect remote connection */
unsigned int key_exchange : 1; /* Start key exchange */
+ unsigned int rekeying : 1; /* Start rekey */
/* Flags */
unsigned int verbose : 1; /* Notify application */
unsigned int registering : 1; /* Set when registering to network */
+ unsigned int rekey_responder : 1; /* Set when rekeying as responder */
+ unsigned int callback_called : 1; /* Set when connect callback called */
+
+ SilcClientAway *away;
+ SilcClientConnAuthRequest connauth;
+ SilcDList ftp_sessions;
+ SilcUInt32 next_session_id;
+ SilcClientFtpSession active_session;
+ SilcHashTable attrs;
+ SilcHashTable privmsg_wait; /* Waited private messages */
};
SILC_FSM_STATE(silc_client_connection_st_run);
SILC_FSM_STATE(silc_client_connection_st_close);
SILC_FSM_STATE(silc_client_error);
SILC_FSM_STATE(silc_client_disconnect);
+SILC_FSM_STATE(silc_client_st_stop);
void silc_client_del_connection(SilcClient client, SilcClientConnection conn);
SilcBool silc_client_del_client(SilcClient client, SilcClientConnection conn,
unsigned char **argv,
SilcUInt32 *argv_lens,
SilcUInt32 *argv_types);
+void silc_client_command_free(SilcClientCommandContext cmd);
+void silc_client_fsm_destructor(SilcFSM fsm, void *fsm_context,
+ void *destructor_context);
void silc_client_ftp(SilcClient client, SilcClientConnection conn,
SilcPacket packet);
-void silc_client_key_agreement(SilcClient client,
- SilcClientConnection conn,
- SilcPacket packet);
void silc_client_connection_auth_request(SilcClient client,
SilcClientConnection conn,
SilcPacket packet);