X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fserver_internal.h;h=e6b916ec7a1431dafc0ba2d1547488f9502cea92;hb=52e57c880aba9c5e89f59d962eb9af75670b76e0;hp=74babfaae7ac02fd5a3f81d20baa364c26536ed5;hpb=ccfbb5f7a211591c8e5503c99ac3333f469bbe83;p=silc.git diff --git a/apps/silcd/server_internal.h b/apps/silcd/server_internal.h index 74babfaa..e6b916ec 100644 --- a/apps/silcd/server_internal.h +++ b/apps/silcd/server_internal.h @@ -4,13 +4,12 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2002 Pekka Riikonen + Copyright (C) 1997 - 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 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -49,6 +48,10 @@ typedef struct { SilcUInt32 detached; /* All clients detached */ SilcUInt32 server_ops; /* All server operators */ SilcUInt32 router_ops; /* All router operators */ + /* More to add + SilcUInt32 secret_channels; + SilcUInt32 private_channels; + */ /* General */ SilcUInt32 conn_attempts; /* Connection attempts */ @@ -57,6 +60,9 @@ typedef struct { SilcUInt32 auth_failures; /* Authentication failures */ SilcUInt32 packets_sent; /* Sent SILC packets */ SilcUInt32 packets_received; /* Received SILC packets */ + SilcUInt32 conn_num; /* Number of connections */ + SilcUInt32 commands_sent; /* Commands/replies sent */ + SilcUInt32 commands_received; /* Commands/replies received */ } SilcServerStatistics; /* @@ -64,26 +70,22 @@ typedef struct { */ struct SilcServerStruct { - char *server_name; - int sock; - SilcServerEntry id_entry; - SilcServerID *id; - unsigned char *id_string; + SilcSchedule schedule; /* Server scheduler */ + SilcDList listeners; /* TCP listeners */ + SilcPacketEngine packet_engine; /* Packet engine */ + SilcDList conns; /* Connections in server */ + SilcSKR repository; /* Public key repository */ + SilcPublicKey public_key; /* Server public key */ + SilcPrivateKey private_key; /* Server private key */ + SilcDList expired_clients; /* Expired client entries */ + SilcHttpServer httpd; /* HTTP server */ + + char *server_name; /* Server's name */ + SilcServerEntry id_entry; /* Server's local entry */ + SilcServerID *id; /* Server's ID */ + unsigned char id_string[32]; /* Server's ID as string */ SilcUInt32 id_string_len; - SilcUInt32 starttime; - - unsigned int server_type : 2; /* Server type (server.h) */ - unsigned int standalone : 1; /* Set if server is standalone, and - does not have connection to network. */ - unsigned int listenning : 1; /* Set if server is listenning for - incoming connections. */ - unsigned int background : 1; /* Set when server is on background */ - unsigned int backup_router : 1; /* Set if this is backup router */ - unsigned int backup_primary : 1; /* Set if we've switched our primary - router to a backup router. */ - unsigned int wait_backup : 1; /* Set if we are waiting for backup - router to connect to us. */ - unsigned int server_shutdown: 1; /* Set when shutting down */ + SilcUInt32 starttime; /* Server start time */ SilcServerEntry router; /* Pointer to the primary router */ unsigned long router_connect; /* Time when router was connected */ @@ -94,30 +96,16 @@ struct SilcServerStruct { /* Current command identifier, 0 not used */ SilcUInt16 cmd_ident; - /* SILC server scheduler */ - SilcSchedule schedule; - /* ID lists. */ SilcIDList local_list; SilcIDList global_list; SilcHashTable watcher_list; - - /* Table of connected sockets */ - SilcSocketConnection *sockets; - - /* Server public key */ - SilcPKCS pkcs; - SilcPublicKey public_key; - SilcPrivateKey private_key; + SilcHashTable watcher_list_pk; /* Hash objects for general hashing */ SilcHash md5hash; SilcHash sha1hash; - /* HMAC objects for MAC's. */ - SilcHmac md5hmac; - SilcHmac sha1hmac; - /* Configuration object */ SilcServerConfig config; SilcServerConfigRef config_ref; @@ -132,30 +120,39 @@ struct SilcServerStruct { /* Pending command queue */ SilcDList pending_commands; - /* Purge context for disconnected clients */ - SilcIDListPurge purge_i; - SilcIDListPurge purge_g; - -#ifdef SILC_SIM - /* SIM (SILC Module) list */ - SilcDList sim; -#endif + unsigned int server_type : 2; /* Server type (server.h) */ + unsigned int standalone : 1; /* Set if server is standalone, and + does not have connection to network. */ + unsigned int listenning : 1; /* Set if server is listenning for + incoming connections. */ + unsigned int background : 1; /* Set when server is on background */ + unsigned int backup_router : 1; /* Set if this is backup router */ + unsigned int backup_primary : 1; /* Set if we've switched our primary + router to a backup router. */ + unsigned int backup_noswitch: 1; /* Set if we've won't switch to + become primary (we are backup) */ + unsigned int backup_closed : 1; /* Set if backup closed connection. + Do not allow resuming in this case. */ + unsigned int wait_backup : 1; /* Set if we are waiting for backup + router to connect to us. */ + unsigned int server_shutdown: 1; /* Set when shutting down */ + unsigned int no_reconnect : 1; /* If set, server won't reconnect to + router after disconnection. */ + unsigned int no_conf : 1; /* Set when connecting without + configuration. */ }; -/* Server's heartbeat context */ -typedef struct { - SilcServer server; -} *SilcServerHBContext; - /* Failure context. This is allocated when failure packet is received. Failure packets are processed with timeout and data is saved in this structure. */ typedef struct { - SilcServer server; - SilcSocketConnection sock; + SilcPacketStream sock; SilcUInt32 failure; } *SilcServerFailureContext; +/* Rekey must be performed at the lastest when this many packets is sent */ +#define SILC_SERVER_REKEY_THRESHOLD 0xfffffe00 + /* Macros */ /* Return pointer to the primary router connection */ @@ -163,14 +160,14 @@ typedef struct { (!server->standalone && server->router ? server->router->connection : NULL) /* Return TRUE if a packet must be broadcasted (router broadcasts) */ -#define SILC_BROADCAST(server) (server->server_type == SILC_ROUTER) +#define SILC_BROADCAST(server) (server->server_type == SILC_ROUTER) /* Return TRUE if entry is locally connected or local to us */ #define SILC_IS_LOCAL(entry) \ (((SilcIDListData)entry)->status & SILC_IDLIST_STATUS_LOCAL) /* Registers generic task for file descriptor for reading from network and - writing to network. As being generic task the actual task is allocated + writing to network. As being generic task the actual task is allocated only once and after that the same task applies to all registered fd's. */ #define SILC_REGISTER_CONNECTION_FOR_IO(fd) \ do { \ @@ -181,14 +178,15 @@ do { \ SILC_TASK_PRI_NORMAL); \ } while(0) -#define SILC_SET_CONNECTION_FOR_INPUT(s, fd) \ -do { \ - silc_schedule_set_listen_fd((s), (fd), SILC_TASK_READ); \ +#define SILC_SET_CONNECTION_FOR_INPUT(s, fd) \ +do { \ + silc_schedule_set_listen_fd((s), (fd), SILC_TASK_READ, FALSE); \ } while(0) - -#define SILC_SET_CONNECTION_FOR_OUTPUT(s, fd) \ -do { \ - silc_schedule_set_listen_fd((s), (fd), (SILC_TASK_READ | SILC_TASK_WRITE)); \ + +#define SILC_SET_CONNECTION_FOR_OUTPUT(s, fd) \ +do { \ + silc_schedule_set_listen_fd((s), (fd), (SILC_TASK_READ | SILC_TASK_WRITE), \ + FALSE); \ } while(0) #define SILC_OPER_STATS_UPDATE(c, type, mod) \ @@ -224,13 +222,20 @@ do { \ #define SILC_GET_SKE_FLAGS(x, p) \ if ((x)) { \ if ((x)->param && (x)->param->key_exchange_pfs) \ - (p)->flags |= SILC_SKE_SP_FLAG_PFS; \ + (p) |= SILC_SKE_SP_FLAG_PFS; \ if (!(x)->publickeys) \ - (p)->flags |= SILC_SKE_SP_FLAG_MUTUAL; \ + (p) |= SILC_SKE_SP_FLAG_MUTUAL; \ } +#define SILC_CONNTYPE_STRING(ctype) \ + (ctype == SILC_CONN_CLIENT ? "Client" : \ + ctype == SILC_CONN_SERVER ? "Server" : \ + ctype == SILC_CONN_ROUTER ? "Router" : "Unknown") + /* Prototypes */ -SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final); +SILC_TASK_CALLBACK(silc_server_rekey_final); +SILC_TASK_CALLBACK(silc_server_rekey_callback); +SILC_TASK_CALLBACK(silc_server_connect_to_router); void silc_server_watcher_list_destroy(void *key, void *context, void *user_context);