5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 1997 - 2014 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
20 #ifndef CLIENT_INTERNAL_H
21 #define CLIENT_INTERNAL_H
24 #include "command_reply.h"
25 #include "client_connect.h"
26 #include "client_register.h"
27 #include "client_entry.h"
28 #include "client_prvmsg.h"
29 #include "client_channel.h"
30 #include "client_notify.h"
31 #include "client_keyagr.h"
32 #include "client_ftp.h"
33 #include "client_listener.h"
35 /****************************** Definitions *********************************/
37 /* Packet retry counter and timer defines, for exponential backoff algorithm.
38 Meaningful with UDP transport when packets may get lost. */
39 #define SILC_CLIENT_RETRY_COUNT 4 /* Max packet retry count */
40 #define SILC_CLIENT_RETRY_MUL 2 /* Retry timer interval growth */
41 #define SILC_CLIENT_RETRY_RAND 2 /* Randomizer, timeout += rnd % 2 */
42 #define SILC_CLIENT_RETRY_MIN 1 /* Min retry timeout, seconds */
43 #define SLIC_CLIENT_RETRY_MAX 16 /* Max retry timeout, seconds */
45 /********************************** Types ***********************************/
47 /* Public key verification context */
50 SilcSKEVerifyCbCompletion completion;
51 SilcPublicKey public_key;
52 void *completion_context;
55 } *SilcVerifyKeyContext;
57 /* Command and command reply context used to hold registered commands
58 in the SILC client. */
59 typedef struct SilcClientCommandStruct {
60 struct SilcClientCommandStruct *next;
61 SilcCommand cmd; /* Command type */
62 SilcFSMStateCallback command; /* Command function */
63 SilcFSMStateCallback reply; /* Command reply callback */
64 char *name; /* Name of the command (optional) */
65 SilcUInt8 max_args; /* Maximum arguments (optional) */
68 /* Command reply callback structure */
69 typedef struct SilcClientCommandReplyCallbackStruct {
70 struct SilcClientCommandReplyCallbackStruct *next;
71 SilcClientCommandReply reply; /* Command reply callback */
72 void *context; /* Command reply context */
73 unsigned int do_not_call : 1; /* Set to not call the callback */
74 } *SilcClientCommandReplyCallback;
76 /* Command context given as argument to command state functions. This same
77 context is used when calling, sending and procesing command and command
79 typedef struct SilcClientCommandContextStruct {
80 struct SilcClientCommandContextStruct *next;
81 SilcClientConnection conn; /* Connection */
82 SilcFSMThreadStruct thread; /* FSM thread for command call */
84 SilcCommand cmd; /* Command */
85 SilcUInt16 cmd_ident; /* Command identifier */
86 SilcUInt32 argc; /* Number of arguments */
87 unsigned char **argv; /* Arguments, may be NULL */
88 SilcUInt32 *argv_lens; /* Argument lengths, may be NULL */
89 SilcUInt32 *argv_types; /* Argument types, may be NULL */
91 SilcList reply_callbacks; /* Command reply callbacks */
92 SilcStatus status; /* Current command reply status */
93 SilcStatus error; /* Current command reply error */
95 void *context; /* Context for free use */
96 unsigned int called : 1; /* Set when called by application */
97 unsigned int verbose : 1; /* Verbose with 'say' client operation */
98 unsigned int resolved : 1; /* Set when resolving something */
99 } *SilcClientCommandContext;
101 /* Internal context for the client->internal pointer in the SilcClient. */
102 struct SilcClientInternalStruct {
103 SilcFSMStruct fsm; /* Client's FSM */
104 SilcFSMEventStruct wait_event; /* Event signaller */
105 SilcClientOperations *ops; /* Client operations */
106 SilcClientParams *params; /* Client parameters */
107 SilcPacketEngine packet_engine; /* Packet engine */
108 SilcMutex lock; /* Client lock */
109 SilcList commands; /* Registered commands */
110 SilcDList ftp_sessions; /* FTP sessions */
111 char *silc_client_version; /* Version set by application */
112 SilcClientRunning running; /* Running/Stopped callback */
113 void *running_context; /* Context for runnign callback */
114 SilcAtomic32 conns; /* Number of connections in client */
115 SilcUInt16 next_session_id; /* Next FTP session ID */
118 unsigned int stop : 1; /* Stop client */
119 unsigned int run_callback : 1; /* Call running/stopped callback */
120 unsigned int connection_closed : 1; /* A connection closed */
123 /* Internal context for conn->internal in SilcClientConnection. */
124 struct SilcClientConnectionInternalStruct {
125 SilcClientConnectionParams params; /* Connection parameters */
126 SilcFSMStruct fsm; /* Connection FSM */
127 SilcFSMThreadStruct event_thread; /* FSM thread for events */
128 SilcFSMEventStruct wait_event; /* Event signaller */
129 SilcSchedule schedule; /* Connection's scheduler */
130 SilcMutex lock; /* Connection lock */
131 SilcSKE ske; /* Key exchange protocol */
132 SilcSKERekeyMaterial rekey; /* Rekey material */
133 SilcList thread_pool; /* Packet thread pool */
134 SilcList pending_commands; /* Pending commands list */
135 SilcHash hash; /* Negotiated hash function */
136 SilcHash sha1hash; /* SHA-1 default hash context */
137 SilcBuffer local_idp; /* Local ID Payload */
138 SilcBuffer remote_idp; /* Remote ID Payload */
139 SilcAsyncOperation op; /* Protocols async operation */
140 SilcAsyncOperation cop; /* Async operation for application */
141 SilcHashTable attrs; /* Configured user attributes */
142 SilcStream user_stream; /* Low level stream in connecting */
143 char *disconnect_message; /* Disconnection message */
144 char *away_message; /* Away message */
146 SilcIDCache client_cache; /* Client entry cache */
147 SilcIDCache channel_cache; /* Channel entry cache */
148 SilcIDCache server_cache; /* Server entry cache */
150 SilcUInt32 remote_version; /* Remote SILC protocol version */
151 SilcAtomic16 cmd_ident; /* Current command identifier */
152 SilcUInt8 retry_count; /* Packet retry counter */
153 SilcUInt8 retry_timer; /* Packet retry timer */
154 SilcClientConnectionStatus status; /* Connection callback status */
155 SilcStatus error; /* Connection callback error */
156 SilcUInt32 ake_generation; /* next AKE rekey generation */
159 unsigned int connect : 1; /* Connect remote host */
160 unsigned int disconnected : 1; /* Disconnect remote connection */
161 unsigned int key_exchange : 1; /* Start key exchange */
162 unsigned int rekeying : 1; /* Start rekey */
165 unsigned int verbose : 1; /* Notify application */
166 unsigned int registering : 1; /* Set when registering to network */
167 unsigned int rekey_responder : 1; /* Set when rekeying as responder */
168 unsigned int auth_request : 1; /* Set when requesting auth method */
171 SILC_FSM_STATE(silc_client_connection_st_run);
172 SILC_FSM_STATE(silc_client_connection_st_packet);
173 SILC_FSM_STATE(silc_client_connection_st_close);
174 SILC_FSM_STATE(silc_client_error);
175 SILC_FSM_STATE(silc_client_disconnect);
176 SILC_FSM_STATE(silc_client_st_stop);
178 void silc_client_del_connection(SilcClient client, SilcClientConnection conn);
179 void silc_client_fsm_destructor(SilcFSM fsm, void *fsm_context,
180 void *destructor_context);
181 void silc_client_command_free(SilcClientCommandContext cmd);
183 silc_client_add_connection(SilcClient client,
184 SilcConnectionType conn_type,
186 SilcClientConnectionParams *params,
187 SilcPublicKey public_key,
188 SilcPrivateKey private_key,
189 char *remote_host, int port,
190 SilcClientConnectCallback callback,
192 SilcBuffer silc_client_attributes_process(SilcClient client,
193 SilcClientConnection conn,
196 #endif /* CLIENT_INTERNAL_H */