X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Fsilcd%2Fserver.h;h=d442bc033055c1df722d715ec245741dca8bff25;hp=c6d27d75b59cacded60525c1e484f514e9b45272;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hpb=439d7874f4cc9590a4a4e5d57f924c1b661a1485 diff --git a/apps/silcd/server.h b/apps/silcd/server.h index c6d27d75..d442bc03 100644 --- a/apps/silcd/server.h +++ b/apps/silcd/server.h @@ -26,96 +26,199 @@ the object private hence this declaration. */ typedef struct SilcServerStruct *SilcServer; -#define SILC_SERVER_MAX_CONNECTIONS 10000 +/* Forward declaration of backup server context */ +typedef struct SilcServerBackupStruct *SilcServerBackup; + +/* Callback function that is called after the key exchange and connection + authentication protocols has been completed with a remote router. The + `server_entry' is the remote router entry. */ +typedef void (*SilcServerConnectRouterCallback)(SilcServer server, + SilcServerEntry server_entry, + void *context); + +/* Connection structure used when connection to remote */ +typedef struct { + SilcSocketConnection sock; + + /* Remote host name and port */ + char *remote_host; + int remote_port; + bool backup; + char *backup_replace_ip; + int backup_replace_port; + bool no_reconnect; + + /* Connection configuration (maybe NULL), and connection params */ + void *conn; + void *param; + + /* Current connection retry info */ + SilcUInt32 retry_count; + SilcUInt32 retry_timeout; + + /* Back pointer to server */ + SilcServer server; + + SilcServerConnectRouterCallback callback; + void *callback_context; +} *SilcServerConnection; /* General definitions */ +/* SILC port */ +#define SILC_PORT 768; + /* Server and router. Used internally by the code. */ #define SILC_SERVER 0 #define SILC_ROUTER 1 +#define SILC_BACKUP_ROUTER 2 + +/* Default parameter values */ /* Connection retry timeout. We implement exponential backoff algorithm - in connection retry. The interval of timeuot grows when retry count + in connection retry. The interval of timeout grows when retry count grows. */ -#define SILC_SERVER_RETRY_COUNT 4 /* Max retry count */ -#define SILC_SERVER_RETRY_MULTIPLIER 7 / 4 /* Interval growth */ +#define SILC_SERVER_RETRY_COUNT 7 /* Max retry count */ +#define SILC_SERVER_RETRY_MULTIPLIER 2 /* Interval growth */ #define SILC_SERVER_RETRY_RANDOMIZER 2 /* timeout += rnd % 2 */ #define SILC_SERVER_RETRY_INTERVAL_MIN 10 /* Min retry timeout */ #define SILC_SERVER_RETRY_INTERVAL_MAX 600 /* Max generated timeout */ -/* - Silc Server Params. - - Structure to hold various default parameters for server that can be - given before running the server. - -*/ -typedef struct { - unsigned int retry_count; - unsigned long retry_interval_min; - unsigned long retry_interval_min_usec; - unsigned long retry_interval_max; - char retry_keep_trying; - - unsigned long protocol_timeout; - unsigned long protocol_timeout_usec; - - char require_reverse_mapping; -} *SilcServerParams; +#define SILC_SERVER_KEEPALIVE 300 /* Heartbeat interval */ +#define SILC_SERVER_CHANNEL_REKEY 3600 /* Channel rekey interval */ +#define SILC_SERVER_REKEY 3600 /* Session rekey interval */ +#define SILC_SERVER_SKE_TIMEOUT 60 /* SKE timeout */ +#define SILC_SERVER_CONNAUTH_TIMEOUT 60 /* CONN_AUTH timeout */ +#define SILC_SERVER_MAX_CONNECTIONS 1000 /* Max connections */ +#define SILC_SERVER_MAX_CONNECTIONS_SINGLE 1000 /* Max connections per host */ /* Macros */ /* This macro is used to send notify messages with formatted string. The string is formatted with arguments and the formatted string is sent as argument. */ -#define SILC_SERVER_SEND_NOTIFY(server, sock, type, fmt) \ -do { \ - char *__fmt__ = silc_format fmt; \ - silc_server_send_notify(server, sock, type, 1, __fmt__, strlen(__fmt__)); \ - silc_free(__fmt__); \ +#define SILC_SERVER_SEND_NOTIFY(server, sock, type, fmt) \ +do { \ + char *__fmt__ = silc_format fmt; \ + silc_server_send_notify(server, sock, FALSE, \ + type, 1, __fmt__, strlen(__fmt__)); \ + silc_free(__fmt__); \ } while(0); +/* Check whether rekey protocol is active */ +#define SILC_SERVER_IS_REKEY(sock) \ + (sock->protocol && sock->protocol->protocol && \ + sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) + /* Prototypes */ int silc_server_alloc(SilcServer *new_server); void silc_server_free(SilcServer server); int silc_server_init(SilcServer server); void silc_server_daemonise(SilcServer server); +void silc_server_drop(SilcServer server); void silc_server_run(SilcServer server); void silc_server_stop(SilcServer server); -void silc_server_packet_parse(SilcPacketParserContext *parser_context); +void silc_server_start_key_exchange(SilcServer server, + SilcServerConnection sconn, + int sock); +bool silc_server_packet_parse(SilcPacketParserContext *parser_context, + void *context); void silc_server_packet_parse_type(SilcServer server, SilcSocketConnection sock, SilcPacketContext *packet); +void silc_server_create_connection(SilcServer server, + const char *remote_host, SilcUInt32 port); void silc_server_close_connection(SilcServer server, SilcSocketConnection sock); +void silc_server_free_client_data(SilcServer server, + SilcSocketConnection sock, + SilcClientEntry client, + int notify, + const char *signoff); void silc_server_free_sock_user_data(SilcServer server, - SilcSocketConnection sock); -int silc_server_channel_has_global(SilcChannelEntry channel); -int silc_server_channel_has_local(SilcChannelEntry channel); -int silc_server_remove_clients_by_server(SilcServer server, - SilcServerEntry entry); + SilcSocketConnection sock, + const char *signoff_message); void silc_server_remove_from_channels(SilcServer server, SilcSocketConnection sock, - SilcClientEntry client); + SilcClientEntry client, + int notify, + char *signoff_message, + int keygen); int silc_server_remove_from_one_channel(SilcServer server, SilcSocketConnection sock, SilcChannelEntry channel, SilcClientEntry client, int notify); -int silc_server_client_on_channel(SilcClientEntry client, - SilcChannelEntry channel); void silc_server_disconnect_remote(SilcServer server, SilcSocketConnection sock, const char *fmt, ...); SilcChannelEntry silc_server_create_new_channel(SilcServer server, SilcServerID *router_id, char *cipher, - char *channel_name); -void silc_server_create_channel_key(SilcServer server, + char *hmac, + char *channel_name, + int broadcast); +SilcChannelEntry +silc_server_create_new_channel_with_id(SilcServer server, + char *cipher, + char *hmac, + char *channel_name, + SilcChannelID *channel_id, + int broadcast); +bool silc_server_create_channel_key(SilcServer server, SilcChannelEntry channel, - unsigned int key_len); + SilcUInt32 key_len); SilcChannelEntry silc_server_save_channel_key(SilcServer server, SilcBuffer key_payload, SilcChannelEntry channel); +void silc_server_perform_heartbeat(SilcSocketConnection sock, + void *hb_context); +void silc_server_announce_get_channel_topic(SilcServer server, + SilcChannelEntry channel, + SilcBuffer *topic); +void silc_server_announce_get_channel_users(SilcServer server, + SilcChannelEntry channel, + SilcBuffer *channel_users, + SilcBuffer *channel_users_modes); +void silc_server_announce_get_channels(SilcServer server, + SilcIDList id_list, + SilcBuffer *channels, + SilcBuffer *channel_users, + SilcBuffer **channel_users_modes, + SilcUInt32 *channel_users_modes_c, + SilcBuffer **channel_topics, + SilcChannelID ***channel_ids, + unsigned long creation_time); +void silc_server_announce_servers(SilcServer server, bool global, + unsigned long creation_time, + SilcSocketConnection remote); +void silc_server_announce_clients(SilcServer server, + unsigned long creation_time, + SilcSocketConnection remote); +void silc_server_announce_channels(SilcServer server, + unsigned long creation_time, + SilcSocketConnection remote); +void silc_server_get_users_on_channel(SilcServer server, + SilcChannelEntry channel, + SilcBuffer *user_list, + SilcBuffer *mode_list, + SilcUInt32 *user_count); +void silc_server_save_users_on_channel(SilcServer server, + SilcSocketConnection sock, + SilcChannelEntry channel, + SilcClientID *noadd, + SilcBuffer user_list, + SilcBuffer mode_list, + SilcUInt32 user_count); +SilcSocketConnection silc_server_get_client_route(SilcServer server, + unsigned char *id_data, + SilcUInt32 id_len, + SilcClientID *client_id, + SilcIDListData *idata); +SilcBuffer silc_server_get_client_channel_list(SilcServer server, + SilcClientEntry client); +SilcClientEntry silc_server_get_client_resolve(SilcServer server, + SilcClientID *client_id, + bool *resolved); #endif