From: Pekka Riikonen Date: Mon, 5 Feb 2001 18:54:36 +0000 (+0000) Subject: Added reconnection support. X-Git-Tag: SILC.0.1~259 X-Git-Url: http://git.silcnet.org/gitweb/?a=commitdiff_plain;h=10ec50cff8ad9d6a77080821037c1234dc066b47;p=silc.git Added reconnection support. --- diff --git a/CHANGES b/CHANGES index 71ebd178..d2b087de 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,10 @@ +Mon Feb 5 20:08:30 EET 2001 Pekka Riikonen + + * 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 * Added new packet type SILC_PACKET_SET_MODE that is used to diff --git a/apps/silcd/packet_receive.h b/apps/silcd/packet_receive.h index 93035e4a..67f56892 100644 --- a/apps/silcd/packet_receive.h +++ b/apps/silcd/packet_receive.h @@ -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 diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 12094881..e102e883 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -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));