Added reconnection support.
authorPekka Riikonen <priikone@silcnet.org>
Mon, 5 Feb 2001 18:54:36 +0000 (18:54 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Mon, 5 Feb 2001 18:54:36 +0000 (18:54 +0000)
CHANGES
apps/silcd/packet_receive.h
apps/silcd/server.c

diff --git a/CHANGES b/CHANGES
index 71ebd178d5d1d5d9704c7bc119302a2fe6c2933e..d2b087de3641993cdd0715ccfafe97f5f9bbb3ad 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,10 @@
+Mon Feb  5 20:08:30 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * Added reconnection support to server if the normal server looses
+         its connection to the router (for example if router is rebooted).
+         The server performs normal reconnection strategy implemented
+         to the server.  Affected file silcd/server.c.
+
 Sun Feb  4 13:18:32 EET 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
 
        * Added new packet type SILC_PACKET_SET_MODE that is used to
index 93035e4afc70950521ce50ee45aa15529fcb8892..67f56892be399af218906e200ab540e0b9091476 100644 (file)
@@ -61,5 +61,8 @@ void silc_server_new_channel_user(SilcServer server,
 void silc_server_remove_id(SilcServer server,
                           SilcSocketConnection sock,
                           SilcPacketContext *packet);
+void silc_server_set_mode(SilcServer server,
+                         SilcSocketConnection sock,
+                         SilcPacketContext *packet);
 
 #endif
index 1209488123d0353edc95f63a6e546c3db135a892..e102e883a1e32726ffea5110aa6294df5f3a0444 100644 (file)
@@ -452,7 +452,7 @@ SILC_TASK_CALLBACK(silc_server_connect_router)
      protocol. */
   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
   server->sockets[sock] = newsocket;
-  newsocket->hostname = sconn->remote_host;
+  newsocket->hostname = strdup(sconn->remote_host);
   newsocket->port = sconn->remote_port;
   sconn->sock = newsocket;
 
@@ -981,8 +981,11 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection_final)
        break;
       }
 
+      /* Statistics */
       server->stat.my_clients++;
       server->stat.clients++;
+      if (server->server_type == SILC_ROUTER)
+       server->stat.cell_clients++;
 
       id_entry = (void *)client;
       break;
@@ -1015,6 +1018,7 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection_final)
        break;
       }
 
+      /* Statistics */
       if (sock->type == SILC_SOCKET_TYPE_SERVER)
        server->stat.my_servers++;
       else
@@ -1128,6 +1132,16 @@ SILC_TASK_CALLBACK(silc_server_packet_process)
       
     SILC_LOG_DEBUG(("Premature EOF from connection %d", sock->sock));
 
+    /* If the closed connection was our primary router connection the
+       start re-connecting phase. */
+    if (!server->standalone && server->server_type == SILC_SERVER && 
+       sock == server->router->connection)
+      silc_task_register(server->timeout_queue, 0, 
+                        silc_server_connect_to_router,
+                        context, 0, 500000,
+                        SILC_TASK_TIMEOUT,
+                        SILC_TASK_PRI_NORMAL);
+
     if (sock->user_data)
       silc_server_free_sock_user_data(server, sock);
     silc_server_close_connection(server, sock);
@@ -1585,7 +1599,7 @@ void silc_server_packet_parse_type(SilcServer server,
      */
     SILC_LOG_DEBUG(("Set Mode packet"));
     silc_server_set_mode(server, sock, packet);
-    break
+    break;
 
   default:
     SILC_LOG_ERROR(("Incorrect packet type %d, packet dropped", type));