X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fserver.h;h=84ed585b79565f047e7d440c369cb709361d071e;hb=52e57c880aba9c5e89f59d962eb9af75670b76e0;hp=945b8dd04e3706d55fe7bf42a2e2039daba62123;hpb=dd8b8542b6f61e1187295ef639f2d74c0c77651b;p=silc.git diff --git a/apps/silcd/server.h b/apps/silcd/server.h index 945b8dd0..84ed585b 100644 --- a/apps/silcd/server.h +++ b/apps/silcd/server.h @@ -4,12 +4,11 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2002 Pekka Riikonen + Copyright (C) 1997 - 2005, 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -21,37 +20,47 @@ #ifndef SERVER_H #define SERVER_H -/* Forward declaration of backup server context */ +/* Forward declarations */ +typedef struct SilcServerEntryStruct *SilcServerEntry; +typedef struct SilcClientEntryStruct *SilcClientEntry; +typedef struct SilcChannelEntryStruct *SilcChannelEntry; typedef struct SilcServerBackupStruct *SilcServerBackup; +typedef struct SilcIDListDataObject *SilcIDListData, SilcIDListDataStruct; +typedef struct SilcIDListStruct *SilcIDList; /* 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 or NULL on error. */ -typedef void (*SilcServerConnectRouterCallback)(SilcServer server, - SilcServerEntry server_entry, - void *context); +typedef void (*SilcServerConnectCallback)(SilcServer server, + SilcServerEntry server_entry, + void *context); /* Connection structure used when connection to remote */ -typedef struct { - SilcSocketConnection sock; +typedef struct SilcServerConnectionStruct { + SilcServer server; + SilcStream stream; + SilcPacketStream sock; + SilcAsyncOperation op; + SilcServerConfigRef conn; - /* 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) */ - SilcServerConfigRef conn; /* Current connection retry info */ SilcUInt32 retry_count; SilcUInt32 retry_timeout; - - SilcServerConnectRouterCallback callback; + SilcServerConnectCallback callback; void *callback_context; + int rekey_timeout; + + unsigned int backup : 1; /* Set when backup router connection */ + unsigned int backup_resuming : 1; /* Set when running resuming protocol */ + unsigned int no_reconnect : 1; /* Set when to not reconnect */ + unsigned int no_conf : 1; /* Set when connecting without pre- + configuration. */ } *SilcServerConnection; /* General definitions */ @@ -83,6 +92,11 @@ typedef struct { #define SILC_SERVER_MAX_CONNECTIONS 1000 /* Max connections */ #define SILC_SERVER_MAX_CONNECTIONS_SINGLE 1000 /* Max connections per host */ #define SILC_SERVER_LOG_FLUSH_DELAY 300 /* Default log flush delay */ +#define SILC_SERVER_QOS_RATE_LIMIT 10 /* Default QoS rate limit */ +#define SILC_SERVER_QOS_BYTES_LIMIT 2048 /* Default QoS bytes limit */ +#define SILC_SERVER_QOS_LIMIT_SEC 0 /* Default QoS limit sec */ +#define SILC_SERVER_QOS_LIMIT_USEC 500000 /* Default QoS limit usec */ +#define SILC_SERVER_CH_JOIN_LIMIT 50 /* Default join limit */ /* Macros */ @@ -106,55 +120,54 @@ do { \ 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) - -/* Output an error message wether to stderr or LOG_ERROR if we are in the - background. */ -#define SILC_SERVER_LOG_ERROR(fmt) silc_server_stderr(silc_format fmt) +/* Output a message to stderr or to the appropriate log facility wether + we are in the background or not. */ +#define SILC_SERVER_LOG_INFO(fmt) \ + silc_server_stderr(SILC_LOG_INFO, silc_format fmt) +#define SILC_SERVER_LOG_WARNING(fmt) \ + silc_server_stderr(SILC_LOG_WARNING, silc_format fmt) +#define SILC_SERVER_LOG_ERROR(fmt) \ + silc_server_stderr(SILC_LOG_ERROR, silc_format fmt) +#define SILC_SERVER_LOG_FATAL(fmt) \ + silc_server_stderr(SILC_LOG_WARNING, silc_format fmt) /* Prototypes */ -int silc_server_alloc(SilcServer *new_server); +SilcBool silc_server_alloc(SilcServer *new_server); void silc_server_free(SilcServer server); -bool silc_server_init(SilcServer server); -bool silc_server_rehash(SilcServer server); +SilcBool silc_server_init(SilcServer server); +SilcBool silc_server_rehash(SilcServer server); void silc_server_run(SilcServer server); void silc_server_stop(SilcServer server); -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_start_key_exchange(SilcServerConnection sconn); void silc_server_create_connection(SilcServer server, - const char *remote_host, SilcUInt32 port); + SilcBool reconnect, + SilcBool dynamic, + const char *remote_host, SilcUInt32 port, + SilcServerConnectCallback callback, + void *context); void silc_server_close_connection(SilcServer server, - SilcSocketConnection sock); + SilcPacketStream sock); void silc_server_free_client_data(SilcServer server, - SilcSocketConnection sock, + SilcPacketStream sock, SilcClientEntry client, int notify, const char *signoff); void silc_server_free_sock_user_data(SilcServer server, - SilcSocketConnection sock, + SilcPacketStream sock, const char *signoff_message); void silc_server_remove_from_channels(SilcServer server, - SilcSocketConnection sock, + SilcPacketStream sock, SilcClientEntry client, - bool notify, + SilcBool notify, const char *signoff_message, - bool keygen); -bool silc_server_remove_from_one_channel(SilcServer server, - SilcSocketConnection sock, + SilcBool keygen, bool killed); +SilcBool silc_server_remove_from_one_channel(SilcServer server, + SilcPacketStream sock, SilcChannelEntry channel, SilcClientEntry client, - bool notify); + SilcBool notify); void silc_server_disconnect_remote(SilcServer server, - SilcSocketConnection sock, + SilcPacketStream sock, SilcStatus status, ...); SilcChannelEntry silc_server_create_new_channel(SilcServer server, SilcServerID *router_id, @@ -169,13 +182,13 @@ silc_server_create_new_channel_with_id(SilcServer server, char *channel_name, SilcChannelID *channel_id, int broadcast); -bool silc_server_create_channel_key(SilcServer server, +SilcBool silc_server_create_channel_key(SilcServer server, SilcChannelEntry channel, SilcUInt32 key_len); SilcChannelEntry silc_server_save_channel_key(SilcServer server, SilcBuffer key_payload, SilcChannelEntry channel); -void silc_server_perform_heartbeat(SilcSocketConnection sock, +void silc_server_perform_heartbeat(SilcPacketStream sock, void *hb_context); void silc_server_announce_get_channel_topic(SilcServer server, SilcChannelEntry channel, @@ -193,35 +206,39 @@ void silc_server_announce_get_channels(SilcServer server, SilcBuffer **channel_users_modes, SilcUInt32 *channel_users_modes_c, SilcBuffer **channel_topics, + SilcBuffer **channel_invites, + SilcBuffer **channel_bans, SilcChannelID ***channel_ids, unsigned long creation_time); -void silc_server_announce_servers(SilcServer server, bool global, +void silc_server_announce_servers(SilcServer server, SilcBool global, unsigned long creation_time, - SilcSocketConnection remote); + SilcPacketStream remote); void silc_server_announce_clients(SilcServer server, unsigned long creation_time, - SilcSocketConnection remote); + SilcPacketStream remote); void silc_server_announce_channels(SilcServer server, unsigned long creation_time, - SilcSocketConnection remote); -bool silc_server_get_users_on_channel(SilcServer server, + SilcPacketStream remote); +void silc_server_announce_watches(SilcServer server, + SilcPacketStream remote); +SilcBool 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, + SilcPacketStream sock, SilcChannelEntry channel, SilcClientID *noadd, SilcBuffer user_list, SilcBuffer mode_list, SilcUInt32 user_count); void silc_server_save_user_channels(SilcServer server, - SilcSocketConnection sock, + SilcPacketStream sock, SilcClientEntry client, SilcBuffer channels, SilcBuffer channels_user_modes); -SilcSocketConnection +SilcPacketStream silc_server_get_client_route(SilcServer server, unsigned char *id_data, SilcUInt32 id_len, @@ -230,9 +247,11 @@ silc_server_get_client_route(SilcServer server, SilcClientEntry *client_entry); SilcBuffer silc_server_get_client_channel_list(SilcServer server, SilcClientEntry client, - bool get_private, - bool get_secret, + SilcBool get_private, + SilcBool get_secret, SilcBuffer *user_mode_list); -void silc_server_stderr(char *message); +void silc_server_stderr(SilcLogType type, char *message); +void silc_server_http_init(SilcServer server); +void silc_server_http_uninit(SilcServer server); #endif