Merged silc_1_1_branch to trunk.
[silc.git] / apps / silcd / server_internal.h
index 1fb5201e81c1848ea8359b83bb1386ed9228eca6..e6b916ec7a1431dafc0ba2d1547488f9502cea92 100644 (file)
@@ -4,13 +4,12 @@
 
   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
@@ -61,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;
 
 /*
@@ -68,28 +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 backup_noswitch: 1;   /* Set if we've won't switch to 
-                                       become primary (we are backup) */
-  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 */
@@ -100,21 +96,11 @@ 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;
@@ -134,24 +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. */
 };
 
 /* 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 {
-  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 */
@@ -159,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,7 +182,7 @@ do {                                                        \
 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), \
@@ -221,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);