Handle command reply lists in threads.
[silc.git] / lib / silcclient / client_internal.h
index 99a28733e7265fae3e7bc8a042ed2c6ddfbbb734..7d42b470789c541559ba32d6d33687962573e83d 100644 (file)
 #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
@@ -123,73 +143,66 @@ struct SilcClientInternalStruct {
   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);
@@ -197,6 +210,7 @@ SILC_FSM_STATE(silc_client_connection_st_packet);
 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,
@@ -214,12 +228,12 @@ SilcUInt16 silc_client_command_send_argv(SilcClient client,
                                         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);