Merged silc_1_0_branch to trunk.
[silc.git] / apps / silcd / server_internal.h
index f2a141008bffa01ed3d0f5aed4f5d5995cf2dcb1..7cf42a8ed8964553455acac8f70a10e81438c231 100644 (file)
@@ -4,13 +4,13 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2002 Pekka Riikonen
+  Copyright (C) 1997 - 2003 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.
-  
+
   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,14 +49,18 @@ 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 */
   SilcUInt32 conn_failures;              /* Connection failure */
   SilcUInt32 auth_attempts;              /* Authentication attempts */
   SilcUInt32 auth_failures;              /* Authentication failures */
-  SilcUInt32 packets_sent;               /* Sent packets */
-  SilcUInt32 packets_received;           /* Received packets */
+  SilcUInt32 packets_sent;               /* Sent SILC packets */
+  SilcUInt32 packets_received;           /* Received SILC packets */
 } SilcServerStatistics;
 
 /*
@@ -81,6 +85,15 @@ struct SilcServerStruct {
   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. */
 
   SilcServerEntry router;           /* Pointer to the primary router */
   unsigned long router_connect;             /* Time when router was connected */
@@ -111,10 +124,6 @@ struct SilcServerStruct {
   SilcHash md5hash;
   SilcHash sha1hash;
 
-  /* HMAC objects for MAC's. */
-  SilcHmac md5hmac;
-  SilcHmac sha1hmac;
-
   /* Configuration object */
   SilcServerConfig config;
   SilcServerConfigRef config_ref;
@@ -139,20 +148,17 @@ struct SilcServerStruct {
 #endif
 };
 
-/* 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;
   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 */
@@ -160,10 +166,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 {                                                   \
@@ -174,20 +184,21 @@ 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)   \
 do {                                           \
   if ((c)->mode & (mod)) {                     \
-    if ((c)->connection)                       \
+    if (SILC_IS_LOCAL((c)))                    \
       server->stat.my_ ## type ## _ops--;      \
     if (server->server_type == SILC_ROUTER)    \
       server->stat. type ## _ops--;            \
@@ -199,14 +210,14 @@ do {                                              \
 do {                                           \
     if (client->mode & (mod)) {                        \
       if (!(mode & (mod))) {                   \
-       if (client->connection)                 \
+       if (SILC_IS_LOCAL(client))              \
          server->stat.my_ ## oper ## _ops--;   \
         if (server->server_type == SILC_ROUTER)        \
          server->stat. oper ## _ops--;         \
       }                                                \
     } else {                                   \
       if (mode & (mod)) {                      \
-       if (client->connection)                 \
+       if (SILC_IS_LOCAL(client))              \
          server->stat.my_ ## oper ## _ops++;   \
         if (server->server_type == SILC_ROUTER)        \
          server->stat. oper ## _ops++;         \
@@ -224,6 +235,8 @@ do {                                                \
 
 /* Prototypes */
 SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final);
+SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_callback);
+SILC_TASK_CALLBACK_GLOBAL(silc_server_connect_to_router);
 void silc_server_watcher_list_destroy(void *key, void *context,
                                      void *user_context);