Author: Pekka Riikonen <priikone@silcnet.org>
- 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
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 */
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;
/*
*/
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. */
+ SilcUInt32 starttime; /* Server start time */
SilcServerEntry router; /* Pointer to the primary router */
unsigned long router_connect; /* Time when router was connected */
/* 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;
/* 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 */
(!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) \
- ((entry)->connection ? TRUE : \
- (entry)->data.status & SILC_IDLIST_STATUS_LOCAL ? TRUE : FALSE)
-
-/* Registers generic task for file descriptor for reading from network and
- 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 { \
- silc_schedule_task_add(server->schedule, (fd), \
- silc_server_packet_process, \
- context, 0, 0, \
- SILC_TASK_GENERIC, \
- 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); \
-} while(0)
-
-#define SILC_SET_CONNECTION_FOR_OUTPUT(s, fd) \
-do { \
- silc_schedule_set_listen_fd((s), (fd), (SILC_TASK_READ | SILC_TASK_WRITE)); \
-} while(0)
+#define SILC_IS_LOCAL(entry) \
+ (((SilcIDListData)entry)->status & SILC_IDLIST_STATUS_LOCAL)
#define SILC_OPER_STATS_UPDATE(c, type, mod) \
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);
+SILC_TASK_CALLBACK(silc_server_connect_to_router_retry);
void silc_server_watcher_list_destroy(void *key, void *context,
void *user_context);